2004-09-23 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / gmcs / ChangeLog
1 2004-09-23  Martin Baulig  <martin@ximian.com>
2
3         * generic.cs (Constraints): Reflect latest runtime changes.
4
5 2004-09-23  Martin Baulig  <martin@ximian.com>
6
7         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
8         (Convert.ImplicitReferenceConversionExists): Likewise.
9
10 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
11
12         * class.cs (Operator.Define): Add error 448 and 559 report.
13         
14 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
15
16         * class.cs (MemberBase.IsTypePermitted): New protected
17         method for checking error CS0610.
18
19 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
20
21         * class.cs (TypeContainer.HasExplicitLayout): New property
22         Returns whether container has StructLayout attribute set Explicit.
23         (FieldMember): New abstract class for consts and fields.
24         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
25         (Field): Reuse FieldMember.
26
27         * const.cs (Const): Reuse FieldMember.
28
29         * rootcontext.cs: EmitConstants call moved to class.
30
31 2004-09-22  Martin Baulig  <martin@ximian.com>
32
33         Marek and me just fixed one of our oldest bugs: #28562 :-)
34
35         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
36
37         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
38         we're an EnumConstant, just return that.
39         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
40         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
41         to get the value which'll actually be written into the attribute.
42         However, we have to use GetValue() to access the attribute's value
43         in the compiler.        
44
45 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
46
47         * constant.cs (Constant.IsNegative): New abstract property
48         IsNegative.
49
50         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
51         (StackAlloc.DoResolve): Reused IsNegative.
52
53 2004-09-22  Martin Baulig  <martin@ximian.com>
54
55         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
56         public method; like LookupTypeContainer, but also works for
57         generic instances.
58
59         * report.cs (Report.SymbolRelatedToPreviousError): Use
60         TypeManager.LookupGenericTypeContainer().       
61
62 2004-09-22  Martin Baulig  <martin@ximian.com>
63
64         Thanks to Peter Sestoft for this bug report.
65
66         * expression.cs (Conditional): If both the `trueExpr' and the
67         `falseExpr' is a NullLiteral, return a NullLiteral.
68
69 2004-09-22  Martin Baulig  <martin@ximian.com>
70
71         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
72         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
73         for the "get_Current" call.
74
75 2004-09-21  Martin Baulig  <martin@ximian.com>
76
77         * convert.cs (Convert.ImplicitReferenceConversion): When
78         converting to an interface type, first check whether we're
79         converting from a reference type.
80
81 2004-09-14  Martin Baulig  <martin@ximian.com>
82
83         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
84
85 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
86
87         Fixed bug #61902
88         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
89         called and is obsolete then this member suppress message
90         when call is inside next [Obsolete] method or type.
91
92         * expression.cs: Use TestObsoleteMethodUsage member.
93
94 2004-09-14  Martin Baulig  <martin@ximian.com>
95
96         * genericparser.cs: Removed.
97
98 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
99
100         * class.cs (MethodCore.CheckBase): Fix bug #65757.
101
102 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
103
104         * attribute.cs (Attribute.Resolve): Add error 653 report.
105
106         * class.cs (Class.ApplyAttributeBuilder): Add error 641
107         report.
108         (Method.ApplyAttributeBuilder): Add error 685 report.
109         (Operator.Define): Add error 564 report.
110
111         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
112
113         * expression.cs (Invocation.DoResolve): Add error
114         245 and 250 report.
115
116         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
117         error 674 report.
118
119 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
120
121         * class.cs (ConstructorInitializer.Resolve):
122         Wrong error number (515->516).
123
124 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
125
126         * class.cs (Indexer.Define): Add error 631 report.
127
128 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
129
130         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
131
132 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
133
134         * expression.cs (Probe.DoResolve): Add error CS0241 report.
135
136 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
137
138         * cs-parser.jay: Added error CS0241 report.
139
140 2004-09-10  Raja R Harinath  <rharinath@novell.com>
141
142         * cs-parser.jay (fixed_statement): Introduce a scope for the
143         declaration in the 'fixed' statement.
144
145 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
146
147         * cs-parser.jay: Added CS0230 error report.
148
149 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
150
151         * cs-parser.jay: Added errors CS0231 and CS0257 report.
152
153 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
154
155         * expression.cs (Argument.Resolve): Added error CS0192 and
156         CS0199 report.
157
158 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
159
160         C# 2.0 #pragma warning feature
161
162         * cs-tokenizer.cs (PreProcessPragma): New method; 
163         Handles #pragma directive.
164
165         * report.cs (WarningRegions): New class; Support
166         class for #pragma warning directive. It tests whether
167         warning is enabled for a given line.
168
169 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
170
171         * const.cs: Add more descriptive error report, tahnks to
172         Sebastien. 
173
174 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
175
176         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
177
178 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
179
180         * expression.cs: Apply patch from Ben: Remove dead code from
181         ArrayCreation, and remove the TurnintoConstant call in const.cs,
182         as that code just threw an exception anwyays.
183
184         * const.cs: Remove the call to the turnintoconstant, for details
185         see bug: #63144
186         
187         * literal.cs: The type of the null-literal is the null type;  So
188         we use a placeholder type (literal.cs:System.Null, defined here)
189         for it.
190
191         * expression.cs (Conditional.DoResolve): Remove some old code that
192         is no longer needed, conversions have been fixed.
193
194         (ArrayCreationExpression.DoResolve): Return false if we fail to
195         resolve the inner expression.
196
197 2004-09-07  Raja R Harinath  <rharinath@novell.com>
198
199         Fix test-290.cs.
200         * cs-parser.jay (delegate_declaration): Record a delegate
201         declaration as a type declaration.
202         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
203
204 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
205
206         * parameter.cs: Do not crash if the type can not be resolved. 
207
208         * expression.cs: Report errors with unsafe pointers, fixes #64896
209
210 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
211
212         * expression.cs: Pointer arith always needs to do a conv.i
213         if the operand is a long. fix 65320
214
215 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
216
217         Fixed cs0619-37.cs, cs0619-38.cs
218
219         * enum.cs (GetObsoleteAttribute): Removed.
220
221         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
222         on Enum member is double staged. The first is tested member
223         and then enum.
224
225 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
226
227         Fixed #56986, #63631, #65231
228
229         * class.cs: (TypeContainer.AddToMemberContainer): New method,
230         adds member to name container.
231         (TypeContainer.AddToTypeContainer): New method, adds type to
232         name container.
233         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
234         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
235         AddOperator): Simplified by reusing AddToMemberContainer.
236         (TypeContainer.UserDefinedStaticConstructor): Changed to property
237         instead of field.
238         (Method.CheckForDuplications): Fixed implementation to test all
239         possibilities.
240         (MemberBase): Detection whether member is explicit interface
241         implementation is now in constructor.
242         (MemberBase.UpdateMemberName): Handles IndexerName.
243         (Accessor): Changed to keep also location information.
244         (AbstractPropertyEventMethod): Is derived from MemberCore.
245         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
246         will be emited or not.
247         (PropertyBase.AreAccessorsDuplicateImplementation):
248         Tests whether accessors are not in collision with some method.
249         (Operator): Is derived from MethodCore to simplify common
250         operations.
251
252         * decl.cs (Flags.TestMethodDuplication): Test for duplication
253         must be performed.
254         (DeclSpace.AddToContainer): Adds the member to defined_names
255         table. It tests for duplications and enclosing name conflicts.
256
257         * enum.cs (EnumMember): Clean up to reuse the base structures
258
259 2004-09-03  Martin Baulig  <martin@ximian.com>
260
261         Merged latest changes into gmcs.  Please keep this comment in
262         here, it makes it easier for me to see what changed in MCS since
263         the last time I merged.
264
265 2004-09-03  Martin Baulig  <martin@ximian.com>
266
267         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
268         into TypeContainer, to make partial classes work again.
269
270 2004-09-03  Martin Baulig  <martin@ximian.com>
271
272         * rootcontext.cs (RootContext.V2): Removed.
273
274 2004-03-23  Martin Baulig  <martin@ximian.com>
275
276         * expression.cs (Invocation.OverloadResolve): Added `bool
277         may_fail' argument and use it instead of the Location.IsNull() hack.
278
279 2004-09-09  Martin Baulig  <martin@ximian.com>
280
281         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
282
283 2004-09-09  Martin Baulig  <martin@ximian.com>
284
285         * generic.cs (TypeParameter.DefineType): Added support for
286         explicit interface methods.
287
288 2004-09-09  Martin Baulig  <martin@ximian.com>
289
290         * README.Changes: New document.  Started to list important changes
291         between MCS and GMCS here.
292
293 2004-09-08  Martin Baulig  <martin@ximian.com>
294
295         * class.cs
296         (TypeContainer.CheckRecursiveDefinition): New protected method.
297         (TypeContainer.DefineType): Move the CS0146 check into
298         CheckRecursiveDefinition().     
299
300 2004-09-06  Martin Baulig  <martin@ximian.com>
301
302         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
303         types for the constructor constraint.
304
305 2004-09-03  Martin Baulig  <martin@ximian.com>
306
307         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
308         into TypeContainer, to make partial classes work again.
309
310 2004-09-03  Martin Baulig  <martin@ximian.com>
311
312         * rootcontext.cs (RootContext.V2): Removed.
313
314 2004-03-23  Martin Baulig  <martin@ximian.com>
315
316         * expression.cs (Invocation.OverloadResolve): Added `bool
317         may_fail' argument and use it instead of the Location.IsNull() hack.
318
319 2004-09-03  Martin Baulig  <martin@ximian.com>
320
321         Merged latest changes into gmcs.  Please keep this comment in
322         here, it makes it easier for me to see what changed in MCS since
323         the last time I merged.
324
325 2004-09-03  Raja R Harinath  <rharinath@novell.com>
326
327         Fix #61128.
328         * expression.cs (BetterConversion): Don't allow either conversion 
329         to be null.  Remove redundant implicit conversion test when 'q ==
330         null' -- when this function is invoked, we already know that the
331         implicit conversion exists.
332         (BetterFunction): Assume that 'best' is non-null.  Remove
333         redundant reimplementation of IsApplicable when 'best' is null.
334         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
335         number of arguments.
336         (IsAncestralType): Extract from OverloadResolve.
337         (OverloadResolve): Make robust to the MethodGroupExpr being
338         unsorted.  Implement all the logic of Section 14.5.5.1, and
339         support overloading of methods from multiple applicable types.
340         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
341
342         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
343         (RealError, Warning): Append type of report to related symbol.
344
345 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
346
347         * enum.cs: Fixed CLS-Compliance checks for enum members.
348         Error tests cs3008-8.cs, cs3014-8.cs
349
350 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
351
352         Fixed bug #62342, #63102
353         * class.cs: ImplementIndexer uses member.IsExplicitImpl
354         like ImplementMethod.
355
356 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
357
358         * attribute.cs (Attribute.GetAttributeArgumentExpression):
359         Fixed bug #65170.
360
361 2004-09-02  Martin Baulig  <martin@ximian.com>
362
363         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
364         TypeManager.GetArgumentTypes() rather than calling GetParameters()
365         on the MethodBase.
366
367 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
368
369         C# 2.0 Static classes implemented
370
371         * class.cs (TypeContainer): instance_constructors,
372         initialized_fields, initialized_static_fields,
373         default_constructor, base_inteface_types are protected to be
374         accessible from StaticClass.
375         (TypeContainer.DefineDefaultConstructor): New virtual method
376         for custom default constructor generating
377         (StaticClass): New class to handle "Static classes" feature.
378
379         * cs-parser.jay: Handle static keyword on class like instance
380         of StaticClass.
381
382         * driver.cs: Added "/langversion" command line switch with two
383         options (iso-1, default).
384
385 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
386
387         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
388
389 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
390
391         * delegate.cs: Style.
392
393 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
394
395         * delegate.cs: Add seperate instance expr field for miguel.
396
397 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
398
399         * PointerArithmetic (Resolve): make sure we are not doing
400         pointer arith on void*. Also, make sure we are resolved
401         by not setting eclass until resolve.
402
403         All callers: Make sure that PointerArithmetic gets resolved.
404
405 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
406
407         * ArrayCreation (LookupType): If the type does not resolve 
408         to an array, give an error.
409
410 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
411
412         * statement.cs (Try.Resolve): Fixed bug #64222
413
414 2004-08-27  Martin Baulig  <martin@ximian.com>
415
416         * class.cs
417         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
418         crash here.     
419
420 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
421
422         * ecore.cs (Constantify): Get underlying type via
423         System.Enum.GetUnderlyingType to avoid StackOverflow on the
424         Windows in special cases.
425
426 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
427
428         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
429         for obtaining also private methods.
430         (GetRemoveMethod): Used GetRemoveMethod (true)
431         for obtaining also private methods.
432
433 2004-09-02  Martin Baulig  <martin@ximian.com>
434
435         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
436         TypeManager.GetArgumentTypes() rather than calling GetParameters()
437         on the MethodBase.
438
439 2004-08-27  Martin Baulig  <martin@ximian.com>
440
441         * class.cs
442         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
443         crash here.     
444
445 2004-08-25  Martin Baulig  <martin@ximian.com>
446
447         * support.cs (ReflectionParameters..ctor): If this is a generic
448         method, retrieve and store its type parameters.
449         (InternalParameters..ctor): Added `TypeParameter[]' argument.
450         (ReflectionParameters.GenericConstraints): The argument specifies
451         the type parameter, not the method parameter.
452         (InternalParameters.GenericConstraints): Likewise.
453
454         * generic.cs (TypeParameter.DefineType): Correctly handle
455         constraints wrt. generic methods in interfaces and their
456         implementations.        
457
458 2004-08-24  Martin Baulig  <martin@ximian.com>
459
460         * generic.cs (TypeParameter.IsSubclassOf): New public method.
461         (Constraints.IsSubclassOf): New internal method.
462
463         * typemanager.cs (TypeManager.FindMembers): Added special support
464         for GenericTypeParameterBuilder's.      
465         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
466         type parameters.
467
468 2004-08-24  Martin Baulig  <martin@ximian.com>
469
470         * typemanager.cs
471         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
472         this for accessibility checks.
473         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
474         IsNestedFamilyAccessible.
475         (TypeManager.IsSubclassOf): New method, do what the name actually
476         says.   
477
478 2004-08-24  Martin Baulig  <martin@ximian.com>
479
480         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
481         as a SimpleName, include the generic arity.
482
483 2004-08-24  Martin Baulig  <martin@ximian.com>
484
485         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
486         MethodAttributes.HideBySig for operators.
487
488 2004-08-23  Martin Baulig  <martin@ximian.com>
489
490         Back to the old error reporting system :-)
491
492         * report.cs (Message): Removed.
493         (Report.MessageData, ErrorData, WarningData): Removed.
494         (Report.Error, Warning): Back to the old system.
495
496 2004-08-23  Martin Baulig  <martin@ximian.com>
497
498         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
499
500         * class.cs (TypeContainer.ParentContainer): New public virtual
501         method; replaces the explicit interface implementation.
502         (ClassPart.ParentContainer): Override.
503
504 2004-08-23  Martin Baulig  <martin@ximian.com>
505
506         * statement.cs (Switch): Added support for constant switches; see
507         #59428 or test-285.cs.
508
509 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
510
511         Fixed bug #62740.
512         * statement.cs (GetEnumeratorFilter): Removed useless
513         logic because C# specs is strict. GetEnumerator must be
514         public.
515
516 2004-08-22  Martin Baulig  <martin@ximian.com>
517
518         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
519         a switch and may break, reset the barrier.  Fixes #59867.
520
521 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
522
523         CLS-Compliance speed up (~5% for corlib)
524
525         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
526         New method. Tests container for CLS-Compliant names
527
528         * class.cs (TypeContainer.VerifyClsName): New method.
529         Checks whether container name is CLS Compliant.
530         (Constructor): Implements IMethodData.
531
532         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
533         low-case table for CLS Compliance test.
534         (MemberCache.VerifyClsParameterConflict): New method.
535         Checks method parameters for CS3006 error.
536
537         * enum.cs (EnumMember): Is derived from MemberCore.
538         (Enum.VerifyClsName): Optimized for better performance.
539
540 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
541
542         * report.cs: Renamed Error_T to Error and changed all
543         references.
544
545 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
546
547         * class.cs (TypeContainer.IndexerArrayList): New inner class
548         container for indexers.
549         (TypeContainer.DefaultIndexerName): New constant for default
550         indexer name. Replaced all "Item" with this constant.
551         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
552
553         * typemanager.cs (TypeManager.default_member_ctor): Cache here
554         DefaultMemberAttribute constructor.
555
556 2004-08-05  Martin Baulig  <martin@ximian.com>
557
558         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
559         Fix bug #59429.
560
561 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
562
563         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
564         multi platforms problem.
565
566         * compiler.csproj: Included shared files.
567
568 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
569
570         Fix bug 60333, 55971 in the more general way
571         * attribute.cs (Attribute.GetAttributeArgumentExpression):
572         Added arg_type argument for constant conversion.
573         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
574
575 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
576
577         Fix bug #59760
578         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
579         OperatorArrayList, MethodCoreArrayList for typecontainer
580         containers. Changed class member types to these new types.
581         (MethodArrayList.DefineMembers): Added test for CS0659.
582
583 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
584
585         * cfold.cs: Synchronize the folding with the code in expression.cs
586         Binary.DoNumericPromotions for uint operands.
587
588         * attribute.cs: Revert patch from Raja, it introduced a regression
589         while building Blam-1.2.1 (hard to isolate a test case).
590
591 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
592
593         Fix for #55382
594         * class.cs:
595         (TypeContainer.Define): Renamed to DefineContainerMembers because of
596         name collision.
597         (MethodCore.parent_method): New member. The method we're overriding
598         if this is an override method.
599         (MethodCore.CheckBase): Moved from Method class and made common.
600         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
601         private.
602         (MethodCore.CheckForDuplications): New abstract method. For custom
603         member duplication search in a container
604         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
605         method and its return type.
606         (Event.conflict_symbol): New member. Symbol with same name in the
607         parent class.
608
609         * decl.cs:
610         (MemberCache.FindMemberWithSameName): New method. The method
611         is looking for conflict with inherited symbols.
612
613 2004-08-04  Martin Baulig  <martin@ximian.com>
614
615         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
616
617         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
618
619 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
620
621         * report.cs (Message): New enum for better error, warning reference in
622         the code.
623         (MessageData): New inner abstract class. It generally handles printing of
624         error and warning messages.
625         Removed unused Error, Warning, Message methods.
626
627 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
628
629         Fix for cs0592-8.cs test
630         * attribute.cs
631         (Attributable.ValidAttributeTargets): Made public.
632         (Attribute.ExplicitTarget): New member for explicit target value.
633         (Attribute.CheckTargets): Now we translate explicit attribute
634         target to Target here.
635
636 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
637
638         * ecore.cs (MethodGroupExpr): new IsBase property.
639
640         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
641
642         * delegate.cs (DelegateCreation): store a MethodGroupExpr
643         rather than an instance expr.
644
645         (DelegateCreation.Emit): Use the method group rather than
646         the instance expression. Also, if you have base.Foo as the
647         method for a delegate, make sure to emit ldftn, not ldftnvirt.
648
649         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
650
651         (NewDelegate.DoResolve): Only check for the existance of Invoke
652         if the method is going to be needed. Use MethodGroupExpr.
653
654         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
655
656         * expression.cs: For pointer arith., make sure to use
657         the size of the type, not the size of the pointer to
658         the type.
659
660 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
661
662         Fix for #60722
663         * class.cs (Class): Added error CS0502 test.
664
665 2004-08-03  John Luke  <jluke@cfl.rr.com>
666             Raja R Harinath  <rharinath@novell.com>
667
668         Fix for #60997.
669         * attribute.cs (Attribute.complained_before): New flag.
670         (Attribute.ResolveType, Attribute.Resolve),
671         (Attribute.DefinePInvokeMethod): Set it.
672         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
673         
674 2004-08-03  Martin Baulig  <martin@ximian.com>
675
676         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
677         use a user-defined operator; we still need to do numeric
678         promotions in case one argument is a builtin type and the other
679         one has an implicit conversion to that type.  Fixes #62322.
680
681 2004-08-18  Martin Baulig  <martin@ximian.com>
682
683         * class.cs (Method.Define): Use the correct method name when
684         creating the MethodBuilder for a generic method.
685
686 2004-08-17  Martin Baulig  <martin@ximian.com>
687
688         * generic.cs (Constraints): Support type parameter constraints.
689
690 2004-08-16  Martin Baulig  <martin@ximian.com>
691
692         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
693         (Token.GENERIC_DIMENSION): New token; this is returned if we
694         encounter an unbound generic type in a typeof() expression.
695
696         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
697         this token is only generated while parsing a typeof() expression.
698         (typeof_expression): Removed the old unbound_type hack.
699
700         * generic.cs (TypeArguments.IsUnbound): New public property.
701
702         * decl.cs (MemberName): Added support for unbound types.
703
704 2004-08-14  Martin Baulig  <martin@ximian.com>
705
706         * typemanager.cs
707         (TypeManager.IsEqualGenericInstance): New static method.
708         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
709         just used to check accessibility, so follow the rules of 26.1.6.        
710
711         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
712         ConstructedType instead of a TypeExpression if we have type arguments.
713
714         * cs-parser.jay (typeof_expression): Support unbound generic types.
715
716         * ecore.cs (UnboundTypeExpression): New public class.
717
718 2004-08-12  Martin Baulig  <martin@ximian.com>
719
720         * typemanager.cs (TypeManager.IsNestedChildOf): Use
721         TypeManager.IsEqual() rather than `=='.
722
723         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
724         generic instances as well.
725
726 2004-08-12  Martin Baulig  <martin@ximian.com>
727
728         * expression.cs (Invocation.InferType): We can only infer method
729         type parameters.  Fixes #62647.
730
731 2004-08-11  Martin Baulig  <martin@ximian.com>
732
733         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
734         before resolving the base classes.
735
736 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
737
738         * Makefile: install .mdb file too.
739
740 2004-08-05  Martin Baulig  <martin@ximian.com>
741
742         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
743         initializer, the current type is just the TypeBuilder, not the
744         instantiated generic type.
745         (FieldExpr.IsFieldInitializer): New public property.
746
747 2004-08-04  Martin Baulig  <martin@ximian.com>
748
749         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
750
751         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
752
753 2004-08-03  Martin Baulig  <martin@ximian.com>
754
755         * class.cs (MethodData.Define): If we're an explicit
756         implementation, remove the generic arity from the type name.
757
758 2004-08-03  Martin Baulig  <martin@ximian.com>
759
760         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
761         use a user-defined operator; we still need to do numeric
762         promotions in case one argument is a builtin type and the other
763         one has an implicit conversion to that type.  Fixes #62322.
764
765 2004-08-02  Martin Baulig  <martin@ximian.com>
766
767         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
768         `TypeExpr[]' array.
769         (TypeContainer.GetClassBases): Return the unexpanded list of
770         interfaces; we expand them later.
771         (TypeContainer.DefineType): After creating the TypeBuilder, call
772         TypeManager.ExpandInterfaces() to get an expanded and resolved
773         list of interfaces.
774
775         * ecore.cs (TypeExpr.GetInterfaces): Removed
776
777         * generics.cs (Constraints.InterfaceConstraints): Remove.
778         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
779         register the interface constraints.
780
781         * typemanager.cs
782         (TypeManager.AddUserType): Removed the `ifaces' argument.
783         (TypeManager.AddTypeParameter): Likewise.
784         (TypeManager.AddUserInterface): Removed, was unused.
785         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
786         `TypeExpr[]' array for the interfaces.
787         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
788         has been defined, returns a list of the resolved interfaces types.
789         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
790         (TypeManager.GetExplicitInterfaces): Likewise.  
791
792 2004-08-02  Martin Baulig  <martin@ximian.com>
793
794         * expression.cs (Invocation.EmitCall): If we're invoking a method
795         on a type parameter, use the new `Constrained' prefix opcode.
796
797 2004-08-02  Martin Baulig  <martin@ximian.com>
798
799         * statement.cs (LocalInfo.Flags): Added `IsThis'.
800         (LocalInfo.IsThis): New public property.
801         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
802
803 2004-08-01  Martin Baulig  <martin@ximian.com>
804
805         * class.cs (TypeContainer.GetClassBases): Don't set the default
806         here since we may get called from GetPartialBases().
807         (TypeContainer.DefineType): If GetClassBases() didn't return a
808         parent, use the default one.
809
810 2004-07-30  Martin Baulig  <martin@ximian.com>
811
812         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
813
814         * class.cs (SourceMethod): New public class, derive from the
815         symbol writer's ISourceMethod.
816         (Method): Use the new symbol writer API.
817
818         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
819         as argument and use the new symbol writer.
820
821         * location.cs
822         (SourceFile): Implement the symbol writer's ISourceFile.
823         (Location.SymbolDocument): Removed.
824         (Location.SourceFile): New public property.
825
826         * symbolwriter.cs: Use the new symbol writer API.
827
828 2004-07-30  Raja R Harinath  <rharinath@novell.com>
829
830         * Makefile (install-local): Remove.  Functionality moved to
831         executable.make.
832
833 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
834
835         * Makefile: Install mcs.exe.config file together with mcs.exe.
836         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
837         correct runtime version.
838         
839 2004-07-25  Martin Baulig  <martin@ximian.com>
840
841         * class.cs
842         (TypeContainer.RegisterOrder): Removed, this was unused.
843         (TypeContainer, interface_order): Removed.
844         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
845         TypeContainer as argument since we can also be called with a
846         `PartialContainer' for a partial class/struct/interface.
847         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
848         of checking whether we're an `Interface' - we could be a
849         `PartialContainer'.
850         (PartialContainer.Register): Override; call
851         AddClass()/AddStruct()/AddInterface() on our parent.
852
853         * cs-parser.jay (interface_member_declaration): Add things to the
854         `current_container', not the `current_class'.
855
856         * rootcontext.cs (RegisterOrder): The overloaded version which
857         takes an `Interface' was unused, removed.
858
859         * typemanager.cs (TypeManager.LookupInterface): Return a
860         `TypeContainer', not an `Interface'.
861         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
862         contain a `PartialContainer' for an interface, so check it's
863         `Kind' to figure out what it is.
864
865 2004-07-25  Martin Baulig  <martin@ximian.com>
866
867         * class.cs (Class.DefaultTypeAttributes): New public constant.
868         (Struct.DefaultTypeAttributes): Likewise.
869         (Interface.DefaultTypeAttributes): Likewise.
870         (PartialContainer.TypeAttr): Override this and add the
871         DefaultTypeAttributes.
872
873 2004-07-25  Martin Baulig  <martin@ximian.com>
874
875         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
876         we can just use the `Parent' field instead.
877
878 2004-07-25  Martin Baulig  <martin@ximian.com>
879
880         * class.cs (TypeContainer.Emit): Renamed to EmitType().
881
882 2004-07-25  Martin Baulig  <martin@ximian.com>
883
884         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
885         our parts before defining any methods.
886         (TypeContainer.VerifyImplements): Make this virtual.
887         (ClassPart.VerifyImplements): Override and call VerifyImplements()
888         on our PartialContainer.
889
890 2004-07-25  Martin Baulig  <martin@ximian.com>
891
892         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
893
894         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
895         argument, we can just use the `Parent' field instead.
896
897         * class.cs
898         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
899         (MemberBase.DoDefine): Likewise.
900
901 2004-07-24  Martin Baulig  <martin@ximian.com>
902
903         * decl.cs (MemberCore.Parent): New public field.
904         (DeclSpace.Parent): Moved to MemberCore.
905
906         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
907         (MemberBase.ctor): Added TypeContainer argument, pass it to our
908         parent's .ctor.
909         (FieldBase, Field, Operator): Likewise.
910         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
911         (EventField, Event): Likewise.
912
913 2004-07-23  Martin Baulig  <martin@ximian.com>
914
915         * class.cs (PartialContainer): New public class.
916         (ClassPart): New public class.
917         (TypeContainer): Added support for partial classes.
918         (TypeContainer.GetClassBases): Splitted some of the functionality
919         out into GetNormalBases() and GetPartialBases().
920
921         * cs-tokenizer.cs (Token.PARTIAL): New token.
922         (Tokenizer.consume_identifier): Added some hacks to recognize
923         `partial', but only if it's immediately followed by `class',
924         `struct' or `interface'.
925
926         * cs-parser.jay: Added support for partial clases.
927
928 2004-07-23  Martin Baulig  <martin@ximian.com>
929
930         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
931         a `DeclSpace' and also made it readonly.
932         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
933         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
934         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
935
936         * cs-parser.jay: Pass the `current_class', not the
937         `current_container' (at the moment, this is still the same thing)
938         to a new Method, Property, Event, Indexer or Constructor.
939
940 2004-07-23  Martin Baulig  <martin@ximian.com>
941
942         * cs-parser.jay (CSharpParser): Added a new `current_class' field
943         and removed the `current_interface' one.
944         (struct_declaration, class_declaration, interface_declaration):
945         Set `current_class' to the newly created class/struct/interface;
946         set their `Bases' and call Register() before parsing their body.
947
948 2004-07-23  Martin Baulig  <martin@ximian.com>
949
950         * class.cs (Kind): New public enum.
951         (TypeContainer): Made this class abstract.
952         (TypeContainer.Kind): New public readonly field.
953         (TypeContainer.CheckDef): New public method; moved here from
954         cs-parser.jay.
955         (TypeContainer.Register): New public abstract method.
956         (TypeContainer.GetPendingImplementations): New public abstract
957         method.
958         (TypeContainer.GetClassBases): Removed the `is_class' and
959         `is_iface' parameters.
960         (TypeContainer.DefineNestedTypes): Formerly known as
961         DoDefineType().
962         (ClassOrStruct): Made this class abstract.
963
964         * tree.cs (RootTypes): New public type. 
965
966 2004-07-20  Martin Baulig  <martin@ximian.com>
967
968         * tree.cs (Tree.RecordNamespace): Removed.
969         (Tree.Namespaces): Removed.
970
971         * rootcontext.cs (RootContext.IsNamespace): Removed.
972
973         * cs-parser.jay (namespace_declaration): Just create a new
974         NamespaceEntry here.
975
976 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
977
978         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
979         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
980         entry to make sure it runs in the correct runtime version.
981         
982 2004-07-18  Martin Baulig  <martin@ximian.com>
983
984         * generic.cs (ConstructedType.CheckConstraints): Improved
985         constraints checking.
986
987 2004-07-18  Martin Baulig  <martin@ximian.com>
988
989         * expression.cs (Invocation.BetterMethod): Call
990         TypeManager.TypeToCoreType() on all types and removed my previous
991         hack; we're already doig the right thing here.
992
993 2004-07-17  Martin Baulig  <martin@ximian.com>
994
995         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
996
997 2004-07-16  Martin Baulig  <martin@ximian.com>
998
999         * iterators.cs: Added generics support.
1000
1001 2004-07-16  Martin Baulig  <martin@ximian.com>
1002
1003         * iterators.cs: Rewrote this.  We're now using one single Proxy
1004         class for both the IEnumerable and the IEnumerator interface and
1005         `Iterator' derives from Class so we can use the high-level API.
1006
1007         * class.cs (TypeContainer.AddIterator): New method.
1008         (TypeContainer.DoDefineType): New protected virtual method, which
1009         is called from DefineType().
1010         (TypeContainer.DoDefineMembers): Call DefineType() and
1011         DefineMembers() on all our iterators.
1012         (TypeContainer.Emit): Call Emit() on all our iterators.
1013         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1014
1015         * codegen.cs (EmitContext.CurrentIterator): New public field.
1016
1017 2004-07-15  Martin Baulig  <martin@ximian.com>
1018
1019         * typemanager.cs
1020         (TypeManager.not_supported_exception_type): New type.   
1021
1022 2004-07-14  Martin Baulig  <martin@ximian.com>
1023
1024         * typemanager.cs
1025         (TypeManager.generic_ienumerable_type): New type.
1026         (TypeManager.generic_ienumerator_type): New type.
1027
1028         * rootcontext.cs
1029         (RootContext.interfaces_first_stage): Added
1030         "System.Collections.Generic.IEnumerator`1" and
1031         "System.Collections.Generic.IEnumerable`1".     
1032
1033 2004-07-14  Martin Baulig  <martin@ximian.com>
1034
1035         * iterators.cs: Use real error numbers.
1036
1037 2004-07-14  Martin Baulig  <martin@ximian.com>
1038
1039         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1040         requires this to be a System.Collection.IEnumerable and not a
1041         class implementing that interface.
1042         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1043
1044 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1045
1046         * class.cs: Fixed previous fix, it broke some error tests.
1047
1048 2004-07-12  Martin Baulig  <martin@ximian.com>
1049
1050         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1051         Fixes #61293.
1052
1053 2004-07-14  Martin Baulig  <martin@ximian.com>
1054
1055         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
1056         an exclamation mark (!) for the generic arity to reflect the
1057         latest spec changes; ie. use "System.Collections.Generic.IList`1".
1058
1059 2004-07-13  Martin Baulig  <martin@ximian.com>
1060
1061         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
1062         specifiers being part of a type argument.
1063
1064 2004-07-13  Martin Baulig  <martin@ximian.com>
1065
1066         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
1067         name for generic types.
1068
1069 2004-07-13  Martin Baulig  <martin@ximian.com>
1070
1071         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
1072         bit to fix #60119.
1073
1074 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1075
1076         * assign.cs (LocalTemporary): Add new argument: is_address,If
1077         `is_address' is true, then the value that we store is the address
1078         to the real value, and not the value itself.
1079         
1080         * ecore.cs (PropertyExpr): use the new local temporary
1081         stuff to allow us to handle X.Y += z (where X is a struct)
1082
1083 2004-07-08  Martin Baulig  <martin@ximian.com>
1084
1085         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1086         not always return, just like we're doing in Using.Resolve().
1087
1088 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1089
1090         * cs-parser.jay (fixed_statement): flag this as Pinned.
1091
1092 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1093
1094         * typemanager.cs (TypeManager): Removed MakePinned method, this
1095         mechanism is replaced with the .NET 2.x compatible mechanism of
1096         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1097
1098         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1099         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1100         `IsFixed' property which has a different meaning.
1101
1102 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1103
1104         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1105         visible from inside a nested class, not just the names of the
1106         immediately enclosing class.
1107         Fix for bug #60730.
1108
1109 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1110
1111         * expression.cs (BetterConversion): Remove buggy special-case
1112         handling of "implicit constant expression conversions".  At this
1113         point, we already know that the conversion is possible -- we're
1114         only checking to see which is better.
1115
1116 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1117
1118         * cs-parser.jay: Added error CS0210 test.
1119
1120 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1121
1122         * cs-parser.jay: Added error CS0134 test.
1123
1124 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1125
1126         Fix bug #52507
1127         * cs-parser.jay: Added error CS0145 test.
1128
1129 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1130
1131         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1132
1133 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1134         
1135         * expression.cs (StackAlloc.Resolve): The argument may not
1136         be a constant; deal with this case.
1137         
1138 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1139
1140         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1141         GetIndexerAttributeValue.
1142         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1143
1144         * class.cs (Indexer.Define): Added error tests for CS0415,
1145         CS0609.
1146
1147 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1148
1149         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1150         property code.
1151
1152 2004-06-23  Martin Baulig  <martin@ximian.com>
1153
1154         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1155         neither return nor throw, reset the barrier as well.  Fixes #60457.
1156
1157 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1158
1159         * class.cs : EventAttributes is now set to None by default.
1160           This fixes bug #60459.
1161
1162 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1163
1164         Fix bug #60219
1165         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1166         Don't throw exception but return null (it's sufficient now).
1167
1168 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1169
1170         * typemanager.cs (GetArgumentTypes): Faster implementation.
1171
1172 2004-06-18  Martin Baulig  <martin@ximian.com>
1173
1174         * attribute.cs (Attribute.Resolve): Check whether we're an
1175         EmptyCast which a Constant child.  Fixes #60333.
1176
1177 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1178
1179         * statement.cs (EmitCollectionForeach): Account for the fact that
1180         not all valuetypes are in areas which we can take the address of.
1181         For these variables, we store to a temporary variable. Also, make
1182         sure that we dont emit a `callvirt' on a valuetype method.
1183
1184 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1185
1186         * expression.cs (StackAlloc.DoReSolve): Added test for
1187         negative parameter (CS0247).
1188
1189 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1190
1191         Fix bug #59792
1192         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1193
1194 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1195
1196         Fix bug #59781
1197         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1198         ulong.
1199
1200 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1201
1202         Fix bug #58254 & cs1555.cs, cs1556.cs
1203         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1204
1205 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1206
1207         * cs-parser.jay: Added error CS1669 test for indexers.
1208
1209 2004-06-18  Martin Baulig  <martin@ximian.com>
1210
1211         * generics.cs (GenericMethod.ctor): Don't take an Attributes
1212         argument.  Fixes #60441.
1213
1214 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
1215         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
1216         The name needs to have the actual name of the method in order
1217         for other tests (such as the one in OverloadResolve for Invoke
1218         on a delegate) to work. As well, it does not really help
1219         error reporting because the method group had multiple methods.
1220         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
1221         Make profiling work.
1222         
1223 2004-06-13  Martin Baulig  <martin@ximian.com>
1224
1225         * cs-parser.jay: Don't allow generic attributes.
1226
1227 2004-06-13  Martin Baulig  <martin@ximian.com>
1228
1229         * class.cs (MemberBase.DoDefineBase): New protected method.
1230         (MemberBase.DoDefine): Compute the `flags' in the new
1231         DoDefineBase() which must be called first.
1232         (Method.Define): Call DoDefineBase() first so we have the flags
1233         when defining the generic method.
1234
1235         * cs-parser.jay (interface_method_declaration): Support generic methods.
1236
1237 2004-06-13  Martin Baulig  <martin@ximian.com>
1238
1239         * decl.cs (TypeName): Removed.
1240         (MemberName): Removed TypeName and MemberNow; now we just have
1241         MemberName.
1242
1243         * cs-parser.jay: Don't distinguish between type arguments and type
1244         parameters in the grammar and simplified the rules a bit.  The
1245         reduce/reduce conflicts are now gone (except the one we inherited
1246         from mcs).
1247
1248 2004-06-11  Martin Baulig  <martin@ximian.com>
1249
1250         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1251         call this twice: for params and varargs methods.
1252
1253 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1254
1255         * class.cs:
1256         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1257
1258 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1259
1260         * attribute.cs (Attribute.GetValidTargets): Made public.
1261
1262         * class.cs: 
1263         (AbstractPropertyEventMethod): New class for better code sharing.
1264         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1265         CS1667 report.
1266         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1267
1268 2004-06-09  Martin Baulig  <martin@ximian.com>
1269
1270         * cs-parser.jay: Removed a reduce/reduce conflict.
1271
1272 2004-06-03  Martin Baulig  <martin@ximian.com>
1273
1274         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
1275         GetSimpleName() and return a SimpleName.
1276
1277         * ecore.cs (SimpleName.Arguments): New public field.
1278         (SimpleName): Added overloaded ctor which takes an additional
1279         TypeArguments argument.
1280         (SimpleName.SimpleNameResolve): Added support for generic methods.
1281         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
1282         formerly in MemberAccess.DoResolve(), but we also need it in
1283         SimpleNameResolve().
1284
1285         * expression.cs (MemberAccess.DoResolve): Use the new
1286         MethodGroupExpr.ResolveGeneric().       
1287
1288 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1289
1290         * decl.cs: If possible, use lookuptypedirect here. We can only do
1291         this if there is no `.' after the namespace. Avoids using
1292         LookupType, which does lots of slow processing.
1293         (FindNestedType) New method, does what it says :-).
1294         * namespace.cs: use LookupTypeDirect.
1295         * rootcontext.cs: use membercache, if possible.
1296         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1297
1298 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1299
1300         * expression.cs:
1301         According to the spec, 
1302
1303         In a member access of the form E.I, if E is a single identifier,
1304         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1305         field, property, localvariable, or parameter with the same type as
1306         the meaning of E as a type-name (§3.8), then both possible
1307         meanings of E are permitted.
1308
1309         We did not check that E as a simple-name had the same type as E as
1310         a type name.
1311
1312         This trivial check gives us 5-7% on bootstrap time.
1313
1314 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1315
1316         * expression.cs (Invocation.OverloadResolve): Avoid the
1317         use of hashtables and boxing here by allocating on demand.
1318
1319 2004-05-30  Martin Baulig  <martin@ximian.com>
1320
1321         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1322         we're doing a silent lookup.  Don't try to lookup nested types in
1323         TypeManager.object_type (thanks to Ben Maurer).
1324
1325 2004-05-30  Martin Baulig  <martin@ximian.com>
1326
1327         Committing a patch from Ben Maurer.
1328
1329         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1330
1331 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1332
1333         * convert.cs: add a trivial cache for overload operator resolution.
1334
1335 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
1336
1337         * attribute.cs
1338         (AttributeTester.GetObsoleteAttribute): Returns instance of
1339         ObsoleteAttribute when type is obsolete.
1340
1341         * class.cs
1342         (TypeContainer.VerifyObsoleteAttribute): Override.
1343         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1344         (MethodCode.VerifyObsoleteAttribute): Override.
1345         (MemberBase.VerifyObsoleteAttribute): Override.
1346
1347         * decl.cs
1348         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1349         and report proper error.
1350
1351         *delegate.cs
1352         (Delegate.VerifyObsoleteAttribute): Override.
1353
1354         * ecore.cs
1355         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1356         and report proper error.
1357         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1358
1359         * enum.cs
1360         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1361         and enum member.
1362
1363         * expression.cs
1364         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1365         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1366         Added test for ObsoleteAttribute.
1367
1368         * statement.cs
1369         (Catch): Derived from Statement.
1370
1371 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1372
1373         * decl.cs: If possible, use lookuptypedirect here. We can only do
1374         this if there is no `.' after the namespace. Avoids using
1375         LookupType, which does lots of slow processing.
1376         (FindNestedType) New method, does what it says :-).
1377         * namespace.cs: use LookupTypeDirect.
1378         * rootcontext.cs: use membercache, if possible.
1379         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1380
1381 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1382
1383         * expression.cs:
1384         According to the spec, 
1385
1386         In a member access of the form E.I, if E is a single identifier,
1387         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1388         field, property, localvariable, or parameter with the same type as
1389         the meaning of E as a type-name (§3.8), then both possible
1390         meanings of E are permitted.
1391
1392         We did not check that E as a simple-name had the same type as E as
1393         a type name.
1394
1395         This trivial check gives us 5-7% on bootstrap time.
1396
1397 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1398
1399         Fixed bug #59071 & cs0160.cs
1400         * statement.cs (Try.Resolve): Check here whether order of catch
1401         clauses matches their dependencies.
1402
1403 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1404
1405         Fixed bug #58624
1406         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
1407         unsafe type.
1408
1409 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1410
1411         * expression.cs (Invocation.OverloadResolve): Avoid the
1412         use of hashtables and boxing here by allocating on demand.
1413
1414 2004-05-30  Martin Baulig  <martin@ximian.com>
1415
1416         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1417         we're doing a silent lookup.  Don't try to lookup nested types in
1418         TypeManager.object_type (thanks to Ben Maurer).
1419
1420 2004-05-30  Martin Baulig  <martin@ximian.com>
1421
1422         Committing a patch from Ben Maurer.
1423
1424         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
1425
1426 2004-05-29  Martin Baulig  <martin@ximian.com>
1427
1428         * class.cs (IMethodData.ShouldIgnore): New method.
1429
1430         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1431         `Location' argument, we don't need it anywhere.  Use
1432         `IMethodData.ShouldIgnore ()' instead of
1433         `MethodData.GetMethodFlags ()'.
1434         (TypeManager.AddMethod): Removed.
1435         (TypeManager.AddMethod2): Renamed to AddMethod.
1436
1437 2004-05-29  Martin Baulig  <martin@ximian.com>
1438
1439         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1440
1441         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1442         converting from a class type S to an interface type and we already
1443         have an object on the stack, don't box it again.  Fixes #52578.
1444
1445 2004-05-29  Martin Baulig  <martin@ximian.com>
1446
1447         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1448         Added support for `params' parameters.  Fixes #59267.
1449
1450 2004-05-29  Martin Baulig  <martin@ximian.com>
1451
1452         * literal.cs (NullPointer): Provide a private .ctor which sets
1453         `type' to TypeManager.object_type.  Fixes #59048.
1454
1455 2004-05-29  Martin Baulig  <martin@ximian.com>
1456
1457         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1458         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1459
1460         * ecore.cs (EventExpr.instance_expr): Make the field private.
1461
1462 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1463
1464         Fixed bug #50080 & cs0214-2.cs
1465         * expression.cs (Cast.DoResolve): Check unsafe context here.
1466         
1467         * statement.cs (Resolve.DoResolve): Likewise.
1468
1469 2004-05-26  Martin Baulig  <martin@ximian.com>
1470
1471         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1472
1473         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1474         (RootContext.LookupType): Pass down the `silent' flag.
1475
1476 2004-05-25  Martin Baulig  <martin@ximian.com>
1477
1478         * expression.cs
1479         (MethodGroupExpr.IdenticalTypeName): New public property.
1480         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1481         expression actually refers to a type.
1482
1483 2004-05-25  Martin Baulig  <martin@ximian.com>
1484
1485         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1486         for #56176 and made it actually work.
1487
1488 2004-05-25  Martin Baulig  <martin@ximian.com>
1489
1490         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1491         (FieldExpr, PropertyExpr): Override and implement
1492         CacheTemporaries.  Fixes #52279.
1493
1494 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1495
1496         * location.cs: In the new compiler listing a file twice is a
1497         warning, not an error.
1498
1499 2004-05-24  Martin Baulig  <martin@ximian.com>
1500
1501         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1502         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1503
1504 2004-05-24  Martin Baulig  <martin@ximian.com>
1505
1506         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1507         walking the `using' list.  Fixes #53921.
1508
1509 2004-05-24  Martin Baulig  <martin@ximian.com>
1510
1511         * const.cs (Const.LookupConstantValue): Added support for
1512         EmptyCast's; fixes #55251.
1513
1514 2004-05-24  Martin Baulig  <martin@ximian.com>
1515
1516         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1517         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1518         which does the CS0135 check.  The reason is that we first need to
1519         check whether the variable actually exists.
1520
1521 2004-05-24  Martin Baulig  <martin@ximian.com>
1522
1523         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1524         than RootContext.LookupType() to find the explicit interface
1525         type.  Fixes #58584.
1526
1527 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1528
1529         * Makefile: Simplify.  Use executable.make.
1530         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1531
1532 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1533
1534         * decl.cs:
1535         * enum.cs:
1536         Use the invariant culture when doing String.Compare for CLS case
1537         sensitivity.
1538         
1539 2004-05-23  Martin Baulig  <martin@ximian.com>
1540
1541         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1542         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1543
1544         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1545
1546 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1547
1548         * class.cs (MemberBase.Define): Reuse MemberType member for 
1549         resolved type. Other methods can use it too.
1550
1551 2004-05-23  Martin Baulig  <martin@ximian.com>
1552
1553         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1554         the variable also exists in the current block (otherwise, we need
1555         to report a CS0103).  Fixes #58670.
1556
1557 2004-05-23  Martin Baulig  <martin@ximian.com>
1558
1559         * flowanalysis.cs (Reachability.Reachable): Compute this
1560         on-the-fly rather than storing it as a field.
1561
1562 2004-05-23  Martin Baulig  <martin@ximian.com>
1563
1564         * flowanalysis.cs (Reachability.And): Manually compute the
1565         resulting `barrier' from the reachability.      
1566        
1567 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1568
1569         Fix bug #57835
1570         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1571         instance of ObsoleteAttribute when symbol is obsolete.
1572
1573         * class.cs
1574         (IMethodData): Extended interface for ObsoleteAttribute support.
1575
1576 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1577
1578         * attribute.cs: Fix bug #55970
1579
1580 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1581
1582         Fix bug #52705
1583         * attribute.cs
1584         (GetObsoleteAttribute): New method. Creates the instance of
1585         ObsoleteAttribute.
1586         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1587         ObsoleteAttribute when member is obsolete.
1588         (AttributeTester.Report_ObsoleteMessage): Common method for
1589         Obsolete error/warning reporting.
1590
1591         * class.cs
1592         (TypeContainer.base_classs_type): New member for storing parent type.
1593
1594         * decl.cs
1595         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1596         for this MemberCore.
1597
1598 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1599
1600         * attribute.cs, const.cs: Fix bug #58590
1601
1602 2004-05-21  Martin Baulig  <martin@ximian.com>
1603
1604         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1605         out parameters if the end of the method is unreachable.  Fixes
1606         #58098. 
1607
1608 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1609
1610         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1611         Hari was right, why extra method.
1612
1613 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1614
1615         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1616
1617 2004-05-20  Martin Baulig  <martin@ximian.com>
1618
1619         * delegate.cs: Convert this file to Unix mode - like the original
1620         version in mcs is.
1621
1622 2004-05-20  Martin Baulig  <martin@ximian.com>
1623
1624         * attribute.cs: Convert this file to Unix mode - like the original
1625         version in mcs is.
1626
1627 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1628
1629        Fix bug #58688 (MCS does not report error when the same attribute
1630        is assigned twice)
1631
1632        * attribute.cs (Attribute.Emit): Distinction between null and default.
1633
1634 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1635
1636        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1637        of a top-level attribute without an attribute target.
1638        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1639        Make non-static.
1640        (Attribute.Conditional_GetConditionName), 
1641        (Attribute.Obsolete_GetObsoleteMessage): Update.
1642        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1643        part of ScanForIndexerName.
1644        (Attribute.CanIgnoreInvalidAttribute): New function.
1645        (Attribute.ScanForIndexerName): Move to ...
1646        (Attributes.ScanForIndexerName): ... here.
1647        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1648        (Attributes.Search): New internal variant that can choose not to
1649        complain if types aren't resolved.  The original signature now
1650        complains.
1651        (Attributes.GetClsCompliantAttribute): Use internal variant, with
1652        complaints suppressed.
1653        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1654        only if it not useful.
1655        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1656        top-level for attributes that are shared between the assembly
1657        and a top-level class.
1658        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1659        * class.cs: Update to reflect changes.
1660        (DefineIndexers): Fuse loops.
1661        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1662        a couple more variants of attribute names.
1663
1664 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1665
1666         Fix bug #52585 (Implemented explicit attribute declaration)
1667
1668         * attribute.cs:
1669         (Attributable.ValidAttributeTargets): New abstract method. It gets
1670         list of valid attribute targets for explicit target declaration.
1671         (Attribute.Target): It holds target itself.
1672         (AttributeSection): Removed.
1673         (Attribute.CheckTargets): New method. It checks whether attribute
1674         target is valid for the current element.
1675
1676         * class.cs:
1677         (EventProperty): New class. For events that are declared like
1678         property (with add and remove accessors).
1679         (EventField): New class. For events that are declared like field.
1680         class.cs
1681
1682         * cs-parser.jay: Implemented explicit attribute target declaration.
1683
1684         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1685         Override ValidAttributeTargets.
1686
1687         * parameter.cs:
1688         (ReturnParameter): Class for applying custom attributes on 
1689         the return type.
1690         (ParameterAtribute): New class. Class for applying custom
1691         attributes on the parameter type.
1692
1693 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1694
1695         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1696         definitions. 
1697
1698         (Method): Allow UNSAFE here.
1699
1700         * modifiers.cs: Support unsafe reporting.
1701
1702 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1703
1704         * decl.cs: Fix bug #58478.
1705
1706 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1707
1708         * statement.cs: When checking for unreachable code on an EmptyStatement,
1709         set the location. Fixes bug #58488.
1710
1711 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1712
1713         * driver.cs: Add -pkg handling.
1714
1715         From Gonzalo: UseShelLExecute=false
1716
1717 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1718
1719         * attribute.cs:
1720         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1721         for attribute.
1722         (Attribute.IsClsCompliaceRequired): Moved to base for better
1723         accesibility.
1724         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1725         when attribute is AttributeUsageAttribute.
1726         (Attribute.GetValidTargets): Simplified.
1727         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1728         attribute for this type.
1729         (Attribute.ApplyAttributes): Method renamed to Emit and make
1730         non-static.
1731         (GlobalAttributeSection): New class for special handling of global
1732         attributes (assembly, module).
1733         (AttributeSection.Emit): New method.
1734
1735         * class.cs: Implemented Attributable abstract methods.
1736         (MethodCore.LabelParameters): Moved to Parameter class.
1737         (Accessor): Is back simple class.
1738         (PropertyMethod): Implemented Attributable abstract class.
1739         (DelegateMethod): Implemented Attributable abstract class.
1740         (Event): New constructor for disctintion between normal Event
1741         and Event with accessors.
1742
1743         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1744
1745         * codegen.cs, const.cs, decl.cs, delegate.cs:
1746         (CommonAssemblyModulClass): Implemented Attributable abstract class
1747         and simplified.
1748
1749         * enum.cs: Implement IAttributeSupport interface.
1750         (EnumMember): New class for emum members. Implemented Attributable
1751         abstract class
1752
1753         * parameter.cs:
1754         (ParameterBase): Is abstract.
1755         (ReturnParameter): New class for easier [return:] attribute handling.
1756
1757         * typemanager.cs: Removed builder_to_attr.
1758
1759 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1760
1761         Fix bug #57151.
1762         * attribute.cs (Attribute.GetPositionalValue): New function.
1763         * class.cs (TypeContainer.VerifyMembers): New function.
1764         (TypeContainer.Emit): Use it.
1765         (ClassOrStruct): New base class for Class and Struct.
1766         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1767         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1768         class.
1769         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1770         then each non-static field should have a FieldOffset attribute.
1771         Otherwise, none of the fields should have a FieldOffset attribute.
1772         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1773         and FieldOffset attributes.
1774         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1775         (TypeManager.field_offset_attribute_type): New core types.
1776         (TypeManager.InitCoreTypes): Initialize them.
1777
1778 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1779
1780         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1781         Return correct type.
1782         From bug #58270.
1783
1784 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1785
1786         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1787         be implicitly converted to ulong.
1788         
1789         * expression.cs: The logic for allowing operator &, | and ^ worked
1790         was wrong, it worked before because we did not report an error in
1791         an else branch.  Fixes 57895.
1792
1793         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1794         allow volatile fields to be reference types.
1795
1796 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1797
1798         * driver.cs: Add support for /debug-
1799
1800 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1801
1802         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1803         Add a 'complain' parameter to silence errors.
1804         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1805         silently overlooked type-resolutions.
1806         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1807         to reflect changes.
1808         (Attributes.Search): New function.
1809         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1810         (Attributes.GetAttributeFullName): Remove hack.
1811         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1812         Update to reflect changes.
1813         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1814         Use Attributes.Search instead of nested loops.
1815
1816 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1817
1818         * decl.cs:
1819         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1820         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1821         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1822
1823         * report.cs: (Report.Warning): Renamed to Warning_T because of
1824         parameter collision.
1825
1826 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1827
1828         * expression.cs (MemberAccess.ResolveMemberAccess):
1829         Exit with non-zero status after Report.Error.
1830         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1831         Likewise.
1832         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1833
1834 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1835
1836         * support.cs: Don't hang when the file is empty.
1837
1838 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1839
1840         * support.cs: In SeekableStreamReader, compute the preamble size of the
1841           underlying stream. Position changes should take into account that initial
1842           count of bytes.
1843
1844 2004-05-03  Todd Berman  <tberman@sevenl.net>
1845
1846         * driver.cs: remove unused GetSysVersion function.
1847
1848 2004-05-03  Todd Berman  <tberman@sevenl.net>
1849
1850         * driver.cs: Remove the hack from saturday, as well as the hack
1851         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1852         link_paths to get that bit proper.
1853
1854 2004-05-01  Todd Berman  <tberman@sevenl.net>
1855
1856         * driver.cs: Try a LoadFrom before a Load, this checks the current
1857         path. This is currently a bug in mono that is be fixed, however, this
1858         provides a workaround for now. This will be removed when the bug
1859         is fixed.
1860
1861 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1862
1863         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1864         incomplete key pairs (#57941).
1865
1866 2004-05-01  Todd Berman  <tberman@sevenl.net>
1867
1868         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1869         from the GAC
1870
1871 2004-04-30  Jackson Harper  <jackson@ximian.com>
1872
1873         * codegen.cs: Open keys readonly.
1874         
1875 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1876
1877         * typemanager.cs: don't report cyclic struct layout when a struct
1878         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1879         which has 2 Pango.Rectangle fields.
1880
1881 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1882
1883         * expression.cs: Handle IntPtr comparisons with IL code
1884         rather than a method call.
1885
1886 2004-04-29  Martin Baulig  <martin@ximian.com>
1887
1888         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1889         the list of PropertyInfo's in class hierarchy and find the
1890         accessor.  Fixes #56013.
1891
1892 2004-04-29  Martin Baulig  <martin@ximian.com>
1893
1894         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
1895
1896 2004-04-29  Martin Baulig  <martin@ximian.com>
1897
1898         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1899
1900         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
1901
1902 2004-04-29  Martin Baulig  <martin@ximian.com>
1903
1904         * class.cs (ConstructorInitializer.Resolve): Check whether the
1905         parent .ctor is accessible.  Fixes #52146.
1906
1907 2004-04-29  Martin Baulig  <martin@ximian.com>
1908
1909         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1910
1911         * statement.cs (Using.EmitLocalVariableDecls): Use
1912         TypeManager.idisposable_type, not typeof (IDisposable).
1913         (Foreach.EmitCollectionForeach): Added support for valuetypes.
1914
1915 2004-04-29  Martin Baulig  <martin@ximian.com>
1916
1917         * class.cs (Event.Define): Don't emit the field and don't set
1918         RTSpecialName and SpecialName for events on interfaces.  Fixes
1919         #57703. 
1920
1921 2004-04-29  Raja R Harinath  <rharinath@novell.com>
1922
1923         Refactor Attribute.ApplyAttributes.
1924         * attribute.cs (Attributable): New base class for objects that can
1925         have Attributes applied on them.
1926         (Attribute): Make AttributeUsage fields public.
1927         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
1928         (Attribute.IsInternalCall): New property.
1929         (Attribute.UsageAttr): Convert to a public read-only property.
1930         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
1931         (Attribute.ResolveType, Attribute.Resolve)
1932         (Attribute.ScanForIndexerName): Update to reflect changes.
1933         (Attribute.CheckAttributeTarget): Re-format.
1934         (Attribute.ApplyAttributes): Refactor, to various
1935         Attributable.ApplyAttributeBuilder methods.
1936         * decl.cs (MemberCore): Make Attributable.
1937         * class.cs (Accessor): Make Attributable.
1938         (MethodData.ApplyAttributes): Use proper attribute types, not
1939         attribute names.
1940         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
1941         (TypeContainer.ApplyAttributeBuilder)
1942         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
1943         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
1944         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
1945         (Operator.ApplyAttributeBuilder): New factored-out methods.
1946         * const.cs (Const.ApplyAttributeBuilder): Likewise.
1947         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
1948         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
1949         * parameter.cs (ParameterBase): New Attributable base class
1950         that can also represent Return types.
1951         (Parameter): Update to the changes.
1952
1953 2004-04-29  Jackson Harper  <jackson@ximian.com>
1954
1955         * driver.cs: Prefer the corlib system version when looking for
1956         assemblies in the GAC. This is still a hack, but its a better hack
1957         now.
1958         
1959 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
1960
1961         * decl.cs, enum.cs: Improved error 3005 reporting.
1962   
1963         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
1964         (related_symbols): New private member for list of symbols
1965         related to reported error/warning.
1966         
1967         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
1968
1969 2004-04-29  Martin Baulig  <martin@ximian.com>
1970
1971         * ecore.cs (Expression.Constantify): If we're an enum and
1972         TypeManager.TypeToCoreType() doesn't give us another type, use
1973         t.UnderlyingSystemType.  Fixes #56178.  
1974
1975 2004-04-29  Martin Baulig  <martin@ximian.com>
1976
1977         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
1978         interfaces and for each interface, only add members directly
1979         declared in that interface.  Fixes #53255.
1980
1981 2004-04-28  Martin Baulig  <martin@ximian.com>
1982
1983         * expression.cs (ConditionalLogicalOperator): Use a temporary
1984         variable for `left' to avoid that we evaluate it more than once;
1985         bug #52588.
1986
1987 2004-04-28  Martin Baulig  <martin@ximian.com>
1988
1989         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
1990         `void[]' (CS1547).
1991
1992 2004-04-28  Martin Baulig  <martin@ximian.com>
1993
1994         * statement.cs (LocalInfo.Resolve): Check whether the type is not
1995         void (CS1547).
1996
1997         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
1998         whether the type is not void (CS1547).
1999
2000 2004-04-28  Martin Baulig  <martin@ximian.com>
2001
2002         * expression.cs (Unary.DoResolveLValue): Override this and report
2003         CS0131 for anything but Operator.Indirection.
2004
2005 2004-04-28  Martin Baulig  <martin@ximian.com>
2006
2007         Committing a patch from Ben Maurer; see bug #50820.
2008
2009         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2010         check for classes.
2011
2012         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2013         classes.        
2014
2015 2004-04-28  Martin Baulig  <martin@ximian.com>
2016
2017         Committing a patch from Ben Maurer; see bug #50820.
2018
2019         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2020         check for classes.
2021
2022         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2023         classes.        
2024
2025 2004-04-28  Martin Baulig  <martin@ximian.com>
2026
2027         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2028         (Block.AddLabel): Call DoLookupLabel() to only search in the
2029         current block.
2030
2031 2004-04-28  Martin Baulig  <martin@ximian.com>
2032
2033         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2034         comparing StringConstants and NullLiterals in Equality and Inequality.
2035
2036 2004-04-28  Jackson Harper  <jackson@ximian.com>
2037
2038         * driver.cs: Attempt to load referenced assemblies from the
2039         GAC. This is the quick and dirty version of this method that
2040         doesnt take into account versions and just takes the first
2041         canidate found. Will be good enough for now as we will not have more
2042         then one version installed into the GAC until I update this method.
2043
2044 2004-04-28  Martin Baulig  <martin@ximian.com>
2045
2046         * typemanager.cs (TypeManager.CheckStructCycles): New public
2047         static method to check for cycles in the struct layout.
2048
2049         * rootcontext.cs (RootContext.PopulateTypes): Call
2050         TypeManager.CheckStructCycles() for each TypeContainer.
2051         [Note: We only need to visit each type once.]
2052
2053 2004-04-28  Martin Baulig  <martin@ximian.com>
2054
2055         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2056
2057         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2058         success and added `out object value'.  Use a `bool resolved' field
2059         to check whether we've already been called rather than
2060         `ConstantValue != null' since this breaks for NullLiterals.
2061
2062 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2063
2064         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2065         setting of this flag, since the 'set' method may be non-public.
2066
2067 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2068
2069         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2070         check on current_vector.Block.
2071
2072 2004-04-27  Martin Baulig  <martin@ximian.com>
2073
2074         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2075         a field initializer.  Fixes #56459.
2076
2077 2004-04-27  Martin Baulig  <martin@ximian.com>
2078
2079         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2080         we're not attempting to use an indexer.  Fixes #52154.
2081
2082 2004-04-27  Martin Baulig  <martin@ximian.com>
2083
2084         * statement.cs (Return): Don't create a return label if we don't
2085         need it; reverts my change from January 20th.  Thanks to Ben
2086         Maurer for this.
2087
2088 2004-04-27  Martin Baulig  <martin@ximian.com>
2089
2090         According to the spec, `goto' can only leave a nested scope, but
2091         never enter it.
2092
2093         * statement.cs (Block.LookupLabel): Only lookup in the current
2094         block, don't recurse into parent or child blocks.
2095         (Block.AddLabel): Check in parent and child blocks, report
2096         CS0140/CS0158 if we find a duplicate.
2097         (Block): Removed this indexer for label lookups.
2098         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2099         this already does the error reporting for us.
2100
2101         * flowanalysis.cs
2102         (FlowBranching.UsageVector.Block): New public variable; may be null.
2103         (FlowBranching.CreateSibling): Added `Block' argument.
2104         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2105         label for the target of a `goto' and check whether we're not
2106         leaving a `finally'.
2107
2108 2004-04-27  Martin Baulig  <martin@ximian.com>
2109
2110         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2111         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2112         just for returns).
2113
2114 2004-04-27  Martin Baulig  <martin@ximian.com>
2115
2116         * statement.cs (Block.AddLabel): Also check for implicit blocks
2117         and added a CS0158 check.
2118
2119 2004-04-27  Martin Baulig  <martin@ximian.com>
2120
2121         * flowanalysis.cs (FlowBranchingLoop): New class.
2122         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2123         UsageVector's instead of an ArrayList.
2124         (FlowBranching.Label): Likewise.
2125         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2126         (FlowBranching.AddBreakVector): New method.
2127
2128 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2129
2130         * attribute.cs: Small regression fix: only convert the type if we
2131         the type is different, fixes System.Drawing build.
2132
2133 2004-04-27  Martin Baulig  <martin@ximian.com>
2134
2135         * attribute.cs (Attribute.Resolve): If we have a constant value
2136         for a named field or property, implicity convert it to the correct
2137         type.
2138
2139 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2140
2141         * statement.cs (Block.Block): Implicit blocks share
2142         'child_variable_names' fields with parent blocks.
2143         (Block.AddChildVariableNames): Remove.
2144         (Block.AddVariable): Mark variable as "used by a child block" in
2145         every surrounding block.
2146         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2147         been used in a child block, complain about violation of "Invariant
2148         meaning in blocks" rule.
2149         * cs-parser.jay (declare_local_variables): Don't use
2150         AddChildVariableNames.
2151         (foreach_statement): Don't create an implicit block: 'foreach'
2152         introduces a scope.
2153
2154 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2155
2156         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2157         converting from 0L to ulong.  Fixes 57522.
2158
2159 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2160
2161         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2162         derived class hides via 'new' keyword field from base class (test-242.cs).
2163         TODO: Handle this in the more general way.
2164         
2165         * class.cs (CheckBase): Ditto.
2166
2167 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2168
2169         * decl.cs (caching_flags): New member for storing cached values
2170         as bit flags.
2171         (MemberCore.Flags): New enum where bit flags for caching_flags
2172         are defined.
2173         (MemberCore.cls_compliance): Moved to caching_flags.
2174         (DeclSpace.Created): Moved to caching_flags.
2175
2176         * class.cs: Use caching_flags instead of DeclSpace.Created
2177         
2178 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2179
2180         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2181         if we are only a derived class, not a nested class.
2182
2183         * typemanager.cs: Same as above, but do this at the MemberLookup
2184         level (used by field and methods, properties are handled in
2185         PropertyExpr).   Allow for the qualified access if we are a nested
2186         method. 
2187
2188 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2189
2190         * class.cs: Refactoring.
2191         (IMethodData): New inteface; Holds links to parent members
2192         to avoid member duplication (reduced memory allocation).
2193         (Method): Implemented IMethodData interface.
2194         (PropertyBase): New inner classes for get/set methods.
2195         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2196         (Event): New inner classes for add/remove methods.
2197         (Event.DelegateMethod): Implemented IMethodData interface.
2198
2199         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2200         EmitContext (related to class.cs refactoring).
2201
2202 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2203
2204         * delegate.cs (Delegate.VerifyApplicability): If the number of
2205         arguments are the same as the number of parameters, first try to
2206         verify applicability ignoring  any 'params' modifier on the last
2207         parameter.
2208         Fixes #56442.
2209
2210 2004-04-08  Martin Baulig  <martin@ximian.com>
2211
2212         Merged latest changes into gmcs.  Please keep this comment in
2213         here, it makes it easier for me to see what changed in MCS since
2214         the last time I merged.
2215
2216 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2217
2218         * class.cs (TypeContainer.AddIndexer): Use
2219         'ExplicitInterfaceName' to determine if interface name was
2220         explicitly specified.  'InterfaceType' is not initialized at this time.
2221         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2222         Indexers array is already in the required order.  Initialize
2223         'IndexerName' only if there are normal indexers.
2224         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2225         (TypeContainer.Emit): Emit DefaultMember attribute only if
2226         IndexerName is initialized.
2227         Fixes #56300.
2228
2229 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2230
2231         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2232         Fixes #57007
2233
2234 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2235
2236         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2237         attributes.
2238         Fix for #56456.
2239
2240         * attribute.cs (Attribute.Resolve): Check for duplicate named
2241         attributes.
2242         Fix for #56463.
2243
2244 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2245
2246         * iterators.cs (MarkYield): track whether we are in an exception,
2247         and generate code accordingly.  Use a temporary value to store the
2248         result for our state.
2249
2250         I had ignored a bit the interaction of try/catch with iterators
2251         since their behavior was not entirely obvious, but now it is
2252         possible to verify that our behavior is the same as MS .NET 2.0
2253
2254         Fixes 54814
2255
2256 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2257
2258         * iterators.cs: Avoid creating temporaries if there is no work to
2259         do. 
2260
2261         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2262         Enumerations, use TypeManager.EnumToUnderlying and call
2263         recursively. 
2264
2265         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2266         bug #57013
2267
2268         (This.Emit): Use EmitContext.EmitThis to emit our
2269         instance variable.
2270
2271         (This.EmitAssign): Ditto.
2272
2273         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2274         codepaths, we will move all the functionality into
2275         Mono.CSharp.This 
2276
2277         (FieldExpr.EmitAssign): Ditto.
2278
2279         This fixes several hidden bugs that I uncovered while doing a code
2280         review of this today.
2281
2282         * codegen.cs (EmitThis): reworked so the semantics are more clear
2283         and also support value types "this" instances.
2284
2285         * iterators.cs: Changed so that for iterators in value types, we
2286         do not pass the value type as a parameter.  
2287
2288         Initialization of the enumerator helpers is now done in the caller
2289         instead of passing the parameters to the constructors and having
2290         the constructor set the fields.
2291
2292         The fields have now `assembly' visibility instead of private.
2293
2294 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2295
2296         * expression.cs (Argument.Resolve): Check if fields passed as ref
2297         or out are contained in a MarshalByRefObject.
2298
2299         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2300         another compiler type.
2301
2302 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2303
2304         * class.cs (Indexer.Define): use the new name checking method.
2305         Also, return false on an error.
2306         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2307         (is_identifier_[start/part]_character): make static.
2308
2309 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2310
2311         * expression.cs (Binary.ResolveOperator): Do no append strings
2312         twice: since we can be invoked more than once (array evaluation)
2313         on the same concatenation, take care of this here.  Based on a fix
2314         from Ben (bug #56454)
2315
2316 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2317
2318         * codegen.cs: Fix another case where CS1548 must be reported (when 
2319         delay-sign isn't specified and no private is available #56564). Fix
2320         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2321         error when MCS is used on the MS runtime and we need to delay-sign 
2322         (which seems unsupported by AssemblyBuilder - see #56621).
2323
2324 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2325
2326         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2327         (TypeManager.ComputeNamespaces): Faster implementation for
2328         Microsoft runtime.
2329
2330         * compiler.csproj: Updated AssemblyName to mcs.
2331
2332 2004-05-11  Jackson Harper  <jackson@ximian.com>
2333
2334         * Makefile: Preserve MONO_PATH
2335         
2336 2004-05-11  Jackson Harper  <jackson@ximian.com>
2337
2338         * Makefile: Use mono and mcs to build gmcs
2339         
2340 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
2341
2342         * codegen.cs: Add patch from Robert Shade
2343         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
2344         sync with mcs.
2345
2346 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
2347
2348         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2349         incomplete key pairs (#57941).
2350
2351 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2352
2353         * codegen.cs: Fix another case where CS1548 must be reported (when 
2354         delay-sign isn't specified and no private is available #56564). Fix
2355         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2356         error when MCS is used on the MS runtime and we need to delay-sign 
2357         (which seems unsupported by AssemblyBuilder - see #56621).
2358
2359 2004-04-29  Jackson Harper  <jackson@ximian.com>
2360
2361         * Makefile: Set MONO_PATH to use the bootstrap corlib
2362         * driver.cs: Check the GAC for referenced assemblies.
2363                 
2364 2004-04-29  Martin Baulig  <martin@ximian.com>
2365
2366         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
2367
2368 2004-04-07  Martin Baulig  <martin@ximian.com>
2369
2370         * expression.cs (Binary.ResolveOperator): Added special case for
2371         Equality/Inequality between a type parameter and a null literal.
2372
2373 2004-04-07  Martin Baulig  <martin@ximian.com>
2374
2375         * convert.cs: Check null literal -> type parameter conversions.
2376
2377 2004-04-07  Martin Baulig  <martin@ximian.com>
2378
2379         * generic.cs (ConstructedType.CheckConstraints): Enforce the
2380         `class' and `struct' constraints.
2381
2382 2004-04-07  Martin Baulig  <martin@ximian.com>
2383
2384         * generic.cs (SpecialConstraint): New public enum.
2385         (Constraints.Resolve): Added support for the `class' and `struct'
2386         constraints.
2387
2388         * cs-parser.jay (type_parameter_constraint): Added support for the
2389         `class' and `struct' constraints.
2390
2391 2004-04-07  Martin Baulig  <martin@ximian.com>
2392
2393         * support.cs (GenericConstraints): Replaced `Types' by
2394         `ClassConstraint' and `InterfaceConstraints'; added
2395         `HasClassConstraint'.   
2396
2397 2004-04-07  Martin Baulig  <martin@ximian.com>
2398
2399         * generic.cs
2400         (Constraints.InterfaceConstraints): New public property.
2401         (Constraints.Types): Make this property public
2402         (TypeParameter): Implement IMemberContainer.
2403         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
2404         instead of a TypeBuilder/MethodBuilder; pass the interface
2405         constraints to TypeManager.AddTypeParameter().
2406         (TypeParameter.DefineType): Just take an EmitContext and no
2407         TypeBuilder/MethodBuilder.  Use the new public API.
2408
2409         * typemanager.cs (TypeManager.AddTypeParameter): Added
2410         `TypeExpr[]' argument; add the interfaces to the
2411         `builder_to_ifaces' hash.
2412         (TypeManager.LookupMemberContainer): For
2413         GenericTypeParameterBuilders, get the TypeParameter from the
2414         `builder_to_type_param'.
2415         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
2416         the TypeParameter and call FindMembers on it.
2417
2418 2004-04-07  Martin Baulig  <martin@ximian.com>
2419
2420         * class.cs
2421         (MethodCore.GenericMethod): Moved this field here from Method.
2422         (MethodCore.IsDuplicateImplementation): Take the number of type
2423         parameters into account if we're a generic method.
2424
2425         * expression.cs (Invocation.InferTypeArguments): Don't return true
2426         if `arguments' is null; we still need to check whether we actually
2427         don't need to infer anything in this case.
2428         (MemberAccess): Merged the functionality from GenericMemberAccess
2429         into this class.
2430
2431         * generic.cs (GenericMemberAccess): Removed.
2432
2433 2004-04-05  Martin Baulig  <martin@ximian.com>
2434
2435         * decl.cs (MemberCore): For generic classes, interfaces and
2436         structs, `Name' now includes the number of type parameters
2437         ("Stack!1.Node!1").
2438         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
2439         encode the number of type arguments in the type name.
2440
2441         * expression.cs (Expression.MemberLookup): Removed the
2442         `num_type_args' argument; we now encode the number of type
2443         arguments in the type name.
2444
2445         * ecore.cs (SimpleName): Encode the number of type arguments in
2446         the type name itself.
2447
2448         * generic.cs (ConstructedType): Likewise.
2449
2450         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
2451         `MemberName'; we now include the number of type parameters in the
2452         type name.
2453
2454         * typemanager.cs (TypeManager.CheckGeneric): Removed.
2455         (TypeManager.MemberLookup): Removed the
2456         `num_type_args' argument; we now encode the number of type
2457         arguments in the type name.     
2458
2459 2004-04-03  Martin Baulig  <martin@ximian.com>
2460
2461         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
2462         (MemberCore.MemberName): Moved here from MemberBase.
2463         (DeclSpace.SetParameterInfo): Just take the constraints as an
2464         ArrayList; we already have the type parameters in our
2465         `MemberName'; also do the CS0080 reporting here.
2466
2467         * cs-parser.jay (struct_declaration): Use `member_name' instead of
2468         `IDENTIFIER opt_type_parameter_list'; when constructing our
2469         `MemberName', it'll already include our type parameters.
2470         (class_declaration, interface_declaration): Likewise.
2471         (delegate_declaration): Likewise.
2472         (MakeName): Take a MemberName and return a MemberName.
2473         The following two changes are required to avoid shift/reduce conflicts:
2474         (member_name): Don't include a TypeName anymore; ie. this is now
2475         just 'IDENTIFIER opt_type_parameter_list'.
2476         (property_declaration, event_declaration): Use a
2477         `namespace_or_type_name' instead of a `member_name'.            
2478
2479 2004-04-03  Martin Baulig  <martin@ximian.com>
2480
2481         * decl.cs (MemberName): Renamed to `TypeName' and created a new
2482         `MemberName' class.
2483         (TypeName): Formerly known as MemberName.
2484
2485         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
2486         instead of a `MemberName'.
2487
2488         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
2489         (member_name): New rule; create a MemberName.
2490
2491 2004-04-02  Martin Baulig  <martin@ximian.com>
2492
2493         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
2494         (CS0305 and CS0308).
2495
2496 2004-04-02  Martin Baulig  <martin@ximian.com>
2497
2498         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
2499         support for nested types.
2500
2501 2004-04-02  Martin Baulig  <martin@ximian.com>
2502
2503         * ecore.cs (IAlias): New public interface.
2504         (TypeExpr, TypeExpression): Implement IAlias.
2505         (TypeAliasExpression): New public class.
2506
2507         * namespace.cs (Namespace): Implement IAlias.
2508         (Namespace.Lookup): Return an IAlias instead on an object.
2509         (Namespace.DefineName): Take an IAlias instead of an object.
2510         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
2511         an object.
2512         (NamespaceEntry.UsingAlias): Take a Membername instead of an
2513         Expression.
2514         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
2515         object.
2516         (NamespaceEntry.Lookup): Likewise.
2517
2518         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
2519         instead of a Type.      
2520
2521         * decl.cs (DeclSpace): Implement IAlias.
2522         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
2523
2524         * generic.cs (ConstructedType): Improved error checking.
2525
2526 2004-04-02  Martin Baulig  <martin@ximian.com>
2527
2528         * convert.cs: Added type parameter conversions.
2529
2530         * ecore.cs
2531         (UnboxCast.Emit): Emit an `unbox.any' for type params.
2532         (ClassCast.Emit): If the source type is a type parameter, box it.
2533         If the target type is a type parameter, emit an `unbox.any'
2534         instead of a `classcast'.1      
2535
2536 2004-04-01  Martin Baulig  <martin@ximian.com>
2537
2538         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
2539
2540 2004-04-01  Martin Baulig  <martin@ximian.com>
2541
2542         * generic.cs (ConstructedType.CheckConstraints): Use
2543         Convert.ImplicitStandardConversionExists(); user-defined implicit
2544         conversions are not allowed according to the spec.
2545
2546 2004-03-30  Martin Baulig  <martin@ximian.com>
2547
2548         * expression.cs (New): Added support for type parameters.
2549
2550         * typemanager.cs
2551         (TypeManager.activator_type): New public static field.
2552         (TypeManager.activator_create_instance): Likewise.
2553
2554 2004-03-30  Martin Baulig  <martin@ximian.com>
2555
2556         * typemanager.cs (TypeManager.HasConstructorConstraint): New
2557         public method.
2558
2559 2004-03-30  Martin Baulig  <martin@ximian.com>
2560
2561         * generic.cs (ConstructedType.CheckConstraints): Actually follow
2562         the spec here: the argument type must be convertible to the
2563         constraints.
2564
2565 2004-03-30  Martin Baulig  <martin@ximian.com>
2566
2567         * generic.cs
2568         (TypeParameter.Define, TypeParameter.DefineMethod): Call
2569         TypeManager.AddTypeParameter().
2570         (ConstructedType.CheckConstraints): Re-enable this and actually
2571         check whether we have a constructor constraint.
2572
2573         * typemanager.cs
2574         (TypeManager.builder_to_type_param): New static field.
2575         (TypeManager.AddTypeParameter): New static method.
2576         (TypeManager.LookupTypeParameter): New public method.
2577
2578 2004-03-30  Martin Baulig  <martin@ximian.com>
2579
2580         * generic.cs (TypeParameter.DefineType): Return a boolean and use
2581         the new API to actually define the constructor constraint.
2582
2583         * typemanager.cs
2584         (TypeManager.new_constraint_attr_type): New static field.
2585         (TypeManager.InitCoreTypes): Initialize it.
2586
2587 2004-03-30  Martin Baulig  <martin@ximian.com>
2588
2589         * generic.cs (Constraints): Completed error checking, use correct
2590         error numbers.
2591
2592 2004-03-29  Martin Baulig  <martin@ximian.com>
2593
2594         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
2595
2596         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2597         public version which takes a `ParameterData pd' instead of an
2598         `ArrayList args'.
2599
2600 2004-03-29  Martin Baulig  <martin@ximian.com>
2601
2602         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
2603         not a MethodInfo.       
2604
2605 2004-03-29  Martin Baulig  <martin@ximian.com>
2606
2607         * expression.cs (Argument.ResolveMethodGroup): If we're a
2608         ConstructedType, call GetMemberAccess() on it.  
2609
2610 2004-03-29  Martin Baulig  <martin@ximian.com>
2611
2612         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
2613         (MethodCore.CheckGenericOverride): When overriding a generic
2614         method, check whether the constraints match.
2615
2616         * support.cs (GenericConstraints): New public interface.
2617         (ParameterData.GenericConstraints): New public method.
2618
2619         * parameter.cs (Parameter.Resolve): Check whether we're a generic
2620         method parameter and compute our constraints if appropriate.
2621         (Parameter.GenericConstraints): New public property.
2622
2623         * generic.cs (Constraints): Implement GenericConstraints.
2624
2625 2004-03-29  Martin Baulig  <martin@ximian.com>
2626
2627         * decl.cs (MemberCache.FindMemberToOverride): Use
2628         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
2629
2630 2004-03-29  Martin Baulig  <martin@ximian.com>
2631
2632         * generic.cs (GenericMethod.Define): Resolve our type parameters.
2633
2634 2004-03-29  Martin Baulig  <martin@ximian.com>
2635
2636         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
2637         not allowed on non-generic declarations").
2638
2639 2004-03-29  Martin Baulig  <martin@ximian.com>
2640
2641         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2642         public version of this method.
2643
2644         * class.cs (MethodCore.IsDuplicateImplementation): Use
2645         Invocation.InferTypeArguments() to check this.
2646
2647 2004-03-29  Martin Baulig  <martin@ximian.com>
2648
2649         * convert.cs: Use TypeManager.IsDelegateType() instead of
2650         comparing types correctly.
2651
2652 2004-03-29  Martin Baulig  <martin@ximian.com>
2653
2654         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
2655         types directly to make it work for generic instances.
2656
2657         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
2658
2659 2004-03-29  Martin Baulig  <martin@ximian.com>
2660
2661         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
2662         support for arrays.     
2663
2664 2004-03-24  Martin Baulig  <martin@ximian.com>
2665
2666         * decl.cs (DeclSpace.FindType): Also use
2667         TypeManager.CheckGeneric() for types from the using clauses.
2668
2669 2004-03-23  Martin Baulig  <martin@ximian.com>
2670
2671         * expression.cs (Invocation.OverloadResolve): Added `bool
2672         may_fail' argument and use it instead of the Location.IsNull() hack.
2673
2674 2004-03-23  Martin Baulig  <martin@ximian.com>
2675
2676         * expression.cs (Invocation.InferType): Use correct type inference
2677         rules here.     
2678
2679 2004-03-23  Martin Baulig  <martin@ximian.com>
2680
2681         * ecore.cs (MethodGroupExpr.Name): Use
2682         TypeManager.CSharpSignature() instead of just the name.
2683
2684         * expression.cs (Invocation.OverloadResolve): Provide better error
2685         reporting.
2686         (Invocation.DoResolve): OverloadResolve() never returns null
2687         without reporting an error, so removed the error -6 reporting here.
2688
2689 2004-03-23  Martin Baulig  <martin@ximian.com>
2690
2691         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
2692         generic methods.
2693
2694         * cs-parser.jay (delegate_declaration): Support generic delegates.
2695
2696         * delegate.cs: Support generic delegates.
2697
2698 2004-03-22  Martin Baulig  <martin@ximian.com>
2699
2700         * expression.cs (Invocation.InferParamsTypeArguments): New static
2701         method; does type inference for params arguments.
2702
2703 2004-03-21  Martin Baulig  <martin@ximian.com>
2704
2705         * typemanager.cs (TypeManager.IsGenericMethod): New public static
2706         method; checks whether a method is a generic method.    
2707
2708         * expression.cs (Invocation.InferTypeArguments): New static method;
2709         infer type arguments for generic method invocation.
2710
2711         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
2712         property; we set this to true if we're resolving a generic method
2713         invocation and the user specified type arguments, ie. we're not
2714         doing type inference.
2715
2716 2004-03-20  Martin Baulig  <martin@ximian.com>
2717
2718         * class.cs (MethodData.DeclaringType): New public property.
2719         (MethodData.Define): Set DeclaringType here.
2720         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
2721         instead of OperatorMethodBuilder.DeclaringType.
2722
2723 2004-03-20  Martin Baulig  <martin@ximian.com>
2724
2725         * cs-tokenizer.cs (xtoken): Return a special
2726         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
2727
2728         * cs-parser.jay (default_value_expression): Switch to the new
2729         syntax (14.5.13).
2730
2731 2004-03-19  Martin Baulig  <martin@ximian.com>
2732
2733         * decl.cs (MemberName): New class.  We use this to "construct"
2734         namespace_or_type_name's.
2735
2736         * generics.cs (TypeArguments.GetDeclarations): New public method;
2737         returns the type arguments as a string[] and reports a CS0081 if
2738         one of them is not an identifier.
2739
2740         * class.cs (MemberBase): The .ctor now takes the name as a
2741         MemberName instead of a string.
2742         (MemberBase.ExplicitInterfaceName): Changed type from string to
2743         Expression.
2744         (MemberBase.DoDefine): If we're an explicit implementation, the
2745         InterfaceType may be a generic instance.
2746
2747         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
2748         (namespace_name): Call MemberName.GetName () to transform the
2749         MemberName into a string and ensure we don't have any type
2750         arguments.
2751         (type_name): Call MemberName.GetTypeExpression() to transfrom the
2752         MemberName into an expression.
2753         (method_header): Use namespace_or_type_name instead of member_name.     
2754
2755 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2756
2757         * rootcontext.cs: Add new types to the boot resolution.
2758
2759         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2760         MulticastDelegate is not allowed.
2761
2762         * typemanager.cs: Add new types to lookup: System.TypedReference
2763         and ArgIterator.
2764
2765         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2766         check for TypedReference or ArgIterator, they are not allowed. 
2767
2768         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2769         makes us properly catch 1510 in some conditions (see bug 56016 for
2770         details). 
2771
2772 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2773
2774         * CryptoConvert.cs: update from corlib version
2775         with endian fixes.
2776
2777 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2778
2779         * class.cs (Indexer.Define): Check indexername declaration
2780
2781 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2782
2783         * attribute.cs (IsClsCompliant): Fixed problem with handling
2784         all three states (compliant, not-compliant, undetected).
2785
2786 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2787
2788         * attribute.cs (Attribute): Location is now public.
2789         (Resolve): Store resolved arguments (pos_values) in attribute class.
2790         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2791         (GetClsCompliantAttributeValue): New method that gets
2792         CLSCompliantAttribute value.
2793         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2794         if exists else null.
2795         (AttributeTester): New class for CLS-Compliant verification routines.
2796
2797         * class.cs (Emit): Add CLS-Compliant verification.
2798         (Method.GetSignatureForError): Implemented.
2799         (Constructor.GetSignatureForError): Implemented
2800         (Constructor.HasCompliantArgs): Returns if constructor has
2801         CLS-Compliant arguments.
2802         (Constructor.Emit): Override.
2803         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2804         is needed to test only parameters.
2805         (FieldBase.GetSignatureForError): Implemented.
2806         (TypeContainer): New member for storing base interfaces.
2807         (TypeContainer.FindMembers): Search in base interfaces too.
2808
2809         * codegen.cs (GetClsComplianceAttribute): New method that gets
2810         assembly or module CLSCompliantAttribute value.
2811         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2812         for assembly.
2813         (ModuleClass.Emit): Add error 3012 test.
2814
2815         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2816
2817         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2818         state for all decl types.
2819         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2820         if CLS-Compliant tests are required.
2821         (IsClsCompliaceRequired): New method. Analyze whether code
2822         must be CLS-Compliant.
2823         (IsExposedFromAssembly): New method. Returns true when MemberCore
2824         is exposed from assembly.
2825         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2826         value or gets cached value.
2827         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2828         is explicitly marked with CLSCompliantAttribute.
2829         (IsIdentifierClsCompliant): New abstract method. This method is
2830         used to testing error 3005.
2831         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2832         for identifier and parameters CLS-Compliant testing.
2833         (VerifyClsCompliance): New method. The main virtual method for
2834         CLS-Compliant verifications.
2835         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2836         null. I don't know why is null (too many public members !).
2837         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2838         and get value of first CLSCompliantAttribute that found.
2839
2840         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2841         (VerifyClsCompliance): Override and add extra tests.
2842
2843         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2844         clscheck- disable CLS-Compliant verification event if assembly is has
2845         CLSCompliantAttribute(true).
2846
2847         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2848         ApllyAttribute is now called in emit section as in the other cases.
2849         Possible future Emit integration.
2850         (IsIdentifierClsCompliant): New override.
2851         (VerifyClsCompliance): New override.
2852         (GetEnumeratorName): Returns full enum name.
2853
2854         * parameter.cs (GetSignatureForError): Implemented.
2855
2856         * report.cs (WarningData): New struct for Warning message information.
2857         (LocationOfPreviousError): New method.
2858         (Warning): New method. Reports warning based on the warning table.
2859         (Error_T): New method. Reports error based on the error table.
2860
2861         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2862         verifications are done here.
2863
2864         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2865
2866         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2867         CLSCompliantAttribute.
2868         (all_imported_types): New member holds all imported types from other
2869         assemblies.
2870         (LoadAllImportedTypes): New method fills static table with exported types
2871         from all referenced assemblies.
2872         (Modules): New property returns all assembly modules.
2873
2874 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2875
2876         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2877         throwing a parser error.
2878
2879         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2880         which removes the hardcoded get_/set_ prefixes for properties, as
2881         IL allows for the properties to be named something else.  
2882
2883         Bug #56013
2884
2885         * expression.cs: Do not override operand before we know if it is
2886         non-null.  Fix 56207
2887
2888 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2889
2890         * typemanager.cs: support for pinned variables.
2891
2892 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2893
2894         * decl.cs, typemanager.cs: Avoid using an arraylist
2895         as a buffer if there is only one result set.
2896
2897 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2898
2899         * expression.cs: Make sure you cant call a static method
2900         with an instance expression, bug #56174.
2901
2902 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
2903
2904         * class.cs (IsDuplicateImplementation): Improve error reporting to
2905         flag 663 (method only differs in parameter modifier).
2906
2907         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
2908         in preprocessor directives.
2909
2910         * location.cs (LookupFile): Allow for the empty path.
2911
2912         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
2913         better approach for some of that patch, but its failing with the
2914         CharSet enumeration.  For now try/catch will do.
2915
2916         * typemanager.cs: Do not crash if a struct does not have fields.
2917         Fixes 56150.
2918
2919 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2920
2921         * expression.cs: cs0213, cant fix a fixed expression.
2922         fixes 50231.
2923
2924 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2925
2926         * cs-parser.jay: detect invalid embeded statements gracefully.
2927         bug #51113.
2928
2929 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2930
2931         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
2932         As a regex:
2933         s/
2934         the invocation type may not be a subclass of the tye of the item/
2935         The type of the item must be a subclass of the invocation item.
2936         /g
2937
2938         Fixes bug #50820.
2939
2940 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
2941
2942         * attribute.cs: Added methods to get a string and a bool from an
2943         attribute. Required to information from AssemblyKeyFileAttribute,
2944         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
2945         * codegen.cs: Modified AssemblyName creation to include support for
2946         strongnames. Catch additional exceptions to report them as CS1548.
2947         * compiler.csproj: Updated include CryptoConvert.cs.
2948         * compiler.csproj.user: Removed file - user specific configuration.
2949         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
2950         Mono.Security assembly. The original class is maintained and tested in
2951         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
2952         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
2953         like CSC 8.0 (C# v2) supports.
2954         * Makefile: Added CryptoConvert.cs to mcs sources.
2955         * rootcontext.cs: Added new options for strongnames.
2956
2957 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
2958
2959         * driver.cs: For --expect-error, report error code `2'
2960         if the program compiled with no errors, error code `1' if
2961         it compiled with an error other than the one expected.
2962
2963 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
2964
2965         * compiler.csproj: Updated for Visual Studio .NET 2003.
2966         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
2967         * compiler.sln: Updated for Visual Studio .NET 2003.
2968
2969 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
2970
2971         * expression.cs: Fix bug #47234. We basically need to apply the
2972         rule that we prefer the conversion of null to a reference type
2973         when faced with a conversion to 'object' (csc behaviour).
2974
2975 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2976
2977         * statement.cs: Shorter form for foreach, eliminates
2978         a local variable. r=Martin.
2979
2980 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2981
2982         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
2983         checks if we can use brtrue/brfalse to test for 0.
2984         * expression.cs: use the above in the test for using brtrue/brfalse.
2985         cleanup code a bit.
2986
2987 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2988
2989         * expression.cs: Rewrite string concat stuff. Benefits:
2990
2991         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
2992         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
2993         rather than a concat chain.
2994
2995         * typemanager.cs: Add lookups for more concat overloads.
2996
2997 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2998
2999         * expression.cs: Emit shorter il code for array init.
3000
3001         newarr
3002         dup
3003         // set 1
3004
3005         // set 2
3006
3007         newarr
3008         stloc.x
3009
3010         ldloc.x
3011         // set 1
3012
3013         ldloc.x
3014         // set 2
3015
3016 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3017
3018         * statement.cs: Before, two switch blocks would be merged if the
3019         total size of the blocks (end_item - begin_item + 1) was less than
3020         two times the combined sizes of the blocks.
3021
3022         Now, it will only merge if after the merge at least half of the
3023         slots are filled.
3024
3025         fixes 55885.
3026
3027 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3028
3029         * class.cs : csc build fix for GetMethods(). See bug #52503.
3030
3031 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3032
3033         * expression.cs: Make sure fp comparisons work with NaN.
3034         This fixes bug #54303. Mig approved this patch a long
3035         time ago, but we were not able to test b/c the runtime
3036         had a related bug.
3037
3038 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3039
3040         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3041
3042 2004-03-19  Martin Baulig  <martin@ximian.com>
3043
3044         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
3045         two overloads may unify for some type parameter substitutions and
3046         report a CS0408 if appropriate.
3047
3048 2004-03-19  Martin Baulig  <martin@ximian.com>
3049
3050         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3051         error here and not in our caller.
3052
3053 2004-03-19  Martin Baulig  <martin@ximian.com>
3054
3055         * interface.cs: Completely killed this file.
3056         (Interface): We're now a TypeContainer and live in class.cs.
3057
3058         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3059         argument; we're now also called for interfaces.
3060         (TypeContainer.DefineMembers): Allow this method being called
3061         multiple times.
3062         (TypeContainer.GetMethods): New public method; formerly known as
3063         Interface.GetMethod().  This is used by PendingImplementation.
3064         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3065         it's now private and non-static.
3066         (Interface): Moved this here; it's now implemented similar to
3067         Class and Struct.
3068         (Method, Property, Event, Indexer): Added `bool is_interface'
3069         argument to their .ctor's.
3070         (MemberBase.IsInterface): New public field.
3071
3072         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3073         instances instead of InterfaceMethod, InterfaceProperty, etc.
3074         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3075         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3076
3077 2004-03-19  Martin Baulig  <martin@ximian.com>
3078
3079         * class.cs (MethodCore.IsDuplicateImplementation): New private
3080         method which does the CS0111 checking.
3081         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3082         Use IsDuplicateImplementation().
3083
3084 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3085
3086         * decl.cs (FindMemberToOverride): New method to find the correct
3087         method or property to override in the base class.
3088         * class.cs
3089             - Make Method/Property use the above method to find the
3090               version in the base class.
3091             - Remove the InheritableMemberSignatureCompare as it is now
3092               dead code.
3093
3094         This patch makes large code bases much faster to compile, as it is
3095         O(n) rather than O(n^2) to do this validation.
3096
3097         Also, it fixes bug 52458 which is that nested classes are not
3098         taken into account when finding the base class member.
3099
3100         Reviewed/Approved by Martin.
3101
3102 2004-03-17  Martin Baulig  <martin@ximian.com>
3103
3104         * expression.cs (MemberAccess.DoResolve): Take the parent's number
3105         of type arguments into account; use the `real_num_type_args'
3106         approach like in DoResolveAsTypeStep().
3107
3108         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
3109         nested types.
3110
3111 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3112
3113         * interface.cs: In all interface classes removed redundant
3114         member initialization.
3115
3116 2004-03-16  Martin Baulig  <martin@ximian.com>
3117
3118         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3119
3120 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3121
3122         * decl.cs (DefineTypeAndParents): New helper method to define a
3123         type's containers before the type itself is defined;  This is a
3124         bug exposed by the recent changes to Windows.Forms when an
3125         implemented interface was defined inside a class that had not been
3126         built yet.   
3127
3128         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3129
3130         (Check): Loop correctly to report errors modifiers
3131         (UNSAFE was not in the loop, since it was the same as TOP).
3132
3133         * interface.cs: Every interface member now takes a ModFlags,
3134         instead of a "is_new" bool, which we set on the base MemberCore. 
3135
3136         Every place where we called "UnsafeOk" in the interface, now we
3137         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3138         the unsafe settings from the member declaration instead of the
3139         container interface. 
3140
3141         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3142
3143         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3144         `set_indexer_name' to the pending bits (one per type).
3145
3146         We fixed a bug today that was picking the wrong method to
3147         override, since for properties the existing InterfaceMethod code
3148         basically ignored the method name.  Now we make sure that the
3149         method name is one of the valid indexer names.
3150
3151 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
3152  
3153         * support.cs (SeekableStreamReader): Keep track of stream byte
3154         positions and don't mix them with character offsets to the buffer.
3155
3156         Patch from Gustavo Giráldez
3157
3158 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
3159
3160         * interface.cs (InterfaceSetGetBase): Removed double member
3161         initialization, base class does it as well.
3162
3163 2004-03-13  Martin Baulig  <martin@ximian.com>
3164
3165         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3166         when compiling corlib.
3167
3168 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3169
3170         * convert.cs (ExplicitConversion): We were reporting an error on
3171         certain conversions (object_type source to a value type, when the
3172         expression was `null') before we had a chance to pass it through
3173         the user defined conversions.
3174
3175         * driver.cs: Replace / and \ in resource specifications to dots.
3176         Fixes 50752
3177
3178         * class.cs: Add check for duplicate operators.  Fixes 52477
3179
3180 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3181
3182         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3183         that are in the middle of the statements, not only at the end.
3184         Fixes #54987
3185
3186         * class.cs (TypeContainer.AddField): No longer set the
3187         `HaveStaticConstructor' flag, now we call it
3188         `UserDefineStaticConstructor' to diferentiate the slightly
3189         semantic difference.
3190
3191         The situation is that we were not adding BeforeFieldInit (from
3192         Modifiers.TypeAttr) to classes that could have it.
3193         BeforeFieldInit should be set to classes that have no static
3194         constructor. 
3195
3196         See:
3197
3198         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3199
3200         And most importantly Zoltan's comment:
3201
3202         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3203
3204         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3205          before its static fields are used', i.e. initialization does not need
3206          to be triggered by the first access to the type. Setting this flag
3207          helps the JIT to compile better code, since it can run the static
3208          constructor at JIT time, and does not need to generate code to call it
3209          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3210          this flag for lots of classes like String. 
3211          
3212          csc sets this flag if the type does not have an explicit static 
3213          constructor. The reasoning seems to be that if there are only static
3214          initalizers for a type, and no static constructor, then the programmer
3215          does not care when this initialization happens, so beforefieldinit
3216          can be used.
3217          
3218          This bug prevents the AOT compiler from being usable, since it 
3219          generates so many calls to mono_runtime_class_init that the AOT code
3220          is much slower than the JITted code. The JITted code is faster, 
3221          because it does not generate these calls if the vtable is type is
3222          already initialized, which is true in the majority of cases. But the
3223          AOT compiler can't do this."
3224
3225 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3226
3227         * class.cs (MethodData.Emit): Refactor the code so symbolic
3228         information is generated for destructors;  For some reasons we
3229         were taking a code path that did not generate symbolic information
3230         before. 
3231
3232 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3233
3234         * class.cs: Create a Constructor.CheckBase method that
3235         takes care of all validation type code. The method
3236         contains some code that was moved from Define.
3237
3238         It also includes new code that checks for duplicate ctors.
3239         This fixes bug #55148.
3240
3241 2004-03-09  Joshua Tauberer <tauberer@for.net>
3242
3243         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3244         a { ... }-style array creation invokes EmitStaticInitializers
3245         which is not good for reference-type arrays.  String, decimal
3246         and now null constants (NullCast) are not counted toward
3247         static initializers.
3248
3249 2004-03-05  Martin Baulig  <martin@ximian.com>
3250
3251         * location.cs (SourceFile.HasLineDirective): New public field;
3252         specifies whether the file contains or is referenced by a "#line"
3253         directive.
3254         (Location.DefineSymbolDocuments): Ignore source files which
3255         either contain or are referenced by a "#line" directive.        
3256
3257 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3258
3259         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3260         direct access to our parent, so check the method inline there.
3261
3262 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3263
3264         * expression.cs (Invocation.EmitCall): Miguel's last commit
3265         caused a regression. If you had:
3266
3267             T t = null;
3268             t.Foo ();
3269
3270         In Foo the implict this would be null.
3271
3272 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3273
3274         * expression.cs (Invocation.EmitCall): If the method is not
3275         virtual, do not emit a CallVirt to it, use Call.
3276
3277         * typemanager.cs (GetFullNameSignature): Improve the method to
3278         cope with ".ctor" and replace it with the type name.
3279
3280         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3281         as an argument the ConstructorBuilder where it is being defined,
3282         to catch the recursive constructor invocations.
3283
3284 2004-03-16  Martin Baulig  <martin@ximian.com>
3285
3286         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
3287         ConstructedType, call ResolveType() on it to get the type rather
3288         than just using `expr.Type'.
3289
3290 2004-03-16  Martin Baulig  <martin@ximian.com>
3291
3292         * generics.cs (ConstructedType.GetMemberAccess): Take the
3293         EmitContext instead on the TypeExpr and use
3294         ec.TypeContainer.CurrentType/ec.ContainerType.
3295
3296 2004-03-16  Martin Baulig  <martin@ximian.com>
3297
3298         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
3299         parameters before aliases.
3300
3301 2004-03-16  Martin Baulig  <martin@ximian.com>
3302
3303         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
3304         New oublic function; checks whether two generic instances may become
3305         equal under some instantiations (26.3.1).
3306
3307         * class.cs (TypeContainer.Define): Call
3308         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
3309         error.
3310
3311 2004-03-16  Martin Baulig  <martin@ximian.com>
3312
3313         * class.cs (TypeContainer.GetClassBases): Moved
3314         Error_TypeParameterAsBase() here and also check whether the base
3315         class is not an attribute.
3316
3317 2004-03-16  Martin Baulig  <martin@ximian.com>
3318
3319         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3320
3321 2004-03-16  Martin Baulig  <martin@ximian.com>
3322
3323         * class.cs (Error_TypeParameterAsBase): Use correct error number
3324         here (CS0689).  
3325
3326 2004-03-16  Martin Baulig  <martin@ximian.com>
3327
3328         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
3329         for generics.
3330
3331         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
3332         error reporting.
3333
3334 2004-03-15  Martin Baulig  <martin@ximian.com>
3335
3336         * typemanager.cs (TypeManager.GetFullName): New public method.
3337         (TypeManager.MemberLookup): Added `int_num_type_arguments'
3338         argument; only return members with the correct number of type
3339         arguments.
3340         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
3341         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
3342         whether the number of type arguments matches.
3343
3344         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
3345         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
3346
3347         * expression.cs (MemberAccess): Added public `NumTypeArguments'
3348         field; it's set by the protected .ctor when we're actually a
3349         GenericMemberAccess.
3350         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
3351         arguments and pass it to MemberLookupFinal ().
3352
3353         * ecore.cs (Expression.MemberLookup): Added `int
3354         num_type_arguments' argument; only return members with the correct
3355         number of type arguments.
3356         (Expression.MemberLookupFailed): Check whether the MemberLookup
3357         failed because we did not have the correct number of type
3358         arguments; report CS0305 in this case.
3359
3360         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
3361         `e.ResolveAsTypeTerminal()' already did so.
3362
3363 2004-03-15  Martin Baulig  <martin@ximian.com>
3364
3365         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
3366         we're a ConstructedType; in this case, the caller must report an
3367         error (for instance CS0131).
3368
3369         * generic.cs (TypeArguments): Added Location argument to the .ctor.
3370         (TypeArguments.Resolve): Actually report errors here.
3371
3372 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3373
3374         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3375         `set_indexer_name' to the pending bits (one per type).
3376
3377         We fixed a bug today that was picking the wrong method to
3378         override, since for properties the existing InterfaceMethod code
3379         basically ignored the method name.  Now we make sure that the
3380         method name is one of the valid indexer names.
3381
3382 2004-03-15  Martin Baulig  <martin@ximian.com>
3383
3384         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
3385         for generic instances.
3386
3387 2004-03-13  Martin Baulig  <martin@ximian.com>
3388
3389         * class.cs (TypeContainer.DefineType): Call
3390         TypeManager.AddUserType() immediately after creating the
3391         TypeBuilder; pass all type parameters when creating the
3392         CurrentType.
3393
3394         * decl.cs (DeclSpace.FindNestedType): New public method.
3395         (DeclSpace.FindType): Added `int num_type_args' argument; only
3396         return types with the correct number of type parameters.
3397         (DeclSpace.CountTypeParams): New public property.
3398
3399         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
3400         the number of type parameters; defaults to zero.
3401
3402         * generic.cs (TypeArguments.Count): New public property.
3403         (ConstructedType.DoResolveAsTypeStep): First call
3404         ds.FindNestedType() to find out whether we're nested in the
3405         current generic type; in this case, we inherit all type parameters
3406         from the current class.
3407
3408         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
3409         num_type_args' argument.
3410         (RootContext.LookupType): Added overloaded version which takes the
3411         number of type arguments; only return types with the correct
3412         number of type arguments.
3413
3414         * typemanager.cs (TypeManager.CheckGeneric): New public function;
3415         checks whether `Type t' has `int num_type_args'.
3416
3417 2004-03-13  Martin Baulig  <martin@ximian.com>
3418
3419         * generic.cs (GenericMethod.DefineType): New method; calls
3420         DefineType() on all the type parameters.
3421
3422         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
3423         (MethodData.Define): If we're a generic method, call
3424         GenericMethod.DefineType() to define the type parameters.       
3425
3426 2004-03-10  Martin Baulig  <martin@ximian.com>
3427
3428         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
3429         instead of IsAssignableFrom.    
3430
3431 2004-03-10  Martin Baulig  <martin@ximian.com>
3432
3433         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
3434
3435         * support.cs (ParameterData.HasArrayParameter): New property.
3436         (ReflectionParameters.ctor): Take a MethodBase instead of a
3437         ParameterInfo[].  If we have any type parameters, get the generic
3438         method definition and ask it whether we have variable arguments.
3439
3440 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3441
3442         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3443         routines to check if a type is an enumerable/enumerator allow
3444         classes that implement the IEnumerable or IEnumerator interfaces.
3445
3446         * class.cs (Property, Operator): Implement IIteratorContainer, and
3447         implement SetYields.
3448
3449         (Property.Define): Do the block swapping for get_methods in the
3450         context of iterators.   We need to check if Properties also
3451         include indexers or not.
3452
3453         (Operator): Assign the Block before invoking the
3454         OperatorMethod.Define, so we can trigger the Iterator code
3455         replacement. 
3456
3457         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3458         Property and Operator classes are not created when we parse the
3459         declarator but until we have the block completed, so we use a
3460         singleton SimpleIteratorContainer.Simple to flag whether the
3461         SetYields has been invoked.
3462
3463         We propagate this setting then to the Property or the Operator to
3464         allow the `yield' to function.
3465
3466 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3467
3468         * codegen.cs: Implemented attribute support for modules.
3469         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3470         Assembly/Module functionality.
3471
3472         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3473         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3474         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3475
3476 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3477
3478         * interface.cs (FindMembers): The operation is performed on all base
3479         interfaces and not only on the first. It is required for future CLS Compliance patch.
3480
3481 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3482
3483         * statement.cs, codegen.cs:
3484         This patch deals with patterns such as:
3485
3486         public class List : IEnumerable {
3487
3488                 public MyEnumerator GetEnumerator () {
3489                         return new MyEnumerator(this);
3490                 }
3491
3492                 IEnumerator IEnumerable.GetEnumerator () {
3493                         ...
3494                 }
3495                 
3496                 public struct MyEnumerator : IEnumerator {
3497                         ...
3498                 }
3499         }
3500
3501         Before, there were a few things we did wrong:
3502         1) we would emit callvirt on a struct, which is illegal
3503         2) we emited ldarg when we needed to emit ldarga
3504         3) we would mistakenly call the interface methods on an enumerator
3505         type that derived from IEnumerator and was in another assembly. For example:
3506
3507         public class MyEnumerator : IEnumerator
3508
3509         Would have the interface methods called, even if there were public impls of the
3510         method. In a struct, this lead to invalid IL code.
3511
3512 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3513
3514         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3515           renamed to Emit.
3516
3517         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3518
3519 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3520
3521         * cs-parser.jay: Fix small regression: we were not testing V2
3522         compiler features correctly.
3523
3524         * interface.cs: If the emit context is null, then create one
3525
3526 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3527
3528         * decl.cs (GetSignatureForError): New virtual method to get full name
3529           for error messages.
3530
3531         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3532           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3533
3534         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3535           Duplicated members and code in these classes has been removed.
3536           Better encapsulation in these classes.
3537
3538 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3539
3540         * assign.cs (Assign.DoResolve): When dealing with compound
3541         assignments, there is a new rule in ECMA C# 2.4 (might have been
3542         there before, but it is documented here) that states that in:
3543
3544         a op= b;
3545
3546         If b is of type int, and the `op' is a shift-operator, then the
3547         above is evaluated as:
3548
3549         a = (int) a op b 
3550
3551         * expression.cs (Binary.ResolveOperator): Instead of testing for
3552         int/uint/long/ulong, try to implicitly convert to any of those
3553         types and use that in pointer arithmetic.
3554
3555         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3556         method to print information for from the type, not from the
3557         null-method we were given.
3558
3559 2004-02-01  Duncan Mak  <duncan@ximian.com>
3560
3561         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3562         parsing for cmd, fixes bug #53694.
3563
3564 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3565
3566         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3567         in the member name duplication tests. Property and operator name duplication
3568         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3569
3570 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3571
3572         * interface.cs (PopulateMethod): Fixed crash when interface method
3573         returns not existing type (error test cs0246-3.cs).
3574
3575 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3576
3577         * cs-parser.jay (interface_accessors): Re-write actions to also
3578         store attributes attached to get and set methods. Fix spelling
3579         while at it.
3580
3581         (inteface_property_declaration): Modify accordingly.
3582
3583         (InterfaceAccessorInfo): New helper class to store information to pass
3584         around between rules that use interface_accessors.
3585
3586         * interface.cs (Emit): Apply attributes on the get and set
3587         accessors of properties and indexers too.
3588
3589         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3590         right MethodBuilder when applying attributes to the get and set accessors.
3591
3592 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3593
3594         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3595
3596 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3597
3598         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3599
3600 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3601
3602         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3603         changes that treat `yield' specially when present before `break'
3604         or `return' tokens.
3605
3606         * cs-tokenizer.cs: yield is no longer a keyword.
3607
3608 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3609
3610         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3611         setting for default constructors.
3612         For default constructors are almost every time set wrong Modifier. The
3613         generated IL code has been alright. But inside mcs this values was
3614         wrong and this was reason why several of my CLS Compliance tests
3615         failed.
3616
3617 2004-02-27  Martin Baulig  <martin@ximian.com>
3618
3619         * generics.cs (ConstructedType.ResolveType): Make the nested type
3620         stuff actually work.
3621
3622 2004-02-25  Martin Baulig  <martin@ximian.com>
3623
3624         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
3625         property; returns the type parameters just from the current type,
3626         ie. with the ones from outer classes.
3627         (DeclSpace.LookupGeneric): First search in the current class, then
3628         in outer classes.
3629         (DeclSpace.initialize_type_params): When hiding a type parameter
3630         from an outer class, put it into the `type_param_list' anyways.
3631
3632         * expression.cs (MemberAccess.expr): Made this field protected.
3633
3634         * class.cs (TypeContainer.Define): The `CurrentType' just contains
3635         the type parameters from the current class.
3636
3637         * generic.cs (ConstructedType.ResolveType): Support nested generic
3638         types by taking the type parameters which we inherit from outer
3639         classes into account.
3640         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
3641         support for nested generic types.
3642
3643 2004-02-23  Martin Baulig  <martin@ximian.com>
3644
3645         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
3646         field and check whether we're nested inside a generic type.
3647         (DeclSpace.ResolveType): If we're resolving to a generic type
3648         definition, create a ConstructedType and return its resolved type.
3649         (DeclSpace.initialize_type_params): New private method;
3650         initializes the `type_param_list' field from the type parameters
3651         from this and all enclosing classes.
3652         (DeclSpace.TypeParameters): Call initialize_type_params() unless
3653         we're already initialized.
3654
3655 2004-02-23  Martin Baulig  <martin@ximian.com>
3656
3657         * class.cs (Method.Define): Create the generic method before
3658         calling DoDefine().
3659         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
3660         the TypeContainer one); we use this for generic methods.
3661
3662         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
3663         parent's TypeBuilder.
3664
3665 2004-02-18  Martin Baulig  <martin@ximian.com>
3666
3667         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
3668         to check for equality.
3669
3670 2004-02-05  Martin Baulig  <martin@ximian.com>
3671
3672         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
3673         `ec.TypeContainer.CurrentType', use it instead of
3674         `ec.ContainerType' to check whether we're in the type's ctor.
3675
3676 2004-01-29  Martin Baulig  <martin@ximian.com>
3677
3678         * expression.cs (Invocation.DoResolve): If we're a
3679         `ConstructedType', then we're actually a generic method, so
3680         rewrite the expr as a GenericMemberAccess.
3681
3682         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
3683         here; manually parse it into a string.
3684
3685 2004-01-28  Martin Baulig  <martin@ximian.com>
3686
3687         * typemanager.cs (TypeManager.IsEqual): New static method.
3688         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
3689         check for equality instead of using `=='.
3690
3691 2004-01-26  Martin Baulig  <martin@ximian.com>
3692
3693         * decl.cs (DeclSpace.CurrentType): New public field.
3694
3695         * expression.cs (This.ResolveBase): If we have an
3696         `ec.TypeContainer.CurrentType', use it instead of
3697         `ec.ContainerType'.
3698
3699         * class.cs (TypeContainer.DefineType): If we're a generic type,
3700         create the `CurrentType' (unresolved).
3701         (TypeContainer.GenericType): New private field.
3702         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
3703         it and store it in `GenericType' before creating the MemberCache.
3704         (TypeContainer.GetMembers): If we have a `GenericType', call
3705         TypeManager.FindMembers() on it.
3706
3707         * interface.cs (Interface.GenericType): New private field.
3708         (Interface.DefineType): If we're a generic type, create the
3709         `CurrentType' (unresolved).
3710         (Interface.DefineMembers): If we have a `CurrentType', resolve it
3711         and store it in `GenericType' before creating the MemberCache.
3712         (Interface.GetMembers): If we have a `GenericType', call
3713         TypeManager.FindMembers() on it.
3714
3715 2004-01-22  Martin Baulig  <martin@ximian.com>
3716
3717         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3718         not a QualifiedIdentifier.  This is what `type_name_expression'
3719         was previously doing.
3720         (type_name_expression): Removed; the code is now in
3721         `namespace_or_type_name'.
3722         (qualified_identifier): Removed, use `namespace_or_type_name'
3723         instead.
3724         (QualifiedIdentifier): Removed this class.      
3725
3726 2004-01-22  Martin Baulig  <martin@ximian.com>
3727
3728         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3729         not a string as alias name.
3730
3731 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3732
3733         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3734         #52730 bug, and instead compute correctly the need to use a
3735         temporary variable when requesting an address based on the
3736         static/instace modified of the field and the constructor.
3737  
3738 2004-01-21  Martin Baulig  <martin@ximian.com>
3739
3740         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3741         class and namespace before looking up aliases.  Fixes #52517.
3742
3743 2004-01-21  Martin Baulig  <martin@ximian.com>
3744
3745         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3746         assinged in a 'try'; fixes exception4.cs.
3747
3748 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3749         * class.cs : Implemented parameter-less constructor for TypeContainer
3750
3751         * decl.cs: Attributes are now stored here. New property OptAttributes
3752
3753         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3754
3755         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3756
3757 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3758
3759         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3760           (CSharpSignature): New method for indexer and property signature.
3761
3762 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3763
3764         * pending.cs (IsVirtualFilter): Faster implementation.
3765
3766 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3767
3768         * typemanager.cs: Avoid inclusion of same assembly more than once.
3769
3770 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3771
3772         * cs-parser.jay: Fixed problem where the last assembly attribute
3773           has been applied also to following declaration (class, struct, etc.)
3774           
3775 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3776
3777         * class.cs: Added error CS0538, CS0539 reporting.
3778         Fixed crash on Microsoft runtime when field type is void.
3779
3780         * cs-parser.jay: Added error CS0537 reporting.
3781
3782         * pending.cs: Added error CS0535 reporting.
3783         Improved error report for errors CS0536, CS0534.
3784
3785 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3786
3787         Merge a few bits from the Anonymous Method MCS tree.
3788
3789         * statement.cs (ToplevelBlock): New class for toplevel methods,
3790         will hold anonymous methods, lifted variables.
3791
3792         * cs-parser.jay: Create toplevel blocks for delegates and for
3793         regular blocks of code. 
3794
3795 2004-01-20  Martin Baulig  <martin@ximian.com>
3796
3797         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3798         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3799         and `NeedExplicitReturn'; added `IsLastStatement'.
3800         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3801         have a `ReturnLabel' or we're not unreachable.
3802
3803         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3804         child's reachability; don't just override ours with it.  Fixes
3805         #58058 (lluis's example).
3806         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3807         InFinally(), InLoop(), InSwitch() and
3808         BreakCrossesTryCatchBoundary() methods.
3809
3810         * statement.cs (Return): Do all error checking in Resolve().
3811         Unless we are the last statement in a top-level block, always
3812         create a return label and jump to it.
3813         (Break, Continue): Do all error checking in Resolve(); also make
3814         sure we aren't leaving a `finally'.
3815         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3816         statement in a top-level block.
3817         (Block.Flags): Added `IsDestructor'.
3818         (Block.IsDestructor): New public property.
3819
3820 2004-01-20  Martin Baulig  <martin@ximian.com>
3821
3822         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3823
3824 2004-01-20  Martin Baulig  <martin@ximian.com>
3825
3826         * statement.cs (Statement.ResolveUnreachable): New public method.
3827         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3828         (Block.Resolve): Resolve unreachable statements.
3829
3830 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3831
3832         * expression.cs: We need to fix the case where we do
3833         not have a temp variable here.
3834
3835         * assign.cs: Only expression compound assignments need
3836         temporary variables.
3837
3838 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3839
3840         * flowanalysis.cs: Reduce memory allocation in a few ways:
3841           - A block with no variables should not allocate a bit
3842             vector for itself.
3843           - A method with no out parameters does not need any tracking
3844             for assignment of the parameters, so we need not allocate
3845             any data for it.
3846           - The arrays:
3847                 public readonly Type[] VariableTypes;
3848                 public readonly string[] VariableNames;
3849             Are redundant. The data is already stored in the variable
3850             map, so we need not allocate another array for it.
3851           - We need to add alot of checks for if (params | locals) == null
3852             due to the first two changes.
3853
3854 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3855
3856         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3857         implement IMemoryLocation, we store a copy on a local variable and
3858         take the address of it.  Patch from Benjamin Jemlich
3859
3860         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3861         to use a special "type_name_expression" rule which reduces the
3862         number of "QualifiedIdentifier" classes created, and instead
3863         directly creates MemberAccess expressions.
3864
3865 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3866
3867         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3868         that fixes #52853.  Null literal assignment to ValueType
3869
3870         * class.cs (MethodData.Emit): Instead of checking the name of the
3871         method to determine if its a destructor, create a new derived
3872         class from Method called Destructor, and test for that.  
3873
3874         * cs-parser.jay: Create a Destructor object instead of a Method.  
3875
3876         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3877
3878         Fixes: 52933
3879
3880 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3881
3882         * expression.cs (Binary.ResolveOperator): Perform an implicit
3883         conversion from MethodGroups to their delegate types on the
3884         Addition operation.
3885
3886         * delegate.cs: Introduce a new class DelegateCreation that is the
3887         base class for `NewDelegate' and `ImplicitDelegateCreation',
3888         factor some code in here.
3889
3890         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3891         conversion from MethodGroups to compatible delegate types. 
3892
3893         * ecore.cs (Expression.Resolve): Do not flag error 654
3894         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3895         we allow conversions from MethodGroups to delegate types now.
3896
3897         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3898         assignments in v2 either.
3899
3900 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3901
3902         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3903         static read-only fields in ctors.
3904
3905         Applied patch from Benjamin Jemlich 
3906
3907         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3908
3909 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3910
3911         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3912         here to return true, as they can be used like this:
3913
3914                 (XXX) int.MEMBER ()
3915
3916         Fixed 49836 and all the other dups
3917
3918 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3919
3920         * driver.cs: Implement /win32res and /win32icon.
3921
3922 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
3923
3924         * cs-parser.jay: Add a rule to improve error handling for the
3925         common mistake of placing modifiers after the type.
3926
3927 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
3928
3929         * cs-parser.jay (interface_event_declaration): Catch
3930         initialization of events on interfaces, and report cs0068
3931
3932         * cs-parser.jay (interface_event_declaration): Catch
3933         initialization of events. 
3934
3935         * ecore.cs: Better report missing constructors.
3936
3937         * expression.cs (Binary.ResolveOperator): My previous bug fix had
3938         the error reporting done in the wrong place.  Fix.
3939
3940         * expression.cs (Binary.ResolveOperator): Catch the 
3941         operator + (E x, E y) error earlier, and later allow for implicit
3942         conversions in operator +/- (E e, U x) from U to the underlying
3943         type of E.
3944
3945         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
3946         52596, if the container class is abstract, the default constructor
3947         is protected otherwise its public (before, we were always public).
3948
3949         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
3950         fixed statement.
3951
3952         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
3953         Jemlich that fixes bug #52597, MCS was generating invalid code for
3954         idisposable structs.   Thanks to Ben for following up with this
3955         bug as well.
3956
3957 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
3958
3959         * driver.cs: Allow assemblies without code to be generated, fixes
3960         52230.
3961
3962 2004-01-07  Nick Drochak <ndrochak@gol.com>
3963
3964         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
3965
3966 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
3967
3968         * cs-parser.jay: Add rules to improve error reporting if fields or
3969         methods are declared at the namespace level (error 116)
3970
3971         * Add rules to catch event add/remove
3972
3973 2004-01-04  David Sheldon <dave-mono@earth.li>
3974
3975   * expression.cs: Added matching ")" to error message for 
3976   CS0077
3977
3978 2004-01-03 Todd Berman <tberman@gentoo.org>
3979
3980         * ecore.cs, attribute.cs:
3981         Applying fix from #52429.
3982
3983 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3984
3985         * ecore.cs, expression.cs, statement.cs:
3986         Total rewrite of how we handle branching. We
3987         now handle complex boolean expressions with fewer
3988         jumps. As well if (x == 0) no longer emits a ceq.
3989
3990         if (x is Foo) is much faster now, because we generate
3991         better code.
3992
3993         Overall, we get a pretty big improvement on our benchmark
3994         tests. The code we generate is smaller and more readable.
3995
3996         I did a full two-stage bootstrap. The patch was reviewed
3997         by Martin and Miguel.
3998
3999 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4000
4001         * cs-parser.jay: Make primary_expression not take a QI.
4002         we dont need this because the member_access rule covers
4003         us here. So we replace the rule with just IDENTIFIER.
4004
4005         This has two good effects. First, we remove a s/r conflict.
4006         Second, we allocate many fewer QualifiedIdentifier objects.
4007
4008 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4009
4010         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4011         set the correct information via SRE. This prevents
4012         hanging on the MS runtime. Fixes #29374.
4013
4014 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4015
4016         * convert.cs: correctly handle conversions to value types
4017         from Enum and ValueType as unboxing conversions.
4018
4019         Fixes bug #52569. Patch by Benjamin Jemlich.
4020
4021 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4022
4023         * expression.cs (BetterConversion): Prefer int -> uint
4024         over int -> ulong (csc's behaviour). This fixed bug #52046.
4025
4026 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4027
4028         * decl.cs (MemberCache.FindMembers): now returns a
4029         MemberInfo [].
4030
4031         * typemanager.cs: In general, go with with ^^.
4032         (CopyNewMethods): take an IList.
4033         (RealMemberLookup): Only allocate an arraylist
4034         if we copy from two sets of methods.
4035
4036         This change basically does two things:
4037         1) Fewer array lists allocated due to CopyNewMethods.
4038         2) the explicit cast in MemberList costed ALOT.
4039
4040 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4041
4042         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4043         a hashtable to avoid needless string allocations when an identifier is
4044         used more than once (the common case).
4045
4046 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4047
4048         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4049         is broken, it will not return anything. So, we
4050         have to use the information we have in mcs to
4051         do the task.
4052
4053         * typemanager.cs: Add a cache for GetInterfaces,
4054         since this will now be used more often (due to ^^)
4055
4056         (GetExplicitInterfaces) New method that gets the
4057         declared, not effective, interfaces on a type
4058         builder (eg, if you have interface IFoo, interface
4059         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4060         { IBar }.
4061
4062         This patch makes MCS able to bootstrap itself on
4063         Windows again.
4064
4065 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4066
4067         * expression.cs: Remove the Nop's that Miguel put
4068         in by mistake.
4069
4070 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4071
4072         * report.cs, codegen.cs: Give the real stack trace to
4073         the error when an exception is thrown.
4074
4075 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4076
4077         * decl.cs: only allocate hashtables for ifaces if 
4078         it is an iface!
4079
4080 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4081
4082         * expression.cs: fix the error from cs0121-2.cs
4083         (a parent interface has two child interfaces that
4084         have a function with the same name and 0 params
4085         and the function is called through the parent).
4086
4087 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4088
4089         * class.cs, rootcontext.cs, typmanager.cs: do not
4090         leak pointers.
4091
4092 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4093
4094         * codegen.cs: remove stack for the ec flow branching.
4095         It is already a linked list, so no need.
4096
4097 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4098
4099         * Makefile: Allow custom profiler here.
4100
4101 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4102
4103         * typemanager.cs (LookupType):
4104           - Use a static char [], because split takes
4105             a param array for args, so it was allocating
4106             every time.
4107           - Do not store true in a hashtable, it boxes.
4108
4109 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4110
4111         * flowanalysis.cs: bytify common enums.
4112
4113 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4114
4115         * modifiers.cs: Add a new set of flags for the
4116         flags allowed on explicit interface impls.
4117         * cs-parser.jay: catch the use of modifiers in
4118         interfaces correctly.
4119         * class.cs: catch private void IFoo.Blah ().
4120
4121         All related to bug #50572.
4122
4123 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4124
4125         * decl.cs: Rewrite the consistant accessability checking.
4126         Accessability is not linear, it must be implemented in
4127         a tableish way. Fixes #49704.
4128
4129 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4130
4131         * expression.cs: Handle negation in a checked context.
4132         We must use subtraction from zero. Fixes #38674.
4133
4134 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4135
4136         * class.cs: Ignore static void main in DLLs.
4137         * rootcontext.cs: Handle the target type here,
4138         since we are have to access it from class.cs
4139         * driver.cs: account for the above.
4140
4141 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4142
4143         * report.cs: Give line numbers and files if available.
4144
4145 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4146
4147         * driver.cs: Implement /addmodule.
4148
4149         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4150         ModuleBuilders.
4151
4152 2003-12-20  Martin Baulig  <martin@ximian.com>
4153
4154         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4155         (FieldBase.IsAssigned): Removed this field.
4156         (FieldBase.SetAssigned): New public method.
4157         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4158
4159 2003-12-20  Martin Baulig  <martin@ximian.com>
4160
4161         * expression.cs (LocalVariableReference.DoResolve): Don't set
4162         `vi.Used' if we're called from DoResolveLValue().
4163
4164         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4165         returns the usage vector it just merged into the current one -
4166         pass this one to UsageWarning().
4167         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4168         of the `EmitContext', don't call this recursively on our children.
4169
4170 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4171
4172         * driver.cs: Implement /target:module.
4173
4174 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4175
4176         * support.cs (CharArrayHashtable): New helper class.
4177
4178         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4179         char arrays, not strings, so we can avoid creating a string in
4180         consume_identifier if the identifier is a keyword.
4181
4182 2003-12-16  Martin Baulig  <martin@ximian.com>
4183
4184         * statement.cs (LocalInfo.Assigned): Removed this property.
4185         (LocalInfo.Flags): Removed `Assigned'.
4186         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4187         and uses flow analysis.
4188         (Block.UsageWarning): Made this method private.
4189         (Block.Resolve): Call UsageWarning() if appropriate.
4190
4191         * expression.cs (LocalVariableReference.DoResolve): Always set
4192         LocalInfo.Used here.
4193
4194 2003-12-13  Martin Baulig  <martin@ximian.com>
4195
4196         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4197         any value here; we're now using flow analysis to figure out
4198         whether a statement/block returns a value.
4199
4200 2003-12-13  Martin Baulig  <martin@ximian.com>
4201
4202         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4203         working again.
4204         (FlowBranching.MergeFinally): Don't call
4205         `branching.CheckOutParameters()' here, this is called in
4206         MergeTopBlock().
4207         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4208         when adding the `finally' vector.       
4209
4210 2003-12-13  Martin Baulig  <martin@ximian.com>
4211
4212         * flowanalysis.cs
4213         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4214         actually work and also fix #48962.
4215
4216 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4217
4218         * decl.cs: Do not check System.Object for nested types,
4219         since we know it does not have any. Big bang for buck:
4220
4221         BEFORE:
4222            Run 1:   8.35 seconds
4223            Run 2:   8.32 seconds
4224            corlib:  17.99 seconds
4225         AFTER:
4226            Run 1:   8.17 seconds
4227            Run 2:   8.17 seconds
4228            corlib:  17.39 seconds
4229
4230 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4231
4232         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4233         time we are returning 0 members, so we save alot here.
4234
4235 2003-12-11  Martin Baulig  <martin@ximian.com>
4236
4237         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4238         `MergeChild()', also just take the `FlowBranching' as argument;
4239         call Merge() on it and return the result.
4240         (FlowBranching.Merge): We don't need to do anything if we just
4241         have one sibling.
4242
4243 2003-12-11  Martin Baulig  <martin@ximian.com>
4244
4245         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4246         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4247         Maurer for this idea.
4248
4249 2003-12-11  Martin Baulig  <martin@ximian.com>
4250
4251         * flowanalysis.cs (MergeResult): This class is now gone; we now
4252         use the `UsageVector' for this.  The reason for this is that if a
4253         branching just has one sibling, we don't need to "merge" them at
4254         all - that's the next step to do.
4255         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4256         `MergeResult'.
4257
4258 2003-12-11  Martin Baulig  <martin@ximian.com>
4259
4260         Reworked flow analyis and made it more precise and bug-free.  The
4261         most important change is that we're now using a special `Reachability'
4262         class instead of having "magic" meanings of `FlowReturns'.  I'll
4263         do some more cleanups and optimizations and also add some more
4264         documentation this week.
4265
4266         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4267         largely reworked this class.
4268         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4269         the new `Reachability' class instead of having "magic" values here.
4270         (FlowBranching): We're now using an instance of `Reachability'
4271         instead of having separate `Returns', `Breaks' etc. fields.
4272
4273         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4274         based on flow analysis; ignore the return value of block.Emit ().
4275
4276 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4277
4278         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4279         if they are private.
4280
4281 2003-12-09  Martin Baulig  <martin@ximian.com>
4282
4283         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4284         call them directly on the UsageVector.
4285
4286 2003-12-09  Martin Baulig  <martin@ximian.com>
4287
4288         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4289         Changed return type from `FlowReturns' to `Reachability'.
4290
4291 2003-12-09  Martin Baulig  <martin@ximian.com>
4292
4293         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4294         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4295         `Reachable' fields with a single `Reachability' one.
4296
4297 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4298
4299         * class.cs (FindMembers): Remove foreach's.
4300
4301         Bootstrap times:
4302
4303         BEFORE
4304                 Run 1:   8.74 seconds
4305                 Run 2:   8.71 seconds
4306
4307         AFTER
4308                 Run 1:   8.64 seconds
4309                 Run 2:   8.58 seconds
4310
4311
4312 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4313
4314         * cs-parser.jay:
4315         * gen-treedump.cs:
4316         * statement.cs:
4317         This patch does a few things:
4318                 1. EmptyStatement is now a singleton, so it is never reallocated.
4319                 2. All blah is EmptyStatement constructs have been changed to
4320                    blah == EmptyStatement.Value, which is much faster and valid
4321                    now that EmptyStatement is a singleton.
4322                 3. When resolving a block, rather than allocating a new array for
4323                    the non-empty statements, empty statements are replaced with
4324                    EmptyStatement.Value
4325                 4. Some recursive functions have been made non-recursive.
4326         Mainly the performance impact is from (3), however (1) and (2) are needed for
4327         this to work. (4) does not make a big difference in normal situations, however
4328         it makes the profile look saner.
4329
4330         Bootstrap times:
4331
4332         BEFORE
4333         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4334         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4335         Total memory allocated: 56397 KB
4336
4337         AFTER
4338         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4339         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4340         Total memory allocated: 55666 KB
4341
4342 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4343
4344         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4345         than the hashtable in a hashtable version
4346
4347         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4348         we always end up concating a string. This results in a huge perf
4349         loss, because many strings have to be tracked by the GC. In this
4350         patch, we first use a hashtable that works with two keys, so that
4351         the strings do not need to be concat'ed.
4352
4353         Bootstrap times:
4354         BEFORE
4355                 Run 1:   8.74 seconds
4356                 Run 2:   8.71 seconds
4357
4358         AFTER
4359                 Run 1:   8.65 seconds
4360                 Run 2:   8.56 seconds
4361
4362 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4363
4364         * Makefile: Add a new target `do-time' that does a quick and simple
4365         profile, leaving easy to parse output.
4366
4367 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4368
4369         * codegen.cs (Init): Create the dynamic assembly with 
4370         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4371
4372 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4373
4374         * support.cs: Make the PtrHashtable use only one
4375         instance of its comparer.
4376
4377 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4378
4379         * typemanager.cs: Fix lookup of GetNamespaces.
4380
4381 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4382
4383         * expression.cs: Removed redundant line.
4384
4385         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4386         ArrayLists, use for loops with bounds.  
4387
4388         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4389         arraylist.
4390
4391         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4392         arraylists, use for loop with bounds.
4393
4394         The above three changes give us a 0.071 second performance
4395         improvement out of 3.294 seconds down to 3.223.  On my machine
4396         the above changes reduced the memory usage by 1,387 KB during
4397         compiler bootstrap.
4398
4399         * cs-parser.jay (QualifiedIdentifier): New class used to represent
4400         QualifiedIdentifiers.  Before we created a new string through
4401         concatenation, and mostly later on, the result would be
4402         manipulated by DecomposeQI through string manipulation.
4403
4404         This reduced the compiler memory usage for bootstrapping from
4405         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
4406         compile times in 0.05 seconds.
4407
4408 2003-11-28  Dick Porter  <dick@ximian.com>
4409
4410         * support.cs: Do string compares with the Invariant culture.
4411
4412         * rootcontext.cs: 
4413         * gen-treedump.cs: 
4414         * expression.cs: 
4415         * driver.cs: 
4416         * decl.cs: 
4417         * codegen.cs: 
4418         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4419         the comparison is done with the Invariant culture.
4420
4421 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4422
4423         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4424         GetEnumerator method.
4425
4426         (ProbeCollectionType): Iterate starting at the most specific type
4427         upwards looking for a GetEnumerator
4428
4429         * expression.cs: Shift count can be up to 31 for int/uint and 63
4430         for long/ulong.
4431
4432 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4433
4434         * statement.cs (Block.LookupLabel): Also look for the label on the
4435         children blocks.  Use a hash table to keep track of visited
4436         nodes. 
4437
4438         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4439         we actually did transform the other operand, otherwise fall back
4440         to the common codepath that casts to long.
4441
4442         * cs-tokenizer.cs: Use the same code pattern as the int case.
4443         Maybe I should do the parsing myself, and avoid depending on the
4444         Parse routines to get this done.
4445
4446 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4447
4448         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4449         which fixes bug 51347.  This time test it.
4450
4451         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4452         attributes for example can not tell the difference between these.
4453         The difference was only a syntax feature of the language. 
4454
4455         * attribute.cs: Apply attributes to delegates.
4456
4457         * delegate.cs: Call the apply attributes method.
4458
4459 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4460
4461         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4462         comparing 0 vs Byte.MinValue, not the value
4463
4464         (ImplicitConversionRequired): When reporting a conversion error,
4465         use error 31 to print out the constant error instead of the
4466         simpler 29.
4467
4468         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4469         which fixes bug 51347.
4470
4471 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4472
4473         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4474         which fixes the -warnaserror command line option.
4475
4476 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4477
4478         * cfold.cs (DoNumericPromotions): During constant folding of
4479         additions on UIntConstant, special case intconstants with
4480         IntConstants like we do on the expression binary operator. 
4481
4482 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4483
4484         * convert.cs (ImplicitReferenceConversion): We were missing a case
4485         (System.Enum are not value types or class types, so we need to
4486         classify them separatedly).
4487
4488         * driver.cs: We do not support error 2007.
4489
4490 2003-11-12 Jackson Harper <jackson@ximian.com>
4491
4492         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4493         system directory. Also use the full file name so users can
4494         libraries names mscorlib-o-tron.dll in a non system dir.
4495         
4496 2004-01-04  David Sheldon <dave-mono@earth.li>
4497
4498         * expression.cs: Added matching ")" to error message for CS0077.
4499
4500 2003-12-19  Martin Baulig  <martin@ximian.com>
4501
4502         * typemanager.cs (TypeManager.IsEqualGenericType): New public
4503         static method; see documentation in the method.
4504         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
4505
4506         * convert.cs (Convert.ImplicitReferenceConversion,
4507         Convert.ImplicitReferenceConversionExists): Add support for
4508         generic type declarations; see gen-36.cs.
4509
4510 2003-12-19  Martin Baulig  <martin@ximian.com>
4511
4512         * pending.cs (Pending.InterfaceMethod): Use
4513         `Type.IsAssignableFrom()' instead of `=='.
4514
4515 2003-12-18  Martin Baulig  <martin@ximian.com>
4516
4517         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
4518         byref types first.
4519
4520         * convert.cs (Convert.ImplicitStandardConversionExists): Use
4521         `expr_type.Equals (target_type)' instead of `=='.
4522
4523 2003-12-08  Martin Baulig  <martin@ximian.com>
4524
4525         * generics.cs (Constraints.Types): Removed.
4526         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
4527         to Type's.
4528         (Constraints.ResolveTypes): New public method; resolves the
4529         TypeExpr's to Type's.
4530         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
4531         longer takes the constraints.
4532         (TypeParameter.DefineMethod): Likewise.
4533         (TypeParameter.DefineType): New public method.  Calls
4534         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
4535         the constraints.
4536
4537 2003-12-08  Martin Baulig  <martin@ximian.com>
4538
4539         * convert.cs (Convert.ImplicitConversionStandard): Use
4540         `expr_type.Equals (target_type)' instead of `=='.
4541
4542 2003-12-08  Martin Baulig  <martin@ximian.com>
4543
4544         * typemanager.cs (TypeManager.GetReferenceType): Call
4545         `Type.MakeByRefType ()'.
4546
4547 2003-12-08  Martin Baulig  <martin@ximian.com>
4548
4549         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
4550         just has some special meaning in some situations.  For instance,
4551         it is allowed to use `where' as the name of a variable etc.
4552
4553 2003-12-04  Martin Baulig  <martin@ximian.com>
4554
4555         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
4556         `Type.MakeArrayType()' for array types.
4557
4558 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
4559
4560         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
4561         debugging message.
4562
4563         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
4564         corlib to compile.
4565
4566 2003-11-16  Martin Baulig  <martin@ximian.com>
4567
4568         * codegen.cs (EmitContext.IsGeneric): Removed.
4569
4570         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
4571         ResolveGeneric() on the DeclSpace.
4572
4573 2003-11-16  Martin Baulig  <martin@ximian.com>
4574
4575         * generic.cs (TypeArguments.Resolve):
4576         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
4577         `ResolveType()' on it to get the Type.
4578
4579 2003-11-15  Martin Baulig  <martin@ximian.com>
4580
4581         * generic.cs (ConstructedType.GetInterfaces): Override this.
4582
4583 2003-11-14  Martin Baulig  <martin@ximian.com>
4584
4585         * interface.cs (Interface.DefineType): Define all type parameters
4586         before adding the interfaces we inherit.
4587
4588 2003-11-11  Martin Baulig  <martin@ximian.com>
4589
4590         * generic.cs (ConstructedType.ResolveType): Always call
4591         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
4592
4593 2003-11-10  Martin Baulig  <martin@ximian.com>
4594
4595         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4596         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4597         calling `ResolveType()' on them, directly assign their `Type'.
4598
4599 2003-11-08  Martin Baulig  <martin@ximian.com>
4600
4601         * generic.cs (ConstructedType): Override `IsClass' etc.
4602
4603 2003-11-08  Martin Baulig  <martin@ximian.com>
4604
4605         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4606         return value and the `out parent' parameter.
4607         (TypeContainer.DefineType): Moved the CS0644 check into
4608         GetClassBases().  Don't pass the interface types to the
4609         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4610         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4611
4612         * ecore.cs (TypeExpr.IsAttribute): New property.
4613         (TypeExpr.GetInterfaces): New method.
4614
4615         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4616         TypeExpr instead of a Type.
4617         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4618         (Interface.DefineType): Don't pass the interface types to the
4619         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4620         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4621
4622         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4623         instead of a `Type[]'.
4624         (TypeManager.RegisterBuilder): Likewise.
4625         (TypeManager.AddUserInterface): Likewise.
4626         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4627         `Type[]' and also return a `TypeExpr[]'.
4628         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4629
4630 2003-11-08  Martin Baulig  <martin@ximian.com>
4631
4632         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4633         Expression.     
4634
4635 2003-11-08  Martin Baulig  <martin@ximian.com>
4636
4637         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4638         TypeManager.ResolveExpressionTypes().
4639
4640         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4641         instead of an Expression.
4642         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4643         (TypeExpression): New public class; formerly known as `TypeExpr'.
4644
4645         * expression.cs (ComposedCast): Derive from TypeExpr.
4646
4647         * typemanager.cs (TypeManager.system_*_expr): These are now
4648         TypExpr's instead of Expression's.
4649         (TypeManager.ResolveExpressionTypes): New public static function;
4650         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4651         of them.        
4652
4653 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4654
4655         * expression.cs (New.DoResolve): Do not dereference value that
4656         might be a null return.
4657
4658         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4659         sure that the constant value has the right type.  Fixes an
4660         unreported bug, similar to 50425.
4661
4662         * const.cs (Const.LookupConstantValue): Call
4663         ImplicitStandardConversionExists before doing a conversion to
4664         avoid havng the TypeManager.ChangeType do conversions.
4665
4666         Reduced the number of casts used
4667
4668         (Const.ChangeType): New routine to enable reuse of the constant
4669         type changing code from statement.
4670
4671         * typemanager.cs (ChangeType): Move common initialization to
4672         static global variables.
4673
4674         Fixes #50425.
4675
4676         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4677         every value type to go through, even if it was void.  Fix that. 
4678
4679         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4680         character of the define, and the is_identifier_part_character for
4681         the rest of the string.
4682
4683 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4684
4685         * expression.cs (UnaryMutator.EmitCode): When I updated
4686         LocalVariableReference.DoResolve, I overdid it, and dropped an
4687         optimization done on local variable references.
4688
4689 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4690
4691         * ecore.cs: Convert the return from Ldlen into an int.
4692
4693 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4694
4695         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4696         the accessibility, this is a special case for toplevel non-public
4697         classes (internal for instance).
4698
4699 2003-10-20  Nick Drochak <ndrochak@gol.com>
4700
4701         * ecore.cs: Fix typo and build.  Needed another right paren.
4702
4703 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4704
4705         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4706         `internal' case regular and protected, but not allowing protected
4707         to be evaluated later.  Bug 49840
4708
4709 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4710
4711         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4712         to kb.Nlast, and not the kb.nFirst to isolate the switch
4713         statement.
4714
4715         Extract the underlying type, so enumerations of long/ulong are
4716         treated like long/ulong.
4717
4718 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4719
4720         * expression.cs (New): Overload the meaning of RequestedType to
4721         track the possible creation of the NewDelegate type, since
4722         DoResolve is invoked more than once for new constructors on field
4723         initialization.
4724
4725         See bugs: #48800 and #37014
4726
4727         * cs-parser.jay (declare_local_constants): Take an arraylist
4728         instead of a single constant.
4729
4730         (local_constant_declaration): It should take a
4731         constant_declarators, not a constant_declarator.  Fixes 49487
4732
4733         * convert.cs: Fix error report.
4734
4735 2003-10-13 Jackson Harper <jackson@ximian.com>
4736
4737         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4738         bug #49611
4739         
4740 2003-11-03  Martin Baulig  <martin@ximian.com>
4741
4742         * expression.cs (ArrayAccess.GetStoreOpcode): Added
4743         `out bool has_type_arg'; if set, we need to pass the type to
4744         ig.Emit().
4745         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
4746         Stelem_Any/Ldelem_Any for generic parameters.   
4747
4748 2003-11-02  Martin Baulig  <martin@ximian.com>
4749
4750         * expression.cs (Invocation.EmitCall): Use
4751         `TypeManager.IsValueType()' to check whether it's a value type.
4752         Don't set `struct_call' when calling a method on a type parameter.
4753
4754 2003-11-02  Martin Baulig  <martin@ximian.com>
4755
4756         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
4757         and removed the TypeBuilder argument.
4758
4759         * typemanager.cs (TypeManager.IsValueType): Return
4760         `t.IsGenericParameter || t.IsValueType'.
4761
4762 2003-10-25  Martin Baulig  <martin@ximian.com>
4763
4764         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
4765         call ConstructedType.Resolve() on it.
4766
4767         * generic.cs (ConstructedType.Resolve): Set `type' on success.
4768
4769 2003-10-25  Martin Baulig  <martin@ximian.com>
4770
4771         * class.cs (TypeContainer.GetClassBases): Changed
4772         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
4773         CS8214 reporting here.
4774         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
4775         instead of a `Type' for our parent.  In case of a recursive
4776         declaration (see tests/gen-23.cs for an example), our parent is a
4777         ConstructedType and it doesn't have its type set.  So, first
4778         create our own TypeBuilder, then call constructed.Resolve() to get
4779         the parent's type and finally TypeBuilder.SetParent() it.
4780
4781         * ecore.cs (TypeExpr.Name): New public virtual property.
4782
4783         * generic.cs
4784         (ConstructedType): We're now a TypeExpr and not just an Expression.
4785         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
4786         arguments here; this is done later.
4787         (ConstructedType.Resolve): New public method to resolve the type
4788         arguments and bind them.
4789
4790 2003-10-21  Martin Baulig  <martin@ximian.com>
4791
4792         * convert.cs: Use `TypeManager.IsValueType' instead of
4793         'type.IsValueType' everywhere.
4794
4795         * typemanager.cs (TypeManager.IsValueType): Return true for type
4796         parameters.  The reason for this is that we need to box a type
4797         parameter when converting it to a reference type.
4798
4799         * cs-parser.jay: Added support for default value expressions.
4800
4801         * generics.cs (DefaultValueExpression): New public class.       
4802
4803 2003-10-17  Martin Baulig  <martin@ximian.com>
4804
4805         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
4806         TypeContainer so we can also use this for Interfaces.
4807         (TypeParameter.Resolve): Likewise.
4808
4809         * interface.cs (Interface.DefineType): Added support for generic
4810         interfaces.
4811
4812         * cs-parser.jay: Added support for generic structs and interfaces.
4813
4814 2003-10-17  Martin Baulig  <martin@ximian.com>
4815
4816         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
4817         call generic methods :-)
4818
4819 2003-10-16  Martin Baulig  <martin@ximian.com>
4820
4821         * cs-parser.jay (namespace_or_type_name): Only create a
4822         GenericMemberAccess if we actually have type arguments.
4823
4824 2003-10-13  Martin Baulig  <martin@ximian.com>
4825
4826         * class.cs (Method.Define): If we're a generic method, call
4827         TypeBuilder.DefineGenericMethod () before resolving
4828         the parameters.
4829         (MethodData): Added .ctor which takes an additional MethodBuilder
4830         argument; this is used for generic methods.
4831         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
4832         we already have a MethodBuilder.
4833
4834 2003-10-10  Martin Baulig  <martin@ximian.com>
4835
4836         * class.cs (Method): Added .ctor which takes a `GenericMethod'
4837         instead of a `DeclSpace'.  This is used for generic methods.
4838
4839         * cs-parser.jay (method_header): Added support for generic
4840         methods; create a `GenericMethod' instance and pass it to the
4841         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
4842         parameters and locals.
4843
4844         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
4845         since we already have the location.  Check whether we're a generic
4846         type declaration or a generic method and create the correct type
4847         parameter.
4848
4849         * generic.cs (TypeParameter.DefineMethod): New public method.
4850         (GenericMethod): New public class; derives from DeclSpace and is
4851         used for generic methods.       
4852
4853 2003-10-09  Martin Baulig  <martin@ximian.com>
4854
4855         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4856         to the .ctor.
4857         (MethodCore.DoDefineParameters): Removed the TypeContainer
4858         argument; use the DeclSpace which was passed to the .ctor instead.
4859         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4860         TypeContainer; we only need a DeclSpace here.
4861
4862 2003-10-09  Martin Baulig  <martin@ximian.com>
4863
4864         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4865         to the .ctor.
4866         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4867         EmitContext's .ctor.    
4868
4869 2003-10-09  Martin Baulig  <martin@ximian.com>
4870
4871         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4872         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4873         AsAccessible(), moved them as well.
4874
4875         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4876
4877 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4878
4879         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4880         generation for >=, as spotted by Paolo, bug 48679.  
4881         Patch from David Waite.
4882
4883         * cs-tokenizer.cs: Add handling for #pragma.
4884
4885         * cs-parser.jay: Allow for both yield and yield return in the
4886         syntax.  The anti-cobolization of C# fight will go on!
4887
4888         * class.cs (TypeBuilder.DefineType): Catch error condition here
4889         (Parent.DefineType erroring out and returning null).
4890
4891         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4892         coping with enumerations variables, we were mistakenly processing
4893         them as a regular value type instead of built-in types.  Fixes the
4894         bug #48063
4895
4896         * typemanager.cs (IsBuiltinOrEnum): New method.
4897
4898 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
4899
4900         * cs-parser.jay: Upgrade: yield now needs the return clause.
4901
4902 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
4903
4904         * cs-parser.jay : Renamed yyName to yyNames related to jay.
4905
4906 2003-09-29  Martin Baulig  <martin@ximian.com>
4907
4908         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
4909         inflated generic methods.
4910
4911         * generics.cs (ConstructedType): Distinguish between open and
4912         closed constructed types; correctly resolve the arguments.
4913
4914 2003-09-22  Martin Baulig  <martin@ximian.com>
4915
4916         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
4917         all type arguments meet their constraints.
4918
4919 2003-09-19  Martin Baulig  <martin@ximian.com>
4920
4921         * decl.cs (MemberCache.SetupCacheForInterface): Take a
4922         `MemberCache parent' argument.  Normally, an interface doesn't
4923         have a parent type except System.Object, but we use this in gmcs
4924         for generic type parameters.
4925
4926 2003-09-18  Martin Baulig  <martin@ximian.com>
4927
4928         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
4929         on `type.IsInterface'; don't check whether the type has a parent
4930         to determine whether it's an interface.
4931
4932 2003-09-17  Martin Baulig  <martin@ximian.com>
4933
4934         * generic.cs (ConstructedType.ToString): Always use `name' as the
4935         type name.
4936
4937 2003-09-15  Martin Baulig  <martin@ximian.com>
4938
4939         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
4940
4941         * generic.cs (Constraints.Resolve): New public method; this is
4942         called to resolve the constraint types and to check whether all
4943         the constraints are correct.
4944         (Constraints.Types): New public property.
4945         (TypeParameter.Resolve): New public method; resolves all the
4946         type's constraints.
4947
4948         * class.cs (TypeContainer.DefineType): Call
4949         TypeParameter.Resolve() before actually defining the type.
4950
4951 2003-09-15  Martin Baulig  <martin@ximian.com>
4952
4953         * class.cs (TypeContainer.DefineType): Added an error flag to
4954         avoid reporting duplicate CS0146's ("class definition is
4955         circular.").
4956
4957         * driver.cs (Driver.MainDriver): Abort if
4958         RootContext.ResolveTree() reported any errors.
4959
4960 2003-09-07  Martin Baulig  <martin@ximian.com>
4961
4962         * report.cs (Error, Warning): Added overloaded versions which take
4963         a `params object[] args' and call String.Format().
4964
4965 2003-09-07  Martin Baulig  <martin@ximian.com>
4966
4967         * decl.cs (DeclSpace..ctor): Don't call
4968         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
4969         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
4970         (DeclSpace.RecordDecl): New method.
4971
4972         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
4973
4974 2003-09-02  Ravi Pratap  <ravi@ximian.com>
4975
4976         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
4977         value attributes to be applied to ParameterBuilders.
4978
4979         * class.cs (MethodCore.LabelParameters): Make static and more
4980         generic so that it can be used from other places - like interface
4981         methods, for instance.
4982
4983         * interface.cs (Interface.Emit): Call LabelParameters before
4984         emitting attributes on the InterfaceMethod.
4985
4986 2003-09-07  Martin Baulig  <martin@ximian.com>
4987
4988         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
4989         if the number of type parameters doesn't match.
4990
4991 2003-09-04  Martin Baulig  <martin@ximian.com>
4992
4993         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
4994         for arrays of generic type params (ie. `!0[]').
4995
4996 2003-09-04  Martin Baulig  <martin@ximian.com>
4997
4998         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
4999         for the moment.
5000
5001 2003-09-04  Martin Baulig  <martin@ximian.com>
5002
5003         * decl.cs (DeclSpace.LookupGeneric): New method.
5004         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
5005         moment.
5006
5007         * generic.cs (TypeParameterExpr): Take a TypeParameter as
5008         argument, not just a string.
5009         (TypeParameter.Define): New public method; this is called to
5010         actually define the generic parameter; after this, you can use the
5011         new `Type' property to get the type.
5012
5013 2003-09-04  Martin Baulig  <martin@ximian.com>
5014
5015         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
5016         is now an ArrayList; initialize the result of the `TypeParameters'
5017         property here.
5018         (DeclSpace.GetGenericData): Removed.
5019         (DeclSpace.LookupGeneric): Temporarily removed; we need to
5020         implement this in a different way.
5021         (DeclSpace.GetTypeParameters): Removed; there's now a
5022         `TypeParameters' property.
5023         (DeclSpace.TypeParameters): New public property.
5024
5025         * generic.cs (Constraints): Make this class public.
5026         (TypeParameter): New public class.
5027
5028 2003-09-04  Martin Baulig  <martin@ximian.com>
5029
5030         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
5031         generic parameters.
5032
5033         * class.cs (TypeContainer.DefineType): Call
5034         TypeBuilder.DefineGenericParameter () on all generic parameters if
5035         this is a generic type.
5036
5037 2003-08-28  Martin Baulig  <martin@ximian.com>
5038
5039         * sample-stack.il: Compile this with ilasm: "ilasm /dll
5040         sample-stack.il".
5041
5042         * sample-hello.cs: Compile this with gmcs: "gmcs
5043         /r:sample-stack.dll sample-hello.cs".
5044
5045 2003-08-28  Martin Baulig  <martin@ximian.com>
5046
5047         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
5048         the parameters to the generic type.
5049
5050 2003-08-28  Martin Baulig  <martin@ximian.com>
5051
5052         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
5053
5054 2003-08-28  Martin Baulig  <martin@ximian.com>
5055
5056         * cs-parser.jay (opt_type_argument_list): Use
5057         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
5058         (primary_expression): Replace `qualified_identifier' with `type_name'.
5059         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
5060
5061         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
5062         parser to check whether it is syntactically a type parameter list;
5063         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
5064         this case.
5065
5066 2003-08-26  Martin Baulig  <martin@ximian.com>
5067
5068         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5069         resolving aliases; fixes #47927.
5070
5071 2003-08-26  Martin Baulig  <martin@ximian.com>
5072
5073         * statement.cs (Using.DoResolve): This is internally emitting a
5074         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5075         do not always return.  Fixes #47681.
5076
5077 2003-08-26  Martin Baulig  <martin@ximian.com>
5078
5079         * decl.cs (MemberCore): Moved WarningNotHiding(),
5080         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5081         into MemberBase.
5082         (AdditionResult): Make this nested in DeclSpace.
5083         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5084         argument; call NamespaceEntry.Define() unless we're nested in a
5085         class or struct.
5086
5087         * namespace.cs (Namespace.DefineName): New public function.  This
5088         is called from DeclSpace's .ctor to add 
5089         (Namespace.Lookup): Include DeclSpaces in the lookup.
5090
5091         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5092
5093         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5094
5095 2003-08-25  Martin Baulig  <martin@ximian.com>
5096
5097         * convert.cs (Convert.ExplicitReferenceConversion): When
5098         converting from an interface type to a class, unbox if the target
5099         type is a struct type.  Fixes #47822.
5100
5101 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5102
5103         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5104         #47854.
5105
5106 2003-08-22  Martin Baulig  <martin@ximian.com>
5107
5108         * class.cs (TypeManager.DefineType): When defining a nested type,
5109         call DefineType() on our parent; fixes #47801.
5110
5111 2003-08-22  Martin Baulig  <martin@ximian.com>
5112
5113         * class.cs (MethodData.Define): While checking if a method is an
5114         interface implementation, improve the test a bit more to fix #47654.
5115
5116 2003-08-22  Martin Baulig  <martin@ximian.com>
5117
5118         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5119         correctly; fixes #47722.
5120
5121 2003-08-22  Martin Baulig  <martin@ximian.com>
5122
5123         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5124         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5125
5126         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5127
5128 2003-08-22  Martin Baulig  <martin@ximian.com>
5129
5130         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5131         can only be assigned in static constructors.  Fixes #47161.
5132
5133 2003-08-22  Martin Baulig  <martin@ximian.com>
5134
5135         Rewrote and improved the flow analysis code.
5136
5137         * flowbranching.cs (FlowBranching): Make this class abstract.
5138         (FlowBranching.CreateBranching): New static function to create a
5139         new flow branching.
5140         (FlowBranchingBlock, FlowBranchingException): New classes.
5141         (FlowBranching.UsageVector.Type): New public readonly field.
5142         (FlowBranching.UsageVector.Breaks): Removed the setter.
5143         (FlowBranching.UsageVector.Returns): Removed the setter.
5144         (FlowBranching.UsageVector): Added Break(), Return(),
5145         NeverReachable() and Throw() methods to modify the reachability.
5146         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5147         done by FlowBranching.Merge().
5148         (FlowBranching.UsageVector.MergeChild): New method; merges the
5149         merge result into the current vector.
5150         (FlowBranching.Merge): New abstract method to merge a branching.
5151
5152 2003-08-12  Martin Baulig  <martin@ximian.com>
5153
5154         * expression.cs (Indirection.CacheTemporaries): Create the
5155         LocalTemporary with the pointer type, not its element type.
5156
5157 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5158
5159         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5160         token was a keyword or not.
5161
5162         Add `error' options where an IDENTIFIER was expected;  Provide
5163         CheckToken and CheckIdentifierToken convenience error reporting
5164         functions. 
5165
5166         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5167
5168         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5169         NameSpaceEntry NameSpaceEntry.
5170
5171         (LookupInterfaceOrClass): Avoid creating a full qualified name
5172         from namespace and name: avoid doing lookups when we know the
5173         namespace is non-existant.   Use new Tree.LookupByNamespace which
5174         looks up DeclSpaces based on their namespace, name pair.
5175
5176         * driver.cs: Provide a new `parser verbose' to display the
5177         exception thrown during parsing.  This is turned off by default
5178         now, so the output of a failure from mcs is more graceful.
5179
5180         * namespace.cs: Track all the namespaces defined in a hashtable
5181         for quick lookup.
5182
5183         (IsNamespace): New method
5184
5185 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5186
5187         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5188         we know that we need to concatenate (full typename can never be
5189         null). 
5190
5191         * class.cs: ditto.
5192
5193         * statement.cs: Use a bitfield;  Do not initialize to null things
5194         which are done by the constructor by default.
5195
5196         * cs-parser.jay: bug fix, parameter was 4, not 3.
5197
5198         * expression.cs: Just use the property;
5199
5200         * statement.cs: No need for GetVariableInfo method.
5201
5202 2003-08-08  Martin Baulig  <martin@ximian.com>
5203
5204         * flowanalysis.cs (FlowReturns): This is now nested in the
5205         `FlowBranching' class.
5206         (MyBitVector): Moved this here from statement.cs.
5207         (FlowBranching.SiblingType): New enum type.
5208         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5209
5210 2003-08-07  Martin Baulig  <martin@ximian.com>
5211
5212         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5213         `FlowBranching' class and called `BranchingType'.
5214
5215 2003-08-07  Martin Baulig  <martin@ximian.com>
5216
5217         * flowanalysis.cs: Moved all the control flow analysis code into
5218         its own file.
5219
5220 2003-08-07  Martin Baulig  <martin@ximian.com>
5221
5222         * assign.cs (Assign.DoResolve): `target' must either be an
5223         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5224         #37319.
5225
5226 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5227
5228         * expression.cs (BinaryMethod): This kind of expression is created by the
5229         Binary class if it determines that the operator has to be handled
5230         by a method.
5231
5232         (BinaryDelegate): This kind of expression is created if we are
5233         dealing with a + or - operator on delegates.
5234
5235         (Binary): remove method, argumetns, and DelegateOperator: when
5236         dealing with methods, 
5237
5238         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5239
5240         * statement.cs (Block): use bitfields for the three extra booleans
5241         we had in use.   Remove unused topblock parameter.
5242
5243         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5244
5245         * assign.cs: Drop extra unneeded tests.
5246
5247 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5248
5249         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5250
5251         * statement.cs (Foreach): Use VariableStorage instead of
5252         LocalBuilders.   
5253
5254         * codegen.cs (VariableStorage): New class used by clients that
5255         require a variable stored: locals or fields for variables that
5256         need to live across yield.
5257
5258         Maybe provide a convenience api for EmitThis+EmitLoad?
5259
5260         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5261         these bad boys.
5262
5263 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5264
5265         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5266         RemapParameterLValue): New methods that are used to turn a
5267         precomputed FieldInfo into an expression like this:
5268
5269                 instance.FieldInfo
5270
5271         The idea is to use this instead of making LocalVariableReference
5272         have more than one meaning.
5273
5274         * cs-parser.jay: Add error production to BASE.
5275
5276         * ecore.cs: Deal with TypeManager.GetField returning null, which
5277         is now a valid return value.
5278
5279         (FieldExprNoAddress): New expression for Fields whose address can
5280         not be taken.
5281
5282         * expression.cs (LocalVariableReference): During the resolve
5283         phases, create new expressions if we are in a remapping context.
5284         Remove code that dealt with remapping here.
5285
5286         (ParameterReference): same.
5287
5288         (ProxyInstance): New expression, like the `This' expression, but
5289         it is born fully resolved.  We know what we are doing, so remove
5290         the errors that are targeted to user-provided uses of `this'.
5291
5292         * statement.cs (Foreach): our variable is now stored as an
5293         Expression;  During resolution, follow the protocol, dont just
5294         assume it will return this.
5295
5296 2003-08-06  Martin Baulig  <martin@ximian.com>
5297
5298         * support.cs (SeekableStreamReader.cs): New public class.
5299
5300         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5301         SeekableStreamReader instead of the normal StreamReader.
5302
5303 2003-08-04  Martin Baulig  <martin@ximian.com>
5304
5305         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5306         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5307         deambiguate casts and delegate invocations.
5308         (parenthesized_expression): Use the new tokens to ensure this is
5309         not a cast of method invocation.
5310
5311         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5312         when reading a `)' and Deambiguate_CloseParens () was previously
5313         called.
5314
5315         * expression.cs (ParenthesizedExpression): New class.  This is
5316         just used for the CS0075 test.
5317         (Binary.DoResolve): Check for CS0075.   
5318
5319 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5320
5321         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5322         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5323         reference comparison.
5324
5325         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5326         examine the ReturnType for equality - this is necessary in the
5327         cases of implicit and explicit operators whose signature also
5328         includes the return type.
5329
5330 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5331
5332         * namespace.cs: Cache the result of the namespace computation,
5333         instead of computing it every time.
5334
5335 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5336
5337         * decl.cs: Use a global arraylist that we reuse over invocations
5338         to avoid excesive memory consumption.  Reduces memory usage on an
5339         mcs compile by one meg (45 average).
5340
5341         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5342         private, work around that.
5343
5344 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5345
5346         * literal.cs (IntLiteral): Define Zero and One static literals. 
5347
5348         * cs-parser.jay (integer_literal): use static literals to reduce
5349         memory usage for the most used literals (0, 1 and -1).  211kb
5350         reduced in memory usage.
5351
5352         Replace all calls to `new ArrayList' with `new
5353         ArrayList(4)' which is a good average number for most allocations,
5354         and also requires only 16 bytes of memory for its buffer by
5355         default. 
5356
5357         This reduced MCS memory usage in seven megabytes for the RSS after
5358         bootstrapping.
5359
5360 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5361
5362         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5363         handle params methods the correct way by forming only one
5364         applicable set with params and normal methods in them. Earlier we
5365         were looking at params methods only if we found no normal methods
5366         which was not the correct thing to do.
5367
5368         (Invocation.BetterFunction): Take separate arguments indicating
5369         when candidate and the best method are params methods in their
5370         expanded form.
5371
5372         This fixes bugs #43367 and #46199.
5373
5374         * attribute.cs: Documentation updates.
5375
5376         (CheckAttribute): Rename to CheckAttributeTarget.
5377         (GetValidPlaces): Rename to GetValidTargets.
5378
5379         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5380         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5381
5382         Fixes bug #44468.
5383
5384 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
5385
5386         * codegen.cs: Compute IsGeneric correctly.
5387
5388         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
5389         resolution. 
5390
5391         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
5392         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
5393         regressions, and I was chasing more bugs than I required.
5394
5395         * interface.cs: Use expressions for base type names (like classes
5396         and structs have been doing for a while now), and resolve that.
5397         This patch should probably go into head as well.
5398
5399         This makes it one less user of FindType.
5400
5401 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5402
5403         This compiler can not self host currently.  Need to fix that.
5404         
5405         * Makefile: compile to `gmcs.exe'
5406
5407         * driver.cs: Turn on v2 by default on gmcs.
5408
5409         * generic.cs (ConstructedType): Does no longer take a container
5410         type argument;  That will be taken care of later.
5411
5412         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
5413         Use SimpleName to resolve for now, so we can continue the work on
5414         the parser, until we get Type.GetType that understands generics.
5415
5416         (ConstructedType.ToString): Implement
5417
5418         (TypeArguments.Resolve): Resolve the child expressions as types. 
5419         
5420         * cs-parser.jay: Rename interface_constraints to
5421         type_parameter_constraints
5422
5423         (namespace_or_type_name): Only use constructed types for the basic
5424         construction, we will deal with identifier<...> later.
5425
5426         (type/type_name): No longer call DecomposeQI, as
5427         namespace_or_type_name is always decoded now.
5428         
5429 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5430
5431         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5432         closely: we eliminate methods in base types when we have an
5433         applicable method in a top-level type.
5434
5435         Please see section 14.5.5.1 for an exact description of what goes
5436         on. 
5437
5438         This fixes bug #45127 and a host of other related to corlib compilation.
5439
5440         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5441         array is the method corresponding to the top-level type (this is
5442         because of the changes made to icall.c) so we change this
5443         accordingly.
5444
5445         (MethodGroupExpr.Name): This too.
5446
5447         * typemanager.cs (GetElementType): New method which does the right
5448         thing when compiling corlib. 
5449
5450         * everywhere: Make use of the above in the relevant places.
5451
5452 2003-07-22  Martin Baulig  <martin@ximian.com>
5453
5454         * cs-parser.jay (invocation_expression): Moved
5455         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5456         `cast_expression', but create a InvocationOrCast which later
5457         resolves to either an Invocation or a Cast.
5458
5459         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5460         method; call this before EmitStatement() to make sure that this
5461         expression can be used as a statement.
5462
5463         * expression.cs (InvocationOrCast): New class; resolves to either
5464         an Invocation or a Cast.
5465
5466         * statement.cs (StatementExpression): Call ResolveStatement() on
5467         the ExpressionStatement before emitting it.
5468
5469 2003-07-21  Martin Baulig  <martin@ximian.com>
5470
5471         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5472         `ref' and `out' attributes match; fixes #46220.
5473         (MemberAccess.ResolveMemberAccess): You can't reference a type
5474         through an expression; fixes #33180.
5475         (Indexers.GetIndexersForType): Don't return the indexers from
5476         interfaces the class implements; fixes #46502.
5477
5478 2003-07-21  Martin Baulig  <martin@ximian.com>
5479
5480         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5481         CS0661 checks; fixes bug #30442.
5482
5483 2003-07-21  Martin Baulig  <martin@ximian.com>
5484
5485         * decl.cs (AdditionResult): Added `Error'.
5486
5487         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5488
5489         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
5490         cs0031.cs actually work.
5491
5492  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5493  
5494         * cs-parser.jay (namespace_name): do not use
5495         namespace_or_type_name, use qualified_identifier, because
5496         namespace_or_type_name will soon return a composed expression
5497         instead of a string.
5498  
5499         (namespace_or_type_name): Instead of returning a string, now this
5500         production returns an expression.
5501  
5502         * codegen.cs (EmitContext): Setup IsGeneric property based on
5503         whether our DeclSpace is generic, our the method is generic.
5504  
5505         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
5506         the method is generic.
5507  
5508         * cs-parser.jay (type_arguments, opt_type_argument_list,
5509         type_parameters, type_parameter_list, opt_type_parameter_list,
5510         type_parameter,, opt_type_parameter_constraints_clauses,
5511         type_parameter_constraints_clauses,
5512         type_parameter_constraint_clause, type_parameter_constraint,
5513         interface_constraints): Add new production
5514  
5515         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
5516         DeclSpace is generic or not.
5517  
5518         (DeclSpace.SetParameterInfo): New routine, used to set the
5519         parameter info for a type.
5520  
5521         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
5522         returns a GenericTypeExpr
5523  
5524         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
5525         generic, lookup the generic argument.
5526  
5527         * attribute.cs: Do not allow TypeParameterExpressions in
5528         Attributes.
5529  
5530         * class.cs: Do not allow the Main method to be defined in a
5531         Generic container.
5532  
5533         * expression.cs (SizeOf): Do not allow generic types to be used as
5534         arguments to sizeof.
5535  
5536         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
5537         it: whether a type is generic or not.  Only works for types we are
5538         currently building for now.
5539         
5540 2003-07-20  Martin Baulig  <martin@ximian.com>
5541
5542         * namespace.cs: Fixed that bug which caused a crash when compiling
5543         the debugger's GUI.
5544
5545 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5546
5547         * typemanager.cs (LookupTypeReflection): Never expose types which
5548         are NotPublic, NestedPrivate, NestedAssembly, or
5549         NestedFamANDAssem.  We used to return these, and later do a check
5550         that would report a meaningful error, but the problem is that we
5551         would not get the real match, if there was a name override.
5552
5553 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5554
5555         * namespace.cs (Namespace, Name): Do not compute the namespace
5556         name dynamically, compute it in the constructor.  This reduced
5557         memory usage by 1697 KB.
5558
5559         * driver.cs: Use --pause to pause at the end.
5560
5561 2003-07-17  Peter Williams  <peter@newton.cx>
5562
5563         * Makefile: Change the name of the test target so that it doesn't
5564         conflict with the recursive test target.
5565
5566 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5567
5568         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5569         AddressOf): Do not use EmitThis, that was wrong, use the actual
5570         this pointer.
5571
5572 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5573
5574         * class.cs (MethodData.Define): While checking if a method is an
5575         interface implementation, improve the test: If we are not public
5576         (use new test here: use the computed MethodAttributes directly,
5577         instead of the parsed modifier flags) check if the `implementing'
5578         method comes from an interface or not.
5579
5580         * pending.cs (VerifyPendingMethods): Slightly better error
5581         message.
5582
5583         * makefile: add test target that does the mcs bootstrap.
5584
5585 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5586
5587         * interface.cs (Define): Do nothing here since there are no
5588         members to populate etc. Move the attribute emission out of here
5589         since this was just totally the wrong place to put it. Attribute
5590         application happens during the 'Emit' phase, not in the 'Define'
5591         phase.
5592
5593         (Emit): Add this method and move the attribute emission here
5594
5595         * rootcontext.cs (EmitCode): Call the Emit method on interface
5596         types too.
5597
5598 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5599
5600         * expression.cs (OverloadResolve): Report error only if Location
5601         is not 'Null' which means that there was a probe going on.
5602
5603 2003-07-14  Martin Baulig  <martin@ximian.com>
5604
5605         * expression.cs (ConditionalLogicalOperator): New public class to
5606         implement user defined conditional logical operators.
5607         This is section 14.11.2 in the spec and bug #40505.
5608
5609 2003-07-14  Martin Baulig  <martin@ximian.com>
5610
5611         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5612
5613 2003-07-14  Martin Baulig  <martin@ximian.com>
5614
5615         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5616
5617         * ecore.cs (IVariable.VerifyFixed): New interface method.
5618
5619         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5620         operator, check whether the variable is actually fixed.  Fixes bug
5621         #36055.  Set a variable definitely assigned when taking its
5622         address as required by the spec.
5623
5624         * statement.cs (LocalInfo.IsFixed): New field.
5625         (LocalInfo.MakePinned): Set `IsFixed' to true.
5626
5627 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5628
5629         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5630         for .ctors, ensure that we only ask for members declared in the
5631         attribute type (BindingFlags.DeclaredOnly).
5632
5633         Fixes bug #43632.
5634
5635         * expression.cs (Error_WrongNumArguments): Report error 1501
5636         correctly the way CSC does.
5637
5638 2003-07-13  Martin Baulig  <martin@ximian.com>
5639
5640         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5641         lookup on the fully qualified name, to make things like "X.X" work
5642         where "X.X" is a fully qualified type name, but we also have a
5643         namespace "X" in the using list.  Fixes #41975.
5644
5645 2003-07-13  Martin Baulig  <martin@ximian.com>
5646
5647         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5648         function. If we're a CompoundAssign, we need to create an embedded
5649         CompoundAssign, not an embedded Assign.
5650         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5651         Fixes #45854.
5652
5653 2003-07-13  Martin Baulig  <martin@ximian.com>
5654
5655         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5656         work to fix bug #46088.
5657
5658 2003-07-13  Ravi Pratap <ravi@ximian.com>
5659
5660         * class.cs (Operator.Emit): Do not emit attributes here - it is
5661         taken care of by the Method class that we delegate too. This takes
5662         care of bug #45876.
5663
5664 2003-07-10  Martin Baulig  <martin@ximian.com>
5665
5666         * expression.cs (TypeOfVoid): New class.
5667         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5668
5669 2003-07-10  Martin Baulig  <martin@ximian.com>
5670
5671         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5672         bug #35957.
5673
5674 2003-07-10  Martin Baulig  <martin@ximian.com>
5675
5676         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5677         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5678
5679         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5680
5681         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5682
5683 2003-07-10  Martin Baulig  <martin@ximian.com>
5684
5685         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5686         of decimal.  Fixes #42850.
5687
5688         NOTE: I also fixed the created byte blob, but this doesn't work on
5689         the MS runtime and csc never produces any byte blobs for decimal
5690         arrays.
5691
5692 2003-07-10  Martin Baulig  <martin@ximian.com>
5693
5694         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5695         structs; fixes #32068.
5696         (Block.AddChildVariableNames): Fixed #44302.
5697
5698 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5699
5700         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5701
5702 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5703
5704         * attribute.cs: And this test is onger needed.
5705
5706 2003-07-08  Martin Baulig  <martin@ximian.com>
5707
5708         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5709         inaccessible types.  Fixes #36313.
5710
5711         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5712
5713         * namespace.cs (NamespaceEntry): Create implicit entries for all
5714         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5715         implicit entries for N1.N2 and N1.
5716
5717 2003-07-08  Martin Baulig  <martin@ximian.com>
5718
5719         Rewrote the handling of namespaces to fix a lot of the issues
5720         wrt. `using' aliases etc.
5721
5722         * namespace.cs (Namespace): Splitted this class into a
5723         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5724
5725         * typemanager.cs (TypeManager.IsNamespace): Removed.
5726         (TypeManager.ComputeNamespaces): Only compute namespaces from
5727         loaded assemblies here, not the namespaces from the assembly we're
5728         currently compiling.
5729
5730 2003-07-08  Martin Baulig  <martin@ximian.com>
5731
5732         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
5733
5734 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5735
5736         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
5737         already fixed it.  
5738
5739         I thought about the memory savings here, but LookupTypeReflection
5740         is used under already very constrained scenarios.  Compiling
5741         corlib or mcs only exposes one hit, so it would not really reduce
5742         any memory consumption.
5743
5744 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5745
5746         * typemanager.cs: fixes bug #45889 by only adding public types from
5747         other assemblies to the list of known types.
5748
5749 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5750
5751         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
5752         on the type we resolved.
5753
5754 2003-07-05  Martin Baulig  <martin@ximian.com>
5755
5756         * pending.cs (PendingImplementation.ParentImplements): Don't
5757         create the proxy if the parent is abstract.
5758
5759         * class.cs (TypeContainer.DefineIndexers): Process explicit
5760         interface implementations first.  Fixes #37714.
5761
5762 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5763
5764         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5765         defined recursively;  but since we modify the input parameters
5766         (left is set to `this' temporarily), we reset this value if the
5767         left_is_explicit is false, which gives the original semantics to
5768         the code.  
5769
5770         * literal.cs (NullPointer): new class used to represent a null
5771         literal in a pointer context.
5772
5773         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5774         type is a pointer, use a NullPointer object instead of a
5775         NullLiteral.   Closes 43687
5776
5777         (ExplicitConversion): Convert pointer values using
5778         the conv opcode to the proper type.
5779
5780         * ecore.cs (New): change ValueTypeVariable property into a method,
5781         that returns whether the valuetype is suitable for being used.
5782
5783         * expression.cs (Binary.DoNumericPromotions): Only return if we
5784         the int constant was a valid uint, and we can return both left and
5785         right as uints.  If not, we continue processing, to trigger the
5786         type conversion.  This fixes 39018.
5787
5788         * statement.cs (Block.EmitMeta): During constant resolution, set
5789         the CurrentBlock property on the emitcontext, so that we resolve
5790         constants propertly.
5791
5792 2003-07-02  Martin Baulig  <martin@ximian.com>
5793
5794         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5795         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5796
5797         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5798         than emitting it here.
5799
5800         * statement.cs: Fixed some more flow analysis bugs.
5801
5802 2003-07-02  Martin Baulig  <martin@ximian.com>
5803
5804         * class.cs (MethodData.Define): When implementing interface
5805         methods, set Final unless we're Virtual.
5806
5807         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5808         check work for interface methods.
5809
5810 2003-07-01  Martin Baulig  <martin@ximian.com>
5811
5812         * ecore.cs (EmitContext.This): Replaced this property with a
5813         GetThis() method which takes a Location argument.  This ensures
5814         that we get the correct error location for a CS0188.
5815
5816 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5817
5818         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5819         ImplicitStandardConversion.
5820
5821         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5822
5823 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5824
5825         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5826         optimization.
5827
5828 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5829
5830         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5831         constructors.
5832
5833         (MethodData.Define): Turn off initlocals for unsafe methods.
5834
5835 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5836
5837         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5838         complete;  Fixes #37521.
5839
5840         * delegate.cs: Use Modifiers.TypeAttr to compute the
5841         TypeAttributes, instead of rolling our own.  This makes the flags
5842         correct for the delegates.
5843
5844 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5845
5846         * class.cs (Constructor.Define): Set the private flag for static
5847         constructors as well.
5848
5849         * cs-parser.jay (statement_expression): Set the return value to
5850         null, to avoid a crash when we catch an error.
5851
5852 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5853
5854         * cs-parser.jay: Applied patch from Jackson that adds support for
5855         extern and unsafe modifiers to destructor declarations.
5856
5857         * expression.cs: Report error 21 if the user is trying to index a
5858         System.Array.
5859
5860         * driver.cs: Add an error message, suggested by the bug report.
5861
5862         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5863         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5864
5865 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5866
5867         * namespace.cs: Add some information to reduce FAQs.
5868
5869 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5870
5871         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5872         underlying enumeration types.  Fixes #43915.
5873
5874         * expression.cs: Treat ushort/short as legal values to be used in
5875         bitwise operations.
5876
5877 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5878
5879         * delegate.cs: transfer custom attributes for paramenters from
5880         the delegate declaration to Invoke and BeginInvoke.
5881
5882 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5883
5884         * attribute.cs: handle custom marshalers and emit marshal info
5885         for fields, too.
5886
5887 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5888
5889         * makefile.gnu: Added anonymous.cs to the compiler sources.
5890
5891 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
5892
5893         * iterators.cs: Change the name of the proxy class to include two
5894         underscores.
5895
5896         * cs-parser.jay: Update grammar to include anonymous methods.
5897
5898         * anonymous.cs: new file.
5899
5900 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
5901
5902         * class.cs (Field.Define): Add missing test for pointers and
5903         safety. 
5904
5905 2003-05-27  Ravi Pratap  <ravi@ximian.com>
5906
5907         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
5908         we use the stobj opcode.
5909
5910         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
5911         since it wasn't the correct fix. 
5912
5913         It still is puzzling that we are required to use stobj for IntPtr
5914         which seems to be a ValueType.
5915
5916 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
5917
5918         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
5919         during regular simple name resolution.   Now, the trick is that
5920         instead of returning for processing the simplename, we do a
5921         TypeManager.LookupType (ie, a rooted lookup as opposed to a
5922         contextual lookup type).   If a match is found, return that, if
5923         not, return for further composition.
5924
5925         This fixes long-standing 30485.
5926
5927         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5928         using the address to initialize an object, do an Stobj instead of
5929         using the regular Stelem.
5930
5931         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
5932         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
5933         Because if we are a BaseIndexerAccess that value will be true.
5934         Fixes 43643.
5935
5936         * statement.cs (GotoCase.Resolve): Return after reporting an
5937         error, do not attempt to continue. 
5938
5939         * expression.cs (PointerArithmetic.Emit): If our operand is a
5940         long, convert our constants to match the operand before
5941         multiplying.  Convert to I type before adding.   Fixes 43670.
5942
5943 2003-05-14  Ravi Pratap  <ravi@ximian.com>
5944
5945         * enum.cs (ImplicitConversionExists) : Rename to
5946         ImplicitEnumConversionExists to remove ambiguity. 
5947
5948         * ecore.cs (NullCast): New type of cast expression class which
5949         basically is very similar to EmptyCast with the difference being
5950         it still is a constant since it is used only to cast a null to
5951         something else
5952         (eg. (string) null)
5953
5954         * convert.cs (ImplicitReferenceConversion): When casting a null
5955         literal, we return a NullCast.
5956
5957         * literal.cs (NullLiteralTyped): Remove - I don't see why this
5958         should be around anymore.
5959
5960         The renaming (reported was slightly wrong). Corrections:
5961
5962         ConvertImplicitStandard -> ImplicitConversionStandard
5963         ConvertExplicitStandard -> ExplicitConversionStandard
5964
5965         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
5966         before passing them in !
5967
5968         * convert.cs (ImplicitConversionStandard): When comparing for
5969         equal expr and target types, ensure that expr is not a
5970         NullLiteral.
5971
5972         In general, we must not be checking (expr_type ==
5973         target_type) in the top level conversion methods
5974         (ImplicitConversion, ExplicitConversion etc). This checking is
5975         done in the methods that they delegate to.
5976
5977 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
5978
5979         * convert.cs: Move Error_CannotConvertType,
5980         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
5981         ImplicitNumericConversion, ImplicitConversionExists,
5982         ImplicitUserConversionExists, StandardConversionExists,
5983         FindMostEncompassedType, FindMostSpecificSource,
5984         FindMostSpecificTarget, ImplicitUserConversion,
5985         ExplicitUserConversion, GetConversionOperators,
5986         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
5987         TryImplicitIntConversion, Error_CannotConvertImplicit,
5988         ConvertImplicitRequired, ConvertNumericExplicit,
5989         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
5990         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
5991         its own file.
5992
5993         Perform the following renames:
5994
5995         StandardConversionExists -> ImplicitStandardConversionExists
5996         ConvertImplicit -> ImplicitConversion
5997         ConvertImplicitStandard -> ImplicitStandardConversion
5998         TryImplicitIntConversion -> ImplicitIntConversion
5999         ConvertImplicitRequired -> ImplicitConversionRequired
6000         ConvertNumericExplicit -> ExplicitNumericConversion
6001         ConvertReferenceExplicit -> ExplicitReferenceConversion
6002         ConvertExplicit -> ExplicitConversion
6003         ConvertExplicitStandard -> ExplicitStandardConversion
6004
6005 2003-05-19  Martin Baulig  <martin@ximian.com>
6006
6007         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6008         (TypeInfo): Added support for structs having structs as fields.
6009
6010         * ecore.cs (FieldExpr): Implement IVariable.
6011         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6012         VariableInfo for the field.
6013
6014 2003-05-18  Martin Baulig  <martin@ximian.com>
6015
6016         * expression.cs (This.DoResolve): Report a CS0027 if we're
6017         emitting a field initializer.
6018
6019 2003-05-18  Martin Baulig  <martin@ximian.com>
6020
6021         * expression.cs (This.ResolveBase): New public function.
6022         (This.DoResolve): Check for CS0188.
6023
6024         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6025         This.Resolve().
6026
6027         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6028         `instance_expression' to null if we don't have any non-static
6029         methods.
6030
6031 2003-05-18  Martin Baulig  <martin@ximian.com>
6032
6033         Reworked the way how local variables and parameters are handled by
6034         the flow analysis code.
6035
6036         * statement.cs (TypeInfo, VariableMap): New public classes.
6037         (VariableInfo): New public class.  This is now responsible for
6038         checking whether a variable has been assigned.  It is used for
6039         parameters and local variables.
6040         (Block.EmitMeta): Take the InternalParameters as argument; compute
6041         the layout of the flow vectors here.
6042         (Block.LocalMap, Block.ParameterMap): New public properties.
6043         (FlowBranching): The .ctor doesn't get the InternalParameters
6044         anymore since Block.EmitMeta() now computes the layout of the flow
6045         vector.
6046         (MyStructInfo): This class is now known as `StructInfo' and nested
6047         in `TypeInfo'; we don't access this directly anymore.
6048
6049         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6050         property and removed IsAssigned(), IsFieldAssigned(),
6051         SetAssigned() and SetFieldAssigned(); we now call them on the
6052         VariableInfo so we don't need to duplicate this code everywhere.
6053
6054         * expression.cs (ParameterReference): Added `Block block' argument
6055         to the .ctor.
6056         (LocalVariableReference, ParameterReference, This): The new
6057         VariableInfo class is now responsible for all the definite
6058         assignment stuff.
6059
6060         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6061         IsParameterAssigned, SetParameterAssigned): Removed.
6062
6063 2003-05-18  Martin Baulig  <martin@ximian.com>
6064
6065         * typemanager.cs (InitCoreTypes): Try calling
6066         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6067         the 3-args-version.  Corlib now also needs our `void_type'.
6068         (GetMethod): Added overloaded version which takes an optional
6069         `bool report_errors' to allow lookups of optional methods.
6070
6071 2003-05-12  Martin Baulig  <martin@ximian.com>
6072
6073         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6074         only used for locals and not for parameters.
6075
6076 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6077
6078         * support.cs (InternalParameters.ParameterType): Return the
6079         ExternalType of the parameter.
6080
6081         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6082         they were unused.
6083
6084 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6085
6086         * class.cs (MethodData.Define): Do not set the `newslot' on
6087         interface members, if they are also flagged as "override".
6088
6089         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6090         better code for ++i and i++.  This only works for static fields
6091         and local variables.
6092
6093         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6094         want to pull the DeclSpace out of the builder_to_declspace instead
6095         of the TypeBuilder (like in TypeContainer.FindMembers).
6096
6097         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6098         instead of LookupTypeContainer.  Fixes the crash on .NET for
6099         looking up interface members.
6100
6101         * const.cs: Create our own emit context during the Definition
6102         stage, so that constants are evaluated in the proper context, when
6103         a recursive definition happens.
6104
6105 2003-05-11  Martin Baulig  <martin@ximian.com>
6106
6107         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6108         new block for a switch section.
6109         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6110         the adding/lookup in the switch block.  Fixes #39828.
6111
6112 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6113
6114         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6115         functionality: I needed to convert the data after I had performed
6116         the add/sub operation into the operands type size.
6117
6118         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6119         pass the type for the box operation, otherwise the resulting
6120         object would have been of type object.
6121
6122         (BoxedCast): Add constructor to specify the type to box as.
6123
6124 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6125
6126         * iterators.cs: I was reusing the `count' variable inadvertently,
6127         take steps to not allow this to happen.
6128
6129 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6130
6131         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6132         by creating an array at the point where the params starts and
6133         putting all those arguments there, then adjusting the size of the
6134         array.
6135
6136 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6137
6138         * expression.cs (New.AddressOf): Implement interface
6139         IMemoryLocation.  This is used when the `new' operator is used in
6140         the context of an invocation to a method on a value type.
6141
6142         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6143         example. 
6144
6145         * namespace.cs: Also check the using aliases here.
6146
6147         * driver.cs: Move the test for using validity after the types have
6148         been entered, so we do a single pass that also includes the using
6149         aliases. 
6150
6151         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6152         in the regular case.   CreateSiblingForFinally is doing extra
6153         error checking.
6154
6155         * attribute.cs (GetAttributeArgumentExpression): Store the result
6156         on an out value, and use the return value to indicate failure
6157         instead of using null (which is a valid return for Constant.GetValue).
6158
6159         * statement.cs: Perform the analysis flow for the increment
6160         portion after the statement, because this will be the real flow of
6161         execution.  Fixes #42385
6162
6163         * codegen.cs (EmitContext.EmitArgument,
6164         EmitContext.EmitStoreArgument): New helper functions when the
6165         RemapToProxy flag is set.
6166
6167         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6168         function.
6169
6170         Add support for remapping parameters. 
6171
6172         * iterators.cs: Propagate parameter values;  Store parameter
6173         values in the proxy classes.
6174
6175 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6176
6177         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6178         need a proxy reference;  I do not know what I was thinking
6179
6180         * cs-parser.jay (constructor_initializer): catch another error,
6181         and display nice message.
6182
6183         (field_declaration): catch void field declaration
6184         to flag a better error. 
6185
6186         * class.cs (MemberBase.CheckBase): Report an error instead of a
6187         warning if a new protected member is declared in a struct. 
6188         (Field.Define): catch the error of readonly/volatile.
6189
6190         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6191
6192         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6193         volatile variable is taken
6194
6195 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6196
6197         * statement.cs (Fixed.Resolve): Report an error if we are not in
6198         an unsafe context.
6199
6200 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6201
6202         * typemanager.cs: reuse the code that handles type clashes for
6203         delegates and enumerations.
6204
6205         * class.cs (Report28): Always report.
6206
6207         * expression.cs (EncodeAsAttribute): Allow nulls here.
6208
6209 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6210
6211         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6212         the functionality for testing whether an expression is valid for
6213         an attribute here.  Also handle the case of arrays of elements
6214         being stored. 
6215
6216         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6217         encoding a linear array into an array of objects that are suitable
6218         to be passed to an CustomAttributeBuilder.
6219
6220         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6221
6222         * ecore.cs: (FieldExpr): Handle field remapping here.
6223
6224         * iteratators.cs: Pass the instance variable (if the method is an
6225         instance method) to the constructors, so we can access the field
6226         variables on the class.
6227
6228         TODO: Test this with structs.  I think the THIS variable on
6229         structs might have to be a pointer, and not a refenrece
6230
6231 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6232
6233         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6234         local variables to fields in a proxy class.
6235
6236         * iterators.cs (PopulateProxy): Rename our internal fields to
6237         <XXX>.  
6238         Create a <THIS> field if we are an instance method, so we can
6239         reference our parent container variables.
6240         (MapVariable): Called back from the EmitContext code to enter a
6241         new variable to field mapping into the proxy class (we just create
6242         a FieldBuilder).
6243
6244         * expression.cs
6245         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6246         for using the remapped locals to fields.
6247
6248         I placed the code here, because that gives the same semantics to
6249         local variables, and only changes the Emit code.
6250
6251         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6252         statements inside iterators.
6253         (VariableInfo): Add a FieldBuilder for the cases when we are
6254         remapping local variables to fields in a proxy class
6255
6256         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6257         current_block != null.
6258
6259         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6260         not cope with strings, as it has been moved to the
6261         TableSwitchEmit.  Fixed bug in switch generation.
6262
6263         * expression.cs (New.DoResolve): Provide more context for the user
6264         when reporting an error.
6265
6266         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6267         pointers. 
6268
6269         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6270         check the permissions for it.  Note than in a type-resolution
6271         context the check was already present in DeclSpace.ResolveType,
6272         but was missing from the MemberAccess.
6273
6274         (ArrayCreation.CheckIndices): warn if the user has
6275         more nested levels of expressions, but there are no more
6276         dimensions specified.  Avoids crash on bug 41906.
6277
6278 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6279
6280         * statement.cs (Block): replace Implicit bool, for a generic
6281         flags.   
6282         New flag: `Unchecked'.  This is used during the EmitMeta phase
6283         (which is out-of-line with the regular Resolve/Emit process for a
6284         statement, as this is done ahead of time, but still gets a chance
6285         to call constant resolve).
6286
6287         (Block.Flags): new enum for adding a new flag.
6288
6289         (Block.EmitMeta): track the state of unchecked.
6290
6291         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6292         to enable constant resolution to work there as well.
6293
6294 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6295
6296         * typemanager.cs (ienumerable_type): Also look up
6297         System.Collections.IEnumerable. 
6298
6299 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6300
6301         TODO: Test more than one conditional per method.
6302
6303         * class.cs (Indexer.Define): Report the location where the user is
6304         referencing the unsupported feature.
6305
6306         (MethodData): Overload the use of `conditionals' to
6307         minimize the creation of needless ArrayLists.   This saves roughly
6308         212kb on my machine.
6309
6310         (Method): Implement the new IIteratorContainer interface.
6311         (Method.SetYields): Implement the method by setting the ModFlags
6312         to contain METHOD_YIELDS.
6313
6314         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6315         which just got set to null.
6316
6317         * iterators.cs: New file.
6318
6319         (Yield, YieldBreak): New statements.
6320
6321         * statement.cs (Return.Resolve): Flag an error if we are used in
6322         an iterator method.
6323
6324         * codegen.cs (InIterator): New flag set if the code is being
6325         compiled in an iterator method.
6326
6327         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6328         internal modifier, and we just use it to avoid adding extra
6329         fields, as this is seldom used.  
6330
6331         * cs-parser.jay: Add yield_statement (yield and yield break).
6332
6333         * driver.cs: New flag -v2 to turn on version 2 features. 
6334
6335         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6336         hashtable when v2 is enabled.
6337
6338 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6339
6340         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6341         there is already a namespace defined with this name.
6342
6343         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6344         people upgraded their corlibs.
6345
6346         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6347         always use fully qualified types, no need to use the compiler
6348         front end.
6349
6350         (TypeManager.IsNamespace): Use binarysearch.
6351
6352         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6353         AddDelegate): I did not quite use the new IsValid API properly: I
6354         have to pass the short-name and the fullname.  I was passing only
6355         the basename instead of the fullname sometimes. 
6356
6357         (TypeContainer.DefineType): call NamespaceClash.
6358
6359         * interface.cs (Interface.DefineType): use NamespaceClash before
6360         defining the type.
6361
6362         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6363         defining the type.
6364
6365         * enum.cs: (Enum.DefineType): use NamespaceClash before
6366         defining the type.
6367
6368         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6369         speed increase.  First, use the negative_hits cache when we get a
6370         negative.  Second, add the type with its full original name
6371         instead of the new . and + encoded name (reflection uses + to
6372         separate type from a nested type).  Use LookupTypeReflection
6373         directly which bypasses the type->name hashtable (that we already
6374         know does not contain the type.
6375
6376         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6377         location/container type. 
6378
6379         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6380
6381 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6382
6383         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6384
6385         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6386         method is being referenced in the method group from a static
6387         context, and report error 120 if so.
6388
6389         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6390         Error118. 
6391
6392         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6393         is created, we create the A namespace).
6394
6395         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6396         Fixes #41591
6397
6398 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6399
6400         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6401         invocation to ModuleBuilder.GetType with the same values will
6402         return a new type instance, so we need to cache its return
6403         values. 
6404
6405         * expression.cs (Binary.ResolveOperator): Only allow the compare
6406         operators on enums if they are of the same type.
6407
6408         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6409         types of ValueType on their own case.  Before we were giving them
6410         the same treatment as objects.
6411
6412         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6413         fullname.  Short name is used to compare against container name.
6414         Fullname is used to check against defined namespace names.
6415
6416         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6417         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6418
6419         (Method.CheckBase): Call parent.
6420         (MemberBase.CheckBase): Check for protected members on sealed
6421         classes.
6422         (PropertyBase.CheckBase): Call parent.
6423         (Field.Define): Call parent.
6424
6425         * report.cs: Negative error codes are now mapped to 8000 - code,
6426         so that the display is render more nicely.
6427
6428         * typemanager.cs: Do not use try/catch, instead report a regular
6429         error. 
6430
6431         (GetPointerType, GetReferenceType): These methods provide
6432         mechanisms to obtain the T* and T& from a T.  We had the code
6433         previously scattered around the code base, and it also used
6434         TypeManager.LookupType that would go through plenty of caches.
6435         This one goes directly to the type source.
6436
6437         In some places we did the Type.GetType followed by
6438         ModuleBuilder.GetType, but not in others, so this unifies the
6439         processing as well.
6440
6441         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6442         statements now that we have namespace information.
6443
6444         * typemanager.cs (IsNamespace): New method, returns whether the
6445         string presented is a namespace or not.
6446
6447         (ComputeNamespaces): New public entry point, computes the list of
6448         available namespaces, using the GetNamespaces API call in Mono, or
6449         the slower version in MS.NET.   
6450
6451         Now before we start the semantic analysis phase, we have a
6452         complete list of namespaces including everything that the user has
6453         provided.
6454
6455         Deleted old code to cache namespaces in .nsc files.
6456
6457 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6458
6459         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6460         class/struct location definition Location for the implicit
6461         constructor location.
6462
6463         (Operator.Define): Use the location of the operator for the
6464         implicit Method definition.
6465
6466         (Constructor.Emit): use the constructor location for the implicit
6467         base initializer constructor.
6468
6469         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6470         and the Expression class now contains two new methods:
6471
6472         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6473         isolate type lookup from the rest of the resolution process.
6474
6475         Since we use Expressions to hold type definitions due to the way
6476         we parse the input we have historically overloaded Resolve to
6477         perform the Type lookups if a special flag is passed.  Now this is
6478         eliminated and two methods take their place. 
6479
6480         The differences in the two methods between xStep and xTerminal is
6481         that xStep is involved in our current lookup system that uses
6482         SimpleNames to compose a name, while xTerminal is used just to
6483         catch the case where the simplename lookup failed.
6484
6485 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6486
6487         * expression.cs (ResolveMemberAccess): Remove redundant code.
6488         TypeExpr expressions are always born fully resolved.
6489
6490         * interface.cs (PopulateMethod): Do not lookup the types twice.
6491         We were doing it once during SemanticAnalysis and once during
6492         PopulateMethod.
6493
6494         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6495         in local variable type definitions, were being returned as a
6496         SimpleName (we decomposed everything into a string), that is
6497         because primary_expression was being used instead of a type in the
6498         grammar (reduce/reduce conflicts).
6499
6500         The part that was wrong is that we converted the expression into a
6501         string (an oversimplification in one hand, compounded with primary
6502         expressions doing string concatenation).
6503
6504         So things like:
6505
6506         A.B.C [] x;
6507
6508         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6509         using clauses from working on this particular context.  And a type
6510         was being matched directly against "A.B.C[]".
6511
6512         We now use the correct approach, and allow for ComposedCast to be
6513         part of the unary expression.  So the "A.B.C []" become a composed
6514         cast of "A.B.C" (as a nested group of MemberAccess with a
6515         SimpleName at the end) plus the rank composition "[]". 
6516
6517         Also fixes 35567
6518
6519 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6520
6521         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6522         for the access level checking.
6523
6524         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6525         `TypeContainer container', because I kept getting confused when I
6526         was debugging this code.
6527
6528         * expression.cs (Indexers): Instead of tracking getters/setters,
6529         we now track them in parallel.  We create one arraylist less, but
6530         most importantly it is possible now for the LValue code to find a
6531         matching get for a set.
6532
6533         (IndexerAccess.DoResolveLValue): Update the code.
6534         GetIndexersForType has been modified already to extract all the
6535         indexers from a type.  The code assumed it did not.
6536
6537         Also make the code set the correct return type for the indexer.
6538         This was fixed a long time ago for properties, but was missing for
6539         indexers.  It used to be void_type.
6540
6541         (Binary.Emit): Test first for doubles instead of
6542         floats, as they are more common.
6543
6544         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6545         when dealing with floats and the <=, >= operators.  This fixes bug
6546         #39314 
6547
6548         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6549         to load the array value by emitting a load on the foreach variable
6550         type.  This was incorrect.  
6551
6552         We now emit the code to load an element using the the array
6553         variable type, and then we emit the conversion operator.
6554
6555         Fixed #40176
6556
6557 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6558
6559         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6560
6561 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6562
6563         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6564         test for protection before we test for signatures. 
6565
6566         (MethodSignature.ToString): implement.
6567
6568         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6569         to the case where we reduced into a LongConstant.
6570
6571         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6572         depend on whether the information is acurrate, because the
6573         Microsoft runtime will always claim that the array type is public,
6574         regardless of the real state.
6575
6576         If the type is a pointer, another problem happens: the type is
6577         reported as non-public in Microsoft.  
6578
6579         In both cases we have to call CheckAccessLevel recursively with
6580         the underlying type as the argument to be tested.
6581
6582 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6583
6584         * assign.cs (Assign.Emit): If we are dealing with a compound
6585         assignment expression, we should use the code path that stores the
6586         intermediate result in a temporary value.  This fixes #40903.
6587
6588         *expression.cs (Indirection.ToString): Provide ToString method for
6589         debugging. 
6590
6591 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6592
6593         * class.cs: Null out fields holding references to Block objects so
6594         they can be garbage collected.
6595
6596         * expression.cs (OverloadResolve): Remove unused local.
6597
6598 2003-04-07  Martin Baulig  <martin@ximian.com>
6599
6600         * codegen.cs (EmitContext.CurrentFile): New public field.
6601         (EmitContext.Mark): Use the CurrentFile to check whether the
6602         location is in the correct file.
6603         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6604
6605 2003-04-07  Martin Baulig  <martin@ximian.com>
6606
6607         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6608
6609         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6610         location.  [FIXME: The location argument which gets passed to this
6611         method is sometimes wrong!]
6612
6613 2003-04-07  Nick Drochak <ndrochak@gol.com>
6614
6615         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6616
6617 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6618
6619         * expression.cs (Indirection.EmitAssign): We were using the
6620         temporary, but returning immediately instead of continuing the
6621         EmitAssing flow.
6622
6623 2003-04-06  Martin Baulig  <martin@ximian.com>
6624
6625         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6626         if it's a nested child, but also deriving from the outer class.
6627         See test 190.cs.
6628
6629         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6630         nested child, but also deriving from the outer class.  See
6631         test-190.cs.
6632         (FilterWithClosure): We may access private members of the outer
6633         class if we're a nested child and deriving from the outer class.
6634         (RealMemberLookup): Only set `closure_private_ok' if the
6635         `original_bf' contained BindingFlags.NonPublic.
6636
6637 2003-04-05  Martin Baulig  <martin@ximian.com>
6638
6639         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
6640         probe if its a type parameter, and if so, flag an error.
6641
6642         * decl.cs: Move here the SetParameterInfo code from class.cs.
6643         Handle IsGeneric here.
6644
6645         Handle a variety of errors in the parameter info definition.
6646
6647         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
6648         type parameters here.
6649
6650         * cs-parser.jay (class_declaration): report errors for parameters
6651         here as well.
6652
6653 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
6654
6655         * generic.cs: New file, contains support code for generics.
6656
6657         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
6658         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
6659
6660         Update parser for the above removals.
6661
6662         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
6663         now taken care of in the parser.
6664
6665 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6666
6667         * class.cs (Event.Define): Do not allow abstract events to have
6668         initializers. 
6669
6670 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6671
6672         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6673         block in event declarations.
6674
6675         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6676         value type, get its address.
6677
6678         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6679         leaving a class on the stack instead of a boolean value (int
6680         0/1).  Change the code so we compare against null, and then the
6681         result against zero.
6682
6683         * class.cs (TypeContainer.GetClassBases): We were checking for the
6684         parent class being sealed too late.
6685
6686         * expression.cs (Binary.Emit): For <= and >= when dealing with
6687         floating point values, use cgt.un and clt.un instead of cgt and
6688         clt alone.
6689
6690 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6691
6692         * statement.cs: Apply the same optimization as MS: skip the 
6693         GetEnumerator returning an IEnumerator, and use the one returning a 
6694         CharEnumerator instead. This allows us to avoid the try-finally block 
6695         and the boxing.
6696
6697 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6698
6699         * cs-parser.jay: Attributes cannot be applied to
6700                          namespaces. Fixes #40473
6701
6702 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6703
6704         * class.cs:
6705         (Add*): check if the name is valid using the full name for constants,
6706         fields, properties and events.
6707
6708 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6709
6710         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6711         char constants to be part of the enumeration.
6712
6713         * expression.cs (Conditional.DoResolve): Add support for operator
6714         true. Implements the missing functionality from 14.12
6715
6716         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6717         operator true/false as required by the spec.
6718
6719         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6720         implicit conversion to boolean.
6721
6722         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6723         also one where the type implements `operator true'. 
6724
6725         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6726         get an expression that will invoke operator true based on an
6727         expression.  
6728
6729         (GetConversionOperators): Removed the hack that called op_True
6730         here.  
6731
6732         (Expression.ResolveBoolean): Move this from Statement.
6733
6734 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6735
6736         * ecore.cs (FieldExpr): do not allow initialization of initonly
6737         fields on derived classes
6738
6739 2003-03-13  Martin Baulig  <martin@ximian.com>
6740
6741         * statement.cs (Block.Emit): Call ig.BeginScope() and
6742         ig.EndScope() when compiling with debugging info; call
6743         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6744
6745 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6746
6747         * expression.cs (Indexers): Do not construct immediately, allow
6748         for new members to be appended as we go.  Fixes 38143
6749
6750 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6751
6752         * expression.cs: save/restore context when resolving an unchecked
6753         expression.
6754
6755 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6756
6757         * cfold.cs: Catch division by zero in modulus operator during
6758         constant folding.
6759
6760 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
6761
6762         * interface.cs (Interface.DefineMembers): Avoid defining members
6763         twice. 
6764
6765 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
6766
6767         * driver.cs: handle the +/- options for -noconfig
6768
6769         * statement.cs (Unckeched.Resolve): Also track the state of
6770         unchecked in the Resolve phase.
6771
6772 2003-02-27  Martin Baulig  <martin@ximian.com>
6773
6774         * ecore.cs (Expression.MemberLookup): Don't create a
6775         MethodGroupExpr for something which is not a method.  Fixes #38291.
6776
6777 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6778
6779         * class.cs (MemberBase.CheckParameters): Also check that the type
6780         is unmanaged if it is a pointer.
6781
6782         * expression.cs (SizeOf.Resolve): Add location information.
6783
6784         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6785         a managed type is declared.
6786
6787         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6788         parameter modifiers as well.  Fixes bug 38606
6789
6790         * class.cs: Very sad.  Am backing out the speed up changes
6791         introduced by the ArrayList -> Array in the TypeContainer, as they
6792         were not actually that much faster, and introduced a bug (no error
6793         reports on duplicated methods).
6794
6795         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6796         source first, this will guarantee that we have a valid expression
6797         before calling in lower levels functions that will require a
6798         resolved object.  Then use this original_source in the
6799         target.ResolveLValue instead of the original source that was
6800         passed to us.
6801
6802         Another change.  Use target.Resolve instead of LValueResolve.
6803         Although we are resolving for LValues, we will let the Assign code
6804         take care of that (it will be called again from Resolve).  This
6805         basically allows code like this:
6806
6807         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6808         class Y { void A (X x) { x [0] += o; }
6809
6810         The problem was that the indexer was trying to resolve for
6811         set_Item (idx, object o) and never finding one.  The real set_Item
6812         was set_Item (idx, X).  By delaying the process we get the right
6813         semantics. 
6814
6815         Fixes bug 36505
6816
6817 2003-02-23  Martin Baulig  <martin@ximian.com>
6818
6819         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6820         while calling DoEmit ().
6821
6822         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6823         source files; if you use the #line directive inside a method, the
6824         compiler stops emitting line numbers for the debugger until it
6825         reaches the end of the method or another #line directive which
6826         restores the original file.
6827
6828 2003-02-23  Martin Baulig  <martin@ximian.com>
6829
6830         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6831
6832 2003-02-23  Martin Baulig  <martin@ximian.com>
6833
6834         * statement.cs (Block.AddChildVariableNames): We need to call this
6835         recursively, not just for our immediate children.
6836
6837 2003-02-23  Martin Baulig  <martin@ximian.com>
6838
6839         * class.cs (Event.Define): Always make the field private, like csc does.
6840
6841         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6842         actually work, fixes bug #37521.
6843
6844 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6845
6846         * delegate.cs: When creating the various temporary "Parameters"
6847         classes, make sure that we call the ComputeAndDefineParameterTypes
6848         on those new parameters (just like we do with the formal ones), to
6849         allow them to be resolved in the context of the DeclSpace.
6850
6851         This fixes the bug that Dick observed in Bugzilla #38530.
6852
6853 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6854
6855         * expression.cs (ResolveMemberAccess): When resolving a constant,
6856         do not attempt to pull a constant if the value was not able to
6857         generate a valid constant.
6858
6859         * const.cs (LookupConstantValue): Do not report more errors than required.
6860
6861 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6862
6863         * expression.cs: fixes bug #38328.
6864
6865 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6866
6867         * class.cs: Changed all the various members that can be part of a
6868         class from being an ArrayList to be an Array of the right type.
6869         During the DefineType type_list, interface_list, delegate_list and
6870         enum_list are turned into types, interfaces, delegates and enums
6871         arrays.  
6872
6873         And during the member population, indexer_list, event_list,
6874         constant_list, field_list, instance_constructor_list, method_list,
6875         operator_list and property_list are turned into their real arrays.
6876
6877         Although we could probably perform this operation earlier, for
6878         good error reporting we need to keep the lists and remove the
6879         lists for longer than required.
6880
6881         This optimization was triggered by Paolo profiling the compiler
6882         speed on the output of `gen-sample-program.pl' perl script. 
6883
6884         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6885         not crash in methods like MemberLookupFailed that use this field.  
6886
6887         This problem arises when the compiler fails to resolve a type
6888         during interface type definition for example.
6889
6890 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6891
6892         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
6893         inherit from System.Object, so we have to stop at null, not only
6894         when reaching System.Object.
6895
6896 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
6897
6898         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
6899         DeclaredOnly because the parent indexer might have had a different
6900         name, but did not loop until the top of the hierarchy was reached.
6901
6902         The problem this one fixes is 35492: when a class implemented an
6903         indexer from an interface, we were getting the interface method
6904         (which was abstract) and we were flagging an error (can not invoke
6905         abstract method).
6906
6907         This also keeps bug 33089 functioning, and test-148 functioning.
6908
6909         * typemanager.cs (IsSpecialMethod): The correct way of figuring
6910         out if a method is special is to see if it is declared in a
6911         property or event, or whether it is one of the predefined operator
6912         names.   This should fix correctly #36804.
6913
6914 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
6915
6916         The goal here is to remove the dependency on EmptyCast.Peel ().
6917         Killing it completely.
6918
6919         The problem is that currently in a number of places where
6920         constants are expected, we have to "probe" for an EmptyCast, and
6921         Peel, which is not the correct thing to do, as this will be
6922         repetitive and will likely lead to errors. 
6923
6924         The idea is to remove any EmptyCasts that are used in casts that
6925         can be reduced to constants, so we only have to cope with
6926         constants. 
6927
6928         This bug hunt was triggered by Bug 37363 and the desire to remove
6929         the duplicate pattern where we were "peeling" emptycasts to check
6930         whether they were constants.  Now constants will always be
6931         constants.
6932
6933         * ecore.cs: Use an enumconstant here instead of wrapping with
6934         EmptyCast.  
6935
6936         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
6937         throwing me off.  By handling this we can get rid of a few hacks.
6938
6939         * statement.cs (Switch): Removed Peel() code.
6940
6941 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
6942
6943         * class.cs: Location information for error 508
6944
6945         * expression.cs (New.DoResolve): Add a guard against double
6946         resolution of an expression.  
6947
6948         The New DoResolve might be called twice when initializing field
6949         expressions (see EmitFieldInitializers, the call to
6950         GetInitializerExpression will perform a resolve on the expression,
6951         and later the assign will trigger another resolution
6952
6953         This leads to bugs (#37014)
6954
6955         * delegate.cs: The signature for EndInvoke should contain any ref
6956         or out parameters as well.  We were not doing this in the past. 
6957
6958         * class.cs (Field.Define): Do not overwrite the type definition
6959         inside the `volatile' group.  Turns out that volatile enumerations
6960         were changing the type here to perform a validity test, which
6961         broke conversions. 
6962
6963 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
6964
6965         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
6966         and structs, we do not want to load the instance variable
6967
6968         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
6969         enum_type has to be handled like an object reference (implicit
6970         conversions exists from this to object), but the regular IsClass
6971         and IsValueType tests will never return true for this one.
6972
6973         Also we use TypeManager.IsValueType instead of type.IsValueType,
6974         just for consistency with the rest of the code (this is only
6975         needed if we ever use the construct exposed by test-180.cs inside
6976         corlib, which we dont today).
6977
6978 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
6979
6980         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
6981         just InternalCall.
6982
6983 2003-02-09  Martin Baulig  <martin@ximian.com>
6984
6985         * namespace.cs (Namespace..ctor): Added SourceFile argument.
6986         (Namespace.DefineNamespaces): New static public method; this is
6987         called when we're compiling with debugging to add all namespaces
6988         to the symbol file.
6989
6990         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
6991         pass it to the Namespace's .ctor.
6992
6993         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
6994         and MethodBase arguments; pass the namespace ID to the symwriter;
6995         pass the MethodBase instead of the token to the symwriter.
6996         (SymbolWriter.DefineNamespace): New method to add a namespace to
6997         the symbol file.
6998
6999 2003-02-09  Martin Baulig  <martin@ximian.com>
7000
7001         * symbolwriter.cs: New file.  This is a wrapper around
7002         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7003         methods here in near future.
7004
7005 2003-02-09  Martin Baulig  <martin@ximian.com>
7006
7007         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7008         ILGenerator.MarkSequencePoint() which are actually used by the
7009         symbol writer.
7010
7011 2003-02-09  Martin Baulig  <martin@ximian.com>
7012
7013         * location.cs (SourceFile): New public sealed class.  This
7014         contains the name and an index which is used in the location's token.
7015         (Location): Reserve an appropriate number of bits in the token for
7016         the source file instead of walking over that list, this gives us a
7017         really huge performance improvement when compiling with debugging.
7018
7019         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7020         `SourceFile' argument instead of a string.
7021         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7022         but don't parse/tokenize here, we need to generate the list of all
7023         source files before we do that.
7024         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7025         the files.
7026
7027         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7028         instead of a string.
7029
7030         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7031         of a string.
7032
7033 2003-02-09  Martin Baulig  <martin@ximian.com>
7034
7035         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7036         filename on `#line default'.
7037
7038 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7039
7040         * statement.cs: don't clear the pinned var when the fixed statement
7041         returns from the method (fixes bug#37752).
7042
7043 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7044
7045         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7046         to IsValueType.
7047
7048 2003-02-07  Martin Baulig  <martin@ximian.com>
7049
7050         * driver.cs: Removed the `--debug-args' command line argument.
7051
7052         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7053         automatically by the AsssemblyBuilder.
7054         (CodeGen.InitializeSymbolWriter): We don't need to call any
7055         initialization function on the symbol writer anymore.  This method
7056         doesn't take any arguments.
7057
7058 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7059
7060         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7061         from referenced assemblies as well.
7062
7063 2003-02-02  Martin Baulig  <martin@ximian.com>
7064
7065         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7066
7067 2003-02-02  Martin Baulig  <martin@ximian.com>
7068
7069         * class.cs (Constructor.Emit): Open the symbol writer before
7070         emitting the constructor initializer.
7071         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7072         single-stepping through constructor initializers.
7073
7074 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7075
7076         * class.cs: Handle error 549: do not allow virtual methods in
7077         sealed classes. 
7078
7079 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7080
7081         * decl.cs: Check access levels when resolving types
7082
7083 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7084
7085         * statement.cs: Add parameters and locals set in catch blocks that might 
7086         return to set vector
7087
7088 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7089
7090         * class.cs (Operator): Set the SpecialName flags for operators.
7091
7092         * expression.cs (Invocation.DoResolve): Only block calls to
7093         accessors and operators on SpecialName methods.
7094
7095         (Cast.TryReduce): Handle conversions from char constants.
7096
7097
7098 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7099
7100         * statement.cs: small memory and time optimization in FlowBranching.
7101
7102 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7103
7104         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7105         problem that the last fix but in the other sid (Set).
7106
7107         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7108         access when there is no indexer in the hierarchy.
7109
7110 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7111
7112         * class.cs: Combine some if statements.
7113
7114 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7115
7116         * driver.cs: fixed bug #37187.
7117
7118 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7119
7120         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7121         any indexer, it's needed to build a list with all the indexers in the
7122         hierarchy (AllGetters), else we have problems. Fixes #35653.
7123
7124 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7125
7126         * class.cs (MethodData.Define): It is wrong for an interface
7127         implementation to be static in both cases: explicit and implicit.
7128         We were only handling this in one case.
7129
7130         Improve the if situation there to not have negations.
7131
7132         * class.cs (Field.Define): Turns out that we do not need to check
7133         the unsafe bit on field definition, only on usage.  Remove the test.
7134
7135 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7136
7137         * driver.cs: use assembly.Location instead of Codebase (the latest
7138         patch made mcs fail when using MS assemblies).
7139
7140 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7141
7142         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7143         get the path to *corlib.dll.
7144
7145 2003-01-21  Nick Drochak <ndrochak@gol.com>
7146
7147         * cs-tokenizer.cs:
7148         * pending.cs:
7149         * typemanager.cs: Remove compiler warnings
7150
7151 2003-01-20  Duncan Mak  <duncan@ximian.com>
7152
7153         * AssemblyInfo.cs: Bump the version number to 0.19.
7154
7155 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7156
7157         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7158
7159 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7160
7161         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7162
7163 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7164
7165         * cs-parser.jay: Small fix: we were not comparing the constructor
7166         name correctly.   Thanks to Zoltan for the initial pointer.
7167
7168 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7169
7170         * cs-tokenizer.cs: Set file name when specified with #line
7171
7172 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7173
7174         * cs-parser.jay: Only perform the constructor checks here if we
7175         are named like the class;  This will help provider a better
7176         error.  The constructor path is taken when a type definition is
7177         not found, but most likely the user forgot to add the type, so
7178         report that rather than the constructor error.
7179
7180 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7181
7182         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7183         allocations.
7184
7185 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7186
7187         * cs-parser.jay: Add cleanup call.
7188
7189 2003-01-13  Duncan Mak  <duncan@ximian.com>
7190
7191         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7192         consistent with other methods.
7193
7194 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7195
7196         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7197
7198 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7199
7200         * attribute.cs: only set GuidAttr to true when we have a
7201         GuidAttribute.
7202
7203 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7204
7205         * ecore.cs:
7206         * expression.cs:
7207         * typemanager.cs: fixes to allow mcs compile corlib with the new
7208         Type.IsSubclassOf fix.
7209
7210 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7211
7212         * expression.cs (LocalVariableReference.DoResolve): Classify a
7213         constant as a value, not as a variable.   Also, set the type for
7214         the variable.
7215
7216         * cs-parser.jay (fixed_statement): take a type instead of a
7217         pointer_type, so we can produce a better error message later.
7218
7219         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7220         as an error.  
7221
7222         (For.DoEmit): Make inifinite loops have a
7223         non-conditional branch back.
7224
7225         (Fixed.DoEmit): First populate the pinned variables, then emit the
7226         statement, then clear the variables.  Before I was emitting the
7227         code once for each fixed piece.
7228
7229
7230 2003-01-08  Martin Baulig  <martin@ximian.com>
7231
7232         * statement.cs (FlowBranching.MergeChild): A break in a
7233         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7234
7235 2003-01-08  Martin Baulig  <martin@ximian.com>
7236
7237         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7238         lives in the same number space than `param_map'.  Fixes #36154.
7239
7240 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7241
7242         * cs-parser.jay (constructor_declaration): Set the
7243         Constructor.ModFlags before probing for it.  This makes the
7244         compiler report 514, 515 and 132 (the code was there, but got
7245         broken). 
7246
7247         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7248         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7249         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7250
7251 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7252
7253         * enum.cs: create the enum static fields using the enum type.
7254
7255 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7256
7257         * class.cs: don't try to create the ParamBuilder for the return
7258         type if it's not needed (and handle it breaking for the ms runtime
7259         anyway).
7260
7261 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7262
7263         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7264
7265 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7266
7267         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7268         the command.   This showed up while compiling the JANET source
7269         code, which used \r as its only newline separator.
7270
7271 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7272
7273         * class.cs (Method.Define): If we are an operator (because it
7274         reuses our code), then set the SpecialName and HideBySig.  #36128
7275
7276 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7277
7278         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7279         exception, report error 120 `object reference required'.
7280
7281         * driver.cs: Add --pause option, used during to measure the size
7282         of the process as it goes with --timestamp.
7283
7284         * expression.cs (Invocation.DoResolve): Do not allow methods with
7285         SpecialName to be invoked.
7286
7287 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7288
7289         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7290         number before adding it.
7291
7292 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7293
7294         * ecore.cs (StandardImplicitConversion): When in an unsafe
7295         context, we allow conversion between void * to any other pointer
7296         type. This fixes bug #35973.
7297
7298 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7299
7300         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7301         is not thrown when extensionless outputs are used 
7302
7303 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7304
7305         * rootcontext.cs: fixed compilation of corlib.
7306
7307 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7308
7309         * attribute.cs (Attributes.Contains): Add new method.
7310
7311         * class.cs (MethodCore.LabelParameters): if the parameter is an
7312         `out' parameter, check that no attribute `[In]' has been passed.
7313
7314         * enum.cs: Handle the `value__' name in an enumeration.
7315
7316 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7317
7318         * decl.cs: Added special case to allow overrides on "protected
7319         internal" methods
7320
7321 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7322
7323         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7324         since it makes much more sense.
7325
7326         (Attributes.ctor): Don't require a Location parameter.
7327
7328         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7329
7330         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7331         since we already have that information per attribute.
7332
7333         * everywhere : make appropriate changes.
7334
7335         * class.cs (LabelParameters): Write the code which actually
7336         applies attributes to the return type. We can't do this on the MS
7337         .NET runtime so we flag a warning in the case an exception is
7338         thrown.
7339
7340 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7341
7342         * const.cs: Handle implicit null conversions here too.
7343
7344 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7345
7346         * class.cs (MethodCore.LabelParameters): Remove the extra
7347         Type [] parameter since it is completely unnecessary. Instead
7348         pass in the method's attributes so that we can extract
7349         the "return" attribute.
7350
7351 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7352
7353         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7354         of ignoring it and letting the compile continue.
7355
7356         * typemanager.cs (ChangeType): use an extra argument to return an
7357         error condition instead of throwing an exception.
7358
7359 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7360
7361         * expression.cs (Unary.TryReduce): mimic the code for the regular
7362         code path.  Perform an implicit cast in the cases where we can
7363         implicitly convert to one of the integral types, and then reduce
7364         based on that constant.   This fixes bug #35483.
7365
7366 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7367
7368         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7369
7370 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7371
7372         * namespace.cs: fixed bug #35489.
7373
7374 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7375
7376         * class.cs: Remove some dead code.
7377
7378         * cs-parser.jay: Estimate the number of methods needed
7379         (RootContext.MethodCount);
7380
7381         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7382         numbers instead of StringBuilders.
7383
7384         * support.cs (PtrHashtable): Add constructor with initial size;
7385         We can now reduce reallocations of the method table.
7386
7387 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7388
7389         * attribute.cs (ApplyAttributes): Keep track of the emitted
7390         attributes on a per-target basis. This fixes bug #35413.
7391
7392 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7393
7394         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7395         default to the Windows 1252 encoding.
7396
7397         (UnixParseOption): Support version, thanks to Alp for the missing
7398         pointer. 
7399
7400         * AssemblyInfo.cs: Add nice assembly information.
7401
7402         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7403         (bug 35169).
7404
7405         * cs-parser.jay: Allow a trailing comma before the close bracked
7406         in the attribute_section production.
7407
7408         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7409         address of the instance was being taken, I will take this out,
7410         because we take the address of the object immediately here.
7411
7412 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7413
7414         * typemanager.cs (AreMultipleAllowed): Take care of the most
7415         obvious case where attribute type is not in the current assembly -
7416         stupid me ;-)
7417
7418 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7419
7420         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7421         definitions, instead of doing that afterwards.  
7422
7423         Also we use a nice little hack, depending on the constructor, we
7424         know if we are a "composed" name or a simple name.  Hence, we
7425         avoid the IndexOf test, and we avoid 
7426
7427         * codegen.cs: Add code to assist in a bug reporter to track down
7428         the source of a compiler crash. 
7429
7430 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7431
7432         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7433         types have been emitted for a given element and flag an error
7434         if something which does not have AllowMultiple set is used more
7435         than once.
7436
7437         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7438         attribute types and their corresponding AllowMultiple properties
7439
7440         (AreMultipleAllowed): Check the property for a given type.
7441
7442         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7443         property in the case we have a TypeContainer.
7444
7445         (Attributes.AddAttribute): Detect duplicates and just skip on
7446         adding them. This trivial fix catches a pretty gross error in our
7447         attribute emission - global attributes were being emitted twice!
7448
7449         Bugzilla bug #33187 is now fixed.
7450
7451 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7452
7453         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7454         instead of pp_and).
7455
7456         * expression.cs (Binary.ResolveOperator): I can only use the
7457         Concat (string, string, string) and Concat (string, string,
7458         string, string) if the child is actually a concatenation of
7459         strings. 
7460
7461 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7462
7463         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7464         context where we need a 2-character lookahead.
7465
7466         * pending.cs (PendingImplementation): Rework so we can keep track
7467         of interface types all the time, and flag those which were
7468         implemented by parents as optional.
7469
7470 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7471
7472         * expression.cs (Binary.ResolveOperator): Use
7473         String.Concat(string,string,string) or
7474         String.Concat(string,string,string,string) when possible. 
7475
7476         * typemanager: More helper methods.
7477
7478
7479 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7480
7481         * pending.cs: remove the bogus return from GetMissingInterfaces()
7482         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7483
7484 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7485
7486         * namespace.cs: avoid duplicated 'using xxx' being added to
7487         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7488         when we get more than one 'using' statement for the same namespace.
7489         Report a CS0105 warning for it.
7490
7491 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7492
7493         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7494         of calling getChar/putback, uses internal knowledge of it.    
7495
7496         (xtoken): Reorder tokenizer so most common patterns are checked
7497         first.  This reduces the compilation time in another 5% (from 8.11s
7498         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7499
7500         The parsing time is 22% of the compilation in mcs, and from that
7501         64% is spent on the tokenization process.  
7502
7503         I tried using a binary search for keywords, but this is slower
7504         than the hashtable.  Another option would be to do a couple of
7505         things:
7506
7507                 * Not use a StringBuilder, instead use an array of chars,
7508                   with a set value.  Notice that this way we could catch
7509                   the 645 error without having to do it *afterwards*.
7510
7511                 * We could write a hand-parser to avoid the hashtable
7512                   compares altogether.
7513
7514         The identifier consumption process takes 37% of the tokenization
7515         time.  Another 15% is spent on is_number.  56% of the time spent
7516         on is_number is spent on Int64.Parse:
7517
7518                 * We could probably choose based on the string length to
7519                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7520                   computations. 
7521
7522         Another 3% is spend on wrapping `xtoken' in the `token' function.
7523
7524         Handle 0xa0 as whitespace (#34752)
7525
7526 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7527
7528         * typemanager.cs (IsCLRType): New routine to tell whether a type
7529         is one of the builtin types.  
7530
7531         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7532         typecode in more places instead of doing pointer comparissions.
7533         We could leverage some knowledge about the way the typecodes are
7534         laid out.
7535
7536         New code to cache namespaces in assemblies, it is currently not
7537         invoked, to be used soon.
7538
7539         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7540
7541         * expression.cs (Binary.ResolveOperator): specially handle
7542         strings, and do not perform user-defined operator overloading for
7543         built-in types.
7544
7545 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7546
7547         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7548         internalcall as it is a pretty simple operation;  Avoid whenever
7549         possible to call Char.IsLetter.
7550
7551         (consume_identifier): Cut by half the number of
7552         hashtable calls by merging the is_keyword and GetKeyword behavior.
7553
7554         Do not short-circuit, because if we do, we
7555         report errors (ie, #if false && true would produce an invalid
7556         directive error);
7557
7558
7559 2002-11-24  Martin Baulig  <martin@ximian.com>
7560
7561         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7562         check constant ranges and report a CS0221.  Fixes #33186.
7563
7564 2002-11-24  Martin Baulig  <martin@ximian.com>
7565
7566         * cs-parser.jay: Make this work for uninitialized variable
7567         declarations in the `for' initializer.  Fixes #32416.
7568
7569 2002-11-24  Martin Baulig  <martin@ximian.com>
7570
7571         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7572         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7573
7574 2002-11-24  Martin Baulig  <martin@ximian.com>
7575
7576         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7577         argument; if true, we also check for user-defined conversions.
7578         This is only needed if both arguments are of a user-defined type.
7579         Fixes #30443, added test-175.cs.
7580         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7581
7582         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7583
7584 2002-11-24  Martin Baulig  <martin@ximian.com>
7585
7586         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7587         function to get the store opcode.
7588         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7589         only emit the Ldelema if the store opcode is Stobj.  You must run
7590         both test-34 and test-167 to test this.  Fixes #34529.
7591
7592 2002-11-23  Martin Baulig  <martin@ximian.com>
7593
7594         * ecore.cs (Expression.MemberLookup): Added additional
7595         `qualifier_type' argument which is used when we're being called
7596         from MemberAccess.DoResolve() and null if we're called from a
7597         SimpleName lookup.
7598         (Expression.MemberLookupFailed): New method to report errors; this
7599         does the CS1540 check and reports the correct error message.
7600
7601         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7602         argument for the CS1540 check and redone the way how we're dealing
7603         with private members.  See the comment in the source code for details.
7604         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7605         `closure_start_type' to `closure_qualifier_type' and check whether
7606         it's not null.  It was not this filter being broken, it was just
7607         being called with the wrong arguments.
7608
7609         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7610         and pass it the correct `qualifier_type'; this also does the error
7611         handling for us.
7612
7613 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7614
7615         * expression.cs (Invocation.EmitParams): If the we are dealing
7616         with a non-built-in value type, load its address as well.
7617
7618         (ArrayCreation): Use a a pretty constant instead
7619         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7620         static initializers.  
7621
7622         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7623         because they are not really value types, just glorified integers. 
7624
7625         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7626
7627         * ecore.cs: Remove redundant code for enumerations, make them use
7628         the same code path as everything else, fixes the casting issue
7629         with enumerations in Windows.Forms.
7630
7631         * attribute.cs: Do only cast to string if it is a string, the
7632         validation happens later.
7633
7634         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7635         people upgrade their corlibs.
7636
7637         * ecore.cs: Oops, enumerations were not following the entire code path
7638
7639 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7640
7641         * typemanager.cs (FilterWithClosure): Commented out the test for
7642         1540 in typemanager.cs, as it has problems when accessing
7643         protected methods from a parent class (see test-174.cs). 
7644
7645         * attribute.cs (Attribute.ValidateGuid): new method.
7646         (Attribute.Resolve): Use above.
7647
7648 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7649
7650         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7651
7652         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7653         handling for enumerations, as we only needed the TypeContainer
7654         functionality to begin with (this is required for the fix below to
7655         work for enums that reference constants in a container class for
7656         example). 
7657
7658         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7659
7660         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7661         a valid TypeBuilder to perform lookups on.o
7662
7663         * class.cs (InheritableMemberSignatureCompare): Use true in the
7664         call to GetGetMethod and GetSetMethod, because we are comparing
7665         the signature, and we need to get the methods *even* if they are
7666         private. 
7667
7668         (PropertyBase.CheckBase): ditto.
7669
7670         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7671         GotoCase.Resolve): Use Peel on EmpytCasts.
7672
7673         * ecore.cs (EmptyCast): drop child, add Peel method.
7674
7675 2002-11-17  Martin Baulig  <martin@ximian.com>
7676
7677         * ecore.cs (EmptyCast.Child): New public property.
7678
7679         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7680         label resolved to an EmptyCast.  Fixes #34162.
7681         (GotoCase.Resolve): Likewise.
7682         (Block.EmitMeta): Likewise.
7683
7684 2002-11-17  Martin Baulig  <martin@ximian.com>
7685
7686         * expression.cs (Invocation.BetterConversion): Prefer int over
7687         uint; short over ushort; long over ulong for integer literals.
7688         Use ImplicitConversionExists instead of StandardConversionExists
7689         since we also need to check for user-defined implicit conversions.
7690         Fixes #34165.  Added test-173.cs.
7691
7692 2002-11-16  Martin Baulig  <martin@ximian.com>
7693
7694         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7695         with the `true' and `false' literals.  Fixes #33151.
7696
7697 2002-11-16  Martin Baulig  <martin@ximian.com>
7698
7699         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7700         October 22nd; don't do the cs1540 check for static members.
7701
7702         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7703         now using our own filter here and doing the cs1540 check again.
7704
7705 2002-11-16  Martin Baulig  <martin@ximian.com>
7706
7707         * support.cs (InternalParameters): Don't crash if we don't have
7708         any fixed parameters.  Fixes #33532.
7709
7710 2002-11-16  Martin Baulig  <martin@ximian.com>
7711
7712         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7713         when looking up static methods to make this work on Windows.
7714         Fixes #33773.
7715
7716 2002-11-16  Martin Baulig  <martin@ximian.com>
7717
7718         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7719         a setter rather than using PropertyInfo.CanWrite.
7720
7721 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7722
7723         * class.cs: Allow acces to block member by subclasses. Fixes build
7724         breaker.
7725
7726 2002-11-14  Martin Baulig  <martin@ximian.com>
7727
7728         * class.cs (Constructor.Emit): Added the extern/block check.
7729         Fixes bug #33678.
7730
7731 2002-11-14  Martin Baulig  <martin@ximian.com>
7732
7733         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7734         iteration while looking for indexers, this is needed because the
7735         indexer may have a different name in our base classes.  Fixed the
7736         error reporting (no indexers at all, not get accessor, no
7737         overloaded match).  Fixes bug #33089.
7738         (IndexerAccess.DoResolveLValue): Likewise.
7739
7740 2002-11-14  Martin Baulig  <martin@ximian.com>
7741
7742         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7743         indexers.  Fixes the first part of bug #33089.
7744         (MethodSignature.InheritableMemberSignatureCompare): Added support
7745         for properties.
7746
7747 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7748
7749         * attribute.cs (Attribute.Resolve): Catch the
7750         NullReferenceException and report it since it isn't supposed to
7751         happen. 
7752
7753 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7754
7755         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7756         LogicalOr and LogicalAnd that can benefit from recursively
7757         handling EmitBranchable.  The code now should be nice for Paolo.
7758
7759 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
7760
7761         * typemanager.cs (LookupType): Added a negative-hit hashtable for
7762         the Type lookups, as we perform quite a number of lookups on
7763         non-Types.  This can be removed once we can deterministically tell
7764         whether we have a type or a namespace in advance.
7765
7766         But this might require special hacks from our corlib.
7767
7768         * TODO: updated.
7769
7770         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
7771         and double which avoids a conversion from an integer to a double.
7772
7773         * expression.cs: tiny optimization, avoid calling IsConstant,
7774         because it effectively performs the lookup twice.
7775
7776 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
7777
7778         But a bogus return here to keep the semantics of the old code
7779         until the Mono runtime is fixed.
7780
7781         * pending.cs (GetMissingInterfaces): New method used to remove all
7782         the interfaces that are already implemented by our parent
7783         classes from the list of pending methods. 
7784
7785         * interface.cs: Add checks for calls after ResolveTypeExpr.
7786
7787 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7788
7789         * class.cs (Class.Emit): Report warning 67: event not used if the
7790         warning level is beyond 3.
7791
7792         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7793         being a NullLiteral.
7794
7795         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7796         specifiers. 
7797
7798         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7799         path that might fail if a type can not be resolved.
7800
7801         * expression.cs (Binary.Emit): Emit unsigned versions of the
7802         operators. 
7803
7804         * driver.cs: use error 5.
7805
7806 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7807
7808         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7809
7810 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7811
7812         * cs-parser.jay (switch_section): A beautiful patch from Martin
7813         Baulig that fixed 33094.
7814
7815 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7816
7817         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7818         Check whether the base is abstract and report an error if so.
7819
7820         * expression.cs (IndexerAccess.DoResolveLValue,
7821         IndexerAccess.DoResolve): ditto. 
7822
7823         (Invocation.DoResolve): ditto.
7824
7825         (Invocation.FullMethodDesc): Improve the report string.
7826
7827         * statement.cs (Block): Eliminate IsVariableDefined as it is
7828         basically just a wrapper for GetVariableInfo.
7829
7830         * ecore.cs (SimpleName): Use new 
7831
7832         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7833         type, as we return the actual parameter ref/unref state on a
7834         different call.
7835
7836 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7837
7838         * support.cs: Return proper flags REF/OUT fixing the previous
7839         commit.  
7840
7841         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7842         not used to mean `ref' but `ref or out' in ParameterReference
7843
7844         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7845         full type signature instead of calling TypeManger.CSharpName
7846         ourselves. 
7847
7848         * support.cs (InternalParameters.ParameterDesc): Do not compare
7849         directly to the modflags, because REF/OUT will actually be bitsets
7850         if set. 
7851
7852         * delegate.cs (VerifyMethod): Check also the modifiers.
7853
7854         * cs-tokenizer.cs: Fix bug where floating point values with an
7855         exponent where a sign was missing was ignored.
7856
7857         * driver.cs: Allow multiple assemblies to be specified in a single
7858         /r: argument
7859
7860 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7861
7862         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7863         because identifiers after a parenthesis would end up in this kind
7864         of production, and we needed to desamiguate it for having casts
7865         like:
7866
7867                 (UserDefinedType *) xxx
7868
7869 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7870
7871         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7872         we should set on the Bindingflags.NonPublic, but not turn on
7873         private_ok.  private_ok controls whether a Private member is
7874         returned (this is chekced on the filter routine), while the
7875         BindingFlags.NonPublic just controls whether private/protected
7876         will be allowed.   This fixes the problem part of the problem of
7877         private properties being allowed to be used in derived classes.
7878
7879         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7880         so we can call the children DoResolveLValue method (this will
7881         properly signal errors on lvalue assignments to base properties)
7882
7883         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7884         getter are null, and we have a property info, we know that this
7885         happened because the lookup failed, so we report an error 122 for
7886         protection level violation.
7887
7888         We also silently return if setter and getter are null in the
7889         resolve functions, this condition only happens if we have flagged
7890         the error before.  This is the other half of the problem. 
7891
7892         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
7893         not have accessibility information, that is why we were returning
7894         true in the filter function in typemanager.cs.
7895
7896         To properly report 122 (property is inaccessible because of its
7897         protection level) correctly, we report this error in ResolveAccess
7898         by failing if both the setter and the getter are lacking (ie, the
7899         lookup failed). 
7900
7901         DoResolve and DoLResolve have been modified to check for both
7902         setter/getter being null and returning silently, the reason being
7903         that I did not want to put the knowledge about this error in upper
7904         layers, like:
7905
7906         int old = Report.Errors;
7907         x = new PropertyExpr (...);
7908         if (old != Report.Errors)
7909                 return null;
7910         else
7911                 return x;
7912
7913         So the property expr is returned, but it is invalid, so the error
7914         will be flagged during the resolve process. 
7915
7916         * class.cs: Remove InheritablePropertySignatureCompare from the
7917         class, as we no longer depend on the property signature to compute
7918         whether it is possible to implement a method or not.
7919
7920         The reason is that calling PropertyInfo.GetGetMethod will return
7921         null (in .NET, in Mono it works, and we should change this), in
7922         cases where the Get Method does not exist in that particular
7923         class.
7924
7925         So this code:
7926
7927         class X { public virtual int A { get { return 1; } } }
7928         class Y : X { }
7929         class Z : Y { public override int A { get { return 2; } } }
7930
7931         Would fail in Z because the parent (Y) would not have the property
7932         defined.  So we avoid this completely now (because the alternative
7933         fix was ugly and slow), and we now depend exclusively on the
7934         method names.
7935
7936         (PropertyBase.CheckBase): Use a method-base mechanism to find our
7937         reference method, instead of using the property.
7938
7939         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
7940         routines are gone now.
7941
7942         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
7943         names, they were incorrectly named.
7944
7945         * cs-tokenizer.cs: Return are more gentle token on failure. 
7946
7947         * pending.cs (PendingImplementation.InterfaceMethod): This routine
7948         had an out-of-sync index variable, which caused it to remove from
7949         the list of pending methods the wrong method sometimes.
7950
7951 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
7952
7953         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
7954         CanWrite, because those refer to this particular instance of the
7955         property, and do not take into account the fact that we can
7956         override single members of a property.
7957
7958         Constructor requires an EmitContext.  The resolution process does
7959         not happen here, but we need to compute the accessors before,
7960         because the resolution does not always happen for properties.
7961
7962         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
7963         subclass, before we did not update this flag, but we did update
7964         bindingflags. 
7965
7966         (GetAccessors): Drop this routine, as it did not work in the
7967         presence of partially overwritten set/get methods. 
7968
7969         Notice that this broke the cs1540 detection, but that will require
7970         more thinking. 
7971
7972 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7973
7974         * class.cs:
7975         * codegen.cs:
7976         * driver.cs: issue a warning instead of an error if we don't support
7977         debugging for the platform. Also ignore a couple of errors that may
7978         arise when trying to write the symbols. Undo my previous patch.
7979
7980 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7981
7982         * driver.cs: ignore /debug switch except for Unix platforms.
7983
7984 2002-10-23  Nick Drochak  <ndrochak@gol.com>
7985
7986         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
7987
7988 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
7989
7990         * driver.cs: Do not make mcs-debug conditional, so we do not break
7991         builds that use it.
7992
7993         * statement.cs (UsageVector.MergeChildren): I would like Martin to
7994         review this patch.  But basically after all the children variables
7995         have been merged, the value of "Breaks" was not being set to
7996         new_breaks for Switch blocks.  I think that it should be set after
7997         it has executed.  Currently I set this to the value of new_breaks,
7998         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
7999         conservative, but I do not understand this code very well.
8000
8001         I did not break anything in the build, so that is good ;-)
8002
8003         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8004
8005 2002-10-20  Mark Crichton  <crichton@gimp.org>
8006
8007         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8008
8009 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8010
8011         * cfold.cs: Fixed compile blocker.
8012
8013 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8014
8015         * driver.cs: I was chekcing the key, not the file.
8016
8017 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8018
8019         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8020         message that we were generating - we just need to silently return
8021         a null.
8022
8023 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8024
8025         * class.cs (Event.Define): Change my previous commit, as this
8026         breaks the debugger.  This is a temporary hack, as it seems like
8027         the compiler is generating events incorrectly to begin with.
8028
8029         * expression.cs (Binary.ResolveOperator): Added support for 
8030         "U operator - (E x, E y)"
8031
8032         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8033         y)".
8034
8035         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8036         init-only variables, but this path did not take into account that
8037         there might be also instance readonly variables.  Correct this
8038         problem. 
8039
8040         This fixes bug 32253
8041
8042         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8043         delegates as well.
8044
8045         * driver.cs: Change the extension for modules to `netmodule'
8046
8047         * cs-parser.jay: Improved slightly the location tracking for
8048         the debugger symbols.
8049
8050         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8051         modifiers that were specified instead of the hardcoded value
8052         (FamAndAssem).  This was basically ignoring the static modifier,
8053         and others.  Fixes 32429.
8054
8055         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8056         fixed a bug in the process (32476)
8057
8058         * expression.cs (ArrayAccess.EmitAssign): Patch from
8059         hwang_rob@yahoo.ca that fixes bug 31834.3
8060
8061 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8062
8063         * driver.cs: Make the module extension .netmodule.
8064
8065 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8066
8067         * driver.cs: Report an error if the resource file is not found
8068         instead of crashing.
8069
8070         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8071         false, like Emit does.
8072
8073 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8074
8075         * typemanager.cs: Remove unused private member.  Also reported mcs
8076         bug to report this as a warning like csc.
8077
8078 2002-10-15  Martin Baulig  <martin@gnome.org>
8079
8080         * statement.cs (Statement.Emit): Made this a virtual method; emits
8081         the line number info and calls DoEmit().
8082         (Statement.DoEmit): New protected abstract method, formerly knows
8083         as Statement.Emit().
8084
8085         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8086
8087 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8088
8089         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8090         have fixed a remaining problem: not every AddXXXX was adding a
8091         fully qualified name.  
8092
8093         Now everyone registers a fully qualified name in the DeclSpace as
8094         being defined instead of the partial name.  
8095
8096         Downsides: we are slower than we need to be due to the excess
8097         copies and the names being registered this way.  
8098
8099         The reason for this is that we currently depend (on the corlib
8100         bootstrap for instance) that types are fully qualified, because
8101         we dump all the types in the namespace, and we should really have
8102         types inserted into the proper namespace, so we can only store the
8103         basenames in the defined_names array.
8104
8105 2002-10-10  Martin Baulig  <martin@gnome.org>
8106
8107         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8108         from bug #31834, see the bug report for a testcase which is
8109         miscompiled.
8110
8111 2002-10-10  Martin Baulig  <martin@gnome.org>
8112
8113         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8114         flow analysis code for this.
8115
8116         * statement.cs (Do, While, For): Tell the flow analysis code about
8117         infinite loops.
8118         (FlowBranching.UsageVector): Added support for infinite loops.
8119         (Block.Resolve): Moved the dead code elimination here and use flow
8120         analysis to do it.
8121
8122 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8123
8124         * class.cs (Field.Define): Catch cycles on struct type
8125         definitions. 
8126
8127         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8128         fields if the fields are static.  We only need to check instance
8129         fields. 
8130
8131         * expression.cs (As.DoResolve): Test for reference type.
8132
8133         * statement.cs (Using.ResolveExpression): Use
8134         ConvertImplicitRequired, not ConvertImplicit which reports an
8135         error on failture
8136         (Using.ResolveLocalVariableDecls): ditto.
8137
8138         * expression.cs (Binary.ResolveOperator): Report errors in a few
8139         places where we had to.
8140
8141         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8142
8143 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8144
8145         * expression.cs: Use StoreFromPtr instead of extracting the type
8146         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8147
8148         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8149         an enumeration value to a System.Enum, but System.Enum is not a
8150         value type, but an class type, so we need to box.
8151
8152         (Expression.ConvertExplicit): One codepath could return
8153         errors but not flag them.  Fix this.  Fixes #31853
8154
8155         * parameter.cs (Resolve): Do not allow void as a parameter type.
8156
8157 2002-10-06  Martin Baulig  <martin@gnome.org>
8158
8159         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8160         if it's a class type and not a struct.  Fixes #31815.
8161
8162 2002-10-06  Martin Baulig  <martin@gnome.org>
8163
8164         * statement.cs: Reworked the flow analysis code a bit to make it
8165         usable for dead code elimination.
8166
8167 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8168
8169         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8170
8171 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8172
8173         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8174         to fix the test 165, will investigate deeper.
8175
8176 2002-10-04  Martin Baulig  <martin@gnome.org>
8177
8178         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8179         finally blocks actually work.
8180         (Try.Resolve): We don't need to create a sibling for `finally' if
8181         there is no finally block.
8182
8183 2002-10-04  Martin Baulig  <martin@gnome.org>
8184
8185         * class.cs (Constructor.Define): The default accessibility for a
8186         non-default constructor is private, not public.
8187
8188 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8189
8190         * class.cs (Constructor): Make AllowedModifiers public, add
8191         EXTERN.
8192
8193         * cs-parser.jay: Perform the modifiers test here, as the
8194         constructor for the Constructor class usually receives a zero
8195         because of the way we create it (first we create, later we
8196         customize, and we were never checking the modifiers).
8197
8198         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8199         is a version of LookupTypeReflection that includes the type-name
8200         cache.  This can be used as a fast path for functions that know
8201         the fully qualified name and are only calling into *.GetType() to
8202         obtain a composed type.
8203
8204         This is also used by TypeManager.LookupType during its type
8205         composition.
8206
8207         (LookupType): We now also track the real type name, as sometimes
8208         we can get a quey for the real type name from things like
8209         ComposedCast.  This fixes bug 31422.
8210
8211         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8212         complete type fullname, it does not have to go through the type
8213         resolution system to obtain the composed version of the type (for
8214         obtaining arrays or pointers).
8215
8216         (Conditional.Emit): Use the EmitBoolExpression to
8217         generate nicer code, as requested by Paolo.
8218
8219         (ArrayCreation.CheckIndices): Use the patch from
8220         hwang_rob@yahoo.ca to validate the array initializers. 
8221
8222 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8223
8224         * class.cs (ConstructorInitializer.Emit): simplify code by using
8225         Invocation.EmitCall, and at the same time, fix the bugs in calling
8226         parent constructors that took variable arguments. 
8227
8228         * ecore.cs (Expression.ConvertNumericExplicit,
8229         Expression.ImplicitNumericConversion): Remove the code that
8230         manually wrapped decimal (InternalTypeConstructor call is now gone
8231         as well).
8232
8233         * expression.cs (Cast.TryReduce): Also handle decimal types when
8234         trying to perform a constant fold on the type.
8235
8236         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8237
8238         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8239         that only turned off an error report, and did nothing else. 
8240
8241 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8242
8243         * driver.cs: Handle and ignore /fullpaths
8244
8245 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8246
8247         * expression.cs (Binary.ResolveOperator): Catch the case where
8248         DoNumericPromotions returns true, 
8249
8250         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8251
8252 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8253
8254         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8255         report error 70.
8256
8257 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8258
8259         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8260         conversion exists, but it is also required that the conversion be
8261         performed.  This manifested in "(Type64Enum) 2".  
8262
8263         * class.cs (TypeManager.AddMethod): The fix is not to change
8264         AddEnum, because that one was using a fully qualified name (every
8265         DeclSpace derivative does), but to change the AddMethod routine
8266         that was using an un-namespaced name.  This now correctly reports
8267         the duplicated name.
8268
8269         Revert patch until I can properly fix it.  The issue
8270         is that we have a shared Type space across all namespaces
8271         currently, which is wrong.
8272
8273         Options include making the Namespace a DeclSpace, and merge
8274         current_namespace/current_container in the parser.
8275
8276 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8277
8278         * cs-parser.jay: Improve error reporting when we get a different
8279         kind of expression in local_variable_type and
8280         local_variable_pointer_type. 
8281
8282         Propagate this to avoid missleading errors being reported.
8283
8284         * ecore.cs (ImplicitReferenceConversion): treat
8285         TypeManager.value_type as a target just like object_type.   As
8286         code like this:
8287
8288         ValueType v = 1;
8289
8290         Is valid, and needs to result in the int 1 being boxed before it
8291         is assigned to the value type v.
8292
8293         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8294         to validate the enumeration name.
8295
8296         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8297         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8298         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8299
8300         * ecore.cs (TryImplicitIntConversion): When doing an
8301         implicit-enumeration-conversion, check if the type is 64-bits and
8302         perform a conversion before passing to EnumConstant.
8303
8304 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8305
8306         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8307         report ambiguous type references.  Unlike the MS version, we
8308         report what the ambiguity is.   Innovation at work ;-)
8309
8310         (DeclSpace.FindType): Require a location argument to
8311         display when we display an ambiguous error.
8312
8313         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8314
8315         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8316
8317         * expression.cs (EmitDynamicInitializers): Apply patch from
8318         hwang_rob@yahoo.ca that fixes the order in which we emit our
8319         initializers. 
8320
8321 2002-09-21  Martin Baulig  <martin@gnome.org>
8322
8323         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8324         delegate takes no arguments.
8325
8326 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8327
8328         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8329         from integers.
8330
8331         * expression.cs: Extract the underlying type.
8332
8333         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8334
8335         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8336
8337 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8338
8339         * class.cs (TypeContainer.DefineType): We can not use the nice
8340         PackingSize with the size set to 1 DefineType method, because it
8341         will not allow us to define the interfaces that the struct
8342         implements.
8343
8344         This completes the fixing of bug 27287
8345
8346         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8347         means also structs.  This fixes part of the problem. 
8348         (Expresion.ImplicitReferenceConversionExists): ditto.
8349
8350         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8351         error if there were no errors reported during the type lookup
8352         process, to avoid duplicates or redundant errors.  Without this
8353         you would get an ambiguous errors plus a type not found.  We have
8354         beaten the user enough with the first error.  
8355
8356         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8357         reference. 
8358
8359         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8360         during the resolution process, stop the lookup, this avoids
8361         repeated error reports (same error twice).
8362
8363         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8364
8365         * typemanager.cs (LookupType): Redo the type lookup code to match
8366         the needs of System.Reflection.  
8367
8368         The issue is that System.Reflection requires references to nested
8369         types to begin with a "+" sign instead of a dot.  So toplevel
8370         types look like: "NameSpace.TopLevelClass", and nested ones look
8371         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8372         levels. 
8373
8374 2002-09-19  Martin Baulig  <martin@gnome.org>
8375
8376         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8377         says that a method always returns or always throws an exception,
8378         don't report the CS0161.
8379
8380         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8381         set `Returns = new_returns'.
8382
8383 2002-09-19  Martin Baulig  <martin@gnome.org>
8384
8385         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8386         to an enum constant, check for a CS0176.
8387
8388 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8389
8390         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8391         for operators that must be in pairs and report errors.
8392
8393         * ecore.cs (SimpleName.DoResolveType): During the initial type
8394         resolution process, when we define types recursively, we must
8395         check first for types in our current scope before we perform
8396         lookups in the enclosing scopes.
8397
8398         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8399
8400         (Invocation.VerifyArgumentsCompat): Call
8401         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8402         I thought we were supposed to always call this, but there are a
8403         few places in the code where we dont do it.
8404
8405 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8406
8407         * driver.cs: Add support in -linkres and -resource to specify the
8408         name of the identifier.
8409
8410 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8411
8412         * ecore.cs (StandardConversionExists): Sync with the conversion
8413         code: allow anything-* to void* conversions.
8414
8415         (FindMostSpecificSource): Use an Expression argument
8416         instead of a Type, because we might be handed over a Literal which
8417         gets a few more implicit conversions that plain types do not.  So
8418         this information was being lost.
8419
8420         Also, we drop the temporary type-holder expression when not
8421         required.
8422
8423 2002-09-17  Martin Baulig  <martin@gnome.org>
8424
8425         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8426         this is an explicit interface implementation.
8427
8428 2002-09-17  Martin Baulig  <martin@gnome.org>
8429
8430         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8431         different `IndexerName' attributes.
8432
8433         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8434         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8435         virtual CommonResolve().
8436
8437 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8438
8439         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8440         and convert that to the UnderlyingType.
8441
8442         * statement.cs (Foreach.Resolve): Indexers are just like variables
8443         or PropertyAccesses.
8444
8445         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8446         inside quoted strings, we were not doing this before.
8447
8448 2002-09-16  Martin Baulig  <martin@gnome.org>
8449
8450         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8451         resolve it.  This is needed for the definite assignment check of the
8452         instance expression, fixes bug #29846.
8453         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8454
8455 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8456
8457         * parameter.cs: Fix compile error.  Cannot reference static member
8458         from an instance object.  Is this an mcs bug?
8459
8460 2002-09-14  Martin Baulig  <martin@gnome.org>
8461
8462         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8463         multiple times.  Fixes bug #30295, added test-166.cs.
8464
8465 2002-09-14  Martin Baulig  <martin@gnome.org>
8466
8467         * statement.cs (Block.Emit): Don't emit unreachable code.
8468         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8469         `break' statements.
8470         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8471
8472 2002-09-14  Martin Baulig  <martin@gnome.org>
8473
8474         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8475         is set.
8476
8477 2002-09-14  Martin Baulig  <martin@gnome.org>
8478
8479         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8480         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8481         be false on the ms runtime.
8482
8483 2002-09-13  Martin Baulig  <martin@gnome.org>
8484
8485         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8486         the CS0038 error message.
8487
8488 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8489
8490         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8491         constant inside, return it.
8492
8493 2002-09-12  Martin Baulig  <martin@gnome.org>
8494
8495         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8496         implicit conversion can be done between enum types.
8497
8498         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8499         check whether an implicit conversion to the current enum's UnderlyingType
8500         exists and report an error if not.
8501
8502         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8503         without debugging support.
8504
8505         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8506         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8507
8508 2002-09-12  Martin Baulig  <martin@gnome.org>
8509
8510         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8511
8512         * ecore.cs (IMemberExpr.DeclaringType): New property.
8513         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8514         nonstatic member of an outer type (CS0038).
8515
8516 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8517
8518         * driver.cs: Activate the using-error detector at warning level
8519         4 (at least for MS-compatible APIs).
8520
8521         * namespace.cs (VerifyUsing): Small buglett fix.
8522
8523         * pending.cs (PendingImplementation): pass the container pointer. 
8524
8525         * interface.cs (GetMethods): Allow for recursive definition.  Long
8526         term, I would like to move every type to support recursive
8527         definitions, not the current ordering mechanism that we have right
8528         now.
8529
8530         The situation is this: Attributes are handled before interfaces,
8531         so we can apply attributes to interfaces.  But some attributes
8532         implement interfaces, we will now handle the simple cases
8533         (recursive definitions will just get an error).  
8534
8535         * parameter.cs: Only invalidate types at the end if we fail to
8536         lookup all types.  
8537
8538 2002-09-09  Martin Baulig  <martin@gnome.org>
8539
8540         * ecore.cs (PropertyExpr.Emit): Also check for
8541         TypeManager.system_int_array_get_length so this'll also work when
8542         compiling corlib.  Fixes #30003.
8543
8544 2002-09-09  Martin Baulig  <martin@gnome.org>
8545
8546         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8547         and throw an exception if we can't get the type's size.  Fixed #30040,
8548         added test-165.cs.
8549
8550 2002-09-09  Martin Baulig  <martin@gnome.org>
8551
8552         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8553
8554         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8555         context.  Fixes bug #30027.
8556
8557         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8558         virtual functions.  Fixes bug #30043, added test-164.cs.
8559
8560 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8561
8562         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8563
8564 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8565
8566         * driver.cs: Use an object to get the windows codepage since it's not a
8567         static property.
8568
8569 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8570
8571         * statement.cs (For.Emit): for infinite loops (test == null)
8572         return whether there is a break inside, not always "true".
8573
8574         * namespace.cs (UsingEntry): New struct to hold the name of the
8575         using definition, the location where it is defined, and whether it
8576         has been used in a successful type lookup.
8577
8578         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8579         strings.
8580
8581         * decl.cs: ditto.
8582
8583 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8584
8585         * attribute.cs : Fix incorrect code which relied on catching
8586         a NullReferenceException to detect a null being passed in
8587         where an object was expected.
8588
8589 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8590
8591         * statement.cs (Try): flag the catch variable as assigned
8592
8593         * expression.cs (Cast): Simplified by using ResolveType instead of
8594         manually resolving.
8595
8596         * statement.cs (Catch): Fix bug by using ResolveType.
8597
8598 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8599
8600         * expression.cs (BetterConversion): Special case for when we have
8601         a NullLiteral as the argument and we have to choose between string
8602         and object types - we choose string the way csc does.
8603
8604         * attribute.cs (Attribute.Resolve): Catch the
8605         NullReferenceException and report error #182 since the Mono
8606         runtime no more has the bug and having this exception raised means
8607         we tried to select a constructor which takes an object and is
8608         passed a null.
8609
8610 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8611
8612         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8613         message (1502, 1503) when we can't locate a method after overload
8614         resolution. This is much more informative and closes the bug
8615         Miguel reported.
8616
8617         * interface.cs (PopulateMethod): Return if there are no argument
8618         types. Fixes a NullReferenceException bug.
8619
8620         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8621         expressions too. Previously we were checking only in one place for
8622         positional arguments leaving out named arguments.
8623
8624         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8625         type to the enum type is not allowed. Remove code corresponding to
8626         that.
8627
8628         (ConvertNumericExplicit): Allow explicit conversions from
8629         the underlying type to enum type. This precisely follows the spec
8630         and closes a bug filed by Gonzalo.
8631
8632 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8633
8634         * compiler.csproj:
8635         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8636
8637 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8638
8639         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8640         it was important that we stored the right value after the
8641         reduction in `converted'.
8642
8643 2002-09-04  Martin Baulig  <martin@gnome.org>
8644
8645         * location.cs (Location.SymbolDocument): Use full pathnames for the
8646         source files.
8647
8648 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8649
8650         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8651         of the expression resolve mechanism, because that will catch the
8652         SimpleName error failures.
8653
8654         (Conditional): If we can not resolve the
8655         expression, return, do not crash.
8656
8657 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8658
8659         * cs-tokenizer.cs:
8660         (location): display token name instead of its number.
8661
8662 2002-08-28  Martin Baulig  <martin@gnome.org>
8663
8664         * expression.cs (Binary.ResolveOperator): Don't silently return
8665         but return an error if an operator cannot be applied between two
8666         enum types.
8667
8668 2002-08-28  Martin Baulig  <martin@gnome.org>
8669
8670         * class.cs (Constructor.Define): Set the permission attributes
8671         correctly instead of making all constructors public.
8672
8673 2002-08-28  Martin Baulig  <martin@gnome.org>
8674
8675         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8676         for private members before reporting a CS0103; if we find anything,
8677         it's a CS0122.
8678
8679 2002-08-28  Martin Baulig  <martin@gnome.org>
8680
8681         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8682         to check whether `closure_start_type == closure_invocation_type',
8683         we also need to check whether `m.DeclaringType == closure_invocation_type'
8684         before bypassing the permission checks.  We might be accessing
8685         protected/private members from the base class.
8686         (TypeManager.RealMemberLookup): Only set private_ok if private
8687         members were requested via BindingFlags.NonPublic.
8688
8689         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8690
8691         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8692         MethodGroupExpr.IsExplicitImpl if appropriate.
8693         (Invocation.DoResolve): Don't report the CS0120 for explicit
8694         interface implementations.
8695
8696 2002-08-27  Martin Baulig  <martin@gnome.org>
8697
8698         * expression.cs (Invocation.DoResolve): If this is a static
8699         method and we don't have an InstanceExpression, we must report
8700         a CS0120.
8701
8702 2002-08-25  Martin Baulig  <martin@gnome.org>
8703
8704         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8705         `==' between a valuetype and an object.
8706
8707 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8708
8709         * ecore.cs (TypeExpr): Provide a ToString method.
8710
8711 2002-08-24  Martin Baulig  <martin@gnome.org>
8712
8713         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8714         now called proggie.dbg and it's a binary file.
8715
8716 2002-08-23  Martin Baulig  <martin@gnome.org>
8717
8718         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8719
8720 2002-08-23  Martin Baulig  <martin@gnome.org>
8721
8722         * struct.cs (MyStructInfo.ctor): Make this work with empty
8723         structs; it's not allowed to use foreach() on null.
8724
8725 2002-08-23  Martin Baulig  <martin@gnome.org>
8726
8727         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8728         writer the full pathname of the generated assembly.
8729
8730 2002-08-23  Martin Baulig  <martin@gnome.org>
8731
8732         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8733         A `finally' block never returns or breaks; improved handling of
8734         unreachable code.
8735
8736 2002-08-23  Martin Baulig  <martin@gnome.org>
8737
8738         * statement.cs (Throw.Resolve): Allow `throw null'.
8739
8740 2002-08-23  Martin Baulig  <martin@gnome.org>
8741
8742         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8743         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8744         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8745         MemberLookup would return a wrong event if this is an explicit
8746         interface implementation and the class has an event with the same
8747         name.
8748
8749 2002-08-23  Martin Baulig  <martin@gnome.org>
8750
8751         * statement.cs (Block.AddChildVariableNames): New public method.
8752         (Block.AddChildVariableName): Likewise.
8753         (Block.IsVariableNameUsedInChildBlock): Likewise.
8754         (Block.AddVariable): Check whether a variable name has already
8755         been used in a child block.
8756
8757         * cs-parser.jay (declare_local_variables): Mark all variable names
8758         from the current block as being used in a child block in the
8759         implicit block.
8760
8761 2002-08-23  Martin Baulig  <martin@gnome.org>
8762
8763         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
8764         find the symbol writer.
8765
8766         * driver.cs: csc also allows the arguments to /define being
8767         separated by commas, not only by semicolons.
8768
8769 2002-08-23  Martin Baulig  <martin@gnome.org>
8770
8771         * interface.cs (Interface.GetMembers): Added static check for events.
8772
8773 2002-08-15  Martin Baulig  <martin@gnome.org>
8774
8775         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
8776         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
8777
8778         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8779         why the MethodData.EmitDestructor() change was necessary.
8780
8781 2002-08-20  Martin Baulig  <martin@gnome.org>
8782
8783         * class.cs (TypeContainer.FindMembers): Added static check for events.
8784
8785         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8786
8787         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8788         use Type.GetEvents(), not Type.FindMembers().
8789
8790 2002-08-20  Martin Baulig  <martin@gnome.org>
8791
8792         * decl.cs (MemberCache): Added a special method cache which will
8793         be used for method-only searched.  This ensures that a method
8794         search will return a MethodInfo with the correct ReflectedType for
8795         inherited methods.      
8796
8797 2002-08-20  Martin Baulig  <martin@gnome.org>
8798
8799         * decl.cs (DeclSpace.FindMembers): Made this public.
8800
8801 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8802
8803         * delegate.cs: fixed build on windows.
8804         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8805
8806 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8807
8808         * ecore.cs (StandardConversionExists): Return a false
8809         if we are trying to convert the void type to anything else
8810         since that is not allowed.
8811
8812         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8813         we flag error 70 in the event an event is trying to be accessed
8814         directly from outside the declaring type.
8815
8816 2002-08-20  Martin Baulig  <martin@gnome.org>
8817
8818         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8819         MemberCache from typemanager.cs to decl.cs.
8820
8821 2002-08-19  Martin Baulig  <martin@gnome.org>
8822
8823         * class.cs (TypeContainer): Implement IMemberContainer.
8824         (TypeContainer.DefineMembers): Create the MemberCache.
8825         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8826         return public members if BindingFlags.Public was given, check
8827         whether members are static.
8828
8829 2002-08-16  Martin Baulig  <martin@gnome.org>
8830
8831         * decl.cs (DeclSpace.Define): Splitted this in Define and
8832         DefineMembers.  DefineMembers is called first and initializes the
8833         MemberCache.
8834
8835         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8836         DefineMembers() on all our DeclSpaces.
8837
8838         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8839         but call DefineMembers() on all nested interfaces.  We call their
8840         Define() in our new Define() function.
8841
8842         * interface.cs (Interface): Implement IMemberContainer.
8843         (Interface.Define): Moved all code except the attribute stuf to
8844         DefineMembers().
8845         (Interface.DefineMembers): Initialize the member cache.
8846
8847         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8848         need this anymore since we can use MemberCache.FindMembers directly.
8849
8850 2002-08-19  Martin Baulig  <martin@gnome.org>
8851
8852         * typemanager.cs (MemberCache): When creating the cache for an
8853         interface type, add all inherited members.
8854         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8855         to `out bool used_cache' and documented it.
8856         (TypeManager.MemberLookup): If we already used the cache in the first
8857         iteration, we don't need to do the interfaces check.
8858
8859 2002-08-19  Martin Baulig  <martin@gnome.org>
8860
8861         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8862         here from IMemberFinder and don't implement this interface anymore.
8863         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8864
8865         * typemanager.cs (IMemberFinder): This interface is now only used by
8866         classes which actually support the member cache.
8867         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8868         since we only put DeclSpaces into this Hashtable.
8869         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8870         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8871
8872 2002-08-16  Martin Baulig  <martin@gnome.org>
8873
8874         * typemanager.cs (ICachingMemberFinder): Removed.
8875         (IMemberFinder.MemberCache): New property.
8876         (TypeManager.FindMembers): Merged this with RealFindMembers().
8877         This function will never be called from TypeManager.MemberLookup()
8878         so we can't use the cache here, just the IMemberFinder.
8879         (TypeManager.MemberLookup_FindMembers): Check whether the
8880         IMemberFinder has a MemberCache and call the cache's FindMembers
8881         function.
8882         (MemberCache): Rewrote larger parts of this yet another time and
8883         cleaned it up a bit.
8884
8885 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8886
8887         * driver.cs (LoadArgs): Support quoting.
8888
8889         (Usage): Show the CSC-like command line arguments.
8890
8891         Improved a few error messages.
8892
8893 2002-08-15  Martin Baulig  <martin@gnome.org>
8894
8895         * typemanager.cs (IMemberContainer.Type): New property.
8896         (IMemberContainer.IsInterface): New property.
8897
8898         The following changes are conditional to BROKEN_RUNTIME, which is
8899         defined at the top of the file.
8900
8901         * typemanager.cs (MemberCache.MemberCache): Don't add the base
8902         class'es members, but add all members from TypeHandle.ObjectType
8903         if we're an interface.
8904         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
8905         is the current type.
8906         (MemberCache.CacheEntry.Container): Removed this field.
8907         (TypeHandle.GetMembers): Include inherited members.
8908
8909 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8910
8911         * typemanager.cs: fixed compilation and added a comment on a field that
8912         is never used.
8913
8914 2002-08-15  Martin Baulig  <martin@gnome.org>
8915
8916         * class.cs (ConstructorInitializer.Resolve): In the
8917         Expression.MemberLookup call, use the queried_type as
8918         invocation_type.
8919
8920         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
8921         declared' attribute, it's always true.
8922         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
8923         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
8924         temporary wrapper for FindMembers which tells MemberLookup whether
8925         members from the base classes are included in the return value.
8926         This will go away soon.
8927         (TypeManager.MemberLookup): Use this temporary hack here; once the
8928         new MemberCache is completed, we don't need to do the DeclaredOnly
8929         looping here anymore since the MemberCache will take care of this.
8930         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
8931         (MemberCache): When creating the MemberCache for a class, get
8932         members from the current class and all its base classes.
8933         (MemberCache.CacheEntry.Container): New field.  This is a
8934         temporary hack until the Mono runtime is fixed to distinguish
8935         between ReflectedType and DeclaringType.  It allows us to use MCS
8936         with both the MS runtime and the unfixed Mono runtime without
8937         problems and without accecting performance.
8938         (MemberCache.SearchMembers): The DeclaredOnly looping from
8939         TypeManager.MemberLookup is now done here.      
8940
8941 2002-08-14  Martin Baulig  <martin@gnome.org>
8942
8943         * statement.cs (MyStructInfo.MyStructInfo): Don't call
8944         Type.GetFields on dynamic types but get the fields from the
8945         corresponding TypeContainer.
8946         (MyStructInfo.GetStructInfo): Added check for enum types.
8947
8948         * typemanager.cs (MemberList.IsSynchronized): Implemented.
8949         (MemberList.SyncRoot): Implemented.
8950         (TypeManager.FilterWithClosure): No need to check permissions if
8951         closure_start_type == closure_invocation_type, don't crash if
8952         closure_invocation_type is null.
8953
8954 2002-08-13  Martin Baulig  <martin@gnome.org>
8955
8956         Rewrote TypeContainer.FindMembers to use a member cache.  This
8957         gives us a speed increase of about 35% for the self-hosting MCS
8958         build and of about 15-20% for the class libs (both on GNU/Linux).
8959
8960         * report.cs (Timer): New class to get enhanced profiling.  This
8961         whole class is "TIMER" conditional since it remarkably slows down
8962         compilation speed.
8963
8964         * class.cs (MemberList): New class.  This is an IList wrapper
8965         which we're now using instead of passing MemberInfo[]'s around to
8966         avoid copying this array unnecessarily.
8967         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
8968         (ICachingMemberFinder, IMemberContainer): New interface.
8969         (TypeManager.FilterWithClosure): If `criteria' is null, the name
8970         has already been checked, otherwise use it for the name comparision.
8971         (TypeManager.FindMembers): Renamed to RealMemberFinder and
8972         provided wrapper which tries to use ICachingMemberFinder.FindMembers
8973         if possible.  Returns a MemberList, not a MemberInfo [].
8974         (TypeHandle): New class, implements IMemberContainer.  We create
8975         one instance of this class per type, it contains a MemberCache
8976         which is used to do the member lookups.
8977         (MemberCache): New class.  Each instance of this class contains
8978         all members of a type and a name-based hash table.
8979         (MemberCache.FindMembers): This is our new member lookup
8980         function.  First, it looks up all members of the requested name in
8981         the hash table.  Then, it walks this list and sorts out all
8982         applicable members and returns them.
8983
8984 2002-08-13  Martin Baulig  <martin@gnome.org>
8985
8986         In addition to a nice code cleanup, this gives us a performance
8987         increase of about 1.4% on GNU/Linux - not much, but it's already
8988         half a second for the self-hosting MCS compilation.
8989
8990         * typemanager.cs (IMemberFinder): New interface.  It is used by
8991         TypeManager.FindMembers to call FindMembers on a TypeContainer,
8992         Enum, Delegate or Interface.
8993         (TypeManager.finder_to_member_finder): New PtrHashtable.
8994         (TypeManager.finder_to_container): Removed.
8995         (TypeManager.finder_to_delegate): Removed.
8996         (TypeManager.finder_to_interface): Removed.
8997         (TypeManager.finder_to_enum): Removed.
8998
8999         * interface.cs (Interface): Implement IMemberFinder.
9000
9001         * delegate.cs (Delegate): Implement IMemberFinder.
9002
9003         * enum.cs (Enum): Implement IMemberFinder.
9004
9005         * class.cs (TypeContainer): Implement IMemberFinder.
9006
9007 2002-08-12  Martin Baulig  <martin@gnome.org>
9008
9009         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9010
9011 2002-08-12  Martin Baulig  <martin@gnome.org>
9012
9013         * ecore.cs (ITypeExpression): New interface for expressions which
9014         resolve to a type.
9015         (TypeExpression): Renamed to TypeLookupExpression.
9016         (Expression.DoResolve): If we're doing a types-only lookup, the
9017         expression must implement the ITypeExpression interface and we
9018         call DoResolveType() on it.
9019         (SimpleName): Implement the new ITypeExpression interface.
9020         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9021         hack, the situation that we're only looking up types can't happen
9022         anymore when this method is called.  Moved the type lookup code to
9023         DoResolveType() and call it.
9024         (SimpleName.DoResolveType): This ITypeExpression interface method
9025         is now doing the types-only lookup.
9026         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9027         (ResolveFlags): Added MaskExprClass.
9028
9029         * expression.cs (MemberAccess): Implement the ITypeExpression
9030         interface.
9031         (MemberAccess.DoResolve): Added support for a types-only lookup
9032         when we're called via ITypeExpression.DoResolveType().
9033         (ComposedCast): Implement the ITypeExpression interface.
9034
9035         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9036         Expression.Resolve() with ResolveFlags.Type instead.
9037
9038 2002-08-12  Martin Baulig  <martin@gnome.org>
9039
9040         * interface.cs (Interface.Define): Apply attributes.
9041
9042         * attribute.cs (Attribute.ApplyAttributes): Added support for
9043         interface attributes.
9044
9045 2002-08-11  Martin Baulig  <martin@gnome.org>
9046
9047         * statement.cs (Block.Emit): Only check the "this" variable if we
9048         do not always throw an exception.
9049
9050         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9051         whether the property has a set accessor.
9052
9053 2002-08-11  Martin Baulig  <martin@gnome.org>
9054
9055         Added control flow analysis support for structs.
9056
9057         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9058         with control flow analysis turned off.
9059         (IVariable): New interface.
9060         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9061         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9062         (FieldExpr.DoResolve): Resolve the instance expression with flow
9063         analysis turned off and do the definite assignment check after the
9064         resolving when we know what the expression will resolve to.
9065
9066         * expression.cs (LocalVariableReference, ParameterReference):
9067         Implement the new IVariable interface, only call the flow analysis
9068         code if ec.DoFlowAnalysis is true.
9069         (This): Added constructor which takes a Block argument.  Implement
9070         the new IVariable interface.
9071         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9072         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9073         This does the definite assignment checks for struct members.
9074
9075         * class.cs (Constructor.Emit): If this is a non-static `struct'
9076         constructor which doesn't have any initializer, call
9077         Block.AddThisVariable() to tell the flow analysis code that all
9078         struct elements must be initialized before control returns from
9079         the constructor.
9080
9081         * statement.cs (MyStructInfo): New public class.
9082         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9083         argument to this indexer.  If non-zero, check an individual struct
9084         member, not the whole struct.
9085         (FlowBranching.CheckOutParameters): Check struct members.
9086         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9087         overloaded versions of these methods which take an additional
9088         `int field_idx' argument to check struct members.
9089         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9090         overloaded versions of these methods which take an additional
9091         `string field_name' argument to check struct member.s
9092         (VariableInfo): Implement the IVariable interface.
9093         (VariableInfo.StructInfo): New public property.  Returns the
9094         MyStructInfo instance of the variable if it's a struct or null.
9095         (Block.AddThisVariable): New public method.  This is called from
9096         Constructor.Emit() for non-static `struct' constructor which do
9097         not have any initializer.  It creates a special variable for the
9098         "this" instance variable which will be checked by the flow
9099         analysis code to ensure that all of the struct's fields are
9100         initialized before control returns from the constructor.
9101         (UsageVector): Added support for struct members.  If a
9102         variable/parameter is a struct with N members, we reserve a slot
9103         in the usage vector for each member.  A struct is considered fully
9104         initialized if either the struct itself (slot 0) or all its
9105         members are initialized.
9106
9107 2002-08-08  Martin Baulig  <martin@gnome.org>
9108
9109         * driver.cs (Driver.MainDriver): Only report an error CS5001
9110         if there were no compilation errors.
9111
9112         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9113         `UnsafeContext' property to determine whether the parent is in
9114         unsafe context rather than checking the parent's ModFlags:
9115         classes nested in an unsafe class are unsafe as well.
9116
9117 2002-08-08  Martin Baulig  <martin@gnome.org>
9118
9119         * statement.cs (UsageVector.MergeChildren): Distinguish between
9120         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9121         we return.  Added test17() and test18() to test-154.cs.
9122
9123 2002-08-08  Martin Baulig  <martin@gnome.org>
9124
9125         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9126         Family access, make sure the invoking type isn't a subclass of the
9127         queried type (that'd be a CS1540).
9128
9129         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9130         this method which takes an additional `Type invocation_type'.
9131
9132         * expression.cs (BaseAccess.DoResolve): Use the base type as
9133         invocation and query type.
9134         (MemberAccess.DoResolve): If the lookup failed and we're about to
9135         report a CS0122, try a lookup with the ec.ContainerType - if this
9136         succeeds, we must report a CS1540.
9137
9138 2002-08-08  Martin Baulig  <martin@gnome.org>
9139
9140         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9141         (MethodGroupExpr): Implement the IMemberExpr interface.
9142
9143         * expression (MemberAccess.ResolveMemberAccess): No need to have
9144         any special code for MethodGroupExprs anymore, they're now
9145         IMemberExprs.   
9146
9147 2002-08-08  Martin Baulig  <martin@gnome.org>
9148
9149         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9150         Family, FamANDAssem and FamORAssem permissions.
9151         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9152
9153 2002-08-08  Martin Baulig  <martin@gnome.org>
9154
9155         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9156         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9157         or loop block.
9158
9159 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9160
9161         * driver.cs: implemented /resource option to embed managed resources.
9162
9163 2002-08-07  Martin Baulig  <martin@gnome.org>
9164
9165         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9166         (FieldBase.HasFieldInitializer): New public property.
9167         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9168         returns the field initializer and makes sure it is only resolved once.
9169         (TypeContainer.EmitFieldInitializers): Call
9170         FieldBase.GetInitializerExpression to get the initializer, this ensures
9171         that it isn't resolved multiple times.
9172
9173         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9174         the resolving process (SimpleName/MemberLookup) that we're currently
9175         emitting a field initializer (which must not access any instance members,
9176         this is an error CS0236).
9177
9178         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9179         argument, if the `IsFieldInitializer' flag is set, we must report and
9180         error CS0236 and not an error CS0120.   
9181
9182 2002-08-07  Martin Baulig  <martin@gnome.org>
9183
9184         * ecore.cs (IMemberExpr): New public interface.
9185         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9186         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9187         if the expression is an IMemberExpr.
9188
9189         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9190         to be null, implicitly default to `this' if we're non-static in
9191         this case.  Simplified the code a lot by using the new IMemberExpr
9192         interface.  Also fixed bug #28176 here.
9193
9194 2002-08-06  Martin Baulig  <martin@gnome.org>
9195
9196         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9197         ParameterReferences during semantic analysis so that we can do a
9198         type-only search when resolving Cast, TypeOf and SizeOf.
9199         (block): Pass the `current_local_parameters' to the Block's
9200         constructor.
9201
9202         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9203         argument to the constructor.
9204         (ConstructorInitializer.Resolve): Create a temporary implicit
9205         block with the parameters.
9206
9207         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9208         references here if we aren't doing a type-only search.
9209
9210         * statement.cs (Block): Added constructor which takes a
9211         `Parameters parameters' argument.
9212         (Block.Parameters): New public property.
9213
9214         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9215         to `Parameters' and made it public readonly.
9216
9217 2002-08-06  Martin Baulig  <martin@gnome.org>
9218
9219         * ecore.cs (Expression.Warning): Made this public as well.
9220
9221         * report.cs (Report.Debug): Print the contents of collections.
9222
9223 2002-08-06  Martin Baulig  <martin@gnome.org>
9224
9225         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9226         used to tell Resolve() which kinds of expressions it may return.
9227         (Expression.Resolve): Added overloaded version of this method which
9228         takes a `ResolveFlags flags' argument.  This can be used to tell
9229         Resolve() which kinds of expressions it may return.  Reports a
9230         CS0118 on error.
9231         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9232         ResolveFlags.SimpleName.
9233         (Expression.Error118): Added overloaded version of this method which
9234         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9235         which kinds of expressions are allowed.
9236
9237         * expression.cs (Argument.ResolveMethodGroup): New public method.
9238         Resolves an argument, but allows a MethodGroup to be returned.
9239         This is used when invoking a delegate.
9240
9241         * TODO: Updated a bit.
9242
9243 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9244
9245         Fixed compilation with csc.
9246
9247         * ecore.cs: Expression.Error made public. Is this correct? Should
9248         Warning be made public too?
9249
9250         * expression.cs: use ea.Location instead of ea.loc.
9251         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9252
9253 2002-08-06  Martin Baulig  <martin@gnome.org>
9254
9255         * ecore.cs (Expression.loc): Moved the location here instead of
9256         duplicating it in all derived classes.
9257         (Expression.Location): New public property.
9258         (Expression.Error, Expression.Warning): Made them non-static and
9259         removed the location argument.
9260         (Expression.Warning): Added overloaded version which takes an
9261         `int level' argument.
9262         (Expression.Error118): Make this non-static and removed the
9263         expression and location arguments.
9264         (TypeExpr): Added location argument to the constructor.
9265
9266         * expression.cs (StaticCallExpr): Added location argument to
9267         the constructor.
9268         (Indirection, PointerArithmetic): Likewise.
9269         (CheckedExpr, UnCheckedExpr): Likewise.
9270         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9271         (StringPtr): Likewise.
9272
9273
9274 2002-08-05  Martin Baulig  <martin@gnome.org>
9275
9276         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9277
9278         * assign.cs (Assign.DoResolve): Check whether the source
9279         expression is a value or variable.
9280
9281         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9282         while resolving the corresponding blocks.
9283
9284         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9285         an error, don't silently return null.
9286
9287         * statement.cs (Block.AddVariable): Do the error reporting here
9288         and distinguish between CS0128 and CS0136.
9289         (Block.DoResolve): Report all unused labels (warning CS0164).
9290         (LabeledStatement): Pass the location to the constructor.
9291         (LabeledStatement.HasBeenReferenced): New property.
9292         (LabeledStatement.Resolve): Set it to true here.
9293
9294         * statement.cs (Return.Emit): Return success even after reporting
9295         a type mismatch error (CS0126 or CS0127), this is what csc does and
9296         it avoids confusing the users with any consecutive errors.
9297
9298 2002-08-05  Martin Baulig  <martin@gnome.org>
9299
9300         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9301
9302         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9303
9304         * expression.cs (MemberAccess.DoResolve): Silently return if an
9305         error has already been reported.
9306
9307         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9308         error has already been reported.
9309
9310 2002-08-05  Martin Baulig  <martin@gnome.org>
9311
9312         * statement.cs (UsageVector): Only initialize the `parameters'
9313         vector if we actually have any "out" parameters.
9314
9315 2002-08-05  Martin Baulig  <martin@gnome.org>
9316
9317         * expression.cs (Binary.ResolveOperator): When combining delegates,
9318         they must have the same type.
9319
9320 2002-08-05  Martin Baulig  <martin@gnome.org>
9321
9322         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9323         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9324         work with the ms runtime and we also don't need it: if we're a
9325         PropertyBuilder and not in the `indexer_arguments' hash, then we
9326         are a property and not an indexer.
9327
9328         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9329         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9330         since the latter one doesn't work with the ms runtime.
9331
9332 2002-08-03  Martin Baulig  <martin@gnome.org>
9333
9334         Fixed bugs #27998 and #22735.
9335
9336         * class.cs (Method.IsOperator): New public field.
9337         (Method.CheckBase): Report CS0111 if there's already a method
9338         with the same parameters in the current class.  Report CS0508 when
9339         attempting to change the return type of an inherited method.
9340         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9341         and it's not marked abstract or extern.
9342         (PropertyBase): New abstract base class for Property and Indexer.
9343         (PropertyBase.CheckBase): Moved here from Property and made it work
9344         for indexers.
9345         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9346         the same so we can reuse it there.
9347         (Property, Indexer): Derive from PropertyBase.
9348         (MethodSignature.inheritable_property_signature_filter): New delegate
9349         to find properties and indexers.
9350
9351         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9352         argument and improved error reporting.
9353
9354         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9355         EmptyReadOnlyParameters and made it a property.
9356
9357         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9358         version of this method which takes a `PropertyInfo indexer'.
9359         (TypeManager.RegisterIndexer): New method.
9360
9361         * class.cs: Added myself as author of this file :-)
9362
9363 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9364
9365         * class.cs: fixed compilation on windoze.
9366
9367 2002-08-03  Martin Baulig  <martin@gnome.org>
9368
9369         * interface.cs (Interface.GetInterfaceBases): Check whether all
9370         base interfaces are at least as accessible than the current one.
9371
9372         * class.cs (TypeContainer.GetClassBases): Check whether base types
9373         are at least as accessible than the current type.
9374         (TypeContainer.AsAccessible): Implemented and made non-static.
9375         (MemberBase.CheckParameters): Report errors if the accessibility
9376         checks fail.
9377
9378         * delegate.cs (Delegate.Delegate): The default visibility is
9379         internal for top-level types and private for nested types.
9380         (Delegate.Define): Report errors if the accessibility checks fail.
9381
9382         * enum.cs (Enum.Enum): The default visibility is internal for
9383         top-level types and private for nested types.
9384         (Enum.DefineType): Compute the correct visibility.
9385
9386         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9387         function which takes a `bool is_toplevel' instead of a TypeContainer.
9388
9389         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9390         builtin type.
9391
9392 2002-08-02  Martin Baulig  <martin@gnome.org>
9393
9394         * expression.cs (LocalVariableReferenc): Added constructor which
9395         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9396         (LocalVariableReference.IsReadOnly): New property.
9397         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9398         variable is readonly, use our own readonly flag to do this; you can
9399         use the new constructor to get a writable reference to a read-only
9400         variable.
9401
9402         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9403         reference to the local variable.
9404
9405 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9406
9407         * rootcontext.cs (ResolveCore): Also include System.Exception
9408
9409         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9410         we reach an EmptyStatement.
9411
9412         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9413         is also fine.
9414
9415         * expression.cs (Binary.ResolveOperator): Check error result in
9416         two places.
9417
9418         use brtrue/brfalse directly and avoid compares to null.
9419
9420 2002-08-02  Martin Baulig  <martin@gnome.org>
9421
9422         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9423         Fixes bug #28407, added test-155.cs.
9424
9425 2002-08-01  Martin Baulig  <martin@gnome.org>
9426
9427         * class.cs (Event.EmitDefaultMethod): Make this work with static
9428         events.  Fixes #28311, added verify-3.cs.
9429
9430 2002-08-01  Martin Baulig  <martin@gnome.org>
9431
9432         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9433         `is_disposable' fields.
9434         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9435         `hm.is_disposable' if we're using the collection pattern.
9436         (Foreach.EmitCollectionForeach): Use the correct type for the
9437         enumerator's local variable, only emit the try/finally block if
9438         necessary (fixes #27713).
9439
9440 2002-08-01  Martin Baulig  <martin@gnome.org>
9441
9442         * ecore.cs (Expression.report118): Renamed to Error118 and made
9443         it public static.
9444
9445         * statement.cs (Throw.Resolve): Check whether the expression is of
9446         the correct type (CS0118) and whether the type derives from
9447         System.Exception (CS0155).
9448         (Catch.Resolve): New method.  Do the type lookup here and check
9449         whether it derives from System.Exception (CS0155).
9450         (Catch.CatchType, Catch.IsGeneral): New public properties.
9451
9452         * typemanager.cs (TypeManager.exception_type): Added.
9453
9454 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9455
9456         * driver.cs: Updated About function.
9457
9458 2002-07-31  Martin Baulig  <martin@gnome.org>
9459
9460         Implemented Control Flow Analysis.
9461
9462         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9463         (EmitContext.CurrentBranching): Added.
9464         (EmitContext.StartFlowBranching): Added.
9465         (EmitContext.EndFlowBranching): Added.
9466         (EmitContext.KillFlowBranching): Added.
9467         (EmitContext.IsVariableAssigned): Added.
9468         (EmitContext.SetVariableAssigned): Added.
9469         (EmitContext.IsParameterAssigned): Added.
9470         (EmitContext.SetParameterAssigned): Added.
9471         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9472         Added control flow analysis stuff here.
9473
9474         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9475         resolve the expression as lvalue.
9476         (LocalVariableReference.DoResolve): Check whether the variable has
9477         already been assigned.
9478         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9479         the parameter as assigned here.
9480         (ParameterReference.DoResolve): Check whether the parameter has already
9481         been assigned.
9482         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9483         expression as lvalue.
9484
9485         * statement.cs (FlowBranching): New class for the flow analysis code.
9486         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9487         (LabeledStatement.IsDefined): New public property.
9488         (LabeledStatement.AddUsageVector): New public method to tell flow
9489         analyis that the label may be reached via a forward jump.
9490         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9491         flow analysis.
9492         (VariableInfo.Number): New public field.  This is used by flow analysis
9493         to number all locals of a block.
9494         (Block.CountVariables): New public property.  This is the number of
9495         local variables in this block (including the locals from all parent
9496         blocks).
9497         (Block.EmitMeta): Number all the variables.
9498
9499         * statement.cs: Added flow analysis support to all classes.
9500
9501 2002-07-31  Martin Baulig  <martin@gnome.org>
9502
9503         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9504         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9505         then use this argument.
9506
9507         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9508
9509         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9510         use this to specify /define options.
9511
9512 2002-07-29  Martin Baulig  <martin@gnome.org>
9513
9514         * statement.cs (Fixed): Moved all code that does variable lookups
9515         and resolvings from Emit to Resolve.
9516
9517         * statement.cs (For): Moved all code that does variable lookups
9518         and resolvings from Emit to Resolve.
9519
9520         * statement.cs (Using): Moved all code that does variable lookups
9521         and resolvings from Emit to Resolve.
9522
9523 2002-07-29  Martin Baulig  <martin@gnome.org>
9524
9525         * attribute.cs (Attribute.Resolve): Explicitly catch a
9526         System.NullReferenceException when creating the
9527         CustromAttributeBuilder and report a different warning message.
9528
9529 2002-07-29  Martin Baulig  <martin@gnome.org>
9530
9531         * support.cs (ParameterData.ParameterName): Added method to
9532         get the name of a parameter.
9533
9534         * typemanager.cs (TypeManager.IsValueType): New public method.
9535
9536 2002-07-29  Martin Baulig  <martin@gnome.org>
9537
9538         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9539         is a flag which specifies that it's either ref or out.
9540         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9541         the out parameter to `out Parameter.Modifier mod', also set the
9542         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9543
9544         * support.cs (InternalParameters.ParameterModifier): Distinguish
9545         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9546         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9547
9548         * expression.cs (Argument.GetParameterModifier): Distinguish
9549         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9550         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9551
9552 2002-07-29  Martin Baulig  <martin@gnome.org>
9553
9554         * expression.cs (ParameterReference.ParameterReference): Added
9555         `Location loc' argument to the constructor.
9556
9557         * cs-parser.jay: Pass location to ParameterReference.
9558
9559 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9560
9561         * statement.cs (Try): Initialize the location.
9562
9563         * cs-parser.jay: pass location to Try.
9564
9565         * expression.cs (Unary.Reduce): Change the prototype to return
9566         whether a constant fold could be performed or not.  The result is
9567         returned in an out parameters.  In the case of Indirection and
9568         AddressOf, we want to perform the full tests.
9569
9570 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9571
9572         * statement.cs (Statement.Emit): Flag dead code.
9573
9574 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9575
9576         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9577
9578 2002-07-27  Martin Baulig  <martin@gnome.org>
9579
9580         * class.cs (MethodData.Define): Put back call to
9581         TypeManager.AddMethod(), accidentally commented this out.
9582
9583         * report.cs (Debug): New public method to print debugging information,
9584         this is `[Conditional ("DEBUG")]'.
9585
9586 2002-07-26  Martin Baulig  <martin@gnome.org>
9587
9588         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9589         (switch_statement): Push the current_block to the switch_stack and
9590         pop it again when we're done with the switch.
9591         (switch_section): The new block is a child of the current_block.
9592         Fixes bug #24007, added test-152.cs.
9593
9594 2002-07-27  Martin Baulig  <martin@gnome.org>
9595
9596         * expression.cs (Invocation.EmitArguments): When calling a varargs
9597         function with only its fixed arguments, we need to pass an empty
9598         array.
9599
9600 2002-07-27  Martin Baulig  <martin@gnome.org>
9601
9602         Mono 0.13 has been released.
9603
9604 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9605
9606         * driver.cs: Rename --resource to --linkres, because that is what
9607         we do currently, we dont support --resource yet.
9608
9609         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9610
9611 2002-07-25  Martin Baulig  <martin@gnome.org>
9612
9613         * class.cs (MethodData): New public class.  This is a `method builder'
9614         class for a method or one accessor of a Property/Indexer/Event.
9615         (MethodData.GetMethodFlags): Moved here from MemberBase.
9616         (MethodData.ApplyAttributes): Likewise.
9617         (MethodData.ApplyObsoleteAttribute): Likewise.
9618         (MethodData.ApplyConditionalAttribute): Likewise.
9619         (MethodData.ApplyDllImportAttribute): Likewise.
9620         (MethodData.CheckAbstractAndExternal): Likewise.
9621         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9622         (MethodData.Emit): Formerly known as Method.Emit().
9623         (MemberBase): Moved everything which was specific to a single
9624         accessor/method to MethodData.
9625         (Method): Create a new MethodData and call Define() and Emit() on it.
9626         (Property, Indexer, Event): Create a new MethodData objects for each
9627         accessor and call Define() and Emit() on them.
9628
9629 2002-07-25  Martin Baulig  <martin@gnome.org>
9630
9631         Made MethodCore derive from MemberBase to reuse the code from there.
9632         MemberBase now also checks for attributes.
9633
9634         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9635         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9636         as virtual.
9637         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9638         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9639         (MemberBase.ApplyAttributes): New virtual method; applies the
9640         attributes to a method or accessor.
9641         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9642         (MemberBase.ApplyConditionalAttribute): Likewise.
9643         (MemberBase.ApplyDllImportAttribute): Likewise.
9644         (MemberBase.CheckAbstractAndExternal): Likewise.
9645         (MethodCore.ParameterTypes): This is now a property instead of a
9646         method, it's initialized from DoDefineParameters().
9647         (MethodCore.ParameterInfo): Removed the set accessor.
9648         (MethodCore.DoDefineParameters): New protected virtual method to
9649         initialize ParameterTypes and ParameterInfo.
9650         (Method.GetReturnType): We can now simply return the MemberType.
9651         (Method.GetMethodFlags): Override the MemberBase version and add
9652         the conditional flags.
9653         (Method.CheckBase): Moved some code from Define() here, call
9654         DoDefineParameters() here.
9655         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9656         here to avoid some larger code duplication.
9657         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9658         ensure that abstract and external accessors don't declare a body.
9659
9660         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9661         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9662         lookup in the attribute's parent classes, so we need to abort as soon
9663         as we found the first match.
9664         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9665         the attribute has no arguments.
9666
9667         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9668         of a Method.
9669
9670 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9671
9672         * cs-parser.jay: reverted previous patch.
9673
9674 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9675
9676         * cs-parser.jay: fixed bug #22119.
9677
9678 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9679
9680         * attribute.cs: fixed compilation. The error was:
9681         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9682         be assigned to before control leaves the current method."
9683         [FIXME:  Filed as bug #28186: MCS must report this error.]
9684
9685 2002-07-25  Martin Baulig  <martin@gnome.org>
9686
9687         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9688         method to pull the condition name ouf of a Conditional attribute.
9689         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9690         the obsolete message and error flag out of an Obsolete attribute.
9691
9692         * class.cs (Method.GetMethodFlags): New public method to get the
9693         TypeManager.MethodFlags for this method.
9694         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9695         private methods.
9696         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9697         if we're overriding a virtual function, set the new private variable
9698         `parent_method'; call the new TypeManager.AddMethod().
9699
9700         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9701         the MethodBuilder and the Method in a PtrHashtable.
9702         (TypeManager.builder_to_method): Added for this purpose.
9703         (TypeManager.MethodFlags): Added IsObsoleteError.
9704         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9705         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9706         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9707         the message from the attribute.
9708
9709 2002-07-24  Martin Baulig  <martin@gnome.org>
9710
9711         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9712         preprocessor directives, ensure that the argument to #define/#undef is
9713         exactly one identifier and that it's actually an identifier.
9714
9715         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9716         did not work ....
9717
9718 2002-07-24  Martin Baulig  <martin@gnome.org>
9719
9720         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9721         initialize it to TypeManager.object_type in the constructor.
9722         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9723         of the `hm.get_current' method if we're using the collection pattern.
9724         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9725         for the explicit conversion to make it work when we're using the collection
9726         pattern and the `Current' property has a different return type than `object'.
9727         Fixes #27713.
9728
9729 2002-07-24  Martin Baulig  <martin@gnome.org>
9730
9731         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9732         does not match, but don't report any errors.  This method is called in
9733         order for all methods in a MethodGroupExpr until a matching method is
9734         found, so we don't want to bail out if the first method doesn't match.
9735         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9736         matches, report the 123.  Fixes #28070.
9737
9738 2002-07-24  Martin Baulig  <martin@gnome.org>
9739
9740         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9741         TypeManager.TypeToCoreType() to the top of the method so the
9742         following equality checks will work.  Fixes #28107.
9743
9744 2002-07-24  Martin Baulig  <martin@gnome.org>
9745
9746         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9747         operand is of type uint, and the other operand is of type sbyte,
9748         short or int, the operands are converted to type long." -
9749         Actually do what this comment already told us.  Fixes bug #28106,
9750         added test-150.cs.
9751
9752 2002-07-24  Martin Baulig  <martin@gnome.org>
9753
9754         * class.cs (MethodBase): New abstract class.  This is now a base
9755         class for Property, Indexer and Event to avoid some code duplication
9756         in their Define() and DefineMethods() methods.
9757         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
9758         generic methods for Define() and DefineMethods().
9759         (FieldBase): Derive from MemberBase, not MemberCore.
9760         (Property): Derive from MemberBase, not MemberCore.
9761         (Property.DefineMethod): Moved all the code from this method to the
9762         new MethodBase.DefineAccessor(), just call it with appropriate
9763         argumetnts.
9764         (Property.Define): Call the new Property.DoDefine(), this does some
9765         sanity checks and we don't need to duplicate the code everywhere.
9766         (Event): Derive from MemberBase, not MemberCore.
9767         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
9768         accessors, this will also make them work with interface events.
9769         (Indexer): Derive from MemberBase, not MemberCore.
9770         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
9771         (Indexer.Define): Use the new MethodBase functions.
9772
9773         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
9774         argument to the constructor.
9775         (Interface.FindMembers): Added support for interface events.
9776         (Interface.PopluateEvent): Implemented.
9777
9778         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9779
9780 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9781
9782         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9783         but this is required to check for a method name being the same as
9784         the containing class.  
9785
9786         Handle this now.
9787
9788 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9789
9790         * interface.cs: initialize variable.
9791
9792 2002-07-23  Martin Baulig  <martin@gnome.org>
9793
9794         Implemented the IndexerName attribute in interfaces.
9795
9796         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9797         name if this is an explicit interface implementation.
9798         (Indexer.InterfaceIndexerName): New public variable.  If we're
9799         implementing an interface indexer, this is the IndexerName in that
9800         interface.  Otherwise, it's the IndexerName.
9801         (Indexer.DefineMethod): If we're implementing interface indexer,
9802         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9803         and Pending.ImplementIndexer methods.
9804         (Indexer.Define): Also define the PropertyBuilder if we're
9805         implementing an interface indexer and this is neither an explicit
9806         interface implementation nor do the IndexerName match the one in
9807         the interface.
9808
9809         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9810         If a method is defined here, then we always need to create a proxy
9811         for it.  This is used when implementing interface indexers.
9812         (Pending.IsInterfaceIndexer): New public method.
9813         (Pending.ImplementIndexer): New public method.
9814         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9815         This is used when implementing interface indexers to define a proxy
9816         if necessary.
9817         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9818         define a proxy if necessary.
9819
9820         * interface.cs (Interface.IndexerName): New public variable.
9821         (Interface.PopulateIndexer): Set the IndexerName.
9822         (Interface.DefineIndexers): New private method.  Populate all the
9823         indexers and make sure their IndexerNames match.
9824
9825         * typemanager.cs (IndexerPropertyName): Added support for interface
9826         indexers.
9827
9828 2002-07-22  Martin Baulig  <martin@gnome.org>
9829
9830         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9831         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9832         ret if HasReturnLabel.
9833         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9834         variables.
9835
9836         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9837         and set the ec.LoopBeginTryCatchLevel.
9838         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9839         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9840         the current ec.TryCatchLevel, the branch goes out of an exception
9841         block.  In this case, we need to use Leave and not Br.
9842
9843 2002-07-22  Martin Baulig  <martin@gnome.org>
9844
9845         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9846         block unless the block does not always return or it is contained in
9847         another try { ... } catch { ... } block.  Fixes bug #26506.
9848         Added verify-1.cs to the test suite.
9849
9850 2002-07-22  Martin Baulig  <martin@gnome.org>
9851
9852         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9853         then we do not always return.  Fixes bug #24985.
9854
9855 2002-07-22  Martin Baulig  <martin@gnome.org>
9856
9857         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9858         lookup on a per-class level; ie. walk up the class hierarchy until we
9859         found at least one applicable method, then choose the best among them.
9860         Fixes bug #24463 and test-29.cs.
9861
9862 2002-07-22  Martin Baulig  <martin@gnome.org>
9863
9864         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9865         return types of the methods.  The return type is not part of the
9866         signature and we must not check it to make the `new' modifier work.
9867         Fixes bug #27999, also added test-147.cs.
9868         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9869
9870         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9871         on the method's return type.
9872
9873 2002-07-21  Martin Baulig  <martin@gnome.org>
9874
9875         * assign.cs: Make this work if the rightmost source is a constant and
9876         we need to do an implicit type conversion.  Also adding a few more tests
9877         to test-38.cs which should have caught this.
9878
9879         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9880         target in the makefile for this.  The makefile.gnu is primarily intended
9881         for end-users who don't want to debug the compiler.
9882
9883 2002-07-21  Martin Baulig  <martin@gnome.org>
9884
9885         * assign.cs: Improved the Assign class so it can now handle embedded
9886         assignments (X = Y = Z = something).  As a side-effect this'll now also
9887         consume less local variables.  test-38.cs now passes with MCS, added
9888         a few new test cases to that test.
9889
9890 2002-07-20  Martin Baulig  <martin@gnome.org>
9891
9892         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
9893         instructions.  Fixes bug #27977, also added test-146.cs.
9894
9895 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9896
9897         * cs-tokenizer.cs: fixed getHex ().
9898
9899 2002-07-19  Martin Baulig  <martin@gnome.org>
9900
9901         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
9902         not Type.GetType() to lookup the array type.  This is needed when
9903         we're constructing an array of a user-defined type.
9904         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
9905         single-dimensional arrays, but also for single-dimensial arrays of
9906         type decimal.
9907
9908 2002-07-19  Martin Baulig  <martin@gnome.org>
9909
9910         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
9911         this function is called, it's not allowed to share LocalBuilders
9912         among ILGenerators.
9913
9914 2002-07-19  Martin Baulig  <martin@gnome.org>
9915
9916         * expression.cs (Argument.Resolve): Report an error 118 when trying
9917         to pass a type as argument.
9918
9919 2002-07-18  Martin Baulig  <martin@gnome.org>
9920
9921         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
9922         Conv_R_Un for the signed `long' type.
9923
9924 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
9925
9926         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
9927         `expr' for the temporary result, as that will fail if we do
9928         multiple resolves on the same expression.
9929
9930 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
9931
9932         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
9933         ec.TypeContainer for looking up aliases. 
9934
9935         * class.cs (TypeContainer): Remove LookupAlias from here.
9936
9937         * decl.cs (DeclSpace); Move here.
9938
9939 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
9940
9941         * class.cs (FindMembers): Only call filter if the constructor
9942         bulider is not null.
9943
9944         Also handle delegates in `NestedTypes' now.  Now we will perform
9945         type lookups using the standard resolution process.  This also
9946         fixes a bug.
9947
9948         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
9949         This uses Expressions (the limited kind that can be parsed by the
9950         tree) instead of strings.
9951
9952         * expression.cs (ComposedCast.ToString): Implement, used to flag
9953         errors since now we have to render expressions.
9954
9955         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
9956         FormArrayType. 
9957
9958         * ecore.cs (SimpleName.ToString): ditto.
9959
9960         * cs-parser.jay: Instead of using strings to assemble types, use
9961         Expressions to assemble the type (using SimpleName, ComposedCast,
9962         MemberAccess).  This should fix the type lookups in declarations,
9963         because we were using a different code path for this.
9964
9965         * statement.cs (Block.Resolve): Continue processing statements
9966         even when there is an error.
9967
9968 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
9969
9970         * class.cs (Event.Define): Also remove the `remove' method from
9971         the list of pending items.
9972
9973         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
9974         generate more compact code. 
9975
9976 2002-07-17  Martin Baulig  <martin@gnome.org>
9977
9978         * const.cs (Const.LookupConstantValue): Add support for constant
9979         `unchecked' and `checked' expressions.
9980         Also adding test case test-140.cs for this.
9981
9982 2002-07-17  Martin Baulig  <martin@gnome.org>
9983
9984         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
9985         check whether mi.ReturnType implements the IEnumerator interface; the
9986         `==' and the IsAssignableFrom() will fail in this situation.
9987
9988 2002-07-16  Ravi Pratap  <ravi@ximian.com>
9989
9990         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
9991         here too.
9992
9993 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9994
9995         * expression.cs: fixed bug #27811.
9996
9997 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
9998
9999         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10000         Molaro: when we are a ref, the value already contains a pointer
10001         value, do not take the address of it.
10002
10003 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10004         * removed mb-parser.jay and mb-tokenizer.cs
10005
10006 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10007
10008         * expression.cs: check against the building corlib void type.
10009
10010 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10011
10012         * ecore.cs: fix for valuetype static readonly fields: when 
10013         initializing them, we need their address, not the address of a copy.
10014
10015 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10016
10017         * typemanager.cs: register also enum_type in corlib.
10018
10019 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10020
10021         * class.cs: allow calling this (but not base) initializers in structs.
10022
10023 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10024
10025         * ecore.cs: make sure we compare against the building base types
10026         in GetTypeSize ().
10027
10028 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10029
10030         * typemanager.cs: fix TypeToCoreType() to handle void and object
10031         (corlib gets no more typerefs after this change).
10032
10033 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10034
10035         * expression.cs (ArrayCreation.EmitArrayArguments): use
10036         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10037
10038         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10039         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10040         array indexes, the runtime actually forbids them.
10041
10042         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10043         for array arguments here.
10044
10045         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10046         instead of the default for ValueTypes.
10047
10048         (New.DoEmit): Use IsValueType instead of
10049         IsSubclassOf (value_type)
10050         (New.DoResolve): ditto.
10051         (Invocation.EmitCall): ditto.
10052
10053         * assign.cs (Assign): ditto.
10054
10055         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10056         Statements *are* currently doing part of their resolution during
10057         Emit.  
10058
10059         Expressions do always resolve during resolve, but statements are
10060         only required to propagate resolution to their children.
10061
10062 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10063
10064         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10065
10066         (LoadAssembly): Do not add the dll if it is already specified
10067
10068         (MainDriver): Add the System directory to the link path at the end,
10069         after all the other -L arguments. 
10070
10071         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10072         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10073         ldelem.u1) and using the opposite for sbytes.
10074
10075         This fixes Digger, and we can finally run it.
10076
10077         * driver.cs (UnixParseOption): Move the option parsing here.  
10078         (CSCParseOption): Implement CSC-like parsing of options.
10079
10080         We now support both modes of operation, the old Unix way, and the
10081         new CSC-like way.  This should help those who wanted to make cross
10082         platform makefiles.
10083
10084         The only thing broken is that /r:, /reference: and /lib: are not
10085         implemented, because I want to make those have the same semantics
10086         as the CSC compiler has, and kill once and for all the confussion
10087         around this.   Will be doing this tomorrow.
10088
10089         * statement.cs (Unsafe.Resolve): The state is checked during
10090         resolve, not emit, so we have to set the flags for IsUnsfe here.
10091
10092 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10093
10094         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10095         not catch the Error_ObjectRefRequired in SimpleName (as it is
10096         possible to have a class/instance variable name that later gets
10097         deambiguated), we have to check this here.      
10098
10099 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10100
10101         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10102         make static and put into Expression.
10103
10104         (Event.Define): Register the private field of the event with the 
10105         TypeManager so that GetFieldFromEvent can get at it.
10106
10107         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10108         keep track of the private field associated with an event which
10109         has no accessors.
10110
10111         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10112         private field.
10113
10114         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10115
10116 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10117
10118         * expression.cs (Binary.EmitBranchable): this routine emits the
10119         Binary expression in a branchable context.  This basically means:
10120         we need to branch somewhere, not just get the value on the stack.
10121
10122         This works together with Statement.EmitBoolExpression.
10123
10124         * statement.cs (Statement.EmitBoolExpression): Use
10125         EmitBranchable. 
10126
10127 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10128
10129         * statement.cs (For): Reduce the number of jumps in loops.
10130
10131         (For): Implement loop inversion for the For statement.
10132
10133         (Break): We can be breaking out of a Try/Catch controlled section
10134         (foreach might have an implicit try/catch clause), so we need to
10135         use Leave instead of Br.
10136
10137         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10138         now).  If the instace expression supports IMemoryLocation, we use
10139         the AddressOf method from the IMemoryLocation to extract the
10140         address instead of emitting the instance.
10141
10142         This showed up with `This', as we were emitting the instance
10143         always (Emit) instead of the Address of This.  Particularly
10144         interesting when This is a value type, as we dont want the Emit
10145         effect (which was to load the object).
10146
10147 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10148
10149         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10150
10151         * statement.cs (Checked): Set the CheckedState during the resolve
10152         process too, as the ConvCast operations track the checked state on
10153         the resolve process, and not emit.
10154
10155         * cs-parser.jay (namespace_member_declaration): Flag that we have
10156         found a declaration when we do.  This is used to flag error 1529
10157
10158         * driver.cs: Report ok when we display the help only.
10159
10160 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10161
10162         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10163
10164 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10165
10166         * cs-tokenizer.cs (define): We also have to track locally the
10167         defines.  AllDefines is just used for the Conditional Attribute,
10168         but we also need the local defines for the current source code. 
10169
10170 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10171
10172         * statement.cs (While, For, Do): These loops can exit through a
10173         Break statement, use this information to tell whether the
10174         statement is the last piece of code.
10175
10176         (Break): Flag that we break.
10177
10178         * codegen.cs (EmitContexts): New `Breaks' state variable.
10179
10180 2002-07-03  Martin Baulig  <martin@gnome.org>
10181
10182         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10183         modifiers in method declarations in structs.  Otherwise, you won't
10184         be able to override things like Object.Equals().
10185
10186 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10187
10188         * class.cs (Method, Property, Indexer): Do not allow the public
10189         modifier to be used in explicit interface implementations.
10190
10191         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10192         override modifiers in method declarations in structs
10193
10194 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10195
10196         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10197         integer or real overflow, report an error
10198
10199 2002-07-02  Martin Baulig  <martin@gnome.org>
10200
10201         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10202         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10203         to tell the runtime about our newly created System.Object and
10204         System.ValueType types.
10205
10206 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10207
10208         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10209         struct instead of Ldarg/Starg.
10210
10211 2002-07-02  Martin Baulig  <martin@gnome.org>
10212
10213         * expression.cs (Indirection.Indirection): Call
10214         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10215
10216 2002-07-02  Martin Baulig  <martin@gnome.org>
10217
10218         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10219         ValueType, call TypeManager.TypeToCoreType() on it.
10220         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10221         the OpCodes.Newarr argument.
10222
10223 2002-07-02  Martin Baulig  <martin@gnome.org>
10224
10225         * expression.cs (Invocation.EmitCall): When compiling corlib,
10226         replace all calls to the system's System.Array type to calls to
10227         the newly created one.
10228
10229         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10230         System.Array methods.
10231         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10232         from the system's System.Array type which must be replaced.
10233
10234 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10235
10236         * typemanager.cs: load unverifiable_code_ctor so we can build
10237         corlib using the correct type. Avoid using GetTypeCode() with
10238         TypeBuilders.
10239         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10240         TypeManager.object_type to allow building corlib.
10241
10242 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10243
10244         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10245
10246 2002-07-01  Martin Baulig  <martin@gnome.org>
10247
10248         * class.cs: Make the last change actually work, we need to check
10249         whether `ifaces != null' to avoid a crash.
10250
10251 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10252
10253         * class.cs: when we build structs without fields that implement
10254         interfaces, we need to add the interfaces separately, since there is
10255         no API to both set the size and add the interfaces at type creation
10256         time.
10257
10258 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10259
10260         * expression.cs: the dimension arguments to the array constructors
10261         need to be converted if they are a long.
10262
10263 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10264
10265         * class.cs: don't emit ldarg.0 if there is no parent constructor
10266         (fixes showstopper for corlib).
10267
10268 2002-06-29  Martin Baulig  <martin@gnome.org>
10269
10270         MCS now compiles corlib on GNU/Linux :-)
10271
10272         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10273         ie. check for MethodImplOptions.InternalCall.
10274
10275         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10276         and TypeManager.attribute_type are null, so we must explicitly check
10277         whether parent is not null to find out whether it's an attribute type.
10278         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10279         and SetBuilder, not only if the property is neither abstract nor external.
10280         This is necessary to set the MethodImplOptions on the accessor methods.
10281         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10282         SetBuilder, see Property.Emit().
10283
10284         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10285         populate "System.Object", "System.ValueType" and "System.Attribute" since
10286         they've already been populated from BootCorlib_PopulateCoreTypes().
10287
10288 2002-06-29  Martin Baulig  <martin@gnome.org>
10289
10290         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10291         is the NullLiteral, we also need to make sure that target_type is not
10292         an enum type.   
10293
10294 2002-06-29  Martin Baulig  <martin@gnome.org>
10295
10296         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10297         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10298         before calling BootstrapCorlib_ResolveDelegate ().
10299
10300 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10301
10302         * statement.cs: fixed build-breaker. All tests passed ok.
10303
10304 2002-06-27  Martin Baulig  <martin@gnome.org>
10305
10306         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10307         for System.Decimal when compiling corlib.
10308
10309 2002-06-27  Martin Baulig  <martin@gnome.org>
10310
10311         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10312         switch blocks which contain nothing but a default clause.
10313
10314 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10315
10316        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10317
10318 2002-06-27  Martin Baulig  <martin@gnome.org>
10319
10320         * ecore.cs (PropertyExpr.PropertyExpr): Call
10321         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10322
10323         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10324         is already a TypeBuilder.
10325
10326 2002-06-27  Martin Baulig  <martin@gnome.org>
10327
10328         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10329         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10330         the "from an array-type to System.Array" case.  This makes it work
10331         when compiling corlib.
10332
10333 2002-06-27  Martin Baulig  <martin@gnome.org>
10334
10335         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10336         non-static PropertyExpr, set its InstanceExpression.  This makes
10337         the `ICollection.Count' property work in System/Array.cs.
10338
10339 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10340
10341         * driver.cs: Made error handling more consistent.  Errors now
10342         tracked by Report class, so many methods which used to return int
10343         now return void.  Main() now prints success/failure and 
10344         errors/warnings message.
10345
10346         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10347         the magic number return values (123 and 124).  Now, if the
10348         expected error occurs, the compiler exits with success (exit value
10349         0).  If the compilation completes without seeing that particular
10350         error, the compiler exits with failure (exit value 1).  The
10351         makefile in mcs/errors has been changed to handle the new behaviour.
10352
10353         * report.cs: Made 'expected error' number a property and renamed
10354         it from 'Probe' to 'ExpectedError'.
10355
10356         * genericparser.cs: Removed error handling support, since it is
10357         now all done by Report class.
10358
10359         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10360         class, so parse() no longer returns an int.
10361
10362         * namespace.cs: Use Report.Error instead of GenericParser.error
10363
10364 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10365
10366         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10367         TypeContainer.AddOperator): At the front of the list put the
10368         explicit implementations, so they get resolved/defined first. 
10369
10370 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10371
10372         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10373         interface type is implemented by this TypeContainer.  Used during
10374         explicit interface implementation.
10375
10376         (Property.Define, Indexer.Define, Method.Define): Validate that
10377         the given interface in the explicit implementation is one of the
10378         base classes for the containing type.
10379
10380         Also if we are explicitly implementing an interface, but there is
10381         no match in the pending implementation table, report an error.
10382
10383         (Property.Define): Only define the property if we are
10384         not explicitly implementing a property from an interface.  Use the
10385         correct name also for those properties (the same CSC uses,
10386         although that is really not needed).
10387
10388         (Property.Emit): Do not emit attributes for explicitly implemented
10389         properties, as there is no TypeBuilder.
10390
10391         (Indexer.Emit): ditto.
10392
10393         Hiding then means that we do not really *implement* a pending
10394         implementation, which makes code fail.
10395
10396 2002-06-22  Martin Baulig  <martin@gnome.org>
10397
10398         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10399         the return value of Object.GetType().  [FIXME: we need to do this whenever
10400         we get a type back from the reflection library].
10401
10402 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10403
10404         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10405
10406 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10407
10408         * attribute.cs: Return null if we can not look up the type.
10409
10410         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10411         the interface types found.
10412
10413         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10414         interface types found.
10415
10416         * typemanager.cs (GetInterfaces): Make this routine returns alll
10417         the interfaces and work around the lame differences between
10418         System.Type and System.Reflection.Emit.TypeBuilder in the results
10419         result for GetInterfaces.
10420
10421         (ExpandInterfaces): Given an array of interface types, expand and
10422         eliminate repeated ocurrences of an interface.  This expands in
10423         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10424         be IA, IB, IC.
10425
10426 2002-06-21  Martin Baulig  <martin@gnome.org>
10427
10428         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10429         on System.Enum.
10430
10431 2002-06-21  Martin Baulig  <martin@gnome.org>
10432
10433         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10434         and called with one of the core types, return the corresponding typebuilder for
10435         that type.
10436
10437         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10438         element type.
10439
10440 2002-06-21  Martin Baulig  <martin@gnome.org>
10441
10442         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10443         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10444         (Expression.ConvertReferenceExplicit): Likewise.
10445
10446         * expression.cs (ElementAccess.DoResolve): Likewise.
10447         (ElementAccess.DoResolveLValue): Likewise.
10448
10449 2002-06-10  Martin Baulig  <martin@gnome.org>
10450
10451         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10452         add the "value" parameter to the parameter list.
10453
10454         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10455         to our caller.
10456
10457 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10458
10459         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10460         the argument to an int, uint, long or ulong, per the spec.  Also
10461         catch negative constants in array creation.
10462
10463 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10464
10465         * class.cs: do not allow the same interface to appear twice in
10466         the definition list.
10467
10468 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10469
10470         * ecore.cs: don't use ldlen with System.Array.
10471
10472 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10473
10474         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10475
10476 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10477
10478         * modifiers.cs: produce correct field attributes for protected
10479         internal. Easy fix so miguel can work on ther harder stuff:-)
10480
10481 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10482
10483         * pending.cs: New file.  Move the code from class.cs here.
10484         Support clearning the pending flag for all methods (when not doing
10485         explicit interface implementation).
10486
10487 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10488
10489         * rootcontext.cs: added a couple more types needed to bootstrap.
10490
10491 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10492
10493         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10494         constructor in the type, instead of any constructor in the type
10495         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10496         a bug in the Mono runtime when applying the params attribute). 
10497
10498 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10499         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10500
10501 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10502
10503         * expression.cs (Unary.ResolveOperator): Use TypeManager
10504         to resolve the type.
10505
10506 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10507
10508         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10509         attached.
10510
10511         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10512         with each member too.
10513
10514         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10515         field builders too - this takes care of the enum member case.
10516
10517 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10518
10519         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10520         address-of operator on both value types and pointers.
10521
10522 2002-06-10  Martin Baulig  <martin@gnome.org>
10523
10524         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10525         PropertyBuilder to the `property_builders' list.
10526
10527         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10528         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10529         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10530         find any indexers which are inherited from an interface.
10531
10532 2002-06-09  Martin Baulig  <martin@gnome.org>
10533
10534         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10535         the same type as the constant if necessary.  There's also a test-130.cs
10536         for this.
10537
10538         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10539
10540         * typemanager.cs (TypeManager.ChangeType): Previously known as
10541         Enum.ChangeEnumType().
10542
10543 2002-06-09  Martin Baulig  <martin@gnome.org>
10544
10545         * expression.cs (Cast.TryReduce): Added support for consts.
10546
10547 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10548
10549         * class.cs (Accessor): Hold attributes information so we can pass
10550         it along.
10551
10552         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10553         Modify to pass in attributes attached to the methods.
10554
10555         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10556
10557         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10558         to handle the Accessor kind :-)
10559
10560         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10561
10562 2002-06-08  Martin Baulig  <martin@gnome.org>
10563
10564         * expression.cs (Unary.TryReduceNegative): Added support for
10565         ULongConstants.
10566
10567 2002-06-08  Martin Baulig  <martin@gnome.org>
10568
10569         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10570         name can't be found in the `defined_names' - the caller will do a
10571         MemberLookup in this case and thus find methods in System.Enum
10572         such as Enum.IsDefined().
10573
10574 2002-06-08  Martin Baulig  <martin@gnome.org>
10575
10576         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10577         Convert.ChangeType() which works with TypeBuilder created types.
10578         (Enum.LookupEnumValue, Enum.Define): Use it here.
10579
10580         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10581         `TypeBuilder.BaseType != null' check.
10582         (TypeContainer.FindMembers): Only lookup parent members if we
10583         actually have a parent.
10584         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10585         (ConstructorInitializer.Resolve): Likewise.
10586
10587         * interface.cs (Interface.FindMembers): Added
10588         `TypeBuilder.BaseType != null' check.
10589
10590         * rootcontext.cs (RootContext.ResolveCore): Added
10591         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10592         classes_second_stage.
10593
10594         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10595         debug_type and trace_type when compiling with --nostdlib.       
10596
10597 2002-06-07  Martin Baulig  <martin@gnome.org>
10598
10599         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10600         (AddField): Set it to true when adding a non-static field.
10601         (DefineType): Use `have_nonstatic_fields' to find out whether we
10602         have non-static fields, not `Fields != null'.
10603
10604 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10605
10606         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10607         dereferencing a null on the static-field code path)
10608
10609 2002-05-30  Martin Baulig  <martin@gnome.org>
10610
10611         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10612         to take command line arguments.  Use reflection to call the new
10613         custom `Initialize' function on the symbol writer and pass it the
10614         command line arguments.
10615
10616         * driver.cs (--debug-args): New command line argument to pass command
10617         line arguments to the symbol writer.
10618
10619 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10620
10621         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10622         the target type for indexers and properties.  Thanks to Joe for
10623         catching this.
10624
10625 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10626
10627         * typemanager.cs (MethodFlags): returns the method flags
10628         (Obsolete/ShouldIgnore) that control warning emission and whether
10629         the invocation should be made, or ignored. 
10630
10631         * expression.cs (Invocation.Emit): Remove previous hack, we should
10632         not do this on matching a base type, we should do this based on an attribute
10633
10634         Only emit calls to System.Diagnostics.Debug and
10635         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10636         on the command line.
10637
10638         * rootcontext.cs: Global settings for tracing and debugging.
10639
10640         * cs-tokenizer.cs (define): New utility function to track
10641         defines.   Set the global settings for TRACE and DEBUG if found.
10642
10643 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10644
10645         * interface.cs (Populate*): Pass in the TypeContainer as well as
10646         the DeclSpace as parameters so that we can create EmitContexts and
10647         then use that to apply attributes etc.
10648
10649         (PopulateMethod, PopulateEvent, PopulateProperty)
10650         (PopulateIndexer): Apply attributes everywhere.
10651
10652         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10653         etc.
10654
10655         (ApplyAttributes): Update accordingly.
10656
10657         We now apply interface attributes for all members too.
10658
10659 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10660
10661         * class.cs (Indexer.Define); Correctly check if we are explicit
10662         implementation (instead of checking the Name for a ".", we
10663         directly look up if the InterfaceType was specified).
10664
10665         Delay the creation of the PropertyBuilder.
10666
10667         Only create the PropertyBuilder if we are not an explicit
10668         interface implementation.   This means that explicit interface
10669         implementation members do not participate in regular function
10670         lookups, and hence fixes another major ambiguity problem in
10671         overload resolution (that was the visible effect).
10672
10673         (DefineMethod): Return whether we are doing an interface
10674         implementation. 
10675
10676         * typemanager.cs: Temporary hack until we get attributes in
10677         interfaces (Ravi is working on that) and we get IndexerName
10678         support in interfaces.
10679
10680         * interface.cs: Register the indexers as properties.
10681
10682         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10683         warning, I have verified that this is a bug in the .NET runtime
10684         (JavaScript suffers of the same problem).
10685
10686         * typemanager.cs (MemberLookup): When looking up members for
10687         interfaces, the parent of an interface is the implicit
10688         System.Object (so we succeed in searches of Object methods in an
10689         interface method invocation.  Example:  IEnumerable x;  x.ToString
10690         ()) 
10691
10692 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10693
10694         * class.cs (Event): Events should also register if they do
10695         implement the methods that an interface requires.
10696
10697         * typemanager.cs (MemberLookup); use the new GetInterfaces
10698         method. 
10699
10700         (GetInterfaces): The code used to lookup interfaces for a type is
10701         used in more than one place, factor it here. 
10702
10703         * driver.cs: Track the errors at the bottom of the file, we kept
10704         on going.
10705
10706         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10707         instance if the method we are calling is static!
10708
10709 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10710
10711         * attribute.cs (ApplyAttributes): Make this function filter out
10712         the IndexerName attribute (as that attribute in reality is never
10713         applied) and return the string constant for the IndexerName
10714         attribute. 
10715
10716         * class.cs (TypeContainer.Emit): Validate that all the indexers
10717         have the same IndexerName attribute, and if so, set the
10718         DefaultName attribute on the class. 
10719
10720         * typemanager.cs: The return value might contain other stuff (not
10721         only methods).  For instance, consider a method with an "Item"
10722         property and an Item method.
10723
10724         * class.cs: If there is a problem with the parameter types,
10725         return. 
10726
10727 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10728
10729         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10730         looks at user defined conversion after making a call to 
10731         StandardConversionExists - we need this for overload resolution.
10732
10733         * expression.cs : Update accordingly the various method calls.
10734
10735         This fixes 2 bugs filed against implicit user defined conversions 
10736
10737 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10738
10739         * statement.cs: Track the result of the assignment.
10740
10741 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10742
10743         * expression.cs (MemberAccess): Improved error reporting for
10744         inaccessible members.
10745
10746 2002-05-22  Martin Baulig  <martin@gnome.org>
10747
10748         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10749         itself with debugging support.
10750
10751 2002-05-22  Martin Baulig  <martin@gnome.org>
10752
10753         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10754         Removed, this isn't needed anymore.
10755
10756 2002-05-20  Martin Baulig  <martin@gnome.org>
10757
10758         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
10759         be underlying type for an enum.
10760
10761 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
10762
10763         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
10764         that splits out the loading of just the core types.
10765
10766         * rootcontext.cs (ResolveCore): Split the struct resolution in
10767         two, so we can load the enumeration underlying types before any
10768         enums are used.
10769
10770         * expression.cs (Is): Bandaid until we fix properly Switch (see
10771         bug #24985 for details).
10772
10773         * typemanager.cs (ImplementsInterface): The hashtable will contain
10774         a null if there are no interfaces implemented.
10775
10776 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
10777
10778         * cs-parser.jay (indexer_declarator): It is fine to have array
10779         parameters
10780
10781 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10782
10783         * typemanager.cs: (RegisterBuilder): New function used to register
10784         TypeBuilders that implement interfaces.  Since
10785         TypeBuilder.GetInterfaces (as usual) does not work with lame
10786         Reflection.Emit. 
10787         (AddUserType): register interfaces.
10788
10789         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10790         dealing with TypeBuilder.  Also, arrays are showing up as
10791         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10792         methods can not be invoked on them!
10793
10794         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10795         (ImplicitReferenceConversionExists): Split out from
10796         StandardConversionExists. 
10797
10798         * expression.cs (As): We were only implementing one of the three
10799         cases for the as operator.  We now implement them all.
10800         (Is): Implement the various other cases for Is as well.
10801
10802         * typemanager.cs (CACHE): New define used to control if we want or
10803         not the FindMembers cache.  Seems to have a negative impact on
10804         performance currently
10805
10806         (MemberLookup): Nested types have full acess to
10807         enclosing type members
10808
10809         Remove code that coped with instance/static returns for events, we
10810         now catch this in RealFindMembers.
10811
10812         (RealFindMembers): only perform static lookup if the instance
10813         lookup did not return a type or an event.  
10814
10815 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10816
10817         * assign.cs (CompoundAssign): We pass more semantic information
10818         now to Compound Assignments than we did before: now we have all
10819         the information at hand, and now we resolve the target *before* we
10820         do the expression expansion, which allows the "CacheValue" method
10821         to have the effect we intended (before, a [x] += 1 would generate
10822         two differen ArrayAccess expressions from the ElementAccess,
10823         during the resolution process).
10824
10825         (CompoundAssign.DoResolve): Resolve target and original_source here.
10826
10827 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10828
10829         * expression.cs (ArrayAccess): dropped debugging information. 
10830
10831         * typemanager.cs: Small bug fix: I was always returning i_members,
10832         instead of one of i_members or s_members (depending on which had
10833         the content).
10834
10835         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10836         method is invoked before any code generation takes place, and it
10837         is a mechanism to inform that the expression will be invoked more
10838         than once, and that the method should use temporary values to
10839         avoid having side effects
10840
10841         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10842
10843         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10844         implementation.
10845
10846         * expression.cs (Indirection, ArrayAccess): Add support for
10847         CacheTemporaries in these two bad boys. 
10848
10849         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10850         ldobj or ldind_ref.  
10851         (StoreFromPtr): Handle stobj as well.
10852
10853         * expression.cs (UnaryMutator): Share more code.
10854
10855         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10856         down: I was not tracking the Filter function as well, which
10857         was affecting the results of the cache.
10858
10859 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10860
10861         * attribute.cs: Remove the hack to handle the CharSet property on
10862         StructLayouts. 
10863
10864 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10865
10866         * attribute.cs (DoResolve): More uglyness, we now only try to
10867         resolve the attribute partially, to extract the CharSet
10868         information (only if we are a StructLayout attribute).  Otherwise 
10869
10870         (GetExtraTypeInfo): Add some code to conditionally kill in the
10871         future this.   I am more and more convinced that the .NET
10872         framework has special code to handle the attribute setting on
10873         certain elements.
10874
10875         * expression.cs (IsParamsMethodApplicable): Revert my previous
10876         foreach change here, it was wrong.
10877
10878 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10879
10880         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10881         (pp_expr): do not abort on unknown input, just return.
10882         (eval): abort if there are pending chars.
10883
10884         * attribute.cs (Attribute.Resolve): Positional parameters are
10885         optional.  Deal with that case.
10886
10887         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10888         the Ansi/Unicode/Auto information for the type.
10889
10890         (TypeContainer.DefineType): instantiate the EmitContext here, as
10891         we will be using it during the type definition (to resolve
10892         attributes) and during the emit phase.
10893
10894         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
10895         to pull type information out of the attributes
10896
10897         (Attribute.Resolve): track the constructor builder, and allow for
10898         multiple invocations (structs and classes will use this).
10899
10900         * ecore.cs (MemberLookupFinal): new version with all the
10901         parameters customizable.
10902
10903         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
10904         constructors.  Return if the result value is null (as the error
10905         would have been flagged already by MemberLookupFinal)
10906
10907         Do not allow instances of abstract classes or interfaces to be
10908         created.
10909
10910         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
10911         We have to compare the assembly property here when dealing with
10912         FamANDAssem and Assembly access modifiers, because we might be
10913         creating an assembly from *modules* (that means that we are not
10914         getting TypeBuilders for types defined in other modules that are
10915         part of this assembly).
10916
10917         (Method.Emit): If the method is marked abstract and has a body,
10918         emit an error. 
10919
10920         (TypeContainer.DefineMembers): If both the defined member and the
10921         parent name match are methods, then do not emit any warnings: let
10922         the Method.Define routine take care of flagging warnings.  But if
10923         there is a mismatch (method overrides something else, or method is
10924         overriwritten by something, then emit warning).
10925
10926         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
10927         set to null, this means `do not check for the return type on the
10928         signature'. 
10929
10930         (Method.Define): set the return type for the method signature to
10931         null, so that we get methods with the same name and parameters and
10932         different return types.  This is used to flag warning 114 (you are
10933         hiding a method, and you probably want to use the new/override
10934         keywords instead).
10935
10936         * typemanager.cs (MemberLookup): Implemented proper access
10937         control, closing a long standing set of bug reports.  The problem
10938         was that the Framework only has two bits: Public and NonPublic,
10939         and NonPublic includes private and protected methods, but we need
10940         to enforce the FamANDAssem, FamOrAssem and Family. 
10941
10942 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
10943
10944         * statement.cs (GotoCase): Return true: Ammounts to giving up
10945         knowledge on whether we return or not, and letting the other case
10946         be responsible for it.
10947
10948 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
10949
10950         * driver.cs: Do not load directories for each file processed, only
10951         do it if there is a pattern.
10952
10953         * ecore.cs: Report readonly assigns here as well, as we might have
10954         been resolved only by MemberAccess.
10955
10956         (SimpleName.SimpleNameResolve): Also be useful for LValue
10957         resolution.   We need this to propagate assign to local readonly variables
10958
10959         * typemanager.cs: Use a ptrhashtable for the criteria, because we
10960         do not want to reuse potential criteria memory.
10961
10962         * class.cs (MyEventBuilder): Set reflected_type;
10963
10964         * ecore.cs (Constantify): Added support for constifying bools.
10965
10966         (RootContext.LookupType): Added a cache for values looked up in
10967         the declaration space.
10968
10969         * typemanager.cs (FindMembers): Now is a front-end to
10970         RealFindMembers, and provides a two-level hashtable-based cache to
10971         the request.  
10972
10973         15% performance improvement: from 22.5 to 19.2 seconds.
10974
10975         * expression.cs (IsParamsMethodApplicable): use foreach.
10976         (Invocation.DoResolve): ditto.
10977         (New.DoResolve): ditto.
10978         (ArrayCreation.DoResolve): ditto.
10979
10980         * ecore.cs (FindMostEncompassingType): use foreach.
10981
10982         * delegate.cs (NewDelegate.DoResolve): Use foreach
10983
10984         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
10985         (RemoveMethods): use foreach.
10986
10987         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
10988         nested foreach statements instead of for, and also break out of
10989         the inner loop once a match is found.
10990
10991         (Invocation.OverloadResolve): Use foreach, simplify the code. 
10992
10993 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
10994
10995         * cfold.cs (BinaryFold): During an enumeration evaluation context,
10996         we actually unwrap the expression to allow for extra information
10997         to be extracted. 
10998
10999         * expression.cs: Use Shr_Un on unsigned operations. 
11000
11001 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11002
11003         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11004         applicable operators was not being considered correctly. This closes
11005         the bug Miguel reported.
11006
11007 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11008
11009         * attribute.cs: check that the type derives from System.Attribute
11010         and report the correct error in that case (moved the duplicate code to
11011         its own method, too).
11012
11013 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11014
11015         * attribute.cs: lookup attribute type name as the spec says: first the
11016         bare attribute name and then name + "Attribute" (nant compiles with
11017         mcs after this fix).
11018
11019 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11020
11021         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11022         Because of the way we parse things, we should try to see if a
11023         UIntConstant can fit in an integer.
11024
11025 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11026
11027         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11028         when we are in an explicit context.
11029
11030         (ConvertReferenceExplicit): When converting from Iface type S to Class
11031         T make sure the rules are implemented as an OR.
11032
11033         * parameter.cs (ParameterType): Make it a property for now although the
11034         purpose really isn't anything immediate.
11035
11036         * expression.cs (Is*Applicable): Do better checking on the parameter type
11037         of a ref/out parameter. The ones from the system assemblies are already 
11038         marked with the correct type so we don't need to do any correction.
11039
11040         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11041         the object type is standard too so include that.
11042
11043 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11044
11045         * ecore.cs (StandardConversionExists): Augment with missing code:
11046         deal with IntConstant, LongConstants and Enumerations.
11047
11048         * assign.cs: Report the error, instead of failing silently
11049
11050         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11051         typecontainer that they are declared, because the
11052         typecontainer/namespace will have the list of using clauses that
11053         need to be applied.
11054
11055         Assembly Attributes were escaping the normal registration
11056         mechanism. 
11057
11058         (EmitCode): Apply attributes within an EmitContext that represents
11059         the container they were declared on.
11060
11061         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11062
11063 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11064
11065         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11066         Revamp completely - make much cleaner as we now operate only
11067         on a set of Types.
11068
11069         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11070         to implement the logic detailed in the spec more correctly.
11071
11072         (UserDefinedConversion): Update accordingly.
11073
11074 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11075
11076         * statement.cs: Return flow analysis information up.
11077
11078         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11079         and the default.
11080
11081         (token): Do not consume an extra character before calling
11082         decimal_digits.
11083
11084 2002-05-06  Piers Haken <piersh@friskit.com>
11085
11086         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11087
11088 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11089
11090         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11091         EmitContext during the instance constructor initializer
11092         resolution, to stop access to instance variables.
11093
11094         This is mandated by the spec, last paragraph of the `constructor
11095         initializers' section. 
11096
11097 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11098
11099         * cs-parser.jay, class.cs (Accessor): new class used to represent
11100         an accessor (get or set).  In the past we used `null' to represent
11101         a missing accessor.  But this is ambiguous because there was no
11102         way to tell in abstract indexers/properties if one of them was
11103         specified.
11104
11105         Now there is a way of addressing that.
11106
11107         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11108         instead of FindMembers.
11109
11110         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11111         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11112
11113         * attribute.cs: Treat indexers and properties as the same in terms
11114         of applying attributes
11115
11116         * ecore.cs (FindMostEncompassedType): Use statically initialized
11117         EmptyExpressions()s like we do elsewhere to avoid creating useless
11118         objects (and we take this out of the tight loop).
11119
11120         (GetConversionOperators): Move the code to extract the actual
11121         operators to a separate routine to clean things up.
11122
11123 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11124
11125         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11126         events are always registered FieldBuilders.
11127
11128         * class.cs (FieldBase): New class shared by Fields 
11129
11130         * delegate.cs: If we are a toplevel delegate, use our full name.
11131         If we are a nested delegate, then only use our tail name.
11132
11133 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11134
11135         * expression.cs (IsApplicable): Ensure that we add the "&" to
11136         ref/out types before comparing it with the type of the argument.
11137
11138         (IsParamsMethodApplicable): Ditto.
11139
11140         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11141         silly me ;-)
11142
11143         * delegate.cs : Handle the case when we have more than one applicable
11144         method. Flag an error only when we finish checking all.
11145
11146 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11147
11148         * expression.cs: Add support for boolean static initializers.
11149
11150 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11151
11152         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11153
11154         * parameter.cs (ComputeParameterTypes,
11155         ComputeAndDefineParameterTypes): Better error handling: now we
11156         clear the `types' cache if we fail during any of the type lookups.
11157         We also return the status code correctly to our caller
11158
11159         * delegate.cs: If we fail to define a delegate, abort the extra
11160         steps. 
11161
11162         * expression.cs (Binary.ResolveOperator): for
11163         operator==(object,object) and operator !=(object, object) we also
11164         have to verify that there is an implicit conversion from one to
11165         the other.
11166
11167         (ArrayAccess.DoResolve): Array Access can operate on
11168         non-variables. 
11169
11170 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11171
11172         * assign.cs (CompoundAssign): A new class used as a "flag" that
11173         the assignment actually is happening as part of a compound
11174         assignment operator.
11175
11176         During compound assignment, a few new rules exist to enable things
11177         like:
11178
11179         byte b |= 1 + 2
11180
11181         From the spec:
11182
11183         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11184         to the type of x) if y is implicitly convertible to the type of x,
11185         and the operator is a builtin operator and the return type of the
11186         operator is explicitly convertible to the type of x. 
11187
11188         * rootcontext.cs: Reset warning level to 2.  4 catches various
11189         "interesting" features in mcs, we must clean this up at some
11190         point, but currently am trying to kill other bugs ;-)
11191
11192         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11193         in container classes as well.  
11194
11195         * expression.cs (Binary.ResolveOperator): Handle string case
11196         before anything else (as operator overloading does emit an error
11197         before doing anything else).
11198
11199         This code could go away when we move to a table driven model, but
11200         i could not come up with a good plan last night.
11201
11202 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11203
11204         * typemanager.cs (CSharpName): reimplementation using regex.
11205         * class.cs: added null check for fields in Emit
11206         * rootcontext.cs: set warninglevel to 4
11207
11208 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11209
11210         * typemanager.cs (CSharpName): reimplemented with Lupus
11211         suggestion.
11212
11213 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11214
11215         * statement.cs (If): correclty implement Resolve, because we were
11216         not catching sem errors in there.  The same process is needed
11217         everywhere else. 
11218         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11219
11220
11221         (Statement.Warning_DeadCodeFound): Factorize code.
11222         (While): Report dead code here too.
11223
11224         (Statement): Added Resolve virtual method to allow
11225         for resolution split from the emit code.
11226
11227 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11228
11229         * statement.cs (EmitBoolExpression): No longer try to resolve the
11230         expression here.    
11231         (MakeBoolean): New utility function that resolve, implicitly
11232         converts to boolean and tags the expression. 
11233
11234
11235         (If, Do): Implement dead code elimination.
11236         (While): Implement loop inversion
11237
11238         (Do, While, For, If): Resolve the expression prior to calling our
11239         code generation.
11240
11241 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11242
11243         * class.cs:
11244           - added method Report28 (warning: program has more than one entry point)
11245           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11246           - modified method Method.Define, the part at the end of the method
11247
11248         * rootcontext.cs: added static public Location EntryPointLocation;
11249           
11250         * ../errors/cs0028.cs : Add test case for the above warning.              
11251
11252         * typemanager.cs:
11253           - modified method CSharpName to allow arrays of primitive type to
11254             be printed nicely (e.g. instead of System.Int32[][] it now prints
11255             int[][])
11256           - added method CSharpSignature: returns the signature of a method
11257             in string format to be used in reporting errors, warnings, etc.
11258
11259         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11260         with String.Empty.
11261
11262 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11263
11264         * delegate.cs (Define): Fix extremely silly bug where I was
11265         setting the type of the 'object' parameter of the BeginInvoke
11266         method to System.IAsyncResult instead of System.Object ;-)
11267
11268 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11269
11270         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11271         here. 
11272
11273         (Constructor.Emit): return if we fail to initialize the
11274         constructor.  Another door closed!  
11275
11276         * expression.cs (New.DoResolve): Improve error message (from -6 to
11277         1501).  Use DeclaredOnly lookup to find the exact constructor.
11278
11279         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11280         loop.  This is useful.
11281
11282         * cs-parser.jay: Adjust the default parameters so that destructors
11283         have the proper signature.
11284
11285 2002-04-26  Martin Baulig  <martin@gnome.org>
11286
11287         * driver.cs (LoadAssembly): If `assembly' contains any characters
11288         which are only valid in path names and not in assembly names
11289         (currently slash, backslash and point), use Assembly.LoadFrom ()
11290         instead of Assembly.Load () on the `assembly' (before iteration
11291         over the link_paths).
11292
11293 2002-04-26  Martin Baulig  <martin@gnome.org>
11294
11295         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11296
11297 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11298
11299         * class.cs (Property): use the new typemanager.MemberLookup
11300
11301         (TypeContainer.MemberLookup): Implement using the
11302         TypeManager.MemberLookup now. 
11303
11304         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11305         and return MemberInfos, so that these can be used without an
11306         EmitContext (what we had before).
11307
11308 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11309
11310         * expression.cs: Fix the case where the argument to params if the
11311         type of the params.  I omitted handling this before.   Fixed
11312
11313 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11314
11315         * driver.cs: Call BootCorlib_PopulateCoreType
11316
11317         * class.cs (Property.CheckBase): Check for properties only, not
11318         for all members. 
11319
11320         * interface.cs: Temporary hack: try/catch around the
11321         CustomAttributeBuilder, because I am getting an exception that I
11322         do not understand.
11323
11324         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11325         types whose definitions are required to be there (attributes are
11326         defined before standard types).
11327
11328         Compute definitions as we boot the various types, as they are used
11329         immediately (value_type class will need object_type, but if we do
11330         not initialize object_type, we will pass a null, which will let
11331         the runtime pick the System.Object from the existing corlib, which
11332         is not what we want).
11333
11334 2002-04-22  Patrik Torstensson <totte@labs2.com>
11335
11336         * cs-tokenizer.cs: fixed a number of trim() issues.
11337
11338 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11339
11340         * expression.cs (Argument.Type): Ensure that we return the correct
11341         type when we have out or ref parameters [in which case we 
11342         append a "&"].
11343
11344 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11345
11346         * class.cs (Property, Indexer): Allow extern modifier in there. 
11347
11348         * typemanager.cs (InitBaseTypes): Initializes object_type and
11349         value_type, since those will be used early on during the bootstrap
11350         process to compile corlib.
11351
11352         (InitCoreTypes): Move code from here to InitBaseTypes.
11353
11354 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11355
11356         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11357         single-dimension arrays as using the ldlen opcode.  
11358
11359         Daniel Lewis discovered this optimization.  
11360
11361         * typemanager.cs: Add signature for System.Array::get_Length
11362
11363 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11364
11365         * statement.cs: report the error when the foreach does not apply to an
11366         array nor a collection.
11367
11368 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11369
11370         * expression.cs: Add implicit conversions to the operator ~.
11371
11372         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11373
11374         * typemanager.cs: Locate the decimal constructor.
11375
11376 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11377
11378         * attribute.cs: use the new property of TypeOf.
11379         * expression.cs: added 'get' property around typearg.
11380
11381         These changes fix a build breaker reported by NickD. Is this the
11382         correct way to fix?  If not, please, revert my changes and make it
11383         work :-).
11384
11385 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11386
11387         * attribute.cs: Add support for typeof in attribute invocations.
11388         I am not sure that this is right though.
11389
11390 2002-04-14  Duncan Mak  <duncan@ximian.com>
11391
11392         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11393         Binary.Operator.Division case.
11394
11395 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11396
11397         * class.cs (DefineType): Ensure that we do a proper check on
11398         attribute types and also register it with the TypeManager.
11399
11400         (TypeContainer.Targets): The default for attribute types is
11401         AttributeTargets.All.
11402
11403         * attribute.cs (ApplyAttributes): Registering the attribute type
11404         is done elsewhere, not when we discover we have a Usage attribute.
11405
11406 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11407
11408         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11409         and get rid of is_delegate parameter.
11410
11411         * everywhere : update.
11412
11413 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11414
11415         * cs-parser.jay (compilation_unit): Revamp completely to use
11416         some new ideas that I got from Rhys' grammar to solve the problems
11417         with assembly level attributes.
11418
11419         (outer_declaration): New grammar production.
11420
11421         (attribute_sections): Add.
11422
11423         (opt_attributes): Base on attribute_sections
11424
11425         (namespace_declaration): Allow opt_attributes to tackle the case
11426         when we have assembly level attributes - we are clever in this
11427         regard now ;-)
11428
11429         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11430         attributes in the non-global context.
11431
11432         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11433         instead of SetGlobalAttributes.
11434
11435         * class.cs, rootcontext.cs : Ensure we define and generate 
11436         attribute types before anything else.
11437
11438         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11439         and flag the new error -20 for the case when the attribute type
11440         does not have valid targets specified. csc does not catch this.
11441
11442         * ../errors/errors.txt : update for error # -20
11443
11444 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11445
11446         * support.cs (InternalParameters.ParameterModifier): Do some null
11447         checking and return sane values.
11448
11449         * class.cs (Method.Define): If we are a PInvoke method, ensure
11450         that we are static and extern. Report error # 601
11451
11452         * ../errors/cs0601.cs : Add test case for the above error.
11453
11454 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11455
11456         * rootcontext.cs (attribute_types): We need to keep type of
11457         all attribute types separately and emit code for them first.
11458
11459         (RegisterAttribute) : Implement.
11460
11461         * class.cs (DefineType): Check if the current Type is a custom
11462         attribute type and register it accordingly.
11463
11464         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11465         adding the first attribute twice and rename to
11466
11467         (SetGlobalAttributes): this.
11468
11469         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11470         lookups.
11471
11472         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11473         if we are processing global arguments. Hmm, I am unsure of this.
11474
11475 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11476
11477         * expression.cs: added static array of strings to avoid calling
11478         Enum.ToString () for Operator in Binary. Significant recover of
11479         performance.
11480
11481 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11482
11483         * class.cs (FindMembers): Allow the Builders of the various
11484         members to be null.  If they are skip them.  This only happens
11485         during the PInvoke declaration.
11486
11487 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11488
11489         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11490         failure, so we do not keep going afterwards.
11491
11492         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11493         wanted to pass `false' as the `is_delegate' argument.  If this is
11494         the case, why not use delegate_type == null to mean `is_delegate =
11495         false' and anything else as is_delegate = true.
11496
11497 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11498
11499         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11500         code for the section, not the beginning of the tests.
11501
11502 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11503
11504         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11505
11506         * expression.cs (Binary): same.  Warn about errors where we have
11507         Enum/Enum in operator + as well.
11508
11509 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11510
11511         * statement.cs:
11512                 - added support for switch(bool)
11513                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11514                 - add TableSwitchEmit() to handle table-based switch statements
11515
11516 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11517
11518         * expression.cs (Invocation.OverloadResolve): Factor out code which
11519         does parameter compatibility checking with arguments so that we can 
11520         re-use the code even from Delegate.VerifyApplicability
11521
11522         (VerifyArgumentsCompat): Move above code here.
11523
11524         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11525         and instead make a call to the above method.
11526
11527 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11528
11529         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11530         We use it to keep track of classes which are attribute types.
11531
11532 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11533
11534         * delegate.cs (Delegate.Define): Correctly define the types in the
11535         presence of fixed and array parameters.
11536
11537         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11538         doing FindMembers.
11539
11540         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11541         include NonPublic after the first iteration.
11542
11543         * class.cs (Indexer.CheckBase): Only check if both parents are
11544         non-null. 
11545
11546         * cs-parser.jay (accessor_body): If empty, set to null.
11547
11548         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11549         same code path here to resolve constants names that we did have in
11550         MemberAccess.DoResolve.  There is too much code duplicated here.
11551
11552 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11553
11554         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11555
11556         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11557         to MakeUnionSet.
11558
11559         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11560         tokens, numbers and strings.
11561
11562         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11563         parenthesis.
11564
11565         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11566         asyncronous parameters and the regular parameters.  
11567
11568         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11569         specify the target directory.
11570
11571         * expression.cs: (This.DoResolve): Simplify
11572         (As.Emit): Optimize, do not generate IsInst if the expression is
11573         always of the given type.
11574
11575         (Is.DoResolve): Bug fix, we were reporting both always/never for
11576         the is expression.
11577
11578         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11579         creating too many unnecessary arrays.
11580
11581 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11582
11583         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11584         fields instead of rolling our own initializer.   Takes care of all
11585         implicit conversions, and drops unnecessary static checks/argument.
11586
11587 2002-03-31  Dick Porter  <dick@ximian.com>
11588
11589         * driver.cs: use the GetDirectories() return values properly, and
11590         use "/" as path separator.
11591
11592 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11593
11594         * expression.cs (Unary): Optimize - - expr into expr.
11595         (Binary): Optimize a + (-b) into a -b.
11596
11597         * codegen.cs (CodeGen): Made all methods static.
11598
11599 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11600
11601         * rootcontext.cs: 
11602
11603         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11604         TypeBuilder property.
11605
11606         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11607         instead. 
11608
11609         * tree.cs: Removed the various RecordXXXX, and replaced with a
11610         single RecordDecl.  Removed all the accessor methods, and just
11611         left a single access point Type 
11612
11613         * enum.cs: Rename DefineEnum to DefineType.
11614
11615         * decl.cs: New abstract method `DefineType' used to unify the
11616         Defines for Enumerations, Interfaces, TypeContainers and
11617         Delegates.
11618
11619         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11620         LookupBaseClasses method that used to live in class.cs and
11621         interface.cs here, and renamed to FindType.
11622
11623         * delegate.cs: Implement DefineType.  Take advantage of the
11624         refactored pattern for locating the parent builder without taking
11625         the parent_builder argument (which we know does not work if we are
11626         nested, and triggering a toplevel definition).
11627
11628 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11629
11630         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11631         accessibility of a member has changed during override and report
11632         an error if so.
11633
11634         * class.cs (Method.Define, Property.Define): Only complain on
11635         overrides if the method is private, any other accessibility is
11636         fine (and since we just checked the permission is the same, we are
11637         good to go).
11638
11639         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11640         and elif are processed always.  The other pre-processing
11641         directives are only processed if we are "taking" the path
11642
11643 2002-03-29  Martin Baulig  <martin@gnome.org>
11644
11645         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11646         current location is not Null.
11647
11648         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11649         a separate method so we can profile it.
11650
11651         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11652         `span.Seconds' are just seconds, but no minutes or hours.
11653         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11654
11655 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11656
11657         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11658         Remove the gratuitous set of Final:
11659
11660                                 // If an interface implementation, then we can set Final.
11661                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11662                                     implementing.DeclaringType.IsInterface)
11663                                         flags |= MethodAttributes.Final;
11664
11665         I do not know what I was smoking when I used that.
11666
11667
11668         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11669         step into fixing the name resolution issues for delegates and
11670         unifying the toplevel name resolution.
11671
11672 2002-03-28  Martin Baulig  <martin@gnome.org>
11673
11674         * class.cs (Method.Emit): If we have a symbol writer, call its
11675         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11676         tell it about the current method.
11677
11678         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11679         writer that we're going to emit the first byte of IL code for a new
11680         statement (a new source line).
11681         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11682         EmitContext.Mark() before emitting any code.
11683
11684         * location.cs (SymbolDocument): Return null when we're Null.
11685
11686         * statement.cs (Statement): Moved the `Location loc' variable here.
11687         (Statement.EmitBoolExpression): If we have a symbol writer, call
11688         ec.Mark() before emitting any code to tell it that we're at the
11689         beginning of a new statement.
11690         (StatementExpression): Added `Location' argument to the constructor.
11691         (Block): Added public readonly variable `StartLocation' and public
11692         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11693         (Block): Added constructor which takes a start and end location.
11694         (Block.SetEndLocation): New method. This sets the end location.
11695         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11696         local variables we create.
11697         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11698         each statement and do also mark the begin and end of the block.
11699
11700         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11701         tell it the current lexer.Location, use Location.Null for the end of the
11702         block.
11703         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11704         current block, set its end location using SetEndLocation().
11705         (statement_expression): StatementExpression constructor now takes the
11706         lexer.Location as additional argument.
11707         (for_statement, declare_local_variables): Likewise.
11708         (declare_local_variables): When creating a new implicit block, use the
11709         new Block constructor and pass it the lexer.Location.
11710
11711 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11712
11713         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11714         members also on the parent interfaces recursively.
11715
11716 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11717
11718         * report.cs: Use new formats, since Gonzalo finished the missing
11719         bits. 
11720
11721         * expression.cs (Binary.ResolveOperator): added missing operator|
11722         operator& and operator^ for bool/bool.
11723
11724         * cs-parser.jay: CheckDef now takes a Location argument that is
11725         used to report errors more precisly (instead of reporting the end
11726         of a definition, we try to track something which is a lot closer
11727         to the source of the problem).
11728
11729         * cs-tokenizer.cs: Track global token use, so we can properly flag
11730         the use of #define/#undef after the first token has been seen.
11731
11732         Also, rename the reportXXXX to Error_DescriptiveName
11733
11734         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11735         TypeContainer, so that Enum and Interface can use this too.
11736
11737         * class.cs (TypeContainer.LookupInterfaceOrClass,
11738         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11739         `builder' argument.  Typically this was used to pass the parent
11740         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11741         the definition).  
11742
11743         The problem is that a nested class could trigger the definition of
11744         a toplevel class, and the builder would be obviously wrong in that
11745         case. 
11746
11747         So we drop this argument, and we compute dynamically the
11748         TypeBuilder/ModuleBuilder (the correct information was available
11749         to us anyways from DeclSpace.Parent)
11750
11751         * interface.cs (Interface.DefineInterface): Drop builder
11752         parameter cleanup like class.cs
11753
11754         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11755         like class.cs
11756
11757         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
11758         values. 
11759
11760         (Try.Emit): Propagate the returns value from the statement.
11761
11762         (Return.Emit): Even if we are leavning 
11763
11764         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
11765
11766         * modifiers.cs: Fix the computation of MethodAttributes flags.
11767
11768 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
11769
11770         * driver.cs: allow compilation of files that start with '/'.
11771         Add a default case when checking the argument of --target.
11772
11773 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
11774
11775         * interface.cs: Implement the same search algorithm for types in
11776         the interface code.
11777
11778         * delegate.cs: Do not allow multiple definition.
11779
11780         * Recovered ChangeLog that got accidentally amputated
11781
11782         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11783
11784         * rootcontext.cs: Load manually enum to allow core classes to
11785         contain enumerations.
11786
11787         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11788         Update to new static methods in TypeManager.
11789
11790         * typemanager.cs (GetMethod, GetConstructor): Use our
11791         implementation of FindMembers to find the members, since during
11792         corlib compilation, the types are TypeBuilders and GetMethod and
11793         GetConstructor do not work.
11794
11795         Make all methods in TypeManager static.
11796
11797         (InitCodeHelpers): Split the functionality from
11798         the InitCodeTypes function.
11799
11800         * driver.cs: Call InitCodeHelpers after we have populated the
11801         types. 
11802
11803         * cs-parser.jay (delegate_declaration): we did not used to compute
11804         the delegate name correctly for void delegates.
11805
11806 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11807
11808         * rootcontext.cs (RootContext): Init the interface_resolve_order
11809         and type_container_resolve_order always.
11810
11811         (ResolveCore, BootstrapCorlib_ResolveClass,
11812         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11813         compiler when compiling with --nostdlib
11814
11815         * class.cs (TypeContainer.DefineType): Check that our parent is
11816         not null.  This test is most important when we are bootstraping
11817         the core types.
11818
11819         * codegen.cs: Split out the symbol writing code.
11820
11821 2002-03-25  Martin Baulig  <martin@gnome.org>
11822
11823         * driver.cs (-g): Made -g an alias for --debug.
11824
11825 2002-03-24  Martin Baulig  <martin@gnome.org>
11826
11827         * codegen.cs (SymbolWriter): New public variable. Returns the
11828         current symbol writer.
11829         (CodeGen): Added `bool want_debugging_support' argument to the
11830          constructor. If true, tell the ModuleBuild that we want debugging
11831         support and ask it for the ISymbolWriter.
11832         (Save): If we have a symbol writer, call it's Close() method after
11833         saving the assembly.
11834
11835         * driver.c (--debug): New command line argument to create a
11836         debugger information file.
11837
11838         * location.cs (SymbolDocument): New public property. Returns an
11839         ISymbolDocumentWriter object for the current source file or null
11840         if we don't have a symbol writer.
11841
11842 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11843
11844         * driver.cs (LoadAssembly): Correctly return when all the paths
11845         have been tried and not before.
11846
11847         * statement.cs (Switch.Emit): return the actual coverage for this
11848         statement (returns/not-returns)
11849
11850         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11851         switch of the statement if we are the last switch section.  That
11852         kills two problems: try/catch problems (we used to emit an empty
11853         nop at the end) and switch statements where all branches would
11854         return. 
11855
11856 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11857
11858         * driver.cs: Add default assemblies (the equivalent to the
11859         Microsoft CSC.RSP file)
11860
11861         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11862         also update tokens_seen and set it to false.
11863
11864         * driver.cs: Implement --recurse for Mike.
11865
11866         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11867         correctly splitting out the paths.
11868
11869 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11870
11871         * interface.cs (Interface.PopulateProperty): Instead of using
11872         `parent' as the declaration space for the set parameters, use
11873         `this' 
11874
11875         * support.cs (InternalParameters): InternalParameters constructor
11876         takes a DeclSpace instead of a TypeContainer.
11877
11878         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11879         types are being initialized, load the address of it before calling
11880         the function.  
11881
11882         (New): Provide a mechanism to disable the generation of local
11883         value type temporaries when the caller will be providing us with
11884         an address to store it.
11885
11886         (ArrayCreation.EmitDynamicInitializers): Use it.
11887
11888 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11889
11890         * expression.cs (Invocation.EmitArguments): Only probe for array
11891         property if there is more than one argument.  Sorry about that.
11892
11893         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
11894         empty param arrays.
11895
11896         * class.cs (Method.LabelParameters): Fix incorrect code path that
11897         prevented the `ParamArrayAttribute' from being applied to the
11898         params attribute.
11899
11900 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
11901
11902         * support.cs (ReflectionParameters): Correctly compute whether the
11903         last argument is a params array.  Fixes the problem with
11904         string.Split ('a')
11905
11906         * typemanager.cs: Make the assemblies array always be non-null
11907         (empty, but non-null)
11908
11909         * tree.cs (RecordDecl): New function that abstracts the recording
11910         of names.  This reports error 101, and provides a pointer to the
11911         previous declaration.  Fixes a crash in the compiler.
11912
11913         * cs-parser.jay (constructor_declaration): Update to new grammar,
11914         and provide a constructor_body that can be empty.
11915
11916 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
11917
11918         * driver.cs: Add support for --resources.
11919
11920         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
11921         Make all types for the various array helper methods be integer.
11922
11923         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
11924         CheckState to ConvCast.
11925
11926         (ConvCast): Now it takes a `checked' state argument, to avoid
11927         depending on the emit context for the conversion, and just using
11928         the resolve time setting.
11929
11930         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
11931         instead of Invocation.EmitArguments.  We do not emit the original
11932         arguments, instead we emit those which have been converted to
11933         unsigned int expressions.
11934
11935         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
11936
11937         * codegen.cs: ditto.
11938
11939         * expression.cs (LocalVariableReference): Drop the use of the
11940         Store function that depended on the variable index.
11941
11942         * statement.cs (VariableInfo): Drop the `Idx' property from this
11943         class, as this is not taking into account the indexes for
11944         temporaries tat we generate during the execution, getting the
11945         indexes wrong.
11946
11947         * class.cs: First emit class initializers, then call the parent
11948         constructor. 
11949
11950         * expression.cs (Binary): Fix opcode emision.
11951         (UnaryMutator.EmitCode): Support checked code generation
11952
11953         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
11954         matches for events for both the Static and Instance scans,
11955         pointing to the same element.   Fix that.
11956
11957 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
11958
11959         * rootcontext.cs (ResolveTree): Always set the
11960         interface_resolve_order, because nested interfaces will be calling
11961         into us.
11962
11963         * class.cs (GetInterfaceOrClass): Track the same resolution
11964         process used by TypeManager.LookupType.  This fixes the nested
11965         type lookups in class declarations (separate path from
11966         LookupType). 
11967
11968         (TypeContainer.DefineType): Also define nested interfaces.
11969         (TypeContainer.RegisterOrder): New public function used to
11970         register the order in which child interfaces need to be closed.
11971
11972         Nested interfaces need to be closed after their parents have been
11973         created. 
11974
11975         * interface.cs (InterfaceAttr): Put all the logic for computing
11976         the interface attribute here. 
11977
11978         (DefineInterface): Register our interface order with the
11979         RootContext or with the TypeContainer depending on the case.
11980
11981 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11982
11983         * cs-parser.jay: rework foreach statement to work with the new
11984         changes to the policy on SimpleNames.
11985
11986         * report.cs: support Stacktrace on warnings as well.
11987
11988         * makefile: drop --unsafe and /unsafe from the compile.
11989
11990 2002-03-13  Ravi Pratap  <ravi@ximian.com>
11991
11992         * ecore.cs (StandardConversionExists): Modify to take an Expression
11993         as the first parameter. Ensure we do null -> reference type conversion
11994         checking.
11995
11996         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
11997         temporary Expression objects.
11998
11999 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12000
12001         * interface.cs: workaround bug in method overloading resolution
12002         (there is already a bugzilla bug for it).
12003
12004 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12005
12006         We could also solve this problem by having a separate path for
12007         performing type lookups, instead of DoResolve, we could have a
12008         ResolveType entry point, and only participating pieces of the
12009         production (simplename, deref, array) would implement this. 
12010
12011         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12012         signal SimpleName to only resolve type names and not attempt to
12013         resolve anything else.
12014
12015         * expression.cs (Cast): Set the flag.
12016
12017         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12018
12019         * class.cs: Only report 108 if there is no `new' modifier.
12020
12021         * cs-parser.jay: rework foreach statement to work with the new
12022         changes to the policy on SimpleNames.
12023         
12024         * report.cs: support Stacktrace on warnings as well.
12025
12026         * makefile: drop --unsafe and /unsafe from the compile.
12027
12028 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12029
12030         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12031         lookups here, instead of doing that at parse time.  This means
12032         that our grammar will not introduce `LocalVariableReferences' as
12033         expressions at this point.  That solves the problem of code like
12034         this:
12035
12036         class X {
12037            static void Main ()
12038            { int X = 1;
12039             { X x = null }}}
12040
12041         This is only half the fix.  The full fix requires parameters to
12042         also be handled in this way.
12043
12044         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12045         makes the use more obvious of the DeclSpace.  The
12046         ec.TypeContainer.TypeBuilder is now only used to pull the
12047         TypeBuilder for it.
12048
12049         My theory is that I can get rid of the TypeBuilder completely from
12050         the EmitContext, and have typecasts where it is used (from
12051         DeclSpace to where it matters).  
12052
12053         The only pending problem is that the code that implements Aliases
12054         is on TypeContainer, and probably should go in DeclSpace.
12055
12056         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12057         lookups here, instead of doing that at parse time.  This means
12058         that our grammar will not introduce `LocalVariableReferences' as
12059         expressions at this point.  That solves the problem of code like
12060         this:
12061
12062         class X {
12063            static void Main ()
12064            { int X = 1;
12065             { X x = null }}}
12066
12067         This is only half the fix.  The full fix requires parameters to
12068         also be handled in this way.
12069
12070         * class.cs (Property.DefineMethod): When implementing an interface
12071         method, set newslot, when implementing an abstract method, do not
12072         set the flag (before we tried never setting it, or always setting
12073         it, which is the difference).
12074         (Indexer.DefineMethod): same.
12075         (Method.DefineMethod): same.
12076
12077         * ecore.cs: Only set the status used flag if we get back a Field.
12078
12079         * attribute.cs: Temporary hack, so Paolo can keep working.
12080
12081 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12082
12083         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12084         the unmanaged type in the case we have a MarshalAs attribute.
12085
12086         (Resolve): Handle the case when we are parsing the special MarshalAs
12087         attribute [we need to store the unmanaged type to use later]
12088
12089         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12090         MarshalAs Attribute.
12091
12092         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12093         on parameters and accordingly set the marshalling info.
12094
12095 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12096
12097         * class.cs: Optimizing slightly by removing redundant code after
12098         we switched to the `NoTypes' return value.
12099         (Property.DefineMethod): use NoTypes here too.
12100
12101         This fixes the bug I introduced in my last batch of changes.
12102
12103 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12104
12105         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12106
12107         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12108         Enums since those are types too. 
12109
12110         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12111
12112         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12113         thanks to a call during the lookup process.
12114
12115 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12116
12117         * statement.cs (Foreach): Lots of work to accomodate a particular
12118         kind of foreach statement that I had not kept in mind.  It is
12119         possible to have foreachs on classes that provide a GetEnumerator
12120         method that return objects that implement the "pattern" for using
12121         a foreach, there is no need to support GetEnumerator
12122         specifically. 
12123
12124         This is needed to compile nant.
12125
12126         * decl.cs: Only report 114 if the member is not `Finalize' and if
12127         the warning level is at least 2.
12128
12129         * class.cs: Moved the compare function from Method to
12130         MethodSignature. 
12131
12132         (MethodSignature.InheritableMemberSignatureCompare): Add new
12133         filter function that is used to extract inheritable methods from a
12134         class. 
12135
12136         (Method.Define): Use the new `inheritable_method_signature_filter'
12137         delegate
12138
12139         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12140         command. 
12141
12142 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12143
12144         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12145
12146         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12147
12148         * expression.cs: Pass location information to
12149         ConvertImplicitStandard. 
12150
12151         * class.cs: Added debugging code to track return values from
12152         interfaces. 
12153
12154 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12155
12156         * expression.cs (Is.DoResolve): If either side of the `is' is an
12157         interface, do not flag the warning.
12158
12159         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12160         for interfaces
12161
12162         * report.cs: Allow for --fatal to be used with --probe.
12163
12164         * typemanager.cs (NoTypes): Move the definition for the empty Type
12165         array here. 
12166
12167         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12168         properties. 
12169         (TypeContainer.DefineProxy): New function used to proxy to parent
12170         implementations when implementing interfaces.
12171         (TypeContainer.ParentImplements): used to lookup if our parent
12172         implements a public function that is required by an interface.
12173         (TypeContainer.VerifyPendingMethods): Hook this up.
12174
12175         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12176         `modules' and `assemblies' arraylists into arrays.  We only grow
12177         these are the very early start up of the program, so this improves
12178         the speedof LookupType (nicely measured).
12179
12180         * expression.cs (MakeByteBlob): Replaced unsafe code with
12181         BitConverter, as suggested by Paolo.
12182
12183         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12184         folding of string concatenation, but if either side is a string,
12185         and the other is not, then return null, and let the runtime use
12186         the concatenation on the string plus the object (using
12187         `Object.ToString'). 
12188
12189 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12190
12191         Constant Folding has been implemented now.
12192
12193         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12194         the error instead on types that are not supported in one's
12195         complement. 
12196
12197         * constant.cs (Constant and all children): New set of functions to
12198         perform implict and explicit conversions.
12199
12200         * ecore.cs (EnumConstant): Implement the new functions to perform
12201         conversion by proxying to the child expression.
12202
12203         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12204         own separate setting that can not be turned off from the command
12205         line using --unchecked or --checked and is only controlled using
12206         the checked/unchecked statements and expressions.  This setting is
12207         used by the constant folder to flag errors.
12208
12209         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12210         ConstantCheckState as well.   
12211
12212         During Resolve, they also have to flag the state, because the
12213         constant folder runs completely in the Resolve phase.
12214
12215         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12216         well.
12217
12218 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12219
12220         * cfold.cs: New file, this file contains the constant folder.
12221
12222         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12223         argument to track whether we are using the resulting address to
12224         load or store a value and provide better error messages. 
12225
12226         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12227         new AddressOf arguments.
12228
12229         * statement.cs (Foreach.EmitCollectionForeach): Update
12230
12231         * expression.cs (Argument.Emit): Call AddressOf with proper
12232         arguments to track usage.
12233
12234         (New.DoEmit): Call AddressOf with new arguments.
12235
12236         (Unary.Emit): Adjust AddressOf call.
12237
12238 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12239
12240         * cs-parser.jay (member_access): Change the case for pre-defined types
12241         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12242         this suggestion.
12243
12244         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12245         a method body.
12246
12247         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12248         essentially like methods and apply attributes like MethodImplOptions to them too.
12249
12250         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12251         not being null.
12252
12253         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12254         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12255         is the DeclSpace.
12256
12257         * Update code everywhere accordingly.
12258
12259         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12260
12261         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12262
12263 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12264
12265         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12266         try performing lookups against those instead of jumping straight into using
12267         the 'using' clauses.
12268
12269         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12270
12271         (LookupType): Perform lookups in implicit parents too.
12272
12273         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12274         sequence as RootContext.LookupType. 
12275
12276         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12277         the various cases of namespace lookups into this method.
12278
12279 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12280
12281         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12282         in positional arguments)
12283
12284         * class.cs (Operator): Update the AllowedModifiers to contain
12285         extern. 
12286
12287         * cs-parser.jay: Update operator declaration to allow for the
12288         operator body to be empty.
12289
12290         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12291         values. 
12292
12293 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12294
12295         * class.cs (Method.Emit): Label parameters.
12296
12297         * driver.cs: Return 1 or 0 as the program exit code.
12298
12299 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12300
12301         * expression.cs: Special case the `null' object when trying to
12302         auto-compute the type, as anything can be explicitly converted to
12303         that. 
12304
12305         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12306         spotting this Paolo.
12307
12308         (Expression.ImplicitNumericConversion): Perform comparissions of
12309         the type using the underlying type in the case of an enumeration
12310         rather than using the enumeration type for the compare.
12311
12312         Cope with the underlying == type case, which is not possible to
12313         catch before. 
12314
12315         (Expression.ConvertNumericExplicit): Perform comparissions of
12316         the type using the underlying type in the case of an enumeration
12317         rather than using the enumeration type for the compare.
12318
12319         * driver.cs: If the user does not supply an extension, assume .exe
12320
12321         * cs-parser.jay (if_statement): Rewrote so that we can track the
12322         location for the if statement.
12323
12324         * expression.cs (Binary.ConstantFold): Only concat strings when
12325         the operation is "+", not everything ;-)
12326
12327         * statement.cs (Statement.EmitBoolExpression): Take a location
12328         argument. 
12329         (If, While, Do): Track location.
12330
12331         * expression.cs (Binary.ResolveOperator): In the object + string
12332         case, I was missing a call to ConvertImplicit
12333
12334 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12335
12336         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12337         Location arguments. Ensure we use RootContext.LookupType to do our work
12338         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12339
12340         * interface.cs (PopulateMethod): Handle the type of the parameter being
12341         null gracefully.
12342
12343         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12344         have a params method with no fixed arguments and a call is made with no
12345         arguments.
12346
12347 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12348
12349         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12350         the verbatim-string-literal
12351
12352         * support.cs (InternalParameters.ParameterModifier): handle null
12353         fixed parameters.
12354         (InternalParameters.ParameterType): ditto.
12355
12356         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12357         duplicating the name of the variable parameter.
12358         (GetParameterByName): Fix bug where we were not looking up array
12359         paramters if they were the only present (thanks Paolo!).
12360         (GetParameterInfo): We only have an empty set of types if both
12361         fixed and array are set to null.
12362         (GetParameterInfo-idx): Handle FixedParameter == null
12363
12364         * cs-parser.jay: Handle the case where there is no catch
12365         statements (missing null test).
12366
12367 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12368
12369         * driver.cs (MainDriver): Be conservative on our command line
12370         handling.
12371
12372         Catch DirectoryNotFoundException when calling GetFiles.
12373
12374         (SplitPathAndPattern): Used to split the input specification into
12375         a path and a pattern that we can feed to Directory.GetFiles.
12376
12377 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12378
12379         * statement.cs (Fixed): Implement the last case of the Fixed
12380         statement (string handling).
12381
12382         * expression.cs (StringPtr): New class used to return a char * to
12383         a string;  Used by the Fixed statement.
12384
12385         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12386
12387         * expression.cs (Binary.ResolveOperator): Remove redundant
12388         MemberLookup pn parent type.
12389         Optimize union call, we do not need a union if the types are the same.
12390         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12391         type.
12392
12393         Specialize the use of MemberLookup everywhere, instead of using
12394         the default settings. 
12395
12396         (StackAlloc): Implement stackalloc keyword.
12397
12398         * cs-parser.jay: Add rule to parse stackalloc.
12399
12400         * driver.cs: Handle /h, /help, /?
12401
12402         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12403         before we supported unsafe code.
12404
12405         * makefile: add --unsafe to the self compilation of mcs.
12406
12407 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12408
12409         * expression.cs (PointerArithmetic): New class that is used to
12410         perform pointer arithmetic.
12411         (Binary.Resolve): Handle pointer arithmetic
12412         Handle pointer comparission.
12413         (ArrayPtr): Utility expression class that is used to take the
12414         address of an array.
12415
12416         (ElementAccess): Implement array access for pointers
12417
12418         * statement.cs (Fixed): Implement fixed statement for arrays, we
12419         are missing one more case before we are done.
12420
12421         * expression.cs (Indirection): Implement EmitAssign and set the
12422         ExprClass to Variable.  This allows pointer dereferences to be
12423         treated as variables, and to have values assigned to them.
12424
12425         * ecore.cs (Expression.StoreFromPtr): New utility function to
12426         store values dereferencing.
12427
12428 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12429
12430         * expression.cs (Binary.ResolveOperator): Ensure that we are
12431         not trying to operate on a void type - this fixes the reported
12432         bug.
12433
12434         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12435         the parent implementation is sealed.
12436
12437         * ../errors/cs0239.cs : Add.
12438
12439         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12440
12441         * typemanager.cs (unverifiable_code_type): Corresponds to 
12442         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12443         which have unsafe code in them.
12444
12445         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12446         unsafe context.
12447
12448 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12449
12450         * cs-tokenizer.cs: Add support for @"litreal strings"
12451
12452         Make tokenizer accept pre-processor directives
12453         on any column (remove the old C-like limitation). 
12454
12455         * rootcontext.cs (EmitCode): Emit any global attributes.
12456         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12457
12458         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12459
12460         * cs-parser.jay: Add support for global attributes.  
12461
12462 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12463
12464         * expression.cs (Indirection): New helper class.  Unary will
12465         create Indirection classes to be able to implement the
12466         IMemoryLocation interface on it.
12467
12468 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12469
12470         * cs-parser.jay (fixed_statement): reference the right statement.
12471
12472         * statement.cs (Fixed.Emit): Finish implementing the fixed
12473         statement for the &x case.
12474
12475 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12476
12477         * class.cs (Property.Define, Method.Define): Remove newslot when
12478         `implementing'.  
12479
12480         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12481         wrong.  NewSlot should only be used if the `new' keyword is present.
12482
12483         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12484         locating our system dir.  Sorry about this.
12485
12486 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12487
12488         * driver.cs (GetSystemDir): Compute correctly the location of our
12489         system assemblies.  I was using the compiler directory instead of
12490         the library directory.
12491
12492 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12493
12494         * expression.cs (BetterFunction): Put back in what Miguel commented out
12495         since it is the correct fix. The problem is elsewhere ;-)
12496
12497         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12498         parameters of the parms method are themselves compatible or not !
12499
12500         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12501         to check that a class implements an interface before saying that an implicit
12502         conversion was allowed. Use ImplementsInterface to do the checking.
12503
12504 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12505
12506         * class.cs (Method.Define): Track whether we are an explicit
12507         implementation or not.  And only call DefineMethodOverride if we
12508         are an explicit implementation.
12509
12510         (Property.DefineMethod): Ditto.
12511
12512 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12513
12514         * expression.cs (BetterFunction): Catch hideous bug which was
12515          preventing us from detecting ambiguous calls due to implicit casts i.e
12516         cs0121.
12517
12518 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12519
12520         * support.cs (Pair): Remove un-needed method.  I figured why I was
12521         getting the error in cs-parser.jay, the variable in a foreach loop
12522         is readonly, and the compiler does not really treat this as a variable.
12523
12524         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12525         instead of EQUALS in grammar.  
12526
12527         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12528
12529         * expression.cs (Unary.DoResolve): Check whether the argument is
12530         managed or not.
12531
12532 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12533
12534         * support.cs: Api for Pair to set a value.  Despite the fact that
12535         the variables are public the MS C# compiler refuses to compile
12536         code that accesses the field if the variable is part of a foreach
12537         statement. 
12538
12539         * statement.cs (Fixed): Begin implementation of the fixed
12540         statement.
12541
12542         (Block.AddVariable): Return the VariableInfo on success and null
12543         on failure instead of true/false. 
12544
12545         * cs-parser.jay (foreach): Catch errors on variables already
12546         defined (we were ignoring this value before) and properly unwind
12547         the block hierarchy
12548
12549         (fixed_statement): grammar for the fixed statement.
12550
12551 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12552
12553         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12554         pointer types to be incretemented.
12555
12556         (SizeOf): Implement.
12557
12558         * cs-parser.jay (pointer_member_access): Implement
12559         expr->IDENTIFIER production.
12560
12561         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12562         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12563         on safe contexts.
12564
12565         (Unary): Implement indirection.
12566
12567         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12568         use in non-unsafe context).
12569
12570         (SimpleName.DoResolve): Check for pointers in field access on safe
12571         contexts. 
12572
12573         (Expression.LoadFromPtr): Factor the load-indirect code in this
12574         function.  This was duplicated in UnboxCast and ParameterReference
12575
12576 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12577
12578         * expression.cs (ComposedCast): report an error if a pointer cast
12579         is used in a safe region.
12580
12581         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12582         pointer type casts in unsafe context.
12583
12584         * codegen.cs (EmitContext): Set up IsUnsafe.
12585
12586         * cs-parser.jay (non_expression_type): Add productions for pointer
12587         casts. 
12588
12589         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12590         code.  We should not use force into static mode if the method is
12591         not virtual.  Fixes bug in MIS
12592
12593         * statement.cs (Do.Emit, While.Emit, For.Emit,
12594         Statement.EmitBoolExpression): Add support to Do and While to
12595         propagate infinite loop as `I do return' semantics.
12596
12597         Improve the For case to also test for boolean constants.
12598
12599         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12600         to the list of attributes we can add.
12601
12602         Remove `EmitContext' argument.
12603
12604         * class.cs (Method.Define): Apply parameter attributes.
12605         (Constructor.Define): Apply parameter attributes.
12606         (MethodCore.LabelParameters): Move here the core of labeling
12607         parameters. 
12608
12609         * support.cs (ReflectionParameters.ParameterModifier,
12610         InternalParameters.ParameterModifier): Use IsByRef on the type and
12611         only return the OUT bit for these parameters instead of in/out/ref
12612         flags.
12613
12614         This is because I miss-understood things.  The ParameterInfo.IsIn
12615         and IsOut represent whether the parameter has the [In] and [Out]
12616         attributes set.  
12617
12618 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12619
12620         * ecore.cs (FieldExpr.Emit): Release temporaries.
12621
12622         * assign.cs (LocalTemporary.Release): new function.
12623
12624         * codegen.cs (EmitContext.GetTemporaryStorage,
12625         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12626         temporary storage.  Now we can "put back" localbuilders when we
12627         are done with them
12628
12629 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12630
12631         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12632         need to make a copy of the variable to generate verifiable code.
12633
12634 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12635
12636         * driver.cs: Compute dynamically the system directory.
12637
12638         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12639         Slower, but more generally useful.  Used by the abstract
12640         registering implementation. 
12641
12642         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12643         the rules for the special rule on Type/instances.  First check if
12644         we have the same name, and if so, try that special static path
12645         rather than the instance path.
12646
12647 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12648
12649         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12650         for, while and if.
12651
12652         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12653         Enum, ValueType, Delegate or Array for non-corlib compiles.
12654
12655         * cs-tokenizer.cs: Catch long identifiers (645)
12656
12657         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12658         piece of code.
12659
12660         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12661         fix, we were returning too early, so we were not registering
12662         pending methods from abstract classes.
12663
12664         Do not register pending methods if the class is abstract.
12665
12666         * expression.cs (Conditional.DoResolve): Report circular implicit
12667         conversions when we neecd to compute it for conditional
12668         expressions. 
12669
12670         (Is.DoResolve): If the expression is always of the provided type,
12671         flag warning 183.  If the expression can not ever be of the
12672         provided type flag warning 184.
12673
12674         * class.cs: Catch 169 as well.
12675
12676         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12677         read. 
12678
12679 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12680
12681         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12682
12683 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12684
12685         * interface.cs: (PopulateMethod): Check for pointers being defined
12686         only if the unsafe context is active.
12687         (PopulateProperty): ditto.
12688         (PopulateIndexer): ditto.
12689
12690         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12691         specified.  If pointers are present, make sure that they are
12692         present in an unsafe context.
12693         (Constructor, Constructor.Define): ditto.
12694         (Field, Field.Define): ditto.
12695         (Property, Property.Define): ditto.
12696         (Event, Event.Define): ditto.
12697
12698         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12699         hashtable if there are classes or structs defined.
12700
12701         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12702         code, as the constant resolution moved.
12703
12704         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12705         the metadata, so we can flag error 133. 
12706
12707         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12708         pointer is being declared in an unsafe context.
12709
12710 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12711
12712         * modifiers.cs (Modifiers.Check): Require a Location argument.
12713         Report error 227 for Unsafe use.
12714
12715         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12716
12717         * statement.cs (For.Emit): If the test is null, then report that
12718         we do `return', as we wont reach anything afterwards.
12719
12720         (Switch.SwitchGoverningType): Track the expression that matched
12721         the conversion.
12722
12723         * driver.cs: Allow negative numbers as an error code to flag.
12724
12725         * cs-parser.jay: Handle 1551.
12726
12727         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12728
12729 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12730
12731         * cs-parser.jay: Report 1518 (type declaration can only contain
12732         class, struct, interface, enum or delegate)
12733
12734         (switch_label): Report 1523 (keywords `case' or `default' must
12735         preced code)
12736
12737         (opt_switch_sections): Report 1522 (empty switch)
12738
12739         * driver.cs: Report 1515 (response file specified multiple times)
12740         Report 1516 (Source file specified multiple times).
12741
12742         * expression.cs (Argument.Resolve): Signal 1510
12743
12744         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12745         access not allowed in static code)
12746
12747 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12748
12749         * typemanager.cs (IsPointerType): Utility method which we are going
12750         to need a lot.
12751
12752         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12753         the object type, so we take care of that.
12754
12755         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12756
12757         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
12758         added to non-params parameters :-)
12759
12760         * typemanager.cs (CSharpName): Include 'void' type too. 
12761
12762         (void_ptr_type): Include in the set of core types.
12763
12764         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
12765         duplicating code.
12766
12767         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
12768         an unsafe context.
12769
12770         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
12771         completely forgotten about it.
12772
12773 2002-01-10  Ravi Pratap  <ravi@ximian.com>
12774
12775         * cs-parser.jay (pointer_type): Add. This begins our implementation
12776         of parsing rules for unsafe code.
12777
12778         (unsafe_statement): Implement.
12779
12780         (embedded_statement): Modify to include the above.
12781
12782         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12783
12784         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12785         if the current context is an unsafe one.
12786
12787         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12788         are handled differently, we need separate rules for them.
12789
12790         (local_variable_declaration): Update to use local_variable_pointer_type
12791         to allow variable declarations of unmanaged pointer types.
12792
12793         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12794         in unsafe contexts.
12795
12796         * ../errors/cs0214.cs : Add.
12797
12798 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12799
12800         * makefile: remove 'response' file when cleaning.
12801
12802 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12803
12804         * cs-parser.jay: Report 1524.
12805
12806 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12807
12808         * typemanager.cs (RegisterMethod): drop checking if we have
12809         registered this from here
12810
12811 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12812
12813         * class.cs (Method.EmitDestructor): Implement calling our base
12814         destructor. 
12815
12816         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12817         value of InFinally.
12818
12819         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12820         this routine and will wrap the call in a try/catch block.  Deal
12821         with the case.
12822
12823 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12824
12825         * ecore.cs (Expression.MemberLookup): instead of taking a
12826         parameter `same_type' that was used to tell whether we could
12827         access private members we compute our containing type from the
12828         EmitContext.
12829
12830         (FieldExpr): Added partial support for volatile fields.  This does
12831         not work for volatile fields exposed from assemblies, as I can not
12832         figure out how to extract the modreq from it.
12833
12834         Updated all the source files to use this.
12835
12836         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12837         because it is referenced by MemberLookup very often. 
12838
12839 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12840
12841         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12842         TypeBuilder.GetCustomAttributes to retrieve what we need.
12843
12844         Get rid of redundant default_member_attr_type as this is the same as
12845         default_member_type which already exists.
12846
12847         * interface.cs, attribute.cs : Update accordingly.
12848
12849 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12850
12851         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12852         work for TYpeBuilders though.  Ravi, can you please fix this?
12853
12854         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12855
12856         * expression.cs (Argument.Emit): Handle the case of ref objects
12857         being passed to ref functions;  
12858
12859         (ParameterReference.EmitLoad): Loads the content of the pointer
12860         without dereferencing.
12861
12862 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12863
12864         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12865
12866 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12867
12868         * class.cs (Indexer.DefineMethod): Incorporate the interface
12869         type in the name of the method if we are doing explicit interface
12870         implementation.
12871
12872         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12873
12874         (BetterConversion): Fix extremely trivial bug where we were referring to
12875         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12876         again !
12877
12878         * ../errors/bug16.cs : Add although we have fixed it.
12879
12880 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12881
12882         * expression.cs (BaseIndexer): Begin implementation.
12883
12884         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12885
12886         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12887         production directly to remove a shift/reduce, and implement
12888         explicit interface implementation.
12889
12890         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
12891         after a floating point suffix.
12892
12893         * expression.cs (DoNumericPromotions): Improved the conversion for
12894         uint/uint.  If we have a constant, we avoid doing a typecast to a
12895         larger type.
12896
12897         * class.cs (Indexer): Implement explicit interface implementation
12898         for indexers.
12899
12900 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
12901
12902         * class.cs: make the default instance constructor public and hidebysig.
12903
12904 2001-01-03  Ravi Pratap  <ravi@ximian.com>
12905
12906         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
12907         so we can call it from elsewhere.
12908
12909         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
12910         we emit it internally if the class has a defined indexer; otherwise the user
12911         emits it by decorating the class definition with the DefaultMemberAttribute.
12912
12913         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
12914         attribute is not used on a type which defines an indexer.
12915
12916         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
12917         character when we skip whitespace.
12918
12919         * ../errors/cs0646.cs : Add.
12920
12921 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
12922
12923         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
12924         again. 
12925
12926         * makefile: Add practical target `mcs3.exe' which builds the third
12927         generation compiler. 
12928
12929         * expression.cs (New): Fix structures constructor calling.
12930
12931         * class.cs (Property, Method, Indexer): Emit Final flag on the
12932         method if we are an interface implementation and we are not
12933         abstract. 
12934
12935         * ecore.cs (PropertyExpr): New public field `IsBase', tells
12936         whether this property is referencing a `base' method.
12937
12938         * expression.cs (Invocation.EmitCall): take an extra argument:
12939         is_base, this is used to determine whether the `call' or
12940         `callvirt' opcode should be used.
12941
12942
12943         * delegate.cs: update EmitCall.
12944
12945         * class.cs (Method.Define): Set NewSlot for the cases where we are
12946         not implementing an interface method.
12947
12948         (Property.Define): ditto.
12949
12950 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
12951
12952         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
12953         'r'.  Allows mcs to parse itself fully.
12954
12955 2002-01-02  Ravi Pratap  <ravi@ximian.com>
12956
12957         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
12958         of the number of initializers that require the InitializeArray method.
12959
12960         (CheckIndices): Store the Expression in all cases - not the plain value. Also
12961         update the above field where necessary.
12962
12963         (MakeByteBlob): Update accordingly.
12964
12965         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
12966         greater than 2.
12967
12968         (EmitDynamicInitializers): Update in accordance with the new optimization.
12969
12970         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
12971         same OpCode applies.
12972
12973         * cs-parser.jay : Fix some glaring errors I introduced.
12974
12975 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
12976
12977         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
12978         so that we can check for name clashes there too.
12979
12980         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
12981         for interface indexers.
12982
12983         * interfaces.cs (Define): Emit the default member attribute.
12984
12985         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
12986         variable was being referred to while setting the value ;-)
12987
12988 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
12989
12990         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
12991         byte-by-byte information when we know the data is zero.
12992
12993         Make the block always a multiple of 4, because
12994         DefineInitializedData has a bug.
12995
12996         * assign.cs: Fix, we should assign from the temporary, not from
12997         the source. 
12998
12999         * expression.cs (MakeByteBlob): Fix my incorrect code.
13000
13001 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13002
13003         * typemanager.cs (EnumToUnderlying): This function is used to get
13004         the underlying type from an enumeration, because it does not
13005         always work. 
13006
13007         * constant.cs: Use the I4_S form for values between -128 and 127.
13008
13009         * statement.cs (Block.LookupLabel): Looks up a label.
13010         (Block): Drop support for labeled blocks.
13011
13012         (LabeledStatement): New kind of statement that represents a label
13013         only.
13014
13015         (Goto): Finally implement this bad boy.
13016
13017         * cs-parser.jay: Update to reflect new mechanism to implement
13018         labels.
13019
13020 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13021
13022         * codegen.cs (EmitContext.This): a codegen property that keeps the
13023         a single instance of this instead of creating many different this
13024         instances. 
13025
13026         * delegate.cs (Delegate.DoResolve): Update to use the property;
13027
13028         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13029
13030         * expression.cs (BaseAccess.DoResolve): Ditto.
13031
13032 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13033
13034         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13035         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13036
13037         (InitCoreTypes): Update accordingly.
13038
13039         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13040         so we can quickly store the state.
13041
13042         (ApplyAttributes): Set the correct implementation flags
13043         for InternalCall methods.
13044
13045 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13046
13047         * expression.cs (EmitCall): if a method is not virtual, then do
13048         not use callvirt on it.
13049
13050         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13051         user defined stuff) requires the use of stobj, which takes an
13052         address on the stack instead of an array and an index.  So emit
13053         the Ldelema operation for it.
13054
13055         (EmitStoreOpcode): Use stobj for valuetypes.
13056
13057         (UnaryMutator.EmitCode): Use the right 1 value depending on
13058         whether we are dealing with int64/uint64, float or doubles.
13059
13060         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13061         constructors that I implemented last night.
13062
13063         (Constructor.IsDefault): Fix to work properly for static
13064         constructors.
13065
13066         * cs-parser.jay (CheckDef): report method signature errors.
13067         Update error number 103 to be 132.
13068
13069         * decl.cs: New AdditionResult enumeration value: MethodExists.
13070         Although we do this check for methods later on in the semantic
13071         analysis, catching repeated default constructors is so easy that
13072         we catch these here. 
13073
13074         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13075         promotions code.
13076
13077         (ParameterReference.EmitAssign, Emit): handle
13078         bools as bytes.
13079
13080         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13081         (ArrayAccess.EmitStoreOpcode): ditto.
13082
13083         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13084
13085         * expression.cs (MakeByteBlob): Complete all the missing types
13086         (uint, short, ushort, byte, sbyte)
13087
13088         * class.cs: Only init instance field initializers on instance
13089         constructors. 
13090
13091         Rename `constructors' to instance_constructors. 
13092
13093         (TypeContainer.AddConstructor): Only add constructors to the list
13094         if it is not static.
13095
13096         Make sure that we handle default_static_constructor independently
13097         everywhere where we handle instance_constructors
13098
13099 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13100
13101         * class.cs: Do not lookup or create a base initializer for a
13102         static constructor.
13103
13104         (ConstructorInitializer.Resolve): use the proper type to lookup
13105         for constructors.
13106
13107         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13108
13109         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13110         in DeclSpace. 
13111
13112         * decl.cs: CloseType is now an virtual method, the default
13113         implementation just closes this type.
13114
13115 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13116
13117         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13118         to PreserveSig by default. Also emit HideBySig on such methods.
13119
13120         Basically, set the defaults to standard values.
13121
13122         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13123         argument, if candidate is better, it can't be worse than the best !
13124
13125         (Invocation): Re-write bits to differentiate between methods being
13126         applicable in their expanded form and their normal form - for params
13127         methods of course.
13128
13129         Get rid of use_standard everywhere as only standard conversions are allowed
13130         in overload resolution. 
13131
13132         More spec conformance.
13133
13134 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13135
13136         * driver.cs: Add --timestamp, to see where the compiler spends
13137         most of its time.
13138
13139         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13140         `this' in static code.
13141
13142         (SimpleName.DoResolve): Implement in terms of a helper function
13143         that allows static-references to be passed upstream to
13144         MemberAccess.
13145
13146         (Expression.ResolveWithSimpleName): Resolve specially simple
13147         names when called by MemberAccess to implement the special
13148         semantics. 
13149
13150         (Expression.ImplicitReferenceConversion): Handle conversions from
13151         Null to reference types before others, as Null's type is
13152         System.Object. 
13153
13154         * expression.cs (Invocation.EmitCall): Handle the special case of
13155         calling methods declared on a reference type from a ValueType
13156         (Base classes System.Object and System.Enum)
13157
13158         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13159         the left hand side is a TypeExpr, not on every enumeration. 
13160
13161         (Binary.Resolve): If types are reference types, then do a cast to
13162         object on operators != and == of both arguments.
13163
13164         * typemanager.cs (FindMembers): Extract instance and static
13165         members if requested.
13166
13167         * interface.cs (PopulateProperty): Use void_type instead of null
13168         as the return type for the setter method.
13169
13170         (PopulateIndexer): ditto.
13171
13172 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13173
13174         * support.cs (ReflectionParameters): Fix minor bug where we
13175         were examining the wrong parameter for the ParamArray attribute.
13176
13177         Cope with requests for the type of the parameter at position
13178         greater than the params parameter's. We now return the element
13179         type of the params array as that makes more sense.
13180
13181         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13182         accordingly as we no longer have to extract the element type
13183         ourselves.
13184
13185         (Invocation.OverloadResolve): Update.
13186
13187 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13188
13189         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13190         against IEnumerator, test whether the return value is a descendant
13191         of the IEnumerator interface.
13192
13193         * class.cs (Indexer.Define): Use an auxiliary method to implement
13194         the other bits of the method definition.  Begin support for
13195         explicit interface implementation.
13196
13197         (Property.DefineMethod): Use TypeManager.void_type instead of null
13198         for an empty return value.
13199
13200 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13201
13202         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13203         dealing with a FieldExpr which is composed of a FieldBuilder, in
13204         the code path we did extract the constant, but we should have
13205         obtained the underlying value to be able to cast it (otherwise we
13206         end up in an infinite loop, this is what Ravi was running into).
13207
13208         (ArrayCreation.UpdateIndices): Arrays might be empty.
13209
13210         (MemberAccess.ResolveMemberAccess): Add support for section
13211         14.5.4.1 that deals with the special case of E.I when E is a type
13212         and something else, that I can be a reference to a static member.
13213
13214         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13215         handle a particular array type to create byte blobs, it is just
13216         something we dont generate byteblobs for.
13217
13218         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13219         arguments. 
13220
13221         * location.cs (Push): remove the key from the hashtable that we
13222         are about to add.   This happens for empty files.
13223
13224         * driver.cs: Dispose files after we have parsed them.
13225
13226         (tokenize): new function that only runs the tokenizer on its
13227         input, for speed testing.
13228
13229 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13230
13231         * class.cs (Event.Define): Define the private field only if there
13232         are no accessors defined.
13233
13234         * expression.cs (ResolveMemberAccess): If there is no associated
13235         field with the event, that means we have an event defined with its
13236         own accessors and we should flag error cs0070 since transforming
13237         ourselves into a field is not valid in that case.
13238
13239         * ecore.cs (SimpleName.DoResolve): Same as above.
13240
13241         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13242         and charset to sane values.
13243
13244 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13245
13246         * assign.cs (DoResolve): Perform check on events only if they 
13247         are being accessed outside the declaring type.
13248
13249         * cs-parser.jay (event_declarations): Update rules to correctly
13250         set the type of the implicit parameter etc.
13251
13252         (add_accessor, remove_accessor): Set current local parameters.
13253
13254         * expression.cs (Binary): For delegate addition and subtraction,
13255         cast the return value from the method into the appropriate delegate
13256         type.
13257
13258 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13259
13260         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13261         of these as the workaround is unnecessary.
13262
13263         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13264         delegate data - none of that is needed at all.
13265
13266         Re-write bits to extract the instance expression and the delegate method
13267         correctly.
13268
13269         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13270         on delegates too.
13271
13272         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13273         of attaching attributes instead of duplicating code everywhere.
13274
13275         * everywhere : Update code to do attribute emission using the above method.
13276
13277 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13278
13279         * expression.cs (IsParamsMethodApplicable): if there are not
13280         parameters, return immediately.
13281
13282         * ecore.cs: The 0 literal can be implicity converted to an enum
13283         type. 
13284
13285         (SimpleName.DoResolve): First lookup the type, then lookup the
13286         members. 
13287
13288         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13289         want to get its address.  If the InstanceExpression is not
13290         addressable, store the result in a temporary variable, then get
13291         the address of it.
13292
13293         * codegen.cs: Only display 219 errors on warning level or above. 
13294
13295         * expression.cs (ArrayAccess): Make it implement the
13296         IMemoryLocation interface.
13297
13298         (Binary.DoResolve): handle the operator == (object a, object b)
13299         and operator != (object a, object b) without incurring into a
13300         BoxedCast (because 5 != o should never be performed).
13301
13302         Handle binary enumerator operators.
13303
13304         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13305         value type, otherwise use Ldelem_ref.
13306
13307         Use precomputed names;
13308
13309         (AddressOf): Implement address of
13310
13311         * cs-parser.jay (labeled_statement): Fix recursive block
13312         addition by reworking the production.
13313
13314         * expression.cs (New.DoEmit): New has a special case:
13315                 
13316                  If we are dealing with a ValueType, we have a few
13317                  situations to deal with:
13318                 
13319                     * The target of New is a ValueType variable, that is
13320                       easy, we just pass this as the variable reference
13321                 
13322                     * The target of New is being passed as an argument,
13323                       to a boxing operation or a function that takes a
13324                       ValueType.
13325                 
13326                       In this case, we need to create a temporary variable
13327                       that is the argument of New.
13328
13329
13330 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13331
13332         * rootcontext.cs (LookupType): Check that current_type is not null before
13333         going about looking at nested types.
13334
13335         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13336         not implement the IAssignMethod interface any more.
13337
13338         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13339         where we tranform them into FieldExprs if they are being resolved from within
13340         the declaring type.
13341
13342         * ecore.cs (SimpleName.DoResolve): Do the same here.
13343
13344         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13345
13346         * ../errors/bug10.cs : Add.
13347
13348         * ../errors/cs0070.cs : Add.
13349
13350         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13351
13352         * assign.cs : Get rid of EventIsLocal everywhere.
13353
13354 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13355
13356         * ecore.cs (ConvertIntLiteral): finished the implementation.
13357
13358         * statement.cs (SwitchLabel): Convert the value we are using as a
13359         key before looking up the table.
13360
13361 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13362
13363         * codegen.cs (EmitTopBlock): Require a Location argument now.
13364
13365         * cs-parser.jay (constructor_declarator): We need to setup
13366         current_local_parameters before we parse the
13367         opt_constructor_initializer, to allow the variables to be bound
13368         to the constructor arguments.
13369
13370         * rootcontext.cs (LookupType): First lookup nested classes in our
13371         class and our parents before we go looking outside our class.
13372
13373         * expression.cs (ConstantFold): Extract/debox the values at the
13374         beginnning. 
13375
13376         * rootcontext.cs (EmitCode): Resolve the constants first before we
13377         resolve the types.  This is not really needed, but it helps debugging.
13378
13379         * statement.cs: report location.
13380
13381         * cs-parser.jay: pass location to throw statement.
13382
13383         * driver.cs: Small bug fix.
13384
13385         * report.cs: Updated format to be 4-zero filled digits.
13386
13387 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13388
13389         * expression.cs (CheckIndices): Fix minor bug where the wrong
13390         variable was being referred to ;-)
13391
13392         (DoEmit): Do not call EmitStaticInitializers when the 
13393         underlying type is System.Object.
13394
13395 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13396
13397         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13398         and do the usual workaround for SRE.
13399
13400         * class.cs (MyEventBuilder.EventType): New member to get at the type
13401         of the event, quickly.
13402
13403         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13404
13405         * assign.cs (Assign.DoResolve): Handle the case when the target
13406         is an EventExpr and perform the necessary checks.
13407
13408         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13409         interface.
13410
13411         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13412
13413         (EventExpr): Set the type in the constructor itself since we 
13414         are meant to be born fully resolved.
13415
13416         (EventExpr.Define): Revert code I wrote earlier.
13417                 
13418         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13419         instance expression is null. The instance expression is a This in that case
13420         or a null, depending on whether it is a static method or not.
13421
13422         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13423         refers to more than one method.
13424
13425         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13426         and accordingly flag errors.
13427
13428 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13429
13430         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13431
13432 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13433
13434         * location.cs (ToString): Provide useful rutine.
13435
13436 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13437
13438         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13439         objects, return the actual integral boxed.
13440
13441         * statement.cs (SwitchLabel): define an ILLabel for each
13442         SwitchLabel. 
13443
13444         (Switch.CheckSwitch): If the value is a Literal, extract
13445         the underlying literal.
13446
13447         Also in the unused hashtable we had, add the SwitchLabel so we can
13448         quickly look this value up.
13449
13450         * constant.cs: Implement a bunch of new constants.  Rewrite
13451         Literal based on this.  Made changes everywhere to adapt to this.
13452
13453         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13454         dereferencing array only once, and also copes with enumrations.
13455
13456         bytes are two bytes wide, not one.
13457
13458         (Cast): Perform constant conversions.
13459
13460         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13461         wrappers to the literals here.
13462
13463         * expression.cs (DoNumericPromotions): long literals can converted
13464         to ulong implicity (this is taken care of elsewhere, but I was
13465         missing this spot).
13466
13467         * ecore.cs (Expression.Literalize): Make the return type Literal,
13468         to improve type checking.
13469
13470         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13471
13472 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13473
13474         * literal.cs: Revert code from ravi that checked the bounds.  The
13475         bounds are sane by the definition of the type itself. 
13476
13477         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13478         need to actually look up in our parent hierarchy for interfaces
13479         implemented. 
13480
13481         * const.cs: Use the underlying type for enumerations
13482
13483         * delegate.cs: Compute the basename for the delegate creation,
13484         that should fix the delegate test case, and restore the correct
13485         Type Lookup semantics in rootcontext
13486
13487         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13488         referencing a nested type with the Reflection API is using the "+"
13489         sign. 
13490
13491         * cs-parser.jay: Do not require EOF token at the end.
13492
13493 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13494
13495         * rootcontext.cs (LookupType): Concatenate type names with
13496         a '.' instead of a '+' The test suite passes again.
13497
13498         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13499         field of the enumeration.
13500
13501         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13502         the case when the member is an EventExpr.
13503
13504         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13505         static has an associated instance expression.
13506
13507         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13508
13509         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13510
13511         * class.cs (Event.Define): Register event and perform appropriate checks
13512         for error #111.
13513
13514         We define the Add and Remove methods even if the use provides none because
13515         in that case, we provide default implementations ourselves.
13516
13517         Define a private field of the type of the event. This is done by the CSC compiler
13518         and we should be doing it too ;-)
13519
13520         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13521         More methods we use in code we generate.
13522
13523         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13524         is important.
13525
13526         (InitCoreTypes): Update accordingly for the above.
13527
13528         * class.cs (Event.Emit): Generate code for default accessors that we provide
13529
13530         (EmitDefaultMethod): Do the job in the above.
13531
13532         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13533         appropriate place.
13534
13535 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13536
13537         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13538         builders even if we were missing one.
13539
13540         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13541         pass the Basename as our class name instead of the Name.  The
13542         basename will be correctly composed for us.
13543
13544         * parameter.cs (Paramters): Now takes a Location argument.
13545
13546         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13547         make all the code call directly LookupType in RootContext and take
13548         this chance to pass the Location information everywhere.
13549
13550         * Everywhere: pass Location information.
13551
13552 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13553
13554         * class.cs (Constructor.Define): Updated way of detecting the
13555         length of the parameters.
13556
13557         (TypeContainer.DefineType): Use basename as the type name for
13558         nested types.
13559
13560         (TypeContainer.Define): Do not recursively define types here, as
13561         definition is taken care in order by the RootContext.
13562
13563         * tree.cs: Keep track of namespaces in a per-file basis.
13564
13565         * parameter.cs (Parameter.ComputeSignature): Update to use
13566         DeclSpace. 
13567
13568         (Parameters.GetSignature): ditto.
13569
13570         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13571         instead of a TypeContainer.
13572
13573         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13574         resolve names.  Because we need to be resolve in our context, not
13575         our parents.
13576
13577         * driver.cs: Implement response files.
13578
13579         * class.cs (TypeContainer.DefineType): If we are defined, do not
13580         redefine ourselves.
13581
13582         (Event.Emit): Emit the code for add/remove handlers.
13583         (Event.Define): Save the MethodBuilders for add/remove.
13584
13585         * typemanager.cs: Use pair here too.
13586
13587         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13588         DictionaryEntry requires the first argument to be non-null.  
13589
13590         (enum_declaration): Compute full name for registering the
13591         enumeration.
13592
13593         (delegate_declaration): Instead of using
13594         formal_parameter_list, use opt_formal_parameter_list as the list
13595         can be empty.
13596
13597         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13598         (EventParsing): New property that controls whether `add' and
13599         `remove' are returned as tokens or identifiers (for events);
13600
13601 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13602
13603         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13604         use MyEventBuilder only and let it wrap the real builder for us.
13605
13606         (MyEventBuilder): Revamp constructor etc.
13607
13608         Implement all operations that we perform on EventBuilder in precisely the same
13609         way here too.
13610
13611         (FindMembers): Update to use the EventBuilder member.
13612
13613         (Event.Emit): Update accordingly.
13614
13615 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13616
13617         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13618         by calling the appropriate methods.
13619
13620         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13621         useful.
13622
13623         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13624
13625 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13626
13627         * delegate.cs (Delegate.Populate): Check that the return type
13628         and various parameters types are indeed accessible.
13629
13630         * class.cs (Constructor.Define): Same here.
13631
13632         (Field.Define): Ditto.
13633
13634         (Event.Define): Ditto.
13635
13636         (Operator.Define): Check that the underlying Method defined itself
13637         correctly - so it's MethodBuilder should not be null.
13638
13639         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13640         expression happens to be null.
13641
13642         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13643         members but as of now we don't seem to be able to do anything really useful with it.
13644
13645         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13646         not the EventBuilder.
13647
13648 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13649
13650         * cs-tokenizer.cs: Add support for defines.
13651         Add support for #if, #elif, #else, #endif
13652
13653         (eval_var): evaluates a variable.
13654         (eval): stubbed for evaluating functions.
13655
13656         * cs-parser.jay: Pass the defines information
13657
13658         * driver.cs: Add --define command line option.
13659
13660         * decl.cs: Move MemberCore here.
13661
13662         Make it the base class for DeclSpace.  This allows us to catch and
13663         report 108 and 109 for everything now.
13664
13665         * class.cs (TypeContainer.Define): Extract all the members
13666         before populating and emit the warning 108 (new keyword required
13667         to override) instead of having each member implement this.
13668
13669         (MemberCore.Define): New abstract method, we will be using this in
13670         the warning reporting engine in Populate.
13671
13672         (Operator.Define): Adjust to new MemberCore protocol. 
13673
13674         * const.cs (Const): This does not derive from Expression, it is a
13675         temporary object we use to create fields, it is a MemberCore. 
13676
13677         * class.cs (Method.Define): Allow the entry point to be in a
13678         specific class.
13679
13680         * driver.cs: Rewrite the argument handler to clean it up a bit.
13681
13682         * rootcontext.cs: Made it just an auxiliary namespace feature by
13683         making everything static.
13684
13685         * driver.cs: Adapt code to use RootContext type name instead of
13686         instance variable.
13687
13688         * delegate.cs: Remove RootContext argument.
13689
13690         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13691         argument. 
13692
13693         * class.cs (Event.Define): The lookup can fail.
13694
13695         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13696
13697         * expression.cs: Resolve the this instance before invoking the code.
13698
13699 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13700
13701         * cs-parser.jay: Add a production in element_access that allows
13702         the thing to become a "type" reference.  This way we can parse
13703         things like "(string [])" as a type.
13704
13705         Note that this still does not handle the more complex rules of
13706         casts. 
13707
13708
13709         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13710
13711         * ecore.cs: (CopyNewMethods): new utility function used to
13712         assemble the list of methods from running FindMembers.
13713
13714         (MemberLookup): Rework FindMembers so that 
13715
13716 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13717
13718         * class.cs (TypeContainer): Remove Delegates who fail to be
13719         defined.
13720
13721         * delegate.cs (Populate): Verify that we dont get null return
13722         values.   TODO: Check for AsAccessible.
13723
13724         * cs-parser.jay: Use basename to emit error 574 (destructor should
13725         have the same name as container class), not the full name.
13726
13727         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13728         possible representation.  
13729
13730         Also implements integer type suffixes U and L.
13731
13732 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13733
13734         * expression.cs (ArrayCreation.DoResolve): We need to do the
13735         argument resolution *always*.
13736
13737         * decl.cs: Make this hold the namespace.  Hold the root context as
13738         well.
13739         (LookupType): Move here.
13740
13741         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13742
13743         * location.cs (Row, Name): Fixed the code, it was always returning
13744         references to the first file.
13745
13746         * interface.cs: Register properties defined through interfaces.
13747
13748         * driver.cs: Add support for globbing on the command line
13749
13750         * class.cs (Field): Make it derive from MemberCore as well.
13751         (Event): ditto.
13752
13753 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13754
13755         * class.cs (Event::Define): Check that the type of the event is a delegate
13756         type else flag error #66.
13757
13758         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
13759         same.
13760
13761         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
13762         values of EntryPoint, CharSet etc etc.
13763
13764         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
13765
13766         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
13767         be null and we should ignore this. I am not sure if this is really clean. Apparently,
13768         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
13769         which needs this to do its work.
13770
13771         * ../errors/cs0066.cs : Add.
13772
13773 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
13774
13775         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
13776         helper functions.
13777
13778         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13779         clears out the parameters field.
13780         (MemberSignatureCompare): Cleanup
13781
13782         (MemberCore): New base class used to share code between MethodCore
13783         and Property.
13784
13785         (RegisterRequiredImplementations) BindingFlags.Public requires
13786         either BindingFlags.Instace or Static.  Use instance here.
13787
13788         (Property): Refactored code to cope better with the full spec.
13789
13790         * parameter.cs (GetParameterInfo): Return an empty array instead
13791         of null on error.
13792
13793         * class.cs (Property): Abstract or extern properties have no bodies.
13794
13795         * parameter.cs (GetParameterInfo): return a zero-sized array.
13796
13797         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13798         method modifier validation to the typecontainer so we can reuse
13799         this on properties.
13800
13801         (MethodCore.ParameterTypes): return an empty sized array of types.
13802
13803         (Property.Define): Test property modifier validity.
13804
13805         Add tests for sealed/override too.
13806
13807         (Method.Emit): abstract or extern methods have no bodies.
13808
13809 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13810
13811         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13812         thing.
13813
13814         (Method::Define, ::Emit): Modify accordingly.
13815
13816         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13817
13818         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13819
13820         * makefile: Pass in /unsafe.
13821
13822 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13823
13824         * class.cs (MakeKey): Kill routine.
13825
13826         * class.cs (TypeContainer.Define): Correctly define explicit
13827         method implementations (they require the full interface name plus
13828         the method name).
13829
13830         * typemanager.cs: Deply the PtrHashtable here and stop using the
13831         lame keys.  Things work so much better.
13832
13833         This of course broke everyone who depended on `RegisterMethod' to
13834         do the `test for existance' test.  This has to be done elsewhere.
13835
13836         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13837         the object stupid Equals method (because, that like fails all over
13838         the place).  We still do not use it.
13839
13840         * class.cs (TypeContainer.SetRequiredInterface,
13841         TypeContainer.RequireMethods): Killed these two routines and moved
13842         all the functionality to RegisterRequiredImplementations.
13843
13844         (TypeContainer.RegisterRequiredImplementations): This routine now
13845         registers all the implementations required in an array for the
13846         interfaces and abstract methods.  We use an array of structures
13847         which can be computed ahead of time to reduce memory usage and we
13848         also assume that lookups are cheap as most classes will not
13849         implement too many interfaces.
13850
13851         We also avoid creating too many MethodSignatures.
13852
13853         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13854         clear the "pending" bit if we find that there are problems with
13855         the declaration.
13856
13857         (TypeContainer.VerifyPendingMethods): Update to report errors of
13858         methods that look like implementations but are not.
13859
13860         (TypeContainer.Define): Add support for explicit interface method
13861         implementation. 
13862
13863 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13864
13865         * typemanager.cs: Keep track of the parameters here instead of
13866         being a feature of the TypeContainer.
13867
13868         * class.cs: Drop the registration of parameters here, as
13869         InterfaceMethods are also interface declarations.
13870
13871         * delegate.cs: Register methods with the TypeManager not only with
13872         the TypeContainer.  This code was buggy.
13873
13874         * interface.cs: Full registation here.
13875
13876 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13877
13878         * expression.cs: Remove reducer for binary expressions, it can not
13879         be done this way.
13880
13881         * const.cs: Put here the code that used to go into constant.cs
13882
13883         * constant.cs: Put here the code for constants, this is a new base
13884         class for Literals.
13885
13886         * literal.cs: Make Literal derive from Constant.
13887
13888 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13889
13890         * statement.cs (Return.Emit): Report error 157 if the user
13891         attempts to return from a finally block.
13892
13893         (Return.Emit): Instead of emitting a return, jump to the end of
13894         the function.
13895
13896         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
13897         LocalBuilder to store the result of the function.  ReturnLabel is
13898         the target where we jump.
13899
13900
13901 2001-12-09  Radek Doulik  <rodo@ximian.com>
13902
13903         * cs-parser.jay: remember alias in current namespace
13904
13905         * ecore.cs (SimpleName::DoResolve): use aliases for types or
13906         namespaces
13907
13908         * class.cs (LookupAlias): lookup alias in my_namespace
13909
13910         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
13911         aliases hashtable
13912         (LookupAlias): lookup alias in this and if needed in parent
13913         namespaces
13914
13915 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
13916
13917         * support.cs: 
13918
13919         * rootcontext.cs: (ModuleBuilder) Made static, first step into
13920         making things static.  I need this to avoid passing the
13921         TypeContainer when calling ParameterType.
13922
13923         * support.cs (InternalParameters.ParameterType): Remove ugly hack
13924         that did string manipulation to compute the type and then call
13925         GetType.  Use Parameter.ParameterType instead.
13926
13927         * cs-tokenizer.cs: Consume the suffix for floating values.
13928
13929         * expression.cs (ParameterReference): figure out whether this is a
13930         reference parameter or not.  Kill an extra variable by computing
13931         the arg_idx during emission.
13932
13933         * parameter.cs (Parameters.GetParameterInfo): New overloaded
13934         function that returns whether a parameter is an out/ref value or not.
13935
13936         (Parameter.ParameterType): The type of the parameter (base,
13937         without ref/out applied).
13938
13939         (Parameter.Resolve): Perform resolution here.
13940         (Parameter.ExternalType): The full type (with ref/out applied).
13941
13942         * statement.cs (Using.Emit, Using.EmitExpression): Implement
13943         support for expressions on the using statement.
13944
13945 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
13946
13947         * statement.cs (Using.EmitLocalVariableDecls): Split the
13948         localvariable handling of the using statement.
13949
13950         (Block.EmitMeta): Keep track of variable count across blocks.  We
13951         were reusing slots on separate branches of blocks.
13952
13953         (Try.Emit): Emit the general code block, we were not emitting it. 
13954
13955         Check the type of the declaration to be an IDisposable or
13956         something that can be implicity converted to it. 
13957
13958         Emit conversions if required.
13959
13960         * ecore.cs (EmptyExpression): New utility class.
13961         (Expression.ImplicitConversionExists): New utility function.
13962
13963 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
13964
13965         * statement.cs (Using): Implement.
13966
13967         * expression.cs (LocalVariableReference): Support read only variables.
13968
13969         * statement.cs: Remove the explicit emit for the Leave opcode.
13970         (VariableInfo): Add a readonly field.
13971
13972 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
13973
13974         * ecore.cs (ConvCast): new class used to encapsulate the various
13975         explicit integer conversions that works in both checked and
13976         unchecked contexts.
13977
13978         (Expression.ConvertNumericExplicit): Use new ConvCast class to
13979         properly generate the overflow opcodes.
13980
13981 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13982
13983         * statement.cs: The correct type for the EmptyExpression is the
13984         element_type, not the variable type.  Ravi pointed this out.
13985
13986 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13987
13988         * class.cs (Method::Define): Handle PInvoke methods specially
13989         by using DefinePInvokeMethod instead of the usual one.
13990
13991         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
13992         above to do the task of extracting information and defining the method.
13993
13994 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13995
13996         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
13997         of the condition for string type.
13998
13999         (Emit): Move that here. 
14000
14001         (ArrayCreation::CheckIndices): Keep string literals in their expression
14002         form.
14003
14004         (EmitDynamicInitializers): Handle strings appropriately.
14005
14006 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14007
14008         * codegen.cs (EmitContext): Replace multiple variables with a
14009         single pointer to the current Switch statement.
14010
14011         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14012         EmitContext.
14013
14014 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14015
14016         * statement.cs 
14017
14018         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14019         default'.
14020
14021         (Foreach.Emit): Foreach on arrays was not setting
14022         up the loop variables (for break/continue).
14023
14024         (GotoCase): Semi-implented.
14025
14026 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14027
14028         * attribute.cs (CheckAttribute): Handle system attributes by using
14029         Attribute.GetAttributes to examine information we need.
14030
14031         (GetValidPlaces): Same here.
14032
14033         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14034
14035         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14036
14037         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14038
14039         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14040
14041         (Method::Emit): Handle the case when we are a PInvoke method.
14042
14043 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14044
14045         * expression.cs: Use ResolveWithSimpleName on compound names.
14046
14047 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14048
14049         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14050         before trying to reduce it.
14051
14052         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14053
14054         * constant.cs (LookupConstantValue): Implement.
14055
14056         (EmitConstant): Use the above in emitting the constant.
14057
14058         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14059         that are user-defined by doing a LookupConstantValue on them.
14060
14061         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14062         too, like above.
14063
14064 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14065
14066         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14067
14068         (BaseAccess.DoResolve): Implement.
14069
14070         (MemberAccess.DoResolve): Split this routine into a
14071         ResolveMemberAccess routine that can be used independently
14072
14073 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14074
14075         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14076         As that share bits of the implementation.  Is returns a boolean,
14077         while As returns the Type that is being probed.
14078
14079 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14080
14081         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14082         instead of a Literal - much easier.
14083
14084         (EnumInTransit): Remove - utterly useless :-)
14085
14086         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14087
14088         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14089
14090         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14091         chain when we have no associated expression.
14092
14093 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14094
14095         * constant.cs (Define): Use Location while reporting the errror.
14096
14097         Also emit a warning when 'new' is used and there is no inherited
14098         member to hide.
14099
14100         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14101         populated.
14102
14103         (LookupEnumValue): Implement to lookup an enum member's value and define it
14104         if necessary.
14105
14106         (Populate): Re-write accordingly to use the above routine.
14107
14108 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14109
14110         * expression.cs (This): Fix prototype for DoResolveLValue to
14111         override the base class DoResolveLValue.
14112
14113         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14114         declarations) 
14115
14116         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14117         (we need to load the address of the field here).  This fixes
14118         test-22. 
14119
14120         (FieldExpr.DoResolveLValue): Call the DoResolve
14121         function to initialize the Instance expression.
14122
14123         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14124         correctly the GetEnumerator operation on a value type.
14125
14126         * cs-parser.jay: Add more simple parsing error catches.
14127
14128         * statement.cs (Switch): Add support for string switches.
14129         Handle null specially.
14130
14131         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14132
14133 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14134
14135         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14136
14137         (declare_local_constant): New helper function.
14138
14139         * statement.cs (AddConstant): Keep a separate record of constants
14140
14141         (IsConstant): Implement to determine if a variable is a constant.
14142
14143         (GetConstantExpression): Implement.
14144
14145         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14146
14147         * statement.cs (IsVariableDefined): Re-write.
14148
14149 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14150
14151         * class.cs (TypeContainer::FindMembers): Look for constants
14152         in the case when we are looking for MemberTypes.Field
14153
14154         * expression.cs (MemberAccess::DoResolve): Check that in the
14155         case we are a FieldExpr and a Literal, we are not being accessed
14156         by an instance reference.
14157
14158         * cs-parser.jay (local_constant_declaration): Implement.
14159
14160         (declaration_statement): Implement for constant declarations.
14161
14162 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14163
14164         * statement.cs (Switch): Catch double defaults.
14165
14166         (Switch): More work on the switch() statement
14167         implementation.  It works for integral values now, need to finish
14168         string support.
14169
14170
14171 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14172
14173         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14174         integer literals into other integer literals.  To be used by
14175         switch. 
14176
14177 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14178
14179         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14180         some memory.
14181
14182         (EmitDynamicInitializers): Cope with the above since we extract data
14183         directly from ArrayData now.
14184
14185         (ExpectInitializers): Keep track of whether initializers are mandatory
14186         or not.
14187
14188         (Bounds): Make it a hashtable to prevent the same dimension being 
14189         recorded for every element in that dimension.
14190
14191         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14192         from being found.
14193
14194         Also fix bug which was causing the indices to be emitted in the reverse
14195         order.
14196
14197 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14198
14199         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14200         unfinished.  They do not work, because the underlying code is
14201         sloppy.
14202
14203 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14204
14205         * cs-parser.jay: Remove bogus fixme.
14206
14207         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14208         on Switch statement.
14209
14210 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14211
14212         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14213         the same. 
14214
14215         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14216         parameter. Apparently, any expression is allowed. 
14217
14218         (ValidateInitializers): Update accordingly.
14219
14220         (CheckIndices): Fix some tricky bugs thanks to recursion.
14221
14222         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14223         I was being completely brain-dead.
14224
14225         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14226         and re-write acordingly.
14227
14228         (DelegateInvocation): Re-write accordingly.
14229
14230         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14231
14232         (MakeByteBlob): Handle types more correctly.
14233
14234         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14235         initialization from expressions but it is incomplete because I am a complete
14236         Dodo :-|
14237
14238 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14239
14240         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14241         on If.  Basically, we have to return `true' (ie, we do return to
14242         our caller) only if both branches of the if return.
14243
14244         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14245         short-circuit operators, handle them as short circuit operators. 
14246
14247         (Cast.DoResolve): Resolve type.
14248         (Cast.Cast): Take an expression as the target type.
14249
14250         * cs-parser.jay (cast_expression): Remove old hack that only
14251         allowed a limited set of types to be handled.  Now we take a
14252         unary_expression and we resolve to a type during semantic
14253         analysis.
14254
14255         Use the grammar productions from Rhys to handle casts (this is
14256         not complete like Rhys syntax yet, we fail to handle that corner
14257         case that C# has regarding (-x), but we will get there.
14258
14259 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14260
14261         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14262         field which is an array type.
14263
14264         * cs-parser.jay (declare_local_variables): Support array initialization too.
14265
14266         * typemanager.cs (MakeKey): Implement.
14267
14268         (everywhere): Use the above appropriately.
14269
14270         * cs-parser.jay (for_statement): Update for array initialization while
14271         declaring variables.
14272
14273         * ecore.cs : The error message was correct, it's the variable's names that
14274         were misleading ;-) Make the code more readable.
14275
14276         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14277         the correct type etc.
14278
14279         (ConvertExplicit): Handle Enum types by examining the underlying type.
14280
14281 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14282
14283         * parameter.cs (GetCallingConvention): Always return
14284         CallingConventions.Standard for now.
14285
14286 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14287
14288         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14289         and `r' after calling DoNumericPromotions.
14290
14291         * ecore.cs: Fix error message (the types were in the wrong order).
14292
14293         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14294         BindingFlags.Instance as well 
14295
14296         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14297         implicit int literal conversion in an empty cast so that we
14298         propagate the right type upstream.
14299
14300         (UnboxCast): new class used to unbox value types.
14301         (Expression.ConvertExplicit): Add explicit type conversions done
14302         by unboxing.
14303
14304         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14305         the target type before applying the implicit LongLiterals to ULong
14306         literal cast.
14307
14308 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14309
14310         * cs-parser.jay (for_statement): Reworked the way For works: now
14311         we declare manually any variables that are introduced in
14312         for_initializer to solve the problem of having out-of-band code
14313         emition (that is what got for broken).
14314
14315         (declaration_statement): Perform the actual variable declaration
14316         that used to be done in local_variable_declaration here.
14317
14318         (local_variable_declaration): Do not declare anything, just pass
14319         the information on a DictionaryEntry
14320
14321 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14322
14323         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14324         re-write of the logic to now make it recursive.
14325
14326         (UpdateIndices): Re-write accordingly.
14327
14328         Store element data in a separate ArrayData list in the above methods.
14329
14330         (MakeByteBlob): Implement to dump the array data into a byte array.
14331
14332 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14333
14334         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14335         into CheckIndices.
14336
14337         * constant.cs (Define): Implement.
14338
14339         (EmitConstant): Re-write fully.
14340
14341         Pass in location info.
14342
14343         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14344         respectively.
14345
14346         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14347         DictionaryEntry since we need location info too.
14348
14349         (constant_declaration): Update accordingly.
14350
14351         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14352         code into another method : UpdateIndices.
14353
14354 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14355
14356         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14357         some type checking etc.
14358
14359 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14360
14361         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14362         bits to provide dimension info if the user skips doing that.
14363
14364         Update second constructor to store the rank correctly.
14365
14366 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14367
14368         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14369         and try to implement.
14370
14371         * ../errors/cs0150.cs : Add.
14372
14373         * ../errors/cs0178.cs : Add.
14374
14375 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14376
14377         * statement.cs: Implement foreach on multi-dimensional arrays. 
14378
14379         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14380         name of the params argument.
14381
14382         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14383         initializing the array.
14384
14385         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14386         we can use this elsewhere.
14387
14388         * statement.cs: Finish implementation of foreach for single
14389         dimension arrays.
14390
14391         * cs-parser.jay: Use an out-of-band stack to pass information
14392         around, I wonder why I need this.
14393
14394         foreach_block: Make the new foreach_block the current_block.
14395
14396         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14397         function used to return a static Parameters structure.  Used for
14398         empty parameters, as those are created very frequently.
14399
14400         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14401
14402 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14403
14404         * interface.cs : Default modifier is private, not public. The
14405         make verify test passes again.
14406
14407 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14408
14409         * support.cs (ReflectionParameters): Fix logic to determine
14410         whether the last parameter is a params one. Test 9 passes again.
14411
14412         * delegate.cs (Populate): Register the builders we define with
14413         RegisterParameterForBuilder. Test 19 passes again.
14414
14415         * cs-parser.jay (property_declaration): Reference $6 instead
14416         of $$ to get at the location.
14417
14418         (indexer_declaration): Similar stuff.
14419
14420         (attribute): Ditto.
14421
14422         * class.cs (Property): Register parameters for the Get and Set methods
14423         if they exist. Test 23 passes again.
14424
14425         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14426         call to EmitArguments as we are sure there aren't any params arguments. 
14427         Test 32 passes again.
14428
14429         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14430         IndexOutOfRangeException. 
14431
14432         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14433         Test 33 now passes again.
14434
14435 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14436
14437         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14438         broke a bunch of things.  Will have to come up with a better way
14439         of tracking locations.
14440
14441         * statement.cs: Implemented foreach for single dimension arrays.
14442
14443 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14444
14445         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14446         an error.  This removes the lookup from the critical path.
14447
14448         * cs-parser.jay: Removed use of temporary_loc, which is completely
14449         broken. 
14450
14451 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14452
14453         * support.cs (ReflectionParameters.ParameterModifier): Report
14454         whether the argument is a PARAMS argument or not.
14455
14456         * class.cs: Set the attribute `ParamArrayAttribute' on the
14457         parameter argument.
14458
14459         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14460         and cons_param_array_attribute (ConstructorInfo for
14461         ParamArrayAttribute)., 
14462
14463         * codegen.cs: Emit the return using the `Return' statement, that
14464         way we can report the error correctly for missing return values. 
14465
14466         * class.cs (Method.Emit): Clean up.
14467
14468         * expression.cs (Argument.Resolve): Take another argument: the
14469         location where this argument is used.  Notice that this is not
14470         part of the "Argument" class as to reduce the size of the
14471         structure (we know the approximate location anyways).
14472
14473         Test if the argument is a variable-reference, if not, then
14474         complain with a 206.
14475
14476         (Argument.Emit): Emit addresses of variables.
14477
14478         (Argument.FullDesc): Simplify.
14479
14480         (Invocation.DoResolve): Update for Argument.Resolve.
14481
14482         (ElementAccess.DoResolve): ditto.
14483
14484         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14485         method should be virtual, as this method is always virtual.
14486
14487         (NewDelegate.DoResolve): Update for Argument.Resolve.
14488
14489         * class.cs (ConstructorInitializer.DoResolve): ditto.
14490
14491         * attribute.cs (Attribute.Resolve): ditto.
14492
14493 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14494
14495         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14496
14497         * expression.cs (ParameterReference): Drop IStackStorage and implement
14498         IAssignMethod instead. 
14499
14500         (LocalVariableReference): ditto.
14501
14502         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14503         IAssignMethod instead. 
14504
14505 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14506
14507         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14508         enumerations that are used in heavily used structures derive from
14509         byte in a laughable and pathetic attempt to reduce memory usage.
14510         This is the kind of pre-optimzations that you should not do at
14511         home without adult supervision.
14512
14513         * expression.cs (UnaryMutator): New class, used to handle ++ and
14514         -- separatedly from the other unary operators.  Cleans up the
14515         code, and kills the ExpressionStatement dependency in Unary.
14516
14517         (Unary): Removed `method' and `Arguments' from this class, making
14518         it smaller, and moving it all to SimpleCall, so I can reuse this
14519         code in other locations and avoid creating a lot of transient data
14520         strucutres when not required.
14521
14522         * cs-parser.jay: Adjust for new changes.
14523
14524 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14525
14526         * enum.cs (Enum.Populate): If there is a failure during
14527         definition, return
14528
14529         * cs-parser.jay (opt_enum_base): we used to catch type errors
14530         here, but this is really incorrect.  The type error should be
14531         catched during semantic analysis.
14532
14533 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14534
14535         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14536         current_local_parameters as expected since I, in my stupidity, had forgotten
14537         to do this :-)
14538
14539         * attribute.cs (GetValidPlaces): Fix stupid bug.
14540
14541         * class.cs (Method::Emit): Perform check on applicability of attributes.
14542
14543         (Constructor::Emit): Ditto.
14544
14545         (Field::Emit): Ditto.
14546
14547         (Field.Location): Store location information.
14548
14549         (Property, Event, Indexer, Operator): Ditto.
14550
14551         * cs-parser.jay (field_declaration): Pass in location for each field.
14552
14553         * ../errors/cs0592.cs : Add.
14554
14555 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14556
14557         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14558
14559         (InitCoreTypes): Update accordingly.
14560
14561         (RegisterAttrType, LookupAttr): Implement.
14562
14563         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14564         info about the same.
14565
14566         (Resolve): Update to populate the above as necessary.
14567
14568         (Error592): Helper.
14569
14570         (GetValidPlaces): Helper to the above.
14571
14572         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14573
14574         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14575
14576 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14577
14578         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14579
14580         * ../errors/cs0617.cs : Add.
14581
14582 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14583
14584         * enum.cs (Emit): Rename to Populate to be more consistent with what
14585         we expect it to do and when exactly it is called.
14586
14587         * class.cs, rootcontext.cs : Update accordingly.
14588
14589         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14590         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14591
14592         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14593
14594         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14595         of a fieldinfo using the above, when dealing with a FieldBuilder.
14596
14597 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14598
14599         * ../errors/cs0031.cs : Add.
14600
14601         * ../errors/cs1008.cs : Add.
14602
14603         * ../errrors/cs0543.cs : Add.
14604
14605         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14606         enum type.
14607
14608         (FindMembers): Implement.
14609
14610         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14611         enums and delegates too.
14612
14613         (enum_types): Rename to builder_to_enum.
14614
14615         (delegate_types): Rename to builder_to_delegate.
14616
14617         * delegate.cs (FindMembers): Implement.
14618
14619 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14620
14621         * typemanager.cs (IsEnumType): Implement.
14622
14623         * enum.cs (Emit): Re-write parts to account for the underlying type
14624         better and perform checking etc.
14625
14626         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14627         of the underlying type.
14628
14629         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14630         value
14631
14632         * enum.cs (error31): Helper to report error #31.
14633
14634         * cs-parser.jay (enum_declaration): Store location of each member too.
14635
14636         * enum.cs (member_to_location): New hashtable. 
14637
14638         (AddEnumMember): Update location hashtable.
14639
14640         (Emit): Use the location of each member while reporting errors.
14641
14642 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14643
14644         * cs-parser.jay: A for_initializer if is a
14645         local_variable_declaration really ammount to have an implicit
14646         block with the variable declaration and no initializer for for.
14647
14648         * statement.cs (For.Emit): Cope with null initializers.
14649
14650         This fixes the infinite loop on for initializers.
14651
14652 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14653
14654         * enum.cs: More cleanup.
14655
14656         * ecore.cs: Remove dead code.
14657
14658         * class.cs (Property.Emit): More simplification.
14659         (Event.Emit): ditto.
14660
14661         Reworked to have less levels of indentation.
14662
14663 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14664
14665         * class.cs (Property): Emit attributes.
14666
14667         (Field): Ditto.
14668
14669         (Event): Ditto.
14670
14671         (Indexer): Ditto.
14672
14673         (Operator): Ditto.
14674
14675         * enum.cs (Emit): Ditto.
14676
14677         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14678         Enums too.
14679
14680         * class.cs (Field, Event, etc.): Move attribute generation into the
14681         Emit method everywhere.
14682
14683         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14684         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14685         as we had no way of defining nested enums !
14686
14687         * rootcontext.cs : Adjust code accordingly.
14688
14689         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14690
14691 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14692
14693         * expression.cs (EvalConstantExpression): Move into ecore.cs
14694
14695         * enum.cs (Enum): Rename some members and make them public and readonly
14696         according to our convention.
14697
14698         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14699         nothing else.
14700
14701         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14702
14703         (Enum::Emit): Write a simple version for now which doesn't try to compute
14704         expressions. I shall modify this to be more robust in just a while.
14705
14706         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14707
14708         (TypeContainer::CloseType): Create the Enum types too.
14709
14710         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14711
14712         * expression.cs (EvalConstantExpression): Get rid of completely.
14713
14714         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14715         user-defined values and other cases.
14716
14717         (IsValidEnumLiteral): Helper function.
14718
14719         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14720         out there in the case we had a literal FieldExpr.
14721
14722         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14723
14724         (Literalize): Revamp a bit to take two arguments.
14725
14726         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14727
14728 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14729
14730         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14731
14732         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14733
14734         (Resolve): Use the above to ensure we have proper initializers.
14735
14736 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14737
14738         * expression.cs (Expression::EvalConstantExpression): New method to 
14739         evaluate constant expressions.
14740
14741         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14742
14743 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14744
14745         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14746         in an array.
14747
14748         (Binary.ResolveOperator): Handle operator != (object a, object b)
14749         and operator == (object a, object b);
14750
14751         (Binary.DoNumericPromotions): Indicate whether the numeric
14752         promotion was possible.
14753
14754         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14755         Implement.  
14756
14757         Made the ArrayAccess implement interface IAssignMethod instead of
14758         IStackStore as the order in which arguments are passed reflects
14759         this.
14760
14761         * assign.cs: Instead of using expr.ExprClass to select the way of
14762         assinging, probe for the IStackStore/IAssignMethod interfaces.
14763
14764         * typemanager.cs: Load InitializeArray definition.
14765
14766         * rootcontext.cs (RootContext.MakeStaticData): Used to define
14767         static data that can be used to initialize arrays. 
14768
14769 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
14770
14771         * expression.cs: Handle operator== and operator!= for booleans.
14772
14773         (Conditioal.Reduce): Implement reducer for the ?: operator.
14774
14775         (Conditional.Resolve): Implement dead code elimination.
14776
14777         (Binary.Resolve): Catch string literals and return a new
14778         concatenated string.
14779
14780         (Unary.Reduce): Implement reduction of unary expressions.
14781
14782         * ecore.cs: Split out the expression core handling here.
14783
14784         (Expression.Reduce): New method used to perform constant folding
14785         and CSE.  This is needed to support constant-expressions. 
14786
14787         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14788         targets, and optimize for !x.
14789
14790 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14791
14792         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14793         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14794         set custom atttributes.
14795
14796         * literal.cs (Literal::GetValue): New abstract method to return the actual
14797         value of the literal, cast as an object.
14798
14799         (*Literal): Implement GetValue method.
14800
14801         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14802         expressions to the arraylist but objects of type Argument.
14803
14804         * class.cs (TypeContainer::Emit): Emit our attributes too.
14805
14806         (Method::Emit, Constructor::Emit): Ditto.
14807
14808         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14809         to be ignoring earlier.
14810
14811 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14812
14813         * attribute.cs (AttributeSection::Define): Implement to do the business
14814         of constructing a CustomAttributeBuilder.
14815
14816         (Attribute): New trivial class. Increases readability of code.  
14817
14818         * cs-parser.jay : Update accordingly.
14819
14820         (positional_argument_list, named_argument_list, named_argument): New rules
14821
14822         (attribute_arguments): Use the above so that we are more correct.
14823
14824 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14825
14826         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14827         to perform all checks for a method with a params parameter.
14828
14829         (Invocation::OverloadResolve): Update to use the above method and therefore
14830         cope correctly with params method invocations.
14831
14832         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14833         params too.
14834
14835         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14836         constructors in our parent too because we can't afford to miss out on 
14837         protected ones ;-)
14838
14839         * attribute.cs (AttributeSection): New name for the class Attribute
14840
14841         Other trivial changes to improve readability.
14842
14843         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14844         use the new class names.
14845
14846 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14847
14848         * class.cs (Method::Define): Complete definition for params types too
14849
14850         (Indexer::Define): Ditto.
14851
14852         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14853         Cope everywhere with a request for info about the array parameter.
14854
14855 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14856
14857         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14858
14859         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14860         local_variable_type to extract the string corresponding to the type.
14861
14862         (local_variable_type): Fixup the action to use the new helper method.
14863
14864         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14865         go.
14866
14867         * expression.cs : Clean out code which uses the above.
14868
14869 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14870
14871         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14872         and bale out if necessary by returning a false.
14873
14874         (RegisterProperty): Ditto.
14875
14876         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14877         and print out appropriate error messages.
14878
14879         * interface.cs (everywhere): Ditto.
14880
14881         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14882         location to constructor.
14883
14884         * class.cs (Property, Event, Indexer): Update accordingly.
14885
14886         * ../errors/cs111.cs : Added.
14887
14888         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14889         of a method, as laid down by the spec.
14890
14891         (Invocation::OverloadResolve): Use the above method.
14892
14893 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14894
14895         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
14896         now take a TypeContainer and a Parameters object.
14897
14898         (ParameterData): Modify return type of ParameterModifier method to be 
14899         Parameter.Modifier and not a string.
14900
14901         (ReflectionParameters, InternalParameters): Update accordingly.
14902
14903         * expression.cs (Argument::GetParameterModifier): Same here.
14904
14905         * support.cs (InternalParameters::ParameterType): Find a better way of determining
14906         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
14907         symbol in it at all so maybe this is only for now.
14908
14909 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14910
14911         * support.cs (InternalParameters): Constructor now takes an extra argument 
14912         which is the actual Parameters class.
14913
14914         (ParameterDesc): Update to provide info on ref/out modifiers.
14915
14916         * class.cs (everywhere): Update call to InternalParameters to pass in
14917         the second argument too.
14918
14919         * support.cs (ParameterData): Add ParameterModifier, which is a method 
14920         to return the modifier info [ref/out etc]
14921
14922         (InternalParameters, ReflectionParameters): Implement the above.
14923
14924         * expression.cs (Argument::ParameterModifier): Similar function to return
14925         info about the argument's modifiers.
14926
14927         (Invocation::OverloadResolve): Update to take into account matching modifiers 
14928         too.
14929
14930         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
14931         a new SetFormalParameters object which we pass to InternalParameters.
14932
14933 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14934
14935         * expression.cs (NewArray): Merge into the ArrayCreation class.
14936
14937 2001-10-29  Ravi Pratap  <ravi@ximian.com>
14938
14939         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
14940         NewUserdefinedArray into one as there wasn't much of a use in having
14941         two separate ones.
14942
14943         * expression.cs (Argument): Change field's name to ArgType from Type.
14944
14945         (Type): New readonly property which returns the proper type, taking into 
14946         account ref/out modifiers.
14947
14948         (everywhere): Adjust code accordingly for the above.
14949
14950         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
14951         whether we are emitting for a ref or out parameter.
14952
14953         * expression.cs (Argument::Emit): Use the above field to set the state.
14954
14955         (LocalVariableReference::Emit): Update to honour the flag and emit the
14956         right stuff.
14957
14958         * parameter.cs (Attributes): Set the correct flags for ref parameters.
14959
14960         * expression.cs (Argument::FullDesc): New function to provide a full desc.
14961
14962         * support.cs (ParameterData): Add method ParameterDesc to the interface.
14963
14964         (ReflectionParameters, InternalParameters): Implement the above method.
14965
14966         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
14967         reporting errors.
14968
14969         (Invocation::FullMethodDesc): Ditto. 
14970
14971 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
14972
14973         * cs-parser.jay: Add extra production for the second form of array
14974         creation. 
14975
14976         * expression.cs (ArrayCreation): Update to reflect the above
14977         change. 
14978
14979         * Small changes to prepare for Array initialization.
14980
14981 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
14982
14983         * typemanager.cs (ImplementsInterface): interface might be null;
14984         Deal with this problem;
14985
14986         Also, we do store negative hits on the cache (null values), so use
14987         this instead of calling t.GetInterfaces on the type everytime.
14988
14989 2001-10-28  Ravi Pratap  <ravi@ximian.com>
14990
14991         * typemanager.cs (IsBuiltinType): New method to help determine the same.
14992
14993         * expression.cs (New::DoResolve): Get rid of array creation code and instead
14994         split functionality out into different classes.
14995
14996         (New::FormArrayType): Move into NewBuiltinArray.
14997
14998         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
14999         quite useless.
15000
15001         (NewBuiltinArray): New class to handle creation of built-in arrays.
15002
15003         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15004         account creation of one-dimensional arrays.
15005
15006         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15007
15008         (NewUserdefinedArray::DoResolve): Implement.
15009
15010         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15011
15012         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15013         we maintain inside the TypeManager. This is necessary to perform lookups on the
15014         module builder.
15015
15016         (LookupType): Update to perform GetType on the module builders too.     
15017
15018         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15019
15020         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15021
15022 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15023
15024         * expression.cs (New::DoResolve): Implement guts of array creation.
15025
15026         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15027
15028 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15029
15030         * expression.cs: Fix bug I introduced lsat night that broke
15031         Delegates. 
15032
15033         (Expression.Resolve): Report a 246 error (can not resolve name)
15034         if we find a SimpleName in the stream.
15035
15036         (Expression.ResolveLValue): Ditto.
15037
15038         (Expression.ResolveWithSimpleName): This function is a variant of
15039         ResolveName, this one allows SimpleNames to be returned without a
15040         warning.  The only consumer of SimpleNames is MemberAccess
15041
15042 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15043
15044         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15045         might arrive here.  I have my doubts that this is correct.
15046
15047         * statement.cs (Lock): Implement lock statement.
15048
15049         * cs-parser.jay: Small fixes to support `lock' and `using'
15050
15051         * cs-tokenizer.cs: Remove extra space
15052
15053         * driver.cs: New flag --checked, allows to turn on integer math
15054         checking. 
15055
15056         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15057         Threading.Monitor.Exit 
15058
15059 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15060
15061         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15062         Expression Class to be IndexerAccess.
15063
15064         Notice that Indexer::DoResolve sets the eclass to Value.
15065
15066 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15067
15068         * class.cs (TypeContainer::Emit): Emit code for indexers.
15069
15070         * assign.cs (IAssignMethod): New interface implemented by Indexers
15071         and Properties for handling assignment.
15072
15073         (Assign::Emit): Simplify and reuse code. 
15074
15075         * expression.cs (IndexerAccess, PropertyExpr): Implement
15076         IAssignMethod, clean up old code. 
15077
15078 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15079
15080         * typemanager.cs (ImplementsInterface): New method to determine if a type
15081         implements a given interface. Provides a nice cache too.
15082
15083         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15084         method.
15085
15086         (ConvertReferenceExplicit): Ditto.
15087
15088         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15089         various methods, with correct names etc.
15090
15091         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15092         Operator.UnaryNegation.
15093
15094         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15095         we have a unary plus or minus operator.
15096
15097         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15098         UnaryMinus.
15099
15100         * everywhere : update accordingly.
15101
15102         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15103         respectively.
15104
15105         * class.cs (Method::Define): For the case where we are implementing a method
15106         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15107         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15108
15109 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15110
15111         * interface.cs (FindMembers): Implement to work around S.R.E
15112         lameness.
15113
15114         * typemanager.cs (IsInterfaceType): Implement.
15115
15116         (FindMembers): Update to handle interface types too.
15117
15118         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15119         use IsAssignableFrom as that is not correct - it doesn't work.
15120
15121         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15122         and accordingly override EmitStatement.
15123
15124         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15125         using the correct logic :-)
15126
15127 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15128
15129         * ../errors/cs-11.cs : Add to demonstrate error -11 
15130
15131 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15132
15133         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15134         then pass this as a hint to ResolveLValue.
15135
15136         * expression.cs (FieldExpr): Add Location information
15137
15138         (FieldExpr::LValueResolve): Report assignment to readonly
15139         variable. 
15140
15141         (Expression::ExprClassFromMemberInfo): Pass location information.
15142
15143         (Expression::ResolveLValue): Add new method that resolves an
15144         LValue. 
15145
15146         (Expression::DoResolveLValue): Default invocation calls
15147         DoResolve. 
15148
15149         (Indexers): New class used to keep track of indexers in a given
15150         Type. 
15151
15152         (IStackStore): Renamed from LValue, as it did not really describe
15153         what this did.  Also ResolveLValue is gone from this interface and
15154         now is part of Expression.
15155
15156         (ElementAccess): Depending on the element access type
15157
15158         * typemanager.cs: Add `indexer_name_type' as a Core type
15159         (System.Runtime.CompilerServices.IndexerNameAttribute)
15160
15161         * statement.cs (Goto): Take a location.
15162
15163 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15164
15165         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15166         if two delegates are compatible.
15167
15168         (NewDelegate::DoResolve): Update to take care of the case when
15169         we instantiate a delegate from another delegate.
15170
15171         * typemanager.cs (FindMembers): Don't even try to look up members
15172         of Delegate types for now.
15173
15174 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15175
15176         * delegate.cs (NewDelegate): New class to take care of delegate
15177         instantiation.
15178
15179         * expression.cs (New): Split the delegate related code out into 
15180         the NewDelegate class.
15181
15182         * delegate.cs (DelegateInvocation): New class to handle delegate 
15183         invocation.
15184
15185         * expression.cs (Invocation): Split out delegate related code into
15186         the DelegateInvocation class.
15187
15188 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15189
15190         * expression.cs (New::DoResolve): Implement delegate creation fully
15191         and according to the spec.
15192
15193         (New::DoEmit): Update to handle delegates differently.
15194
15195         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15196         because of which we were printing out arguments in reverse order !
15197
15198         * delegate.cs (VerifyMethod): Implement to check if the given method
15199         matches the delegate.
15200
15201         (FullDelegateDesc): Implement.
15202
15203         (VerifyApplicability): Implement.
15204
15205         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15206         delegate invocations too.
15207
15208         (Invocation::Emit): Ditto.
15209
15210         * ../errors/cs1593.cs : Added.
15211
15212         * ../errors/cs1594.cs : Added.
15213
15214         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15215
15216 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15217
15218         * typemanager.cs (intptr_type): Core type for System.IntPtr
15219
15220         (InitCoreTypes): Update for the same.
15221
15222         (iasyncresult_type, asynccallback_type): Ditto.
15223
15224         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15225         correct.
15226
15227         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15228         too.
15229
15230         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15231         the builders for the 4 members of a delegate type :-)
15232
15233         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15234         type.
15235
15236         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15237
15238         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15239
15240 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15241
15242         * statement.cs (Break::Emit): Implement.   
15243         (Continue::Emit): Implement.
15244
15245         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15246         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15247         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15248         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15249         end loop
15250
15251         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15252         properties that track the label for the current loop (begin of the
15253         loop and end of the loop).
15254
15255 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15256
15257         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15258         use of emitting anything at all.
15259
15260         * class.cs, rootcontext.cs : Get rid of calls to the same.
15261
15262         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15263
15264         (Populate): Define the constructor correctly and set the implementation
15265         attributes.
15266
15267         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15268         have been defined.
15269
15270         (AddDelegateType): Implement.
15271
15272         (IsDelegateType): Implement helper method.
15273
15274         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15275
15276         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15277         and accordingly handle it.
15278
15279         * delegate.cs (Populate): Take TypeContainer argument.
15280         Implement bits to define the Invoke method. However, I still haven't figured out
15281         how to take care of the native int bit :-(
15282
15283         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15284         Qualify the name of the delegate, not its return type !
15285
15286         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15287         conversion.
15288
15289         (StandardConversionExists): Checking for array types turns out to be recursive.
15290
15291         (ConvertReferenceExplicit): Implement array conversion.
15292
15293         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15294
15295 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15296
15297         * cs-parser.jay (delegate_declaration): Store the fully qualified
15298         name as it is a type declaration.
15299
15300         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15301         readonly.
15302
15303         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15304         as TypeContainer::DefineType.
15305
15306         (Populate): Method in which all the definition of the various methods (Invoke)
15307         etc is done.
15308
15309         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15310         see.
15311
15312         (CloseDelegate): Finally creates the delegate.
15313
15314         * class.cs (TypeContainer::DefineType): Update to define delegates.
15315         (Populate, Emit and CloseType): Do the same thing here too.
15316
15317         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15318         delegates in all these operations.
15319
15320 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15321
15322         * expression.cs: LocalTemporary: a new expression used to
15323         reference a temporary that has been created.
15324
15325         * assign.cs: Handle PropertyAccess back here, so that we can
15326         provide the proper semantic access to properties.
15327
15328         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15329         a few more explicit conversions. 
15330
15331         * modifiers.cs: `NEW' modifier maps to HideBySig.
15332
15333         * expression.cs (PropertyExpr): Make this into an
15334         ExpressionStatement, and support the EmitStatement code path. 
15335
15336         Perform get/set error checking, clean up the interface.
15337
15338         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15339         them into toplevel access objects.
15340
15341 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15342
15343         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15344         SRE.
15345
15346         * typemanager.cs: Keep track here of our PropertyBuilders again to
15347         work around lameness in SRE.
15348
15349 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15350
15351         * expression.cs (LValue::LValueResolve): New method in the
15352         interface, used to perform a second resolution pass for LValues. 
15353
15354         (This::DoResolve): Catch the use of this in static methods.
15355
15356         (This::LValueResolve): Implement.
15357
15358         (This::Store): Remove warning, assigning to `this' in structures
15359         is 
15360
15361         (Invocation::Emit): Deal with invocation of
15362         methods on value types.  We need to pass the address to structure
15363         methods rather than the object itself.  (The equivalent code to
15364         emit "this" for structures leaves the entire structure on the
15365         stack instead of a pointer to it). 
15366
15367         (ParameterReference::DoResolve): Compute the real index for the
15368         argument based on whether the method takes or not a `this' pointer
15369         (ie, the method is static).
15370
15371         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15372         value types returned from functions when we need to invoke a
15373         method on the sturcture.
15374
15375
15376 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15377
15378         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15379         defining the type in the Modulebuilder or Typebuilder. This is to take
15380         care of nested types which need to be defined on the TypeBuilder using
15381         DefineNestedMethod.
15382
15383         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15384         methods in RootContext, only ported to be part of TypeContainer.
15385
15386         (TypeContainer::GetInterfaceOrClass): Ditto.
15387
15388         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15389
15390         * interface.cs (Interface::DefineInterface): New method. Does exactly
15391         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15392         too.
15393
15394         (Interface::GetInterfaces): Move from RootContext here and port.
15395
15396         (Interface::GetInterfaceByName): Same here.
15397
15398         * rootcontext.cs (ResolveTree): Re-write.
15399
15400         (PopulateTypes): Re-write.
15401
15402         * class.cs (TypeContainer::Populate): Populate nested types too.
15403         (TypeContainer::Emit): Emit nested members too.
15404
15405         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15406         instead just use the name argument passed in as it is already fully
15407         qualified.
15408
15409         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15410         to TypeContainer mapping to see if a type is user-defined.
15411
15412         * class.cs (TypeContainer::CloseType): Implement. 
15413
15414         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15415         the default constructor.
15416
15417         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15418         twice.
15419
15420         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15421
15422         * interface.cs (CloseType): Create the type here.
15423
15424         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15425         the hierarchy.
15426
15427         Remove all the methods which are now in TypeContainer.
15428
15429 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15430
15431         * delegate.cs (Define): Re-write bits to define the delegate
15432         correctly.
15433
15434 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15435
15436         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15437
15438         * expression.cs (ImplicitReferenceConversion): handle null as well
15439         as a source to convert to any reference type.
15440
15441         * statement.cs (Return): Perform any implicit conversions to
15442         expected return type.  
15443
15444         Validate use of return statement.  
15445
15446         * codegen.cs (EmitContext): Pass the expected return type here.
15447
15448         * class.cs (Method, Constructor, Property): Pass expected return
15449         type to EmitContext.
15450
15451 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15452
15453         * expression.cs: Make DoResolve take an EmitContext instead of a
15454         TypeContainer.
15455
15456         Replaced `l' and `location' for `loc', for consistency.
15457
15458         (Error, Warning): Remove unneeded Tc argument.
15459
15460         * assign.cs, literal.cs, constant.cs: Update to new calling
15461         convention. 
15462
15463         * codegen.cs: EmitContext now contains a flag indicating whether
15464         code is being generated in a static method or not.
15465
15466         * cs-parser.jay: DecomposeQI, new function that replaces the old
15467         QualifiedIdentifier.  Now we always decompose the assembled
15468         strings from qualified_identifier productions into a group of
15469         memberaccesses.
15470
15471 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15472
15473         * rootcontext.cs: Deal with field-less struct types correctly now
15474         by passing the size option to Define Type.
15475
15476         * class.cs: Removed hack that created one static field. 
15477
15478 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15479
15480         * statement.cs: Moved most of the code generation here. 
15481
15482 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15483
15484         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15485         seem very right.
15486
15487         (ElementAccess): Remove useless bits for now - keep checks as the spec
15488         says.
15489
15490 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15491
15492         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15493         and start performing checks according to the spec.
15494
15495 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15496
15497         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15498         rank_specifiers instead.
15499
15500         (rank_specifiers): Change the order in which the rank specifiers are stored
15501
15502         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15503
15504         * expression.cs (ElementAccess): Implement the LValue interface too.
15505
15506 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15507
15508         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15509         except that user defined conversions are not included.
15510
15511         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15512         perform the conversion of the return type, if necessary.
15513
15514         (New::DoResolve): Check whether we are creating an array or an object
15515         and accordingly do the needful.
15516
15517         (New::Emit): Same here.
15518
15519         (New::DoResolve): Implement guts of array creation.
15520
15521         (New::FormLookupType): Helper function.
15522
15523 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15524
15525         * codegen.cs: Removed most of the code generation here, and move the
15526         corresponding code generation bits to the statement classes. 
15527
15528         Added support for try/catch/finalize and throw.
15529
15530         * cs-parser.jay: Added support for try/catch/finalize.
15531
15532         * class.cs: Catch static methods having the flags override,
15533         virtual or abstract.
15534
15535         * expression.cs (UserCast): This user cast was not really doing
15536         what it was supposed to do.  Which is to be born in fully resolved
15537         state.  Parts of the resolution were being performed at Emit time! 
15538
15539         Fixed this code.
15540
15541 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15542
15543         * expression.cs: Implicity convert the result from UserCast.
15544
15545 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15546
15547         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15548         prevented it from working correctly. 
15549
15550         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15551         merely ConvertImplicit.
15552
15553 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15554
15555         * typemanager.cs: Make the LookupTypeContainer function static,
15556         and not per-instance.  
15557
15558         * class.cs: Make static FindMembers (the one that takes a Type
15559         argument). 
15560
15561         * codegen.cs: Add EmitForeach here.
15562
15563         * cs-parser.jay: Make foreach a toplevel object instead of the
15564         inline expansion, as we need to perform semantic analysis on it. 
15565
15566 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15567
15568         * expression.cs (Expression::ImplicitUserConversion): Rename to
15569         UserDefinedConversion.
15570
15571         (Expression::UserDefinedConversion): Take an extra argument specifying 
15572         whether we look for explicit user conversions too.
15573
15574         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15575
15576         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15577
15578         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15579         with the appropriate arguments.
15580
15581         * cs-parser.jay (cast_expression): Record location too.
15582
15583         * expression.cs (Cast): Record location info.
15584
15585         (Expression::ConvertExplicit): Take location argument.
15586
15587         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15588         to determine if we are doing explicit conversions.
15589
15590         (UserCast::Emit): Update accordingly.
15591
15592         (Expression::ConvertExplicit): Report an error if everything fails.
15593
15594         * ../errors/cs0030.cs : Add.
15595
15596 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15597
15598         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15599         virtual and newslot bits. 
15600
15601         * class.cs (TypeContainer::RegisterRequiredImplementations):
15602         Record methods we need.
15603
15604         (TypeContainer::MakeKey): Helper function to make keys for
15605         MethodBases, since the Methodbase key is useless.
15606
15607         (TypeContainer::Populate): Call RegisterRequiredImplementations
15608         before defining the methods.   
15609
15610         Create a mapping for method_builders_to_methods ahead of time
15611         instead of inside a tight loop.
15612
15613         (::RequireMethods):  Accept an object as the data to set into the
15614         hashtable so we can report interface vs abstract method mismatch.
15615
15616 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15617
15618         * report.cs: Make all of it static.
15619
15620         * rootcontext.cs: Drop object_type and value_type computations, as
15621         we have those in the TypeManager anyways.
15622
15623         Drop report instance variable too, now it is a global.
15624
15625         * driver.cs: Use try/catch on command line handling.
15626
15627         Add --probe option to debug the error reporting system with a test
15628         suite. 
15629
15630         * report.cs: Add support for exiting program when a probe
15631         condition is reached.
15632
15633 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15634
15635         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15636         we do a forcible conversion regardless of type, to check if 
15637         ForceConversion returns a null.
15638
15639         (Binary::error19): Use location to report error.
15640
15641         (Unary::error23): Use location here too.
15642
15643         * ../errors/cs0019.cs : Check in.
15644
15645         * ../errors/cs0023.cs : Check in.
15646
15647         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15648         case of a non-null MethodInfo object with a length of 0 !
15649
15650         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15651         an applicable member - according to the spec :-)
15652         Also fix logic to find members in base types.
15653
15654         (Unary::ResolveOperator): Same here.
15655
15656         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15657         as I was getting thoroughly confused between this and error19 :-)
15658
15659         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15660         (::FindMostEncompassedType): Implement.
15661         (::FindMostEncompassingType): Implement.
15662         (::StandardConversionExists): Implement.
15663
15664         (UserImplicitCast): Re-vamp. We now need info about most specific
15665         source and target types so that we can do the necessary conversions.
15666
15667         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15668         mathematical union with no duplicates.
15669
15670 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15671
15672         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15673         in order from base classes to child classes, so that we can in
15674         child classes look up in our parent for method names and
15675         attributes (required for handling abstract, virtual, new, override
15676         constructs: we need to instrospect our base class, and if we dont
15677         populate the classes in order, the introspection might be
15678         incorrect.  For example, a method could query its parent before
15679         the parent has any methods and would determine that the parent has
15680         no abstract methods (while it could have had them)).
15681
15682         (RootContext::CreateType): Record the order in which we define the
15683         classes.
15684
15685 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15686
15687         * class.cs (TypeContainer::Populate): Also method definitions can
15688         fail now, keep track of this.
15689
15690         (TypeContainer::FindMembers): Implement support for
15691         DeclaredOnly/noDeclaredOnly flag.
15692
15693         (Constructor::Emit) Return the ConstructorBuilder.
15694
15695         (Method::Emit) Return the MethodBuilder. 
15696         Check for abstract or virtual methods to be public.
15697
15698         * rootcontext.cs (RootContext::CreateType): Register all the
15699         abstract methods required for the class to be complete and the
15700         interface methods that must be implemented. 
15701
15702         * cs-parser.jay: Report error 501 (method requires body if it is
15703         not marked abstract or extern).
15704
15705         * expression.cs (TypeOf::Emit): Implement.
15706
15707         * typemanager.cs: runtime_handle_type, new global type.
15708
15709         * class.cs (Property::Emit): Generate code for properties.
15710
15711 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15712
15713         * expression.cs (Unary::ResolveOperator): Find operators on base type
15714         too - we now conform exactly to the spec.
15715
15716         (Binary::ResolveOperator): Same here.
15717
15718         * class.cs (Operator::Define): Fix minor quirk in the tests.
15719
15720         * ../errors/cs0215.cs : Added.
15721
15722         * ../errors/cs0556.cs : Added.
15723
15724         * ../errors/cs0555.cs : Added.
15725
15726 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15727
15728         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15729         single integer which is really efficient
15730
15731 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15732
15733         *  expression.cs (Expression::ImplicitUserConversion): Use location
15734         even in the case when we are examining True operators.
15735  
15736         * class.cs (Operator::Define): Perform extensive checks to conform
15737         with the rules for operator overloading in the spec.
15738
15739         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15740         some of the other conversions mentioned in the spec.
15741
15742         * typemanager.cs (array_type): New static member for the System.Array built-in
15743         type.
15744
15745         (cloneable_interface): For System.ICloneable interface.
15746
15747         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15748         we start resolving the tree and populating types.
15749
15750         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15751  
15752 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15753
15754         * expression.cs (Expression::ExprClassFromMemberInfo,
15755         Expression::Literalize): Create literal expressions from
15756         FieldInfos which are literals.
15757
15758         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
15759         type casts, because they were wrong.  The test suite in tests
15760         caught these ones.
15761
15762         (ImplicitNumericConversion): ushort to ulong requires a widening
15763         cast. 
15764
15765         Int32 constant to long requires widening cast as well.
15766
15767         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
15768         for integers because the type on the stack is not i4.
15769
15770 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
15771
15772         * expression.cs (report118): require location argument. 
15773
15774         * parameter.cs: Do not dereference potential null value.
15775
15776         * class.cs: Catch methods that lack the `new' keyword when
15777         overriding a name.  Report warnings when `new' is used without
15778         anything being there to override.
15779
15780         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15781
15782         * class.cs: Only add constructor to hashtable if it is non-null
15783         (as now constructors can fail on define).
15784
15785         (TypeManager, Class, Struct): Take location arguments.
15786
15787         Catch field instance initialization in structs as errors.
15788
15789         accepting_filter: a new filter for FindMembers that is static so
15790         that we dont create an instance per invocation.
15791
15792         (Constructor::Define): Catch errors where a struct constructor is
15793         parameterless 
15794
15795         * cs-parser.jay: Pass location information for various new
15796         constructs. 
15797
15798         * delegate.cs (Delegate): take a location argument.
15799
15800         * driver.cs: Do not call EmitCode if there were problesm in the
15801         Definition of the types, as many Builders wont be there. 
15802
15803         * decl.cs (Decl::Decl): Require a location argument.
15804
15805         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15806         into integers, and find the most appropiate integer for it.
15807
15808         * literal.cs: Implement ULongLiteral.
15809
15810         * rootcontext.cs: Provide better information about the location of
15811         failure when CreateType fails.
15812
15813 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15814
15815         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15816         as well.
15817
15818         * expression.cs (Binary::CheckShiftArguments): Add missing type
15819         computation.
15820         (Binary::ResolveOperator): Add type to the logical and and logical
15821         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15822         before.
15823
15824         (Binary::DoNumericPromotions): In the case where either argument
15825         is ulong (and most signed types combined with ulong cause an
15826         error) perform implicit integer constant conversions as well.
15827
15828 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15829
15830         * expression.cs (UserImplicitCast): Method should always be
15831         non-null. 
15832         (Invocation::BetterConversion): Simplified test for IntLiteral.
15833
15834         (Expression::ImplicitNumericConversion): Split this routine out.
15835         Put the code that performs implicit constant integer conversions
15836         here. 
15837
15838         (Expression::Resolve): Become a wrapper around DoResolve so we can
15839         check eclass and type being set after resolve.
15840
15841         (Invocation::Badness): Remove this dead function
15842
15843         (Binary::ResolveOperator): Do not compute the expensive argumnets
15844         unless we have a union for it.
15845
15846         (Probe::Emit): Is needs to do an isinst and then
15847         compare against null.
15848
15849         (::CanConvert): Added Location argument.  If the Location argument
15850         is null (Location.Null), then we do not report errors.  This is
15851         used by the `probe' mechanism of the Explicit conversion.  We do
15852         not want to generate an error for something that the user
15853         explicitly requested to be casted.  But the pipeline for an
15854         explicit cast first tests for potential implicit casts.
15855
15856         So for now, if the Location is null, it means `Probe only' to
15857         avoid adding another argument.   Might have to revise this
15858         strategy later.
15859
15860         (ClassCast): New class used to type cast objects into arbitrary
15861         classes (used in Explicit Reference Conversions).
15862
15863         Implement `as' as well.
15864
15865         Reverted all the patches from Ravi below: they were broken:
15866
15867                 * The use of `level' as a mechanism to stop recursive
15868                   invocations is wrong.  That was there just to catch the
15869                   bug with a strack trace but not as a way of addressing
15870                   the problem.
15871
15872                   To fix the problem we have to *understand* what is going
15873                   on and the interactions and come up with a plan, not
15874                   just get things going.
15875
15876                 * The use of the type conversion cache that I proposed
15877                   last night had an open topic: How does this work across
15878                   protection domains.  A user defined conversion might not
15879                   be public in the location where we are applying the
15880                   conversion, a different conversion might be selected
15881                   (ie, private A->B (better) but public B->A (worse),
15882                   inside A, A->B applies, but outside it, B->A will
15883                   apply).
15884
15885                 * On top of that (ie, even if the above is solved),
15886                   conversions in a cache need to be abstract.  Ie, `To
15887                   convert from an Int to a Short use an OpcodeCast', not
15888                   `To convert from an Int to a Short use the OpcodeCast on
15889                   the variable 5' (which is what this patch was doing).
15890
15891 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15892
15893         * expression.cs (Invocation::ConversionExists): Re-write to use
15894         the conversion cache
15895
15896         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
15897         cache all conversions done, not just user-defined ones.
15898
15899         (Invocation::BetterConversion): The real culprit. Use ConversionExists
15900         to determine if a conversion exists instead of acutually trying to 
15901         perform the conversion. It's faster too.
15902
15903         (Expression::ConvertExplicit): Modify to use ConversionExists to check
15904         and only then attempt the implicit conversion.
15905
15906 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15907
15908         * expression.cs (ConvertImplicit): Use a cache for conversions
15909         already found. Check level of recursion and bail out if necessary.
15910
15911 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15912
15913         * typemanager.cs (string_concat_string_string, string_concat_object_object):
15914         Export standard methods that we expect for string operations.
15915
15916         * statement.cs (Block::UsageWarning): Track usage of variables and
15917         report the errors for not used variables.
15918
15919         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
15920         operator. 
15921
15922 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15923
15924         * codegen.cs: remove unnneded code 
15925
15926         * expression.cs: Removed BuiltinTypeAccess class
15927
15928         Fix the order in which implicit conversions are
15929         done.  
15930
15931         The previous fixed dropped support for boxed conversions (adding a
15932         test to the test suite now)
15933
15934         (UserImplicitCast::CanConvert): Remove test for source being null,
15935         that code is broken.  We should not feed a null to begin with, if
15936         we do, then we should track the bug where the problem originates
15937         and not try to cover it up here.
15938
15939         Return a resolved expression of type UserImplicitCast on success
15940         rather than true/false.  Ravi: this is what I was talking about,
15941         the pattern is to use a static method as a "constructor" for
15942         objects. 
15943
15944         Also, do not create arguments until the very last minute,
15945         otherwise we always create the arguments even for lookups that
15946         will never be performed. 
15947
15948         (UserImplicitCast::Resolve): Eliminate, objects of type
15949         UserImplicitCast are born in a fully resolved state. 
15950
15951         * typemanager.cs (InitCoreTypes): Init also value_type
15952         (System.ValueType). 
15953
15954         * expression.cs (Cast::Resolve): First resolve the child expression.
15955
15956         (LValue): Add new method AddressOf to be used by
15957         the `&' operator.  
15958
15959         Change the argument of Store to take an EmitContext instead of an
15960         ILGenerator, because things like FieldExpr need to be able to call
15961         their children expression to generate the instance code. 
15962
15963         (Expression::Error, Expression::Warning): Sugar functions for
15964         reporting errors.
15965
15966         (Expression::MemberLookup): Accept a TypeContainer instead of a
15967         Report as the first argument.
15968
15969         (Expression::ResolvePrimary): Killed.  I still want to improve
15970         this as currently the code is just not right.
15971
15972         (Expression::ResolveMemberAccess): Simplify, but it is still
15973         wrong. 
15974
15975         (Unary::Resolve): Catch errors in AddressOf operators.
15976
15977         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
15978         index to a byte for the short-version, or the compiler will choose
15979         the wrong Emit call, which generates the wrong data.
15980
15981         (ParameterReference::Emit, ::Store): same.
15982
15983         (FieldExpr::AddressOf): Implement.
15984
15985         * typemanager.cs: TypeManager: made public variable instead of
15986         property.
15987
15988         * driver.cs: document --fatal.
15989
15990         * report.cs (ErrorMessage, WarningMessage): new names for the old
15991         Error and Warning classes.
15992
15993         * cs-parser.jay (member_access): Turn built-in access to types
15994         into a normal simplename
15995
15996 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15997
15998         * expression.cs (Invocation::BetterConversion): Fix to cope
15999         with q being null, since this was introducing a bug.
16000
16001         * expression.cs (ConvertImplicit): Do built-in conversions first.
16002
16003 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16004
16005         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16006
16007 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16008
16009         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16010         I had introduced long ago (what's new ?).
16011
16012         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16013         the work of all the checking. 
16014         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16015         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16016
16017         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16018         that is the right way. 
16019
16020         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16021         overloading resolution. Use everywhere instead of cutting and pasting code.
16022
16023         (Binary::ResolveOperator): Use MakeUnionSet.
16024
16025         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16026         we have to convert to bool types. Not complete yet.
16027
16028 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16029
16030         * typemanager.cs (TypeManager::CSharpName): support ushort.
16031
16032         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16033         to provide an expression that performsn an implicit constant int
16034         conversion (section 6.1.6).
16035         (Expression::ConvertImplicitRequired): Reworked to include
16036         implicit constant expression conversions.
16037
16038         (Expression::ConvertNumericExplicit): Finished.
16039
16040         (Invocation::Emit): If InstanceExpression is null, then it means
16041         that we perform a call on this.
16042
16043 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16044
16045         * expression.cs (Unary::Emit): Remove some dead code.
16046         (Probe): Implement Resolve and Emit for `is'.
16047         (Expression::ConvertImplicitRequired): Attempt to do constant
16048         expression conversions here.  Maybe should be moved to
16049         ConvertImplicit, but I am not sure.
16050         (Expression::ImplicitLongConstantConversionPossible,
16051         Expression::ImplicitIntConstantConversionPossible): New functions
16052         that tell whether is it possible to apply an implicit constant
16053         expression conversion.
16054
16055         (ConvertNumericExplicit): Started work on explicit numeric
16056         conversions.
16057
16058         * cs-parser.jay: Update operator constants.
16059
16060         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16061         (Parameters::GetSignature): Hook up VerifyArgs here.
16062         (Parameters::VerifyArgs): Verifies that no two arguments have the
16063         same name. 
16064
16065         * class.cs (Operator): Update the operator names to reflect the
16066         ones that the spec expects (as we are just stringizing the
16067         operator names).
16068
16069         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16070         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16071         previous usage did only work for our methods.
16072         (Expression::ConvertImplicit): Handle decimal implicit numeric
16073         conversions as well.
16074         (Expression::InternalTypeConstructor): Used to invoke constructors
16075         on internal types for default promotions.
16076
16077         (Unary::Emit): Implement special handling for the pre/post
16078         increment/decrement for overloaded operators, as they need to have
16079         the same semantics as the other operators.
16080
16081         (Binary::ResolveOperator): ditto.
16082         (Invocation::ConversionExists): ditto.
16083         (UserImplicitCast::Resolve): ditto.
16084
16085 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16086
16087         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16088         operator, return after emitting body. Regression tests pass again !
16089
16090         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16091         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16092         (Invocation::OverloadResolve): Ditto.
16093         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16094
16095         * everywhere : update calls to the above methods accordingly.
16096
16097 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16098
16099         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16100
16101         * expression.cs (ExpressionStatement): New base class used for
16102         expressions that can appear in statements, so that we can provide
16103         an alternate path to generate expression that do not leave a value
16104         on the stack.
16105
16106         (Expression::Emit, and all the derivatives): We no longer return
16107         whether a value is left on the stack or not.  Every expression
16108         after being emitted leaves a single value on the stack.
16109
16110         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16111         facilties of ExpressionStatement if possible.
16112
16113         * cs-parser.jay: Update statement_expression.
16114
16115 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16116
16117         * driver.cs: Change the wording of message
16118
16119 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16120
16121         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16122         the type of the expression to the return type of the method if
16123         we have an overloaded operator match ! The regression tests pass again !
16124         (Unary::ResolveOperator): Ditto.
16125
16126         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16127         to find "op_Implicit", not "implicit" ;-)
16128         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16129         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16130
16131         * everywhere : Correct calls to the above accordingly.
16132
16133         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16134         (ConvertImplicit): Do user-defined conversion if it exists.
16135
16136 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16137
16138         * assign.cs: track location.
16139         (Resolve): Use implicit conversions on assignment.
16140
16141         * literal.cs: Oops.  Not good, Emit of short access values should
16142         pass (Bytes) or the wrong argument will be selected.
16143
16144         * expression.cs (Unary::Emit): Emit code for -expr.
16145
16146         (Unary::ResolveOperator): Handle `Substract' for non-constants
16147         (substract from zero from the non-constants).
16148         Deal with Doubles as well. 
16149
16150         (Expression::ConvertImplicitRequired): New routine that reports an
16151         error if no implicit conversion exists. 
16152
16153         (Invocation::OverloadResolve): Store the converted implicit
16154         expressions if we make them
16155
16156 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16157
16158         * class.cs (ConstructorInitializer): Take a Location argument.
16159         (ConstructorBaseInitializer): Same here.
16160         (ConstructorThisInitializer): Same here.
16161
16162         * cs-parser.jay : Update all calls accordingly.
16163
16164         * expression.cs (Unary, Binary, New): Take location argument.
16165         Update accordingly everywhere.
16166
16167         * cs-parser.jay : Update all calls to the above to take a location
16168         argument.
16169
16170         * class.cs : Ditto.
16171
16172 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16173
16174         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16175         (Invocation::BetterConversion): Same here
16176         (Invocation::ConversionExists): Ditto.
16177
16178         (Invocation::ConversionExists): Implement.
16179
16180 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16181
16182         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16183         Also take an additional TypeContainer argument.
16184
16185         * All over : Pass in TypeContainer as argument to OverloadResolve.
16186
16187         * typemanager.cs (CSharpName): Update to check for the string type and return
16188         that too.
16189
16190         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16191         a given method.
16192
16193 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16194
16195         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16196         (Invocation::BetterFunction): Implement.
16197         (Invocation::BetterConversion): Implement.
16198         (Invocation::ConversionExists): Skeleton, no implementation yet.
16199
16200         Okay, things work fine !
16201
16202 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16203
16204         * typemanager.cs: declare and load enum_type, delegate_type and
16205         void_type. 
16206
16207         * expression.cs (Expression::Emit): Now emit returns a value that
16208         tells whether a value is left on the stack or not.  This strategy
16209         might be reveted tomorrow with a mechanism that would address
16210         multiple assignments.
16211         (Expression::report118): Utility routine to report mismatches on
16212         the ExprClass.
16213
16214         (Unary::Report23): Report impossible type/operator combination
16215         utility function.
16216
16217         (Unary::IsIncrementableNumber): Whether the type can be
16218         incremented or decremented with add.
16219         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16220         complemented. 
16221         (Unary::ResolveOperator): Implement ++, !, ~,
16222
16223         (Invocation::Emit): Deal with new Emit convetion.
16224
16225         * All Expression derivatives: Updated their Emit method to return
16226         whether they leave values on the stack or not.
16227
16228         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16229         stack for expressions that are statements. 
16230
16231 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16232
16233         * expression.cs (LValue): New interface.  Must be implemented by
16234         LValue objects.
16235         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16236         LValue interface.
16237
16238         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16239         interface for generating code, simplifies the code.
16240
16241 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16242
16243         * expression.cs (everywhere): Comment out return statements in ::Resolve
16244         methods to avoid the warnings.
16245
16246 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16247
16248         * driver.cs (parse): Report error 2001 if we can not open the
16249         source file.
16250
16251         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16252         not resolve it.
16253
16254         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16255         object. 
16256
16257         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16258         otherwise nested blocks end up with the same index.
16259
16260         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16261
16262         * expression.cs:  Instead of having FIXMEs in the Resolve
16263         functions, throw exceptions so it is obvious that we are facing a
16264         bug. 
16265
16266         * cs-parser.jay (invocation_expression): Pass Location information.
16267
16268         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16269         Use a basename for those routines because .NET does not like paths
16270         on them. 
16271
16272         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16273         already defined.
16274
16275 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16276
16277         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16278         are loading the correct data types (throws an exception if not).
16279         (TypeManager::InitCoreTypes): Use CoreLookupType
16280
16281         * expression.cs (Unary::ResolveOperator): return the child
16282         expression for expressions which are just +expr.
16283         (Unary::ResolveOperator): Return negative literals for -LITERAL
16284         expressions (otherwise they are Unary {Literal}).
16285         (Invocation::Badness): Take into account `Implicit constant
16286         expression conversions'.
16287
16288         * literal.cs (LongLiteral): Implement long literal class.
16289         (IntLiteral): export the `Value' of the intliteral. 
16290
16291 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16292
16293         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16294
16295         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16296         instead of 'Operator'
16297
16298         * expression.cs (Binary::ResolveOperator): Update accordingly.
16299         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16300         and 'Minus'
16301
16302         * cs-parser.jay (unary_expression): Update to use the new names.
16303
16304         * gen-treedump.cs (GetUnary): Same here.
16305
16306         * expression.cs (Unary::Resolve): Implement.
16307         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16308         operators are found instead of making noise ;-)
16309         (Unary::ResolveOperator): New method to do precisely the same thing which
16310         Binary::ResolveOperator does for Binary expressions.
16311         (Unary.method, .Arguments): Add.
16312         (Unary::OperName): Implement.   
16313         (Unary::ForceConversion): Copy and Paste !
16314
16315         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16316         a unary operator.
16317
16318         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16319         for the inbuilt operators. Only overloading works for now ;-)
16320
16321 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16322
16323         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16324         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16325
16326         * expression.cs (This::Emit): Implement. 
16327         (This::Resolve): Implement.
16328         (TypeOf:Resolve): Implement.
16329         (Expression::ResolveSimpleName): Add an implicit this to instance
16330         field references. 
16331         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16332         Bind instance variable to Field expressions.
16333         (FieldExpr::Instance): New field used to track the expression that
16334         represents the object instance.
16335         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16336         binding 
16337         (FieldExpr::Emit): Implement.
16338
16339         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16340         the last instruction contains a return opcode to avoid generating
16341         the last `ret' instruction (this generates correct code, and it is
16342         nice to pass the peverify output).
16343
16344         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16345         initializer for static and instance variables.
16346         (Constructor::Emit): Allow initializer to be null in the case of
16347         static constructors.  Only emit initializer for instance
16348         constructors. 
16349
16350         (TypeContainer::FindMembers): Return a null array if there are no
16351         matches.
16352
16353         Also fix the code for the MemberTypes.Method branch, as it was not
16354         scanning that for operators (or tried to access null variables before).
16355
16356         * assign.cs (Assign::Emit): Handle instance and static fields. 
16357
16358         * TODO: Updated.
16359
16360         * driver.cs: Stop compilation if there are parse errors.
16361
16362         * cs-parser.jay (constructor_declaration): Provide default base
16363         initializer for non-static constructors.
16364         (constructor_declarator): Do not provide a default base
16365         initializers if none was specified.
16366         Catch the fact that constructors should not have parameters.
16367
16368         * class.cs: Do not emit parent class initializers for static
16369         constructors, that should be flagged as an error.
16370
16371 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16372
16373         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16374         Move back code into TypeContainer::Populate.
16375
16376 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16377
16378         * class.cs (TypeContainer::AddConstructor): Fix the check to
16379         compare against Name, not Basename. 
16380         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16381
16382         * cs-parser.jay : Update accordingly.
16383
16384         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16385         for methods, don't forget to look into the operators too.
16386         (RegisterMethodBuilder): Helper method to take care of this for
16387         methods, constructors and operators.
16388         (Operator::Define): Completely revamp.
16389         (Operator.OperatorMethod, MethodName): New fields.
16390         (TypeContainer::Populate): Move the registering of builders into
16391         RegisterMethodBuilder.
16392         (Operator::Emit): Re-write.
16393
16394         * expression.cs (Binary::Emit): Comment out code path to emit method
16395         invocation stuff for the case when we have a user defined operator. I am
16396         just not able to get it right !
16397
16398 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16399
16400         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16401         argument. 
16402
16403         (Expression::MemberLookup): Provide a version that allows to
16404         specify the MemberTypes and BindingFlags. 
16405
16406         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16407         so it was not fetching variable information from outer blocks.
16408
16409         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16410         Beforefieldinit as it was buggy.
16411
16412         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16413         that Ravi put here.  
16414
16415         * class.cs (Constructor::Emit): Only emit if block is not null.
16416         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16417         deal with this by semantically definining it as if the user had
16418         done it.
16419
16420         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16421         constructors as we now "emit" them at a higher level.
16422
16423         (TypeContainer::DefineDefaultConstructor): Used to define the
16424         default constructors if none was provided.
16425
16426         (ConstructorInitializer): Add methods Resolve and Emit. 
16427
16428         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16429
16430 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16431
16432         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16433         the default constructor builder with our hashtable for methodbuilders
16434         to methodcores.
16435
16436         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16437         and argument_count is 0 in which case we have a match.
16438         (Binary::ResolveOperator): More null checking and miscellaneous coding
16439         style cleanup.
16440
16441 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16442
16443         * rootcontext.cs (IsNameSpace): Compare against null.
16444
16445         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16446
16447         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16448         and Unary::Operator.
16449
16450         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16451         accordingly.
16452
16453         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16454         we have overloaded operators.
16455         (Binary::ResolveOperator): Implement the part which does the operator overload
16456         resolution.
16457
16458         * class.cs (Operator::Emit): Implement.
16459         (TypeContainer::Emit): Emit the operators we have too.
16460
16461         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16462         the case when we have a user-defined operator.
16463
16464 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16465
16466         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16467
16468 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16469
16470         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16471         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16472         (Constructor::Emit): Implement.
16473         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16474         if we have no work to do. 
16475         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16476         Emit method.
16477
16478         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16479         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16480
16481         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16482         of parent.parent.
16483
16484 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16485
16486         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16487         in the source.
16488         (Tree::RecordNamespace): Method to do what the name says ;-)
16489         (Tree::Namespaces): Property to get at the namespaces hashtable.
16490
16491         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16492         keep track.
16493
16494         * rootcontext.cs (IsNamespace): Fixed it :-)
16495
16496 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16497
16498         * class.cs (TypeContainer::FindMembers): Add support for
16499         constructors. 
16500         (MethodCore): New class that encapsulates both the shared aspects
16501         of a Constructor and a Method.  
16502         (Method, Constructor): Factored pieces into MethodCore.
16503
16504         * driver.cs: Added --fatal which makes errors throw exceptions.
16505         Load System assembly as well as part of the standard library.
16506
16507         * report.cs: Allow throwing exceptions on errors for debugging.
16508
16509         * modifiers.cs: Do not use `parent', instead use the real type
16510         container to evaluate permission settings.
16511
16512         * class.cs: Put Ravi's patch back in.  He is right, and we will
16513         have to cope with the
16514
16515 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16516
16517         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16518         FamORAssem, not FamANDAssem.
16519
16520 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16521
16522         * driver.cs: Added --parse option that only parses its input files
16523         and terminates.
16524
16525         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16526         incorrect.  IsTopLevel is not used to tell whether an object is
16527         root_types or not (that can be achieved by testing this ==
16528         root_types).  But to see if this is a top-level *class* (not
16529         necessarly our "toplevel" container). 
16530
16531 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16532
16533         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16534         parent instead of a direct call to GetType.
16535
16536 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16537
16538         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16539         Modifiers.TypeAttr. This should just be a call to that method.
16540
16541         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16542         object so that we can determine if we are top-level or not.
16543
16544         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16545         TypeContainer too.
16546
16547         * enum.cs (Enum::Define): Ditto.
16548
16549         * modifiers.cs (FieldAttr): Re-write.
16550
16551         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16552         (TypeContainer::HaveStaticConstructor): New property to provide access
16553         to precisely that info.
16554
16555         * modifiers.cs (MethodAttr): Re-write.
16556         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16557
16558         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16559         of top-level types as claimed.
16560
16561 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16562
16563         * expression.cs (MemberLookup): Fruitless attempt to lookup
16564         constructors.  Maybe I need to emit default constructors?  That
16565         might be it (currently .NET emits this for me automatically).
16566         (Invocation::OverloadResolve): Cope with Arguments == null.
16567         (Invocation::EmitArguments): new function, shared by the new
16568         constructor and us.
16569         (Invocation::Emit): Handle static and instance methods.  Emit
16570         proper call instruction for virtual or non-virtual invocations.
16571         (New::Emit): Implement.
16572         (New::Resolve): Implement.
16573         (MemberAccess:Resolve): Implement.
16574         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16575         to track instances.
16576         (FieldExpr::Resolve): Set type.
16577
16578         * support.cs: Handle empty arguments.
16579                 
16580         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16581         SimpleLookup): Auxiliary routines to help parse a qualifier
16582         identifier.  
16583
16584         Update qualifier_identifier rule.
16585
16586         * codegen.cs: Removed debugging messages.
16587
16588         * class.cs: Make this a global thing, this acts just as a "key" to
16589         objects that we might have around.
16590
16591         (Populate): Only initialize method_builders_to_methods once.
16592
16593         * expression.cs (PropertyExpr): Initialize type from the
16594         PropertyType. 
16595
16596         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16597         Resolve pattern.  Attempt to implicitly convert value to boolean.
16598         Emit code.
16599
16600         * expression.cs: Set the type for the int32/int32 argument case.
16601         (Binary::ResolveOperator): Set the return type to boolean for
16602         comparission operators
16603
16604         * typemanager.cs: Remove debugging print code.
16605
16606         (Invocation::Resolve): resolve type.
16607
16608         * class.cs: Allocate a MemberInfo of the correct size, as the code
16609         elsewhere depends on the test to reflect the correct contents.
16610
16611         (Method::) Keep track of parameters, due to System.Reflection holes
16612
16613         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16614         mapping here.
16615
16616         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16617         of the exact size and return that.
16618
16619         (Class::LookupMethodByBuilder): New function that maps
16620         MethodBuilders to its methods.  Required to locate the information
16621         on methods because System.Reflection bit us again.
16622
16623         * support.cs: New file, contains an interface ParameterData and
16624         two implementations: ReflectionParameters and InternalParameters
16625         used to access Parameter information.  We will need to grow this
16626         as required.
16627
16628         * expression.cs (Invocation::GetParameterData): implement a cache
16629         and a wrapper around the ParameterData creation for methods. 
16630         (Invocation::OverloadResolve): Use new code.
16631
16632 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16633
16634         * class.cs (TypeContainer::EmitField): Remove and move into 
16635         (Field::Define): here and modify accordingly.
16636         (Field.FieldBuilder): New member.
16637         (TypeContainer::Populate): Update accordingly.
16638         (TypeContainer::FindMembers): Implement.
16639
16640 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16641
16642         * statement.cs: (VariableInfo::VariableType): New field to be
16643         initialized with the full type once it is resolved. 
16644
16645 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16646
16647         * parameter.cs (GetParameterInfo): Use a type cache to compute
16648         things only once, and to reuse this information
16649
16650         * expression.cs (LocalVariableReference::Emit): Implement.
16651         (OpcodeCast::Emit): fix.
16652
16653         (ParameterReference::Resolve): Implement.
16654         (ParameterReference::Emit): Implement.
16655
16656         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16657         that are expressions need to stay as Expressions.
16658
16659         * typemanager.cs (CSharpName): Returns the C# name of a type if
16660         possible. 
16661
16662         * expression.cs (Expression::ConvertImplicit): New function that
16663         implements implicit type conversions.
16664
16665         (Expression::ImplicitReferenceConversion): Implements implicit
16666         reference conversions.
16667
16668         (EmptyCast): New type for transparent casts.
16669
16670         (OpcodeCast): New type for casts of types that are performed with
16671         a sequence of bytecodes.
16672
16673         (BoxedCast): New type used for casting value types into reference
16674         types.  Emits a box opcode.
16675
16676         (Binary::DoNumericPromotions): Implements numeric promotions of
16677         and computation of the Binary::Type.
16678
16679         (Binary::EmitBranchable): Optimization.
16680
16681         (Binary::Emit): Implement code emission for expressions.
16682
16683         * typemanager.cs (TypeManager): Added two new core types: sbyte
16684         and byte.
16685
16686 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16687
16688         * class.cs (TypeContainer::FindMembers): Method which does exactly
16689         what Type.FindMembers does, only we don't have to use reflection. No
16690         implementation yet.
16691
16692         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16693         typecontainer objects as we need to get at them.
16694         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16695
16696         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16697         typecontainer object.
16698
16699         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16700         of just a Report object.
16701
16702 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16703
16704         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16705         "remove_"
16706         (TypeContainer::Populate): Now define the delegates of the type too.
16707         (TypeContainer.Delegates): Property to access the list of delegates defined
16708         in the type.
16709
16710         * delegates.cs (Delegate::Define): Implement partially.
16711
16712         * modifiers.cs (TypeAttr): Handle more flags.
16713
16714 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16715
16716         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16717         and not <=
16718         (Operator::Define): Re-write logic to get types by using the LookupType method
16719         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16720         (Indexer::Define): Ditto.
16721         (Event::Define): Ditto.
16722         (Property::Define): Ditto.
16723
16724 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16725
16726         * class.cs (TypeContainer::Populate): Now define operators too. 
16727         (TypeContainer.Operators): New property to access the list of operators
16728         in a type.
16729         (Operator.OperatorMethodBuilder): New member to hold the method builder
16730         for the operator we are defining.
16731         (Operator::Define): Implement.
16732
16733 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16734
16735         * class.cs (Event::Define): Make the prefixes of the accessor methods
16736         addOn_ and removeOn_ 
16737
16738         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16739         of the location being passed in too. Ideally, this should go later since all
16740         error reporting should be done through the Report object.
16741
16742         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16743         (Populate): Iterate thru the indexers we have and define them too.
16744         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16745         for the get and set accessors.
16746         (Indexer::Define): Implement.
16747
16748 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16749
16750         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16751         my previous implementation, did not work.
16752
16753         * typemanager.cs: Add a couple of missing types (the longs).
16754
16755         * literal.cs: Use TypeManager.bool_type instead of getting it.
16756
16757         * expression.cs (EventExpr): New kind of expressions.
16758         (Expressio::ExprClassFromMemberInfo): finish
16759
16760 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
16761
16762         * assign.cs: Emit stores to static fields differently.
16763
16764 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16765
16766         * Merge in changes and adjust code to tackle conflicts. Backed out my
16767         code in Assign::Resolve ;-) 
16768
16769 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16770
16771         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
16772         instead Report.Error and also pass in the location.
16773         (CSharpParser::Lexer): New readonly property to return the reference
16774         to the Tokenizer object.
16775         (declare_local_variables): Use Report.Error with location instead of plain 
16776         old error.
16777         (CheckDef): Ditto.
16778
16779         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16780         (Operator.CheckBinaryOperator): Ditto.
16781
16782         * cs-parser.jay (operator_declarator): Update accordingly.
16783
16784         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16785         (CheckBinaryOperator): Same here.
16786
16787         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16788         on the name without any prefixes of namespace names etc. This is because we
16789         already might have something already fully qualified like 
16790         'System.Console.WriteLine'
16791
16792         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16793
16794 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16795
16796         * cs-tokenizer.cs (location): Return a string which also contains
16797         the file name.
16798
16799         * expression.cs (ElementAccess): New class for expressions of the
16800         type 'element access.'
16801         (BaseAccess): New class for expressions of the type 'base access.'
16802         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16803         respectively.
16804
16805         * cs-parser.jay (element_access): Implement action.
16806         (base_access): Implement actions.
16807         (checked_expression, unchecked_expression): Implement.
16808
16809         * cs-parser.jay (local_variable_type): Correct and implement.
16810         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16811
16812         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16813
16814         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16815         name and the specifiers.
16816
16817         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16818
16819         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16820         making them all public ;-)
16821
16822         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16823         class anyways.
16824
16825 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16826
16827         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16828         PropertyExprs.
16829         (FieldExpr, PropertyExprs): New resolved expressions.
16830         (SimpleName::MemberStaticCheck): Perform static checks for access
16831         to non-static fields on static methods. Maybe this should be
16832         generalized for MemberAccesses. 
16833         (SimpleName::ResolveSimpleName): More work on simple name
16834         resolution. 
16835
16836         * cs-parser.jay (primary_expression/qualified_identifier): track
16837         the parameter index.
16838
16839         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16840         (EmitContext::EmitBoolExpression): Chain to expression generation
16841         instead of temporary hack.
16842         (::EmitStatementExpression): Put generic expression code generation.
16843
16844         * assign.cs (Assign::Emit): Implement variable assignments to
16845         local variables, parameters and fields.
16846
16847 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16848
16849         * statement.cs (Block::GetVariableInfo): New method, returns the
16850         VariableInfo for a variable name in a block.
16851         (Block::GetVariableType): Implement in terms of GetVariableInfo
16852
16853         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16854         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16855
16856 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16857
16858         * cs-parser.jay (operator_declaration): Continue on my quest : update
16859         to take attributes argument.
16860         (event_declaration): Ditto.
16861         (enum_declaration): Ditto.
16862         (indexer_declaration): Ditto.
16863
16864         * class.cs (Operator::Operator): Update constructor accordingly.
16865         (Event::Event): Ditto.
16866
16867         * delegate.cs (Delegate::Delegate): Same here.
16868
16869         * enum.cs (Enum::Enum): Same here.
16870
16871 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16872
16873         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16874
16875         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16876
16877         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16878         being passed around as an arraylist.
16879         (Attributes::AddAttribute): Method to add attribute sections.
16880
16881         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16882         (struct_declaration): Update accordingly.
16883         (constant_declaration): Update.
16884         (field_declaration): Update.
16885         (method_header): Update.
16886         (fixed_parameter): Update.
16887         (parameter_array): Ditto.
16888         (property_declaration): Ditto.
16889         (destructor_declaration): Ditto.
16890
16891         * class.cs (Struct::Struct): Update constructors accordingly.
16892         (Class::Class): Ditto.
16893         (Field::Field): Ditto.
16894         (Method::Method): Ditto.
16895         (Property::Property): Ditto.
16896         (TypeContainer::OptAttribute): update property's return type.
16897
16898         * interface.cs (Interface.opt_attributes): New member.
16899         (Interface::Interface): Update to take the extra Attributes argument.
16900
16901         * parameter.cs (Parameter::Parameter): Ditto.
16902
16903         * constant.cs (Constant::Constant): Ditto.
16904
16905         * interface.cs (InterfaceMemberBase): New OptAttributes field.
16906         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
16907         the attributes as a parameter.
16908         (InterfaceProperty): Update constructor call.
16909         (InterfaceEvent): Ditto.
16910         (InterfaceMethod): Ditto.
16911         (InterfaceIndexer): Ditto.
16912
16913         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
16914         pass the attributes too.
16915         (interface_event_declaration): Ditto.
16916         (interface_property_declaration): Ditto.
16917         (interface_method_declaration): Ditto.
16918         (interface_declaration): Ditto.
16919
16920 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
16921
16922         * class.cs (Method::Define): Track the "static Main" definition to
16923         create an entry point. 
16924
16925         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
16926         EntryPoint if we find it. 
16927
16928         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
16929         (EmitContext::ig): Make this variable public.
16930
16931         * driver.cs: Make the default output file be the first file name
16932         with the .exe extension.  
16933
16934         Detect empty compilations
16935
16936         Handle various kinds of output targets.  Handle --target and
16937         rename -t to --dumper.
16938
16939         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
16940         methods inherited from Expression return now an Expression.  This
16941         will is used during the tree rewriting as we resolve them during
16942         semantic analysis.
16943
16944         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
16945         the spec.  Missing entirely is the information about
16946         accessability of elements of it.
16947
16948         (Expression::ExprClassFromMemberInfo): New constructor for
16949         Expressions that creates a fully initialized Expression based on
16950         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
16951         a Type.
16952
16953         (Invocation::Resolve): Begin implementing resolution of invocations.
16954
16955         * literal.cs (StringLiteral):  Implement Emit.
16956
16957 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16958
16959         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
16960         member.
16961
16962 2001-09-04  Ravi Pratap  <ravi@ximian.com>
16963
16964         * cs-parser.jay (attribute_arguments): Implement actions.
16965         (attribute): Fix bug in production. Implement action.
16966         (attribute_list): Implement.
16967         (attribute_target): Implement.
16968         (attribute_target_specifier, opt_target_specifier): Implement
16969         (CheckAttributeTarget): New method to check if the attribute target
16970         is valid.
16971         (attribute_section): Implement.
16972         (opt_attributes): Implement.
16973
16974         * attribute.cs : New file to handle attributes.
16975         (Attribute): Class to hold attribute info.
16976
16977         * cs-parser.jay (opt_attribute_target_specifier): Remove production
16978         (attribute_section): Modify production to use 2 different rules to 
16979         achieve the same thing. 1 s/r conflict down !
16980         Clean out commented, useless, non-reducing dimension_separator rules.
16981
16982         * class.cs (TypeContainer.attributes): New member to hold list
16983         of attributes for a type.
16984         (Struct::Struct): Modify to take one more argument, the attribute list.
16985         (Class::Class): Ditto.
16986         (Field::Field): Ditto.
16987         (Method::Method): Ditto.
16988         (Property::Property): Ditto.
16989
16990         * cs-parser.jay (struct_declaration): Update constructor call to
16991         pass in the attributes too.
16992         (class_declaration): Ditto.
16993         (constant_declaration): Ditto.
16994         (field_declaration): Ditto.
16995         (method_header): Ditto.
16996         (fixed_parameter): Ditto.
16997         (parameter_array): Ditto.
16998         (property_declaration): Ditto.
16999
17000         * constant.cs (Constant::Constant): Update constructor similarly.
17001         Use System.Collections.
17002
17003         * parameter.cs (Parameter::Parameter): Update as above.
17004
17005 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17006
17007         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17008         (TypeContainer.delegates): New member to hold list of delegates.
17009
17010         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17011         this time as I seem to be on crack ;-)
17012
17013 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17014
17015         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17016         tell whether an identifier represents a namespace.
17017
17018         * expression.cs (NamespaceExpr): A namespace expression, used only
17019         temporarly during expression resolution.
17020         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17021         utility functions to resolve names on expressions.
17022
17023 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17024
17025         * codegen.cs: Add hook for StatementExpressions. 
17026
17027         * class.cs: Fix inverted test for static flag in methods.
17028
17029 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17030
17031         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17032         to make it coincide with MS' number.
17033         (Operator::CheckBinaryOperator): Ditto.
17034
17035         * ../errors/errors.txt : Remove error numbers added earlier.
17036
17037         * ../errors/cs1019.cs : Test case for error # 1019
17038
17039         * ../errros/cs1020.cs : Test case for error # 1020
17040
17041         * cs-parser.jay : Clean out commented cruft.
17042         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17043         used anywhere - non-reducing rule.
17044         (namespace_declarations): Non-reducing rule - comment out.
17045
17046         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17047         with TypeContainer::AddEnum.
17048
17049         * delegate.cs : New file for delegate handling classes.
17050         (Delegate): Class for declaring delegates.
17051
17052         * makefile : Update.
17053
17054         * cs-parser.jay (delegate_declaration): Implement.
17055
17056 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17057
17058         * class.cs (Event::Define): Implement.
17059         (Event.EventBuilder): New member.
17060
17061         * class.cs (TypeContainer::Populate): Update to define all enums and events
17062         we have.
17063         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17064         readonly fields for all these cases ?
17065
17066 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17067
17068         * class.cs (Property): Revamp to use the convention of making fields readonly.
17069         Accordingly modify code elsewhere.
17070
17071         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17072         the Define method of the Property class.
17073
17074         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17075         trivial bug.
17076         (TypeContainer::Populate): Update to define all the properties we have. Also
17077         define all enumerations.
17078
17079         * enum.cs (Define): Implement.
17080
17081 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17082
17083         * cs-parser.jay (overloadable_operator): The semantic value is an
17084         enum of the Operator class.
17085         (operator_declarator): Implement actions.
17086         (operator_declaration): Implement.
17087
17088         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17089         validity of definitions.
17090         (Operator::CheckBinaryOperator): Static method to check for binary operators
17091         (TypeContainer::AddOperator): New method to add an operator to a type.
17092
17093         * cs-parser.jay (indexer_declaration): Added line to actually call the
17094         AddIndexer method so it gets added ;-)
17095
17096         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17097         already taken care of by the MS compiler ?  
17098
17099 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17100
17101         * class.cs (Operator): New class for operator declarations.
17102         (Operator::OpType): Enum for the various operators.
17103
17104 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17105
17106         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17107         ostensibly handle this in semantic analysis.
17108
17109         * cs-parser.jay (general_catch_clause): Comment out
17110         (specific_catch_clauses, specific_catch_clause): Ditto.
17111         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17112         (catch_args, opt_catch_args): New productions.
17113         (catch_clause): Rewrite to use the new productions above
17114         (catch_clauses): Modify accordingly.
17115         (opt_catch_clauses): New production to use in try_statement
17116         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17117         and re-write the code in the actions to extract the specific and
17118         general catch clauses by being a little smart ;-)
17119
17120         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17121         Hooray, try and catch statements parse fine !
17122
17123 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17124
17125         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17126         string from the hashtable of variables.
17127
17128         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17129         I end up making that mistake ;-)
17130         (catch_clauses): Fixed gross error which made Key and Value of the 
17131         DictionaryEntry the same : $1 !!
17132
17133 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17134
17135         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17136
17137         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17138         when the add and remove accessors are specified. 
17139
17140 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17141
17142         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17143         information about indexer_declarator.
17144         (indexer_declarator): Implement actions.
17145         (parsing_indexer): New local boolean used to keep track of whether
17146         we are parsing indexers or properties. This is necessary because 
17147         implicit_parameters come into picture even for the get accessor in the 
17148         case of an indexer.
17149         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17150
17151         * class.cs (Indexer): New class for indexer declarations.
17152         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17153         (TypeContainer::indexers): New member to hold list of indexers for the
17154         type.
17155
17156 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17157
17158         * cs-parser.jay (add_accessor_declaration): Implement action.
17159         (remove_accessor_declaration): Implement action.
17160         (event_accessors_declaration): Implement
17161         (variable_declarators): swap statements for first rule - trivial.
17162
17163         * class.cs (Event): New class to hold information about event
17164         declarations.
17165         (TypeContainer::AddEvent): New method to add an event to a type
17166         (TypeContainer::events): New member to hold list of events.
17167
17168         * cs-parser.jay (event_declaration): Implement actions.
17169
17170 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17171
17172         * cs-parser.jay (dim_separators): Implement. Make it a string
17173         concatenating all the commas together, just as they appear.
17174         (opt_dim_separators): Modify accordingly
17175         (rank_specifiers): Update accordingly. Basically do the same
17176         thing - instead, collect the brackets here.
17177         (opt_rank_sepcifiers): Modify accordingly.
17178         (array_type): Modify to actually return the complete type string
17179         instead of ignoring the rank_specifiers.
17180         (expression_list): Implement to collect the expressions
17181         (variable_initializer): Implement. We make it a list of expressions
17182         essentially so that we can handle the array_initializer case neatly too.
17183         (variable_initializer_list): Implement.
17184         (array_initializer): Make it a list of variable_initializers
17185         (opt_array_initializer): Modify accordingly.
17186
17187         * expression.cs (New::NType): Add enumeration to help us
17188         keep track of whether we have an object/delegate creation
17189         or an array creation.
17190         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17191         members to hold data about array creation.
17192         (New:New): Modify to update NewType
17193         (New:New): New Overloaded contructor for the array creation
17194         case.
17195
17196         * cs-parser.jay (array_creation_expression): Implement to call
17197         the overloaded New constructor.
17198
17199 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17200
17201         * class.cs (TypeContainer::Constructors): Return member
17202         constructors instead of returning null.
17203
17204 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17205
17206         * typemanager.cs (InitCoreTypes): Initialize the various core
17207         types after we have populated the type manager with the user
17208         defined types (this distinction will be important later while
17209         compiling corlib.dll)
17210
17211         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17212         on Expression Classification.  Now all expressions have a method
17213         `Resolve' and a method `Emit'.
17214
17215         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17216         generation from working.     Also add some temporary debugging
17217         code. 
17218
17219 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17220
17221         * codegen.cs: Lots of code generation pieces.  This is only the
17222         beginning, will continue tomorrow with more touches of polish.  We
17223         handle the fundamentals of if, while, do, for, return.  Others are
17224         trickier and I need to start working on invocations soon.
17225
17226         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17227         s.InitStatement. 
17228
17229         * codegen.cs (EmitContext): New struct, used during code
17230         emission to keep a context.   Most of the code generation will be
17231         here. 
17232
17233         * cs-parser.jay: Add embedded blocks to the list of statements of
17234         this block.  So code generation proceeds in a top down fashion.
17235
17236 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17237
17238         * statement.cs: Add support for multiple child blocks.
17239
17240 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17241
17242         * codegen.cs (EmitCode): New function, will emit the code for a
17243         Block of code given a TypeContainer and its ILGenerator. 
17244
17245         * statement.cs (Block): Standard public readonly optimization.
17246         (Block::Block constructors): Link children. 
17247         (Block::Child): Child Linker.
17248         (Block::EmitVariables): Emits IL variable declarations.
17249
17250         * class.cs: Drop support for MethodGroups here, delay until
17251         Semantic Analysis.
17252         (Method::): Applied the same simplification that I did before, and
17253         move from Properties to public readonly fields.
17254         (Method::ParameterTypes): Returns the parameter types for the
17255         function, and implements a cache that will be useful later when I
17256         do error checking and the semantic analysis on the methods is
17257         performed.
17258         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17259         and made a method, optional argument tells whether this is a class
17260         or a structure to apply the `has-this' bit.
17261         (Method::GetCallingConvention): Implement, returns the calling
17262         convention. 
17263         (Method::Define): Defines the type, a second pass is performed
17264         later to populate the methods.
17265
17266         (Constructor::ParameterTypes): implement a cache similar to the
17267         one on Method::ParameterTypes, useful later when we do semantic
17268         analysis. 
17269
17270         (TypeContainer::EmitMethod):  New method.  Emits methods.
17271
17272         * expression.cs: Removed MethodGroup class from here.
17273
17274         * parameter.cs (Parameters::GetCallingConvention): new method.
17275
17276 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17277
17278         * class.cs (TypeContainer::Populate): Drop RootContext from the
17279         argument. 
17280
17281         (Constructor::CallingConvention): Returns the calling convention.
17282         (Constructor::ParameterTypes): Returns the constructor parameter
17283         types. 
17284
17285         (TypeContainer::AddConstructor): Keep track of default constructor
17286         and the default static constructor.
17287
17288         (Constructor::) Another class that starts using `public readonly'
17289         instead of properties. 
17290
17291         (Constructor::IsDefault): Whether this is a default constructor. 
17292
17293         (Field::) use readonly public fields instead of properties also.
17294
17295         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17296         track of static constructors;  If none is used, turn on
17297         BeforeFieldInit in the TypeAttributes. 
17298
17299         * cs-parser.jay (opt_argument_list): now the return can be null
17300         for the cases where there are no arguments. 
17301
17302         (constructor_declarator): If there is no implicit `base' or
17303         `this', then invoke the default parent constructor. 
17304
17305         * modifiers.cs (MethodAttr): New static function maps a set of
17306         modifiers flags into a MethodAttributes enum
17307         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17308         MethodAttr, TypeAttr to represent the various mappings where the
17309         modifiers are used.
17310         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17311
17312 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17313
17314         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17315         method arguments.
17316
17317         * interface.cs (PopulateIndexer): Implemented the code generator
17318         for interface indexers.
17319
17320 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17321
17322         * interface.cs (InterfaceMemberBase): Now we track the new status
17323         here.  
17324
17325         (PopulateProperty): Implement property population.  Woohoo!  Got
17326         Methods and Properties going today. 
17327
17328         Removed all the properties for interfaces, and replaced them with
17329         `public readonly' fields. 
17330
17331 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17332
17333         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17334         initialize their hashtables/arraylists only when they are needed
17335         instead of doing this always.
17336
17337         * parameter.cs: Handle refs and out parameters.
17338
17339         * cs-parser.jay: Use an ArrayList to construct the arguments
17340         instead of the ParameterCollection, and then cast that to a
17341         Parameter[] array.
17342
17343         * parameter.cs: Drop the use of ParameterCollection and use
17344         instead arrays of Parameters.
17345
17346         (GetParameterInfo): Use the Type, not the Name when resolving
17347         types. 
17348
17349 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17350
17351         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17352         and instead use public readonly fields.
17353
17354         * class.cs: Put back walking code for type containers.
17355
17356 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17357
17358         * class.cs (MakeConstant): Code to define constants.
17359
17360         * rootcontext.cs (LookupType): New function.  Used to locate types 
17361
17362
17363 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17364
17365         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17366         this System.Reflection code is.  Kudos to Microsoft
17367
17368         * typemanager.cs: Implement a type cache and avoid loading all
17369         types at boot time.  Wrap in LookupType the internals.  This made
17370         the compiler so much faster.  Wow.  I rule!
17371
17372         * driver.cs: Make sure we always load mscorlib first (for
17373         debugging purposes, nothing really important).
17374
17375         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17376         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17377
17378         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17379         on namespaces that have been imported using the `using' keyword.
17380
17381         * class.cs (TypeContainer::TypeAttr): Virtualize.
17382         (Class::TypeAttr): Return attributes suitable for this bad boy.
17383         (Struct::TypeAttr): ditto.
17384         Handle nested classes.
17385         (TypeContainer::) Remove all the type visiting code, it is now
17386         replaced with the rootcontext.cs code
17387
17388         * rootcontext.cs (GetClassBases): Added support for structs. 
17389
17390 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17391
17392         * interface.cs, statement.cs, class.cs, parameter.cs,
17393         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17394         Drop use of TypeRefs, and use strings instead.
17395
17396 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17397
17398         * rootcontext.cs: 
17399
17400         * class.cs (Struct::Struct): set the SEALED flags after
17401         checking the modifiers.
17402         (TypeContainer::TypeAttr): new property, returns the
17403         TypeAttributes for a class.  
17404
17405         * cs-parser.jay (type_list): Oops, list production was creating a
17406         new list of base types.
17407
17408         * rootcontext.cs (StdLib): New property.
17409         (GetInterfaceTypeByName): returns an interface by type name, and
17410         encapsulates error handling here.
17411         (GetInterfaces): simplified.
17412         (ResolveTree): Encapsulated all the tree resolution here.
17413         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17414         types. 
17415
17416         * driver.cs: Add support for --nostdlib, to avoid loading the
17417         default assemblies.
17418         (Main): Do not put tree resolution here. 
17419
17420         * rootcontext.cs: Beginning of the class resolution.
17421
17422 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17423
17424         * rootcontext.cs: Provide better error reporting. 
17425
17426         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17427
17428         * rootcontext.cs (CreateInterface): Handle the case where there
17429         are no parent interfaces.
17430
17431         (CloseTypes): Routine to flush types at the end.
17432         (CreateInterface): Track types.
17433         (GetInterfaces): Returns an array of Types from the list of
17434         defined interfaces.
17435
17436         * typemanager.c (AddUserType): Mechanism to track user types (puts
17437         the type on the global type hash, and allows us to close it at the
17438         end). 
17439
17440 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17441
17442         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17443         RecordInterface instead.
17444
17445         * cs-parser.jay: Updated to reflect changes above.
17446
17447         * decl.cs (Definition): Keep track of the TypeBuilder type that
17448         represents this type here.  Not sure we will use it in the long
17449         run, but wont hurt for now.
17450
17451         * driver.cs: Smaller changes to accomodate the new code.
17452
17453         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17454         when done. 
17455
17456         * rootcontext.cs (CreateInterface):  New method, used to create
17457         the System.TypeBuilder type for interfaces.
17458         (ResolveInterfaces): new entry point to resolve the interface
17459         hierarchy. 
17460         (CodeGen): Property, used to keep track of the code generator.
17461
17462 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17463
17464         * cs-parser.jay: Add a second production for delegate_declaration
17465         with `VOID'.
17466
17467         (enum_body): Put an opt_comma here instead of putting it on
17468         enum_body or enum_member_declarations so we can handle trailing
17469         commas on enumeration members.  Gets rid of a shift/reduce.
17470
17471         (type_list): Need a COMMA in the middle.
17472
17473         (indexer_declaration): Tell tokenizer to recognize get/set
17474
17475         * Remove old targets.
17476
17477         * Re-add the parser target.
17478
17479 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17480
17481         * cs-parser.jay: Add precendence rules for a number of operators
17482         ot reduce the number of shift/reduce conflicts in the grammar.
17483
17484 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17485
17486         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17487         and put it here.
17488
17489         Get rid of old crufty code.
17490
17491         * rootcontext.cs: Use this to keep track of the parsed
17492         representation and the defined types available to the program. 
17493
17494         * gen-treedump.cs: adjust for new convention.
17495
17496         * type.cs: Split out the type manager, and the assembly builder
17497         from here. 
17498
17499         * typemanager.cs: the type manager will live here now.
17500
17501         * cil-codegen.cs: And the code generator here. 
17502
17503 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17504
17505         * makefile: Fixed up for easy making.
17506
17507 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17508
17509         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17510         the 
17511
17512         (unary_expression): Expand pre_increment_expression and
17513         post_decrement_expression to reduce a shift/reduce.
17514
17515 2001-07-11  Simon Cozens
17516
17517         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17518
17519         Improve allow_keyword_as_indent name.
17520
17521 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17522
17523         * Adjustments for Beta2. 
17524
17525 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17526
17527         * decl.cs: Added `Define' abstract method.
17528         (InTransit): new property, used to catch recursive definitions. 
17529
17530         * interface.cs: Implement `Define'. 
17531
17532         * modifiers.cs: Map Modifiers.constants to
17533         System.Reflection.TypeAttribute flags.
17534
17535         * class.cs: Keep track of types and user-defined types.
17536         (BuilderInit): New method for creating an assembly
17537         (ResolveType): New function to launch the resolution process, only
17538         used by interfaces for now.
17539
17540         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17541         that are inserted into the name space. 
17542
17543 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17544
17545         * ARGH.  I have screwed up my tree so many times due to the use of
17546         rsync rather than using CVS.  Going to fix this at once. 
17547
17548         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17549         load types.
17550
17551 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17552
17553         * Experiment successful: Use System.Type rather that our own
17554         version of Type.  
17555
17556 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17557
17558         * cs-parser.jay: Removed nsAliases from here.
17559
17560         Use new namespaces, handle `using XXX;' 
17561
17562         * namespace.cs: Reimplemented namespace handling, use a recursive
17563         definition of the class.  Now we can keep track of using clauses
17564         and catch invalid using clauses.
17565
17566 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17567
17568         * gen-treedump.cs: Adapted for all the renaming.
17569
17570         * expression.cs (Expression): this class now has a Type property
17571         which returns an expression Type.
17572
17573         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17574         `Type', as this has a different meaning now in the base
17575
17576 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17577
17578         * interface.cs, class.cs: Removed from all the sources the
17579         references to signature computation, as we can not do method
17580         signature computation during the parsing time, as we are not
17581         trying to solve at that point distinguishing:
17582
17583         class X {
17584                 void a (Blah x) {}
17585                 void a (NS.Blah x) {}
17586         }
17587
17588         Which depending on the context might be valid or not, as we do not
17589         know if Blah is the same thing as NS.Blah at that point.
17590
17591         * Redid everything so the code uses TypeRefs now instead of
17592         Types.  TypeRefs are just temporary type placeholders, that need
17593         to be resolved.  They initially have a pointer to a string and the
17594         current scope in which they are used.  This is used later by the
17595         compiler to resolve the reference to an actual Type. 
17596
17597         * DeclSpace is no longer a CIR.Type, and neither are
17598         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17599         are all DeclSpaces, but no Types. 
17600
17601         * type.cs (TypeRefManager): This implements the TypeRef manager,
17602         which keeps track of all the types that need to be resolved after
17603         the parsing has finished. 
17604
17605 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17606
17607         * ARGH.  We are going to have to store `foreach' as a class rather
17608         than resolving it, as we need to verify error 1579 after name
17609         resolution.   *OR* we could keep a flag that says `This request to
17610         IEnumerator comes from a foreach statement' which we can then use
17611         to generate the error.
17612
17613 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17614
17615         * class.cs (TypeContainer.AddMethod): we now add methods to the
17616         MethodGroup instead of the method hashtable.  
17617
17618         * expression.cs: Add MethodGroup abstraction, which gets us one
17619         step closer to the specification in the way we handle method
17620         declarations.  
17621
17622         * cs-parser.jay (primary_expression): qualified_identifier now
17623         tried to match up an identifier to a local variable reference or
17624         to a parameter reference.
17625
17626         current_local_parameters is now a parser global variable that
17627         points to the current parameters for the block, used during name
17628         lookup.
17629
17630         (property_declaration): Now creates an implicit `value' argument to
17631         the set accessor.
17632
17633 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17634
17635         * parameter.cs: Do not use `param' arguments as part of the
17636         signature, per the spec.
17637
17638 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17639
17640         * decl.cs: Base class for classes, structs and interfaces.  This
17641         is the "Declaration Space" 
17642
17643         * cs-parser.jay: Use CheckDef for checking declaration errors
17644         instead of having one on each function.
17645
17646         * class.cs: Factor out some code for handling error handling in
17647         accordance to the "Declarations" section in the "Basic Concepts"
17648         chapter in the ECMA C# spec.
17649
17650         * interface.cs: Make all interface member classes derive from
17651         InterfaceMemberBase.
17652
17653 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17654
17655         * Many things: all interfaces are parsed and generated in
17656         gen-treedump.  Support for member variables, constructors,
17657         destructors, properties, constants is there.
17658
17659         Beginning of the IL backend, but very little done, just there for
17660         testing purposes. 
17661
17662 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17663
17664         * cs-parser.jay: Fix labeled statement.
17665
17666         * cs-tokenizer.cs (escape): Escape " and ' always.
17667         ref_line, ref_name: keep track of the line/filename as instructed
17668         by #line by the compiler.
17669         Parse #line.
17670
17671 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17672
17673         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17674         to match the values in System.CodeDOM.
17675
17676         Divid renamed to Divide.
17677
17678         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17679         statements. 
17680         (Statements.set): remove.
17681
17682         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17683         statements. 
17684
17685         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17686         falseStatements always have valid values. 
17687
17688         * cs-parser.jay: Use System.CodeDOM now.
17689