Reflect latest API changes.
[mono.git] / mcs / mcs / ChangeLog
1 2004-06-08  Martin Baulig  <martin@ximian.com>
2
3         * expression.cs (Invocation.EmitCall): Enable varargs methods.
4
5 2004-06-08  Martin Baulig  <martin@ximian.com>
6
7         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
8
9 2004-06-07  Martin Baulig  <martin@ximian.com>
10
11         Added support for varargs methods.
12
13         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
14         keyword.
15
16         * cs-parser.jay: Added support for `__arglist'.
17
18         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
19
20         * expression.cs (Argument.AType): Added `ArgList'.
21         (Invocation): Added support for varargs methods.
22         (ArglistAccess): New public class.
23         (Arglist): New public class.
24
25         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
26
27         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
28         a method's top-level block if the method has varargs.
29
30         * support.cs (ReflectionParameters, InternalParameters): Added
31         support for varargs methods.    
32
33 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
34
35         * class.cs: Provide location in indexer error report.
36
37         * driver.cs: Use standard names.
38
39         * namespace.cs: Catch the use of using after a namespace has been
40         declared also on using aliases.
41
42 2004-06-04  Martin Baulig  <martin@ximian.com>
43
44         Merged latest changes into gmcs.  Please keep this comment in
45         here, it makes it easier for me to see what changed in MCS since
46         the last time I merged.
47
48 2004-06-03  Raja R Harinath  <rharinath@novell.com>
49
50         Bug #50820.
51         * typemanager.cs (closure_private_ok, closure_invocation_type)
52         (closure_qualifier_type, closure_invocation_assembly)
53         (FilterWithClosure): Move to ...
54         (Closure): New internal nested class.
55         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
56         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
57         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
58         (MemberLookup, MemberLookupFailed): Use it.
59         * expression.cs (New.DoResolve): Treat the lookup for the
60         constructor as being qualified by the 'new'ed type.
61         (Indexers.GetIndexersForTypeOrInterface): Update.
62
63 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
64
65         * attribute.cs
66         (GetConditionalAttributeValue): New method. Returns
67         condition of ConditionalAttribute.
68         (SearchMulti): New method.  Returns all attributes of type 't'.
69         Use it when attribute is AllowMultiple = true.
70         (IsConditionalMethodExcluded): New method.
71
72         * class.cs
73         (Method.IsExcluded): Implemented. Returns true if method has conditional
74         attribute and the conditions is not defined (method is excluded).
75         (IMethodData): Extended interface for ConditionalAttribute support.
76         (PropertyMethod.IsExcluded): Implemented.
77
78         * decl.cs
79         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
80
81         * expression.cs
82         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
83         on the method.
84
85 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
86
87         * expression.cs (ArrayCreationExpression): Make this just an
88         `expression'. It can't be a statement, so the code here was
89         dead.
90
91 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
92
93         Fixed #59072
94         * typemanager.cs (GetFullNameSignature): New method for
95         MethodBase types.
96
97 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
98
99         Fixed #56452
100         * class.cs (MemberBase.GetSignatureForError): New virtual method.
101         Use this method when MethodBuilder is null.
102         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
103         Added test for error CS0626 (MONO reports error for this situation).
104         (IMethodData.GetSignatureForError): Extended interface.
105
106 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
107
108         * attribute.cs
109         (AttributeTester.GetObsoleteAttribute): Returns instance of
110         ObsoleteAttribute when type is obsolete.
111
112         * class.cs
113         (TypeContainer.VerifyObsoleteAttribute): Override.
114         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
115         (MethodCode.VerifyObsoleteAttribute): Override.
116         (MemberBase.VerifyObsoleteAttribute): Override.
117
118         * decl.cs
119         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
120         and report proper error.
121
122         *delegate.cs
123         Delegate.VerifyObsoleteAttribute): Override.
124
125         * ecore.cs
126         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
127         and report proper error.
128         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
129
130         * enum.cs
131         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
132         and enum member.
133
134         * expression.cs
135         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
136         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
137         Added test for ObsoleteAttribute.
138
139         * statement.cs
140         (Catch): Derived from Statement.
141
142 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
143  
144         Fixed bug #59071 & cs0160.cs
145  
146         * statement.cs (Try.Resolve): Check here whether order of catch
147         clauses matches their dependencies.
148
149 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
150
151         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
152         caused a regression: #59343.  Referencing nested classes from an
153         assembly stopped working.
154
155 2004-05-31  Martin Baulig  <martin@ximian.com>
156
157         MCS is now frozen for beta 2.
158
159 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
160
161         * convert.cs: add a trivial cache for overload operator resolution.
162
163 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
164
165         * decl.cs: If possible, use lookuptypedirect here. We can only do
166         this if there is no `.' after the namespace. Avoids using
167         LookupType, which does lots of slow processing.
168         (FindNestedType) New method, does what it says :-).
169         * namespace.cs: use LookupTypeDirect.
170         * rootcontext.cs: use membercache, if possible.
171         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
172
173 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
174
175         * expression.cs:
176         According to the spec, 
177
178         In a member access of the form E.I, if E is a single identifier,
179         and if the meaning of E as a simple-name (§7.5.2) is a constant,
180         field, property, localvariable, or parameter with the same type as
181         the meaning of E as a type-name (§3.8), then both possible
182         meanings of E are permitted.
183
184         We did not check that E as a simple-name had the same type as E as
185         a type name.
186
187         This trivial check gives us 5-7% on bootstrap time.
188
189 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
190
191         * expression.cs (Invocation.OverloadResolve): Avoid the
192         use of hashtables and boxing here by allocating on demand.
193
194 2004-05-30  Martin Baulig  <martin@ximian.com>
195
196         * rootcontext.cs (RootContext.LookupType): Don't cache things if
197         we're doing a silent lookup.  Don't try to lookup nested types in
198         TypeManager.object_type (thanks to Ben Maurer).
199
200 2004-05-30  Martin Baulig  <martin@ximian.com>
201
202         Committing a patch from Ben Maurer.
203
204         * rootcontext.cs (RootContext.LookupType): Cache negative results.
205
206 2004-05-29  Martin Baulig  <martin@ximian.com>
207
208         * class.cs (IMethodData.ShouldIgnore): New method.
209
210         * typemanager.cs (TypeManager.MethodFlags): Don't take a
211         `Location' argument, we don't need it anywhere.  Use
212         `IMethodData.ShouldIgnore ()' instead of
213         `MethodData.GetMethodFlags ()'.
214         (TypeManager.AddMethod): Removed.
215         (TypeManager.AddMethod2): Renamed to AddMethod.
216
217 2004-05-29  Martin Baulig  <martin@ximian.com>
218
219         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
220
221         * convert.cs (Convert.ImplicitReferenceConversion): If we're
222         converting from a class type S to an interface type and we already
223         have an object on the stack, don't box it again.  Fixes #52578.
224
225 2004-05-29  Martin Baulig  <martin@ximian.com>
226
227         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
228         Added support for `params' parameters.  Fixes #59267.
229
230 2004-05-29  Martin Baulig  <martin@ximian.com>
231
232         * literal.cs (NullPointer): Provide a private .ctor which sets
233         `type' to TypeManager.object_type.  Fixes #59048.
234
235 2004-05-29  Martin Baulig  <martin@ximian.com>
236
237         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
238         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
239
240         * ecore.cs (EventExpr.instance_expr): Make the field private.
241
242 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
243
244         Fixed bug #50080 & cs0214-2.cs
245         * expression.cs (Cast.DoResolve): Check unsafe context here.
246         
247         * statement.cs (Resolve.DoResolve): Likewise.
248
249 2004-05-26  Martin Baulig  <martin@ximian.com>
250
251         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
252
253         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
254         (RootContext.LookupType): Pass down the `silent' flag.
255
256 2004-05-25  Martin Baulig  <martin@ximian.com>
257
258         * expression.cs
259         (MethodGroupExpr.IdenticalTypeName): New public property.
260         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
261         expression actually refers to a type.
262
263 2004-05-25  Martin Baulig  <martin@ximian.com>
264
265         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
266         for #56176 and made it actually work.
267
268 2004-05-25  Martin Baulig  <martin@ximian.com>
269
270         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
271         (FieldExpr, PropertyExpr): Override and implement
272         CacheTemporaries.  Fixes #52279.
273
274 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
275
276         * location.cs: In the new compiler listing a file twice is a
277         warning, not an error.
278
279 2004-05-24  Martin Baulig  <martin@ximian.com>
280
281         * enum.cs (Enum.DefineType): For the `BaseType' to be a
282         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
283
284 2004-05-24  Martin Baulig  <martin@ximian.com>
285
286         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
287         walking the `using' list.  Fixes #53921.
288
289 2004-05-24  Martin Baulig  <martin@ximian.com>
290
291         * const.cs (Const.LookupConstantValue): Added support for
292         EmptyCast's; fixes #55251.
293
294 2004-05-24  Martin Baulig  <martin@ximian.com>
295
296         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
297         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
298         which does the CS0135 check.  The reason is that we first need to
299         check whether the variable actually exists.
300
301 2004-05-24  Martin Baulig  <martin@ximian.com>
302
303         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
304         than RootContext.LookupType() to find the explicit interface
305         type.  Fixes #58584.
306
307 2004-05-24  Raja R Harinath  <rharinath@novell.com>
308
309         * Makefile: Simplify.  Use executable.make.
310         * mcs.exe.sources: New file.  List of sources of mcs.exe.
311
312 2004-05-24  Anders Carlsson  <andersca@gnome.org>
313
314         * decl.cs:
315         * enum.cs:
316         Use the invariant culture when doing String.Compare for CLS case
317         sensitivity.
318         
319 2004-05-23  Martin Baulig  <martin@ximian.com>
320
321         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
322         don't have any dots.  Fixes #52622, added cs0246-8.cs.
323
324         * namespace.cs (NamespaceEntry.Lookup): Likewise.
325         
326 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
327
328         * class.cs (MemberBase.Define): Reuse MemberType member for 
329         resolved type. Other methods can use it too.
330
331 2004-05-23  Martin Baulig  <martin@ximian.com>
332
333         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
334         the variable also exists in the current block (otherwise, we need
335         to report a CS0103).  Fixes #58670.
336
337 2004-05-23  Martin Baulig  <martin@ximian.com>
338
339         * flowanalysis.cs (Reachability.Reachable): Compute this
340         on-the-fly rather than storing it as a field.
341
342 2004-05-23  Martin Baulig  <martin@ximian.com>
343
344         * flowanalysis.cs (Reachability.And): Manually compute the
345         resulting `barrier' from the reachability.      
346        
347 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
348
349         Fix bug #57835
350         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
351         instance of ObsoleteAttribute when symbol is obsolete.
352
353         * class.cs
354         (IMethodData): Extended interface for ObsoleteAttribute support.
355
356 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
357
358         * attribute.cs: Fix bug #55970
359
360 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
361
362         Fix bug #52705
363         * attribute.cs
364         (GetObsoleteAttribute): New method. Creates the instance of
365         ObsoleteAttribute.
366         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
367         ObsoleteAttribute when member is obsolete.
368         (AttributeTester.Report_ObsoleteMessage): Common method for
369         Obsolete error/warning reporting.
370
371         * class.cs
372         (TypeContainer.base_classs_type): New member for storing parent type.
373
374         * decl.cs
375         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
376         for this MemberCore.
377
378 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
379
380         * attribute.cs, const.cs: Fix bug #58590
381
382 2004-05-21  Martin Baulig  <martin@ximian.com>
383
384         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
385         out parameters if the end of the method is unreachable.  Fixes
386         #58098. 
387
388 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
389
390         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
391         Hari was right, why extra method.
392
393 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
394
395         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
396
397 2004-05-20  Martin Baulig  <martin@ximian.com>
398
399         Merged this back from gmcs to keep the differences to a minumum.
400
401         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
402         instead of a Declspace.
403         (Attribute.ResolveType): Likewise.
404         (Attributes.Search): Likewise.
405         (Attributes.Contains): Likewise.
406         (Attributes.GetClsCompliantAttribute): Likewise.
407
408         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
409         argument.
410         (MethodData.ApplyAttributes): Take an EmitContext instead of a
411         DeclSpace.
412
413 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
414
415         Fix bug #58688 (MCS does not report error when the same attribute
416         is assigned twice)
417
418         * attribute.cs (Attribute.Emit): Distinction between null and default.
419
420 2004-05-19  Raja R Harinath  <rharinath@novell.com>
421
422         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
423         of a top-level attribute without an attribute target.
424         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
425         Make non-static.
426         (Attribute.Conditional_GetConditionName), 
427         (Attribute.Obsolete_GetObsoleteMessage): Update.
428         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
429         part of ScanForIndexerName.
430         (Attribute.CanIgnoreInvalidAttribute): New function.
431         (Attribute.ScanForIndexerName): Move to ...
432         (Attributes.ScanForIndexerName): ... here.
433         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
434         (Attributes.Search): New internal variant that can choose not to
435         complain if types aren't resolved.  The original signature now
436         complains.
437         (Attributes.GetClsCompliantAttribute): Use internal variant, with
438         complaints suppressed.
439         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
440         only if it not useful.
441         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
442         top-level for attributes that are shared between the assembly
443         and a top-level class.
444         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
445         * class.cs: Update to reflect changes.
446         (DefineIndexers): Fuse loops.
447         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
448         a couple more variants of attribute names.
449
450 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
451
452         Fix bug #52585 (Implemented explicit attribute declaration)
453
454         * attribute.cs:
455         (Attributable.ValidAttributeTargets): New abstract method. It gets
456         list of valid attribute targets for explicit target declaration.
457         (Attribute.Target): It holds target itself.
458         (AttributeSection): Removed.
459         (Attribute.CheckTargets): New method. It checks whether attribute
460         target is valid for the current element.
461
462         * class.cs:
463         (EventProperty): New class. For events that are declared like
464         property (with add and remove accessors).
465         (EventField): New class. For events that are declared like field.
466         class.cs
467
468         * cs-parser.jay: Implemented explicit attribute target declaration.
469
470         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
471         Override ValidAttributeTargets.
472
473         * parameter.cs:
474         (ReturnParameter): Class for applying custom attributes on 
475         the return type.
476         (ParameterAtribute): New class. Class for applying custom
477         attributes on the parameter type.
478
479 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
480
481         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
482         definitions. 
483
484         (Method): Allow UNSAFE here.
485
486         * modifiers.cs: Support unsafe reporting.
487
488 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
489
490         * decl.cs: Fix bug #58478.
491
492 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
493
494         * statement.cs: When checking for unreachable code on an EmptyStatement,
495         set the location. Fixes bug #58488.
496
497 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
498
499         * driver.cs: Add -pkg handling.
500
501         From Gonzalo: UseShelLExecute=false
502
503 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
504
505         * attribute.cs:
506         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
507         for attribute.
508         (Attribute.IsClsCompliaceRequired): Moved to base for better
509         accesibility.
510         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
511         when attribute is AttributeUsageAttribute.
512         (Attribute.GetValidTargets): Simplified.
513         (Attribute.GetAttributeUsage): New method returns AttributeUsage
514         attribute for this type.
515         (Attribute.ApplyAttributes): Method renamed to Emit and make
516         non-static.
517         (GlobalAttributeSection): New class for special handling of global
518         attributes (assembly, module).
519         (AttributeSection.Emit): New method.
520
521         * class.cs: Implemented Attributable abstract methods.
522         (MethodCore.LabelParameters): Moved to Parameter class.
523         (Accessor): Is back simple class.
524         (PropertyMethod): Implemented Attributable abstract class.
525         (DelegateMethod): Implemented Attributable abstract class.
526         (Event): New constructor for disctintion between normal Event
527         and Event with accessors.
528
529         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
530
531         * codegen.cs, const.cs, decl.cs, delegate.cs:
532         (CommonAssemblyModulClass): Implemented Attributable abstract class
533         and simplified.
534
535         * enum.cs: Implement IAttributeSupport interface.
536         (EnumMember): New class for emum members. Implemented Attributable
537         abstract class
538
539         * parameter.cs:
540         (ParameterBase): Is abstract.
541         (ReturnParameter): New class for easier [return:] attribute handling.
542
543         * typemanager.cs: Removed builder_to_attr.
544
545 2004-05-11  Raja R Harinath  <rharinath@novell.com>
546
547         Fix bug #57151.
548         * attribute.cs (Attribute.GetPositionalValue): New function.
549         * class.cs (TypeContainer.VerifyMembers): New function.
550         (TypeContainer.Emit): Use it.
551         (ClassOrStruct): New base class for Class and Struct.
552         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
553         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
554         class.
555         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
556         then each non-static field should have a FieldOffset attribute.
557         Otherwise, none of the fields should have a FieldOffset attribute.
558         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
559         and FieldOffset attributes.
560         * typemanager.cs (TypeManager.struct_layout_attribute_type)
561         (TypeManager.field_offset_attribute_type): New core types.
562         (TypeManager.InitCoreTypes): Initialize them.
563
564 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
565
566         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
567         Return correct type.
568         From bug #58270.
569
570 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
571
572         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
573         be implicitly converted to ulong.
574         
575         * expression.cs: The logic for allowing operator &, | and ^ worked
576         was wrong, it worked before because we did not report an error in
577         an else branch.  Fixes 57895.
578
579         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
580         allow volatile fields to be reference types.
581
582 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
583
584         * driver.cs: Add support for /debug-
585
586 2004-05-07  Raja R Harinath  <rharinath@novell.com>
587
588         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
589         Add a 'complain' parameter to silence errors.
590         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
591         silently overlooked type-resolutions.
592         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
593         to reflect changes.
594         (Attributes.Search): New function.
595         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
596         (Attributes.GetAttributeFullName): Remove hack.
597         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
598         Update to reflect changes.
599         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
600         Use Attributes.Search instead of nested loops.
601
602 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
603
604         * decl.cs:
605         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
606         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
607         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
608
609         * report.cs: (Report.Warning): Renamed to Warning_T because of
610         parameter collision.
611
612 2004-05-05  Raja R Harinath  <rharinath@novell.com>
613
614         * expression.cs (MemberAccess.ResolveMemberAccess):
615         Exit with non-zero status after Report.Error.
616         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
617         Likewise.
618         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
619
620 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
621
622         * support.cs: Don't hang when the file is empty.
623
624 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
625
626         * support.cs: In SeekableStreamReader, compute the preamble size of the
627           underlying stream. Position changes should take into account that initial
628           count of bytes.
629
630 2004-05-03  Todd Berman  <tberman@sevenl.net>
631
632         * driver.cs: remove unused GetSysVersion function.
633
634 2004-05-03  Todd Berman  <tberman@sevenl.net>
635
636         * driver.cs: Remove the hack from saturday, as well as the hack
637         from jackson (LoadAssemblyFromGac), also adds the CWD to the
638         link_paths to get that bit proper.
639
640 2004-05-01  Todd Berman  <tberman@sevenl.net>
641
642         * driver.cs: Try a LoadFrom before a Load, this checks the current
643         path. This is currently a bug in mono that is be fixed, however, this
644         provides a workaround for now. This will be removed when the bug
645         is fixed.
646
647 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
648
649         * CryptoConvert.cs: Updated to latest version. Fix issue with 
650         incomplete key pairs (#57941).
651
652 2004-05-01  Todd Berman  <tberman@sevenl.net>
653
654         * driver.cs: Remove '.' from path_chars, now System.* loads properly
655         from the GAC
656
657 2004-04-30  Jackson Harper  <jackson@ximian.com>
658
659         * codegen.cs: Open keys readonly.
660         
661 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
662
663         * typemanager.cs: don't report cyclic struct layout when a struct
664         contains 2 or more fields of the same type. Failed for Pango.AttrShape
665         which has 2 Pango.Rectangle fields.
666
667 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
668
669         * expression.cs: Handle IntPtr comparisons with IL code
670         rather than a method call.
671
672 2004-04-29  Martin Baulig  <martin@ximian.com>
673
674         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
675         the list of PropertyInfo's in class hierarchy and find the
676         accessor.  Fixes #56013.
677
678 2004-04-29  Martin Baulig  <martin@ximian.com>
679
680         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
681
682 2004-04-29  Martin Baulig  <martin@ximian.com>
683
684         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
685
686         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
687
688 2004-04-29  Martin Baulig  <martin@ximian.com>
689
690         * class.cs (ConstructorInitializer.Resolve): Check whether the
691         parent .ctor is accessible.  Fixes #52146.
692
693 2004-04-29  Martin Baulig  <martin@ximian.com>
694
695         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
696
697         * statement.cs (Using.EmitLocalVariableDecls): Use
698         TypeManager.idisposable_type, not typeof (IDisposable).
699         (Foreach.EmitCollectionForeach): Added support for valuetypes.
700
701 2004-04-29  Martin Baulig  <martin@ximian.com>
702
703         * class.cs (Event.Define): Don't emit the field and don't set
704         RTSpecialName and SpecialName for events on interfaces.  Fixes
705         #57703. 
706
707 2004-04-29  Raja R Harinath  <rharinath@novell.com>
708
709         Refactor Attribute.ApplyAttributes.
710         * attribute.cs (Attributable): New base class for objects that can
711         have Attributes applied on them.
712         (Attribute): Make AttributeUsage fields public.
713         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
714         (Attribute.IsInternalCall): New property.
715         (Attribute.UsageAttr): Convert to a public read-only property.
716         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
717         (Attribute.ResolveType, Attribute.Resolve)
718         (Attribute.ScanForIndexerName): Update to reflect changes.
719         (Attribute.CheckAttributeTarget): Re-format.
720         (Attribute.ApplyAttributes): Refactor, to various
721         Attributable.ApplyAttributeBuilder methods.
722         * decl.cs (MemberCore): Make Attributable.
723         * class.cs (Accessor): Make Attributable.
724         (MethodData.ApplyAttributes): Use proper attribute types, not
725         attribute names.
726         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
727         (TypeContainer.ApplyAttributeBuilder)
728         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
729         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
730         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
731         (Operator.ApplyAttributeBuilder): New factored-out methods.
732         * const.cs (Const.ApplyAttributeBuilder): Likewise.
733         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
734         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
735         * parameter.cs (ParameterBase): New Attributable base class
736         that can also represent Return types.
737         (Parameter): Update to the changes.
738
739 2004-04-29  Jackson Harper  <jackson@ximian.com>
740
741         * driver.cs: Prefer the corlib system version when looking for
742         assemblies in the GAC. This is still a hack, but its a better hack
743         now.
744         
745 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
746
747         * decl.cs, enum.cs: Improved error 3005 reporting.
748   
749         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
750         (related_symbols): New private member for list of symbols
751         related to reported error/warning.
752         
753         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
754
755 2004-04-29  Martin Baulig  <martin@ximian.com>
756
757         * ecore.cs (Expression.Constantify): If we're an enum and
758         TypeManager.TypeToCoreType() doesn't give us another type, use
759         t.UnderlyingSystemType.  Fixes #56178.  
760
761 2004-04-29  Martin Baulig  <martin@ximian.com>
762
763         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
764         interfaces and for each interface, only add members directly
765         declared in that interface.  Fixes #53255.
766
767 2004-04-28  Martin Baulig  <martin@ximian.com>
768
769         * expression.cs (ConditionalLogicalOperator): Use a temporary
770         variable for `left' to avoid that we evaluate it more than once;
771         bug #52588.
772
773 2004-04-28  Martin Baulig  <martin@ximian.com>
774
775         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
776         `void[]' (CS1547).
777
778 2004-04-28  Martin Baulig  <martin@ximian.com>
779
780         * statement.cs (LocalInfo.Resolve): Check whether the type is not
781         void (CS1547).
782
783         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
784         whether the type is not void (CS1547).
785
786 2004-04-28  Martin Baulig  <martin@ximian.com>
787
788         * expression.cs (Unary.DoResolveLValue): Override this and report
789         CS0131 for anything but Operator.Indirection.
790
791 2004-04-28  Martin Baulig  <martin@ximian.com>
792
793         Committing a patch from Ben Maurer; see bug #50820.
794
795         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
796         check for classes.
797
798         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
799         classes.        
800
801 2004-04-28  Martin Baulig  <martin@ximian.com>
802
803         Committing a patch from Ben Maurer; see bug #50820.
804
805         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
806         check for classes.
807
808         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
809         classes.        
810
811 2004-04-28  Martin Baulig  <martin@ximian.com>
812
813         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
814         (Block.AddLabel): Call DoLookupLabel() to only search in the
815         current block.
816
817 2004-04-28  Martin Baulig  <martin@ximian.com>
818
819         * cfold.cs (ConstantFold.BinaryFold): Added special support for
820         comparing StringConstants and NullLiterals in Equality and Inequality.
821
822 2004-04-28  Jackson Harper  <jackson@ximian.com>
823
824         * driver.cs: Attempt to load referenced assemblies from the
825         GAC. This is the quick and dirty version of this method that
826         doesnt take into account versions and just takes the first
827         canidate found. Will be good enough for now as we will not have more
828         then one version installed into the GAC until I update this method.
829
830 2004-04-28  Martin Baulig  <martin@ximian.com>
831
832         * typemanager.cs (TypeManager.CheckStructCycles): New public
833         static method to check for cycles in the struct layout.
834
835         * rootcontext.cs (RootContext.PopulateTypes): Call
836         TypeManager.CheckStructCycles() for each TypeContainer.
837         [Note: We only need to visit each type once.]
838
839 2004-04-28  Martin Baulig  <martin@ximian.com>
840
841         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
842
843         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
844         success and added `out object value'.  Use a `bool resolved' field
845         to check whether we've already been called rather than
846         `ConstantValue != null' since this breaks for NullLiterals.
847
848 2004-04-28  Raja R Harinath  <rharinath@novell.com>
849
850         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
851         setting of this flag, since the 'set' method may be non-public.
852
853 2004-04-28  Raja R Harinath  <rharinath@novell.com>
854
855         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
856         check on current_vector.Block.
857
858 2004-04-27  Martin Baulig  <martin@ximian.com>
859
860         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
861         a field initializer.  Fixes #56459.
862
863 2004-04-27  Martin Baulig  <martin@ximian.com>
864
865         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
866         we're not attempting to use an indexer.  Fixes #52154.
867
868 2004-04-27  Martin Baulig  <martin@ximian.com>
869
870         * statement.cs (Return): Don't create a return label if we don't
871         need it; reverts my change from January 20th.  Thanks to Ben
872         Maurer for this.
873
874 2004-04-27  Martin Baulig  <martin@ximian.com>
875
876         According to the spec, `goto' can only leave a nested scope, but
877         never enter it.
878
879         * statement.cs (Block.LookupLabel): Only lookup in the current
880         block, don't recurse into parent or child blocks.
881         (Block.AddLabel): Check in parent and child blocks, report
882         CS0140/CS0158 if we find a duplicate.
883         (Block): Removed this indexer for label lookups.
884         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
885         this already does the error reporting for us.
886
887         * flowanalysis.cs
888         (FlowBranching.UsageVector.Block): New public variable; may be null.
889         (FlowBranching.CreateSibling): Added `Block' argument.
890         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
891         label for the target of a `goto' and check whether we're not
892         leaving a `finally'.
893
894 2004-04-27  Martin Baulig  <martin@ximian.com>
895
896         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
897         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
898         just for returns).
899
900 2004-04-27  Martin Baulig  <martin@ximian.com>
901
902         * statement.cs (Block.AddLabel): Also check for implicit blocks
903         and added a CS0158 check.
904
905 2004-04-27  Martin Baulig  <martin@ximian.com>
906
907         * flowanalysis.cs (FlowBranchingLoop): New class.
908         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
909         UsageVector's instead of an ArrayList.
910         (FlowBranching.Label): Likewise.
911         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
912         (FlowBranching.AddBreakVector): New method.
913
914 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
915
916         * attribute.cs: Small regression fix: only convert the type if we
917         the type is different, fixes System.Drawing build.
918
919 2004-04-27  Martin Baulig  <martin@ximian.com>
920
921         * attribute.cs (Attribute.Resolve): If we have a constant value
922         for a named field or property, implicity convert it to the correct
923         type.
924
925 2004-04-27  Raja R Harinath  <rharinath@novell.com>
926
927         * statement.cs (Block.Block): Implicit blocks share
928         'child_variable_names' fields with parent blocks.
929         (Block.AddChildVariableNames): Remove.
930         (Block.AddVariable): Mark variable as "used by a child block" in
931         every surrounding block.
932         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
933         been used in a child block, complain about violation of "Invariant
934         meaning in blocks" rule.
935         * cs-parser.jay (declare_local_variables): Don't use
936         AddChildVariableNames.
937         (foreach_statement): Don't create an implicit block: 'foreach'
938         introduces a scope.
939
940 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
941
942         * convert.cs (ImplicitNumericConversion): 0 is also positive when
943         converting from 0L to ulong.  Fixes 57522.
944
945 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
946
947         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
948         derived class hides via 'new' keyword field from base class (test-242.cs).
949         TODO: Handle this in the more general way.
950         
951         * class.cs (CheckBase): Ditto.
952
953 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
954
955         * decl.cs (caching_flags): New member for storing cached values
956         as bit flags.
957         (MemberCore.Flags): New enum where bit flags for caching_flags
958         are defined.
959         (MemberCore.cls_compliance): Moved to caching_flags.
960         (DeclSpace.Created): Moved to caching_flags.
961
962         * class.cs: Use caching_flags instead of DeclSpace.Created
963         
964 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
965
966         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
967         if we are only a derived class, not a nested class.
968
969         * typemanager.cs: Same as above, but do this at the MemberLookup
970         level (used by field and methods, properties are handled in
971         PropertyExpr).   Allow for the qualified access if we are a nested
972         method. 
973
974 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
975
976         * class.cs: Refactoring.
977         (IMethodData): New inteface; Holds links to parent members
978         to avoid member duplication (reduced memory allocation).
979         (Method): Implemented IMethodData interface.
980         (PropertyBase): New inner classes for get/set methods.
981         (PropertyBase.PropertyMethod): Implemented IMethodData interface
982         (Event): New inner classes for add/remove methods.
983         (Event.DelegateMethod): Implemented IMethodData interface.
984
985         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
986         EmitContext (related to class.cs refactoring).
987
988 2004-04-21  Raja R Harinath  <rharinath@novell.com>
989
990         * delegate.cs (Delegate.VerifyApplicability): If the number of
991         arguments are the same as the number of parameters, first try to
992         verify applicability ignoring  any 'params' modifier on the last
993         parameter.
994         Fixes #56442.
995
996 2004-04-16  Raja R Harinath  <rharinath@novell.com>
997
998         * class.cs (TypeContainer.AddIndexer): Use
999         'ExplicitInterfaceName' to determine if interface name was
1000         explicitly specified.  'InterfaceType' is not initialized at this time.
1001         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
1002         Indexers array is already in the required order.  Initialize
1003         'IndexerName' only if there are normal indexers.
1004         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
1005         (TypeContainer.Emit): Emit DefaultMember attribute only if
1006         IndexerName is initialized.
1007         Fixes #56300.
1008
1009 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
1010
1011         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
1012         Fixes #57007
1013
1014 2004-04-15  Raja R Harinath  <rharinath@novell.com>
1015
1016         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
1017         attributes.
1018         Fix for #56456.
1019
1020         * attribute.cs (Attribute.Resolve): Check for duplicate named
1021         attributes.
1022         Fix for #56463.
1023
1024 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
1025
1026         * iterators.cs (MarkYield): track whether we are in an exception,
1027         and generate code accordingly.  Use a temporary value to store the
1028         result for our state.
1029
1030         I had ignored a bit the interaction of try/catch with iterators
1031         since their behavior was not entirely obvious, but now it is
1032         possible to verify that our behavior is the same as MS .NET 2.0
1033
1034         Fixes 54814
1035
1036 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
1037
1038         * iterators.cs: Avoid creating temporaries if there is no work to
1039         do. 
1040
1041         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
1042         Enumerations, use TypeManager.EnumToUnderlying and call
1043         recursively. 
1044
1045         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
1046         bug #57013
1047
1048         (This.Emit): Use EmitContext.EmitThis to emit our
1049         instance variable.
1050
1051         (This.EmitAssign): Ditto.
1052
1053         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
1054         codepaths, we will move all the functionality into
1055         Mono.CSharp.This 
1056
1057         (FieldExpr.EmitAssign): Ditto.
1058
1059         This fixes several hidden bugs that I uncovered while doing a code
1060         review of this today.
1061
1062         * codegen.cs (EmitThis): reworked so the semantics are more clear
1063         and also support value types "this" instances.
1064
1065         * iterators.cs: Changed so that for iterators in value types, we
1066         do not pass the value type as a parameter.  
1067
1068         Initialization of the enumerator helpers is now done in the caller
1069         instead of passing the parameters to the constructors and having
1070         the constructor set the fields.
1071
1072         The fields have now `assembly' visibility instead of private.
1073
1074 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
1075
1076         * expression.cs (Argument.Resolve): Check if fields passed as ref
1077         or out are contained in a MarshalByRefObject.
1078
1079         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
1080         another compiler type.
1081
1082 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1083
1084         * class.cs (Indexer.Define): use the new name checking method.
1085         Also, return false on an error.
1086         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
1087         (is_identifier_[start/part]_character): make static.
1088
1089 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
1090
1091         * expression.cs (Binary.ResolveOperator): Do no append strings
1092         twice: since we can be invoked more than once (array evaluation)
1093         on the same concatenation, take care of this here.  Based on a fix
1094         from Ben (bug #56454)
1095
1096 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
1097
1098         * codegen.cs: Fix another case where CS1548 must be reported (when 
1099         delay-sign isn't specified and no private is available #56564). Fix
1100         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
1101         error when MCS is used on the MS runtime and we need to delay-sign 
1102         (which seems unsupported by AssemblyBuilder - see #56621).
1103
1104 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
1105
1106         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
1107         (TypeManager.ComputeNamespaces): Faster implementation for
1108         Microsoft runtime.
1109
1110         * compiler.csproj: Updated AssemblyName to mcs.
1111
1112 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
1113
1114         * rootcontext.cs: Add new types to the boot resolution.
1115
1116         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
1117         MulticastDelegate is not allowed.
1118
1119         * typemanager.cs: Add new types to lookup: System.TypedReference
1120         and ArgIterator.
1121
1122         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
1123         check for TypedReference or ArgIterator, they are not allowed. 
1124
1125         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
1126         makes us properly catch 1510 in some conditions (see bug 56016 for
1127         details). 
1128
1129 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
1130
1131         * CryptoConvert.cs: update from corlib version
1132         with endian fixes.
1133
1134 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
1135
1136         * class.cs (Indexer.Define): Check indexername declaration
1137
1138 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
1139
1140         * attribute.cs (IsClsCompliant): Fixed problem with handling
1141         all three states (compliant, not-compliant, undetected).
1142
1143 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
1144
1145         * attribute.cs (Attribute): Location is now public.
1146         (Resolve): Store resolved arguments (pos_values) in attribute class.
1147         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
1148         (GetClsCompliantAttributeValue): New method that gets
1149         CLSCompliantAttribute value.
1150         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
1151         if exists else null.
1152         (AttributeTester): New class for CLS-Compliant verification routines.
1153
1154         * class.cs (Emit): Add CLS-Compliant verification.
1155         (Method.GetSignatureForError): Implemented.
1156         (Constructor.GetSignatureForError): Implemented
1157         (Constructor.HasCompliantArgs): Returns if constructor has
1158         CLS-Compliant arguments.
1159         (Constructor.Emit): Override.
1160         (Construcor.IsIdentifierClsCompliant): New method; For constructors
1161         is needed to test only parameters.
1162         (FieldBase.GetSignatureForError): Implemented.
1163         (TypeContainer): New member for storing base interfaces.
1164         (TypeContainer.FindMembers): Search in base interfaces too.
1165
1166         * codegen.cs (GetClsComplianceAttribute): New method that gets
1167         assembly or module CLSCompliantAttribute value.
1168         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
1169         for assembly.
1170         (ModuleClass.Emit): Add error 3012 test.
1171
1172         * const.cs (Emit): Override and call base for CLS-Compliant tests.
1173
1174         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
1175         state for all decl types.
1176         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
1177         if CLS-Compliant tests are required.
1178         (IsClsCompliaceRequired): New method. Analyze whether code
1179         must be CLS-Compliant.
1180         (IsExposedFromAssembly): New method. Returns true when MemberCore
1181         is exposed from assembly.
1182         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
1183         value or gets cached value.
1184         (HasClsCompliantAttribute): New method. Returns true if MemberCore
1185         is explicitly marked with CLSCompliantAttribute.
1186         (IsIdentifierClsCompliant): New abstract method. This method is
1187         used to testing error 3005.
1188         (IsIdentifierAndParamClsCompliant): New method. Common helper method
1189         for identifier and parameters CLS-Compliant testing.
1190         (VerifyClsCompliance): New method. The main virtual method for
1191         CLS-Compliant verifications.
1192         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
1193         null. I don't know why is null (too many public members !).
1194         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
1195         and get value of first CLSCompliantAttribute that found.
1196
1197         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
1198         (VerifyClsCompliance): Override and add extra tests.
1199
1200         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
1201         clscheck- disable CLS-Compliant verification event if assembly is has
1202         CLSCompliantAttribute(true).
1203
1204         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
1205         ApllyAttribute is now called in emit section as in the other cases.
1206         Possible future Emit integration.
1207         (IsIdentifierClsCompliant): New override.
1208         (VerifyClsCompliance): New override.
1209         (GetEnumeratorName): Returns full enum name.
1210
1211         * parameter.cs (GetSignatureForError): Implemented.
1212
1213         * report.cs (WarningData): New struct for Warning message information.
1214         (LocationOfPreviousError): New method.
1215         (Warning): New method. Reports warning based on the warning table.
1216         (Error_T): New method. Reports error based on the error table.
1217
1218         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
1219         verifications are done here.
1220
1221         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
1222
1223         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
1224         CLSCompliantAttribute.
1225         (all_imported_types): New member holds all imported types from other
1226         assemblies.
1227         (LoadAllImportedTypes): New method fills static table with exported types
1228         from all referenced assemblies.
1229         (Modules): New property returns all assembly modules.
1230
1231 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
1232
1233         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
1234         throwing a parser error.
1235
1236         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
1237         which removes the hardcoded get_/set_ prefixes for properties, as
1238         IL allows for the properties to be named something else.  
1239
1240         Bug #56013
1241
1242         * expression.cs: Do not override operand before we know if it is
1243         non-null.  Fix 56207
1244
1245 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1246
1247         * typemanager.cs: support for pinned variables.
1248
1249 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1250
1251         * decl.cs, typemanager.cs: Avoid using an arraylist
1252         as a buffer if there is only one result set.
1253
1254 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1255
1256         * expression.cs: Make sure you cant call a static method
1257         with an instance expression, bug #56174.
1258
1259 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
1260
1261         * class.cs (IsDuplicateImplementation): Improve error reporting to
1262         flag 663 (method only differs in parameter modifier).
1263
1264         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
1265         in preprocessor directives.
1266
1267         * location.cs (LookupFile): Allow for the empty path.
1268
1269         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
1270         better approach for some of that patch, but its failing with the
1271         CharSet enumeration.  For now try/catch will do.
1272
1273         * typemanager.cs: Do not crash if a struct does not have fields.
1274         Fixes 56150.
1275
1276 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1277
1278         * expression.cs: cs0213, cant fix a fixed expression.
1279         fixes 50231.
1280
1281 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1282
1283         * cs-parser.jay: detect invalid embeded statements gracefully.
1284         bug #51113.
1285
1286 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1287
1288         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
1289         As a regex:
1290         s/
1291         the invocation type may not be a subclass of the tye of the item/
1292         The type of the item must be a subclass of the invocation item.
1293         /g
1294
1295         Fixes bug #50820.
1296
1297 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
1298
1299         * attribute.cs: Added methods to get a string and a bool from an
1300         attribute. Required to information from AssemblyKeyFileAttribute,
1301         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
1302         * codegen.cs: Modified AssemblyName creation to include support for
1303         strongnames. Catch additional exceptions to report them as CS1548.
1304         * compiler.csproj: Updated include CryptoConvert.cs.
1305         * compiler.csproj.user: Removed file - user specific configuration.
1306         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
1307         Mono.Security assembly. The original class is maintained and tested in
1308         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
1309         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
1310         like CSC 8.0 (C# v2) supports.
1311         * Makefile: Added CryptoConvert.cs to mcs sources.
1312         * rootcontext.cs: Added new options for strongnames.
1313
1314 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
1315
1316         * driver.cs: For --expect-error, report error code `2'
1317         if the program compiled with no errors, error code `1' if
1318         it compiled with an error other than the one expected.
1319
1320 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
1321
1322         * compiler.csproj: Updated for Visual Studio .NET 2003.
1323         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
1324         * compiler.sln: Updated for Visual Studio .NET 2003.
1325
1326 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
1327
1328         * expression.cs: Fix bug #47234. We basically need to apply the
1329         rule that we prefer the conversion of null to a reference type
1330         when faced with a conversion to 'object' (csc behaviour).
1331
1332 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1333
1334         * statement.cs: Shorter form for foreach, eliminates
1335         a local variable. r=Martin.
1336
1337 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1338
1339         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
1340         checks if we can use brtrue/brfalse to test for 0.
1341         * expression.cs: use the above in the test for using brtrue/brfalse.
1342         cleanup code a bit.
1343
1344 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1345
1346         * expression.cs: Rewrite string concat stuff. Benefits:
1347
1348         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
1349         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
1350         rather than a concat chain.
1351
1352         * typemanager.cs: Add lookups for more concat overloads.
1353
1354 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1355
1356         * expression.cs: Emit shorter il code for array init.
1357
1358         newarr
1359         dup
1360         // set 1
1361
1362         // set 2
1363
1364         newarr
1365         stloc.x
1366
1367         ldloc.x
1368         // set 1
1369
1370         ldloc.x
1371         // set 2
1372
1373 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
1374
1375         * statement.cs: Before, two switch blocks would be merged if the
1376         total size of the blocks (end_item - begin_item + 1) was less than
1377         two times the combined sizes of the blocks.
1378
1379         Now, it will only merge if after the merge at least half of the
1380         slots are filled.
1381
1382         fixes 55885.
1383
1384 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
1385
1386         * class.cs : csc build fix for GetMethods(). See bug #52503.
1387
1388 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
1389
1390         * expression.cs: Make sure fp comparisons work with NaN.
1391         This fixes bug #54303. Mig approved this patch a long
1392         time ago, but we were not able to test b/c the runtime
1393         had a related bug.
1394
1395 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
1396
1397         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
1398
1399 2004-03-19  Martin Baulig  <martin@ximian.com>
1400
1401         * class.cs (MemberCore.IsDuplicateImplementation): Report the
1402         error here and not in our caller.
1403
1404 2004-03-19  Martin Baulig  <martin@ximian.com>
1405
1406         * interface.cs: Completely killed this file.
1407         (Interface): We're now a TypeContainer and live in class.cs.
1408
1409         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
1410         argument; we're now also called for interfaces.
1411         (TypeContainer.DefineMembers): Allow this method being called
1412         multiple times.
1413         (TypeContainer.GetMethods): New public method; formerly known as
1414         Interface.GetMethod().  This is used by PendingImplementation.
1415         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
1416         it's now private and non-static.
1417         (Interface): Moved this here; it's now implemented similar to
1418         Class and Struct.
1419         (Method, Property, Event, Indexer): Added `bool is_interface'
1420         argument to their .ctor's.
1421         (MemberBase.IsInterface): New public field.
1422
1423         * cs-parser.jay: Create normal Method, Property, Event, Indexer
1424         instances instead of InterfaceMethod, InterfaceProperty, etc.
1425         (opt_interface_base): Removed; we now use `opt_class_base' instead.
1426         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
1427
1428 2004-03-19  Martin Baulig  <martin@ximian.com>
1429
1430         * class.cs (MethodCore.IsDuplicateImplementation): New private
1431         method which does the CS0111 checking.
1432         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
1433         Use IsDuplicateImplementation().
1434
1435 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
1436
1437         * decl.cs (FindMemberToOverride): New method to find the correct
1438         method or property to override in the base class.
1439         * class.cs
1440             - Make Method/Property use the above method to find the
1441               version in the base class.
1442             - Remove the InheritableMemberSignatureCompare as it is now
1443               dead code.
1444
1445         This patch makes large code bases much faster to compile, as it is
1446         O(n) rather than O(n^2) to do this validation.
1447
1448         Also, it fixes bug 52458 which is that nested classes are not
1449         taken into account when finding the base class member.
1450
1451         Reviewed/Approved by Martin.
1452
1453 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
1454
1455         * interface.cs: In all interface classes removed redundant
1456         member initialization.
1457
1458 2004-03-16  Martin Baulig  <martin@ximian.com>
1459
1460         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
1461
1462 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
1463
1464         * decl.cs (DefineTypeAndParents): New helper method to define a
1465         type's containers before the type itself is defined;  This is a
1466         bug exposed by the recent changes to Windows.Forms when an
1467         implemented interface was defined inside a class that had not been
1468         built yet.   
1469
1470         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
1471
1472         (Check): Loop correctly to report errors modifiers
1473         (UNSAFE was not in the loop, since it was the same as TOP).
1474
1475         * interface.cs: Every interface member now takes a ModFlags,
1476         instead of a "is_new" bool, which we set on the base MemberCore. 
1477
1478         Every place where we called "UnsafeOk" in the interface, now we
1479         call the proper member (InterfaceMethod.UnsafeOK) instead to get
1480         the unsafe settings from the member declaration instead of the
1481         container interface. 
1482
1483         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
1484
1485         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
1486         `set_indexer_name' to the pending bits (one per type).
1487
1488         We fixed a bug today that was picking the wrong method to
1489         override, since for properties the existing InterfaceMethod code
1490         basically ignored the method name.  Now we make sure that the
1491         method name is one of the valid indexer names.
1492
1493 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
1494  
1495         * support.cs (SeekableStreamReader): Keep track of stream byte
1496         positions and don't mix them with character offsets to the buffer.
1497
1498         Patch from Gustavo Giráldez
1499
1500 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
1501
1502         * interface.cs (InterfaceSetGetBase): Removed double member
1503         initialization, base class does it as well.
1504
1505 2004-03-13  Martin Baulig  <martin@ximian.com>
1506
1507         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
1508         when compiling corlib.
1509
1510 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
1511
1512         * convert.cs (ExplicitConversion): We were reporting an error on
1513         certain conversions (object_type source to a value type, when the
1514         expression was `null') before we had a chance to pass it through
1515         the user defined conversions.
1516
1517         * driver.cs: Replace / and \ in resource specifications to dots.
1518         Fixes 50752
1519
1520         * class.cs: Add check for duplicate operators.  Fixes 52477
1521
1522 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
1523
1524         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
1525         that are in the middle of the statements, not only at the end.
1526         Fixes #54987
1527
1528         * class.cs (TypeContainer.AddField): No longer set the
1529         `HaveStaticConstructor' flag, now we call it
1530         `UserDefineStaticConstructor' to diferentiate the slightly
1531         semantic difference.
1532
1533         The situation is that we were not adding BeforeFieldInit (from
1534         Modifiers.TypeAttr) to classes that could have it.
1535         BeforeFieldInit should be set to classes that have no static
1536         constructor. 
1537
1538         See:
1539
1540         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
1541
1542         And most importantly Zoltan's comment:
1543
1544         http://bugzilla.ximian.com/show_bug.cgi?id=44229
1545
1546         "I think beforefieldinit means 'it's ok to initialize the type sometime 
1547          before its static fields are used', i.e. initialization does not need
1548          to be triggered by the first access to the type. Setting this flag
1549          helps the JIT to compile better code, since it can run the static
1550          constructor at JIT time, and does not need to generate code to call it
1551          (possibly lots of times) at runtime. Unfortunately, mcs does not set
1552          this flag for lots of classes like String. 
1553          
1554          csc sets this flag if the type does not have an explicit static 
1555          constructor. The reasoning seems to be that if there are only static
1556          initalizers for a type, and no static constructor, then the programmer
1557          does not care when this initialization happens, so beforefieldinit
1558          can be used.
1559          
1560          This bug prevents the AOT compiler from being usable, since it 
1561          generates so many calls to mono_runtime_class_init that the AOT code
1562          is much slower than the JITted code. The JITted code is faster, 
1563          because it does not generate these calls if the vtable is type is
1564          already initialized, which is true in the majority of cases. But the
1565          AOT compiler can't do this."
1566
1567 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
1568
1569         * class.cs (MethodData.Emit): Refactor the code so symbolic
1570         information is generated for destructors;  For some reasons we
1571         were taking a code path that did not generate symbolic information
1572         before. 
1573
1574 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
1575
1576         * class.cs: Create a Constructor.CheckBase method that
1577         takes care of all validation type code. The method
1578         contains some code that was moved from Define.
1579
1580         It also includes new code that checks for duplicate ctors.
1581         This fixes bug #55148.
1582
1583 2004-03-09  Joshua Tauberer <tauberer@for.net>
1584
1585         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
1586         a { ... }-style array creation invokes EmitStaticInitializers
1587         which is not good for reference-type arrays.  String, decimal
1588         and now null constants (NullCast) are not counted toward
1589         static initializers.
1590
1591 2004-03-05  Martin Baulig  <martin@ximian.com>
1592
1593         * location.cs (SourceFile.HasLineDirective): New public field;
1594         specifies whether the file contains or is referenced by a "#line"
1595         directive.
1596         (Location.DefineSymbolDocuments): Ignore source files which
1597         either contain or are referenced by a "#line" directive.        
1598
1599 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
1600
1601         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
1602         direct access to our parent, so check the method inline there.
1603
1604 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
1605
1606         * expression.cs (Invocation.EmitCall): Miguel's last commit
1607         caused a regression. If you had:
1608
1609             T t = null;
1610             t.Foo ();
1611
1612         In Foo the implict this would be null.
1613
1614 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
1615
1616         * expression.cs (Invocation.EmitCall): If the method is not
1617         virtual, do not emit a CallVirt to it, use Call.
1618
1619         * typemanager.cs (GetFullNameSignature): Improve the method to
1620         cope with ".ctor" and replace it with the type name.
1621
1622         * class.cs (ConstructorInitializer.Resolve): Now the method takes
1623         as an argument the ConstructorBuilder where it is being defined,
1624         to catch the recursive constructor invocations.
1625
1626 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
1627
1628         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
1629         routines to check if a type is an enumerable/enumerator allow
1630         classes that implement the IEnumerable or IEnumerator interfaces.
1631
1632         * class.cs (Property, Operator): Implement IIteratorContainer, and
1633         implement SetYields.
1634
1635         (Property.Define): Do the block swapping for get_methods in the
1636         context of iterators.   We need to check if Properties also
1637         include indexers or not.
1638
1639         (Operator): Assign the Block before invoking the
1640         OperatorMethod.Define, so we can trigger the Iterator code
1641         replacement. 
1642
1643         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
1644         Property and Operator classes are not created when we parse the
1645         declarator but until we have the block completed, so we use a
1646         singleton SimpleIteratorContainer.Simple to flag whether the
1647         SetYields has been invoked.
1648
1649         We propagate this setting then to the Property or the Operator to
1650         allow the `yield' to function.
1651
1652 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
1653
1654         * codegen.cs: Implemented attribute support for modules.
1655         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
1656         Assembly/Module functionality.
1657
1658         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
1659         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
1660         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
1661
1662 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
1663
1664         * interface.cs (FindMembers): The operation is performed on all base
1665         interfaces and not only on the first. It is required for future CLS Compliance patch.
1666
1667 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
1668
1669         * statement.cs, codegen.cs:
1670         This patch deals with patterns such as:
1671
1672         public class List : IEnumerable {
1673
1674                 public MyEnumerator GetEnumerator () {
1675                         return new MyEnumerator(this);
1676                 }
1677
1678                 IEnumerator IEnumerable.GetEnumerator () {
1679                         ...
1680                 }
1681                 
1682                 public struct MyEnumerator : IEnumerator {
1683                         ...
1684                 }
1685         }
1686
1687         Before, there were a few things we did wrong:
1688         1) we would emit callvirt on a struct, which is illegal
1689         2) we emited ldarg when we needed to emit ldarga
1690         3) we would mistakenly call the interface methods on an enumerator
1691         type that derived from IEnumerator and was in another assembly. For example:
1692
1693         public class MyEnumerator : IEnumerator
1694
1695         Would have the interface methods called, even if there were public impls of the
1696         method. In a struct, this lead to invalid IL code.
1697
1698 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
1699
1700         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
1701           renamed to Emit.
1702
1703         * delegate.cs (Define): Fixed crash when delegate type is undefined.
1704
1705 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
1706
1707         * cs-parser.jay: Fix small regression: we were not testing V2
1708         compiler features correctly.
1709
1710         * interface.cs: If the emit context is null, then create one
1711
1712 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
1713
1714         * decl.cs (GetSignatureForError): New virtual method to get full name
1715           for error messages.
1716
1717         * attribute.cs (IAttributeSupport): New interface for attribute setting.
1718           Now it is possible to rewrite ApplyAttributes method to be less if/else.
1719
1720         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
1721           Duplicated members and code in these classes has been removed.
1722           Better encapsulation in these classes.
1723
1724 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
1725
1726         * assign.cs (Assign.DoResolve): When dealing with compound
1727         assignments, there is a new rule in ECMA C# 2.4 (might have been
1728         there before, but it is documented here) that states that in:
1729
1730         a op= b;
1731
1732         If b is of type int, and the `op' is a shift-operator, then the
1733         above is evaluated as:
1734
1735         a = (int) a op b 
1736
1737         * expression.cs (Binary.ResolveOperator): Instead of testing for
1738         int/uint/long/ulong, try to implicitly convert to any of those
1739         types and use that in pointer arithmetic.
1740
1741         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
1742         method to print information for from the type, not from the
1743         null-method we were given.
1744
1745 2004-02-01  Duncan Mak  <duncan@ximian.com>
1746
1747         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
1748         parsing for cmd, fixes bug #53694.
1749
1750 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
1751
1752         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
1753         in the member name duplication tests. Property and operator name duplication
1754         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
1755
1756 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
1757
1758         * interface.cs (PopulateMethod): Fixed crash when interface method
1759         returns not existing type (error test cs0246-3.cs).
1760
1761 2004-02-02  Ravi Pratap M <ravi@ximian.com>
1762
1763         * cs-parser.jay (interface_accessors): Re-write actions to also
1764         store attributes attached to get and set methods. Fix spelling
1765         while at it.
1766
1767         (inteface_property_declaration): Modify accordingly.
1768
1769         (InterfaceAccessorInfo): New helper class to store information to pass
1770         around between rules that use interface_accessors.
1771
1772         * interface.cs (Emit): Apply attributes on the get and set
1773         accessors of properties and indexers too.
1774
1775         * attribute.cs (ApplyAttributes): Modify accordingly to use the
1776         right MethodBuilder when applying attributes to the get and set accessors.
1777
1778 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
1779
1780         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
1781
1782 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
1783
1784         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
1785
1786 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
1787
1788         * cs-parser.jay: Remove YIELD token, instead use the new grammar
1789         changes that treat `yield' specially when present before `break'
1790         or `return' tokens.
1791
1792         * cs-tokenizer.cs: yield is no longer a keyword.
1793
1794 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
1795
1796         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
1797         setting for default constructors.
1798         For default constructors are almost every time set wrong Modifier. The
1799         generated IL code has been alright. But inside mcs this values was
1800         wrong and this was reason why several of my CLS Compliance tests
1801         failed.
1802
1803 2004-01-22  Martin Baulig  <martin@ximian.com>
1804
1805         * cs-parser.jay (namespace_or_type_name): Return an Expression,
1806         not a QualifiedIdentifier.  This is what `type_name_expression'
1807         was previously doing.
1808         (type_name_expression): Removed; the code is now in
1809         `namespace_or_type_name'.
1810         (qualified_identifier): Removed, use `namespace_or_type_name'
1811         instead.
1812         (QualifiedIdentifier): Removed this class.      
1813
1814 2004-01-22  Martin Baulig  <martin@ximian.com>
1815
1816         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
1817         not a string as alias name.
1818
1819 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
1820
1821         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
1822         #52730 bug, and instead compute correctly the need to use a
1823         temporary variable when requesting an address based on the
1824         static/instace modified of the field and the constructor.
1825  
1826 2004-01-21  Martin Baulig  <martin@ximian.com>
1827
1828         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
1829         class and namespace before looking up aliases.  Fixes #52517.
1830
1831 2004-01-21  Martin Baulig  <martin@ximian.com>
1832
1833         * flowanalysis.cs (UsageVector.Merge): Allow variables being
1834         assinged in a 'try'; fixes exception4.cs.
1835
1836 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
1837         * class.cs : Implemented parameter-less constructor for TypeContainer
1838
1839         * decl.cs: Attributes are now stored here. New property OptAttributes
1840
1841         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
1842
1843         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
1844
1845 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
1846
1847         * typemanager.cs (CSharpSignature): Now reports also inner class name.
1848           (CSharpSignature): New method for indexer and property signature.
1849
1850 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
1851
1852         * pending.cs (IsVirtualFilter): Faster implementation.
1853
1854 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
1855
1856         * typemanager.cs: Avoid inclusion of same assembly more than once.
1857
1858 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
1859
1860         * cs-parser.jay: Fixed problem where the last assembly attribute
1861           has been applied also to following declaration (class, struct, etc.)
1862           
1863 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
1864
1865         * class.cs: Added error CS0538, CS0539 reporting.
1866         Fixed crash on Microsoft runtime when field type is void.
1867
1868         * cs-parser.jay: Added error CS0537 reporting.
1869
1870         * pending.cs: Added error CS0535 reporting.
1871         Improved error report for errors CS0536, CS0534.
1872
1873 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
1874
1875         Merge a few bits from the Anonymous Method MCS tree.
1876
1877         * statement.cs (ToplevelBlock): New class for toplevel methods,
1878         will hold anonymous methods, lifted variables.
1879
1880         * cs-parser.jay: Create toplevel blocks for delegates and for
1881         regular blocks of code. 
1882
1883 2004-01-20  Martin Baulig  <martin@ximian.com>
1884
1885         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
1886         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
1887         and `NeedExplicitReturn'; added `IsLastStatement'.
1888         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
1889         have a `ReturnLabel' or we're not unreachable.
1890
1891         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
1892         child's reachability; don't just override ours with it.  Fixes
1893         #58058 (lluis's example).
1894         (FlowBranching): Added public InTryOrCatch(), InCatch(),
1895         InFinally(), InLoop(), InSwitch() and
1896         BreakCrossesTryCatchBoundary() methods.
1897
1898         * statement.cs (Return): Do all error checking in Resolve().
1899         Unless we are the last statement in a top-level block, always
1900         create a return label and jump to it.
1901         (Break, Continue): Do all error checking in Resolve(); also make
1902         sure we aren't leaving a `finally'.
1903         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
1904         statement in a top-level block.
1905         (Block.Flags): Added `IsDestructor'.
1906         (Block.IsDestructor): New public property.
1907
1908 2004-01-20  Martin Baulig  <martin@ximian.com>
1909
1910         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
1911
1912 2004-01-20  Martin Baulig  <martin@ximian.com>
1913
1914         * statement.cs (Statement.ResolveUnreachable): New public method.
1915         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
1916         (Block.Resolve): Resolve unreachable statements.
1917
1918 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
1919
1920         * expression.cs: We need to fix the case where we do
1921         not have a temp variable here.
1922
1923         * assign.cs: Only expression compound assignments need
1924         temporary variables.
1925
1926 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
1927
1928         * flowanalysis.cs: Reduce memory allocation in a few ways:
1929           - A block with no variables should not allocate a bit
1930             vector for itself.
1931           - A method with no out parameters does not need any tracking
1932             for assignment of the parameters, so we need not allocate
1933             any data for it.
1934           - The arrays:
1935                 public readonly Type[] VariableTypes;
1936                 public readonly string[] VariableNames;
1937             Are redundant. The data is already stored in the variable
1938             map, so we need not allocate another array for it.
1939           - We need to add alot of checks for if (params | locals) == null
1940             due to the first two changes.
1941
1942 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
1943
1944         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
1945         implement IMemoryLocation, we store a copy on a local variable and
1946         take the address of it.  Patch from Benjamin Jemlich
1947
1948         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
1949         to use a special "type_name_expression" rule which reduces the
1950         number of "QualifiedIdentifier" classes created, and instead
1951         directly creates MemberAccess expressions.
1952
1953 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
1954
1955         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
1956         that fixes #52853.  Null literal assignment to ValueType
1957
1958         * class.cs (MethodData.Emit): Instead of checking the name of the
1959         method to determine if its a destructor, create a new derived
1960         class from Method called Destructor, and test for that.  
1961
1962         * cs-parser.jay: Create a Destructor object instead of a Method.  
1963
1964         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
1965
1966         Fixes: 52933
1967
1968 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
1969
1970         * expression.cs (Binary.ResolveOperator): Perform an implicit
1971         conversion from MethodGroups to their delegate types on the
1972         Addition operation.
1973
1974         * delegate.cs: Introduce a new class DelegateCreation that is the
1975         base class for `NewDelegate' and `ImplicitDelegateCreation',
1976         factor some code in here.
1977
1978         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
1979         conversion from MethodGroups to compatible delegate types. 
1980
1981         * ecore.cs (Expression.Resolve): Do not flag error 654
1982         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
1983         we allow conversions from MethodGroups to delegate types now.
1984
1985         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
1986         assignments in v2 either.
1987
1988 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
1989
1990         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
1991         static read-only fields in ctors.
1992
1993         Applied patch from Benjamin Jemlich 
1994
1995         * expression.cs (UnaryMutator): Avoid leaking local variables. 
1996
1997 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
1998
1999         * cs-tokenizer.cs (IsCastToken): Allow the various native types
2000         here to return true, as they can be used like this:
2001
2002                 (XXX) int.MEMBER ()
2003
2004         Fixed 49836 and all the other dups
2005
2006 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
2007
2008         * driver.cs: Implement /win32res and /win32icon.
2009
2010 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
2011
2012         * cs-parser.jay: Add a rule to improve error handling for the
2013         common mistake of placing modifiers after the type.
2014
2015 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
2016
2017         * cs-parser.jay (interface_event_declaration): Catch
2018         initialization of events on interfaces, and report cs0068
2019
2020         * cs-parser.jay (interface_event_declaration): Catch
2021         initialization of events. 
2022
2023         * ecore.cs: Better report missing constructors.
2024
2025         * expression.cs (Binary.ResolveOperator): My previous bug fix had
2026         the error reporting done in the wrong place.  Fix.
2027
2028         * expression.cs (Binary.ResolveOperator): Catch the 
2029         operator + (E x, E y) error earlier, and later allow for implicit
2030         conversions in operator +/- (E e, U x) from U to the underlying
2031         type of E.
2032
2033         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
2034         52596, if the container class is abstract, the default constructor
2035         is protected otherwise its public (before, we were always public).
2036
2037         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
2038         fixed statement.
2039
2040         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
2041         Jemlich that fixes bug #52597, MCS was generating invalid code for
2042         idisposable structs.   Thanks to Ben for following up with this
2043         bug as well.
2044
2045 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
2046
2047         * driver.cs: Allow assemblies without code to be generated, fixes
2048         52230.
2049
2050 2004-01-07  Nick Drochak <ndrochak@gol.com>
2051
2052         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
2053
2054 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
2055
2056         * cs-parser.jay: Add rules to improve error reporting if fields or
2057         methods are declared at the namespace level (error 116)
2058
2059         * Add rules to catch event add/remove
2060
2061 2004-01-04  David Sheldon <dave-mono@earth.li>
2062
2063   * expression.cs: Added matching ")" to error message for 
2064   CS0077
2065
2066 2004-01-03 Todd Berman <tberman@gentoo.org>
2067
2068         * ecore.cs, attribute.cs:
2069         Applying fix from #52429.
2070
2071 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2072
2073         * ecore.cs, expression.cs, statement.cs:
2074         Total rewrite of how we handle branching. We
2075         now handle complex boolean expressions with fewer
2076         jumps. As well if (x == 0) no longer emits a ceq.
2077
2078         if (x is Foo) is much faster now, because we generate
2079         better code.
2080
2081         Overall, we get a pretty big improvement on our benchmark
2082         tests. The code we generate is smaller and more readable.
2083
2084         I did a full two-stage bootstrap. The patch was reviewed
2085         by Martin and Miguel.
2086
2087 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2088
2089         * cs-parser.jay: Make primary_expression not take a QI.
2090         we dont need this because the member_access rule covers
2091         us here. So we replace the rule with just IDENTIFIER.
2092
2093         This has two good effects. First, we remove a s/r conflict.
2094         Second, we allocate many fewer QualifiedIdentifier objects.
2095
2096 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2097
2098         * attribute.cs: Handle MarshalAs attributes as pseudo, and
2099         set the correct information via SRE. This prevents
2100         hanging on the MS runtime. Fixes #29374.
2101
2102 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2103
2104         * convert.cs: correctly handle conversions to value types
2105         from Enum and ValueType as unboxing conversions.
2106
2107         Fixes bug #52569. Patch by Benjamin Jemlich.
2108
2109 2004-01-02  Ravi Pratap  <ravi@ximian.com>
2110
2111         * expression.cs (BetterConversion): Prefer int -> uint
2112         over int -> ulong (csc's behaviour). This fixed bug #52046.
2113
2114 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2115
2116         * decl.cs (MemberCache.FindMembers): now returns a
2117         MemberInfo [].
2118
2119         * typemanager.cs: In general, go with with ^^.
2120         (CopyNewMethods): take an IList.
2121         (RealMemberLookup): Only allocate an arraylist
2122         if we copy from two sets of methods.
2123
2124         This change basically does two things:
2125         1) Fewer array lists allocated due to CopyNewMethods.
2126         2) the explicit cast in MemberList costed ALOT.
2127
2128 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
2129
2130         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
2131         a hashtable to avoid needless string allocations when an identifier is
2132         used more than once (the common case).
2133
2134 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2135
2136         * pending.cs: MS's TypeBuilder.GetInterfaces ()
2137         is broken, it will not return anything. So, we
2138         have to use the information we have in mcs to
2139         do the task.
2140
2141         * typemanager.cs: Add a cache for GetInterfaces,
2142         since this will now be used more often (due to ^^)
2143
2144         (GetExplicitInterfaces) New method that gets the
2145         declared, not effective, interfaces on a type
2146         builder (eg, if you have interface IFoo, interface
2147         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
2148         { IBar }.
2149
2150         This patch makes MCS able to bootstrap itself on
2151         Windows again.
2152
2153 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2154
2155         * expression.cs: Remove the Nop's that Miguel put
2156         in by mistake.
2157
2158 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2159
2160         * report.cs, codegen.cs: Give the real stack trace to
2161         the error when an exception is thrown.
2162
2163 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2164
2165         * decl.cs: only allocate hashtables for ifaces if 
2166         it is an iface!
2167
2168 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2169
2170         * expression.cs: fix the error from cs0121-2.cs
2171         (a parent interface has two child interfaces that
2172         have a function with the same name and 0 params
2173         and the function is called through the parent).
2174
2175 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2176
2177         * class.cs, rootcontext.cs, typmanager.cs: do not
2178         leak pointers.
2179
2180 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2181
2182         * codegen.cs: remove stack for the ec flow branching.
2183         It is already a linked list, so no need.
2184
2185 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
2186
2187         * Makefile: Allow custom profiler here.
2188
2189 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2190
2191         * typemanager.cs (LookupType):
2192           - Use a static char [], because split takes
2193             a param array for args, so it was allocating
2194             every time.
2195           - Do not store true in a hashtable, it boxes.
2196
2197 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2198
2199         * flowanalysis.cs: bytify common enums.
2200
2201 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2202
2203         * modifiers.cs: Add a new set of flags for the
2204         flags allowed on explicit interface impls.
2205         * cs-parser.jay: catch the use of modifiers in
2206         interfaces correctly.
2207         * class.cs: catch private void IFoo.Blah ().
2208
2209         All related to bug #50572.
2210
2211 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2212
2213         * decl.cs: Rewrite the consistant accessability checking.
2214         Accessability is not linear, it must be implemented in
2215         a tableish way. Fixes #49704.
2216
2217 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2218
2219         * expression.cs: Handle negation in a checked context.
2220         We must use subtraction from zero. Fixes #38674.
2221
2222 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2223
2224         * class.cs: Ignore static void main in DLLs.
2225         * rootcontext.cs: Handle the target type here,
2226         since we are have to access it from class.cs
2227         * driver.cs: account for the above.
2228
2229 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2230
2231         * report.cs: Give line numbers and files if available.
2232
2233 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
2234
2235         * driver.cs: Implement /addmodule.
2236
2237         * typemanager.cs:  Change 'modules' field so it now contains Modules not
2238         ModuleBuilders.
2239
2240 2003-12-20  Martin Baulig  <martin@ximian.com>
2241
2242         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
2243         (FieldBase.IsAssigned): Removed this field.
2244         (FieldBase.SetAssigned): New public method.
2245         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
2246
2247 2003-12-20  Martin Baulig  <martin@ximian.com>
2248
2249         * expression.cs (LocalVariableReference.DoResolve): Don't set
2250         `vi.Used' if we're called from DoResolveLValue().
2251
2252         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
2253         returns the usage vector it just merged into the current one -
2254         pass this one to UsageWarning().
2255         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
2256         of the `EmitContext', don't call this recursively on our children.
2257
2258 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
2259
2260         * driver.cs: Implement /target:module.
2261
2262 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
2263
2264         * support.cs (CharArrayHashtable): New helper class.
2265
2266         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
2267         char arrays, not strings, so we can avoid creating a string in
2268         consume_identifier if the identifier is a keyword.
2269
2270 2003-12-16  Martin Baulig  <martin@ximian.com>
2271
2272         * statement.cs (LocalInfo.Assigned): Removed this property.
2273         (LocalInfo.Flags): Removed `Assigned'.
2274         (LocalInfo.IsAssigned): New public method; takes the EmitContext
2275         and uses flow analysis.
2276         (Block.UsageWarning): Made this method private.
2277         (Block.Resolve): Call UsageWarning() if appropriate.
2278
2279         * expression.cs (LocalVariableReference.DoResolve): Always set
2280         LocalInfo.Used here.
2281
2282 2003-12-13  Martin Baulig  <martin@ximian.com>
2283
2284         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
2285         any value here; we're now using flow analysis to figure out
2286         whether a statement/block returns a value.
2287
2288 2003-12-13  Martin Baulig  <martin@ximian.com>
2289
2290         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
2291         working again.
2292         (FlowBranching.MergeFinally): Don't call
2293         `branching.CheckOutParameters()' here, this is called in
2294         MergeTopBlock().
2295         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
2296         when adding the `finally' vector.       
2297
2298 2003-12-13  Martin Baulig  <martin@ximian.com>
2299
2300         * flowanalysis.cs
2301         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
2302         actually work and also fix #48962.
2303
2304 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2305
2306         * decl.cs: Do not check System.Object for nested types,
2307         since we know it does not have any. Big bang for buck:
2308
2309         BEFORE:
2310            Run 1:   8.35 seconds
2311            Run 2:   8.32 seconds
2312            corlib:  17.99 seconds
2313         AFTER:
2314            Run 1:   8.17 seconds
2315            Run 2:   8.17 seconds
2316            corlib:  17.39 seconds
2317
2318 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
2319
2320         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
2321         time we are returning 0 members, so we save alot here.
2322
2323 2003-12-11  Martin Baulig  <martin@ximian.com>
2324
2325         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
2326         `MergeChild()', also just take the `FlowBranching' as argument;
2327         call Merge() on it and return the result.
2328         (FlowBranching.Merge): We don't need to do anything if we just
2329         have one sibling.
2330
2331 2003-12-11  Martin Baulig  <martin@ximian.com>
2332
2333         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
2334         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
2335         Maurer for this idea.
2336
2337 2003-12-11  Martin Baulig  <martin@ximian.com>
2338
2339         * flowanalysis.cs (MergeResult): This class is now gone; we now
2340         use the `UsageVector' for this.  The reason for this is that if a
2341         branching just has one sibling, we don't need to "merge" them at
2342         all - that's the next step to do.
2343         (FlowBranching.Merge): We now return a `UsageVector' instead of a
2344         `MergeResult'.
2345
2346 2003-12-11  Martin Baulig  <martin@ximian.com>
2347
2348         Reworked flow analyis and made it more precise and bug-free.  The
2349         most important change is that we're now using a special `Reachability'
2350         class instead of having "magic" meanings of `FlowReturns'.  I'll
2351         do some more cleanups and optimizations and also add some more
2352         documentation this week.
2353
2354         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
2355         largely reworked this class.
2356         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
2357         the new `Reachability' class instead of having "magic" values here.
2358         (FlowBranching): We're now using an instance of `Reachability'
2359         instead of having separate `Returns', `Breaks' etc. fields.
2360
2361         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
2362         based on flow analysis; ignore the return value of block.Emit ().
2363
2364 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
2365
2366         * driver.cs typemanager.cs: Find the mono extensions to corlib even
2367         if they are private.
2368
2369 2003-12-09  Martin Baulig  <martin@ximian.com>
2370
2371         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
2372         call them directly on the UsageVector.
2373
2374 2003-12-09  Martin Baulig  <martin@ximian.com>
2375
2376         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
2377         Changed return type from `FlowReturns' to `Reachability'.
2378
2379 2003-12-09  Martin Baulig  <martin@ximian.com>
2380
2381         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
2382         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
2383         `Reachable' fields with a single `Reachability' one.
2384
2385 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2386
2387         * class.cs (FindMembers): Remove foreach's.
2388
2389         Bootstrap times:
2390
2391         BEFORE
2392                 Run 1:   8.74 seconds
2393                 Run 2:   8.71 seconds
2394
2395         AFTER
2396                 Run 1:   8.64 seconds
2397                 Run 2:   8.58 seconds
2398
2399
2400 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2401
2402         * cs-parser.jay:
2403         * gen-treedump.cs:
2404         * statement.cs:
2405         This patch does a few things:
2406                 1. EmptyStatement is now a singleton, so it is never reallocated.
2407                 2. All blah is EmptyStatement constructs have been changed to
2408                    blah == EmptyStatement.Value, which is much faster and valid
2409                    now that EmptyStatement is a singleton.
2410                 3. When resolving a block, rather than allocating a new array for
2411                    the non-empty statements, empty statements are replaced with
2412                    EmptyStatement.Value
2413                 4. Some recursive functions have been made non-recursive.
2414         Mainly the performance impact is from (3), however (1) and (2) are needed for
2415         this to work. (4) does not make a big difference in normal situations, however
2416         it makes the profile look saner.
2417
2418         Bootstrap times:
2419
2420         BEFORE
2421         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2422         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2423         Total memory allocated: 56397 KB
2424
2425         AFTER
2426         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
2427         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
2428         Total memory allocated: 55666 KB
2429
2430 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2431
2432         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
2433         than the hashtable in a hashtable version
2434
2435         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
2436         we always end up concating a string. This results in a huge perf
2437         loss, because many strings have to be tracked by the GC. In this
2438         patch, we first use a hashtable that works with two keys, so that
2439         the strings do not need to be concat'ed.
2440
2441         Bootstrap times:
2442         BEFORE
2443                 Run 1:   8.74 seconds
2444                 Run 2:   8.71 seconds
2445
2446         AFTER
2447                 Run 1:   8.65 seconds
2448                 Run 2:   8.56 seconds
2449
2450 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2451
2452         * Makefile: Add a new target `do-time' that does a quick and simple
2453         profile, leaving easy to parse output.
2454
2455 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
2456
2457         * codegen.cs (Init): Create the dynamic assembly with 
2458         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
2459
2460 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2461
2462         * support.cs: Make the PtrHashtable use only one
2463         instance of its comparer.
2464
2465 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
2466
2467         * typemanager.cs: Fix lookup of GetNamespaces.
2468
2469 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
2470
2471         * expression.cs: Removed redundant line.
2472
2473         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
2474         ArrayLists, use for loops with bounds.  
2475
2476         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
2477         arraylist.
2478
2479         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
2480         arraylists, use for loop with bounds.
2481
2482         The above three changes give us a 0.071 second performance
2483         improvement out of 3.294 seconds down to 3.223.  On my machine
2484         the above changes reduced the memory usage by 1,387 KB during
2485         compiler bootstrap.
2486
2487         * cs-parser.jay (QualifiedIdentifier): New class used to represent
2488         QualifiedIdentifiers.  Before we created a new string through
2489         concatenation, and mostly later on, the result would be
2490         manipulated by DecomposeQI through string manipulation.
2491
2492         This reduced the compiler memory usage for bootstrapping from
2493         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
2494         compile times in 0.05 seconds.
2495
2496 2003-11-28  Dick Porter  <dick@ximian.com>
2497
2498         * support.cs: Do string compares with the Invariant culture.
2499
2500         * rootcontext.cs: 
2501         * gen-treedump.cs: 
2502         * expression.cs: 
2503         * driver.cs: 
2504         * decl.cs: 
2505         * codegen.cs: 
2506         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
2507         the comparison is done with the Invariant culture.
2508
2509 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
2510
2511         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
2512         GetEnumerator method.
2513
2514         (ProbeCollectionType): Iterate starting at the most specific type
2515         upwards looking for a GetEnumerator
2516
2517         * expression.cs: Shift count can be up to 31 for int/uint and 63
2518         for long/ulong.
2519
2520 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
2521
2522         * statement.cs (Block.LookupLabel): Also look for the label on the
2523         children blocks.  Use a hash table to keep track of visited
2524         nodes. 
2525
2526         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
2527         we actually did transform the other operand, otherwise fall back
2528         to the common codepath that casts to long.
2529
2530         * cs-tokenizer.cs: Use the same code pattern as the int case.
2531         Maybe I should do the parsing myself, and avoid depending on the
2532         Parse routines to get this done.
2533
2534 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
2535
2536         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
2537         which fixes bug 51347.  This time test it.
2538
2539         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
2540         attributes for example can not tell the difference between these.
2541         The difference was only a syntax feature of the language. 
2542
2543         * attribute.cs: Apply attributes to delegates.
2544
2545         * delegate.cs: Call the apply attributes method.
2546
2547 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
2548
2549         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
2550         comparing 0 vs Byte.MinValue, not the value
2551
2552         (ImplicitConversionRequired): When reporting a conversion error,
2553         use error 31 to print out the constant error instead of the
2554         simpler 29.
2555
2556         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
2557         which fixes bug 51347.
2558
2559 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
2560
2561         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
2562         which fixes the -warnaserror command line option.
2563
2564 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
2565
2566         * cfold.cs (DoNumericPromotions): During constant folding of
2567         additions on UIntConstant, special case intconstants with
2568         IntConstants like we do on the expression binary operator. 
2569
2570 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
2571
2572         * convert.cs (ImplicitReferenceConversion): We were missing a case
2573         (System.Enum are not value types or class types, so we need to
2574         classify them separatedly).
2575
2576         * driver.cs: We do not support error 2007.
2577
2578 2003-11-12 Jackson Harper <jackson@ximian.com>
2579
2580         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
2581         system directory. Also use the full file name so users can
2582         libraries names mscorlib-o-tron.dll in a non system dir.
2583
2584 2003-11-10  Martin Baulig  <martin@ximian.com>
2585
2586         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
2587         (TypeManager.InitCoreTypes): Initialize them here, but instead of
2588         calling `ResolveType()' on them, directly assign their `Type'.
2589
2590 2003-11-08  Martin Baulig  <martin@ximian.com>
2591
2592         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
2593         return value and the `out parent' parameter.
2594         (TypeContainer.DefineType): Moved the CS0644 check into
2595         GetClassBases().  Don't pass the interface types to the
2596         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
2597         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
2598
2599         * ecore.cs (TypeExpr.IsAttribute): New property.
2600         (TypeExpr.GetInterfaces): New method.
2601
2602         * interface.cs (Interface.GetInterfaceTypeByName): Return a
2603         TypeExpr instead of a Type.
2604         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
2605         (Interface.DefineType): Don't pass the interface types to the
2606         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
2607         them later and then call `TypeBulider.AddInterfaceImplementation()'.
2608
2609         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
2610         instead of a `Type[]'.
2611         (TypeManager.RegisterBuilder): Likewise.
2612         (TypeManager.AddUserInterface): Likewise.
2613         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
2614         `Type[]' and also return a `TypeExpr[]'.
2615         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
2616
2617 2003-11-08  Martin Baulig  <martin@ximian.com>
2618
2619         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
2620         Expression.     
2621
2622 2003-11-08  Martin Baulig  <martin@ximian.com>
2623
2624         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
2625         TypeManager.ResolveExpressionTypes().
2626
2627         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
2628         instead of an Expression.
2629         (TypeExpr): This is now an abstract base class for `TypeExpression'.
2630         (TypeExpression): New public class; formerly known as `TypeExpr'.
2631
2632         * expression.cs (ComposedCast): Derive from TypeExpr.
2633
2634         * typemanager.cs (TypeManager.system_*_expr): These are now
2635         TypExpr's instead of Expression's.
2636         (TypeManager.ResolveExpressionTypes): New public static function;
2637         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
2638         of them.        
2639
2640 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
2641
2642         * expression.cs (New.DoResolve): Do not dereference value that
2643         might be a null return.
2644
2645         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
2646         sure that the constant value has the right type.  Fixes an
2647         unreported bug, similar to 50425.
2648
2649         * const.cs (Const.LookupConstantValue): Call
2650         ImplicitStandardConversionExists before doing a conversion to
2651         avoid havng the TypeManager.ChangeType do conversions.
2652
2653         Reduced the number of casts used
2654
2655         (Const.ChangeType): New routine to enable reuse of the constant
2656         type changing code from statement.
2657
2658         * typemanager.cs (ChangeType): Move common initialization to
2659         static global variables.
2660
2661         Fixes #50425.
2662
2663         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
2664         every value type to go through, even if it was void.  Fix that. 
2665
2666         * cs-tokenizer.cs: Use is_identifier_start_character on the start
2667         character of the define, and the is_identifier_part_character for
2668         the rest of the string.
2669
2670 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
2671
2672         * expression.cs (UnaryMutator.EmitCode): When I updated
2673         LocalVariableReference.DoResolve, I overdid it, and dropped an
2674         optimization done on local variable references.
2675
2676 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
2677
2678         * ecore.cs: Convert the return from Ldlen into an int.
2679
2680 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
2681
2682         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
2683         the accessibility, this is a special case for toplevel non-public
2684         classes (internal for instance).
2685
2686 2003-10-20  Nick Drochak <ndrochak@gol.com>
2687
2688         * ecore.cs: Fix typo and build.  Needed another right paren.
2689
2690 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
2691
2692         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
2693         `internal' case regular and protected, but not allowing protected
2694         to be evaluated later.  Bug 49840
2695
2696 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
2697
2698         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
2699         to kb.Nlast, and not the kb.nFirst to isolate the switch
2700         statement.
2701
2702         Extract the underlying type, so enumerations of long/ulong are
2703         treated like long/ulong.
2704
2705 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
2706
2707         * expression.cs (New): Overload the meaning of RequestedType to
2708         track the possible creation of the NewDelegate type, since
2709         DoResolve is invoked more than once for new constructors on field
2710         initialization.
2711
2712         See bugs: #48800 and #37014
2713
2714         * cs-parser.jay (declare_local_constants): Take an arraylist
2715         instead of a single constant.
2716
2717         (local_constant_declaration): It should take a
2718         constant_declarators, not a constant_declarator.  Fixes 49487
2719
2720         * convert.cs: Fix error report.
2721
2722 2003-10-13 Jackson Harper <jackson@ximian.com>
2723
2724         * typemanager.cs (TypeToCoreType): Add float and double this fixes
2725         bug #49611
2726
2727 2003-10-09  Martin Baulig  <martin@ximian.com>
2728
2729         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
2730         to the .ctor.
2731         (MethodCore.DoDefineParameters): Removed the TypeContainer
2732         argument; use the DeclSpace which was passed to the .ctor instead.
2733         (MethodCore.CheckParameter): Take a DeclSpace instead of a
2734         TypeContainer; we only need a DeclSpace here.
2735
2736 2003-10-09  Martin Baulig  <martin@ximian.com>
2737
2738         * class.cs (MethodData): Added additional `DeclSpace ds' argument
2739         to the .ctor.
2740         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
2741         EmitContext's .ctor.    
2742
2743 2003-10-09  Martin Baulig  <martin@ximian.com>
2744
2745         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
2746         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
2747         AsAccessible(), moved them as well.
2748
2749         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
2750
2751 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
2752
2753         * cs-parser.jay : Renamed yyName to yyNames related to jay.
2754
2755 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
2756
2757         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
2758         generation for >=, as spotted by Paolo, bug 48679.  
2759         Patch from David Waite.
2760
2761         * cs-tokenizer.cs: Add handling for #pragma.
2762
2763         * cs-parser.jay: Allow for both yield and yield return in the
2764         syntax.  The anti-cobolization of C# fight will go on!
2765
2766         * class.cs (TypeBuilder.DefineType): Catch error condition here
2767         (Parent.DefineType erroring out and returning null).
2768
2769         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
2770         coping with enumerations variables, we were mistakenly processing
2771         them as a regular value type instead of built-in types.  Fixes the
2772         bug #48063
2773
2774         * typemanager.cs (IsBuiltinOrEnum): New method.
2775
2776 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
2777
2778         * cs-parser.jay: Upgrade: yield now needs the return clause.
2779
2780 2003-09-19  Martin Baulig  <martin@ximian.com>
2781
2782         * decl.cs (MemberCache.SetupCacheForInterface): Take a
2783         `MemberCache parent' argument.  Normally, an interface doesn't
2784         have a parent type except System.Object, but we use this in gmcs
2785         for generic type parameters.
2786
2787 2003-09-18  Martin Baulig  <martin@ximian.com>
2788
2789         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
2790         on `type.IsInterface'; don't check whether the type has a parent
2791         to determine whether it's an interface.
2792
2793 2003-09-15  Martin Baulig  <martin@ximian.com>
2794
2795         * class.cs (TypeContainer.DefineType): Added an error flag to
2796         avoid reporting duplicate CS0146's ("class definition is
2797         circular.").
2798
2799         * driver.cs (Driver.MainDriver): Abort if
2800         RootContext.ResolveTree() reported any errors.
2801
2802 2003-09-07  Martin Baulig  <martin@ximian.com>
2803
2804         * report.cs (Error, Warning): Added overloaded versions which take
2805         a `params object[] args' and call String.Format().
2806
2807 2003-09-07  Martin Baulig  <martin@ximian.com>
2808
2809         * decl.cs (DeclSpace..ctor): Don't call
2810         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
2811         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
2812         (DeclSpace.RecordDecl): New method.
2813
2814         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
2815
2816 2003-09-02  Ravi Pratap  <ravi@ximian.com>
2817
2818         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
2819         value attributes to be applied to ParameterBuilders.
2820
2821         * class.cs (MethodCore.LabelParameters): Make static and more
2822         generic so that it can be used from other places - like interface
2823         methods, for instance.
2824
2825         * interface.cs (Interface.Emit): Call LabelParameters before
2826         emitting attributes on the InterfaceMethod.
2827
2828 2003-08-26  Martin Baulig  <martin@ximian.com>
2829
2830         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
2831         resolving aliases; fixes #47927.
2832
2833 2003-08-26  Martin Baulig  <martin@ximian.com>
2834
2835         * statement.cs (Using.DoResolve): This is internally emitting a
2836         try/finally clause, so we need to set ec.NeedExplicitReturn if we
2837         do not always return.  Fixes #47681.
2838
2839 2003-08-26  Martin Baulig  <martin@ximian.com>
2840
2841         * decl.cs (MemberCore): Moved WarningNotHiding(),
2842         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
2843         into MemberBase.
2844         (AdditionResult): Make this nested in DeclSpace.
2845         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
2846         argument; call NamespaceEntry.Define() unless we're nested in a
2847         class or struct.
2848
2849         * namespace.cs (Namespace.DefineName): New public function.  This
2850         is called from DeclSpace's .ctor to add 
2851         (Namespace.Lookup): Include DeclSpaces in the lookup.
2852
2853         * class.cs (Operator): Derive from MemberBase, not MemberCore.
2854
2855         * const.cs (Const): Derive from MemberBase, not MemberCore.     
2856
2857 2003-08-25  Martin Baulig  <martin@ximian.com>
2858
2859         * convert.cs (Convert.ExplicitReferenceConversion): When
2860         converting from an interface type to a class, unbox if the target
2861         type is a struct type.  Fixes #47822.
2862
2863 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2864
2865         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
2866         #47854.
2867
2868 2003-08-22  Martin Baulig  <martin@ximian.com>
2869
2870         * class.cs (TypeManager.DefineType): When defining a nested type,
2871         call DefineType() on our parent; fixes #47801.
2872
2873 2003-08-22  Martin Baulig  <martin@ximian.com>
2874
2875         * class.cs (MethodData.Define): While checking if a method is an
2876         interface implementation, improve the test a bit more to fix #47654.
2877
2878 2003-08-22  Martin Baulig  <martin@ximian.com>
2879
2880         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
2881         correctly; fixes #47722.
2882
2883 2003-08-22  Martin Baulig  <martin@ximian.com>
2884
2885         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
2886         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
2887
2888         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
2889
2890 2003-08-22  Martin Baulig  <martin@ximian.com>
2891
2892         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
2893         can only be assigned in static constructors.  Fixes #47161.
2894
2895 2003-08-22  Martin Baulig  <martin@ximian.com>
2896
2897         Rewrote and improved the flow analysis code.
2898
2899         * flowbranching.cs (FlowBranching): Make this class abstract.
2900         (FlowBranching.CreateBranching): New static function to create a
2901         new flow branching.
2902         (FlowBranchingBlock, FlowBranchingException): New classes.
2903         (FlowBranching.UsageVector.Type): New public readonly field.
2904         (FlowBranching.UsageVector.Breaks): Removed the setter.
2905         (FlowBranching.UsageVector.Returns): Removed the setter.
2906         (FlowBranching.UsageVector): Added Break(), Return(),
2907         NeverReachable() and Throw() methods to modify the reachability.
2908         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
2909         done by FlowBranching.Merge().
2910         (FlowBranching.UsageVector.MergeChild): New method; merges the
2911         merge result into the current vector.
2912         (FlowBranching.Merge): New abstract method to merge a branching.
2913
2914 2003-08-12  Martin Baulig  <martin@ximian.com>
2915
2916         * expression.cs (Indirection.CacheTemporaries): Create the
2917         LocalTemporary with the pointer type, not its element type.
2918
2919 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
2920
2921         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
2922         token was a keyword or not.
2923
2924         Add `error' options where an IDENTIFIER was expected;  Provide
2925         CheckToken and CheckIdentifierToken convenience error reporting
2926         functions. 
2927
2928         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
2929
2930         * decl.cs: Rename `NamespaceEntry Namespace' public field into
2931         NameSpaceEntry NameSpaceEntry.
2932
2933         (LookupInterfaceOrClass): Avoid creating a full qualified name
2934         from namespace and name: avoid doing lookups when we know the
2935         namespace is non-existant.   Use new Tree.LookupByNamespace which
2936         looks up DeclSpaces based on their namespace, name pair.
2937
2938         * driver.cs: Provide a new `parser verbose' to display the
2939         exception thrown during parsing.  This is turned off by default
2940         now, so the output of a failure from mcs is more graceful.
2941
2942         * namespace.cs: Track all the namespaces defined in a hashtable
2943         for quick lookup.
2944
2945         (IsNamespace): New method
2946
2947 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
2948
2949         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
2950         we know that we need to concatenate (full typename can never be
2951         null). 
2952
2953         * class.cs: ditto.
2954
2955         * statement.cs: Use a bitfield;  Do not initialize to null things
2956         which are done by the constructor by default.
2957
2958         * cs-parser.jay: bug fix, parameter was 4, not 3.
2959
2960         * expression.cs: Just use the property;
2961
2962         * statement.cs: No need for GetVariableInfo method.
2963
2964 2003-08-08  Martin Baulig  <martin@ximian.com>
2965
2966         * flowanalysis.cs (FlowReturns): This is now nested in the
2967         `FlowBranching' class.
2968         (MyBitVector): Moved this here from statement.cs.
2969         (FlowBranching.SiblingType): New enum type.
2970         (FlowBranching.CreateSibling): Added `SiblingType' argument.
2971
2972 2003-08-07  Martin Baulig  <martin@ximian.com>
2973
2974         * flowanalysis.cs (FlowBranchingType): This is now nested in the
2975         `FlowBranching' class and called `BranchingType'.
2976
2977 2003-08-07  Martin Baulig  <martin@ximian.com>
2978
2979         * flowanalysis.cs: Moved all the control flow analysis code into
2980         its own file.
2981
2982 2003-08-07  Martin Baulig  <martin@ximian.com>
2983
2984         * assign.cs (Assign.DoResolve): `target' must either be an
2985         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
2986         #37319.
2987
2988 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
2989
2990         * expression.cs (BinaryMethod): This kind of expression is created by the
2991         Binary class if it determines that the operator has to be handled
2992         by a method.
2993
2994         (BinaryDelegate): This kind of expression is created if we are
2995         dealing with a + or - operator on delegates.
2996
2997         (Binary): remove method, argumetns, and DelegateOperator: when
2998         dealing with methods, 
2999
3000         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
3001
3002         * statement.cs (Block): use bitfields for the three extra booleans
3003         we had in use.   Remove unused topblock parameter.
3004
3005         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
3006
3007         * assign.cs: Drop extra unneeded tests.
3008
3009 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
3010
3011         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
3012
3013         * statement.cs (Foreach): Use VariableStorage instead of
3014         LocalBuilders.   
3015
3016         * codegen.cs (VariableStorage): New class used by clients that
3017         require a variable stored: locals or fields for variables that
3018         need to live across yield.
3019
3020         Maybe provide a convenience api for EmitThis+EmitLoad?
3021
3022         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
3023         these bad boys.
3024
3025 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
3026
3027         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
3028         RemapParameterLValue): New methods that are used to turn a
3029         precomputed FieldInfo into an expression like this:
3030
3031                 instance.FieldInfo
3032
3033         The idea is to use this instead of making LocalVariableReference
3034         have more than one meaning.
3035
3036         * cs-parser.jay: Add error production to BASE.
3037
3038         * ecore.cs: Deal with TypeManager.GetField returning null, which
3039         is now a valid return value.
3040
3041         (FieldExprNoAddress): New expression for Fields whose address can
3042         not be taken.
3043
3044         * expression.cs (LocalVariableReference): During the resolve
3045         phases, create new expressions if we are in a remapping context.
3046         Remove code that dealt with remapping here.
3047
3048         (ParameterReference): same.
3049
3050         (ProxyInstance): New expression, like the `This' expression, but
3051         it is born fully resolved.  We know what we are doing, so remove
3052         the errors that are targeted to user-provided uses of `this'.
3053
3054         * statement.cs (Foreach): our variable is now stored as an
3055         Expression;  During resolution, follow the protocol, dont just
3056         assume it will return this.
3057
3058 2003-08-06  Martin Baulig  <martin@ximian.com>
3059
3060         * support.cs (SeekableStreamReader.cs): New public class.
3061
3062         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
3063         SeekableStreamReader instead of the normal StreamReader.
3064
3065 2003-08-04  Martin Baulig  <martin@ximian.com>
3066
3067         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
3068         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
3069         deambiguate casts and delegate invocations.
3070         (parenthesized_expression): Use the new tokens to ensure this is
3071         not a cast of method invocation.
3072
3073         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
3074         when reading a `)' and Deambiguate_CloseParens () was previously
3075         called.
3076
3077         * expression.cs (ParenthesizedExpression): New class.  This is
3078         just used for the CS0075 test.
3079         (Binary.DoResolve): Check for CS0075.   
3080
3081 2003-07-29  Ravi Pratap  <ravi@ximian.com>
3082
3083         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
3084         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
3085         reference comparison.
3086
3087         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
3088         examine the ReturnType for equality - this is necessary in the
3089         cases of implicit and explicit operators whose signature also
3090         includes the return type.
3091
3092 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
3093
3094         * namespace.cs: Cache the result of the namespace computation,
3095         instead of computing it every time.
3096
3097 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
3098
3099         * decl.cs: Use a global arraylist that we reuse over invocations
3100         to avoid excesive memory consumption.  Reduces memory usage on an
3101         mcs compile by one meg (45 average).
3102
3103         * typemanager.cs (LookupTypeReflection): In .NET pointers are
3104         private, work around that.
3105
3106 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
3107
3108         * literal.cs (IntLiteral): Define Zero and One static literals. 
3109
3110         * cs-parser.jay (integer_literal): use static literals to reduce
3111         memory usage for the most used literals (0, 1 and -1).  211kb
3112         reduced in memory usage.
3113
3114         Replace all calls to `new ArrayList' with `new
3115         ArrayList(4)' which is a good average number for most allocations,
3116         and also requires only 16 bytes of memory for its buffer by
3117         default. 
3118
3119         This reduced MCS memory usage in seven megabytes for the RSS after
3120         bootstrapping.
3121
3122 2003-07-28  Ravi Pratap  <ravi@ximian.com>
3123
3124         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
3125         handle params methods the correct way by forming only one
3126         applicable set with params and normal methods in them. Earlier we
3127         were looking at params methods only if we found no normal methods
3128         which was not the correct thing to do.
3129
3130         (Invocation.BetterFunction): Take separate arguments indicating
3131         when candidate and the best method are params methods in their
3132         expanded form.
3133
3134         This fixes bugs #43367 and #46199.
3135
3136         * attribute.cs: Documentation updates.
3137
3138         (CheckAttribute): Rename to CheckAttributeTarget.
3139         (GetValidPlaces): Rename to GetValidTargets.
3140
3141         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
3142         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
3143
3144         Fixes bug #44468.
3145
3146 2003-07-28  Martin Baulig  <martin@ximian.com>
3147
3148         * class.cs (TypeContainer.DefineMembers): Use the base type's full
3149         name when looking up the base class of a nested class.  Fixes #46977.
3150
3151 2003-07-26  Martin Baulig  <martin@ximian.com>
3152
3153         * expression.cs (Indexers.Indexer): New nested struct; contains
3154         getter, setter and the indexer's type.
3155         (Indexers.Properties): This is now an ArrayList of
3156         Indexers.Indexer's.
3157         (IndexerAccess.DoResolveLValue): Correctly set the type if the
3158         indexer doesn't have any getters.
3159
3160         * assign.cs (Assign.DoResolve): Also do the implicit conversions
3161         for embedded property and indexer assignments.
3162
3163 2003-07-26  Martin Baulig  <martin@ximian.com>
3164
3165         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
3166         preprocessor directive is not the first non-whitespace character
3167         on a line.
3168
3169 2003-07-26  Martin Baulig  <martin@ximian.com>
3170
3171         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
3172         namespace parsing, follow the spec more closely.
3173
3174         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
3175         NamespaceEntry.Lookup().
3176
3177 2003-07-25  Martin Baulig  <martin@ximian.com>
3178
3179         * MethodCore.cs (OverridesSomething): New public field; it's set
3180         from TypeContainer.DefineMembers if this method overrides
3181         something (which doesn't need to be a method).  Fix #39462.
3182
3183 2003-07-25  Ravi Pratap  <ravi@ximian.com>
3184
3185         * typemanager.cs (GetMembers): Ensure that the list of members is
3186         reversed. This keeps things in sync.
3187
3188         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
3189         find an AttributeUsage attribute.
3190
3191         * expression.cs (Invocation.OverloadResolve): Perform the check
3192         which disallows Invoke to be directly called on a Delegate.
3193
3194         (Error_InvokeOnDelegate): Report error cs1533.
3195
3196 2003-07-25  Martin Baulig  <martin@ximian.com>
3197
3198         * expression.cs (Indexers.GetIndexersForType): Only look in the
3199         interface hierarchy if the requested type is already an
3200         interface.  Fixes #46788 while keeping #46502 fixed.
3201
3202 2003-07-25  Martin Baulig  <martin@ximian.com>
3203
3204         * class.cs (TypeContainer.DefineMembers): Check whether all
3205         readonly fields have been assigned and report warning CS0649 if
3206         not.
3207
3208         * statement.cs (LocalInfo.IsFixed): Always return true if this is
3209         a valuetype.
3210
3211 2003-07-24  Ravi Pratap  <ravi@ximian.com>
3212
3213         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
3214         returned from GetMethods to make things consistent with the
3215         assumptions MCS makes about ordering of methods.
3216
3217         This should comprehensively fix bug #45127 and it does :-)
3218
3219         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
3220         ordering is actually reverse.
3221
3222         * Clean up some debug messages I left lying around.
3223
3224         * interface.cs (Populate*): Get rid of code which emits attributes
3225         since the stage in which we emit attributes is the 'Emit' stage,
3226         not the define stage.
3227
3228         (Emit): Move attribute emission for interface members here.
3229
3230 2003-07-22  Ravi Pratap  <ravi@ximian.com>
3231
3232         * expression.cs (Invocation.OverloadResolve): Follow the spec more
3233         closely: we eliminate methods in base types when we have an
3234         applicable method in a top-level type.
3235
3236         Please see section 14.5.5.1 for an exact description of what goes
3237         on. 
3238
3239         This fixes bug #45127 and a host of other related to corlib compilation.
3240
3241         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
3242         array is the method corresponding to the top-level type (this is
3243         because of the changes made to icall.c) so we change this
3244         accordingly.
3245
3246         (MethodGroupExpr.Name): This too.
3247
3248         * typemanager.cs (GetElementType): New method which does the right
3249         thing when compiling corlib. 
3250
3251         * everywhere: Make use of the above in the relevant places.
3252
3253 2003-07-22  Martin Baulig  <martin@ximian.com>
3254
3255         * cs-parser.jay (invocation_expression): Moved
3256         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
3257         `cast_expression', but create a InvocationOrCast which later
3258         resolves to either an Invocation or a Cast.
3259
3260         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
3261         method; call this before EmitStatement() to make sure that this
3262         expression can be used as a statement.
3263
3264         * expression.cs (InvocationOrCast): New class; resolves to either
3265         an Invocation or a Cast.
3266
3267         * statement.cs (StatementExpression): Call ResolveStatement() on
3268         the ExpressionStatement before emitting it.
3269
3270 2003-07-21  Martin Baulig  <martin@ximian.com>
3271
3272         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
3273         `ref' and `out' attributes match; fixes #46220.
3274         (MemberAccess.ResolveMemberAccess): You can't reference a type
3275         through an expression; fixes #33180.
3276         (Indexers.GetIndexersForType): Don't return the indexers from
3277         interfaces the class implements; fixes #46502.
3278
3279 2003-07-21  Martin Baulig  <martin@ximian.com>
3280
3281         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
3282         CS0661 checks; fixes bug #30442.
3283
3284 2003-07-21  Martin Baulig  <martin@ximian.com>
3285
3286         * decl.cs (AdditionResult): Added `Error'.
3287
3288         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
3289
3290         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
3291         makes cs0031.cs actually work.
3292
3293 2003-07-20  Martin Baulig  <martin@ximian.com>
3294
3295         * namespace.cs: Fixed that bug which caused a crash when compiling
3296         the debugger's GUI.
3297
3298 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
3299
3300         * typemanager.cs (LookupTypeReflection): Never expose types which
3301         are NotPublic, NestedPrivate, NestedAssembly, or
3302         NestedFamANDAssem.  We used to return these, and later do a check
3303         that would report a meaningful error, but the problem is that we
3304         would not get the real match, if there was a name override.
3305
3306 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
3307
3308         * namespace.cs (Namespace, Name): Do not compute the namespace
3309         name dynamically, compute it in the constructor.  This reduced
3310         memory usage by 1697 KB.
3311
3312         * driver.cs: Use --pause to pause at the end.
3313
3314 2003-07-17  Peter Williams  <peter@newton.cx>
3315
3316         * Makefile: Change the name of the test target so that it doesn't
3317         conflict with the recursive test target.
3318
3319 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
3320
3321         * expression.cs (LocalVariableReference.Emit, EmitAssign,
3322         AddressOf): Do not use EmitThis, that was wrong, use the actual
3323         this pointer.
3324
3325 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
3326
3327         * class.cs (MethodData.Define): While checking if a method is an
3328         interface implementation, improve the test: If we are not public
3329         (use new test here: use the computed MethodAttributes directly,
3330         instead of the parsed modifier flags) check if the `implementing'
3331         method comes from an interface or not.
3332
3333         * pending.cs (VerifyPendingMethods): Slightly better error
3334         message.
3335
3336         * makefile: add test target that does the mcs bootstrap.
3337
3338 2003-07-16  Ravi Pratap  <ravi@ximian.com>
3339
3340         * interface.cs (Define): Do nothing here since there are no
3341         members to populate etc. Move the attribute emission out of here
3342         since this was just totally the wrong place to put it. Attribute
3343         application happens during the 'Emit' phase, not in the 'Define'
3344         phase.
3345
3346         (Emit): Add this method and move the attribute emission here
3347
3348         * rootcontext.cs (EmitCode): Call the Emit method on interface
3349         types too.
3350
3351 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3352
3353         * expression.cs (OverloadResolve): Report error only if Location
3354         is not 'Null' which means that there was a probe going on.
3355
3356 2003-07-14  Martin Baulig  <martin@ximian.com>
3357
3358         * expression.cs (ConditionalLogicalOperator): New public class to
3359         implement user defined conditional logical operators.
3360         This is section 14.11.2 in the spec and bug #40505.
3361
3362 2003-07-14  Martin Baulig  <martin@ximian.com>
3363
3364         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
3365
3366 2003-07-14  Martin Baulig  <martin@ximian.com>
3367
3368         * codegen.cs (EmitContext.InFixedInitializer): New public field.
3369
3370         * ecore.cs (IVariable.VerifyFixed): New interface method.
3371
3372         * expression.cs (Unary.ResolveOperator): When resolving the `&'
3373         operator, check whether the variable is actually fixed.  Fixes bug
3374         #36055.  Set a variable definitely assigned when taking its
3375         address as required by the spec.
3376
3377         * statement.cs (LocalInfo.IsFixed): New field.
3378         (LocalInfo.MakePinned): Set `IsFixed' to true.
3379
3380 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3381
3382         * attribute.cs (Attribute.Resolve): While doing a Member lookup
3383         for .ctors, ensure that we only ask for members declared in the
3384         attribute type (BindingFlags.DeclaredOnly).
3385
3386         Fixes bug #43632.
3387
3388         * expression.cs (Error_WrongNumArguments): Report error 1501
3389         correctly the way CSC does.
3390
3391 2003-07-13  Martin Baulig  <martin@ximian.com>
3392
3393         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
3394         lookup on the fully qualified name, to make things like "X.X" work
3395         where "X.X" is a fully qualified type name, but we also have a
3396         namespace "X" in the using list.  Fixes #41975.
3397
3398 2003-07-13  Martin Baulig  <martin@ximian.com>
3399
3400         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
3401         function. If we're a CompoundAssign, we need to create an embedded
3402         CompoundAssign, not an embedded Assign.
3403         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
3404         Fixes #45854.
3405
3406 2003-07-13  Martin Baulig  <martin@ximian.com>
3407
3408         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
3409         work to fix bug #46088.
3410
3411 2003-07-13  Ravi Pratap <ravi@ximian.com>
3412
3413         * class.cs (Operator.Emit): Do not emit attributes here - it is
3414         taken care of by the Method class that we delegate too. This takes
3415         care of bug #45876.
3416
3417 2003-07-10  Martin Baulig  <martin@ximian.com>
3418
3419         * expression.cs (TypeOfVoid): New class.
3420         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
3421
3422 2003-07-10  Martin Baulig  <martin@ximian.com>
3423
3424         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
3425         bug #35957.
3426
3427 2003-07-10  Martin Baulig  <martin@ximian.com>
3428
3429         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
3430         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
3431
3432         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
3433
3434         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
3435
3436 2003-07-10  Martin Baulig  <martin@ximian.com>
3437
3438         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
3439         of decimal.  Fixes #42850.
3440
3441         NOTE: I also fixed the created byte blob, but this doesn't work on
3442         the MS runtime and csc never produces any byte blobs for decimal
3443         arrays.
3444
3445 2003-07-10  Martin Baulig  <martin@ximian.com>
3446
3447         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
3448         structs; fixes #32068.
3449         (Block.AddChildVariableNames): Fixed #44302.
3450
3451 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3452
3453         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
3454
3455 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3456
3457         * attribute.cs: And this test is onger needed.
3458
3459 2003-07-08  Martin Baulig  <martin@ximian.com>
3460
3461         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
3462         inaccessible types.  Fixes #36313.
3463
3464         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
3465
3466         * namespace.cs (NamespaceEntry): Create implicit entries for all
3467         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
3468         implicit entries for N1.N2 and N1.
3469
3470 2003-07-08  Martin Baulig  <martin@ximian.com>
3471
3472         Rewrote the handling of namespaces to fix a lot of the issues
3473         wrt. `using' aliases etc.
3474
3475         * namespace.cs (Namespace): Splitted this class into a
3476         per-assembly `Namespace' and a per-file `NamespaceEntry'.
3477
3478         * typemanager.cs (TypeManager.IsNamespace): Removed.
3479         (TypeManager.ComputeNamespaces): Only compute namespaces from
3480         loaded assemblies here, not the namespaces from the assembly we're
3481         currently compiling.
3482
3483 2003-07-08  Martin Baulig  <martin@ximian.com>
3484
3485         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
3486
3487 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3488
3489         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
3490         already fixed it.  
3491
3492         I thought about the memory savings here, but LookupTypeReflection
3493         is used under already very constrained scenarios.  Compiling
3494         corlib or mcs only exposes one hit, so it would not really reduce
3495         any memory consumption.
3496
3497 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3498
3499         * typemanager.cs: fixes bug #45889 by only adding public types from
3500         other assemblies to the list of known types.
3501
3502 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3503
3504         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
3505         on the type we resolved.
3506
3507 2003-07-05  Martin Baulig  <martin@ximian.com>
3508
3509         * pending.cs (PendingImplementation.ParentImplements): Don't
3510         create the proxy if the parent is abstract.
3511
3512         * class.cs (TypeContainer.DefineIndexers): Process explicit
3513         interface implementations first.  Fixes #37714.
3514
3515 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
3516
3517         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
3518         defined recursively;  but since we modify the input parameters
3519         (left is set to `this' temporarily), we reset this value if the
3520         left_is_explicit is false, which gives the original semantics to
3521         the code.  
3522
3523         * literal.cs (NullPointer): new class used to represent a null
3524         literal in a pointer context.
3525
3526         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
3527         type is a pointer, use a NullPointer object instead of a
3528         NullLiteral.   Closes 43687
3529
3530         (ExplicitConversion): Convert pointer values using
3531         the conv opcode to the proper type.
3532
3533         * ecore.cs (New): change ValueTypeVariable property into a method,
3534         that returns whether the valuetype is suitable for being used.
3535
3536         * expression.cs (Binary.DoNumericPromotions): Only return if we
3537         the int constant was a valid uint, and we can return both left and
3538         right as uints.  If not, we continue processing, to trigger the
3539         type conversion.  This fixes 39018.
3540
3541         * statement.cs (Block.EmitMeta): During constant resolution, set
3542         the CurrentBlock property on the emitcontext, so that we resolve
3543         constants propertly.
3544
3545 2003-07-02  Martin Baulig  <martin@ximian.com>
3546
3547         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
3548         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
3549
3550         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
3551         than emitting it here.
3552
3553         * statement.cs: Fixed some more flow analysis bugs.
3554
3555 2003-07-02  Martin Baulig  <martin@ximian.com>
3556
3557         * class.cs (MethodData.Define): When implementing interface
3558         methods, set Final unless we're Virtual.
3559
3560         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
3561         check work for interface methods.
3562
3563 2003-07-01  Martin Baulig  <martin@ximian.com>
3564
3565         * ecore.cs (EmitContext.This): Replaced this property with a
3566         GetThis() method which takes a Location argument.  This ensures
3567         that we get the correct error location for a CS0188.
3568
3569 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
3570
3571         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
3572         ImplicitStandardConversion.
3573
3574         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
3575
3576 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
3577
3578         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
3579         optimization.
3580
3581 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
3582
3583         * class.cs (Constructor.Define): Turn off initlocals for unsafe
3584         constructors.
3585
3586         (MethodData.Define): Turn off initlocals for unsafe methods.
3587
3588 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
3589
3590         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
3591         complete;  Fixes #37521.
3592
3593         * delegate.cs: Use Modifiers.TypeAttr to compute the
3594         TypeAttributes, instead of rolling our own.  This makes the flags
3595         correct for the delegates.
3596
3597 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
3598
3599         * class.cs (Constructor.Define): Set the private flag for static
3600         constructors as well.
3601
3602         * cs-parser.jay (statement_expression): Set the return value to
3603         null, to avoid a crash when we catch an error.
3604
3605 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
3606
3607         * cs-parser.jay: Applied patch from Jackson that adds support for
3608         extern and unsafe modifiers to destructor declarations.
3609
3610         * expression.cs: Report error 21 if the user is trying to index a
3611         System.Array.
3612
3613         * driver.cs: Add an error message, suggested by the bug report.
3614
3615         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
3616         if we do not have a ": this ()" constructor initializer.  Fixes 45149
3617
3618 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
3619
3620         * namespace.cs: Add some information to reduce FAQs.
3621
3622 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
3623
3624         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
3625         underlying enumeration types.  Fixes #43915.
3626
3627         * expression.cs: Treat ushort/short as legal values to be used in
3628         bitwise operations.
3629
3630 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
3631
3632         * delegate.cs: transfer custom attributes for paramenters from
3633         the delegate declaration to Invoke and BeginInvoke.
3634
3635 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
3636
3637         * attribute.cs: handle custom marshalers and emit marshal info
3638         for fields, too.
3639
3640 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
3641
3642         * makefile.gnu: Added anonymous.cs to the compiler sources.
3643
3644 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
3645
3646         * iterators.cs: Change the name of the proxy class to include two
3647         underscores.
3648
3649         * cs-parser.jay: Update grammar to include anonymous methods.
3650
3651         * anonymous.cs: new file.
3652
3653 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
3654
3655         * class.cs (Field.Define): Add missing test for pointers and
3656         safety. 
3657
3658 2003-05-27  Ravi Pratap  <ravi@ximian.com>
3659
3660         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
3661         we use the stobj opcode.
3662
3663         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
3664         since it wasn't the correct fix. 
3665
3666         It still is puzzling that we are required to use stobj for IntPtr
3667         which seems to be a ValueType.
3668
3669 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
3670
3671         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
3672         during regular simple name resolution.   Now, the trick is that
3673         instead of returning for processing the simplename, we do a
3674         TypeManager.LookupType (ie, a rooted lookup as opposed to a
3675         contextual lookup type).   If a match is found, return that, if
3676         not, return for further composition.
3677
3678         This fixes long-standing 30485.
3679
3680         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
3681         using the address to initialize an object, do an Stobj instead of
3682         using the regular Stelem.
3683
3684         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
3685         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
3686         Because if we are a BaseIndexerAccess that value will be true.
3687         Fixes 43643.
3688
3689         * statement.cs (GotoCase.Resolve): Return after reporting an
3690         error, do not attempt to continue. 
3691
3692         * expression.cs (PointerArithmetic.Emit): If our operand is a
3693         long, convert our constants to match the operand before
3694         multiplying.  Convert to I type before adding.   Fixes 43670.
3695
3696 2003-05-14  Ravi Pratap  <ravi@ximian.com>
3697
3698         * enum.cs (ImplicitConversionExists) : Rename to
3699         ImplicitEnumConversionExists to remove ambiguity. 
3700
3701         * ecore.cs (NullCast): New type of cast expression class which
3702         basically is very similar to EmptyCast with the difference being
3703         it still is a constant since it is used only to cast a null to
3704         something else
3705         (eg. (string) null)
3706
3707         * convert.cs (ImplicitReferenceConversion): When casting a null
3708         literal, we return a NullCast.
3709
3710         * literal.cs (NullLiteralTyped): Remove - I don't see why this
3711         should be around anymore.
3712
3713         The renaming (reported was slightly wrong). Corrections:
3714
3715         ConvertImplicitStandard -> ImplicitConversionStandard
3716         ConvertExplicitStandard -> ExplicitConversionStandard
3717
3718         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
3719         before passing them in !
3720
3721         * convert.cs (ImplicitConversionStandard): When comparing for
3722         equal expr and target types, ensure that expr is not a
3723         NullLiteral.
3724
3725         In general, we must not be checking (expr_type ==
3726         target_type) in the top level conversion methods
3727         (ImplicitConversion, ExplicitConversion etc). This checking is
3728         done in the methods that they delegate to.
3729
3730 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
3731
3732         * convert.cs: Move Error_CannotConvertType,
3733         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
3734         ImplicitNumericConversion, ImplicitConversionExists,
3735         ImplicitUserConversionExists, StandardConversionExists,
3736         FindMostEncompassedType, FindMostSpecificSource,
3737         FindMostSpecificTarget, ImplicitUserConversion,
3738         ExplicitUserConversion, GetConversionOperators,
3739         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
3740         TryImplicitIntConversion, Error_CannotConvertImplicit,
3741         ConvertImplicitRequired, ConvertNumericExplicit,
3742         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
3743         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
3744         its own file.
3745
3746         Perform the following renames:
3747
3748         StandardConversionExists -> ImplicitStandardConversionExists
3749         ConvertImplicit -> ImplicitConversion
3750         ConvertImplicitStandard -> ImplicitStandardConversion
3751         TryImplicitIntConversion -> ImplicitIntConversion
3752         ConvertImplicitRequired -> ImplicitConversionRequired
3753         ConvertNumericExplicit -> ExplicitNumericConversion
3754         ConvertReferenceExplicit -> ExplicitReferenceConversion
3755         ConvertExplicit -> ExplicitConversion
3756         ConvertExplicitStandard -> ExplicitStandardConversion
3757
3758 2003-05-19  Martin Baulig  <martin@ximian.com>
3759
3760         * statement.cs (TypeInfo.StructInfo): Made this type protected.
3761         (TypeInfo): Added support for structs having structs as fields.
3762
3763         * ecore.cs (FieldExpr): Implement IVariable.
3764         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
3765         VariableInfo for the field.
3766
3767 2003-05-18  Martin Baulig  <martin@ximian.com>
3768
3769         * expression.cs (This.DoResolve): Report a CS0027 if we're
3770         emitting a field initializer.
3771
3772 2003-05-18  Martin Baulig  <martin@ximian.com>
3773
3774         * expression.cs (This.ResolveBase): New public function.
3775         (This.DoResolve): Check for CS0188.
3776
3777         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
3778         This.Resolve().
3779
3780         * ecore.cs (MethodGroupExpr.DoResolve): Set the
3781         `instance_expression' to null if we don't have any non-static
3782         methods.
3783
3784 2003-05-18  Martin Baulig  <martin@ximian.com>
3785
3786         Reworked the way how local variables and parameters are handled by
3787         the flow analysis code.
3788
3789         * statement.cs (TypeInfo, VariableMap): New public classes.
3790         (VariableInfo): New public class.  This is now responsible for
3791         checking whether a variable has been assigned.  It is used for
3792         parameters and local variables.
3793         (Block.EmitMeta): Take the InternalParameters as argument; compute
3794         the layout of the flow vectors here.
3795         (Block.LocalMap, Block.ParameterMap): New public properties.
3796         (FlowBranching): The .ctor doesn't get the InternalParameters
3797         anymore since Block.EmitMeta() now computes the layout of the flow
3798         vector.
3799         (MyStructInfo): This class is now known as `StructInfo' and nested
3800         in `TypeInfo'; we don't access this directly anymore.
3801
3802         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
3803         property and removed IsAssigned(), IsFieldAssigned(),
3804         SetAssigned() and SetFieldAssigned(); we now call them on the
3805         VariableInfo so we don't need to duplicate this code everywhere.
3806
3807         * expression.cs (ParameterReference): Added `Block block' argument
3808         to the .ctor.
3809         (LocalVariableReference, ParameterReference, This): The new
3810         VariableInfo class is now responsible for all the definite
3811         assignment stuff.
3812
3813         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
3814         IsParameterAssigned, SetParameterAssigned): Removed.
3815
3816 2003-05-18  Martin Baulig  <martin@ximian.com>
3817
3818         * typemanager.cs (InitCoreTypes): Try calling
3819         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
3820         the 3-args-version.  Corlib now also needs our `void_type'.
3821         (GetMethod): Added overloaded version which takes an optional
3822         `bool report_errors' to allow lookups of optional methods.
3823
3824 2003-05-12  Martin Baulig  <martin@ximian.com>
3825
3826         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
3827         only used for locals and not for parameters.
3828
3829 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
3830
3831         * support.cs (InternalParameters.ParameterType): Return the
3832         ExternalType of the parameter.
3833
3834         * parameter.cs (Parameter.ExternalType): drop the two arguments,
3835         they were unused.
3836
3837 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
3838
3839         * class.cs (MethodData.Define): Do not set the `newslot' on
3840         interface members, if they are also flagged as "override".
3841
3842         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
3843         better code for ++i and i++.  This only works for static fields
3844         and local variables.
3845
3846         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
3847         want to pull the DeclSpace out of the builder_to_declspace instead
3848         of the TypeBuilder (like in TypeContainer.FindMembers).
3849
3850         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
3851         instead of LookupTypeContainer.  Fixes the crash on .NET for
3852         looking up interface members.
3853
3854         * const.cs: Create our own emit context during the Definition
3855         stage, so that constants are evaluated in the proper context, when
3856         a recursive definition happens.
3857
3858 2003-05-11  Martin Baulig  <martin@ximian.com>
3859
3860         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
3861         new block for a switch section.
3862         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
3863         the adding/lookup in the switch block.  Fixes #39828.
3864
3865 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
3866
3867         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
3868         functionality: I needed to convert the data after I had performed
3869         the add/sub operation into the operands type size.
3870
3871         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
3872         pass the type for the box operation, otherwise the resulting
3873         object would have been of type object.
3874
3875         (BoxedCast): Add constructor to specify the type to box as.
3876
3877 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
3878
3879         * iterators.cs: I was reusing the `count' variable inadvertently,
3880         take steps to not allow this to happen.
3881
3882 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
3883
3884         * attribute.cs (Attribute.Resolve): Params attributes are encoded
3885         by creating an array at the point where the params starts and
3886         putting all those arguments there, then adjusting the size of the
3887         array.
3888
3889 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
3890
3891         * expression.cs (New.AddressOf): Implement interface
3892         IMemoryLocation.  This is used when the `new' operator is used in
3893         the context of an invocation to a method on a value type.
3894
3895         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
3896         example. 
3897
3898         * namespace.cs: Also check the using aliases here.
3899
3900         * driver.cs: Move the test for using validity after the types have
3901         been entered, so we do a single pass that also includes the using
3902         aliases. 
3903
3904         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
3905         in the regular case.   CreateSiblingForFinally is doing extra
3906         error checking.
3907
3908         * attribute.cs (GetAttributeArgumentExpression): Store the result
3909         on an out value, and use the return value to indicate failure
3910         instead of using null (which is a valid return for Constant.GetValue).
3911
3912         * statement.cs: Perform the analysis flow for the increment
3913         portion after the statement, because this will be the real flow of
3914         execution.  Fixes #42385
3915
3916         * codegen.cs (EmitContext.EmitArgument,
3917         EmitContext.EmitStoreArgument): New helper functions when the
3918         RemapToProxy flag is set.
3919
3920         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
3921         function.
3922
3923         Add support for remapping parameters. 
3924
3925         * iterators.cs: Propagate parameter values;  Store parameter
3926         values in the proxy classes.
3927
3928 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
3929
3930         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
3931         need a proxy reference;  I do not know what I was thinking
3932
3933         * cs-parser.jay (constructor_initializer): catch another error,
3934         and display nice message.
3935
3936         (field_declaration): catch void field declaration
3937         to flag a better error. 
3938
3939         * class.cs (MemberBase.CheckBase): Report an error instead of a
3940         warning if a new protected member is declared in a struct. 
3941         (Field.Define): catch the error of readonly/volatile.
3942
3943         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
3944
3945         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
3946         volatile variable is taken
3947
3948 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
3949
3950         * statement.cs (Fixed.Resolve): Report an error if we are not in
3951         an unsafe context.
3952
3953 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
3954
3955         * typemanager.cs: reuse the code that handles type clashes for
3956         delegates and enumerations.
3957
3958         * class.cs (Report28): Always report.
3959
3960         * expression.cs (EncodeAsAttribute): Allow nulls here.
3961
3962 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
3963
3964         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
3965         the functionality for testing whether an expression is valid for
3966         an attribute here.  Also handle the case of arrays of elements
3967         being stored. 
3968
3969         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
3970         encoding a linear array into an array of objects that are suitable
3971         to be passed to an CustomAttributeBuilder.
3972
3973         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
3974
3975         * ecore.cs: (FieldExpr): Handle field remapping here.
3976
3977         * iteratators.cs: Pass the instance variable (if the method is an
3978         instance method) to the constructors, so we can access the field
3979         variables on the class.
3980
3981         TODO: Test this with structs.  I think the THIS variable on
3982         structs might have to be a pointer, and not a refenrece
3983
3984 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
3985
3986         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
3987         local variables to fields in a proxy class.
3988
3989         * iterators.cs (PopulateProxy): Rename our internal fields to
3990         <XXX>.  
3991         Create a <THIS> field if we are an instance method, so we can
3992         reference our parent container variables.
3993         (MapVariable): Called back from the EmitContext code to enter a
3994         new variable to field mapping into the proxy class (we just create
3995         a FieldBuilder).
3996
3997         * expression.cs
3998         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
3999         for using the remapped locals to fields.
4000
4001         I placed the code here, because that gives the same semantics to
4002         local variables, and only changes the Emit code.
4003
4004         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
4005         statements inside iterators.
4006         (VariableInfo): Add a FieldBuilder for the cases when we are
4007         remapping local variables to fields in a proxy class
4008
4009         * ecore.cs (SimpleNameResolve): Avoid testing two times for
4010         current_block != null.
4011
4012         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
4013         not cope with strings, as it has been moved to the
4014         TableSwitchEmit.  Fixed bug in switch generation.
4015
4016         * expression.cs (New.DoResolve): Provide more context for the user
4017         when reporting an error.
4018
4019         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
4020         pointers. 
4021
4022         * expression.cs (MemberAccess.DoResolve): When we get a type back,
4023         check the permissions for it.  Note than in a type-resolution
4024         context the check was already present in DeclSpace.ResolveType,
4025         but was missing from the MemberAccess.
4026
4027         (ArrayCreation.CheckIndices): warn if the user has
4028         more nested levels of expressions, but there are no more
4029         dimensions specified.  Avoids crash on bug 41906.
4030
4031 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
4032
4033         * statement.cs (Block): replace Implicit bool, for a generic
4034         flags.   
4035         New flag: `Unchecked'.  This is used during the EmitMeta phase
4036         (which is out-of-line with the regular Resolve/Emit process for a
4037         statement, as this is done ahead of time, but still gets a chance
4038         to call constant resolve).
4039
4040         (Block.Flags): new enum for adding a new flag.
4041
4042         (Block.EmitMeta): track the state of unchecked.
4043
4044         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
4045         to enable constant resolution to work there as well.
4046
4047 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
4048
4049         * typemanager.cs (ienumerable_type): Also look up
4050         System.Collections.IEnumerable. 
4051
4052 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
4053
4054         TODO: Test more than one conditional per method.
4055
4056         * class.cs (Indexer.Define): Report the location where the user is
4057         referencing the unsupported feature.
4058
4059         (MethodData): Overload the use of `conditionals' to
4060         minimize the creation of needless ArrayLists.   This saves roughly
4061         212kb on my machine.
4062
4063         (Method): Implement the new IIteratorContainer interface.
4064         (Method.SetYields): Implement the method by setting the ModFlags
4065         to contain METHOD_YIELDS.
4066
4067         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
4068         which just got set to null.
4069
4070         * iterators.cs: New file.
4071
4072         (Yield, YieldBreak): New statements.
4073
4074         * statement.cs (Return.Resolve): Flag an error if we are used in
4075         an iterator method.
4076
4077         * codegen.cs (InIterator): New flag set if the code is being
4078         compiled in an iterator method.
4079
4080         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
4081         internal modifier, and we just use it to avoid adding extra
4082         fields, as this is seldom used.  
4083
4084         * cs-parser.jay: Add yield_statement (yield and yield break).
4085
4086         * driver.cs: New flag -v2 to turn on version 2 features. 
4087
4088         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
4089         hashtable when v2 is enabled.
4090
4091 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
4092
4093         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
4094         there is already a namespace defined with this name.
4095
4096         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
4097         people upgraded their corlibs.
4098
4099         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
4100         always use fully qualified types, no need to use the compiler
4101         front end.
4102
4103         (TypeManager.IsNamespace): Use binarysearch.
4104
4105         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
4106         AddDelegate): I did not quite use the new IsValid API properly: I
4107         have to pass the short-name and the fullname.  I was passing only
4108         the basename instead of the fullname sometimes. 
4109
4110         (TypeContainer.DefineType): call NamespaceClash.
4111
4112         * interface.cs (Interface.DefineType): use NamespaceClash before
4113         defining the type.
4114
4115         * delegate.cs (Delegate.DefineType): use NamespaceClash before
4116         defining the type.
4117
4118         * enum.cs: (Enum.DefineType): use NamespaceClash before
4119         defining the type.
4120
4121         * typemanager.cs (: 3-line patch that gives us some tasty 11%
4122         speed increase.  First, use the negative_hits cache when we get a
4123         negative.  Second, add the type with its full original name
4124         instead of the new . and + encoded name (reflection uses + to
4125         separate type from a nested type).  Use LookupTypeReflection
4126         directly which bypasses the type->name hashtable (that we already
4127         know does not contain the type.
4128
4129         * decl.cs (DeclSpace.ResolveTypeExpr): track the
4130         location/container type. 
4131
4132         * driver.cs: When passing utf8, use directly the UTF8Encoding.
4133
4134 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
4135
4136         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
4137
4138         * delegate.cs (NewDelegate.Resolve): Test whether an instance
4139         method is being referenced in the method group from a static
4140         context, and report error 120 if so.
4141
4142         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
4143         Error118. 
4144
4145         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
4146         is created, we create the A namespace).
4147
4148         * cs-parser.jay: A namespace also introduces a DeclarationFound.
4149         Fixes #41591
4150
4151 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
4152
4153         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
4154         invocation to ModuleBuilder.GetType with the same values will
4155         return a new type instance, so we need to cache its return
4156         values. 
4157
4158         * expression.cs (Binary.ResolveOperator): Only allow the compare
4159         operators on enums if they are of the same type.
4160
4161         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
4162         types of ValueType on their own case.  Before we were giving them
4163         the same treatment as objects.
4164
4165         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
4166         fullname.  Short name is used to compare against container name.
4167         Fullname is used to check against defined namespace names.
4168
4169         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
4170         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
4171
4172         (Method.CheckBase): Call parent.
4173         (MemberBase.CheckBase): Check for protected members on sealed
4174         classes.
4175         (PropertyBase.CheckBase): Call parent.
4176         (Field.Define): Call parent.
4177
4178         * report.cs: Negative error codes are now mapped to 8000 - code,
4179         so that the display is render more nicely.
4180
4181         * typemanager.cs: Do not use try/catch, instead report a regular
4182         error. 
4183
4184         (GetPointerType, GetReferenceType): These methods provide
4185         mechanisms to obtain the T* and T& from a T.  We had the code
4186         previously scattered around the code base, and it also used
4187         TypeManager.LookupType that would go through plenty of caches.
4188         This one goes directly to the type source.
4189
4190         In some places we did the Type.GetType followed by
4191         ModuleBuilder.GetType, but not in others, so this unifies the
4192         processing as well.
4193
4194         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
4195         statements now that we have namespace information.
4196
4197         * typemanager.cs (IsNamespace): New method, returns whether the
4198         string presented is a namespace or not.
4199
4200         (ComputeNamespaces): New public entry point, computes the list of
4201         available namespaces, using the GetNamespaces API call in Mono, or
4202         the slower version in MS.NET.   
4203
4204         Now before we start the semantic analysis phase, we have a
4205         complete list of namespaces including everything that the user has
4206         provided.
4207
4208         Deleted old code to cache namespaces in .nsc files.
4209
4210 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
4211
4212         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
4213         class/struct location definition Location for the implicit
4214         constructor location.
4215
4216         (Operator.Define): Use the location of the operator for the
4217         implicit Method definition.
4218
4219         (Constructor.Emit): use the constructor location for the implicit
4220         base initializer constructor.
4221
4222         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
4223         and the Expression class now contains two new methods:
4224
4225         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
4226         isolate type lookup from the rest of the resolution process.
4227
4228         Since we use Expressions to hold type definitions due to the way
4229         we parse the input we have historically overloaded Resolve to
4230         perform the Type lookups if a special flag is passed.  Now this is
4231         eliminated and two methods take their place. 
4232
4233         The differences in the two methods between xStep and xTerminal is
4234         that xStep is involved in our current lookup system that uses
4235         SimpleNames to compose a name, while xTerminal is used just to
4236         catch the case where the simplename lookup failed.
4237
4238 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
4239
4240         * expression.cs (ResolveMemberAccess): Remove redundant code.
4241         TypeExpr expressions are always born fully resolved.
4242
4243         * interface.cs (PopulateMethod): Do not lookup the types twice.
4244         We were doing it once during SemanticAnalysis and once during
4245         PopulateMethod.
4246
4247         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
4248         in local variable type definitions, were being returned as a
4249         SimpleName (we decomposed everything into a string), that is
4250         because primary_expression was being used instead of a type in the
4251         grammar (reduce/reduce conflicts).
4252
4253         The part that was wrong is that we converted the expression into a
4254         string (an oversimplification in one hand, compounded with primary
4255         expressions doing string concatenation).
4256
4257         So things like:
4258
4259         A.B.C [] x;
4260
4261         Would return "A.B.C[]" as a SimpleName.  This stopped things like
4262         using clauses from working on this particular context.  And a type
4263         was being matched directly against "A.B.C[]".
4264
4265         We now use the correct approach, and allow for ComposedCast to be
4266         part of the unary expression.  So the "A.B.C []" become a composed
4267         cast of "A.B.C" (as a nested group of MemberAccess with a
4268         SimpleName at the end) plus the rank composition "[]". 
4269
4270         Also fixes 35567
4271
4272 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
4273
4274         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
4275         for the access level checking.
4276
4277         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
4278         `TypeContainer container', because I kept getting confused when I
4279         was debugging this code.
4280
4281         * expression.cs (Indexers): Instead of tracking getters/setters,
4282         we now track them in parallel.  We create one arraylist less, but
4283         most importantly it is possible now for the LValue code to find a
4284         matching get for a set.
4285
4286         (IndexerAccess.DoResolveLValue): Update the code.
4287         GetIndexersForType has been modified already to extract all the
4288         indexers from a type.  The code assumed it did not.
4289
4290         Also make the code set the correct return type for the indexer.
4291         This was fixed a long time ago for properties, but was missing for
4292         indexers.  It used to be void_type.
4293
4294         (Binary.Emit): Test first for doubles instead of
4295         floats, as they are more common.
4296
4297         (Binary.EmitBranchable): Use the .un version of the branch opcodes
4298         when dealing with floats and the <=, >= operators.  This fixes bug
4299         #39314 
4300
4301         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
4302         to load the array value by emitting a load on the foreach variable
4303         type.  This was incorrect.  
4304
4305         We now emit the code to load an element using the the array
4306         variable type, and then we emit the conversion operator.
4307
4308         Fixed #40176
4309
4310 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
4311
4312         * attribute.cs: Avoid allocation of ArrayLists in the common case.
4313
4314 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
4315
4316         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
4317         test for protection before we test for signatures. 
4318
4319         (MethodSignature.ToString): implement.
4320
4321         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
4322         to the case where we reduced into a LongConstant.
4323
4324         * decl.cs (CheckAccessLevel): If the type is an array, we can not
4325         depend on whether the information is acurrate, because the
4326         Microsoft runtime will always claim that the array type is public,
4327         regardless of the real state.
4328
4329         If the type is a pointer, another problem happens: the type is
4330         reported as non-public in Microsoft.  
4331
4332         In both cases we have to call CheckAccessLevel recursively with
4333         the underlying type as the argument to be tested.
4334
4335 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
4336
4337         * assign.cs (Assign.Emit): If we are dealing with a compound
4338         assignment expression, we should use the code path that stores the
4339         intermediate result in a temporary value.  This fixes #40903.
4340
4341         *expression.cs (Indirection.ToString): Provide ToString method for
4342         debugging. 
4343
4344 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
4345
4346         * class.cs: Null out fields holding references to Block objects so
4347         they can be garbage collected.
4348
4349         * expression.cs (OverloadResolve): Remove unused local.
4350
4351 2003-04-07  Martin Baulig  <martin@ximian.com>
4352
4353         * codegen.cs (EmitContext.CurrentFile): New public field.
4354         (EmitContext.Mark): Use the CurrentFile to check whether the
4355         location is in the correct file.
4356         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
4357
4358 2003-04-07  Martin Baulig  <martin@ximian.com>
4359
4360         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
4361
4362         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
4363         location.  [FIXME: The location argument which gets passed to this
4364         method is sometimes wrong!]
4365
4366 2003-04-07  Nick Drochak <ndrochak@gol.com>
4367
4368         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
4369
4370 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
4371
4372         * expression.cs (Indirection.EmitAssign): We were using the
4373         temporary, but returning immediately instead of continuing the
4374         EmitAssing flow.
4375
4376 2003-04-06  Martin Baulig  <martin@ximian.com>
4377
4378         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
4379         if it's a nested child, but also deriving from the outer class.
4380         See test 190.cs.
4381
4382         * typemanager.cs (IsNestedChildOf): Make this work if it's a
4383         nested child, but also deriving from the outer class.  See
4384         test-190.cs.
4385         (FilterWithClosure): We may access private members of the outer
4386         class if we're a nested child and deriving from the outer class.
4387         (RealMemberLookup): Only set `closure_private_ok' if the
4388         `original_bf' contained BindingFlags.NonPublic.
4389
4390 2003-04-05  Martin Baulig  <martin@ximian.com>
4391
4392         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
4393
4394 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
4395
4396         * class.cs (Event.Define): Do not allow abstract events to have
4397         initializers. 
4398
4399 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
4400
4401         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
4402         block in event declarations.
4403
4404         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
4405         value type, get its address.
4406
4407         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
4408         leaving a class on the stack instead of a boolean value (int
4409         0/1).  Change the code so we compare against null, and then the
4410         result against zero.
4411
4412         * class.cs (TypeContainer.GetClassBases): We were checking for the
4413         parent class being sealed too late.
4414
4415         * expression.cs (Binary.Emit): For <= and >= when dealing with
4416         floating point values, use cgt.un and clt.un instead of cgt and
4417         clt alone.
4418
4419 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
4420
4421         * statement.cs: Apply the same optimization as MS: skip the 
4422         GetEnumerator returning an IEnumerator, and use the one returning a 
4423         CharEnumerator instead. This allows us to avoid the try-finally block 
4424         and the boxing.
4425
4426 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
4427
4428         * cs-parser.jay: Attributes cannot be applied to
4429                          namespaces. Fixes #40473
4430
4431 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4432
4433         * class.cs:
4434         (Add*): check if the name is valid using the full name for constants,
4435         fields, properties and events.
4436
4437 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
4438
4439         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
4440         char constants to be part of the enumeration.
4441
4442         * expression.cs (Conditional.DoResolve): Add support for operator
4443         true. Implements the missing functionality from 14.12
4444
4445         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
4446         operator true/false as required by the spec.
4447
4448         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
4449         implicit conversion to boolean.
4450
4451         * statement.cs (Statement.ResolveBoolean): A boolean expression is
4452         also one where the type implements `operator true'. 
4453
4454         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
4455         get an expression that will invoke operator true based on an
4456         expression.  
4457
4458         (GetConversionOperators): Removed the hack that called op_True
4459         here.  
4460
4461         (Expression.ResolveBoolean): Move this from Statement.
4462
4463 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
4464
4465         * ecore.cs (FieldExpr): do not allow initialization of initonly
4466         fields on derived classes
4467
4468 2003-03-13  Martin Baulig  <martin@ximian.com>
4469
4470         * statement.cs (Block.Emit): Call ig.BeginScope() and
4471         ig.EndScope() when compiling with debugging info; call
4472         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
4473
4474 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
4475
4476         * expression.cs (Indexers): Do not construct immediately, allow
4477         for new members to be appended as we go.  Fixes 38143
4478
4479 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4480
4481         * expression.cs: save/restore context when resolving an unchecked
4482         expression.
4483
4484 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
4485
4486         * cfold.cs: Catch division by zero in modulus operator during
4487         constant folding.
4488
4489 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
4490
4491         * interface.cs (Interface.DefineMembers): Avoid defining members
4492         twice. 
4493
4494 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
4495
4496         * driver.cs: handle the +/- options for -noconfig
4497
4498         * statement.cs (Unckeched.Resolve): Also track the state of
4499         unchecked in the Resolve phase.
4500
4501 2003-02-27  Martin Baulig  <martin@ximian.com>
4502
4503         * ecore.cs (Expression.MemberLookup): Don't create a
4504         MethodGroupExpr for something which is not a method.  Fixes #38291.
4505
4506 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
4507
4508         * class.cs (MemberBase.CheckParameters): Also check that the type
4509         is unmanaged if it is a pointer.
4510
4511         * expression.cs (SizeOf.Resolve): Add location information.
4512
4513         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
4514         a managed type is declared.
4515
4516         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
4517         parameter modifiers as well.  Fixes bug 38606
4518
4519         * class.cs: Very sad.  Am backing out the speed up changes
4520         introduced by the ArrayList -> Array in the TypeContainer, as they
4521         were not actually that much faster, and introduced a bug (no error
4522         reports on duplicated methods).
4523
4524         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
4525         source first, this will guarantee that we have a valid expression
4526         before calling in lower levels functions that will require a
4527         resolved object.  Then use this original_source in the
4528         target.ResolveLValue instead of the original source that was
4529         passed to us.
4530
4531         Another change.  Use target.Resolve instead of LValueResolve.
4532         Although we are resolving for LValues, we will let the Assign code
4533         take care of that (it will be called again from Resolve).  This
4534         basically allows code like this:
4535
4536         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
4537         class Y { void A (X x) { x [0] += o; }
4538
4539         The problem was that the indexer was trying to resolve for
4540         set_Item (idx, object o) and never finding one.  The real set_Item
4541         was set_Item (idx, X).  By delaying the process we get the right
4542         semantics. 
4543
4544         Fixes bug 36505
4545
4546 2003-02-23  Martin Baulig  <martin@ximian.com>
4547
4548         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
4549         while calling DoEmit ().
4550
4551         * codegen.cs (EmitContext.Mark): Don't mark locations in other
4552         source files; if you use the #line directive inside a method, the
4553         compiler stops emitting line numbers for the debugger until it
4554         reaches the end of the method or another #line directive which
4555         restores the original file.
4556
4557 2003-02-23  Martin Baulig  <martin@ximian.com>
4558
4559         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
4560
4561 2003-02-23  Martin Baulig  <martin@ximian.com>
4562
4563         * statement.cs (Block.AddChildVariableNames): We need to call this
4564         recursively, not just for our immediate children.
4565
4566 2003-02-23  Martin Baulig  <martin@ximian.com>
4567
4568         * class.cs (Event.Define): Always make the field private, like csc does.
4569
4570         * typemanager.cs (TypeManager.RealMemberLookup): Make events
4571         actually work, fixes bug #37521.
4572
4573 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
4574
4575         * delegate.cs: When creating the various temporary "Parameters"
4576         classes, make sure that we call the ComputeAndDefineParameterTypes
4577         on those new parameters (just like we do with the formal ones), to
4578         allow them to be resolved in the context of the DeclSpace.
4579
4580         This fixes the bug that Dick observed in Bugzilla #38530.
4581
4582 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
4583
4584         * expression.cs (ResolveMemberAccess): When resolving a constant,
4585         do not attempt to pull a constant if the value was not able to
4586         generate a valid constant.
4587
4588         * const.cs (LookupConstantValue): Do not report more errors than required.
4589
4590 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4591
4592         * expression.cs: fixes bug #38328.
4593
4594 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
4595
4596         * class.cs: Changed all the various members that can be part of a
4597         class from being an ArrayList to be an Array of the right type.
4598         During the DefineType type_list, interface_list, delegate_list and
4599         enum_list are turned into types, interfaces, delegates and enums
4600         arrays.  
4601
4602         And during the member population, indexer_list, event_list,
4603         constant_list, field_list, instance_constructor_list, method_list,
4604         operator_list and property_list are turned into their real arrays.
4605
4606         Although we could probably perform this operation earlier, for
4607         good error reporting we need to keep the lists and remove the
4608         lists for longer than required.
4609
4610         This optimization was triggered by Paolo profiling the compiler
4611         speed on the output of `gen-sample-program.pl' perl script. 
4612
4613         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
4614         not crash in methods like MemberLookupFailed that use this field.  
4615
4616         This problem arises when the compiler fails to resolve a type
4617         during interface type definition for example.
4618
4619 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
4620
4621         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
4622         inherit from System.Object, so we have to stop at null, not only
4623         when reaching System.Object.
4624
4625 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
4626
4627         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
4628         DeclaredOnly because the parent indexer might have had a different
4629         name, but did not loop until the top of the hierarchy was reached.
4630
4631         The problem this one fixes is 35492: when a class implemented an
4632         indexer from an interface, we were getting the interface method
4633         (which was abstract) and we were flagging an error (can not invoke
4634         abstract method).
4635
4636         This also keeps bug 33089 functioning, and test-148 functioning.
4637
4638         * typemanager.cs (IsSpecialMethod): The correct way of figuring
4639         out if a method is special is to see if it is declared in a
4640         property or event, or whether it is one of the predefined operator
4641         names.   This should fix correctly #36804.
4642
4643 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
4644
4645         The goal here is to remove the dependency on EmptyCast.Peel ().
4646         Killing it completely.
4647
4648         The problem is that currently in a number of places where
4649         constants are expected, we have to "probe" for an EmptyCast, and
4650         Peel, which is not the correct thing to do, as this will be
4651         repetitive and will likely lead to errors. 
4652
4653         The idea is to remove any EmptyCasts that are used in casts that
4654         can be reduced to constants, so we only have to cope with
4655         constants. 
4656
4657         This bug hunt was triggered by Bug 37363 and the desire to remove
4658         the duplicate pattern where we were "peeling" emptycasts to check
4659         whether they were constants.  Now constants will always be
4660         constants.
4661
4662         * ecore.cs: Use an enumconstant here instead of wrapping with
4663         EmptyCast.  
4664
4665         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
4666         throwing me off.  By handling this we can get rid of a few hacks.
4667
4668         * statement.cs (Switch): Removed Peel() code.
4669
4670 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
4671
4672         * class.cs: Location information for error 508
4673
4674         * expression.cs (New.DoResolve): Add a guard against double
4675         resolution of an expression.  
4676
4677         The New DoResolve might be called twice when initializing field
4678         expressions (see EmitFieldInitializers, the call to
4679         GetInitializerExpression will perform a resolve on the expression,
4680         and later the assign will trigger another resolution
4681
4682         This leads to bugs (#37014)
4683
4684         * delegate.cs: The signature for EndInvoke should contain any ref
4685         or out parameters as well.  We were not doing this in the past. 
4686
4687         * class.cs (Field.Define): Do not overwrite the type definition
4688         inside the `volatile' group.  Turns out that volatile enumerations
4689         were changing the type here to perform a validity test, which
4690         broke conversions. 
4691
4692 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
4693
4694         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
4695         and structs, we do not want to load the instance variable
4696
4697         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
4698         enum_type has to be handled like an object reference (implicit
4699         conversions exists from this to object), but the regular IsClass
4700         and IsValueType tests will never return true for this one.
4701
4702         Also we use TypeManager.IsValueType instead of type.IsValueType,
4703         just for consistency with the rest of the code (this is only
4704         needed if we ever use the construct exposed by test-180.cs inside
4705         corlib, which we dont today).
4706
4707 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
4708
4709         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
4710         just InternalCall.
4711
4712 2003-02-09  Martin Baulig  <martin@ximian.com>
4713
4714         * namespace.cs (Namespace..ctor): Added SourceFile argument.
4715         (Namespace.DefineNamespaces): New static public method; this is
4716         called when we're compiling with debugging to add all namespaces
4717         to the symbol file.
4718
4719         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
4720         pass it to the Namespace's .ctor.
4721
4722         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
4723         and MethodBase arguments; pass the namespace ID to the symwriter;
4724         pass the MethodBase instead of the token to the symwriter.
4725         (SymbolWriter.DefineNamespace): New method to add a namespace to
4726         the symbol file.
4727
4728 2003-02-09  Martin Baulig  <martin@ximian.com>
4729
4730         * symbolwriter.cs: New file.  This is a wrapper around
4731         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
4732         methods here in near future.
4733
4734 2003-02-09  Martin Baulig  <martin@ximian.com>
4735
4736         * codegen.cs (EmitContext.Mark): Just pass the arguments to
4737         ILGenerator.MarkSequencePoint() which are actually used by the
4738         symbol writer.
4739
4740 2003-02-09  Martin Baulig  <martin@ximian.com>
4741
4742         * location.cs (SourceFile): New public sealed class.  This
4743         contains the name and an index which is used in the location's token.
4744         (Location): Reserve an appropriate number of bits in the token for
4745         the source file instead of walking over that list, this gives us a
4746         really huge performance improvement when compiling with debugging.
4747
4748         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
4749         `SourceFile' argument instead of a string.
4750         (Driver.ProcessFile): Add all the files via Location.AddFile(),
4751         but don't parse/tokenize here, we need to generate the list of all
4752         source files before we do that.
4753         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
4754         the files.
4755
4756         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
4757         instead of a string.
4758
4759         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
4760         of a string.
4761
4762 2003-02-09  Martin Baulig  <martin@ximian.com>
4763
4764         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
4765         filename on `#line default'.
4766
4767 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
4768
4769         * statement.cs: don't clear the pinned var when the fixed statement
4770         returns from the method (fixes bug#37752).
4771
4772 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
4773
4774         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
4775         to IsValueType.
4776
4777 2003-02-07  Martin Baulig  <martin@ximian.com>
4778
4779         * driver.cs: Removed the `--debug-args' command line argument.
4780
4781         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
4782         automatically by the AsssemblyBuilder.
4783         (CodeGen.InitializeSymbolWriter): We don't need to call any
4784         initialization function on the symbol writer anymore.  This method
4785         doesn't take any arguments.
4786
4787 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
4788
4789         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
4790         from referenced assemblies as well.
4791
4792 2003-02-02  Martin Baulig  <martin@ximian.com>
4793
4794         * class.cs (MethodData.Emit): Generate debugging info for external methods.
4795
4796 2003-02-02  Martin Baulig  <martin@ximian.com>
4797
4798         * class.cs (Constructor.Emit): Open the symbol writer before
4799         emitting the constructor initializer.
4800         (ConstructorInitializer.Emit): Call ec.Mark() to allow
4801         single-stepping through constructor initializers.
4802
4803 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
4804
4805         * class.cs: Handle error 549: do not allow virtual methods in
4806         sealed classes. 
4807
4808 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
4809
4810         * decl.cs: Check access levels when resolving types
4811
4812 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
4813
4814         * statement.cs: Add parameters and locals set in catch blocks that might 
4815         return to set vector
4816
4817 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
4818
4819         * class.cs (Operator): Set the SpecialName flags for operators.
4820
4821         * expression.cs (Invocation.DoResolve): Only block calls to
4822         accessors and operators on SpecialName methods.
4823
4824         (Cast.TryReduce): Handle conversions from char constants.
4825
4826
4827 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
4828
4829         * statement.cs: small memory and time optimization in FlowBranching.
4830
4831 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
4832
4833         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
4834         problem that the last fix but in the other sid (Set).
4835
4836         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
4837         access when there is no indexer in the hierarchy.
4838
4839 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
4840
4841         * class.cs: Combine some if statements.
4842
4843 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4844
4845         * driver.cs: fixed bug #37187.
4846
4847 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
4848
4849         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
4850         any indexer, it's needed to build a list with all the indexers in the
4851         hierarchy (AllGetters), else we have problems. Fixes #35653.
4852
4853 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
4854
4855         * class.cs (MethodData.Define): It is wrong for an interface
4856         implementation to be static in both cases: explicit and implicit.
4857         We were only handling this in one case.
4858
4859         Improve the if situation there to not have negations.
4860
4861         * class.cs (Field.Define): Turns out that we do not need to check
4862         the unsafe bit on field definition, only on usage.  Remove the test.
4863
4864 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4865
4866         * driver.cs: use assembly.Location instead of Codebase (the latest
4867         patch made mcs fail when using MS assemblies).
4868
4869 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
4870
4871         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
4872         get the path to *corlib.dll.
4873
4874 2003-01-21  Nick Drochak <ndrochak@gol.com>
4875
4876         * cs-tokenizer.cs:
4877         * pending.cs:
4878         * typemanager.cs: Remove compiler warnings
4879
4880 2003-01-20  Duncan Mak  <duncan@ximian.com>
4881
4882         * AssemblyInfo.cs: Bump the version number to 0.19.
4883
4884 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4885
4886         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
4887
4888 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
4889
4890         * class.cs (Constructor::Emit): Emit debugging info for constructors.
4891
4892 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
4893
4894         * cs-parser.jay: Small fix: we were not comparing the constructor
4895         name correctly.   Thanks to Zoltan for the initial pointer.
4896
4897 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
4898
4899         * cs-tokenizer.cs: Set file name when specified with #line
4900
4901 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
4902
4903         * cs-parser.jay: Only perform the constructor checks here if we
4904         are named like the class;  This will help provider a better
4905         error.  The constructor path is taken when a type definition is
4906         not found, but most likely the user forgot to add the type, so
4907         report that rather than the constructor error.
4908
4909 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
4910
4911         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
4912         allocations.
4913
4914 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
4915
4916         * cs-parser.jay: Add cleanup call.
4917
4918 2003-01-13  Duncan Mak  <duncan@ximian.com>
4919
4920         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
4921         consistent with other methods.
4922
4923 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
4924
4925         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
4926
4927 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
4928
4929         * attribute.cs: only set GuidAttr to true when we have a
4930         GuidAttribute.
4931
4932 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4933
4934         * ecore.cs:
4935         * expression.cs:
4936         * typemanager.cs: fixes to allow mcs compile corlib with the new
4937         Type.IsSubclassOf fix.
4938
4939 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
4940
4941         * expression.cs (LocalVariableReference.DoResolve): Classify a
4942         constant as a value, not as a variable.   Also, set the type for
4943         the variable.
4944
4945         * cs-parser.jay (fixed_statement): take a type instead of a
4946         pointer_type, so we can produce a better error message later.
4947
4948         * statement.cs (Fixed.Resolve): Flag types that are not pointers
4949         as an error.  
4950
4951         (For.DoEmit): Make inifinite loops have a
4952         non-conditional branch back.
4953
4954         (Fixed.DoEmit): First populate the pinned variables, then emit the
4955         statement, then clear the variables.  Before I was emitting the
4956         code once for each fixed piece.
4957
4958
4959 2003-01-08  Martin Baulig  <martin@ximian.com>
4960
4961         * statement.cs (FlowBranching.MergeChild): A break in a
4962         SWITCH_SECTION does not leave a loop.  Fixes #36155.
4963
4964 2003-01-08  Martin Baulig  <martin@ximian.com>
4965
4966         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
4967         lives in the same number space than `param_map'.  Fixes #36154.
4968
4969 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
4970
4971         * cs-parser.jay (constructor_declaration): Set the
4972         Constructor.ModFlags before probing for it.  This makes the
4973         compiler report 514, 515 and 132 (the code was there, but got
4974         broken). 
4975
4976         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
4977         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
4978         (GotoCase.Resolve): Set `Returns' to ALWAYS.
4979
4980 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
4981
4982         * enum.cs: create the enum static fields using the enum type.
4983
4984 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
4985
4986         * class.cs: don't try to create the ParamBuilder for the return
4987         type if it's not needed (and handle it breaking for the ms runtime
4988         anyway).
4989
4990 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
4991
4992         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
4993
4994 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
4995
4996         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
4997         the command.   This showed up while compiling the JANET source
4998         code, which used \r as its only newline separator.
4999
5000 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
5001
5002         * class.cs (Method.Define): If we are an operator (because it
5003         reuses our code), then set the SpecialName and HideBySig.  #36128
5004
5005 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
5006
5007         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
5008         exception, report error 120 `object reference required'.
5009
5010         * driver.cs: Add --pause option, used during to measure the size
5011         of the process as it goes with --timestamp.
5012
5013         * expression.cs (Invocation.DoResolve): Do not allow methods with
5014         SpecialName to be invoked.
5015
5016 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
5017
5018         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
5019         number before adding it.
5020
5021 2002-12-21  Ravi Pratap  <ravi@ximian.com>
5022
5023         * ecore.cs (StandardImplicitConversion): When in an unsafe
5024         context, we allow conversion between void * to any other pointer
5025         type. This fixes bug #35973.
5026
5027 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
5028
5029         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
5030         is not thrown when extensionless outputs are used 
5031
5032 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5033
5034         * rootcontext.cs: fixed compilation of corlib.
5035
5036 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
5037
5038         * attribute.cs (Attributes.Contains): Add new method.
5039
5040         * class.cs (MethodCore.LabelParameters): if the parameter is an
5041         `out' parameter, check that no attribute `[In]' has been passed.
5042
5043         * enum.cs: Handle the `value__' name in an enumeration.
5044
5045 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
5046
5047         * decl.cs: Added special case to allow overrides on "protected
5048         internal" methods
5049
5050 2002-12-18  Ravi Pratap  <ravi@ximian.com>
5051
5052         * attribute.cs (Attributes.AddAttributeSection): Rename to this
5053         since it makes much more sense.
5054
5055         (Attributes.ctor): Don't require a Location parameter.
5056
5057         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
5058
5059         * attribute.cs (ApplyAttributes): Remove extra Location parameters
5060         since we already have that information per attribute.
5061
5062         * everywhere : make appropriate changes.
5063
5064         * class.cs (LabelParameters): Write the code which actually
5065         applies attributes to the return type. We can't do this on the MS
5066         .NET runtime so we flag a warning in the case an exception is
5067         thrown.
5068
5069 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
5070
5071         * const.cs: Handle implicit null conversions here too.
5072
5073 2002-12-17  Ravi Pratap  <ravi@ximian.com>
5074
5075         * class.cs (MethodCore.LabelParameters): Remove the extra
5076         Type [] parameter since it is completely unnecessary. Instead
5077         pass in the method's attributes so that we can extract
5078         the "return" attribute.
5079
5080 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
5081
5082         * cs-parser.jay (parse): Use Report.Error to flag errors instead
5083         of ignoring it and letting the compile continue.
5084
5085         * typemanager.cs (ChangeType): use an extra argument to return an
5086         error condition instead of throwing an exception.
5087
5088 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
5089
5090         * expression.cs (Unary.TryReduce): mimic the code for the regular
5091         code path.  Perform an implicit cast in the cases where we can
5092         implicitly convert to one of the integral types, and then reduce
5093         based on that constant.   This fixes bug #35483.
5094
5095 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5096
5097         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
5098
5099 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5100
5101         * namespace.cs: fixed bug #35489.
5102
5103 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
5104
5105         * class.cs: Remove some dead code.
5106
5107         * cs-parser.jay: Estimate the number of methods needed
5108         (RootContext.MethodCount);
5109
5110         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
5111         numbers instead of StringBuilders.
5112
5113         * support.cs (PtrHashtable): Add constructor with initial size;
5114         We can now reduce reallocations of the method table.
5115
5116 2002-12-10  Ravi Pratap  <ravi@ximian.com>
5117
5118         * attribute.cs (ApplyAttributes): Keep track of the emitted
5119         attributes on a per-target basis. This fixes bug #35413.
5120
5121 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
5122
5123         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
5124         default to the Windows 1252 encoding.
5125
5126         (UnixParseOption): Support version, thanks to Alp for the missing
5127         pointer. 
5128
5129         * AssemblyInfo.cs: Add nice assembly information.
5130
5131         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
5132         (bug 35169).
5133
5134         * cs-parser.jay: Allow a trailing comma before the close bracked
5135         in the attribute_section production.
5136
5137         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
5138         address of the instance was being taken, I will take this out,
5139         because we take the address of the object immediately here.
5140
5141 2002-12-09  Ravi Pratap  <ravi@ximian.com>
5142
5143         * typemanager.cs (AreMultipleAllowed): Take care of the most
5144         obvious case where attribute type is not in the current assembly -
5145         stupid me ;-)
5146
5147 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
5148
5149         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
5150         definitions, instead of doing that afterwards.  
5151
5152         Also we use a nice little hack, depending on the constructor, we
5153         know if we are a "composed" name or a simple name.  Hence, we
5154         avoid the IndexOf test, and we avoid 
5155
5156         * codegen.cs: Add code to assist in a bug reporter to track down
5157         the source of a compiler crash. 
5158
5159 2002-12-07  Ravi Pratap  <ravi@ximian.com>
5160
5161         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
5162         types have been emitted for a given element and flag an error
5163         if something which does not have AllowMultiple set is used more
5164         than once.
5165
5166         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
5167         attribute types and their corresponding AllowMultiple properties
5168
5169         (AreMultipleAllowed): Check the property for a given type.
5170
5171         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
5172         property in the case we have a TypeContainer.
5173
5174         (Attributes.AddAttribute): Detect duplicates and just skip on
5175         adding them. This trivial fix catches a pretty gross error in our
5176         attribute emission - global attributes were being emitted twice!
5177
5178         Bugzilla bug #33187 is now fixed.
5179
5180 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
5181
5182         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
5183         instead of pp_and).
5184
5185         * expression.cs (Binary.ResolveOperator): I can only use the
5186         Concat (string, string, string) and Concat (string, string,
5187         string, string) if the child is actually a concatenation of
5188         strings. 
5189
5190 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
5191
5192         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
5193         context where we need a 2-character lookahead.
5194
5195         * pending.cs (PendingImplementation): Rework so we can keep track
5196         of interface types all the time, and flag those which were
5197         implemented by parents as optional.
5198
5199 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
5200
5201         * expression.cs (Binary.ResolveOperator): Use
5202         String.Concat(string,string,string) or
5203         String.Concat(string,string,string,string) when possible. 
5204
5205         * typemanager: More helper methods.
5206
5207
5208 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
5209
5210         * pending.cs: remove the bogus return from GetMissingInterfaces()
5211         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
5212
5213 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5214
5215         * namespace.cs: avoid duplicated 'using xxx' being added to
5216         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
5217         when we get more than one 'using' statement for the same namespace.
5218         Report a CS0105 warning for it.
5219
5220 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
5221
5222         * cs-tokenizer.cs (consume_identifier): use read directly, instead
5223         of calling getChar/putback, uses internal knowledge of it.    
5224
5225         (xtoken): Reorder tokenizer so most common patterns are checked
5226         first.  This reduces the compilation time in another 5% (from 8.11s
5227         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
5228
5229         The parsing time is 22% of the compilation in mcs, and from that
5230         64% is spent on the tokenization process.  
5231
5232         I tried using a binary search for keywords, but this is slower
5233         than the hashtable.  Another option would be to do a couple of
5234         things:
5235
5236                 * Not use a StringBuilder, instead use an array of chars,
5237                   with a set value.  Notice that this way we could catch
5238                   the 645 error without having to do it *afterwards*.
5239
5240                 * We could write a hand-parser to avoid the hashtable
5241                   compares altogether.
5242
5243         The identifier consumption process takes 37% of the tokenization
5244         time.  Another 15% is spent on is_number.  56% of the time spent
5245         on is_number is spent on Int64.Parse:
5246
5247                 * We could probably choose based on the string length to
5248                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
5249                   computations. 
5250
5251         Another 3% is spend on wrapping `xtoken' in the `token' function.
5252
5253         Handle 0xa0 as whitespace (#34752)
5254
5255 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
5256
5257         * typemanager.cs (IsCLRType): New routine to tell whether a type
5258         is one of the builtin types.  
5259
5260         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
5261         typecode in more places instead of doing pointer comparissions.
5262         We could leverage some knowledge about the way the typecodes are
5263         laid out.
5264
5265         New code to cache namespaces in assemblies, it is currently not
5266         invoked, to be used soon.
5267
5268         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
5269
5270         * expression.cs (Binary.ResolveOperator): specially handle
5271         strings, and do not perform user-defined operator overloading for
5272         built-in types.
5273
5274 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
5275
5276         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
5277         internalcall as it is a pretty simple operation;  Avoid whenever
5278         possible to call Char.IsLetter.
5279
5280         (consume_identifier): Cut by half the number of
5281         hashtable calls by merging the is_keyword and GetKeyword behavior.
5282
5283         Do not short-circuit, because if we do, we
5284         report errors (ie, #if false && true would produce an invalid
5285         directive error);
5286
5287
5288 2002-11-24  Martin Baulig  <martin@ximian.com>
5289
5290         * expression.cs (Cast.TryReduce): If we're in checked syntax,
5291         check constant ranges and report a CS0221.  Fixes #33186.
5292
5293 2002-11-24  Martin Baulig  <martin@ximian.com>
5294
5295         * cs-parser.jay: Make this work for uninitialized variable
5296         declarations in the `for' initializer.  Fixes #32416.
5297
5298 2002-11-24  Martin Baulig  <martin@ximian.com>
5299
5300         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
5301         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
5302
5303 2002-11-24  Martin Baulig  <martin@ximian.com>
5304
5305         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
5306         argument; if true, we also check for user-defined conversions.
5307         This is only needed if both arguments are of a user-defined type.
5308         Fixes #30443, added test-175.cs.
5309         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
5310
5311         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
5312
5313 2002-11-24  Martin Baulig  <martin@ximian.com>
5314
5315         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
5316         function to get the store opcode.
5317         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
5318         only emit the Ldelema if the store opcode is Stobj.  You must run
5319         both test-34 and test-167 to test this.  Fixes #34529.
5320
5321 2002-11-23  Martin Baulig  <martin@ximian.com>
5322
5323         * ecore.cs (Expression.MemberLookup): Added additional
5324         `qualifier_type' argument which is used when we're being called
5325         from MemberAccess.DoResolve() and null if we're called from a
5326         SimpleName lookup.
5327         (Expression.MemberLookupFailed): New method to report errors; this
5328         does the CS1540 check and reports the correct error message.
5329
5330         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
5331         argument for the CS1540 check and redone the way how we're dealing
5332         with private members.  See the comment in the source code for details.
5333         (FilterWithClosure): Reverted this back to revision 1.197; renamed
5334         `closure_start_type' to `closure_qualifier_type' and check whether
5335         it's not null.  It was not this filter being broken, it was just
5336         being called with the wrong arguments.
5337
5338         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
5339         and pass it the correct `qualifier_type'; this also does the error
5340         handling for us.
5341
5342 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
5343
5344         * expression.cs (Invocation.EmitParams): If the we are dealing
5345         with a non-built-in value type, load its address as well.
5346
5347         (ArrayCreation): Use a a pretty constant instead
5348         of the hardcoded value 2.   Use 6 instead of 2 for the number of
5349         static initializers.  
5350
5351         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
5352         because they are not really value types, just glorified integers. 
5353
5354         * driver.cs: Do not append .exe, the CSC compiler does not do it.
5355
5356         * ecore.cs: Remove redundant code for enumerations, make them use
5357         the same code path as everything else, fixes the casting issue
5358         with enumerations in Windows.Forms.
5359
5360         * attribute.cs: Do only cast to string if it is a string, the
5361         validation happens later.
5362
5363         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
5364         people upgrade their corlibs.
5365
5366         * ecore.cs: Oops, enumerations were not following the entire code path
5367
5368 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
5369
5370         * typemanager.cs (FilterWithClosure): Commented out the test for
5371         1540 in typemanager.cs, as it has problems when accessing
5372         protected methods from a parent class (see test-174.cs). 
5373
5374         * attribute.cs (Attribute.ValidateGuid): new method.
5375         (Attribute.Resolve): Use above.
5376
5377 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
5378
5379         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
5380
5381         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
5382         handling for enumerations, as we only needed the TypeContainer
5383         functionality to begin with (this is required for the fix below to
5384         work for enums that reference constants in a container class for
5385         example). 
5386
5387         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
5388
5389         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
5390         a valid TypeBuilder to perform lookups on.o
5391
5392         * class.cs (InheritableMemberSignatureCompare): Use true in the
5393         call to GetGetMethod and GetSetMethod, because we are comparing
5394         the signature, and we need to get the methods *even* if they are
5395         private. 
5396
5397         (PropertyBase.CheckBase): ditto.
5398
5399         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
5400         GotoCase.Resolve): Use Peel on EmpytCasts.
5401
5402         * ecore.cs (EmptyCast): drop child, add Peel method.
5403
5404 2002-11-17  Martin Baulig  <martin@ximian.com>
5405
5406         * ecore.cs (EmptyCast.Child): New public property.
5407
5408         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
5409         label resolved to an EmptyCast.  Fixes #34162.
5410         (GotoCase.Resolve): Likewise.
5411         (Block.EmitMeta): Likewise.
5412
5413 2002-11-17  Martin Baulig  <martin@ximian.com>
5414
5415         * expression.cs (Invocation.BetterConversion): Prefer int over
5416         uint; short over ushort; long over ulong for integer literals.
5417         Use ImplicitConversionExists instead of StandardConversionExists
5418         since we also need to check for user-defined implicit conversions.
5419         Fixes #34165.  Added test-173.cs.
5420
5421 2002-11-16  Martin Baulig  <martin@ximian.com>
5422
5423         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
5424         with the `true' and `false' literals.  Fixes #33151.
5425
5426 2002-11-16  Martin Baulig  <martin@ximian.com>
5427
5428         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
5429         October 22nd; don't do the cs1540 check for static members.
5430
5431         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
5432         now using our own filter here and doing the cs1540 check again.
5433
5434 2002-11-16  Martin Baulig  <martin@ximian.com>
5435
5436         * support.cs (InternalParameters): Don't crash if we don't have
5437         any fixed parameters.  Fixes #33532.
5438
5439 2002-11-16  Martin Baulig  <martin@ximian.com>
5440
5441         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
5442         when looking up static methods to make this work on Windows.
5443         Fixes #33773.
5444
5445 2002-11-16  Martin Baulig  <martin@ximian.com>
5446
5447         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
5448         a setter rather than using PropertyInfo.CanWrite.
5449
5450 2002-11-15  Nick Drochak  <ndrochak@gol.com>
5451
5452         * class.cs: Allow acces to block member by subclasses. Fixes build
5453         breaker.
5454
5455 2002-11-14  Martin Baulig  <martin@ximian.com>
5456
5457         * class.cs (Constructor.Emit): Added the extern/block check.
5458         Fixes bug #33678.
5459
5460 2002-11-14  Martin Baulig  <martin@ximian.com>
5461
5462         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
5463         iteration while looking for indexers, this is needed because the
5464         indexer may have a different name in our base classes.  Fixed the
5465         error reporting (no indexers at all, not get accessor, no
5466         overloaded match).  Fixes bug #33089.
5467         (IndexerAccess.DoResolveLValue): Likewise.
5468
5469 2002-11-14  Martin Baulig  <martin@ximian.com>
5470
5471         * class.cs (PropertyBase.CheckBase): Make this work for multiple
5472         indexers.  Fixes the first part of bug #33089.
5473         (MethodSignature.InheritableMemberSignatureCompare): Added support
5474         for properties.
5475
5476 2002-11-13  Ravi Pratap  <ravi@ximian.com>
5477
5478         * attribute.cs (Attribute.Resolve): Catch the
5479         NullReferenceException and report it since it isn't supposed to
5480         happen. 
5481
5482 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
5483
5484         * expression.cs (Binary.EmitBranchable): Also handle the cases for
5485         LogicalOr and LogicalAnd that can benefit from recursively
5486         handling EmitBranchable.  The code now should be nice for Paolo.
5487
5488 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
5489
5490         * typemanager.cs (LookupType): Added a negative-hit hashtable for
5491         the Type lookups, as we perform quite a number of lookups on
5492         non-Types.  This can be removed once we can deterministically tell
5493         whether we have a type or a namespace in advance.
5494
5495         But this might require special hacks from our corlib.
5496
5497         * TODO: updated.
5498
5499         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
5500         and double which avoids a conversion from an integer to a double.
5501
5502         * expression.cs: tiny optimization, avoid calling IsConstant,
5503         because it effectively performs the lookup twice.
5504
5505 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
5506
5507         But a bogus return here to keep the semantics of the old code
5508         until the Mono runtime is fixed.
5509
5510         * pending.cs (GetMissingInterfaces): New method used to remove all
5511         the interfaces that are already implemented by our parent
5512         classes from the list of pending methods. 
5513
5514         * interface.cs: Add checks for calls after ResolveTypeExpr.
5515
5516 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
5517
5518         * class.cs (Class.Emit): Report warning 67: event not used if the
5519         warning level is beyond 3.
5520
5521         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
5522         being a NullLiteral.
5523
5524         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
5525         specifiers. 
5526
5527         * class.cs (TypeContainer.GetClassBases): Cover a missing code
5528         path that might fail if a type can not be resolved.
5529
5530         * expression.cs (Binary.Emit): Emit unsigned versions of the
5531         operators. 
5532
5533         * driver.cs: use error 5.
5534
5535 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
5536
5537         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
5538
5539 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
5540
5541         * cs-parser.jay (switch_section): A beautiful patch from Martin
5542         Baulig that fixed 33094.
5543
5544 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
5545
5546         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
5547         Check whether the base is abstract and report an error if so.
5548
5549         * expression.cs (IndexerAccess.DoResolveLValue,
5550         IndexerAccess.DoResolve): ditto. 
5551
5552         (Invocation.DoResolve): ditto.
5553
5554         (Invocation.FullMethodDesc): Improve the report string.
5555
5556         * statement.cs (Block): Eliminate IsVariableDefined as it is
5557         basically just a wrapper for GetVariableInfo.
5558
5559         * ecore.cs (SimpleName): Use new 
5560
5561         * support.cs (ReflectionParamter.ParameterType): We unwrap the
5562         type, as we return the actual parameter ref/unref state on a
5563         different call.
5564
5565 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
5566
5567         * support.cs: Return proper flags REF/OUT fixing the previous
5568         commit.  
5569
5570         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
5571         not used to mean `ref' but `ref or out' in ParameterReference
5572
5573         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
5574         full type signature instead of calling TypeManger.CSharpName
5575         ourselves. 
5576
5577         * support.cs (InternalParameters.ParameterDesc): Do not compare
5578         directly to the modflags, because REF/OUT will actually be bitsets
5579         if set. 
5580
5581         * delegate.cs (VerifyMethod): Check also the modifiers.
5582
5583         * cs-tokenizer.cs: Fix bug where floating point values with an
5584         exponent where a sign was missing was ignored.
5585
5586         * driver.cs: Allow multiple assemblies to be specified in a single
5587         /r: argument
5588
5589 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
5590
5591         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
5592         because identifiers after a parenthesis would end up in this kind
5593         of production, and we needed to desamiguate it for having casts
5594         like:
5595
5596                 (UserDefinedType *) xxx
5597
5598 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
5599
5600         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
5601         we should set on the Bindingflags.NonPublic, but not turn on
5602         private_ok.  private_ok controls whether a Private member is
5603         returned (this is chekced on the filter routine), while the
5604         BindingFlags.NonPublic just controls whether private/protected
5605         will be allowed.   This fixes the problem part of the problem of
5606         private properties being allowed to be used in derived classes.
5607
5608         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
5609         so we can call the children DoResolveLValue method (this will
5610         properly signal errors on lvalue assignments to base properties)
5611
5612         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
5613         getter are null, and we have a property info, we know that this
5614         happened because the lookup failed, so we report an error 122 for
5615         protection level violation.
5616
5617         We also silently return if setter and getter are null in the
5618         resolve functions, this condition only happens if we have flagged
5619         the error before.  This is the other half of the problem. 
5620
5621         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
5622         not have accessibility information, that is why we were returning
5623         true in the filter function in typemanager.cs.
5624
5625         To properly report 122 (property is inaccessible because of its
5626         protection level) correctly, we report this error in ResolveAccess
5627         by failing if both the setter and the getter are lacking (ie, the
5628         lookup failed). 
5629
5630         DoResolve and DoLResolve have been modified to check for both
5631         setter/getter being null and returning silently, the reason being
5632         that I did not want to put the knowledge about this error in upper
5633         layers, like:
5634
5635         int old = Report.Errors;
5636         x = new PropertyExpr (...);
5637         if (old != Report.Errors)
5638                 return null;
5639         else
5640                 return x;
5641
5642         So the property expr is returned, but it is invalid, so the error
5643         will be flagged during the resolve process. 
5644
5645         * class.cs: Remove InheritablePropertySignatureCompare from the
5646         class, as we no longer depend on the property signature to compute
5647         whether it is possible to implement a method or not.
5648
5649         The reason is that calling PropertyInfo.GetGetMethod will return
5650         null (in .NET, in Mono it works, and we should change this), in
5651         cases where the Get Method does not exist in that particular
5652         class.
5653
5654         So this code:
5655
5656         class X { public virtual int A { get { return 1; } } }
5657         class Y : X { }
5658         class Z : Y { public override int A { get { return 2; } } }
5659
5660         Would fail in Z because the parent (Y) would not have the property
5661         defined.  So we avoid this completely now (because the alternative
5662         fix was ugly and slow), and we now depend exclusively on the
5663         method names.
5664
5665         (PropertyBase.CheckBase): Use a method-base mechanism to find our
5666         reference method, instead of using the property.
5667
5668         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
5669         routines are gone now.
5670
5671         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
5672         names, they were incorrectly named.
5673
5674         * cs-tokenizer.cs: Return are more gentle token on failure. 
5675
5676         * pending.cs (PendingImplementation.InterfaceMethod): This routine
5677         had an out-of-sync index variable, which caused it to remove from
5678         the list of pending methods the wrong method sometimes.
5679
5680 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
5681
5682         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
5683         CanWrite, because those refer to this particular instance of the
5684         property, and do not take into account the fact that we can
5685         override single members of a property.
5686
5687         Constructor requires an EmitContext.  The resolution process does
5688         not happen here, but we need to compute the accessors before,
5689         because the resolution does not always happen for properties.
5690
5691         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
5692         subclass, before we did not update this flag, but we did update
5693         bindingflags. 
5694
5695         (GetAccessors): Drop this routine, as it did not work in the
5696         presence of partially overwritten set/get methods. 
5697
5698         Notice that this broke the cs1540 detection, but that will require
5699         more thinking. 
5700
5701 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5702
5703         * class.cs:
5704         * codegen.cs:
5705         * driver.cs: issue a warning instead of an error if we don't support
5706         debugging for the platform. Also ignore a couple of errors that may
5707         arise when trying to write the symbols. Undo my previous patch.
5708
5709 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5710
5711         * driver.cs: ignore /debug switch except for Unix platforms.
5712
5713 2002-10-23  Nick Drochak  <ndrochak@gol.com>
5714
5715         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
5716
5717 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
5718
5719         * driver.cs: Do not make mcs-debug conditional, so we do not break
5720         builds that use it.
5721
5722         * statement.cs (UsageVector.MergeChildren): I would like Martin to
5723         review this patch.  But basically after all the children variables
5724         have been merged, the value of "Breaks" was not being set to
5725         new_breaks for Switch blocks.  I think that it should be set after
5726         it has executed.  Currently I set this to the value of new_breaks,
5727         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
5728         conservative, but I do not understand this code very well.
5729
5730         I did not break anything in the build, so that is good ;-)
5731
5732         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
5733
5734 2002-10-20  Mark Crichton  <crichton@gimp.org>
5735
5736         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
5737
5738 2002-10-20  Nick Drochak  <ndrochak@gol.com>
5739
5740         * cfold.cs: Fixed compile blocker.
5741
5742 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
5743
5744         * driver.cs: I was chekcing the key, not the file.
5745
5746 2002-10-19  Ravi Pratap  <ravi@ximian.com>
5747
5748         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
5749         message that we were generating - we just need to silently return
5750         a null.
5751
5752 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
5753
5754         * class.cs (Event.Define): Change my previous commit, as this
5755         breaks the debugger.  This is a temporary hack, as it seems like
5756         the compiler is generating events incorrectly to begin with.
5757
5758         * expression.cs (Binary.ResolveOperator): Added support for 
5759         "U operator - (E x, E y)"
5760
5761         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
5762         y)".
5763
5764         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
5765         init-only variables, but this path did not take into account that
5766         there might be also instance readonly variables.  Correct this
5767         problem. 
5768
5769         This fixes bug 32253
5770
5771         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
5772         delegates as well.
5773
5774         * driver.cs: Change the extension for modules to `netmodule'
5775
5776         * cs-parser.jay: Improved slightly the location tracking for
5777         the debugger symbols.
5778
5779         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
5780         modifiers that were specified instead of the hardcoded value
5781         (FamAndAssem).  This was basically ignoring the static modifier,
5782         and others.  Fixes 32429.
5783
5784         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
5785         fixed a bug in the process (32476)
5786
5787         * expression.cs (ArrayAccess.EmitAssign): Patch from
5788         hwang_rob@yahoo.ca that fixes bug 31834.3
5789
5790 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
5791
5792         * driver.cs: Make the module extension .netmodule.
5793
5794 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
5795
5796         * driver.cs: Report an error if the resource file is not found
5797         instead of crashing.
5798
5799         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
5800         false, like Emit does.
5801
5802 2002-10-16  Nick Drochak  <ndrochak@gol.com>
5803
5804         * typemanager.cs: Remove unused private member.  Also reported mcs
5805         bug to report this as a warning like csc.
5806
5807 2002-10-15  Martin Baulig  <martin@gnome.org>
5808
5809         * statement.cs (Statement.Emit): Made this a virtual method; emits
5810         the line number info and calls DoEmit().
5811         (Statement.DoEmit): New protected abstract method, formerly knows
5812         as Statement.Emit().
5813
5814         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
5815
5816 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
5817
5818         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
5819         have fixed a remaining problem: not every AddXXXX was adding a
5820         fully qualified name.  
5821
5822         Now everyone registers a fully qualified name in the DeclSpace as
5823         being defined instead of the partial name.  
5824
5825         Downsides: we are slower than we need to be due to the excess
5826         copies and the names being registered this way.  
5827
5828         The reason for this is that we currently depend (on the corlib
5829         bootstrap for instance) that types are fully qualified, because
5830         we dump all the types in the namespace, and we should really have
5831         types inserted into the proper namespace, so we can only store the
5832         basenames in the defined_names array.
5833
5834 2002-10-10  Martin Baulig  <martin@gnome.org>
5835
5836         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
5837         from bug #31834, see the bug report for a testcase which is
5838         miscompiled.
5839
5840 2002-10-10  Martin Baulig  <martin@gnome.org>
5841
5842         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
5843         flow analysis code for this.
5844
5845         * statement.cs (Do, While, For): Tell the flow analysis code about
5846         infinite loops.
5847         (FlowBranching.UsageVector): Added support for infinite loops.
5848         (Block.Resolve): Moved the dead code elimination here and use flow
5849         analysis to do it.
5850
5851 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
5852
5853         * class.cs (Field.Define): Catch cycles on struct type
5854         definitions. 
5855
5856         * typemanager.cs (IsUnmanagedtype): Do not recursively check
5857         fields if the fields are static.  We only need to check instance
5858         fields. 
5859
5860         * expression.cs (As.DoResolve): Test for reference type.
5861
5862         * statement.cs (Using.ResolveExpression): Use
5863         ConvertImplicitRequired, not ConvertImplicit which reports an
5864         error on failture
5865         (Using.ResolveLocalVariableDecls): ditto.
5866
5867         * expression.cs (Binary.ResolveOperator): Report errors in a few
5868         places where we had to.
5869
5870         * typemanager.cs (IsUnmanagedtype): Finish implementation.
5871
5872 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
5873
5874         * expression.cs: Use StoreFromPtr instead of extracting the type
5875         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
5876
5877         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
5878         an enumeration value to a System.Enum, but System.Enum is not a
5879         value type, but an class type, so we need to box.
5880
5881         (Expression.ConvertExplicit): One codepath could return
5882         errors but not flag them.  Fix this.  Fixes #31853
5883
5884         * parameter.cs (Resolve): Do not allow void as a parameter type.
5885
5886 2002-10-06  Martin Baulig  <martin@gnome.org>
5887
5888         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
5889         if it's a class type and not a struct.  Fixes #31815.
5890
5891 2002-10-06  Martin Baulig  <martin@gnome.org>
5892
5893         * statement.cs: Reworked the flow analysis code a bit to make it
5894         usable for dead code elimination.
5895
5896 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5897
5898         * cs-parser.jay: allow empty source files. Fixes bug #31781.
5899
5900 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
5901
5902         * expression.cs (ComposedCast.DoResolveType): A quick workaround
5903         to fix the test 165, will investigate deeper.
5904
5905 2002-10-04  Martin Baulig  <martin@gnome.org>
5906
5907         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
5908         finally blocks actually work.
5909         (Try.Resolve): We don't need to create a sibling for `finally' if
5910         there is no finally block.
5911
5912 2002-10-04  Martin Baulig  <martin@gnome.org>
5913
5914         * class.cs (Constructor.Define): The default accessibility for a
5915         non-default constructor is private, not public.
5916
5917 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
5918
5919         * class.cs (Constructor): Make AllowedModifiers public, add
5920         EXTERN.
5921
5922         * cs-parser.jay: Perform the modifiers test here, as the
5923         constructor for the Constructor class usually receives a zero
5924         because of the way we create it (first we create, later we
5925         customize, and we were never checking the modifiers).
5926
5927         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
5928         is a version of LookupTypeReflection that includes the type-name
5929         cache.  This can be used as a fast path for functions that know
5930         the fully qualified name and are only calling into *.GetType() to
5931         obtain a composed type.
5932
5933         This is also used by TypeManager.LookupType during its type
5934         composition.
5935
5936         (LookupType): We now also track the real type name, as sometimes
5937         we can get a quey for the real type name from things like
5938         ComposedCast.  This fixes bug 31422.
5939
5940         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
5941         complete type fullname, it does not have to go through the type
5942         resolution system to obtain the composed version of the type (for
5943         obtaining arrays or pointers).
5944
5945         (Conditional.Emit): Use the EmitBoolExpression to
5946         generate nicer code, as requested by Paolo.
5947
5948         (ArrayCreation.CheckIndices): Use the patch from
5949         hwang_rob@yahoo.ca to validate the array initializers. 
5950
5951 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
5952
5953         * class.cs (ConstructorInitializer.Emit): simplify code by using
5954         Invocation.EmitCall, and at the same time, fix the bugs in calling
5955         parent constructors that took variable arguments. 
5956
5957         * ecore.cs (Expression.ConvertNumericExplicit,
5958         Expression.ImplicitNumericConversion): Remove the code that
5959         manually wrapped decimal (InternalTypeConstructor call is now gone
5960         as well).
5961
5962         * expression.cs (Cast.TryReduce): Also handle decimal types when
5963         trying to perform a constant fold on the type.
5964
5965         * typemanager.cs (IsUnmanagedtype): Partially implemented.
5966
5967         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
5968         that only turned off an error report, and did nothing else. 
5969
5970 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
5971
5972         * driver.cs: Handle and ignore /fullpaths
5973
5974 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
5975
5976         * expression.cs (Binary.ResolveOperator): Catch the case where
5977         DoNumericPromotions returns true, 
5978
5979         (Binary.DoNumericPromotions): Simplify the code, and the tests.
5980
5981 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
5982
5983         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
5984         report error 70.
5985
5986 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
5987
5988         * ecore.cs (ConvertNumericExplicit): It is not enough that the
5989         conversion exists, but it is also required that the conversion be
5990         performed.  This manifested in "(Type64Enum) 2".  
5991
5992         * class.cs (TypeManager.AddMethod): The fix is not to change
5993         AddEnum, because that one was using a fully qualified name (every
5994         DeclSpace derivative does), but to change the AddMethod routine
5995         that was using an un-namespaced name.  This now correctly reports
5996         the duplicated name.
5997
5998         Revert patch until I can properly fix it.  The issue
5999         is that we have a shared Type space across all namespaces
6000         currently, which is wrong.
6001
6002         Options include making the Namespace a DeclSpace, and merge
6003         current_namespace/current_container in the parser.
6004
6005 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
6006
6007         * cs-parser.jay: Improve error reporting when we get a different
6008         kind of expression in local_variable_type and
6009         local_variable_pointer_type. 
6010
6011         Propagate this to avoid missleading errors being reported.
6012
6013         * ecore.cs (ImplicitReferenceConversion): treat
6014         TypeManager.value_type as a target just like object_type.   As
6015         code like this:
6016
6017         ValueType v = 1;
6018
6019         Is valid, and needs to result in the int 1 being boxed before it
6020         is assigned to the value type v.
6021
6022         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
6023         to validate the enumeration name.
6024
6025         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
6026         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
6027         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
6028
6029         * ecore.cs (TryImplicitIntConversion): When doing an
6030         implicit-enumeration-conversion, check if the type is 64-bits and
6031         perform a conversion before passing to EnumConstant.
6032
6033 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
6034
6035         * decl.cs (Error_AmbiguousTypeReference); New routine used to
6036         report ambiguous type references.  Unlike the MS version, we
6037         report what the ambiguity is.   Innovation at work ;-)
6038
6039         (DeclSpace.FindType): Require a location argument to
6040         display when we display an ambiguous error.
6041
6042         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
6043
6044         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
6045
6046         * expression.cs (EmitDynamicInitializers): Apply patch from
6047         hwang_rob@yahoo.ca that fixes the order in which we emit our
6048         initializers. 
6049
6050 2002-09-21  Martin Baulig  <martin@gnome.org>
6051
6052         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
6053         delegate takes no arguments.
6054
6055 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
6056
6057         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
6058         from integers.
6059
6060         * expression.cs: Extract the underlying type.
6061
6062         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
6063
6064         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
6065
6066 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
6067
6068         * class.cs (TypeContainer.DefineType): We can not use the nice
6069         PackingSize with the size set to 1 DefineType method, because it
6070         will not allow us to define the interfaces that the struct
6071         implements.
6072
6073         This completes the fixing of bug 27287
6074
6075         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
6076         means also structs.  This fixes part of the problem. 
6077         (Expresion.ImplicitReferenceConversionExists): ditto.
6078
6079         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
6080         error if there were no errors reported during the type lookup
6081         process, to avoid duplicates or redundant errors.  Without this
6082         you would get an ambiguous errors plus a type not found.  We have
6083         beaten the user enough with the first error.  
6084
6085         (DeclSparce.FindType): Emit a warning if we have an ambiguous
6086         reference. 
6087
6088         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
6089         during the resolution process, stop the lookup, this avoids
6090         repeated error reports (same error twice).
6091
6092         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
6093
6094         * typemanager.cs (LookupType): Redo the type lookup code to match
6095         the needs of System.Reflection.  
6096
6097         The issue is that System.Reflection requires references to nested
6098         types to begin with a "+" sign instead of a dot.  So toplevel
6099         types look like: "NameSpace.TopLevelClass", and nested ones look
6100         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
6101         levels. 
6102
6103 2002-09-19  Martin Baulig  <martin@gnome.org>
6104
6105         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
6106         says that a method always returns or always throws an exception,
6107         don't report the CS0161.
6108
6109         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
6110         set `Returns = new_returns'.
6111
6112 2002-09-19  Martin Baulig  <martin@gnome.org>
6113
6114         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
6115         to an enum constant, check for a CS0176.
6116
6117 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
6118
6119         * class.cs (TypeContainer.CheckPairedOperators): Now we check
6120         for operators that must be in pairs and report errors.
6121
6122         * ecore.cs (SimpleName.DoResolveType): During the initial type
6123         resolution process, when we define types recursively, we must
6124         check first for types in our current scope before we perform
6125         lookups in the enclosing scopes.
6126
6127         * expression.cs (MakeByteBlob): Handle Decimal blobs.
6128
6129         (Invocation.VerifyArgumentsCompat): Call
6130         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
6131         I thought we were supposed to always call this, but there are a
6132         few places in the code where we dont do it.
6133
6134 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
6135
6136         * driver.cs: Add support in -linkres and -resource to specify the
6137         name of the identifier.
6138
6139 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6140
6141         * ecore.cs (StandardConversionExists): Sync with the conversion
6142         code: allow anything-* to void* conversions.
6143
6144         (FindMostSpecificSource): Use an Expression argument
6145         instead of a Type, because we might be handed over a Literal which
6146         gets a few more implicit conversions that plain types do not.  So
6147         this information was being lost.
6148
6149         Also, we drop the temporary type-holder expression when not
6150         required.
6151
6152 2002-09-17  Martin Baulig  <martin@gnome.org>
6153
6154         * class.cs (PropertyBase.CheckBase): Don't check the base class if
6155         this is an explicit interface implementation.
6156
6157 2002-09-17  Martin Baulig  <martin@gnome.org>
6158
6159         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
6160         different `IndexerName' attributes.
6161
6162         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
6163         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
6164         virtual CommonResolve().
6165
6166 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6167
6168         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
6169         and convert that to the UnderlyingType.
6170
6171         * statement.cs (Foreach.Resolve): Indexers are just like variables
6172         or PropertyAccesses.
6173
6174         * cs-tokenizer.cs (consume_string): Track line numbers and columns
6175         inside quoted strings, we were not doing this before.
6176
6177 2002-09-16  Martin Baulig  <martin@gnome.org>
6178
6179         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
6180         resolve it.  This is needed for the definite assignment check of the
6181         instance expression, fixes bug #29846.
6182         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
6183
6184 2002-09-16  Nick Drochak  <ndrochak@gol.com>
6185
6186         * parameter.cs: Fix compile error.  Cannot reference static member
6187         from an instance object.  Is this an mcs bug?
6188
6189 2002-09-14  Martin Baulig  <martin@gnome.org>
6190
6191         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
6192         multiple times.  Fixes bug #30295, added test-166.cs.
6193
6194 2002-09-14  Martin Baulig  <martin@gnome.org>
6195
6196         * statement.cs (Block.Emit): Don't emit unreachable code.
6197         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
6198         `break' statements.
6199         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
6200
6201 2002-09-14  Martin Baulig  <martin@gnome.org>
6202
6203         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
6204         is set.
6205
6206 2002-09-14  Martin Baulig  <martin@gnome.org>
6207
6208         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
6209         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
6210         be false on the ms runtime.
6211
6212 2002-09-13  Martin Baulig  <martin@gnome.org>
6213
6214         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
6215         the CS0038 error message.
6216
6217 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
6218
6219         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
6220         constant inside, return it.
6221
6222 2002-09-12  Martin Baulig  <martin@gnome.org>
6223
6224         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
6225         implicit conversion can be done between enum types.
6226
6227         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
6228         check whether an implicit conversion to the current enum's UnderlyingType
6229         exists and report an error if not.
6230
6231         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
6232         without debugging support.
6233
6234         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
6235         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
6236
6237 2002-09-12  Martin Baulig  <martin@gnome.org>
6238
6239         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
6240
6241         * ecore.cs (IMemberExpr.DeclaringType): New property.
6242         (SimpleName.SimpleNameResolve): Check whether we're accessing a
6243         nonstatic member of an outer type (CS0038).
6244
6245 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
6246
6247         * driver.cs: Activate the using-error detector at warning level
6248         4 (at least for MS-compatible APIs).
6249
6250         * namespace.cs (VerifyUsing): Small buglett fix.
6251
6252         * pending.cs (PendingImplementation): pass the container pointer. 
6253
6254         * interface.cs (GetMethods): Allow for recursive definition.  Long
6255         term, I would like to move every type to support recursive
6256         definitions, not the current ordering mechanism that we have right
6257         now.
6258
6259         The situation is this: Attributes are handled before interfaces,
6260         so we can apply attributes to interfaces.  But some attributes
6261         implement interfaces, we will now handle the simple cases
6262         (recursive definitions will just get an error).  
6263
6264         * parameter.cs: Only invalidate types at the end if we fail to
6265         lookup all types.  
6266
6267 2002-09-09  Martin Baulig  <martin@gnome.org>
6268
6269         * ecore.cs (PropertyExpr.Emit): Also check for
6270         TypeManager.system_int_array_get_length so this'll also work when
6271         compiling corlib.  Fixes #30003.
6272
6273 2002-09-09  Martin Baulig  <martin@gnome.org>
6274
6275         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
6276         and throw an exception if we can't get the type's size.  Fixed #30040,
6277         added test-165.cs.
6278
6279 2002-09-09  Martin Baulig  <martin@gnome.org>
6280
6281         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
6282
6283         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
6284         context.  Fixes bug #30027.
6285
6286         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
6287         virtual functions.  Fixes bug #30043, added test-164.cs.
6288
6289 2002-09-08  Ravi Pratap  <ravi@ximian.com>
6290
6291         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
6292
6293 2002-09-08  Nick Drochak  <ndrochak@gol.com>
6294
6295         * driver.cs: Use an object to get the windows codepage since it's not a
6296         static property.
6297
6298 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
6299
6300         * statement.cs (For.Emit): for infinite loops (test == null)
6301         return whether there is a break inside, not always "true".
6302
6303         * namespace.cs (UsingEntry): New struct to hold the name of the
6304         using definition, the location where it is defined, and whether it
6305         has been used in a successful type lookup.
6306
6307         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
6308         strings.
6309
6310         * decl.cs: ditto.
6311
6312 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6313
6314         * attribute.cs : Fix incorrect code which relied on catching
6315         a NullReferenceException to detect a null being passed in
6316         where an object was expected.
6317
6318 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
6319
6320         * statement.cs (Try): flag the catch variable as assigned
6321
6322         * expression.cs (Cast): Simplified by using ResolveType instead of
6323         manually resolving.
6324
6325         * statement.cs (Catch): Fix bug by using ResolveType.
6326
6327 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6328
6329         * expression.cs (BetterConversion): Special case for when we have
6330         a NullLiteral as the argument and we have to choose between string
6331         and object types - we choose string the way csc does.
6332
6333         * attribute.cs (Attribute.Resolve): Catch the
6334         NullReferenceException and report error #182 since the Mono
6335         runtime no more has the bug and having this exception raised means
6336         we tried to select a constructor which takes an object and is
6337         passed a null.
6338
6339 2002-09-05  Ravi Pratap  <ravi@ximian.com>
6340
6341         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
6342         message (1502, 1503) when we can't locate a method after overload
6343         resolution. This is much more informative and closes the bug
6344         Miguel reported.
6345
6346         * interface.cs (PopulateMethod): Return if there are no argument
6347         types. Fixes a NullReferenceException bug.
6348
6349         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
6350         expressions too. Previously we were checking only in one place for
6351         positional arguments leaving out named arguments.
6352
6353         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
6354         type to the enum type is not allowed. Remove code corresponding to
6355         that.
6356
6357         (ConvertNumericExplicit): Allow explicit conversions from
6358         the underlying type to enum type. This precisely follows the spec
6359         and closes a bug filed by Gonzalo.
6360
6361 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6362
6363         * compiler.csproj:
6364         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
6365
6366 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
6367
6368         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
6369         it was important that we stored the right value after the
6370         reduction in `converted'.
6371
6372 2002-09-04  Martin Baulig  <martin@gnome.org>
6373
6374         * location.cs (Location.SymbolDocument): Use full pathnames for the
6375         source files.
6376
6377 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
6378
6379         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
6380         of the expression resolve mechanism, because that will catch the
6381         SimpleName error failures.
6382
6383         (Conditional): If we can not resolve the
6384         expression, return, do not crash.
6385
6386 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6387
6388         * cs-tokenizer.cs:
6389         (location): display token name instead of its number.
6390
6391 2002-08-28  Martin Baulig  <martin@gnome.org>
6392
6393         * expression.cs (Binary.ResolveOperator): Don't silently return
6394         but return an error if an operator cannot be applied between two
6395         enum types.
6396
6397 2002-08-28  Martin Baulig  <martin@gnome.org>
6398
6399         * class.cs (Constructor.Define): Set the permission attributes
6400         correctly instead of making all constructors public.
6401
6402 2002-08-28  Martin Baulig  <martin@gnome.org>
6403
6404         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
6405         for private members before reporting a CS0103; if we find anything,
6406         it's a CS0122.
6407
6408 2002-08-28  Martin Baulig  <martin@gnome.org>
6409
6410         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
6411         to check whether `closure_start_type == closure_invocation_type',
6412         we also need to check whether `m.DeclaringType == closure_invocation_type'
6413         before bypassing the permission checks.  We might be accessing
6414         protected/private members from the base class.
6415         (TypeManager.RealMemberLookup): Only set private_ok if private
6416         members were requested via BindingFlags.NonPublic.
6417
6418         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
6419
6420         * expression.cs (MemberAccess.ResolveMemberAccess): Set
6421         MethodGroupExpr.IsExplicitImpl if appropriate.
6422         (Invocation.DoResolve): Don't report the CS0120 for explicit
6423         interface implementations.
6424
6425 2002-08-27  Martin Baulig  <martin@gnome.org>
6426
6427         * expression.cs (Invocation.DoResolve): If this is a static
6428         method and we don't have an InstanceExpression, we must report
6429         a CS0120.
6430
6431 2002-08-25  Martin Baulig  <martin@gnome.org>
6432
6433         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
6434         `==' between a valuetype and an object.
6435
6436 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
6437
6438         * ecore.cs (TypeExpr): Provide a ToString method.
6439
6440 2002-08-24  Martin Baulig  <martin@gnome.org>
6441
6442         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
6443         now called proggie.dbg and it's a binary file.
6444
6445 2002-08-23  Martin Baulig  <martin@gnome.org>
6446
6447         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
6448
6449 2002-08-23  Martin Baulig  <martin@gnome.org>
6450
6451         * struct.cs (MyStructInfo.ctor): Make this work with empty
6452         structs; it's not allowed to use foreach() on null.
6453
6454 2002-08-23  Martin Baulig  <martin@gnome.org>
6455
6456         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
6457         writer the full pathname of the generated assembly.
6458
6459 2002-08-23  Martin Baulig  <martin@gnome.org>
6460
6461         * statements.cs (FlowBranching.UsageVector.MergeChildren):
6462         A `finally' block never returns or breaks; improved handling of
6463         unreachable code.
6464
6465 2002-08-23  Martin Baulig  <martin@gnome.org>
6466
6467         * statement.cs (Throw.Resolve): Allow `throw null'.
6468
6469 2002-08-23  Martin Baulig  <martin@gnome.org>
6470
6471         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
6472         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
6473         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
6474         MemberLookup would return a wrong event if this is an explicit
6475         interface implementation and the class has an event with the same
6476         name.
6477
6478 2002-08-23  Martin Baulig  <martin@gnome.org>
6479
6480         * statement.cs (Block.AddChildVariableNames): New public method.
6481         (Block.AddChildVariableName): Likewise.
6482         (Block.IsVariableNameUsedInChildBlock): Likewise.
6483         (Block.AddVariable): Check whether a variable name has already
6484         been used in a child block.
6485
6486         * cs-parser.jay (declare_local_variables): Mark all variable names
6487         from the current block as being used in a child block in the
6488         implicit block.
6489
6490 2002-08-23  Martin Baulig  <martin@gnome.org>
6491
6492         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
6493         find the symbol writer.
6494
6495         * driver.cs: csc also allows the arguments to /define being
6496         separated by commas, not only by semicolons.
6497
6498 2002-08-23  Martin Baulig  <martin@gnome.org>
6499
6500         * interface.cs (Interface.GetMembers): Added static check for events.
6501
6502 2002-08-15  Martin Baulig  <martin@gnome.org>
6503
6504         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
6505         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
6506
6507         * ecore.cs (Expression.MemberLookup): Added documentation and explained
6508         why the MethodData.EmitDestructor() change was necessary.
6509
6510 2002-08-20  Martin Baulig  <martin@gnome.org>
6511
6512         * class.cs (TypeContainer.FindMembers): Added static check for events.
6513
6514         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
6515
6516         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
6517         use Type.GetEvents(), not Type.FindMembers().
6518
6519 2002-08-20  Martin Baulig  <martin@gnome.org>
6520
6521         * decl.cs (MemberCache): Added a special method cache which will
6522         be used for method-only searched.  This ensures that a method
6523         search will return a MethodInfo with the correct ReflectedType for
6524         inherited methods.      
6525
6526 2002-08-20  Martin Baulig  <martin@gnome.org>
6527
6528         * decl.cs (DeclSpace.FindMembers): Made this public.
6529
6530 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6531
6532         * delegate.cs: fixed build on windows.
6533         [FIXME:  Filed as bug #29150: MCS must report these errors.]
6534
6535 2002-08-19  Ravi Pratap  <ravi@ximian.com>
6536
6537         * ecore.cs (StandardConversionExists): Return a false
6538         if we are trying to convert the void type to anything else
6539         since that is not allowed.
6540
6541         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
6542         we flag error 70 in the event an event is trying to be accessed
6543         directly from outside the declaring type.
6544
6545 2002-08-20  Martin Baulig  <martin@gnome.org>
6546
6547         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
6548         MemberCache from typemanager.cs to decl.cs.
6549
6550 2002-08-19  Martin Baulig  <martin@gnome.org>
6551
6552         * class.cs (TypeContainer): Implement IMemberContainer.
6553         (TypeContainer.DefineMembers): Create the MemberCache.
6554         (TypeContainer.FindMembers): Do better BindingFlags checking; only
6555         return public members if BindingFlags.Public was given, check
6556         whether members are static.
6557
6558 2002-08-16  Martin Baulig  <martin@gnome.org>
6559
6560         * decl.cs (DeclSpace.Define): Splitted this in Define and
6561         DefineMembers.  DefineMembers is called first and initializes the
6562         MemberCache.
6563
6564         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
6565         DefineMembers() on all our DeclSpaces.
6566
6567         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
6568         but call DefineMembers() on all nested interfaces.  We call their
6569         Define() in our new Define() function.
6570
6571         * interface.cs (Interface): Implement IMemberContainer.
6572         (Interface.Define): Moved all code except the attribute stuf to
6573         DefineMembers().
6574         (Interface.DefineMembers): Initialize the member cache.
6575
6576         * typemanager.cs (IMemberFinder): Removed this interface, we don't
6577         need this anymore since we can use MemberCache.FindMembers directly.
6578
6579 2002-08-19  Martin Baulig  <martin@gnome.org>
6580
6581         * typemanager.cs (MemberCache): When creating the cache for an
6582         interface type, add all inherited members.
6583         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
6584         to `out bool used_cache' and documented it.
6585         (TypeManager.MemberLookup): If we already used the cache in the first
6586         iteration, we don't need to do the interfaces check.
6587
6588 2002-08-19  Martin Baulig  <martin@gnome.org>
6589
6590         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
6591         here from IMemberFinder and don't implement this interface anymore.
6592         (DeclSpace.MemberCache): Moved here from IMemberFinder.
6593
6594         * typemanager.cs (IMemberFinder): This interface is now only used by
6595         classes which actually support the member cache.
6596         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
6597         since we only put DeclSpaces into this Hashtable.
6598         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
6599         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
6600
6601 2002-08-16  Martin Baulig  <martin@gnome.org>
6602
6603         * typemanager.cs (ICachingMemberFinder): Removed.
6604         (IMemberFinder.MemberCache): New property.
6605         (TypeManager.FindMembers): Merged this with RealFindMembers().
6606         This function will never be called from TypeManager.MemberLookup()
6607         so we can't use the cache here, just the IMemberFinder.
6608         (TypeManager.MemberLookup_FindMembers): Check whether the
6609         IMemberFinder has a MemberCache and call the cache's FindMembers
6610         function.
6611         (MemberCache): Rewrote larger parts of this yet another time and
6612         cleaned it up a bit.
6613
6614 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
6615
6616         * driver.cs (LoadArgs): Support quoting.
6617
6618         (Usage): Show the CSC-like command line arguments.
6619
6620         Improved a few error messages.
6621
6622 2002-08-15  Martin Baulig  <martin@gnome.org>
6623
6624         * typemanager.cs (IMemberContainer.Type): New property.
6625         (IMemberContainer.IsInterface): New property.
6626
6627         The following changes are conditional to BROKEN_RUNTIME, which is
6628         defined at the top of the file.
6629
6630         * typemanager.cs (MemberCache.MemberCache): Don't add the base
6631         class'es members, but add all members from TypeHandle.ObjectType
6632         if we're an interface.
6633         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
6634         is the current type.
6635         (MemberCache.CacheEntry.Container): Removed this field.
6636         (TypeHandle.GetMembers): Include inherited members.
6637
6638 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6639
6640         * typemanager.cs: fixed compilation and added a comment on a field that
6641         is never used.
6642
6643 2002-08-15  Martin Baulig  <martin@gnome.org>
6644
6645         * class.cs (ConstructorInitializer.Resolve): In the
6646         Expression.MemberLookup call, use the queried_type as
6647         invocation_type.
6648
6649         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
6650         declared' attribute, it's always true.
6651         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
6652         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
6653         temporary wrapper for FindMembers which tells MemberLookup whether
6654         members from the base classes are included in the return value.
6655         This will go away soon.
6656         (TypeManager.MemberLookup): Use this temporary hack here; once the
6657         new MemberCache is completed, we don't need to do the DeclaredOnly
6658         looping here anymore since the MemberCache will take care of this.
6659         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
6660         (MemberCache): When creating the MemberCache for a class, get
6661         members from the current class and all its base classes.
6662         (MemberCache.CacheEntry.Container): New field.  This is a
6663         temporary hack until the Mono runtime is fixed to distinguish
6664         between ReflectedType and DeclaringType.  It allows us to use MCS
6665         with both the MS runtime and the unfixed Mono runtime without
6666         problems and without accecting performance.
6667         (MemberCache.SearchMembers): The DeclaredOnly looping from
6668         TypeManager.MemberLookup is now done here.      
6669
6670 2002-08-14  Martin Baulig  <martin@gnome.org>
6671
6672         * statement.cs (MyStructInfo.MyStructInfo): Don't call
6673         Type.GetFields on dynamic types but get the fields from the
6674         corresponding TypeContainer.
6675         (MyStructInfo.GetStructInfo): Added check for enum types.
6676
6677         * typemanager.cs (MemberList.IsSynchronized): Implemented.
6678         (MemberList.SyncRoot): Implemented.
6679         (TypeManager.FilterWithClosure): No need to check permissions if
6680         closure_start_type == closure_invocation_type, don't crash if
6681         closure_invocation_type is null.
6682
6683 2002-08-13  Martin Baulig  <martin@gnome.org>
6684
6685         Rewrote TypeContainer.FindMembers to use a member cache.  This
6686         gives us a speed increase of about 35% for the self-hosting MCS
6687         build and of about 15-20% for the class libs (both on GNU/Linux).
6688
6689         * report.cs (Timer): New class to get enhanced profiling.  This
6690         whole class is "TIMER" conditional since it remarkably slows down
6691         compilation speed.
6692
6693         * class.cs (MemberList): New class.  This is an IList wrapper
6694         which we're now using instead of passing MemberInfo[]'s around to
6695         avoid copying this array unnecessarily.
6696         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
6697         (ICachingMemberFinder, IMemberContainer): New interface.
6698         (TypeManager.FilterWithClosure): If `criteria' is null, the name
6699         has already been checked, otherwise use it for the name comparision.
6700         (TypeManager.FindMembers): Renamed to RealMemberFinder and
6701         provided wrapper which tries to use ICachingMemberFinder.FindMembers
6702         if possible.  Returns a MemberList, not a MemberInfo [].
6703         (TypeHandle): New class, implements IMemberContainer.  We create
6704         one instance of this class per type, it contains a MemberCache
6705         which is used to do the member lookups.
6706         (MemberCache): New class.  Each instance of this class contains
6707         all members of a type and a name-based hash table.
6708         (MemberCache.FindMembers): This is our new member lookup
6709         function.  First, it looks up all members of the requested name in
6710         the hash table.  Then, it walks this list and sorts out all
6711         applicable members and returns them.
6712
6713 2002-08-13  Martin Baulig  <martin@gnome.org>
6714
6715         In addition to a nice code cleanup, this gives us a performance
6716         increase of about 1.4% on GNU/Linux - not much, but it's already
6717         half a second for the self-hosting MCS compilation.
6718
6719         * typemanager.cs (IMemberFinder): New interface.  It is used by
6720         TypeManager.FindMembers to call FindMembers on a TypeContainer,
6721         Enum, Delegate or Interface.
6722         (TypeManager.finder_to_member_finder): New PtrHashtable.
6723         (TypeManager.finder_to_container): Removed.
6724         (TypeManager.finder_to_delegate): Removed.
6725         (TypeManager.finder_to_interface): Removed.
6726         (TypeManager.finder_to_enum): Removed.
6727
6728         * interface.cs (Interface): Implement IMemberFinder.
6729
6730         * delegate.cs (Delegate): Implement IMemberFinder.
6731
6732         * enum.cs (Enum): Implement IMemberFinder.
6733
6734         * class.cs (TypeContainer): Implement IMemberFinder.
6735
6736 2002-08-12  Martin Baulig  <martin@gnome.org>
6737
6738         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
6739
6740 2002-08-12  Martin Baulig  <martin@gnome.org>
6741
6742         * ecore.cs (ITypeExpression): New interface for expressions which
6743         resolve to a type.
6744         (TypeExpression): Renamed to TypeLookupExpression.
6745         (Expression.DoResolve): If we're doing a types-only lookup, the
6746         expression must implement the ITypeExpression interface and we
6747         call DoResolveType() on it.
6748         (SimpleName): Implement the new ITypeExpression interface.
6749         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
6750         hack, the situation that we're only looking up types can't happen
6751         anymore when this method is called.  Moved the type lookup code to
6752         DoResolveType() and call it.
6753         (SimpleName.DoResolveType): This ITypeExpression interface method
6754         is now doing the types-only lookup.
6755         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
6756         (ResolveFlags): Added MaskExprClass.
6757
6758         * expression.cs (MemberAccess): Implement the ITypeExpression
6759         interface.
6760         (MemberAccess.DoResolve): Added support for a types-only lookup
6761         when we're called via ITypeExpression.DoResolveType().
6762         (ComposedCast): Implement the ITypeExpression interface.
6763
6764         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
6765         Expression.Resolve() with ResolveFlags.Type instead.
6766
6767 2002-08-12  Martin Baulig  <martin@gnome.org>
6768
6769         * interface.cs (Interface.Define): Apply attributes.
6770
6771         * attribute.cs (Attribute.ApplyAttributes): Added support for
6772         interface attributes.
6773
6774 2002-08-11  Martin Baulig  <martin@gnome.org>
6775
6776         * statement.cs (Block.Emit): Only check the "this" variable if we
6777         do not always throw an exception.
6778
6779         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
6780         whether the property has a set accessor.
6781
6782 2002-08-11  Martin Baulig  <martin@gnome.org>
6783
6784         Added control flow analysis support for structs.
6785
6786         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
6787         with control flow analysis turned off.
6788         (IVariable): New interface.
6789         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
6790         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
6791         (FieldExpr.DoResolve): Resolve the instance expression with flow
6792         analysis turned off and do the definite assignment check after the
6793         resolving when we know what the expression will resolve to.
6794
6795         * expression.cs (LocalVariableReference, ParameterReference):
6796         Implement the new IVariable interface, only call the flow analysis
6797         code if ec.DoFlowAnalysis is true.
6798         (This): Added constructor which takes a Block argument.  Implement
6799         the new IVariable interface.
6800         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
6801         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
6802         This does the definite assignment checks for struct members.
6803
6804         * class.cs (Constructor.Emit): If this is a non-static `struct'
6805         constructor which doesn't have any initializer, call
6806         Block.AddThisVariable() to tell the flow analysis code that all
6807         struct elements must be initialized before control returns from
6808         the constructor.
6809
6810         * statement.cs (MyStructInfo): New public class.
6811         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
6812         argument to this indexer.  If non-zero, check an individual struct
6813         member, not the whole struct.
6814         (FlowBranching.CheckOutParameters): Check struct members.
6815         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
6816         overloaded versions of these methods which take an additional
6817         `int field_idx' argument to check struct members.
6818         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
6819         overloaded versions of these methods which take an additional
6820         `string field_name' argument to check struct member.s
6821         (VariableInfo): Implement the IVariable interface.
6822         (VariableInfo.StructInfo): New public property.  Returns the
6823         MyStructInfo instance of the variable if it's a struct or null.
6824         (Block.AddThisVariable): New public method.  This is called from
6825         Constructor.Emit() for non-static `struct' constructor which do
6826         not have any initializer.  It creates a special variable for the
6827         "this" instance variable which will be checked by the flow
6828         analysis code to ensure that all of the struct's fields are
6829         initialized before control returns from the constructor.
6830         (UsageVector): Added support for struct members.  If a
6831         variable/parameter is a struct with N members, we reserve a slot
6832         in the usage vector for each member.  A struct is considered fully
6833         initialized if either the struct itself (slot 0) or all its
6834         members are initialized.
6835
6836 2002-08-08  Martin Baulig  <martin@gnome.org>
6837
6838         * driver.cs (Driver.MainDriver): Only report an error CS5001
6839         if there were no compilation errors.
6840
6841         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
6842         `UnsafeContext' property to determine whether the parent is in
6843         unsafe context rather than checking the parent's ModFlags:
6844         classes nested in an unsafe class are unsafe as well.
6845
6846 2002-08-08  Martin Baulig  <martin@gnome.org>
6847
6848         * statement.cs (UsageVector.MergeChildren): Distinguish between
6849         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
6850         we return.  Added test17() and test18() to test-154.cs.
6851
6852 2002-08-08  Martin Baulig  <martin@gnome.org>
6853
6854         * typemanager.cs (TypeManager.FilterWithClosure): If we have
6855         Family access, make sure the invoking type isn't a subclass of the
6856         queried type (that'd be a CS1540).
6857
6858         * ecore.cs (Expression.MemberLookup): Added overloaded version of
6859         this method which takes an additional `Type invocation_type'.
6860
6861         * expression.cs (BaseAccess.DoResolve): Use the base type as
6862         invocation and query type.
6863         (MemberAccess.DoResolve): If the lookup failed and we're about to
6864         report a CS0122, try a lookup with the ec.ContainerType - if this
6865         succeeds, we must report a CS1540.
6866
6867 2002-08-08  Martin Baulig  <martin@gnome.org>
6868
6869         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
6870         (MethodGroupExpr): Implement the IMemberExpr interface.
6871
6872         * expression (MemberAccess.ResolveMemberAccess): No need to have
6873         any special code for MethodGroupExprs anymore, they're now
6874         IMemberExprs.   
6875
6876 2002-08-08  Martin Baulig  <martin@gnome.org>
6877
6878         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
6879         Family, FamANDAssem and FamORAssem permissions.
6880         (TypeManager.IsSubclassOrNestedChildOf): New public method.
6881
6882 2002-08-08  Martin Baulig  <martin@gnome.org>
6883
6884         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
6885         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
6886         or loop block.
6887
6888 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
6889
6890         * driver.cs: implemented /resource option to embed managed resources.
6891
6892 2002-08-07  Martin Baulig  <martin@gnome.org>
6893
6894         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
6895         (FieldBase.HasFieldInitializer): New public property.
6896         (FieldBase.GetInitializerExpression): New public method.  Resolves and
6897         returns the field initializer and makes sure it is only resolved once.
6898         (TypeContainer.EmitFieldInitializers): Call
6899         FieldBase.GetInitializerExpression to get the initializer, this ensures
6900         that it isn't resolved multiple times.
6901
6902         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
6903         the resolving process (SimpleName/MemberLookup) that we're currently
6904         emitting a field initializer (which must not access any instance members,
6905         this is an error CS0236).
6906
6907         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
6908         argument, if the `IsFieldInitializer' flag is set, we must report and
6909         error CS0236 and not an error CS0120.   
6910
6911 2002-08-07  Martin Baulig  <martin@gnome.org>
6912
6913         * ecore.cs (IMemberExpr): New public interface.
6914         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
6915         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
6916         if the expression is an IMemberExpr.
6917
6918         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
6919         to be null, implicitly default to `this' if we're non-static in
6920         this case.  Simplified the code a lot by using the new IMemberExpr
6921         interface.  Also fixed bug #28176 here.
6922
6923 2002-08-06  Martin Baulig  <martin@gnome.org>
6924
6925         * cs-parser.jay (SimpleLookup): Removed.  We need to create
6926         ParameterReferences during semantic analysis so that we can do a
6927         type-only search when resolving Cast, TypeOf and SizeOf.
6928         (block): Pass the `current_local_parameters' to the Block's
6929         constructor.
6930
6931         * class.cs (ConstructorInitializer): Added `Parameters parameters'
6932         argument to the constructor.
6933         (ConstructorInitializer.Resolve): Create a temporary implicit
6934         block with the parameters.
6935
6936         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
6937         references here if we aren't doing a type-only search.
6938
6939         * statement.cs (Block): Added constructor which takes a
6940         `Parameters parameters' argument.
6941         (Block.Parameters): New public property.
6942
6943         * support.cs (InternalParameters.Parameters): Renamed `parameters'
6944         to `Parameters' and made it public readonly.
6945
6946 2002-08-06  Martin Baulig  <martin@gnome.org>
6947
6948         * ecore.cs (Expression.Warning): Made this public as well.
6949
6950         * report.cs (Report.Debug): Print the contents of collections.
6951
6952 2002-08-06  Martin Baulig  <martin@gnome.org>
6953
6954         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
6955         used to tell Resolve() which kinds of expressions it may return.
6956         (Expression.Resolve): Added overloaded version of this method which
6957         takes a `ResolveFlags flags' argument.  This can be used to tell
6958         Resolve() which kinds of expressions it may return.  Reports a
6959         CS0118 on error.
6960         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
6961         ResolveFlags.SimpleName.
6962         (Expression.Error118): Added overloaded version of this method which
6963         takes a `ResolveFlags flags' argument.  It uses the flags to determine
6964         which kinds of expressions are allowed.
6965
6966         * expression.cs (Argument.ResolveMethodGroup): New public method.
6967         Resolves an argument, but allows a MethodGroup to be returned.
6968         This is used when invoking a delegate.
6969
6970         * TODO: Updated a bit.
6971
6972 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6973
6974         Fixed compilation with csc.
6975
6976         * ecore.cs: Expression.Error made public. Is this correct? Should
6977         Warning be made public too?
6978
6979         * expression.cs: use ea.Location instead of ea.loc.
6980         [FIXME:  Filed as bug #28607: MCS must report these errors.]
6981
6982 2002-08-06  Martin Baulig  <martin@gnome.org>
6983
6984         * ecore.cs (Expression.loc): Moved the location here instead of
6985         duplicating it in all derived classes.
6986         (Expression.Location): New public property.
6987         (Expression.Error, Expression.Warning): Made them non-static and
6988         removed the location argument.
6989         (Expression.Warning): Added overloaded version which takes an
6990         `int level' argument.
6991         (Expression.Error118): Make this non-static and removed the
6992         expression and location arguments.
6993         (TypeExpr): Added location argument to the constructor.
6994
6995         * expression.cs (StaticCallExpr): Added location argument to
6996         the constructor.
6997         (Indirection, PointerArithmetic): Likewise.
6998         (CheckedExpr, UnCheckedExpr): Likewise.
6999         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
7000         (StringPtr): Likewise.
7001
7002
7003 2002-08-05  Martin Baulig  <martin@gnome.org>
7004
7005         * expression.cs (BaseAccess.DoResolve): Actually report errors.
7006
7007         * assign.cs (Assign.DoResolve): Check whether the source
7008         expression is a value or variable.
7009
7010         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
7011         while resolving the corresponding blocks.
7012
7013         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
7014         an error, don't silently return null.
7015
7016         * statement.cs (Block.AddVariable): Do the error reporting here
7017         and distinguish between CS0128 and CS0136.
7018         (Block.DoResolve): Report all unused labels (warning CS0164).
7019         (LabeledStatement): Pass the location to the constructor.
7020         (LabeledStatement.HasBeenReferenced): New property.
7021         (LabeledStatement.Resolve): Set it to true here.
7022
7023         * statement.cs (Return.Emit): Return success even after reporting
7024         a type mismatch error (CS0126 or CS0127), this is what csc does and
7025         it avoids confusing the users with any consecutive errors.
7026
7027 2002-08-05  Martin Baulig  <martin@gnome.org>
7028
7029         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
7030
7031         * const.cs (Const.LookupConstantValue): Catch circular definitions.
7032
7033         * expression.cs (MemberAccess.DoResolve): Silently return if an
7034         error has already been reported.
7035
7036         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
7037         error has already been reported.
7038
7039 2002-08-05  Martin Baulig  <martin@gnome.org>
7040
7041         * statement.cs (UsageVector): Only initialize the `parameters'
7042         vector if we actually have any "out" parameters.
7043
7044 2002-08-05  Martin Baulig  <martin@gnome.org>
7045
7046         * expression.cs (Binary.ResolveOperator): When combining delegates,
7047         they must have the same type.
7048
7049 2002-08-05  Martin Baulig  <martin@gnome.org>
7050
7051         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
7052         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
7053         work with the ms runtime and we also don't need it: if we're a
7054         PropertyBuilder and not in the `indexer_arguments' hash, then we
7055         are a property and not an indexer.
7056
7057         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
7058         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
7059         since the latter one doesn't work with the ms runtime.
7060
7061 2002-08-03  Martin Baulig  <martin@gnome.org>
7062
7063         Fixed bugs #27998 and #22735.
7064
7065         * class.cs (Method.IsOperator): New public field.
7066         (Method.CheckBase): Report CS0111 if there's already a method
7067         with the same parameters in the current class.  Report CS0508 when
7068         attempting to change the return type of an inherited method.
7069         (MethodData.Emit): Report CS0179 if a method doesn't have a body
7070         and it's not marked abstract or extern.
7071         (PropertyBase): New abstract base class for Property and Indexer.
7072         (PropertyBase.CheckBase): Moved here from Property and made it work
7073         for indexers.
7074         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
7075         the same so we can reuse it there.
7076         (Property, Indexer): Derive from PropertyBase.
7077         (MethodSignature.inheritable_property_signature_filter): New delegate
7078         to find properties and indexers.
7079
7080         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
7081         argument and improved error reporting.
7082
7083         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
7084         EmptyReadOnlyParameters and made it a property.
7085
7086         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
7087         version of this method which takes a `PropertyInfo indexer'.
7088         (TypeManager.RegisterIndexer): New method.
7089
7090         * class.cs: Added myself as author of this file :-)
7091
7092 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7093
7094         * class.cs: fixed compilation on windoze.
7095
7096 2002-08-03  Martin Baulig  <martin@gnome.org>
7097
7098         * interface.cs (Interface.GetInterfaceBases): Check whether all
7099         base interfaces are at least as accessible than the current one.
7100
7101         * class.cs (TypeContainer.GetClassBases): Check whether base types
7102         are at least as accessible than the current type.
7103         (TypeContainer.AsAccessible): Implemented and made non-static.
7104         (MemberBase.CheckParameters): Report errors if the accessibility
7105         checks fail.
7106
7107         * delegate.cs (Delegate.Delegate): The default visibility is
7108         internal for top-level types and private for nested types.
7109         (Delegate.Define): Report errors if the accessibility checks fail.
7110
7111         * enum.cs (Enum.Enum): The default visibility is internal for
7112         top-level types and private for nested types.
7113         (Enum.DefineType): Compute the correct visibility.
7114
7115         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
7116         function which takes a `bool is_toplevel' instead of a TypeContainer.
7117
7118         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
7119         builtin type.
7120
7121 2002-08-02  Martin Baulig  <martin@gnome.org>
7122
7123         * expression.cs (LocalVariableReferenc): Added constructor which
7124         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
7125         (LocalVariableReference.IsReadOnly): New property.
7126         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
7127         variable is readonly, use our own readonly flag to do this; you can
7128         use the new constructor to get a writable reference to a read-only
7129         variable.
7130
7131         * cs-parser.jay (foreach_statement, using_statement): Get a writable
7132         reference to the local variable.
7133
7134 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
7135
7136         * rootcontext.cs (ResolveCore): Also include System.Exception
7137
7138         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
7139         we reach an EmptyStatement.
7140
7141         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
7142         is also fine.
7143
7144         * expression.cs (Binary.ResolveOperator): Check error result in
7145         two places.
7146
7147         use brtrue/brfalse directly and avoid compares to null.
7148
7149 2002-08-02  Martin Baulig  <martin@gnome.org>
7150
7151         * class.cs (TypeContainer.Define): Define all nested interfaces here.
7152         Fixes bug #28407, added test-155.cs.
7153
7154 2002-08-01  Martin Baulig  <martin@gnome.org>
7155
7156         * class.cs (Event.EmitDefaultMethod): Make this work with static
7157         events.  Fixes #28311, added verify-3.cs.
7158
7159 2002-08-01  Martin Baulig  <martin@gnome.org>
7160
7161         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
7162         `is_disposable' fields.
7163         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
7164         `hm.is_disposable' if we're using the collection pattern.
7165         (Foreach.EmitCollectionForeach): Use the correct type for the
7166         enumerator's local variable, only emit the try/finally block if
7167         necessary (fixes #27713).
7168
7169 2002-08-01  Martin Baulig  <martin@gnome.org>
7170
7171         * ecore.cs (Expression.report118): Renamed to Error118 and made
7172         it public static.
7173
7174         * statement.cs (Throw.Resolve): Check whether the expression is of
7175         the correct type (CS0118) and whether the type derives from
7176         System.Exception (CS0155).
7177         (Catch.Resolve): New method.  Do the type lookup here and check
7178         whether it derives from System.Exception (CS0155).
7179         (Catch.CatchType, Catch.IsGeneral): New public properties.
7180
7181         * typemanager.cs (TypeManager.exception_type): Added.
7182
7183 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
7184
7185         * driver.cs: Updated About function.
7186
7187 2002-07-31  Martin Baulig  <martin@gnome.org>
7188
7189         Implemented Control Flow Analysis.
7190
7191         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
7192         (EmitContext.CurrentBranching): Added.
7193         (EmitContext.StartFlowBranching): Added.
7194         (EmitContext.EndFlowBranching): Added.
7195         (EmitContext.KillFlowBranching): Added.
7196         (EmitContext.IsVariableAssigned): Added.
7197         (EmitContext.SetVariableAssigned): Added.
7198         (EmitContext.IsParameterAssigned): Added.
7199         (EmitContext.SetParameterAssigned): Added.
7200         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
7201         Added control flow analysis stuff here.
7202
7203         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
7204         resolve the expression as lvalue.
7205         (LocalVariableReference.DoResolve): Check whether the variable has
7206         already been assigned.
7207         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
7208         the parameter as assigned here.
7209         (ParameterReference.DoResolve): Check whether the parameter has already
7210         been assigned.
7211         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
7212         expression as lvalue.
7213
7214         * statement.cs (FlowBranching): New class for the flow analysis code.
7215         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
7216         (LabeledStatement.IsDefined): New public property.
7217         (LabeledStatement.AddUsageVector): New public method to tell flow
7218         analyis that the label may be reached via a forward jump.
7219         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
7220         flow analysis.
7221         (VariableInfo.Number): New public field.  This is used by flow analysis
7222         to number all locals of a block.
7223         (Block.CountVariables): New public property.  This is the number of
7224         local variables in this block (including the locals from all parent
7225         blocks).
7226         (Block.EmitMeta): Number all the variables.
7227
7228         * statement.cs: Added flow analysis support to all classes.
7229
7230 2002-07-31  Martin Baulig  <martin@gnome.org>
7231
7232         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
7233         To get debugging messages, compile mcs with /define:MCS_DEBUG and
7234         then use this argument.
7235
7236         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
7237
7238         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
7239         use this to specify /define options.
7240
7241 2002-07-29  Martin Baulig  <martin@gnome.org>
7242
7243         * statement.cs (Fixed): Moved all code that does variable lookups
7244         and resolvings from Emit to Resolve.
7245
7246         * statement.cs (For): Moved all code that does variable lookups
7247         and resolvings from Emit to Resolve.
7248
7249         * statement.cs (Using): Moved all code that does variable lookups
7250         and resolvings from Emit to Resolve.
7251
7252 2002-07-29  Martin Baulig  <martin@gnome.org>
7253
7254         * attribute.cs (Attribute.Resolve): Explicitly catch a
7255         System.NullReferenceException when creating the
7256         CustromAttributeBuilder and report a different warning message.
7257
7258 2002-07-29  Martin Baulig  <martin@gnome.org>
7259
7260         * support.cs (ParameterData.ParameterName): Added method to
7261         get the name of a parameter.
7262
7263         * typemanager.cs (TypeManager.IsValueType): New public method.
7264
7265 2002-07-29  Martin Baulig  <martin@gnome.org>
7266
7267         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
7268         is a flag which specifies that it's either ref or out.
7269         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
7270         the out parameter to `out Parameter.Modifier mod', also set the
7271         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
7272
7273         * support.cs (InternalParameters.ParameterModifier): Distinguish
7274         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7275         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7276
7277         * expression.cs (Argument.GetParameterModifier): Distinguish
7278         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7279         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7280
7281 2002-07-29  Martin Baulig  <martin@gnome.org>
7282
7283         * expression.cs (ParameterReference.ParameterReference): Added
7284         `Location loc' argument to the constructor.
7285
7286         * cs-parser.jay: Pass location to ParameterReference.
7287
7288 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
7289
7290         * statement.cs (Try): Initialize the location.
7291
7292         * cs-parser.jay: pass location to Try.
7293
7294         * expression.cs (Unary.Reduce): Change the prototype to return
7295         whether a constant fold could be performed or not.  The result is
7296         returned in an out parameters.  In the case of Indirection and
7297         AddressOf, we want to perform the full tests.
7298
7299 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
7300
7301         * statement.cs (Statement.Emit): Flag dead code.
7302
7303 2002-07-27  Andrew Birkett  <andy@nobugs.org>
7304
7305         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
7306
7307 2002-07-27  Martin Baulig  <martin@gnome.org>
7308
7309         * class.cs (MethodData.Define): Put back call to
7310         TypeManager.AddMethod(), accidentally commented this out.
7311
7312         * report.cs (Debug): New public method to print debugging information,
7313         this is `[Conditional ("DEBUG")]'.
7314
7315 2002-07-26  Martin Baulig  <martin@gnome.org>
7316
7317         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
7318         (switch_statement): Push the current_block to the switch_stack and
7319         pop it again when we're done with the switch.
7320         (switch_section): The new block is a child of the current_block.
7321         Fixes bug #24007, added test-152.cs.
7322
7323 2002-07-27  Martin Baulig  <martin@gnome.org>
7324
7325         * expression.cs (Invocation.EmitArguments): When calling a varargs
7326         function with only its fixed arguments, we need to pass an empty
7327         array.
7328
7329 2002-07-27  Martin Baulig  <martin@gnome.org>
7330
7331         Mono 0.13 has been released.
7332
7333 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
7334
7335         * driver.cs: Rename --resource to --linkres, because that is what
7336         we do currently, we dont support --resource yet.
7337
7338         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
7339
7340 2002-07-25  Martin Baulig  <martin@gnome.org>
7341
7342         * class.cs (MethodData): New public class.  This is a `method builder'
7343         class for a method or one accessor of a Property/Indexer/Event.
7344         (MethodData.GetMethodFlags): Moved here from MemberBase.
7345         (MethodData.ApplyAttributes): Likewise.
7346         (MethodData.ApplyObsoleteAttribute): Likewise.
7347         (MethodData.ApplyConditionalAttribute): Likewise.
7348         (MethodData.ApplyDllImportAttribute): Likewise.
7349         (MethodData.CheckAbstractAndExternal): Likewise.
7350         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
7351         (MethodData.Emit): Formerly known as Method.Emit().
7352         (MemberBase): Moved everything which was specific to a single
7353         accessor/method to MethodData.
7354         (Method): Create a new MethodData and call Define() and Emit() on it.
7355         (Property, Indexer, Event): Create a new MethodData objects for each
7356         accessor and call Define() and Emit() on them.
7357
7358 2002-07-25  Martin Baulig  <martin@gnome.org>
7359
7360         Made MethodCore derive from MemberBase to reuse the code from there.
7361         MemberBase now also checks for attributes.
7362
7363         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
7364         (MemberBase.GetMethodFlags): Moved here from class Method and marked
7365         as virtual.
7366         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
7367         `CallingConventions cc' and `Attributes opt_attrs' arguments.
7368         (MemberBase.ApplyAttributes): New virtual method; applies the
7369         attributes to a method or accessor.
7370         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
7371         (MemberBase.ApplyConditionalAttribute): Likewise.
7372         (MemberBase.ApplyDllImportAttribute): Likewise.
7373         (MemberBase.CheckAbstractAndExternal): Likewise.
7374         (MethodCore.ParameterTypes): This is now a property instead of a
7375         method, it's initialized from DoDefineParameters().
7376         (MethodCore.ParameterInfo): Removed the set accessor.
7377         (MethodCore.DoDefineParameters): New protected virtual method to
7378         initialize ParameterTypes and ParameterInfo.
7379         (Method.GetReturnType): We can now simply return the MemberType.
7380         (Method.GetMethodFlags): Override the MemberBase version and add
7381         the conditional flags.
7382         (Method.CheckBase): Moved some code from Define() here, call
7383         DoDefineParameters() here.
7384         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
7385         here to avoid some larger code duplication.
7386         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
7387         ensure that abstract and external accessors don't declare a body.
7388
7389         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
7390         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
7391         lookup in the attribute's parent classes, so we need to abort as soon
7392         as we found the first match.
7393         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
7394         the attribute has no arguments.
7395
7396         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
7397         of a Method.
7398
7399 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7400
7401         * cs-parser.jay: reverted previous patch.
7402
7403 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7404
7405         * cs-parser.jay: fixed bug #22119.
7406
7407 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7408
7409         * attribute.cs: fixed compilation. The error was:
7410         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
7411         be assigned to before control leaves the current method."
7412         [FIXME:  Filed as bug #28186: MCS must report this error.]
7413
7414 2002-07-25  Martin Baulig  <martin@gnome.org>
7415
7416         * attribute.cs (Attribute.Conditional_GetConditionName): New static
7417         method to pull the condition name ouf of a Conditional attribute.
7418         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
7419         the obsolete message and error flag out of an Obsolete attribute.
7420
7421         * class.cs (Method.GetMethodFlags): New public method to get the
7422         TypeManager.MethodFlags for this method.
7423         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
7424         private methods.
7425         (Method.Define): Get and apply the Obsolete and Conditional attributes;
7426         if we're overriding a virtual function, set the new private variable
7427         `parent_method'; call the new TypeManager.AddMethod().
7428
7429         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
7430         the MethodBuilder and the Method in a PtrHashtable.
7431         (TypeManager.builder_to_method): Added for this purpose.
7432         (TypeManager.MethodFlags): Added IsObsoleteError.
7433         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
7434         Obsolete and Conditional arguments in MethodBuilders.  If we discover
7435         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
7436         the message from the attribute.
7437
7438 2002-07-24  Martin Baulig  <martin@gnome.org>
7439
7440         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
7441         preprocessor directives, ensure that the argument to #define/#undef is
7442         exactly one identifier and that it's actually an identifier.
7443
7444         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
7445         did not work ....
7446
7447 2002-07-24  Martin Baulig  <martin@gnome.org>
7448
7449         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
7450         initialize it to TypeManager.object_type in the constructor.
7451         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
7452         of the `hm.get_current' method if we're using the collection pattern.
7453         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
7454         for the explicit conversion to make it work when we're using the collection
7455         pattern and the `Current' property has a different return type than `object'.
7456         Fixes #27713.
7457
7458 2002-07-24  Martin Baulig  <martin@gnome.org>
7459
7460         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
7461         does not match, but don't report any errors.  This method is called in
7462         order for all methods in a MethodGroupExpr until a matching method is
7463         found, so we don't want to bail out if the first method doesn't match.
7464         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
7465         matches, report the 123.  Fixes #28070.
7466
7467 2002-07-24  Martin Baulig  <martin@gnome.org>
7468
7469         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
7470         TypeManager.TypeToCoreType() to the top of the method so the
7471         following equality checks will work.  Fixes #28107.
7472
7473 2002-07-24  Martin Baulig  <martin@gnome.org>
7474
7475         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
7476         operand is of type uint, and the other operand is of type sbyte,
7477         short or int, the operands are converted to type long." -
7478         Actually do what this comment already told us.  Fixes bug #28106,
7479         added test-150.cs.
7480
7481 2002-07-24  Martin Baulig  <martin@gnome.org>
7482
7483         * class.cs (MethodBase): New abstract class.  This is now a base
7484         class for Property, Indexer and Event to avoid some code duplication
7485         in their Define() and DefineMethods() methods.
7486         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
7487         generic methods for Define() and DefineMethods().
7488         (FieldBase): Derive from MemberBase, not MemberCore.
7489         (Property): Derive from MemberBase, not MemberCore.
7490         (Property.DefineMethod): Moved all the code from this method to the
7491         new MethodBase.DefineAccessor(), just call it with appropriate
7492         argumetnts.
7493         (Property.Define): Call the new Property.DoDefine(), this does some
7494         sanity checks and we don't need to duplicate the code everywhere.
7495         (Event): Derive from MemberBase, not MemberCore.
7496         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
7497         accessors, this will also make them work with interface events.
7498         (Indexer): Derive from MemberBase, not MemberCore.
7499         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
7500         (Indexer.Define): Use the new MethodBase functions.
7501
7502         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
7503         argument to the constructor.
7504         (Interface.FindMembers): Added support for interface events.
7505         (Interface.PopluateEvent): Implemented.
7506
7507         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
7508
7509 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
7510
7511         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
7512         but this is required to check for a method name being the same as
7513         the containing class.  
7514
7515         Handle this now.
7516
7517 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7518
7519         * interface.cs: initialize variable.
7520
7521 2002-07-23  Martin Baulig  <martin@gnome.org>
7522
7523         Implemented the IndexerName attribute in interfaces.
7524
7525         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
7526         name if this is an explicit interface implementation.
7527         (Indexer.InterfaceIndexerName): New public variable.  If we're
7528         implementing an interface indexer, this is the IndexerName in that
7529         interface.  Otherwise, it's the IndexerName.
7530         (Indexer.DefineMethod): If we're implementing interface indexer,
7531         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
7532         and Pending.ImplementIndexer methods.
7533         (Indexer.Define): Also define the PropertyBuilder if we're
7534         implementing an interface indexer and this is neither an explicit
7535         interface implementation nor do the IndexerName match the one in
7536         the interface.
7537
7538         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
7539         If a method is defined here, then we always need to create a proxy
7540         for it.  This is used when implementing interface indexers.
7541         (Pending.IsInterfaceIndexer): New public method.
7542         (Pending.ImplementIndexer): New public method.
7543         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
7544         This is used when implementing interface indexers to define a proxy
7545         if necessary.
7546         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
7547         define a proxy if necessary.
7548
7549         * interface.cs (Interface.IndexerName): New public variable.
7550         (Interface.PopulateIndexer): Set the IndexerName.
7551         (Interface.DefineIndexers): New private method.  Populate all the
7552         indexers and make sure their IndexerNames match.
7553
7554         * typemanager.cs (IndexerPropertyName): Added support for interface
7555         indexers.
7556
7557 2002-07-22  Martin Baulig  <martin@gnome.org>
7558
7559         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
7560         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
7561         ret if HasReturnLabel.
7562         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
7563         variables.
7564
7565         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
7566         and set the ec.LoopBeginTryCatchLevel.
7567         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
7568         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
7569         the current ec.TryCatchLevel, the branch goes out of an exception
7570         block.  In this case, we need to use Leave and not Br.
7571
7572 2002-07-22  Martin Baulig  <martin@gnome.org>
7573
7574         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
7575         block unless the block does not always return or it is contained in
7576         another try { ... } catch { ... } block.  Fixes bug #26506.
7577         Added verify-1.cs to the test suite.
7578
7579 2002-07-22  Martin Baulig  <martin@gnome.org>
7580
7581         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
7582         then we do not always return.  Fixes bug #24985.
7583
7584 2002-07-22  Martin Baulig  <martin@gnome.org>
7585
7586         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
7587         lookup on a per-class level; ie. walk up the class hierarchy until we
7588         found at least one applicable method, then choose the best among them.
7589         Fixes bug #24463 and test-29.cs.
7590
7591 2002-07-22  Martin Baulig  <martin@gnome.org>
7592
7593         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
7594         return types of the methods.  The return type is not part of the
7595         signature and we must not check it to make the `new' modifier work.
7596         Fixes bug #27999, also added test-147.cs.
7597         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
7598
7599         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
7600         on the method's return type.
7601
7602 2002-07-21  Martin Baulig  <martin@gnome.org>
7603
7604         * assign.cs: Make this work if the rightmost source is a constant and
7605         we need to do an implicit type conversion.  Also adding a few more tests
7606         to test-38.cs which should have caught this.
7607
7608         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
7609         target in the makefile for this.  The makefile.gnu is primarily intended
7610         for end-users who don't want to debug the compiler.
7611
7612 2002-07-21  Martin Baulig  <martin@gnome.org>
7613
7614         * assign.cs: Improved the Assign class so it can now handle embedded
7615         assignments (X = Y = Z = something).  As a side-effect this'll now also
7616         consume less local variables.  test-38.cs now passes with MCS, added
7617         a few new test cases to that test.
7618
7619 2002-07-20  Martin Baulig  <martin@gnome.org>
7620
7621         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
7622         instructions.  Fixes bug #27977, also added test-146.cs.
7623
7624 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7625
7626         * cs-tokenizer.cs: fixed getHex ().
7627
7628 2002-07-19  Martin Baulig  <martin@gnome.org>
7629
7630         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
7631         not Type.GetType() to lookup the array type.  This is needed when
7632         we're constructing an array of a user-defined type.
7633         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
7634         single-dimensional arrays, but also for single-dimensial arrays of
7635         type decimal.
7636
7637 2002-07-19  Martin Baulig  <martin@gnome.org>
7638
7639         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
7640         this function is called, it's not allowed to share LocalBuilders
7641         among ILGenerators.
7642
7643 2002-07-19  Martin Baulig  <martin@gnome.org>
7644
7645         * expression.cs (Argument.Resolve): Report an error 118 when trying
7646         to pass a type as argument.
7647
7648 2002-07-18  Martin Baulig  <martin@gnome.org>
7649
7650         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
7651         Conv_R_Un for the signed `long' type.
7652
7653 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
7654
7655         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
7656         `expr' for the temporary result, as that will fail if we do
7657         multiple resolves on the same expression.
7658
7659 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
7660
7661         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
7662         ec.TypeContainer for looking up aliases. 
7663
7664         * class.cs (TypeContainer): Remove LookupAlias from here.
7665
7666         * decl.cs (DeclSpace); Move here.
7667
7668 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
7669
7670         * class.cs (FindMembers): Only call filter if the constructor
7671         bulider is not null.
7672
7673         Also handle delegates in `NestedTypes' now.  Now we will perform
7674         type lookups using the standard resolution process.  This also
7675         fixes a bug.
7676
7677         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
7678         This uses Expressions (the limited kind that can be parsed by the
7679         tree) instead of strings.
7680
7681         * expression.cs (ComposedCast.ToString): Implement, used to flag
7682         errors since now we have to render expressions.
7683
7684         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
7685         FormArrayType. 
7686
7687         * ecore.cs (SimpleName.ToString): ditto.
7688
7689         * cs-parser.jay: Instead of using strings to assemble types, use
7690         Expressions to assemble the type (using SimpleName, ComposedCast,
7691         MemberAccess).  This should fix the type lookups in declarations,
7692         because we were using a different code path for this.
7693
7694         * statement.cs (Block.Resolve): Continue processing statements
7695         even when there is an error.
7696
7697 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
7698
7699         * class.cs (Event.Define): Also remove the `remove' method from
7700         the list of pending items.
7701
7702         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
7703         generate more compact code. 
7704
7705 2002-07-17  Martin Baulig  <martin@gnome.org>
7706
7707         * const.cs (Const.LookupConstantValue): Add support for constant
7708         `unchecked' and `checked' expressions.
7709         Also adding test case test-140.cs for this.
7710
7711 2002-07-17  Martin Baulig  <martin@gnome.org>
7712
7713         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
7714         check whether mi.ReturnType implements the IEnumerator interface; the
7715         `==' and the IsAssignableFrom() will fail in this situation.
7716
7717 2002-07-16  Ravi Pratap  <ravi@ximian.com>
7718
7719         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
7720         here too.
7721
7722 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7723
7724         * expression.cs: fixed bug #27811.
7725
7726 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
7727
7728         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
7729         Molaro: when we are a ref, the value already contains a pointer
7730         value, do not take the address of it.
7731
7732 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
7733         * removed mb-parser.jay and mb-tokenizer.cs
7734
7735 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
7736
7737         * expression.cs: check against the building corlib void type.
7738
7739 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
7740
7741         * ecore.cs: fix for valuetype static readonly fields: when 
7742         initializing them, we need their address, not the address of a copy.
7743
7744 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
7745
7746         * typemanager.cs: register also enum_type in corlib.
7747
7748 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
7749
7750         * class.cs: allow calling this (but not base) initializers in structs.
7751
7752 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
7753
7754         * ecore.cs: make sure we compare against the building base types
7755         in GetTypeSize ().
7756
7757 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
7758
7759         * typemanager.cs: fix TypeToCoreType() to handle void and object
7760         (corlib gets no more typerefs after this change).
7761
7762 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
7763
7764         * expression.cs (ArrayCreation.EmitArrayArguments): use
7765         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
7766
7767         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
7768         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
7769         array indexes, the runtime actually forbids them.
7770
7771         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
7772         for array arguments here.
7773
7774         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
7775         instead of the default for ValueTypes.
7776
7777         (New.DoEmit): Use IsValueType instead of
7778         IsSubclassOf (value_type)
7779         (New.DoResolve): ditto.
7780         (Invocation.EmitCall): ditto.
7781
7782         * assign.cs (Assign): ditto.
7783
7784         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
7785         Statements *are* currently doing part of their resolution during
7786         Emit.  
7787
7788         Expressions do always resolve during resolve, but statements are
7789         only required to propagate resolution to their children.
7790
7791 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
7792
7793         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
7794
7795         (LoadAssembly): Do not add the dll if it is already specified
7796
7797         (MainDriver): Add the System directory to the link path at the end,
7798         after all the other -L arguments. 
7799
7800         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
7801         wrong opcode for loading bytes and bools (ldelem.i1 instead of
7802         ldelem.u1) and using the opposite for sbytes.
7803
7804         This fixes Digger, and we can finally run it.
7805
7806         * driver.cs (UnixParseOption): Move the option parsing here.  
7807         (CSCParseOption): Implement CSC-like parsing of options.
7808
7809         We now support both modes of operation, the old Unix way, and the
7810         new CSC-like way.  This should help those who wanted to make cross
7811         platform makefiles.
7812
7813         The only thing broken is that /r:, /reference: and /lib: are not
7814         implemented, because I want to make those have the same semantics
7815         as the CSC compiler has, and kill once and for all the confussion
7816         around this.   Will be doing this tomorrow.
7817
7818         * statement.cs (Unsafe.Resolve): The state is checked during
7819         resolve, not emit, so we have to set the flags for IsUnsfe here.
7820
7821 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
7822
7823         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
7824         not catch the Error_ObjectRefRequired in SimpleName (as it is
7825         possible to have a class/instance variable name that later gets
7826         deambiguated), we have to check this here.      
7827
7828 2002-07-10  Ravi Pratap  <ravi@ximian.com>
7829
7830         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
7831         make static and put into Expression.
7832
7833         (Event.Define): Register the private field of the event with the 
7834         TypeManager so that GetFieldFromEvent can get at it.
7835
7836         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
7837         keep track of the private field associated with an event which
7838         has no accessors.
7839
7840         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
7841         private field.
7842
7843         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
7844
7845 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
7846
7847         * expression.cs (Binary.EmitBranchable): this routine emits the
7848         Binary expression in a branchable context.  This basically means:
7849         we need to branch somewhere, not just get the value on the stack.
7850
7851         This works together with Statement.EmitBoolExpression.
7852
7853         * statement.cs (Statement.EmitBoolExpression): Use
7854         EmitBranchable. 
7855
7856 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
7857
7858         * statement.cs (For): Reduce the number of jumps in loops.
7859
7860         (For): Implement loop inversion for the For statement.
7861
7862         (Break): We can be breaking out of a Try/Catch controlled section
7863         (foreach might have an implicit try/catch clause), so we need to
7864         use Leave instead of Br.
7865
7866         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
7867         now).  If the instace expression supports IMemoryLocation, we use
7868         the AddressOf method from the IMemoryLocation to extract the
7869         address instead of emitting the instance.
7870
7871         This showed up with `This', as we were emitting the instance
7872         always (Emit) instead of the Address of This.  Particularly
7873         interesting when This is a value type, as we dont want the Emit
7874         effect (which was to load the object).
7875
7876 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
7877
7878         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
7879
7880         * statement.cs (Checked): Set the CheckedState during the resolve
7881         process too, as the ConvCast operations track the checked state on
7882         the resolve process, and not emit.
7883
7884         * cs-parser.jay (namespace_member_declaration): Flag that we have
7885         found a declaration when we do.  This is used to flag error 1529
7886
7887         * driver.cs: Report ok when we display the help only.
7888
7889 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
7890
7891         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
7892
7893 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
7894
7895         * cs-tokenizer.cs (define): We also have to track locally the
7896         defines.  AllDefines is just used for the Conditional Attribute,
7897         but we also need the local defines for the current source code. 
7898
7899 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
7900
7901         * statement.cs (While, For, Do): These loops can exit through a
7902         Break statement, use this information to tell whether the
7903         statement is the last piece of code.
7904
7905         (Break): Flag that we break.
7906
7907         * codegen.cs (EmitContexts): New `Breaks' state variable.
7908
7909 2002-07-03  Martin Baulig  <martin@gnome.org>
7910
7911         * class.cs (TypeContainer.MethodModifiersValid): Allow override
7912         modifiers in method declarations in structs.  Otherwise, you won't
7913         be able to override things like Object.Equals().
7914
7915 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
7916
7917         * class.cs (Method, Property, Indexer): Do not allow the public
7918         modifier to be used in explicit interface implementations.
7919
7920         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
7921         override modifiers in method declarations in structs
7922
7923 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
7924
7925         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
7926         integer or real overflow, report an error
7927
7928 2002-07-02  Martin Baulig  <martin@gnome.org>
7929
7930         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
7931         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
7932         to tell the runtime about our newly created System.Object and
7933         System.ValueType types.
7934
7935 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
7936
7937         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
7938         struct instead of Ldarg/Starg.
7939
7940 2002-07-02  Martin Baulig  <martin@gnome.org>
7941
7942         * expression.cs (Indirection.Indirection): Call
7943         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
7944
7945 2002-07-02  Martin Baulig  <martin@gnome.org>
7946
7947         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
7948         ValueType, call TypeManager.TypeToCoreType() on it.
7949         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
7950         the OpCodes.Newarr argument.
7951
7952 2002-07-02  Martin Baulig  <martin@gnome.org>
7953
7954         * expression.cs (Invocation.EmitCall): When compiling corlib,
7955         replace all calls to the system's System.Array type to calls to
7956         the newly created one.
7957
7958         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
7959         System.Array methods.
7960         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
7961         from the system's System.Array type which must be replaced.
7962
7963 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
7964
7965         * typemanager.cs: load unverifiable_code_ctor so we can build
7966         corlib using the correct type. Avoid using GetTypeCode() with
7967         TypeBuilders.
7968         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
7969         TypeManager.object_type to allow building corlib.
7970
7971 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
7972
7973         * ecore.cs: handle System.Enum separately in LoadFromPtr().
7974
7975 2002-07-01  Martin Baulig  <martin@gnome.org>
7976
7977         * class.cs: Make the last change actually work, we need to check
7978         whether `ifaces != null' to avoid a crash.
7979
7980 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
7981
7982         * class.cs: when we build structs without fields that implement
7983         interfaces, we need to add the interfaces separately, since there is
7984         no API to both set the size and add the interfaces at type creation
7985         time.
7986
7987 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
7988
7989         * expression.cs: the dimension arguments to the array constructors
7990         need to be converted if they are a long.
7991
7992 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
7993
7994         * class.cs: don't emit ldarg.0 if there is no parent constructor
7995         (fixes showstopper for corlib).
7996
7997 2002-06-29  Martin Baulig  <martin@gnome.org>
7998
7999         MCS now compiles corlib on GNU/Linux :-)
8000
8001         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
8002         ie. check for MethodImplOptions.InternalCall.
8003
8004         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
8005         and TypeManager.attribute_type are null, so we must explicitly check
8006         whether parent is not null to find out whether it's an attribute type.
8007         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
8008         and SetBuilder, not only if the property is neither abstract nor external.
8009         This is necessary to set the MethodImplOptions on the accessor methods.
8010         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
8011         SetBuilder, see Property.Emit().
8012
8013         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
8014         populate "System.Object", "System.ValueType" and "System.Attribute" since
8015         they've already been populated from BootCorlib_PopulateCoreTypes().
8016
8017 2002-06-29  Martin Baulig  <martin@gnome.org>
8018
8019         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
8020         is the NullLiteral, we also need to make sure that target_type is not
8021         an enum type.   
8022
8023 2002-06-29  Martin Baulig  <martin@gnome.org>
8024
8025         * rootcontext.cs (RootContext.ResolveCore): We must initialize
8026         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
8027         before calling BootstrapCorlib_ResolveDelegate ().
8028
8029 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8030
8031         * statement.cs: fixed build-breaker. All tests passed ok.
8032
8033 2002-06-27  Martin Baulig  <martin@gnome.org>
8034
8035         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
8036         for System.Decimal when compiling corlib.
8037
8038 2002-06-27  Martin Baulig  <martin@gnome.org>
8039
8040         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
8041         switch blocks which contain nothing but a default clause.
8042
8043 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
8044
8045        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
8046
8047 2002-06-27  Martin Baulig  <martin@gnome.org>
8048
8049         * ecore.cs (PropertyExpr.PropertyExpr): Call
8050         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
8051
8052         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
8053         is already a TypeBuilder.
8054
8055 2002-06-27  Martin Baulig  <martin@gnome.org>
8056
8057         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
8058         `target_type == TypeManager.array_type', not IsAssignableFrom() in
8059         the "from an array-type to System.Array" case.  This makes it work
8060         when compiling corlib.
8061
8062 2002-06-27  Martin Baulig  <martin@gnome.org>
8063
8064         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
8065         non-static PropertyExpr, set its InstanceExpression.  This makes
8066         the `ICollection.Count' property work in System/Array.cs.
8067
8068 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
8069
8070         * driver.cs: Made error handling more consistent.  Errors now
8071         tracked by Report class, so many methods which used to return int
8072         now return void.  Main() now prints success/failure and 
8073         errors/warnings message.
8074
8075         Renamed '--probe' compiler argument to '--expect-error'.  Removed
8076         the magic number return values (123 and 124).  Now, if the
8077         expected error occurs, the compiler exits with success (exit value
8078         0).  If the compilation completes without seeing that particular
8079         error, the compiler exits with failure (exit value 1).  The
8080         makefile in mcs/errors has been changed to handle the new behaviour.
8081
8082         * report.cs: Made 'expected error' number a property and renamed
8083         it from 'Probe' to 'ExpectedError'.
8084
8085         * genericparser.cs: Removed error handling support, since it is
8086         now all done by Report class.
8087
8088         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
8089         class, so parse() no longer returns an int.
8090
8091         * namespace.cs: Use Report.Error instead of GenericParser.error
8092
8093 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
8094
8095         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
8096         TypeContainer.AddOperator): At the front of the list put the
8097         explicit implementations, so they get resolved/defined first. 
8098
8099 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
8100
8101         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
8102         interface type is implemented by this TypeContainer.  Used during
8103         explicit interface implementation.
8104
8105         (Property.Define, Indexer.Define, Method.Define): Validate that
8106         the given interface in the explicit implementation is one of the
8107         base classes for the containing type.
8108
8109         Also if we are explicitly implementing an interface, but there is
8110         no match in the pending implementation table, report an error.
8111
8112         (Property.Define): Only define the property if we are
8113         not explicitly implementing a property from an interface.  Use the
8114         correct name also for those properties (the same CSC uses,
8115         although that is really not needed).
8116
8117         (Property.Emit): Do not emit attributes for explicitly implemented
8118         properties, as there is no TypeBuilder.
8119
8120         (Indexer.Emit): ditto.
8121
8122         Hiding then means that we do not really *implement* a pending
8123         implementation, which makes code fail.
8124
8125 2002-06-22  Martin Baulig  <martin@gnome.org>
8126
8127         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
8128         the return value of Object.GetType().  [FIXME: we need to do this whenever
8129         we get a type back from the reflection library].
8130
8131 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
8132
8133         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
8134
8135 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
8136
8137         * attribute.cs: Return null if we can not look up the type.
8138
8139         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
8140         the interface types found.
8141
8142         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
8143         interface types found.
8144
8145         * typemanager.cs (GetInterfaces): Make this routine returns alll
8146         the interfaces and work around the lame differences between
8147         System.Type and System.Reflection.Emit.TypeBuilder in the results
8148         result for GetInterfaces.
8149
8150         (ExpandInterfaces): Given an array of interface types, expand and
8151         eliminate repeated ocurrences of an interface.  This expands in
8152         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
8153         be IA, IB, IC.
8154
8155 2002-06-21  Martin Baulig  <martin@gnome.org>
8156
8157         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
8158         on System.Enum.
8159
8160 2002-06-21  Martin Baulig  <martin@gnome.org>
8161
8162         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
8163         and called with one of the core types, return the corresponding typebuilder for
8164         that type.
8165
8166         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
8167         element type.
8168
8169 2002-06-21  Martin Baulig  <martin@gnome.org>
8170
8171         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
8172         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
8173         (Expression.ConvertReferenceExplicit): Likewise.
8174
8175         * expression.cs (ElementAccess.DoResolve): Likewise.
8176         (ElementAccess.DoResolveLValue): Likewise.
8177
8178 2002-06-10  Martin Baulig  <martin@gnome.org>
8179
8180         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
8181         add the "value" parameter to the parameter list.
8182
8183         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
8184         to our caller.
8185
8186 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
8187
8188         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
8189         the argument to an int, uint, long or ulong, per the spec.  Also
8190         catch negative constants in array creation.
8191
8192 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
8193
8194         * class.cs: do not allow the same interface to appear twice in
8195         the definition list.
8196
8197 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
8198
8199         * ecore.cs: don't use ldlen with System.Array.
8200
8201 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
8202
8203         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
8204
8205 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
8206
8207         * modifiers.cs: produce correct field attributes for protected
8208         internal. Easy fix so miguel can work on ther harder stuff:-)
8209
8210 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
8211
8212         * pending.cs: New file.  Move the code from class.cs here.
8213         Support clearning the pending flag for all methods (when not doing
8214         explicit interface implementation).
8215
8216 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
8217
8218         * rootcontext.cs: added a couple more types needed to bootstrap.
8219
8220 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
8221
8222         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
8223         constructor in the type, instead of any constructor in the type
8224         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
8225         a bug in the Mono runtime when applying the params attribute). 
8226
8227 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
8228         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
8229
8230 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
8231
8232         * expression.cs (Unary.ResolveOperator): Use TypeManager
8233         to resolve the type.
8234
8235 2002-06-13  Ravi Pratap  <ravi@ximian.com>
8236
8237         * cs-parser.jay (enum_member_declaration): Pass in the attributes
8238         attached.
8239
8240         * enum.cs (AddEnumMember): Add support to store the attributes associated 
8241         with each member too.
8242
8243         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
8244         field builders too - this takes care of the enum member case.
8245
8246 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
8247
8248         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
8249         address-of operator on both value types and pointers.
8250
8251 2002-06-10  Martin Baulig  <martin@gnome.org>
8252
8253         * interface.cs (Interface.PopulateIndexer): Add the indexer's
8254         PropertyBuilder to the `property_builders' list.
8255
8256         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
8257         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
8258         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
8259         find any indexers which are inherited from an interface.
8260
8261 2002-06-09  Martin Baulig  <martin@gnome.org>
8262
8263         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
8264         the same type as the constant if necessary.  There's also a test-130.cs
8265         for this.
8266
8267         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
8268
8269         * typemanager.cs (TypeManager.ChangeType): Previously known as
8270         Enum.ChangeEnumType().
8271
8272 2002-06-09  Martin Baulig  <martin@gnome.org>
8273
8274         * expression.cs (Cast.TryReduce): Added support for consts.
8275
8276 2002-06-08  Ravi Pratap  <ravi@ximian.com>
8277
8278         * class.cs (Accessor): Hold attributes information so we can pass
8279         it along.
8280
8281         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
8282         Modify to pass in attributes attached to the methods.
8283
8284         (add_accessor_declaration, remove_accessor_declaration): Ditto.
8285
8286         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
8287         to handle the Accessor kind :-)
8288
8289         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
8290
8291 2002-06-08  Martin Baulig  <martin@gnome.org>
8292
8293         * expression.cs (Unary.TryReduceNegative): Added support for
8294         ULongConstants.
8295
8296 2002-06-08  Martin Baulig  <martin@gnome.org>
8297
8298         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
8299         name can't be found in the `defined_names' - the caller will do a
8300         MemberLookup in this case and thus find methods in System.Enum
8301         such as Enum.IsDefined().
8302
8303 2002-06-08  Martin Baulig  <martin@gnome.org>
8304
8305         * enum.cs (Enum.ChangeEnumType): This is a custom version of
8306         Convert.ChangeType() which works with TypeBuilder created types.
8307         (Enum.LookupEnumValue, Enum.Define): Use it here.
8308
8309         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
8310         `TypeBuilder.BaseType != null' check.
8311         (TypeContainer.FindMembers): Only lookup parent members if we
8312         actually have a parent.
8313         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
8314         (ConstructorInitializer.Resolve): Likewise.
8315
8316         * interface.cs (Interface.FindMembers): Added
8317         `TypeBuilder.BaseType != null' check.
8318
8319         * rootcontext.cs (RootContext.ResolveCore): Added
8320         "System.Runtime.CompilerServices.IndexerNameAttribute" to
8321         classes_second_stage.
8322
8323         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
8324         debug_type and trace_type when compiling with --nostdlib.       
8325
8326 2002-06-07  Martin Baulig  <martin@gnome.org>
8327
8328         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
8329         (AddField): Set it to true when adding a non-static field.
8330         (DefineType): Use `have_nonstatic_fields' to find out whether we
8331         have non-static fields, not `Fields != null'.
8332
8333 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
8334
8335         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
8336         dereferencing a null on the static-field code path)
8337
8338 2002-05-30  Martin Baulig  <martin@gnome.org>
8339
8340         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
8341         to take command line arguments.  Use reflection to call the new
8342         custom `Initialize' function on the symbol writer and pass it the
8343         command line arguments.
8344
8345         * driver.cs (--debug-args): New command line argument to pass command
8346         line arguments to the symbol writer.
8347
8348 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
8349
8350         * assign.cs (DoResolve): Forgot to do the implicit conversion to
8351         the target type for indexers and properties.  Thanks to Joe for
8352         catching this.
8353
8354 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
8355
8356         * typemanager.cs (MethodFlags): returns the method flags
8357         (Obsolete/ShouldIgnore) that control warning emission and whether
8358         the invocation should be made, or ignored. 
8359
8360         * expression.cs (Invocation.Emit): Remove previous hack, we should
8361         not do this on matching a base type, we should do this based on an attribute
8362
8363         Only emit calls to System.Diagnostics.Debug and
8364         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
8365         on the command line.
8366
8367         * rootcontext.cs: Global settings for tracing and debugging.
8368
8369         * cs-tokenizer.cs (define): New utility function to track
8370         defines.   Set the global settings for TRACE and DEBUG if found.
8371
8372 2002-05-25  Ravi Pratap  <ravi@ximian.com>
8373
8374         * interface.cs (Populate*): Pass in the TypeContainer as well as
8375         the DeclSpace as parameters so that we can create EmitContexts and
8376         then use that to apply attributes etc.
8377
8378         (PopulateMethod, PopulateEvent, PopulateProperty)
8379         (PopulateIndexer): Apply attributes everywhere.
8380
8381         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
8382         etc.
8383
8384         (ApplyAttributes): Update accordingly.
8385
8386         We now apply interface attributes for all members too.
8387
8388 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
8389
8390         * class.cs (Indexer.Define); Correctly check if we are explicit
8391         implementation (instead of checking the Name for a ".", we
8392         directly look up if the InterfaceType was specified).
8393
8394         Delay the creation of the PropertyBuilder.
8395
8396         Only create the PropertyBuilder if we are not an explicit
8397         interface implementation.   This means that explicit interface
8398         implementation members do not participate in regular function
8399         lookups, and hence fixes another major ambiguity problem in
8400         overload resolution (that was the visible effect).
8401
8402         (DefineMethod): Return whether we are doing an interface
8403         implementation. 
8404
8405         * typemanager.cs: Temporary hack until we get attributes in
8406         interfaces (Ravi is working on that) and we get IndexerName
8407         support in interfaces.
8408
8409         * interface.cs: Register the indexers as properties.
8410
8411         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
8412         warning, I have verified that this is a bug in the .NET runtime
8413         (JavaScript suffers of the same problem).
8414
8415         * typemanager.cs (MemberLookup): When looking up members for
8416         interfaces, the parent of an interface is the implicit
8417         System.Object (so we succeed in searches of Object methods in an
8418         interface method invocation.  Example:  IEnumerable x;  x.ToString
8419         ()) 
8420
8421 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
8422
8423         * class.cs (Event): Events should also register if they do
8424         implement the methods that an interface requires.
8425
8426         * typemanager.cs (MemberLookup); use the new GetInterfaces
8427         method. 
8428
8429         (GetInterfaces): The code used to lookup interfaces for a type is
8430         used in more than one place, factor it here. 
8431
8432         * driver.cs: Track the errors at the bottom of the file, we kept
8433         on going.
8434
8435         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
8436         instance if the method we are calling is static!
8437
8438 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
8439
8440         * attribute.cs (ApplyAttributes): Make this function filter out
8441         the IndexerName attribute (as that attribute in reality is never
8442         applied) and return the string constant for the IndexerName
8443         attribute. 
8444
8445         * class.cs (TypeContainer.Emit): Validate that all the indexers
8446         have the same IndexerName attribute, and if so, set the
8447         DefaultName attribute on the class. 
8448
8449         * typemanager.cs: The return value might contain other stuff (not
8450         only methods).  For instance, consider a method with an "Item"
8451         property and an Item method.
8452
8453         * class.cs: If there is a problem with the parameter types,
8454         return. 
8455
8456 2002-05-24  Ravi Pratap  <ravi@ximian.com>
8457
8458         * ecore.cs (ImplicitConversionExists): Wrapper function which also
8459         looks at user defined conversion after making a call to 
8460         StandardConversionExists - we need this for overload resolution.
8461
8462         * expression.cs : Update accordingly the various method calls.
8463
8464         This fixes 2 bugs filed against implicit user defined conversions 
8465
8466 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
8467
8468         * statement.cs: Track the result of the assignment.
8469
8470 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
8471
8472         * expression.cs (MemberAccess): Improved error reporting for
8473         inaccessible members.
8474
8475 2002-05-22  Martin Baulig  <martin@gnome.org>
8476
8477         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
8478         itself with debugging support.
8479
8480 2002-05-22  Martin Baulig  <martin@gnome.org>
8481
8482         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
8483         Removed, this isn't needed anymore.
8484
8485 2002-05-20  Martin Baulig  <martin@gnome.org>
8486
8487         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
8488         be underlying type for an enum.
8489
8490 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
8491
8492         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
8493         that splits out the loading of just the core types.
8494
8495         * rootcontext.cs (ResolveCore): Split the struct resolution in
8496         two, so we can load the enumeration underlying types before any
8497         enums are used.
8498
8499         * expression.cs (Is): Bandaid until we fix properly Switch (see
8500         bug #24985 for details).
8501
8502         * typemanager.cs (ImplementsInterface): The hashtable will contain
8503         a null if there are no interfaces implemented.
8504
8505 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
8506
8507         * cs-parser.jay (indexer_declarator): It is fine to have array
8508         parameters
8509
8510 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
8511
8512         * typemanager.cs: (RegisterBuilder): New function used to register
8513         TypeBuilders that implement interfaces.  Since
8514         TypeBuilder.GetInterfaces (as usual) does not work with lame
8515         Reflection.Emit. 
8516         (AddUserType): register interfaces.
8517
8518         (ImplementsInterface): Use the builder_to_ifaces hash if we are
8519         dealing with TypeBuilder.  Also, arrays are showing up as
8520         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
8521         methods can not be invoked on them!
8522
8523         * ecore.cs (ExplicitReferenceConversionExists): Made public.
8524         (ImplicitReferenceConversionExists): Split out from
8525         StandardConversionExists. 
8526
8527         * expression.cs (As): We were only implementing one of the three
8528         cases for the as operator.  We now implement them all.
8529         (Is): Implement the various other cases for Is as well.
8530
8531         * typemanager.cs (CACHE): New define used to control if we want or
8532         not the FindMembers cache.  Seems to have a negative impact on
8533         performance currently
8534
8535         (MemberLookup): Nested types have full acess to
8536         enclosing type members
8537
8538         Remove code that coped with instance/static returns for events, we
8539         now catch this in RealFindMembers.
8540
8541         (RealFindMembers): only perform static lookup if the instance
8542         lookup did not return a type or an event.  
8543
8544 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
8545
8546         * assign.cs (CompoundAssign): We pass more semantic information
8547         now to Compound Assignments than we did before: now we have all
8548         the information at hand, and now we resolve the target *before* we
8549         do the expression expansion, which allows the "CacheValue" method
8550         to have the effect we intended (before, a [x] += 1 would generate
8551         two differen ArrayAccess expressions from the ElementAccess,
8552         during the resolution process).
8553
8554         (CompoundAssign.DoResolve): Resolve target and original_source here.
8555
8556 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
8557
8558         * expression.cs (ArrayAccess): dropped debugging information. 
8559
8560         * typemanager.cs: Small bug fix: I was always returning i_members,
8561         instead of one of i_members or s_members (depending on which had
8562         the content).
8563
8564         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
8565         method is invoked before any code generation takes place, and it
8566         is a mechanism to inform that the expression will be invoked more
8567         than once, and that the method should use temporary values to
8568         avoid having side effects
8569
8570         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
8571
8572         * ecore.cs (Expression.CacheTemporaries): Provide empty default
8573         implementation.
8574
8575         * expression.cs (Indirection, ArrayAccess): Add support for
8576         CacheTemporaries in these two bad boys. 
8577
8578         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
8579         ldobj or ldind_ref.  
8580         (StoreFromPtr): Handle stobj as well.
8581
8582         * expression.cs (UnaryMutator): Share more code.
8583
8584         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
8585         down: I was not tracking the Filter function as well, which
8586         was affecting the results of the cache.
8587
8588 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
8589
8590         * attribute.cs: Remove the hack to handle the CharSet property on
8591         StructLayouts. 
8592
8593 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
8594
8595         * attribute.cs (DoResolve): More uglyness, we now only try to
8596         resolve the attribute partially, to extract the CharSet
8597         information (only if we are a StructLayout attribute).  Otherwise 
8598
8599         (GetExtraTypeInfo): Add some code to conditionally kill in the
8600         future this.   I am more and more convinced that the .NET
8601         framework has special code to handle the attribute setting on
8602         certain elements.
8603
8604         * expression.cs (IsParamsMethodApplicable): Revert my previous
8605         foreach change here, it was wrong.
8606
8607 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
8608
8609         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
8610         (pp_expr): do not abort on unknown input, just return.
8611         (eval): abort if there are pending chars.
8612
8613         * attribute.cs (Attribute.Resolve): Positional parameters are
8614         optional.  Deal with that case.
8615
8616         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
8617         the Ansi/Unicode/Auto information for the type.
8618
8619         (TypeContainer.DefineType): instantiate the EmitContext here, as
8620         we will be using it during the type definition (to resolve
8621         attributes) and during the emit phase.
8622
8623         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
8624         to pull type information out of the attributes
8625
8626         (Attribute.Resolve): track the constructor builder, and allow for
8627         multiple invocations (structs and classes will use this).
8628
8629         * ecore.cs (MemberLookupFinal): new version with all the
8630         parameters customizable.
8631
8632         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
8633         constructors.  Return if the result value is null (as the error
8634         would have been flagged already by MemberLookupFinal)
8635
8636         Do not allow instances of abstract classes or interfaces to be
8637         created.
8638
8639         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
8640         We have to compare the assembly property here when dealing with
8641         FamANDAssem and Assembly access modifiers, because we might be
8642         creating an assembly from *modules* (that means that we are not
8643         getting TypeBuilders for types defined in other modules that are
8644         part of this assembly).
8645
8646         (Method.Emit): If the method is marked abstract and has a body,
8647         emit an error. 
8648
8649         (TypeContainer.DefineMembers): If both the defined member and the
8650         parent name match are methods, then do not emit any warnings: let
8651         the Method.Define routine take care of flagging warnings.  But if
8652         there is a mismatch (method overrides something else, or method is
8653         overriwritten by something, then emit warning).
8654
8655         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
8656         set to null, this means `do not check for the return type on the
8657         signature'. 
8658
8659         (Method.Define): set the return type for the method signature to
8660         null, so that we get methods with the same name and parameters and
8661         different return types.  This is used to flag warning 114 (you are
8662         hiding a method, and you probably want to use the new/override
8663         keywords instead).
8664
8665         * typemanager.cs (MemberLookup): Implemented proper access
8666         control, closing a long standing set of bug reports.  The problem
8667         was that the Framework only has two bits: Public and NonPublic,
8668         and NonPublic includes private and protected methods, but we need
8669         to enforce the FamANDAssem, FamOrAssem and Family. 
8670
8671 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
8672
8673         * statement.cs (GotoCase): Return true: Ammounts to giving up
8674         knowledge on whether we return or not, and letting the other case
8675         be responsible for it.
8676
8677 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
8678
8679         * driver.cs: Do not load directories for each file processed, only
8680         do it if there is a pattern.
8681
8682         * ecore.cs: Report readonly assigns here as well, as we might have
8683         been resolved only by MemberAccess.
8684
8685         (SimpleName.SimpleNameResolve): Also be useful for LValue
8686         resolution.   We need this to propagate assign to local readonly variables
8687
8688         * typemanager.cs: Use a ptrhashtable for the criteria, because we
8689         do not want to reuse potential criteria memory.
8690
8691         * class.cs (MyEventBuilder): Set reflected_type;
8692
8693         * ecore.cs (Constantify): Added support for constifying bools.
8694
8695         (RootContext.LookupType): Added a cache for values looked up in
8696         the declaration space.
8697
8698         * typemanager.cs (FindMembers): Now is a front-end to
8699         RealFindMembers, and provides a two-level hashtable-based cache to
8700         the request.  
8701
8702         15% performance improvement: from 22.5 to 19.2 seconds.
8703
8704         * expression.cs (IsParamsMethodApplicable): use foreach.
8705         (Invocation.DoResolve): ditto.
8706         (New.DoResolve): ditto.
8707         (ArrayCreation.DoResolve): ditto.
8708
8709         * ecore.cs (FindMostEncompassingType): use foreach.
8710
8711         * delegate.cs (NewDelegate.DoResolve): Use foreach
8712
8713         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
8714         (RemoveMethods): use foreach.
8715
8716         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
8717         nested foreach statements instead of for, and also break out of
8718         the inner loop once a match is found.
8719
8720         (Invocation.OverloadResolve): Use foreach, simplify the code. 
8721
8722 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
8723
8724         * cfold.cs (BinaryFold): During an enumeration evaluation context,
8725         we actually unwrap the expression to allow for extra information
8726         to be extracted. 
8727
8728         * expression.cs: Use Shr_Un on unsigned operations. 
8729
8730 2002-05-08  Ravi Pratap  <ravi@ximian.com>
8731
8732         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
8733         applicable operators was not being considered correctly. This closes
8734         the bug Miguel reported.
8735
8736 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
8737
8738         * attribute.cs: check that the type derives from System.Attribute
8739         and report the correct error in that case (moved the duplicate code to
8740         its own method, too).
8741
8742 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
8743
8744         * attribute.cs: lookup attribute type name as the spec says: first the
8745         bare attribute name and then name + "Attribute" (nant compiles with
8746         mcs after this fix).
8747
8748 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
8749
8750         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
8751         Because of the way we parse things, we should try to see if a
8752         UIntConstant can fit in an integer.
8753
8754 2002-05-07  Ravi Pratap  <ravi@ximian.com>
8755
8756         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
8757         when we are in an explicit context.
8758
8759         (ConvertReferenceExplicit): When converting from Iface type S to Class
8760         T make sure the rules are implemented as an OR.
8761
8762         * parameter.cs (ParameterType): Make it a property for now although the
8763         purpose really isn't anything immediate.
8764
8765         * expression.cs (Is*Applicable): Do better checking on the parameter type
8766         of a ref/out parameter. The ones from the system assemblies are already 
8767         marked with the correct type so we don't need to do any correction.
8768
8769         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
8770         the object type is standard too so include that.
8771
8772 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
8773
8774         * ecore.cs (StandardConversionExists): Augment with missing code:
8775         deal with IntConstant, LongConstants and Enumerations.
8776
8777         * assign.cs: Report the error, instead of failing silently
8778
8779         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
8780         typecontainer that they are declared, because the
8781         typecontainer/namespace will have the list of using clauses that
8782         need to be applied.
8783
8784         Assembly Attributes were escaping the normal registration
8785         mechanism. 
8786
8787         (EmitCode): Apply attributes within an EmitContext that represents
8788         the container they were declared on.
8789
8790         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
8791
8792 2002-05-06  Ravi Pratap  <ravi@ximian.com>
8793
8794         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
8795         Revamp completely - make much cleaner as we now operate only
8796         on a set of Types.
8797
8798         (FindMostSpecificSource, FindMostSpecificTarget): New methods
8799         to implement the logic detailed in the spec more correctly.
8800
8801         (UserDefinedConversion): Update accordingly.
8802
8803 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
8804
8805         * statement.cs: Return flow analysis information up.
8806
8807         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
8808         and the default.
8809
8810         (token): Do not consume an extra character before calling
8811         decimal_digits.
8812
8813 2002-05-06  Piers Haken <piersh@friskit.com>
8814
8815         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
8816
8817 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
8818
8819         * class.cs (Constructor.Emit): Set the IsStatic flag in the
8820         EmitContext during the instance constructor initializer
8821         resolution, to stop access to instance variables.
8822
8823         This is mandated by the spec, last paragraph of the `constructor
8824         initializers' section. 
8825
8826 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
8827
8828         * cs-parser.jay, class.cs (Accessor): new class used to represent
8829         an accessor (get or set).  In the past we used `null' to represent
8830         a missing accessor.  But this is ambiguous because there was no
8831         way to tell in abstract indexers/properties if one of them was
8832         specified.
8833
8834         Now there is a way of addressing that.
8835
8836         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
8837         instead of FindMembers.
8838
8839         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
8840         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
8841
8842         * attribute.cs: Treat indexers and properties as the same in terms
8843         of applying attributes
8844
8845         * ecore.cs (FindMostEncompassedType): Use statically initialized
8846         EmptyExpressions()s like we do elsewhere to avoid creating useless
8847         objects (and we take this out of the tight loop).
8848
8849         (GetConversionOperators): Move the code to extract the actual
8850         operators to a separate routine to clean things up.
8851
8852 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
8853
8854         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
8855         events are always registered FieldBuilders.
8856
8857         * class.cs (FieldBase): New class shared by Fields 
8858
8859         * delegate.cs: If we are a toplevel delegate, use our full name.
8860         If we are a nested delegate, then only use our tail name.
8861
8862 2002-05-02  Ravi Pratap  <ravi@ximian.com>
8863
8864         * expression.cs (IsApplicable): Ensure that we add the "&" to
8865         ref/out types before comparing it with the type of the argument.
8866
8867         (IsParamsMethodApplicable): Ditto.
8868
8869         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
8870         silly me ;-)
8871
8872         * delegate.cs : Handle the case when we have more than one applicable
8873         method. Flag an error only when we finish checking all.
8874
8875 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
8876
8877         * expression.cs: Add support for boolean static initializers.
8878
8879 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
8880
8881         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
8882
8883         * parameter.cs (ComputeParameterTypes,
8884         ComputeAndDefineParameterTypes): Better error handling: now we
8885         clear the `types' cache if we fail during any of the type lookups.
8886         We also return the status code correctly to our caller
8887
8888         * delegate.cs: If we fail to define a delegate, abort the extra
8889         steps. 
8890
8891         * expression.cs (Binary.ResolveOperator): for
8892         operator==(object,object) and operator !=(object, object) we also
8893         have to verify that there is an implicit conversion from one to
8894         the other.
8895
8896         (ArrayAccess.DoResolve): Array Access can operate on
8897         non-variables. 
8898
8899 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
8900
8901         * assign.cs (CompoundAssign): A new class used as a "flag" that
8902         the assignment actually is happening as part of a compound
8903         assignment operator.
8904
8905         During compound assignment, a few new rules exist to enable things
8906         like:
8907
8908         byte b |= 1 + 2
8909
8910         From the spec:
8911
8912         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
8913         to the type of x) if y is implicitly convertible to the type of x,
8914         and the operator is a builtin operator and the return type of the
8915         operator is explicitly convertible to the type of x. 
8916
8917         * rootcontext.cs: Reset warning level to 2.  4 catches various
8918         "interesting" features in mcs, we must clean this up at some
8919         point, but currently am trying to kill other bugs ;-)
8920
8921         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
8922         in container classes as well.  
8923
8924         * expression.cs (Binary.ResolveOperator): Handle string case
8925         before anything else (as operator overloading does emit an error
8926         before doing anything else).
8927
8928         This code could go away when we move to a table driven model, but
8929         i could not come up with a good plan last night.
8930
8931 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
8932
8933         * typemanager.cs (CSharpName): reimplementation using regex.
8934         * class.cs: added null check for fields in Emit
8935         * rootcontext.cs: set warninglevel to 4
8936
8937 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
8938
8939         * typemanager.cs (CSharpName): reimplemented with Lupus
8940         suggestion.
8941
8942 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
8943
8944         * statement.cs (If): correclty implement Resolve, because we were
8945         not catching sem errors in there.  The same process is needed
8946         everywhere else. 
8947         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
8948
8949
8950         (Statement.Warning_DeadCodeFound): Factorize code.
8951         (While): Report dead code here too.
8952
8953         (Statement): Added Resolve virtual method to allow
8954         for resolution split from the emit code.
8955
8956 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
8957
8958         * statement.cs (EmitBoolExpression): No longer try to resolve the
8959         expression here.    
8960         (MakeBoolean): New utility function that resolve, implicitly
8961         converts to boolean and tags the expression. 
8962
8963
8964         (If, Do): Implement dead code elimination.
8965         (While): Implement loop inversion
8966
8967         (Do, While, For, If): Resolve the expression prior to calling our
8968         code generation.
8969
8970 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
8971
8972         * class.cs:
8973           - added method Report28 (warning: program has more than one entry point)
8974           - added method IsEntryPoint, implements paragraph 10.1 of the spec
8975           - modified method Method.Define, the part at the end of the method
8976
8977         * rootcontext.cs: added static public Location EntryPointLocation;
8978           
8979         * ../errors/cs0028.cs : Add test case for the above warning.              
8980
8981         * typemanager.cs:
8982           - modified method CSharpName to allow arrays of primitive type to
8983             be printed nicely (e.g. instead of System.Int32[][] it now prints
8984             int[][])
8985           - added method CSharpSignature: returns the signature of a method
8986             in string format to be used in reporting errors, warnings, etc.
8987
8988         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
8989         with String.Empty.
8990
8991 2002-04-26  Ravi Pratap  <ravi@ximian.com>
8992
8993         * delegate.cs (Define): Fix extremely silly bug where I was
8994         setting the type of the 'object' parameter of the BeginInvoke
8995         method to System.IAsyncResult instead of System.Object ;-)
8996
8997 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
8998
8999         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
9000         here. 
9001
9002         (Constructor.Emit): return if we fail to initialize the
9003         constructor.  Another door closed!  
9004
9005         * expression.cs (New.DoResolve): Improve error message (from -6 to
9006         1501).  Use DeclaredOnly lookup to find the exact constructor.
9007
9008         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
9009         loop.  This is useful.
9010
9011         * cs-parser.jay: Adjust the default parameters so that destructors
9012         have the proper signature.
9013
9014 2002-04-26  Martin Baulig  <martin@gnome.org>
9015
9016         * driver.cs (LoadAssembly): If `assembly' contains any characters
9017         which are only valid in path names and not in assembly names
9018         (currently slash, backslash and point), use Assembly.LoadFrom ()
9019         instead of Assembly.Load () on the `assembly' (before iteration
9020         over the link_paths).
9021
9022 2002-04-26  Martin Baulig  <martin@gnome.org>
9023
9024         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
9025
9026 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
9027
9028         * class.cs (Property): use the new typemanager.MemberLookup
9029
9030         (TypeContainer.MemberLookup): Implement using the
9031         TypeManager.MemberLookup now. 
9032
9033         * typemanager.cs: Make MemberLookup a function of the TypeManager,
9034         and return MemberInfos, so that these can be used without an
9035         EmitContext (what we had before).
9036
9037 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
9038
9039         * expression.cs: Fix the case where the argument to params if the
9040         type of the params.  I omitted handling this before.   Fixed
9041
9042 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9043
9044         * driver.cs: Call BootCorlib_PopulateCoreType
9045
9046         * class.cs (Property.CheckBase): Check for properties only, not
9047         for all members. 
9048
9049         * interface.cs: Temporary hack: try/catch around the
9050         CustomAttributeBuilder, because I am getting an exception that I
9051         do not understand.
9052
9053         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
9054         types whose definitions are required to be there (attributes are
9055         defined before standard types).
9056
9057         Compute definitions as we boot the various types, as they are used
9058         immediately (value_type class will need object_type, but if we do
9059         not initialize object_type, we will pass a null, which will let
9060         the runtime pick the System.Object from the existing corlib, which
9061         is not what we want).
9062
9063 2002-04-22  Patrik Torstensson <totte@labs2.com>
9064
9065         * cs-tokenizer.cs: fixed a number of trim() issues.
9066
9067 2002-04-22  Ravi Pratap  <ravi@ximian.com>
9068
9069         * expression.cs (Argument.Type): Ensure that we return the correct
9070         type when we have out or ref parameters [in which case we 
9071         append a "&"].
9072
9073 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9074
9075         * class.cs (Property, Indexer): Allow extern modifier in there. 
9076
9077         * typemanager.cs (InitBaseTypes): Initializes object_type and
9078         value_type, since those will be used early on during the bootstrap
9079         process to compile corlib.
9080
9081         (InitCoreTypes): Move code from here to InitBaseTypes.
9082
9083 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
9084
9085         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
9086         single-dimension arrays as using the ldlen opcode.  
9087
9088         Daniel Lewis discovered this optimization.  
9089
9090         * typemanager.cs: Add signature for System.Array::get_Length
9091
9092 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9093
9094         * statement.cs: report the error when the foreach does not apply to an
9095         array nor a collection.
9096
9097 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
9098
9099         * expression.cs: Add implicit conversions to the operator ~.
9100
9101         * constant.cs (DecimalConstant.Emit): Emit decimal value.
9102
9103         * typemanager.cs: Locate the decimal constructor.
9104
9105 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9106
9107         * attribute.cs: use the new property of TypeOf.
9108         * expression.cs: added 'get' property around typearg.
9109
9110         These changes fix a build breaker reported by NickD. Is this the
9111         correct way to fix?  If not, please, revert my changes and make it
9112         work :-).
9113
9114 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
9115
9116         * attribute.cs: Add support for typeof in attribute invocations.
9117         I am not sure that this is right though.
9118
9119 2002-04-14  Duncan Mak  <duncan@ximian.com>
9120
9121         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
9122         Binary.Operator.Division case.
9123
9124 2002-04-13  Ravi Pratap  <ravi@ximian.com>
9125
9126         * class.cs (DefineType): Ensure that we do a proper check on
9127         attribute types and also register it with the TypeManager.
9128
9129         (TypeContainer.Targets): The default for attribute types is
9130         AttributeTargets.All.
9131
9132         * attribute.cs (ApplyAttributes): Registering the attribute type
9133         is done elsewhere, not when we discover we have a Usage attribute.
9134
9135 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9136
9137         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
9138         and get rid of is_delegate parameter.
9139
9140         * everywhere : update.
9141
9142 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9143
9144         * cs-parser.jay (compilation_unit): Revamp completely to use
9145         some new ideas that I got from Rhys' grammar to solve the problems
9146         with assembly level attributes.
9147
9148         (outer_declaration): New grammar production.
9149
9150         (attribute_sections): Add.
9151
9152         (opt_attributes): Base on attribute_sections
9153
9154         (namespace_declaration): Allow opt_attributes to tackle the case
9155         when we have assembly level attributes - we are clever in this
9156         regard now ;-)
9157
9158         * attribute.cs (ApplyAttributes): Do not worry about assembly 
9159         attributes in the non-global context.
9160
9161         * rootcontext.cs (AddGlobalAttributes): Go back to using this
9162         instead of SetGlobalAttributes.
9163
9164         * class.cs, rootcontext.cs : Ensure we define and generate 
9165         attribute types before anything else.
9166
9167         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
9168         and flag the new error -20 for the case when the attribute type
9169         does not have valid targets specified. csc does not catch this.
9170
9171         * ../errors/errors.txt : update for error # -20
9172
9173 2002-04-11  Ravi Pratap  <ravi@ximian.com>
9174
9175         * support.cs (InternalParameters.ParameterModifier): Do some null
9176         checking and return sane values.
9177
9178         * class.cs (Method.Define): If we are a PInvoke method, ensure
9179         that we are static and extern. Report error # 601
9180
9181         * ../errors/cs0601.cs : Add test case for the above error.
9182
9183 2002-04-07  Ravi Pratap  <ravi@ximian.com>
9184
9185         * rootcontext.cs (attribute_types): We need to keep type of
9186         all attribute types separately and emit code for them first.
9187
9188         (RegisterAttribute) : Implement.
9189
9190         * class.cs (DefineType): Check if the current Type is a custom
9191         attribute type and register it accordingly.
9192
9193         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
9194         adding the first attribute twice and rename to
9195
9196         (SetGlobalAttributes): this.
9197
9198         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
9199         lookups.
9200
9201         * attribute.cs (ApplyAttributes): Take an additional argument telling us
9202         if we are processing global arguments. Hmm, I am unsure of this.
9203
9204 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9205
9206         * expression.cs: added static array of strings to avoid calling
9207         Enum.ToString () for Operator in Binary. Significant recover of
9208         performance.
9209
9210 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
9211
9212         * class.cs (FindMembers): Allow the Builders of the various
9213         members to be null.  If they are skip them.  This only happens
9214         during the PInvoke declaration.
9215
9216 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
9217
9218         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
9219         failure, so we do not keep going afterwards.
9220
9221         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
9222         wanted to pass `false' as the `is_delegate' argument.  If this is
9223         the case, why not use delegate_type == null to mean `is_delegate =
9224         false' and anything else as is_delegate = true.
9225
9226 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
9227
9228         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
9229         code for the section, not the beginning of the tests.
9230
9231 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
9232
9233         * cfold.cs: Handle operator + (Enum x, Underlying x) 
9234
9235         * expression.cs (Binary): same.  Warn about errors where we have
9236         Enum/Enum in operator + as well.
9237
9238 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
9239
9240         * statement.cs:
9241                 - added support for switch(bool)
9242                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
9243                 - add TableSwitchEmit() to handle table-based switch statements
9244
9245 2002-04-05  Ravi Pratap  <ravi@ximian.com>
9246
9247         * expression.cs (Invocation.OverloadResolve): Factor out code which
9248         does parameter compatibility checking with arguments so that we can 
9249         re-use the code even from Delegate.VerifyApplicability
9250
9251         (VerifyArgumentsCompat): Move above code here.
9252
9253         * delegate.cs (VerifyApplicability): Get rid of duplicate code
9254         and instead make a call to the above method.
9255
9256 2002-03-31  Ravi Pratap  <ravi@ximian.com>
9257
9258         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
9259         We use it to keep track of classes which are attribute types.
9260
9261 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
9262
9263         * delegate.cs (Delegate.Define): Correctly define the types in the
9264         presence of fixed and array parameters.
9265
9266         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
9267         doing FindMembers.
9268
9269         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
9270         include NonPublic after the first iteration.
9271
9272         * class.cs (Indexer.CheckBase): Only check if both parents are
9273         non-null. 
9274
9275         * cs-parser.jay (accessor_body): If empty, set to null.
9276
9277         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
9278         same code path here to resolve constants names that we did have in
9279         MemberAccess.DoResolve.  There is too much code duplicated here.
9280
9281 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
9282
9283         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
9284
9285         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
9286         to MakeUnionSet.
9287
9288         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
9289         tokens, numbers and strings.
9290
9291         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
9292         parenthesis.
9293
9294         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
9295         asyncronous parameters and the regular parameters.  
9296
9297         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
9298         specify the target directory.
9299
9300         * expression.cs: (This.DoResolve): Simplify
9301         (As.Emit): Optimize, do not generate IsInst if the expression is
9302         always of the given type.
9303
9304         (Is.DoResolve): Bug fix, we were reporting both always/never for
9305         the is expression.
9306
9307         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
9308         creating too many unnecessary arrays.
9309
9310 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
9311
9312         * class.cs (EmitFieldInitializer): Use Assign expression to assign
9313         fields instead of rolling our own initializer.   Takes care of all
9314         implicit conversions, and drops unnecessary static checks/argument.
9315
9316 2002-03-31  Dick Porter  <dick@ximian.com>
9317
9318         * driver.cs: use the GetDirectories() return values properly, and
9319         use "/" as path separator.
9320
9321 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
9322
9323         * expression.cs (Unary): Optimize - - expr into expr.
9324         (Binary): Optimize a + (-b) into a -b.
9325
9326         * codegen.cs (CodeGen): Made all methods static.
9327
9328 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
9329
9330         * rootcontext.cs: 
9331
9332         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
9333         TypeBuilder property.
9334
9335         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
9336         instead. 
9337
9338         * tree.cs: Removed the various RecordXXXX, and replaced with a
9339         single RecordDecl.  Removed all the accessor methods, and just
9340         left a single access point Type 
9341
9342         * enum.cs: Rename DefineEnum to DefineType.
9343
9344         * decl.cs: New abstract method `DefineType' used to unify the
9345         Defines for Enumerations, Interfaces, TypeContainers and
9346         Delegates.
9347
9348         (FindType): Moved LookupInterfaceOrClass here.  Moved the
9349         LookupBaseClasses method that used to live in class.cs and
9350         interface.cs here, and renamed to FindType.
9351
9352         * delegate.cs: Implement DefineType.  Take advantage of the
9353         refactored pattern for locating the parent builder without taking
9354         the parent_builder argument (which we know does not work if we are
9355         nested, and triggering a toplevel definition).
9356
9357 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9358
9359         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
9360         accessibility of a member has changed during override and report
9361         an error if so.
9362
9363         * class.cs (Method.Define, Property.Define): Only complain on
9364         overrides if the method is private, any other accessibility is
9365         fine (and since we just checked the permission is the same, we are
9366         good to go).
9367
9368         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
9369         and elif are processed always.  The other pre-processing
9370         directives are only processed if we are "taking" the path
9371
9372 2002-03-29  Martin Baulig  <martin@gnome.org>
9373
9374         * class.cs (Method.Emit): Only emit symbolic debugging info if the
9375         current location is not Null.
9376
9377         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
9378         a separate method so we can profile it.
9379
9380         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
9381         `span.Seconds' are just seconds, but no minutes or hours.
9382         (MainDriver): Profile the CodeGen.SaveSymbols calls.
9383
9384 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9385
9386         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
9387         Remove the gratuitous set of Final:
9388
9389                                 // If an interface implementation, then we can set Final.
9390                                 if (((flags & MethodAttributes.Abstract) == 0) &&
9391                                     implementing.DeclaringType.IsInterface)
9392                                         flags |= MethodAttributes.Final;
9393
9394         I do not know what I was smoking when I used that.
9395
9396
9397         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
9398         step into fixing the name resolution issues for delegates and
9399         unifying the toplevel name resolution.
9400
9401 2002-03-28  Martin Baulig  <martin@gnome.org>
9402
9403         * class.cs (Method.Emit): If we have a symbol writer, call its
9404         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
9405         tell it about the current method.
9406
9407         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
9408         writer that we're going to emit the first byte of IL code for a new
9409         statement (a new source line).
9410         (EmitContext.EmitTopBlock): If we have a symbol writer, call
9411         EmitContext.Mark() before emitting any code.
9412
9413         * location.cs (SymbolDocument): Return null when we're Null.
9414
9415         * statement.cs (Statement): Moved the `Location loc' variable here.
9416         (Statement.EmitBoolExpression): If we have a symbol writer, call
9417         ec.Mark() before emitting any code to tell it that we're at the
9418         beginning of a new statement.
9419         (StatementExpression): Added `Location' argument to the constructor.
9420         (Block): Added public readonly variable `StartLocation' and public
9421         variable `EndLocation'.  The latter is to be set using SetEndLocation().
9422         (Block): Added constructor which takes a start and end location.
9423         (Block.SetEndLocation): New method. This sets the end location.
9424         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
9425         local variables we create.
9426         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
9427         each statement and do also mark the begin and end of the block.
9428
9429         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
9430         tell it the current lexer.Location, use Location.Null for the end of the
9431         block.
9432         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
9433         current block, set its end location using SetEndLocation().
9434         (statement_expression): StatementExpression constructor now takes the
9435         lexer.Location as additional argument.
9436         (for_statement, declare_local_variables): Likewise.
9437         (declare_local_variables): When creating a new implicit block, use the
9438         new Block constructor and pass it the lexer.Location.
9439
9440 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9441
9442         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
9443         members also on the parent interfaces recursively.
9444
9445 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
9446
9447         * report.cs: Use new formats, since Gonzalo finished the missing
9448         bits. 
9449
9450         * expression.cs (Binary.ResolveOperator): added missing operator|
9451         operator& and operator^ for bool/bool.
9452
9453         * cs-parser.jay: CheckDef now takes a Location argument that is
9454         used to report errors more precisly (instead of reporting the end
9455         of a definition, we try to track something which is a lot closer
9456         to the source of the problem).
9457
9458         * cs-tokenizer.cs: Track global token use, so we can properly flag
9459         the use of #define/#undef after the first token has been seen.
9460
9461         Also, rename the reportXXXX to Error_DescriptiveName
9462
9463         * decl.cs (DeclSpace.IsTopLevel): Move property here from
9464         TypeContainer, so that Enum and Interface can use this too.
9465
9466         * class.cs (TypeContainer.LookupInterfaceOrClass,
9467         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
9468         `builder' argument.  Typically this was used to pass the parent
9469         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
9470         the definition).  
9471
9472         The problem is that a nested class could trigger the definition of
9473         a toplevel class, and the builder would be obviously wrong in that
9474         case. 
9475
9476         So we drop this argument, and we compute dynamically the
9477         TypeBuilder/ModuleBuilder (the correct information was available
9478         to us anyways from DeclSpace.Parent)
9479
9480         * interface.cs (Interface.DefineInterface): Drop builder
9481         parameter cleanup like class.cs
9482
9483         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
9484         like class.cs
9485
9486         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
9487         values. 
9488
9489         (Try.Emit): Propagate the returns value from the statement.
9490
9491         (Return.Emit): Even if we are leavning 
9492
9493         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
9494
9495         * modifiers.cs: Fix the computation of MethodAttributes flags.
9496
9497 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
9498
9499         * driver.cs: allow compilation of files that start with '/'.
9500         Add a default case when checking the argument of --target.
9501
9502 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
9503
9504         * interface.cs: Implement the same search algorithm for types in
9505         the interface code.
9506
9507         * delegate.cs: Do not allow multiple definition.
9508
9509         * Recovered ChangeLog that got accidentally amputated
9510
9511         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
9512
9513         * rootcontext.cs: Load manually enum to allow core classes to
9514         contain enumerations.
9515
9516         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
9517         Update to new static methods in TypeManager.
9518
9519         * typemanager.cs (GetMethod, GetConstructor): Use our
9520         implementation of FindMembers to find the members, since during
9521         corlib compilation, the types are TypeBuilders and GetMethod and
9522         GetConstructor do not work.
9523
9524         Make all methods in TypeManager static.
9525
9526         (InitCodeHelpers): Split the functionality from
9527         the InitCodeTypes function.
9528
9529         * driver.cs: Call InitCodeHelpers after we have populated the
9530         types. 
9531
9532         * cs-parser.jay (delegate_declaration): we did not used to compute
9533         the delegate name correctly for void delegates.
9534
9535 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
9536
9537         * rootcontext.cs (RootContext): Init the interface_resolve_order
9538         and type_container_resolve_order always.
9539
9540         (ResolveCore, BootstrapCorlib_ResolveClass,
9541         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
9542         compiler when compiling with --nostdlib
9543
9544         * class.cs (TypeContainer.DefineType): Check that our parent is
9545         not null.  This test is most important when we are bootstraping
9546         the core types.
9547
9548         * codegen.cs: Split out the symbol writing code.
9549
9550 2002-03-25  Martin Baulig  <martin@gnome.org>
9551
9552         * driver.cs (-g): Made -g an alias for --debug.
9553
9554 2002-03-24  Martin Baulig  <martin@gnome.org>
9555
9556         * codegen.cs (SymbolWriter): New public variable. Returns the
9557         current symbol writer.
9558         (CodeGen): Added `bool want_debugging_support' argument to the
9559          constructor. If true, tell the ModuleBuild that we want debugging
9560         support and ask it for the ISymbolWriter.
9561         (Save): If we have a symbol writer, call it's Close() method after
9562         saving the assembly.
9563
9564         * driver.c (--debug): New command line argument to create a
9565         debugger information file.
9566
9567         * location.cs (SymbolDocument): New public property. Returns an
9568         ISymbolDocumentWriter object for the current source file or null
9569         if we don't have a symbol writer.
9570
9571 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
9572
9573         * driver.cs (LoadAssembly): Correctly return when all the paths
9574         have been tried and not before.
9575
9576         * statement.cs (Switch.Emit): return the actual coverage for this
9577         statement (returns/not-returns)
9578
9579         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
9580         switch of the statement if we are the last switch section.  That
9581         kills two problems: try/catch problems (we used to emit an empty
9582         nop at the end) and switch statements where all branches would
9583         return. 
9584
9585 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
9586
9587         * driver.cs: Add default assemblies (the equivalent to the
9588         Microsoft CSC.RSP file)
9589
9590         * cs-tokenizer.cs: When updating `cols and setting it to zero,
9591         also update tokens_seen and set it to false.
9592
9593         * driver.cs: Implement --recurse for Mike.
9594
9595         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
9596         correctly splitting out the paths.
9597
9598 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
9599
9600         * interface.cs (Interface.PopulateProperty): Instead of using
9601         `parent' as the declaration space for the set parameters, use
9602         `this' 
9603
9604         * support.cs (InternalParameters): InternalParameters constructor
9605         takes a DeclSpace instead of a TypeContainer.
9606
9607         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
9608         types are being initialized, load the address of it before calling
9609         the function.  
9610
9611         (New): Provide a mechanism to disable the generation of local
9612         value type temporaries when the caller will be providing us with
9613         an address to store it.
9614
9615         (ArrayCreation.EmitDynamicInitializers): Use it.
9616
9617 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
9618
9619         * expression.cs (Invocation.EmitArguments): Only probe for array
9620         property if there is more than one argument.  Sorry about that.
9621
9622         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
9623         empty param arrays.
9624
9625         * class.cs (Method.LabelParameters): Fix incorrect code path that
9626         prevented the `ParamArrayAttribute' from being applied to the
9627         params attribute.
9628
9629 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
9630
9631         * support.cs (ReflectionParameters): Correctly compute whether the
9632         last argument is a params array.  Fixes the problem with
9633         string.Split ('a')
9634
9635         * typemanager.cs: Make the assemblies array always be non-null
9636         (empty, but non-null)
9637
9638         * tree.cs (RecordDecl): New function that abstracts the recording
9639         of names.  This reports error 101, and provides a pointer to the
9640         previous declaration.  Fixes a crash in the compiler.
9641
9642         * cs-parser.jay (constructor_declaration): Update to new grammar,
9643         and provide a constructor_body that can be empty.
9644
9645 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
9646
9647         * driver.cs: Add support for --resources.
9648
9649         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
9650         Make all types for the various array helper methods be integer.
9651
9652         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
9653         CheckState to ConvCast.
9654
9655         (ConvCast): Now it takes a `checked' state argument, to avoid
9656         depending on the emit context for the conversion, and just using
9657         the resolve time setting.
9658
9659         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
9660         instead of Invocation.EmitArguments.  We do not emit the original
9661         arguments, instead we emit those which have been converted to
9662         unsigned int expressions.
9663
9664         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
9665
9666         * codegen.cs: ditto.
9667
9668         * expression.cs (LocalVariableReference): Drop the use of the
9669         Store function that depended on the variable index.
9670
9671         * statement.cs (VariableInfo): Drop the `Idx' property from this
9672         class, as this is not taking into account the indexes for
9673         temporaries tat we generate during the execution, getting the
9674         indexes wrong.
9675
9676         * class.cs: First emit class initializers, then call the parent
9677         constructor. 
9678
9679         * expression.cs (Binary): Fix opcode emision.
9680         (UnaryMutator.EmitCode): Support checked code generation
9681
9682         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
9683         matches for events for both the Static and Instance scans,
9684         pointing to the same element.   Fix that.
9685
9686 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
9687
9688         * rootcontext.cs (ResolveTree): Always set the
9689         interface_resolve_order, because nested interfaces will be calling
9690         into us.
9691
9692         * class.cs (GetInterfaceOrClass): Track the same resolution
9693         process used by TypeManager.LookupType.  This fixes the nested
9694         type lookups in class declarations (separate path from
9695         LookupType). 
9696
9697         (TypeContainer.DefineType): Also define nested interfaces.
9698         (TypeContainer.RegisterOrder): New public function used to
9699         register the order in which child interfaces need to be closed.
9700
9701         Nested interfaces need to be closed after their parents have been
9702         created. 
9703
9704         * interface.cs (InterfaceAttr): Put all the logic for computing
9705         the interface attribute here. 
9706
9707         (DefineInterface): Register our interface order with the
9708         RootContext or with the TypeContainer depending on the case.
9709
9710 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
9711
9712         * cs-parser.jay: rework foreach statement to work with the new
9713         changes to the policy on SimpleNames.
9714
9715         * report.cs: support Stacktrace on warnings as well.
9716
9717         * makefile: drop --unsafe and /unsafe from the compile.
9718
9719 2002-03-13  Ravi Pratap  <ravi@ximian.com>
9720
9721         * ecore.cs (StandardConversionExists): Modify to take an Expression
9722         as the first parameter. Ensure we do null -> reference type conversion
9723         checking.
9724
9725         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
9726         temporary Expression objects.
9727
9728 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
9729
9730         * interface.cs: workaround bug in method overloading resolution
9731         (there is already a bugzilla bug for it).
9732
9733 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
9734
9735         We could also solve this problem by having a separate path for
9736         performing type lookups, instead of DoResolve, we could have a
9737         ResolveType entry point, and only participating pieces of the
9738         production (simplename, deref, array) would implement this. 
9739
9740         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
9741         signal SimpleName to only resolve type names and not attempt to
9742         resolve anything else.
9743
9744         * expression.cs (Cast): Set the flag.
9745
9746         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
9747
9748         * class.cs: Only report 108 if there is no `new' modifier.
9749
9750         * cs-parser.jay: rework foreach statement to work with the new
9751         changes to the policy on SimpleNames.
9752
9753         * report.cs: support Stacktrace on warnings as well.
9754
9755         * makefile: drop --unsafe and /unsafe from the compile.
9756
9757 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
9758
9759         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
9760         lookups here, instead of doing that at parse time.  This means
9761         that our grammar will not introduce `LocalVariableReferences' as
9762         expressions at this point.  That solves the problem of code like
9763         this:
9764
9765         class X {
9766            static void Main ()
9767            { int X = 1;
9768             { X x = null }}}
9769
9770         This is only half the fix.  The full fix requires parameters to
9771         also be handled in this way.
9772
9773         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
9774         makes the use more obvious of the DeclSpace.  The
9775         ec.TypeContainer.TypeBuilder is now only used to pull the
9776         TypeBuilder for it.
9777
9778         My theory is that I can get rid of the TypeBuilder completely from
9779         the EmitContext, and have typecasts where it is used (from
9780         DeclSpace to where it matters).  
9781
9782         The only pending problem is that the code that implements Aliases
9783         is on TypeContainer, and probably should go in DeclSpace.
9784
9785         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
9786         lookups here, instead of doing that at parse time.  This means
9787         that our grammar will not introduce `LocalVariableReferences' as
9788         expressions at this point.  That solves the problem of code like
9789         this:
9790
9791         class X {
9792            static void Main ()
9793            { int X = 1;
9794             { X x = null }}}
9795
9796         This is only half the fix.  The full fix requires parameters to
9797         also be handled in this way.
9798
9799         * class.cs (Property.DefineMethod): When implementing an interface
9800         method, set newslot, when implementing an abstract method, do not
9801         set the flag (before we tried never setting it, or always setting
9802         it, which is the difference).
9803         (Indexer.DefineMethod): same.
9804         (Method.DefineMethod): same.
9805
9806         * ecore.cs: Only set the status used flag if we get back a Field.
9807
9808         * attribute.cs: Temporary hack, so Paolo can keep working.
9809
9810 2002-03-08  Ravi Pratap  <ravi@ximian.com>
9811
9812         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
9813         the unmanaged type in the case we have a MarshalAs attribute.
9814
9815         (Resolve): Handle the case when we are parsing the special MarshalAs
9816         attribute [we need to store the unmanaged type to use later]
9817
9818         * typemanager.cs (marshal_as_attr_type): Built in type for the 
9819         MarshalAs Attribute.
9820
9821         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
9822         on parameters and accordingly set the marshalling info.
9823
9824 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
9825
9826         * class.cs: Optimizing slightly by removing redundant code after
9827         we switched to the `NoTypes' return value.
9828         (Property.DefineMethod): use NoTypes here too.
9829
9830         This fixes the bug I introduced in my last batch of changes.
9831
9832 2002-03-05  Ravi Pratap  <ravi@ximian.com>
9833
9834         * tree.cs (RecordEnum): Add. We now keep track of enums too.
9835
9836         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
9837         Enums since those are types too. 
9838
9839         * cs-parser.jay (enum_declaration): Record enums as we parse them.
9840
9841         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
9842         thanks to a call during the lookup process.
9843
9844 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
9845
9846         * statement.cs (Foreach): Lots of work to accomodate a particular
9847         kind of foreach statement that I had not kept in mind.  It is
9848         possible to have foreachs on classes that provide a GetEnumerator
9849         method that return objects that implement the "pattern" for using
9850         a foreach, there is no need to support GetEnumerator
9851         specifically. 
9852
9853         This is needed to compile nant.
9854
9855         * decl.cs: Only report 114 if the member is not `Finalize' and if
9856         the warning level is at least 2.
9857
9858         * class.cs: Moved the compare function from Method to
9859         MethodSignature. 
9860
9861         (MethodSignature.InheritableMemberSignatureCompare): Add new
9862         filter function that is used to extract inheritable methods from a
9863         class. 
9864
9865         (Method.Define): Use the new `inheritable_method_signature_filter'
9866         delegate
9867
9868         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
9869         command. 
9870
9871 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
9872
9873         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
9874
9875         * cs-parser.jay: Add opt_semicolon to the interface declaration.
9876
9877         * expression.cs: Pass location information to
9878         ConvertImplicitStandard. 
9879
9880         * class.cs: Added debugging code to track return values from
9881         interfaces. 
9882
9883 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
9884
9885         * expression.cs (Is.DoResolve): If either side of the `is' is an
9886         interface, do not flag the warning.
9887
9888         * ecore.cs (ImplicitReferenceConversion): We need a separate test
9889         for interfaces
9890
9891         * report.cs: Allow for --fatal to be used with --probe.
9892
9893         * typemanager.cs (NoTypes): Move the definition for the empty Type
9894         array here. 
9895
9896         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
9897         properties. 
9898         (TypeContainer.DefineProxy): New function used to proxy to parent
9899         implementations when implementing interfaces.
9900         (TypeContainer.ParentImplements): used to lookup if our parent
9901         implements a public function that is required by an interface.
9902         (TypeContainer.VerifyPendingMethods): Hook this up.
9903
9904         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
9905         `modules' and `assemblies' arraylists into arrays.  We only grow
9906         these are the very early start up of the program, so this improves
9907         the speedof LookupType (nicely measured).
9908
9909         * expression.cs (MakeByteBlob): Replaced unsafe code with
9910         BitConverter, as suggested by Paolo.
9911
9912         * cfold.cs (ConstantFold.Binary): Special case: perform constant
9913         folding of string concatenation, but if either side is a string,
9914         and the other is not, then return null, and let the runtime use
9915         the concatenation on the string plus the object (using
9916         `Object.ToString'). 
9917
9918 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
9919
9920         Constant Folding has been implemented now.
9921
9922         * expression.cs (Unary.Reduce): Do not throw an exception, catch
9923         the error instead on types that are not supported in one's
9924         complement. 
9925
9926         * constant.cs (Constant and all children): New set of functions to
9927         perform implict and explicit conversions.
9928
9929         * ecore.cs (EnumConstant): Implement the new functions to perform
9930         conversion by proxying to the child expression.
9931
9932         * codegen.cs: (ConstantCheckState): Constant evaluation has its
9933         own separate setting that can not be turned off from the command
9934         line using --unchecked or --checked and is only controlled using
9935         the checked/unchecked statements and expressions.  This setting is
9936         used by the constant folder to flag errors.
9937
9938         * expression.cs (CheckedExpr, UncheckedExpr): Set the
9939         ConstantCheckState as well.   
9940
9941         During Resolve, they also have to flag the state, because the
9942         constant folder runs completely in the Resolve phase.
9943
9944         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
9945         well.
9946
9947 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
9948
9949         * cfold.cs: New file, this file contains the constant folder.
9950
9951         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
9952         argument to track whether we are using the resulting address to
9953         load or store a value and provide better error messages. 
9954
9955         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
9956         new AddressOf arguments.
9957
9958         * statement.cs (Foreach.EmitCollectionForeach): Update
9959
9960         * expression.cs (Argument.Emit): Call AddressOf with proper
9961         arguments to track usage.
9962
9963         (New.DoEmit): Call AddressOf with new arguments.
9964
9965         (Unary.Emit): Adjust AddressOf call.
9966
9967 2002-03-01  Ravi Pratap  <ravi@ximian.com>
9968
9969         * cs-parser.jay (member_access): Change the case for pre-defined types
9970         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
9971         this suggestion.
9972
9973         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
9974         a method body.
9975
9976         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
9977         essentially like methods and apply attributes like MethodImplOptions to them too.
9978
9979         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
9980         not being null.
9981
9982         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
9983         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
9984         is the DeclSpace.
9985
9986         * Update code everywhere accordingly.
9987
9988         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
9989
9990         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
9991
9992 2002-02-28  Ravi Pratap  <ravi@ximian.com>
9993
9994         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
9995         try performing lookups against those instead of jumping straight into using
9996         the 'using' clauses.
9997
9998         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
9999
10000         (LookupType): Perform lookups in implicit parents too.
10001
10002         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
10003         sequence as RootContext.LookupType. 
10004
10005         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
10006         the various cases of namespace lookups into this method.
10007
10008 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
10009
10010         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
10011         in positional arguments)
10012
10013         * class.cs (Operator): Update the AllowedModifiers to contain
10014         extern. 
10015
10016         * cs-parser.jay: Update operator declaration to allow for the
10017         operator body to be empty.
10018
10019         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
10020         values. 
10021
10022 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
10023
10024         * class.cs (Method.Emit): Label parameters.
10025
10026         * driver.cs: Return 1 or 0 as the program exit code.
10027
10028 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
10029
10030         * expression.cs: Special case the `null' object when trying to
10031         auto-compute the type, as anything can be explicitly converted to
10032         that. 
10033
10034         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
10035         spotting this Paolo.
10036
10037         (Expression.ImplicitNumericConversion): Perform comparissions of
10038         the type using the underlying type in the case of an enumeration
10039         rather than using the enumeration type for the compare.
10040
10041         Cope with the underlying == type case, which is not possible to
10042         catch before. 
10043
10044         (Expression.ConvertNumericExplicit): Perform comparissions of
10045         the type using the underlying type in the case of an enumeration
10046         rather than using the enumeration type for the compare.
10047
10048         * driver.cs: If the user does not supply an extension, assume .exe
10049
10050         * cs-parser.jay (if_statement): Rewrote so that we can track the
10051         location for the if statement.
10052
10053         * expression.cs (Binary.ConstantFold): Only concat strings when
10054         the operation is "+", not everything ;-)
10055
10056         * statement.cs (Statement.EmitBoolExpression): Take a location
10057         argument. 
10058         (If, While, Do): Track location.
10059
10060         * expression.cs (Binary.ResolveOperator): In the object + string
10061         case, I was missing a call to ConvertImplicit
10062
10063 2002-02-25  Ravi Pratap  <ravi@ximian.com>
10064
10065         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
10066         Location arguments. Ensure we use RootContext.LookupType to do our work
10067         and not try to do a direct Type.GetType and ModuleBuilder.GetType
10068
10069         * interface.cs (PopulateMethod): Handle the type of the parameter being
10070         null gracefully.
10071
10072         * expression.cs (Invocation.BetterFunction): Handle the case when we 
10073         have a params method with no fixed arguments and a call is made with no
10074         arguments.
10075
10076 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
10077
10078         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
10079         the verbatim-string-literal
10080
10081         * support.cs (InternalParameters.ParameterModifier): handle null
10082         fixed parameters.
10083         (InternalParameters.ParameterType): ditto.
10084
10085         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
10086         duplicating the name of the variable parameter.
10087         (GetParameterByName): Fix bug where we were not looking up array
10088         paramters if they were the only present (thanks Paolo!).
10089         (GetParameterInfo): We only have an empty set of types if both
10090         fixed and array are set to null.
10091         (GetParameterInfo-idx): Handle FixedParameter == null
10092
10093         * cs-parser.jay: Handle the case where there is no catch
10094         statements (missing null test).
10095
10096 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
10097
10098         * driver.cs (MainDriver): Be conservative on our command line
10099         handling.
10100
10101         Catch DirectoryNotFoundException when calling GetFiles.
10102
10103         (SplitPathAndPattern): Used to split the input specification into
10104         a path and a pattern that we can feed to Directory.GetFiles.
10105
10106 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
10107
10108         * statement.cs (Fixed): Implement the last case of the Fixed
10109         statement (string handling).
10110
10111         * expression.cs (StringPtr): New class used to return a char * to
10112         a string;  Used by the Fixed statement.
10113
10114         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
10115
10116         * expression.cs (Binary.ResolveOperator): Remove redundant
10117         MemberLookup pn parent type.
10118         Optimize union call, we do not need a union if the types are the same.
10119         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
10120         type.
10121
10122         Specialize the use of MemberLookup everywhere, instead of using
10123         the default settings. 
10124
10125         (StackAlloc): Implement stackalloc keyword.
10126
10127         * cs-parser.jay: Add rule to parse stackalloc.
10128
10129         * driver.cs: Handle /h, /help, /?
10130
10131         * expression.cs (MakeByteBlob): Removed the hacks we had in place
10132         before we supported unsafe code.
10133
10134         * makefile: add --unsafe to the self compilation of mcs.
10135
10136 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
10137
10138         * expression.cs (PointerArithmetic): New class that is used to
10139         perform pointer arithmetic.
10140         (Binary.Resolve): Handle pointer arithmetic
10141         Handle pointer comparission.
10142         (ArrayPtr): Utility expression class that is used to take the
10143         address of an array.
10144
10145         (ElementAccess): Implement array access for pointers
10146
10147         * statement.cs (Fixed): Implement fixed statement for arrays, we
10148         are missing one more case before we are done.
10149
10150         * expression.cs (Indirection): Implement EmitAssign and set the
10151         ExprClass to Variable.  This allows pointer dereferences to be
10152         treated as variables, and to have values assigned to them.
10153
10154         * ecore.cs (Expression.StoreFromPtr): New utility function to
10155         store values dereferencing.
10156
10157 2002-02-20  Ravi Pratap  <ravi@ximian.com>
10158
10159         * expression.cs (Binary.ResolveOperator): Ensure that we are
10160         not trying to operate on a void type - this fixes the reported
10161         bug.
10162
10163         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
10164         the parent implementation is sealed.
10165
10166         * ../errors/cs0239.cs : Add.
10167
10168         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
10169
10170         * typemanager.cs (unverifiable_code_type): Corresponds to 
10171         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
10172         which have unsafe code in them.
10173
10174         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
10175         unsafe context.
10176
10177 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
10178
10179         * cs-tokenizer.cs: Add support for @"litreal strings"
10180
10181         Make tokenizer accept pre-processor directives
10182         on any column (remove the old C-like limitation). 
10183
10184         * rootcontext.cs (EmitCode): Emit any global attributes.
10185         (AddGlobalAttributes): Used to keep track of assembly attributes. 
10186
10187         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
10188
10189         * cs-parser.jay: Add support for global attributes.  
10190
10191 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
10192
10193         * expression.cs (Indirection): New helper class.  Unary will
10194         create Indirection classes to be able to implement the
10195         IMemoryLocation interface on it.
10196
10197 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
10198
10199         * cs-parser.jay (fixed_statement): reference the right statement.
10200
10201         * statement.cs (Fixed.Emit): Finish implementing the fixed
10202         statement for the &x case.
10203
10204 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
10205
10206         * class.cs (Property.Define, Method.Define): Remove newslot when
10207         `implementing'.  
10208
10209         * modifiers.cs: My use of NewSlot when `Abstract' was set was
10210         wrong.  NewSlot should only be used if the `new' keyword is present.
10211
10212         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
10213         locating our system dir.  Sorry about this.
10214
10215 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10216
10217         * driver.cs (GetSystemDir): Compute correctly the location of our
10218         system assemblies.  I was using the compiler directory instead of
10219         the library directory.
10220
10221 2002-02-13  Ravi Pratap  <ravi@ximian.com>
10222
10223         * expression.cs (BetterFunction): Put back in what Miguel commented out
10224         since it is the correct fix. The problem is elsewhere ;-)
10225
10226         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
10227         parameters of the parms method are themselves compatible or not !
10228
10229         (StandardConversionExists): Fix very dangerous bug where we were forgetting
10230         to check that a class implements an interface before saying that an implicit
10231         conversion was allowed. Use ImplementsInterface to do the checking.
10232
10233 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10234
10235         * class.cs (Method.Define): Track whether we are an explicit
10236         implementation or not.  And only call DefineMethodOverride if we
10237         are an explicit implementation.
10238
10239         (Property.DefineMethod): Ditto.
10240
10241 2002-02-11  Ravi Pratap  <ravi@ximian.com>
10242
10243         * expression.cs (BetterFunction): Catch hideous bug which was
10244          preventing us from detecting ambiguous calls due to implicit casts i.e
10245         cs0121.
10246
10247 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
10248
10249         * support.cs (Pair): Remove un-needed method.  I figured why I was
10250         getting the error in cs-parser.jay, the variable in a foreach loop
10251         is readonly, and the compiler does not really treat this as a variable.
10252
10253         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
10254         instead of EQUALS in grammar.  
10255
10256         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
10257
10258         * expression.cs (Unary.DoResolve): Check whether the argument is
10259         managed or not.
10260
10261 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
10262
10263         * support.cs: Api for Pair to set a value.  Despite the fact that
10264         the variables are public the MS C# compiler refuses to compile
10265         code that accesses the field if the variable is part of a foreach
10266         statement. 
10267
10268         * statement.cs (Fixed): Begin implementation of the fixed
10269         statement.
10270
10271         (Block.AddVariable): Return the VariableInfo on success and null
10272         on failure instead of true/false. 
10273
10274         * cs-parser.jay (foreach): Catch errors on variables already
10275         defined (we were ignoring this value before) and properly unwind
10276         the block hierarchy
10277
10278         (fixed_statement): grammar for the fixed statement.
10279
10280 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
10281
10282         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
10283         pointer types to be incretemented.
10284
10285         (SizeOf): Implement.
10286
10287         * cs-parser.jay (pointer_member_access): Implement
10288         expr->IDENTIFIER production.
10289
10290         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
10291         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
10292         on safe contexts.
10293
10294         (Unary): Implement indirection.
10295
10296         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
10297         use in non-unsafe context).
10298
10299         (SimpleName.DoResolve): Check for pointers in field access on safe
10300         contexts. 
10301
10302         (Expression.LoadFromPtr): Factor the load-indirect code in this
10303         function.  This was duplicated in UnboxCast and ParameterReference
10304
10305 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
10306
10307         * expression.cs (ComposedCast): report an error if a pointer cast
10308         is used in a safe region.
10309
10310         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
10311         pointer type casts in unsafe context.
10312
10313         * codegen.cs (EmitContext): Set up IsUnsafe.
10314
10315         * cs-parser.jay (non_expression_type): Add productions for pointer
10316         casts. 
10317
10318         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
10319         code.  We should not use force into static mode if the method is
10320         not virtual.  Fixes bug in MIS
10321
10322         * statement.cs (Do.Emit, While.Emit, For.Emit,
10323         Statement.EmitBoolExpression): Add support to Do and While to
10324         propagate infinite loop as `I do return' semantics.
10325
10326         Improve the For case to also test for boolean constants.
10327
10328         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
10329         to the list of attributes we can add.
10330
10331         Remove `EmitContext' argument.
10332
10333         * class.cs (Method.Define): Apply parameter attributes.
10334         (Constructor.Define): Apply parameter attributes.
10335         (MethodCore.LabelParameters): Move here the core of labeling
10336         parameters. 
10337
10338         * support.cs (ReflectionParameters.ParameterModifier,
10339         InternalParameters.ParameterModifier): Use IsByRef on the type and
10340         only return the OUT bit for these parameters instead of in/out/ref
10341         flags.
10342
10343         This is because I miss-understood things.  The ParameterInfo.IsIn
10344         and IsOut represent whether the parameter has the [In] and [Out]
10345         attributes set.  
10346
10347 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
10348
10349         * ecore.cs (FieldExpr.Emit): Release temporaries.
10350
10351         * assign.cs (LocalTemporary.Release): new function.
10352
10353         * codegen.cs (EmitContext.GetTemporaryStorage,
10354         EmitContext.FreeTemporaryStorage): Rework the way we deal with
10355         temporary storage.  Now we can "put back" localbuilders when we
10356         are done with them
10357
10358 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
10359
10360         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
10361         need to make a copy of the variable to generate verifiable code.
10362
10363 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
10364
10365         * driver.cs: Compute dynamically the system directory.
10366
10367         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
10368         Slower, but more generally useful.  Used by the abstract
10369         registering implementation. 
10370
10371         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
10372         the rules for the special rule on Type/instances.  First check if
10373         we have the same name, and if so, try that special static path
10374         rather than the instance path.
10375
10376 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
10377
10378         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
10379         for, while and if.
10380
10381         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
10382         Enum, ValueType, Delegate or Array for non-corlib compiles.
10383
10384         * cs-tokenizer.cs: Catch long identifiers (645)
10385
10386         * typemanager.cs (IndexerPropetyName): Ravi never tested this
10387         piece of code.
10388
10389         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
10390         fix, we were returning too early, so we were not registering
10391         pending methods from abstract classes.
10392
10393         Do not register pending methods if the class is abstract.
10394
10395         * expression.cs (Conditional.DoResolve): Report circular implicit
10396         conversions when we neecd to compute it for conditional
10397         expressions. 
10398
10399         (Is.DoResolve): If the expression is always of the provided type,
10400         flag warning 183.  If the expression can not ever be of the
10401         provided type flag warning 184.
10402
10403         * class.cs: Catch 169 as well.
10404
10405         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
10406         read. 
10407
10408 2002-01-18  Nick Drochak  <ndrochak@gol.com>
10409
10410         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
10411
10412 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
10413
10414         * interface.cs: (PopulateMethod): Check for pointers being defined
10415         only if the unsafe context is active.
10416         (PopulateProperty): ditto.
10417         (PopulateIndexer): ditto.
10418
10419         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
10420         specified.  If pointers are present, make sure that they are
10421         present in an unsafe context.
10422         (Constructor, Constructor.Define): ditto.
10423         (Field, Field.Define): ditto.
10424         (Property, Property.Define): ditto.
10425         (Event, Event.Define): ditto.
10426
10427         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
10428         hashtable if there are classes or structs defined.
10429
10430         * expression.cs (LocalVariableReference.DoResolve): Simplify this
10431         code, as the constant resolution moved.
10432
10433         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
10434         the metadata, so we can flag error 133. 
10435
10436         * decl.cs (MemberCore.UnsafeOK): New function to test that a
10437         pointer is being declared in an unsafe context.
10438
10439 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
10440
10441         * modifiers.cs (Modifiers.Check): Require a Location argument.
10442         Report error 227 for Unsafe use.
10443
10444         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
10445
10446         * statement.cs (For.Emit): If the test is null, then report that
10447         we do `return', as we wont reach anything afterwards.
10448
10449         (Switch.SwitchGoverningType): Track the expression that matched
10450         the conversion.
10451
10452         * driver.cs: Allow negative numbers as an error code to flag.
10453
10454         * cs-parser.jay: Handle 1551.
10455
10456         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
10457
10458 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
10459
10460         * cs-parser.jay: Report 1518 (type declaration can only contain
10461         class, struct, interface, enum or delegate)
10462
10463         (switch_label): Report 1523 (keywords `case' or `default' must
10464         preced code)
10465
10466         (opt_switch_sections): Report 1522 (empty switch)
10467
10468         * driver.cs: Report 1515 (response file specified multiple times)
10469         Report 1516 (Source file specified multiple times).
10470
10471         * expression.cs (Argument.Resolve): Signal 1510
10472
10473         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
10474         access not allowed in static code)
10475
10476 2002-01-11  Ravi Pratap  <ravi@ximian.com>
10477
10478         * typemanager.cs (IsPointerType): Utility method which we are going
10479         to need a lot.
10480
10481         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
10482         the object type, so we take care of that.
10483
10484         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
10485
10486         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
10487         added to non-params parameters :-)
10488
10489         * typemanager.cs (CSharpName): Include 'void' type too. 
10490
10491         (void_ptr_type): Include in the set of core types.
10492
10493         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
10494         duplicating code.
10495
10496         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
10497         an unsafe context.
10498
10499         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
10500         completely forgotten about it.
10501
10502 2002-01-10  Ravi Pratap  <ravi@ximian.com>
10503
10504         * cs-parser.jay (pointer_type): Add. This begins our implementation
10505         of parsing rules for unsafe code.
10506
10507         (unsafe_statement): Implement.
10508
10509         (embedded_statement): Modify to include the above.
10510
10511         * statement.cs (Unsafe): Implement new class for unsafe blocks.
10512
10513         * codegen.cs (EmitContext.InUnsafe): Add. This determines
10514         if the current context is an unsafe one.
10515
10516         * cs-parser.jay (local_variable_pointer_type): Since local variable types
10517         are handled differently, we need separate rules for them.
10518
10519         (local_variable_declaration): Update to use local_variable_pointer_type
10520         to allow variable declarations of unmanaged pointer types.
10521
10522         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
10523         in unsafe contexts.
10524
10525         * ../errors/cs0214.cs : Add.
10526
10527 2002-01-16  Nick Drochak  <ndrochak@gol.com>
10528
10529         * makefile: remove 'response' file when cleaning.
10530
10531 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
10532
10533         * cs-parser.jay: Report 1524.
10534
10535 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
10536
10537         * typemanager.cs (RegisterMethod): drop checking if we have
10538         registered this from here
10539
10540 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
10541
10542         * class.cs (Method.EmitDestructor): Implement calling our base
10543         destructor. 
10544
10545         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
10546         value of InFinally.
10547
10548         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
10549         this routine and will wrap the call in a try/catch block.  Deal
10550         with the case.
10551
10552 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
10553
10554         * ecore.cs (Expression.MemberLookup): instead of taking a
10555         parameter `same_type' that was used to tell whether we could
10556         access private members we compute our containing type from the
10557         EmitContext.
10558
10559         (FieldExpr): Added partial support for volatile fields.  This does
10560         not work for volatile fields exposed from assemblies, as I can not
10561         figure out how to extract the modreq from it.
10562
10563         Updated all the source files to use this.
10564
10565         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
10566         because it is referenced by MemberLookup very often. 
10567
10568 2002-01-09  Ravi Pratap  <ravi@ximian.com>
10569
10570         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
10571         TypeBuilder.GetCustomAttributes to retrieve what we need.
10572
10573         Get rid of redundant default_member_attr_type as this is the same as
10574         default_member_type which already exists.
10575
10576         * interface.cs, attribute.cs : Update accordingly.
10577
10578 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
10579
10580         * typemanager.cs: Enable IndexerPropertyName again.  It does not
10581         work for TYpeBuilders though.  Ravi, can you please fix this?
10582
10583         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
10584
10585         * expression.cs (Argument.Emit): Handle the case of ref objects
10586         being passed to ref functions;  
10587
10588         (ParameterReference.EmitLoad): Loads the content of the pointer
10589         without dereferencing.
10590
10591 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
10592
10593         * cs-tokenizer.cs: Implemented the pre-processing expressions.
10594
10595 2002-01-08  Ravi Pratap  <ravi@ximian.com>
10596
10597         * class.cs (Indexer.DefineMethod): Incorporate the interface
10598         type in the name of the method if we are doing explicit interface
10599         implementation.
10600
10601         * expression.cs (ConversionExists): Remove as it is completely obsolete.
10602
10603         (BetterConversion): Fix extremely trivial bug where we were referring to
10604         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
10605         again !
10606
10607         * ../errors/bug16.cs : Add although we have fixed it.
10608
10609 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
10610
10611         * expression.cs (BaseIndexer): Begin implementation.
10612
10613         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
10614
10615         * cs-parser.jay (indexer_declarator): Use qualified_identifier
10616         production directly to remove a shift/reduce, and implement
10617         explicit interface implementation.
10618
10619         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
10620         after a floating point suffix.
10621
10622         * expression.cs (DoNumericPromotions): Improved the conversion for
10623         uint/uint.  If we have a constant, we avoid doing a typecast to a
10624         larger type.
10625
10626         * class.cs (Indexer): Implement explicit interface implementation
10627         for indexers.
10628
10629 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
10630
10631         * class.cs: make the default instance constructor public and hidebysig.
10632
10633 2001-01-03  Ravi Pratap  <ravi@ximian.com>
10634
10635         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
10636         so we can call it from elsewhere.
10637
10638         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
10639         we emit it internally if the class has a defined indexer; otherwise the user
10640         emits it by decorating the class definition with the DefaultMemberAttribute.
10641
10642         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
10643         attribute is not used on a type which defines an indexer.
10644
10645         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
10646         character when we skip whitespace.
10647
10648         * ../errors/cs0646.cs : Add.
10649
10650 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
10651
10652         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
10653         again. 
10654
10655         * makefile: Add practical target `mcs3.exe' which builds the third
10656         generation compiler. 
10657
10658         * expression.cs (New): Fix structures constructor calling.
10659
10660         * class.cs (Property, Method, Indexer): Emit Final flag on the
10661         method if we are an interface implementation and we are not
10662         abstract. 
10663
10664         * ecore.cs (PropertyExpr): New public field `IsBase', tells
10665         whether this property is referencing a `base' method.
10666
10667         * expression.cs (Invocation.EmitCall): take an extra argument:
10668         is_base, this is used to determine whether the `call' or
10669         `callvirt' opcode should be used.
10670
10671
10672         * delegate.cs: update EmitCall.
10673
10674         * class.cs (Method.Define): Set NewSlot for the cases where we are
10675         not implementing an interface method.
10676
10677         (Property.Define): ditto.
10678
10679 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
10680
10681         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
10682         'r'.  Allows mcs to parse itself fully.
10683
10684 2002-01-02  Ravi Pratap  <ravi@ximian.com>
10685
10686         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
10687         of the number of initializers that require the InitializeArray method.
10688
10689         (CheckIndices): Store the Expression in all cases - not the plain value. Also
10690         update the above field where necessary.
10691
10692         (MakeByteBlob): Update accordingly.
10693
10694         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
10695         greater than 2.
10696
10697         (EmitDynamicInitializers): Update in accordance with the new optimization.
10698
10699         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
10700         same OpCode applies.
10701
10702         * cs-parser.jay : Fix some glaring errors I introduced.
10703
10704 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
10705
10706         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
10707         so that we can check for name clashes there too.
10708
10709         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
10710         for interface indexers.
10711
10712         * interfaces.cs (Define): Emit the default member attribute.
10713
10714         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
10715         variable was being referred to while setting the value ;-)
10716
10717 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
10718
10719         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
10720         byte-by-byte information when we know the data is zero.
10721
10722         Make the block always a multiple of 4, because
10723         DefineInitializedData has a bug.
10724
10725         * assign.cs: Fix, we should assign from the temporary, not from
10726         the source. 
10727
10728         * expression.cs (MakeByteBlob): Fix my incorrect code.
10729
10730 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
10731
10732         * typemanager.cs (EnumToUnderlying): This function is used to get
10733         the underlying type from an enumeration, because it does not
10734         always work. 
10735
10736         * constant.cs: Use the I4_S form for values between -128 and 127.
10737
10738         * statement.cs (Block.LookupLabel): Looks up a label.
10739         (Block): Drop support for labeled blocks.
10740
10741         (LabeledStatement): New kind of statement that represents a label
10742         only.
10743
10744         (Goto): Finally implement this bad boy.
10745
10746         * cs-parser.jay: Update to reflect new mechanism to implement
10747         labels.
10748
10749 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
10750
10751         * codegen.cs (EmitContext.This): a codegen property that keeps the
10752         a single instance of this instead of creating many different this
10753         instances. 
10754
10755         * delegate.cs (Delegate.DoResolve): Update to use the property;
10756
10757         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
10758
10759         * expression.cs (BaseAccess.DoResolve): Ditto.
10760
10761 2001-12-29  Ravi Pratap  <ravi@ximian.com>
10762
10763         * typemanager.cs (methodimpl_attr_type): Add to hold the type
10764         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
10765
10766         (InitCoreTypes): Update accordingly.
10767
10768         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
10769         so we can quickly store the state.
10770
10771         (ApplyAttributes): Set the correct implementation flags
10772         for InternalCall methods.
10773
10774 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
10775
10776         * expression.cs (EmitCall): if a method is not virtual, then do
10777         not use callvirt on it.
10778
10779         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
10780         user defined stuff) requires the use of stobj, which takes an
10781         address on the stack instead of an array and an index.  So emit
10782         the Ldelema operation for it.
10783
10784         (EmitStoreOpcode): Use stobj for valuetypes.
10785
10786         (UnaryMutator.EmitCode): Use the right 1 value depending on
10787         whether we are dealing with int64/uint64, float or doubles.
10788
10789         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
10790         constructors that I implemented last night.
10791
10792         (Constructor.IsDefault): Fix to work properly for static
10793         constructors.
10794
10795         * cs-parser.jay (CheckDef): report method signature errors.
10796         Update error number 103 to be 132.
10797
10798         * decl.cs: New AdditionResult enumeration value: MethodExists.
10799         Although we do this check for methods later on in the semantic
10800         analysis, catching repeated default constructors is so easy that
10801         we catch these here. 
10802
10803         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
10804         promotions code.
10805
10806         (ParameterReference.EmitAssign, Emit): handle
10807         bools as bytes.
10808
10809         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
10810         (ArrayAccess.EmitStoreOpcode): ditto.
10811
10812         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
10813
10814         * expression.cs (MakeByteBlob): Complete all the missing types
10815         (uint, short, ushort, byte, sbyte)
10816
10817         * class.cs: Only init instance field initializers on instance
10818         constructors. 
10819
10820         Rename `constructors' to instance_constructors. 
10821
10822         (TypeContainer.AddConstructor): Only add constructors to the list
10823         if it is not static.
10824
10825         Make sure that we handle default_static_constructor independently
10826         everywhere where we handle instance_constructors
10827
10828 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
10829
10830         * class.cs: Do not lookup or create a base initializer for a
10831         static constructor.
10832
10833         (ConstructorInitializer.Resolve): use the proper type to lookup
10834         for constructors.
10835
10836         * cs-parser.jay: Report error 1585 (modifiers between type and name).
10837
10838         * enum.cs, interface.cs: Remove CloseType, this is taken care by
10839         in DeclSpace. 
10840
10841         * decl.cs: CloseType is now an virtual method, the default
10842         implementation just closes this type.
10843
10844 2001-12-28  Ravi Pratap  <ravi@ximian.com>
10845
10846         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
10847         to PreserveSig by default. Also emit HideBySig on such methods.
10848
10849         Basically, set the defaults to standard values.
10850
10851         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
10852         argument, if candidate is better, it can't be worse than the best !
10853
10854         (Invocation): Re-write bits to differentiate between methods being
10855         applicable in their expanded form and their normal form - for params
10856         methods of course.
10857
10858         Get rid of use_standard everywhere as only standard conversions are allowed
10859         in overload resolution. 
10860
10861         More spec conformance.
10862
10863 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
10864
10865         * driver.cs: Add --timestamp, to see where the compiler spends
10866         most of its time.
10867
10868         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
10869         `this' in static code.
10870
10871         (SimpleName.DoResolve): Implement in terms of a helper function
10872         that allows static-references to be passed upstream to
10873         MemberAccess.
10874
10875         (Expression.ResolveWithSimpleName): Resolve specially simple
10876         names when called by MemberAccess to implement the special
10877         semantics. 
10878
10879         (Expression.ImplicitReferenceConversion): Handle conversions from
10880         Null to reference types before others, as Null's type is
10881         System.Object. 
10882
10883         * expression.cs (Invocation.EmitCall): Handle the special case of
10884         calling methods declared on a reference type from a ValueType
10885         (Base classes System.Object and System.Enum)
10886
10887         (MemberAccess.Resolve): Only perform lookups on Enumerations if
10888         the left hand side is a TypeExpr, not on every enumeration. 
10889
10890         (Binary.Resolve): If types are reference types, then do a cast to
10891         object on operators != and == of both arguments.
10892
10893         * typemanager.cs (FindMembers): Extract instance and static
10894         members if requested.
10895
10896         * interface.cs (PopulateProperty): Use void_type instead of null
10897         as the return type for the setter method.
10898
10899         (PopulateIndexer): ditto.
10900
10901 2001-12-27  Ravi Pratap  <ravi@ximian.com>
10902
10903         * support.cs (ReflectionParameters): Fix minor bug where we
10904         were examining the wrong parameter for the ParamArray attribute.
10905
10906         Cope with requests for the type of the parameter at position
10907         greater than the params parameter's. We now return the element
10908         type of the params array as that makes more sense.
10909
10910         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
10911         accordingly as we no longer have to extract the element type
10912         ourselves.
10913
10914         (Invocation.OverloadResolve): Update.
10915
10916 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
10917
10918         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
10919         against IEnumerator, test whether the return value is a descendant
10920         of the IEnumerator interface.
10921
10922         * class.cs (Indexer.Define): Use an auxiliary method to implement
10923         the other bits of the method definition.  Begin support for
10924         explicit interface implementation.
10925
10926         (Property.DefineMethod): Use TypeManager.void_type instead of null
10927         for an empty return value.
10928
10929 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
10930
10931         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
10932         dealing with a FieldExpr which is composed of a FieldBuilder, in
10933         the code path we did extract the constant, but we should have
10934         obtained the underlying value to be able to cast it (otherwise we
10935         end up in an infinite loop, this is what Ravi was running into).
10936
10937         (ArrayCreation.UpdateIndices): Arrays might be empty.
10938
10939         (MemberAccess.ResolveMemberAccess): Add support for section
10940         14.5.4.1 that deals with the special case of E.I when E is a type
10941         and something else, that I can be a reference to a static member.
10942
10943         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
10944         handle a particular array type to create byte blobs, it is just
10945         something we dont generate byteblobs for.
10946
10947         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
10948         arguments. 
10949
10950         * location.cs (Push): remove the key from the hashtable that we
10951         are about to add.   This happens for empty files.
10952
10953         * driver.cs: Dispose files after we have parsed them.
10954
10955         (tokenize): new function that only runs the tokenizer on its
10956         input, for speed testing.
10957
10958 2001-12-26  Ravi Pratap  <ravi@ximian.com>
10959
10960         * class.cs (Event.Define): Define the private field only if there
10961         are no accessors defined.
10962
10963         * expression.cs (ResolveMemberAccess): If there is no associated
10964         field with the event, that means we have an event defined with its
10965         own accessors and we should flag error cs0070 since transforming
10966         ourselves into a field is not valid in that case.
10967
10968         * ecore.cs (SimpleName.DoResolve): Same as above.
10969
10970         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
10971         and charset to sane values.
10972
10973 2001-12-25  Ravi Pratap  <ravi@ximian.com>
10974
10975         * assign.cs (DoResolve): Perform check on events only if they 
10976         are being accessed outside the declaring type.
10977
10978         * cs-parser.jay (event_declarations): Update rules to correctly
10979         set the type of the implicit parameter etc.
10980
10981         (add_accessor, remove_accessor): Set current local parameters.
10982
10983         * expression.cs (Binary): For delegate addition and subtraction,
10984         cast the return value from the method into the appropriate delegate
10985         type.
10986
10987 2001-12-24  Ravi Pratap  <ravi@ximian.com>
10988
10989         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
10990         of these as the workaround is unnecessary.
10991
10992         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
10993         delegate data - none of that is needed at all.
10994
10995         Re-write bits to extract the instance expression and the delegate method
10996         correctly.
10997
10998         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
10999         on delegates too.
11000
11001         * attribute.cs (ApplyAttributes): New method to take care of common tasks
11002         of attaching attributes instead of duplicating code everywhere.
11003
11004         * everywhere : Update code to do attribute emission using the above method.
11005
11006 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11007
11008         * expression.cs (IsParamsMethodApplicable): if there are not
11009         parameters, return immediately.
11010
11011         * ecore.cs: The 0 literal can be implicity converted to an enum
11012         type. 
11013
11014         (SimpleName.DoResolve): First lookup the type, then lookup the
11015         members. 
11016
11017         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
11018         want to get its address.  If the InstanceExpression is not
11019         addressable, store the result in a temporary variable, then get
11020         the address of it.
11021
11022         * codegen.cs: Only display 219 errors on warning level or above. 
11023
11024         * expression.cs (ArrayAccess): Make it implement the
11025         IMemoryLocation interface.
11026
11027         (Binary.DoResolve): handle the operator == (object a, object b)
11028         and operator != (object a, object b) without incurring into a
11029         BoxedCast (because 5 != o should never be performed).
11030
11031         Handle binary enumerator operators.
11032
11033         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
11034         value type, otherwise use Ldelem_ref.
11035
11036         Use precomputed names;
11037
11038         (AddressOf): Implement address of
11039
11040         * cs-parser.jay (labeled_statement): Fix recursive block
11041         addition by reworking the production.
11042
11043         * expression.cs (New.DoEmit): New has a special case:
11044                 
11045                  If we are dealing with a ValueType, we have a few
11046                  situations to deal with:
11047                 
11048                     * The target of New is a ValueType variable, that is
11049                       easy, we just pass this as the variable reference
11050                 
11051                     * The target of New is being passed as an argument,
11052                       to a boxing operation or a function that takes a
11053                       ValueType.
11054                 
11055                       In this case, we need to create a temporary variable
11056                       that is the argument of New.
11057
11058
11059 2001-12-23  Ravi Pratap  <ravi@ximian.com>
11060
11061         * rootcontext.cs (LookupType): Check that current_type is not null before
11062         going about looking at nested types.
11063
11064         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
11065         not implement the IAssignMethod interface any more.
11066
11067         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
11068         where we tranform them into FieldExprs if they are being resolved from within
11069         the declaring type.
11070
11071         * ecore.cs (SimpleName.DoResolve): Do the same here.
11072
11073         * assign.cs (DoResolve, Emit): Clean up code considerably. 
11074
11075         * ../errors/bug10.cs : Add.
11076
11077         * ../errors/cs0070.cs : Add.
11078
11079         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
11080
11081         * assign.cs : Get rid of EventIsLocal everywhere.
11082
11083 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11084
11085         * ecore.cs (ConvertIntLiteral): finished the implementation.
11086
11087         * statement.cs (SwitchLabel): Convert the value we are using as a
11088         key before looking up the table.
11089
11090 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11091
11092         * codegen.cs (EmitTopBlock): Require a Location argument now.
11093
11094         * cs-parser.jay (constructor_declarator): We need to setup
11095         current_local_parameters before we parse the
11096         opt_constructor_initializer, to allow the variables to be bound
11097         to the constructor arguments.
11098
11099         * rootcontext.cs (LookupType): First lookup nested classes in our
11100         class and our parents before we go looking outside our class.
11101
11102         * expression.cs (ConstantFold): Extract/debox the values at the
11103         beginnning. 
11104
11105         * rootcontext.cs (EmitCode): Resolve the constants first before we
11106         resolve the types.  This is not really needed, but it helps debugging.
11107
11108         * statement.cs: report location.
11109
11110         * cs-parser.jay: pass location to throw statement.
11111
11112         * driver.cs: Small bug fix.
11113
11114         * report.cs: Updated format to be 4-zero filled digits.
11115
11116 2001-12-22  Ravi Pratap  <ravi@ximian.com>
11117
11118         * expression.cs (CheckIndices): Fix minor bug where the wrong
11119         variable was being referred to ;-)
11120
11121         (DoEmit): Do not call EmitStaticInitializers when the 
11122         underlying type is System.Object.
11123
11124 2001-12-21  Ravi Pratap  <ravi@ximian.com>
11125
11126         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
11127         and do the usual workaround for SRE.
11128
11129         * class.cs (MyEventBuilder.EventType): New member to get at the type
11130         of the event, quickly.
11131
11132         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
11133
11134         * assign.cs (Assign.DoResolve): Handle the case when the target
11135         is an EventExpr and perform the necessary checks.
11136
11137         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
11138         interface.
11139
11140         (SimpleName.MemberStaticCheck): Include check for EventExpr.
11141
11142         (EventExpr): Set the type in the constructor itself since we 
11143         are meant to be born fully resolved.
11144
11145         (EventExpr.Define): Revert code I wrote earlier.
11146                 
11147         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
11148         instance expression is null. The instance expression is a This in that case
11149         or a null, depending on whether it is a static method or not.
11150
11151         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
11152         refers to more than one method.
11153
11154         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
11155         and accordingly flag errors.
11156
11157 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11158
11159         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
11160
11161 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11162
11163         * location.cs (ToString): Provide useful rutine.
11164
11165 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11166
11167         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
11168         objects, return the actual integral boxed.
11169
11170         * statement.cs (SwitchLabel): define an ILLabel for each
11171         SwitchLabel. 
11172
11173         (Switch.CheckSwitch): If the value is a Literal, extract
11174         the underlying literal.
11175
11176         Also in the unused hashtable we had, add the SwitchLabel so we can
11177         quickly look this value up.
11178
11179         * constant.cs: Implement a bunch of new constants.  Rewrite
11180         Literal based on this.  Made changes everywhere to adapt to this.
11181
11182         * expression.cs (Expression.MakeByteBlob): Optimize routine by
11183         dereferencing array only once, and also copes with enumrations.
11184
11185         bytes are two bytes wide, not one.
11186
11187         (Cast): Perform constant conversions.
11188
11189         * ecore.cs (TryImplicitIntConversion): Return literals instead of
11190         wrappers to the literals here.
11191
11192         * expression.cs (DoNumericPromotions): long literals can converted
11193         to ulong implicity (this is taken care of elsewhere, but I was
11194         missing this spot).
11195
11196         * ecore.cs (Expression.Literalize): Make the return type Literal,
11197         to improve type checking.
11198
11199         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
11200
11201 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11202
11203         * literal.cs: Revert code from ravi that checked the bounds.  The
11204         bounds are sane by the definition of the type itself. 
11205
11206         * typemanager.cs: Fix implementation of ImplementsInterface.  We
11207         need to actually look up in our parent hierarchy for interfaces
11208         implemented. 
11209
11210         * const.cs: Use the underlying type for enumerations
11211
11212         * delegate.cs: Compute the basename for the delegate creation,
11213         that should fix the delegate test case, and restore the correct
11214         Type Lookup semantics in rootcontext
11215
11216         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
11217         referencing a nested type with the Reflection API is using the "+"
11218         sign. 
11219
11220         * cs-parser.jay: Do not require EOF token at the end.
11221
11222 2001-12-20  Ravi Pratap  <ravi@ximian.com>
11223
11224         * rootcontext.cs (LookupType): Concatenate type names with
11225         a '.' instead of a '+' The test suite passes again.
11226
11227         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
11228         field of the enumeration.
11229
11230         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
11231         the case when the member is an EventExpr.
11232
11233         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
11234         static has an associated instance expression.
11235
11236         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
11237
11238         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
11239
11240         * class.cs (Event.Define): Register event and perform appropriate checks
11241         for error #111.
11242
11243         We define the Add and Remove methods even if the use provides none because
11244         in that case, we provide default implementations ourselves.
11245
11246         Define a private field of the type of the event. This is done by the CSC compiler
11247         and we should be doing it too ;-)
11248
11249         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
11250         More methods we use in code we generate.
11251
11252         (multicast_delegate_type, delegate_type): Two separate types since the distinction
11253         is important.
11254
11255         (InitCoreTypes): Update accordingly for the above.
11256
11257         * class.cs (Event.Emit): Generate code for default accessors that we provide
11258
11259         (EmitDefaultMethod): Do the job in the above.
11260
11261         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
11262         appropriate place.
11263
11264 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11265
11266         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
11267         builders even if we were missing one.
11268
11269         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
11270         pass the Basename as our class name instead of the Name.  The
11271         basename will be correctly composed for us.
11272
11273         * parameter.cs (Paramters): Now takes a Location argument.
11274
11275         * decl.cs (DeclSpace.LookupType): Removed convenience function and
11276         make all the code call directly LookupType in RootContext and take
11277         this chance to pass the Location information everywhere.
11278
11279         * Everywhere: pass Location information.
11280
11281 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
11282
11283         * class.cs (Constructor.Define): Updated way of detecting the
11284         length of the parameters.
11285
11286         (TypeContainer.DefineType): Use basename as the type name for
11287         nested types.
11288
11289         (TypeContainer.Define): Do not recursively define types here, as
11290         definition is taken care in order by the RootContext.
11291
11292         * tree.cs: Keep track of namespaces in a per-file basis.
11293
11294         * parameter.cs (Parameter.ComputeSignature): Update to use
11295         DeclSpace. 
11296
11297         (Parameters.GetSignature): ditto.
11298
11299         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
11300         instead of a TypeContainer.
11301
11302         (Interface.SemanticAnalysis): Use `this' instead of our parent to
11303         resolve names.  Because we need to be resolve in our context, not
11304         our parents.
11305
11306         * driver.cs: Implement response files.
11307
11308         * class.cs (TypeContainer.DefineType): If we are defined, do not
11309         redefine ourselves.
11310
11311         (Event.Emit): Emit the code for add/remove handlers.
11312         (Event.Define): Save the MethodBuilders for add/remove.
11313
11314         * typemanager.cs: Use pair here too.
11315
11316         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
11317         DictionaryEntry requires the first argument to be non-null.  
11318
11319         (enum_declaration): Compute full name for registering the
11320         enumeration.
11321
11322         (delegate_declaration): Instead of using
11323         formal_parameter_list, use opt_formal_parameter_list as the list
11324         can be empty.
11325
11326         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
11327         (EventParsing): New property that controls whether `add' and
11328         `remove' are returned as tokens or identifiers (for events);
11329
11330 2001-12-19  Ravi Pratap  <ravi@ximian.com>
11331
11332         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
11333         use MyEventBuilder only and let it wrap the real builder for us.
11334
11335         (MyEventBuilder): Revamp constructor etc.
11336
11337         Implement all operations that we perform on EventBuilder in precisely the same
11338         way here too.
11339
11340         (FindMembers): Update to use the EventBuilder member.
11341
11342         (Event.Emit): Update accordingly.
11343
11344 2001-12-18  Ravi Pratap  <ravi@ximian.com>
11345
11346         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
11347         by calling the appropriate methods.
11348
11349         (GetCustomAttributes): Make stubs as they cannot possibly do anything
11350         useful.
11351
11352         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
11353
11354 2001-12-17  Ravi Pratap  <ravi@ximian.com>
11355
11356         * delegate.cs (Delegate.Populate): Check that the return type
11357         and various parameters types are indeed accessible.
11358
11359         * class.cs (Constructor.Define): Same here.
11360
11361         (Field.Define): Ditto.
11362
11363         (Event.Define): Ditto.
11364
11365         (Operator.Define): Check that the underlying Method defined itself
11366         correctly - so it's MethodBuilder should not be null.
11367
11368         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
11369         expression happens to be null.
11370
11371         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
11372         members but as of now we don't seem to be able to do anything really useful with it.
11373
11374         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
11375         not the EventBuilder.
11376
11377 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
11378
11379         * cs-tokenizer.cs: Add support for defines.
11380         Add support for #if, #elif, #else, #endif
11381
11382         (eval_var): evaluates a variable.
11383         (eval): stubbed for evaluating functions.
11384
11385         * cs-parser.jay: Pass the defines information
11386
11387         * driver.cs: Add --define command line option.
11388
11389         * decl.cs: Move MemberCore here.
11390
11391         Make it the base class for DeclSpace.  This allows us to catch and
11392         report 108 and 109 for everything now.
11393
11394         * class.cs (TypeContainer.Define): Extract all the members
11395         before populating and emit the warning 108 (new keyword required
11396         to override) instead of having each member implement this.
11397
11398         (MemberCore.Define): New abstract method, we will be using this in
11399         the warning reporting engine in Populate.
11400
11401         (Operator.Define): Adjust to new MemberCore protocol. 
11402
11403         * const.cs (Const): This does not derive from Expression, it is a
11404         temporary object we use to create fields, it is a MemberCore. 
11405
11406         * class.cs (Method.Define): Allow the entry point to be in a
11407         specific class.
11408
11409         * driver.cs: Rewrite the argument handler to clean it up a bit.
11410
11411         * rootcontext.cs: Made it just an auxiliary namespace feature by
11412         making everything static.
11413
11414         * driver.cs: Adapt code to use RootContext type name instead of
11415         instance variable.
11416
11417         * delegate.cs: Remove RootContext argument.
11418
11419         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
11420         argument. 
11421
11422         * class.cs (Event.Define): The lookup can fail.
11423
11424         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
11425
11426         * expression.cs: Resolve the this instance before invoking the code.
11427
11428 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
11429
11430         * cs-parser.jay: Add a production in element_access that allows
11431         the thing to become a "type" reference.  This way we can parse
11432         things like "(string [])" as a type.
11433
11434         Note that this still does not handle the more complex rules of
11435         casts. 
11436
11437
11438         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
11439
11440         * ecore.cs: (CopyNewMethods): new utility function used to
11441         assemble the list of methods from running FindMembers.
11442
11443         (MemberLookup): Rework FindMembers so that 
11444
11445 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
11446
11447         * class.cs (TypeContainer): Remove Delegates who fail to be
11448         defined.
11449
11450         * delegate.cs (Populate): Verify that we dont get null return
11451         values.   TODO: Check for AsAccessible.
11452
11453         * cs-parser.jay: Use basename to emit error 574 (destructor should
11454         have the same name as container class), not the full name.
11455
11456         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
11457         possible representation.  
11458
11459         Also implements integer type suffixes U and L.
11460
11461 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
11462
11463         * expression.cs (ArrayCreation.DoResolve): We need to do the
11464         argument resolution *always*.
11465
11466         * decl.cs: Make this hold the namespace.  Hold the root context as
11467         well.
11468         (LookupType): Move here.
11469
11470         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
11471
11472         * location.cs (Row, Name): Fixed the code, it was always returning
11473         references to the first file.
11474
11475         * interface.cs: Register properties defined through interfaces.
11476
11477         * driver.cs: Add support for globbing on the command line
11478
11479         * class.cs (Field): Make it derive from MemberCore as well.
11480         (Event): ditto.
11481
11482 2001-12-15  Ravi Pratap  <ravi@ximian.com>
11483
11484         * class.cs (Event::Define): Check that the type of the event is a delegate
11485         type else flag error #66.
11486
11487         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
11488         same.
11489
11490         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
11491         values of EntryPoint, CharSet etc etc.
11492
11493         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
11494
11495         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
11496         be null and we should ignore this. I am not sure if this is really clean. Apparently,
11497         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
11498         which needs this to do its work.
11499
11500         * ../errors/cs0066.cs : Add.
11501
11502 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
11503
11504         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
11505         helper functions.
11506
11507         * class.cs: (MethodSignature.MethodSignature): Removed hack that
11508         clears out the parameters field.
11509         (MemberSignatureCompare): Cleanup
11510
11511         (MemberCore): New base class used to share code between MethodCore
11512         and Property.
11513
11514         (RegisterRequiredImplementations) BindingFlags.Public requires
11515         either BindingFlags.Instace or Static.  Use instance here.
11516
11517         (Property): Refactored code to cope better with the full spec.
11518
11519         * parameter.cs (GetParameterInfo): Return an empty array instead
11520         of null on error.
11521
11522         * class.cs (Property): Abstract or extern properties have no bodies.
11523
11524         * parameter.cs (GetParameterInfo): return a zero-sized array.
11525
11526         * class.cs (TypeContainer.MethodModifiersValid): Move all the
11527         method modifier validation to the typecontainer so we can reuse
11528         this on properties.
11529
11530         (MethodCore.ParameterTypes): return an empty sized array of types.
11531
11532         (Property.Define): Test property modifier validity.
11533
11534         Add tests for sealed/override too.
11535
11536         (Method.Emit): abstract or extern methods have no bodies.
11537
11538 2001-12-14  Ravi Pratap  <ravi@ximian.com>
11539
11540         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
11541         thing.
11542
11543         (Method::Define, ::Emit): Modify accordingly.
11544
11545         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
11546
11547         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
11548
11549         * makefile: Pass in /unsafe.
11550
11551 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
11552
11553         * class.cs (MakeKey): Kill routine.
11554
11555         * class.cs (TypeContainer.Define): Correctly define explicit
11556         method implementations (they require the full interface name plus
11557         the method name).
11558
11559         * typemanager.cs: Deply the PtrHashtable here and stop using the
11560         lame keys.  Things work so much better.
11561
11562         This of course broke everyone who depended on `RegisterMethod' to
11563         do the `test for existance' test.  This has to be done elsewhere.
11564
11565         * support.cs (PtrHashtable): A hashtable that avoid comparing with
11566         the object stupid Equals method (because, that like fails all over
11567         the place).  We still do not use it.
11568
11569         * class.cs (TypeContainer.SetRequiredInterface,
11570         TypeContainer.RequireMethods): Killed these two routines and moved
11571         all the functionality to RegisterRequiredImplementations.
11572
11573         (TypeContainer.RegisterRequiredImplementations): This routine now
11574         registers all the implementations required in an array for the
11575         interfaces and abstract methods.  We use an array of structures
11576         which can be computed ahead of time to reduce memory usage and we
11577         also assume that lookups are cheap as most classes will not
11578         implement too many interfaces.
11579
11580         We also avoid creating too many MethodSignatures.
11581
11582         (TypeContainer.IsInterfaceMethod): Update and optionally does not
11583         clear the "pending" bit if we find that there are problems with
11584         the declaration.
11585
11586         (TypeContainer.VerifyPendingMethods): Update to report errors of
11587         methods that look like implementations but are not.
11588
11589         (TypeContainer.Define): Add support for explicit interface method
11590         implementation. 
11591
11592 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
11593
11594         * typemanager.cs: Keep track of the parameters here instead of
11595         being a feature of the TypeContainer.
11596
11597         * class.cs: Drop the registration of parameters here, as
11598         InterfaceMethods are also interface declarations.
11599
11600         * delegate.cs: Register methods with the TypeManager not only with
11601         the TypeContainer.  This code was buggy.
11602
11603         * interface.cs: Full registation here.
11604
11605 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
11606
11607         * expression.cs: Remove reducer for binary expressions, it can not
11608         be done this way.
11609
11610         * const.cs: Put here the code that used to go into constant.cs
11611
11612         * constant.cs: Put here the code for constants, this is a new base
11613         class for Literals.
11614
11615         * literal.cs: Make Literal derive from Constant.
11616
11617 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
11618
11619         * statement.cs (Return.Emit): Report error 157 if the user
11620         attempts to return from a finally block.
11621
11622         (Return.Emit): Instead of emitting a return, jump to the end of
11623         the function.
11624
11625         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
11626         LocalBuilder to store the result of the function.  ReturnLabel is
11627         the target where we jump.
11628
11629
11630 2001-12-09  Radek Doulik  <rodo@ximian.com>
11631
11632         * cs-parser.jay: remember alias in current namespace
11633
11634         * ecore.cs (SimpleName::DoResolve): use aliases for types or
11635         namespaces
11636
11637         * class.cs (LookupAlias): lookup alias in my_namespace
11638
11639         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
11640         aliases hashtable
11641         (LookupAlias): lookup alias in this and if needed in parent
11642         namespaces
11643
11644 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
11645
11646         * support.cs: 
11647
11648         * rootcontext.cs: (ModuleBuilder) Made static, first step into
11649         making things static.  I need this to avoid passing the
11650         TypeContainer when calling ParameterType.
11651
11652         * support.cs (InternalParameters.ParameterType): Remove ugly hack
11653         that did string manipulation to compute the type and then call
11654         GetType.  Use Parameter.ParameterType instead.
11655
11656         * cs-tokenizer.cs: Consume the suffix for floating values.
11657
11658         * expression.cs (ParameterReference): figure out whether this is a
11659         reference parameter or not.  Kill an extra variable by computing
11660         the arg_idx during emission.
11661
11662         * parameter.cs (Parameters.GetParameterInfo): New overloaded
11663         function that returns whether a parameter is an out/ref value or not.
11664
11665         (Parameter.ParameterType): The type of the parameter (base,
11666         without ref/out applied).
11667
11668         (Parameter.Resolve): Perform resolution here.
11669         (Parameter.ExternalType): The full type (with ref/out applied).
11670
11671         * statement.cs (Using.Emit, Using.EmitExpression): Implement
11672         support for expressions on the using statement.
11673
11674 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
11675
11676         * statement.cs (Using.EmitLocalVariableDecls): Split the
11677         localvariable handling of the using statement.
11678
11679         (Block.EmitMeta): Keep track of variable count across blocks.  We
11680         were reusing slots on separate branches of blocks.
11681
11682         (Try.Emit): Emit the general code block, we were not emitting it. 
11683
11684         Check the type of the declaration to be an IDisposable or
11685         something that can be implicity converted to it. 
11686
11687         Emit conversions if required.
11688
11689         * ecore.cs (EmptyExpression): New utility class.
11690         (Expression.ImplicitConversionExists): New utility function.
11691
11692 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
11693
11694         * statement.cs (Using): Implement.
11695
11696         * expression.cs (LocalVariableReference): Support read only variables.
11697
11698         * statement.cs: Remove the explicit emit for the Leave opcode.
11699         (VariableInfo): Add a readonly field.
11700
11701 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
11702
11703         * ecore.cs (ConvCast): new class used to encapsulate the various
11704         explicit integer conversions that works in both checked and
11705         unchecked contexts.
11706
11707         (Expression.ConvertNumericExplicit): Use new ConvCast class to
11708         properly generate the overflow opcodes.
11709
11710 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
11711
11712         * statement.cs: The correct type for the EmptyExpression is the
11713         element_type, not the variable type.  Ravi pointed this out.
11714
11715 2001-12-04  Ravi Pratap  <ravi@ximian.com>
11716
11717         * class.cs (Method::Define): Handle PInvoke methods specially
11718         by using DefinePInvokeMethod instead of the usual one.
11719
11720         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
11721         above to do the task of extracting information and defining the method.
11722
11723 2001-12-04  Ravi Pratap  <ravi@ximian.com>
11724
11725         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
11726         of the condition for string type.
11727
11728         (Emit): Move that here. 
11729
11730         (ArrayCreation::CheckIndices): Keep string literals in their expression
11731         form.
11732
11733         (EmitDynamicInitializers): Handle strings appropriately.
11734
11735 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
11736
11737         * codegen.cs (EmitContext): Replace multiple variables with a
11738         single pointer to the current Switch statement.
11739
11740         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
11741         EmitContext.
11742
11743 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
11744
11745         * statement.cs 
11746
11747         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
11748         default'.
11749
11750         (Foreach.Emit): Foreach on arrays was not setting
11751         up the loop variables (for break/continue).
11752
11753         (GotoCase): Semi-implented.
11754
11755 2001-12-03  Ravi Pratap  <ravi@ximian.com>
11756
11757         * attribute.cs (CheckAttribute): Handle system attributes by using
11758         Attribute.GetAttributes to examine information we need.
11759
11760         (GetValidPlaces): Same here.
11761
11762         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
11763
11764         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
11765
11766         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
11767
11768         (Method::Define): Set appropriate flags if we have a DllImport attribute.
11769
11770         (Method::Emit): Handle the case when we are a PInvoke method.
11771
11772 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
11773
11774         * expression.cs: Use ResolveWithSimpleName on compound names.
11775
11776 2001-12-02  Ravi Pratap  <ravi@ximian.com>
11777
11778         * constant.cs (EmitConstant): Make sure we resolve the associated expression
11779         before trying to reduce it.
11780
11781         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
11782
11783         * constant.cs (LookupConstantValue): Implement.
11784
11785         (EmitConstant): Use the above in emitting the constant.
11786
11787         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
11788         that are user-defined by doing a LookupConstantValue on them.
11789
11790         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
11791         too, like above.
11792
11793 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
11794
11795         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
11796
11797         (BaseAccess.DoResolve): Implement.
11798
11799         (MemberAccess.DoResolve): Split this routine into a
11800         ResolveMemberAccess routine that can be used independently
11801
11802 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
11803
11804         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
11805         As that share bits of the implementation.  Is returns a boolean,
11806         while As returns the Type that is being probed.
11807
11808 2001-12-01  Ravi Pratap  <ravi@ximian.com>
11809
11810         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
11811         instead of a Literal - much easier.
11812
11813         (EnumInTransit): Remove - utterly useless :-)
11814
11815         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
11816
11817         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
11818
11819         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
11820         chain when we have no associated expression.
11821
11822 2001-11-30  Ravi Pratap  <ravi@ximian.com>
11823
11824         * constant.cs (Define): Use Location while reporting the errror.
11825
11826         Also emit a warning when 'new' is used and there is no inherited
11827         member to hide.
11828
11829         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
11830         populated.
11831
11832         (LookupEnumValue): Implement to lookup an enum member's value and define it
11833         if necessary.
11834
11835         (Populate): Re-write accordingly to use the above routine.
11836
11837 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
11838
11839         * expression.cs (This): Fix prototype for DoResolveLValue to
11840         override the base class DoResolveLValue.
11841
11842         * cs-parser.cs: Report errors cs574 and cs575 (destructor
11843         declarations) 
11844
11845         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
11846         (we need to load the address of the field here).  This fixes
11847         test-22. 
11848
11849         (FieldExpr.DoResolveLValue): Call the DoResolve
11850         function to initialize the Instance expression.
11851
11852         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
11853         correctly the GetEnumerator operation on a value type.
11854
11855         * cs-parser.jay: Add more simple parsing error catches.
11856
11857         * statement.cs (Switch): Add support for string switches.
11858         Handle null specially.
11859
11860         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
11861
11862 2001-11-28  Ravi Pratap  <ravi@ximian.com>
11863
11864         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
11865
11866         (declare_local_constant): New helper function.
11867
11868         * statement.cs (AddConstant): Keep a separate record of constants
11869
11870         (IsConstant): Implement to determine if a variable is a constant.
11871
11872         (GetConstantExpression): Implement.
11873
11874         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
11875
11876         * statement.cs (IsVariableDefined): Re-write.
11877
11878 2001-11-27  Ravi Pratap  <ravi@ximian.com>
11879
11880         * class.cs (TypeContainer::FindMembers): Look for constants
11881         in the case when we are looking for MemberTypes.Field
11882
11883         * expression.cs (MemberAccess::DoResolve): Check that in the
11884         case we are a FieldExpr and a Literal, we are not being accessed
11885         by an instance reference.
11886
11887         * cs-parser.jay (local_constant_declaration): Implement.
11888
11889         (declaration_statement): Implement for constant declarations.
11890
11891 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
11892
11893         * statement.cs (Switch): Catch double defaults.
11894
11895         (Switch): More work on the switch() statement
11896         implementation.  It works for integral values now, need to finish
11897         string support.
11898
11899
11900 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
11901
11902         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
11903         integer literals into other integer literals.  To be used by
11904         switch. 
11905
11906 2001-11-24  Ravi Pratap  <ravi@ximian.com>
11907
11908         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
11909         some memory.
11910
11911         (EmitDynamicInitializers): Cope with the above since we extract data
11912         directly from ArrayData now.
11913
11914         (ExpectInitializers): Keep track of whether initializers are mandatory
11915         or not.
11916
11917         (Bounds): Make it a hashtable to prevent the same dimension being 
11918         recorded for every element in that dimension.
11919
11920         (EmitDynamicInitializers): Fix bug which prevented the Set array method
11921         from being found.
11922
11923         Also fix bug which was causing the indices to be emitted in the reverse
11924         order.
11925
11926 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
11927
11928         * expression.cs (ArrayCreation): Implement the bits that Ravi left
11929         unfinished.  They do not work, because the underlying code is
11930         sloppy.
11931
11932 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
11933
11934         * cs-parser.jay: Remove bogus fixme.
11935
11936         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
11937         on Switch statement.
11938
11939 2001-11-23  Ravi Pratap  <ravi@ximian.com>
11940
11941         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
11942         the same. 
11943
11944         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
11945         parameter. Apparently, any expression is allowed. 
11946
11947         (ValidateInitializers): Update accordingly.
11948
11949         (CheckIndices): Fix some tricky bugs thanks to recursion.
11950
11951         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
11952         I was being completely brain-dead.
11953
11954         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
11955         and re-write acordingly.
11956
11957         (DelegateInvocation): Re-write accordingly.
11958
11959         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
11960
11961         (MakeByteBlob): Handle types more correctly.
11962
11963         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
11964         initialization from expressions but it is incomplete because I am a complete
11965         Dodo :-|
11966
11967 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
11968
11969         * statement.cs (If.Emit): Fix a bug that generated incorrect code
11970         on If.  Basically, we have to return `true' (ie, we do return to
11971         our caller) only if both branches of the if return.
11972
11973         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
11974         short-circuit operators, handle them as short circuit operators. 
11975
11976         (Cast.DoResolve): Resolve type.
11977         (Cast.Cast): Take an expression as the target type.
11978
11979         * cs-parser.jay (cast_expression): Remove old hack that only
11980         allowed a limited set of types to be handled.  Now we take a
11981         unary_expression and we resolve to a type during semantic
11982         analysis.
11983
11984         Use the grammar productions from Rhys to handle casts (this is
11985         not complete like Rhys syntax yet, we fail to handle that corner
11986         case that C# has regarding (-x), but we will get there.
11987
11988 2001-11-22  Ravi Pratap  <ravi@ximian.com>
11989
11990         * class.cs (EmitFieldInitializer): Take care of the case when we have a
11991         field which is an array type.
11992
11993         * cs-parser.jay (declare_local_variables): Support array initialization too.
11994
11995         * typemanager.cs (MakeKey): Implement.
11996
11997         (everywhere): Use the above appropriately.
11998
11999         * cs-parser.jay (for_statement): Update for array initialization while
12000         declaring variables.
12001
12002         * ecore.cs : The error message was correct, it's the variable's names that
12003         were misleading ;-) Make the code more readable.
12004
12005         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
12006         the correct type etc.
12007
12008         (ConvertExplicit): Handle Enum types by examining the underlying type.
12009
12010 2001-11-21  Ravi Pratap  <ravi@ximian.com>
12011
12012         * parameter.cs (GetCallingConvention): Always return
12013         CallingConventions.Standard for now.
12014
12015 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12016
12017         * expression.cs (Binary.ResolveOperator): Update the values of `l'
12018         and `r' after calling DoNumericPromotions.
12019
12020         * ecore.cs: Fix error message (the types were in the wrong order).
12021
12022         * statement.cs (Foreach.ProbeCollectionType): Need to pass
12023         BindingFlags.Instance as well 
12024
12025         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
12026         implicit int literal conversion in an empty cast so that we
12027         propagate the right type upstream.
12028
12029         (UnboxCast): new class used to unbox value types.
12030         (Expression.ConvertExplicit): Add explicit type conversions done
12031         by unboxing.
12032
12033         (Expression.ImplicitNumericConversion): Oops, forgot to test for
12034         the target type before applying the implicit LongLiterals to ULong
12035         literal cast.
12036
12037 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
12038
12039         * cs-parser.jay (for_statement): Reworked the way For works: now
12040         we declare manually any variables that are introduced in
12041         for_initializer to solve the problem of having out-of-band code
12042         emition (that is what got for broken).
12043
12044         (declaration_statement): Perform the actual variable declaration
12045         that used to be done in local_variable_declaration here.
12046
12047         (local_variable_declaration): Do not declare anything, just pass
12048         the information on a DictionaryEntry
12049
12050 2001-11-20  Ravi Pratap  <ravi@ximian.com>
12051
12052         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
12053         re-write of the logic to now make it recursive.
12054
12055         (UpdateIndices): Re-write accordingly.
12056
12057         Store element data in a separate ArrayData list in the above methods.
12058
12059         (MakeByteBlob): Implement to dump the array data into a byte array.
12060
12061 2001-11-19  Ravi Pratap  <ravi@ximian.com>
12062
12063         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
12064         into CheckIndices.
12065
12066         * constant.cs (Define): Implement.
12067
12068         (EmitConstant): Re-write fully.
12069
12070         Pass in location info.
12071
12072         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
12073         respectively.
12074
12075         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
12076         DictionaryEntry since we need location info too.
12077
12078         (constant_declaration): Update accordingly.
12079
12080         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
12081         code into another method : UpdateIndices.
12082
12083 2001-11-18  Ravi Pratap  <ravi@ximian.com>
12084
12085         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
12086         some type checking etc.
12087
12088 2001-11-17  Ravi Pratap  <ravi@ximian.com>
12089
12090         * expression.cs (ArrayCreation::ValidateInitializers): Implement
12091         bits to provide dimension info if the user skips doing that.
12092
12093         Update second constructor to store the rank correctly.
12094
12095 2001-11-16  Ravi Pratap  <ravi@ximian.com>
12096
12097         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
12098         and try to implement.
12099
12100         * ../errors/cs0150.cs : Add.
12101
12102         * ../errors/cs0178.cs : Add.
12103
12104 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
12105
12106         * statement.cs: Implement foreach on multi-dimensional arrays. 
12107
12108         * parameter.cs (Parameters.GetParameterByName): Also lookup the
12109         name of the params argument.
12110
12111         * expression.cs: Use EmitStoreOpcode to get the right opcode while
12112         initializing the array.
12113
12114         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
12115         we can use this elsewhere.
12116
12117         * statement.cs: Finish implementation of foreach for single
12118         dimension arrays.
12119
12120         * cs-parser.jay: Use an out-of-band stack to pass information
12121         around, I wonder why I need this.
12122
12123         foreach_block: Make the new foreach_block the current_block.
12124
12125         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
12126         function used to return a static Parameters structure.  Used for
12127         empty parameters, as those are created very frequently.
12128
12129         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
12130
12131 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12132
12133         * interface.cs : Default modifier is private, not public. The
12134         make verify test passes again.
12135
12136 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12137
12138         * support.cs (ReflectionParameters): Fix logic to determine
12139         whether the last parameter is a params one. Test 9 passes again.
12140
12141         * delegate.cs (Populate): Register the builders we define with
12142         RegisterParameterForBuilder. Test 19 passes again.
12143
12144         * cs-parser.jay (property_declaration): Reference $6 instead
12145         of $$ to get at the location.
12146
12147         (indexer_declaration): Similar stuff.
12148
12149         (attribute): Ditto.
12150
12151         * class.cs (Property): Register parameters for the Get and Set methods
12152         if they exist. Test 23 passes again.
12153
12154         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
12155         call to EmitArguments as we are sure there aren't any params arguments. 
12156         Test 32 passes again.
12157
12158         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
12159         IndexOutOfRangeException. 
12160
12161         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
12162         Test 33 now passes again.
12163
12164 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
12165
12166         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
12167         broke a bunch of things.  Will have to come up with a better way
12168         of tracking locations.
12169
12170         * statement.cs: Implemented foreach for single dimension arrays.
12171
12172 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12173
12174         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
12175         an error.  This removes the lookup from the critical path.
12176
12177         * cs-parser.jay: Removed use of temporary_loc, which is completely
12178         broken. 
12179
12180 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
12181
12182         * support.cs (ReflectionParameters.ParameterModifier): Report
12183         whether the argument is a PARAMS argument or not.
12184
12185         * class.cs: Set the attribute `ParamArrayAttribute' on the
12186         parameter argument.
12187
12188         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
12189         and cons_param_array_attribute (ConstructorInfo for
12190         ParamArrayAttribute)., 
12191
12192         * codegen.cs: Emit the return using the `Return' statement, that
12193         way we can report the error correctly for missing return values. 
12194
12195         * class.cs (Method.Emit): Clean up.
12196
12197         * expression.cs (Argument.Resolve): Take another argument: the
12198         location where this argument is used.  Notice that this is not
12199         part of the "Argument" class as to reduce the size of the
12200         structure (we know the approximate location anyways).
12201
12202         Test if the argument is a variable-reference, if not, then
12203         complain with a 206.
12204
12205         (Argument.Emit): Emit addresses of variables.
12206
12207         (Argument.FullDesc): Simplify.
12208
12209         (Invocation.DoResolve): Update for Argument.Resolve.
12210
12211         (ElementAccess.DoResolve): ditto.
12212
12213         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
12214         method should be virtual, as this method is always virtual.
12215
12216         (NewDelegate.DoResolve): Update for Argument.Resolve.
12217
12218         * class.cs (ConstructorInitializer.DoResolve): ditto.
12219
12220         * attribute.cs (Attribute.Resolve): ditto.
12221
12222 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
12223
12224         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
12225
12226         * expression.cs (ParameterReference): Drop IStackStorage and implement
12227         IAssignMethod instead. 
12228
12229         (LocalVariableReference): ditto.
12230
12231         * ecore.cs (FieldExpr): Drop IStackStorage and implement
12232         IAssignMethod instead. 
12233
12234 2001-11-13  Miguel de Icaza <miguel@ximian.com>
12235
12236         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
12237         enumerations that are used in heavily used structures derive from
12238         byte in a laughable and pathetic attempt to reduce memory usage.
12239         This is the kind of pre-optimzations that you should not do at
12240         home without adult supervision.
12241
12242         * expression.cs (UnaryMutator): New class, used to handle ++ and
12243         -- separatedly from the other unary operators.  Cleans up the
12244         code, and kills the ExpressionStatement dependency in Unary.
12245
12246         (Unary): Removed `method' and `Arguments' from this class, making
12247         it smaller, and moving it all to SimpleCall, so I can reuse this
12248         code in other locations and avoid creating a lot of transient data
12249         strucutres when not required.
12250
12251         * cs-parser.jay: Adjust for new changes.
12252
12253 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
12254
12255         * enum.cs (Enum.Populate): If there is a failure during
12256         definition, return
12257
12258         * cs-parser.jay (opt_enum_base): we used to catch type errors
12259         here, but this is really incorrect.  The type error should be
12260         catched during semantic analysis.
12261
12262 2001-12-11  Ravi Pratap  <ravi@ximian.com>
12263
12264         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
12265         current_local_parameters as expected since I, in my stupidity, had forgotten
12266         to do this :-)
12267
12268         * attribute.cs (GetValidPlaces): Fix stupid bug.
12269
12270         * class.cs (Method::Emit): Perform check on applicability of attributes.
12271
12272         (Constructor::Emit): Ditto.
12273
12274         (Field::Emit): Ditto.
12275
12276         (Field.Location): Store location information.
12277
12278         (Property, Event, Indexer, Operator): Ditto.
12279
12280         * cs-parser.jay (field_declaration): Pass in location for each field.
12281
12282         * ../errors/cs0592.cs : Add.
12283
12284 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12285
12286         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
12287
12288         (InitCoreTypes): Update accordingly.
12289
12290         (RegisterAttrType, LookupAttr): Implement.
12291
12292         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
12293         info about the same.
12294
12295         (Resolve): Update to populate the above as necessary.
12296
12297         (Error592): Helper.
12298
12299         (GetValidPlaces): Helper to the above.
12300
12301         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
12302
12303         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
12304
12305 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12306
12307         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
12308
12309         * ../errors/cs0617.cs : Add.
12310
12311 2001-11-11  Ravi Pratap  <ravi@ximian.com>
12312
12313         * enum.cs (Emit): Rename to Populate to be more consistent with what
12314         we expect it to do and when exactly it is called.
12315
12316         * class.cs, rootcontext.cs : Update accordingly.
12317
12318         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
12319         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
12320
12321         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
12322
12323         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
12324         of a fieldinfo using the above, when dealing with a FieldBuilder.
12325
12326 2001-11-10  Ravi Pratap  <ravi@ximian.com>
12327
12328         * ../errors/cs0031.cs : Add.
12329
12330         * ../errors/cs1008.cs : Add.
12331
12332         * ../errrors/cs0543.cs : Add.
12333
12334         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
12335         enum type.
12336
12337         (FindMembers): Implement.
12338
12339         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
12340         enums and delegates too.
12341
12342         (enum_types): Rename to builder_to_enum.
12343
12344         (delegate_types): Rename to builder_to_delegate.
12345
12346         * delegate.cs (FindMembers): Implement.
12347
12348 2001-11-09  Ravi Pratap  <ravi@ximian.com>
12349
12350         * typemanager.cs (IsEnumType): Implement.
12351
12352         * enum.cs (Emit): Re-write parts to account for the underlying type
12353         better and perform checking etc.
12354
12355         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
12356         of the underlying type.
12357
12358         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
12359         value
12360
12361         * enum.cs (error31): Helper to report error #31.
12362
12363         * cs-parser.jay (enum_declaration): Store location of each member too.
12364
12365         * enum.cs (member_to_location): New hashtable. 
12366
12367         (AddEnumMember): Update location hashtable.
12368
12369         (Emit): Use the location of each member while reporting errors.
12370
12371 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12372
12373         * cs-parser.jay: A for_initializer if is a
12374         local_variable_declaration really ammount to have an implicit
12375         block with the variable declaration and no initializer for for.
12376
12377         * statement.cs (For.Emit): Cope with null initializers.
12378
12379         This fixes the infinite loop on for initializers.
12380
12381 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
12382
12383         * enum.cs: More cleanup.
12384
12385         * ecore.cs: Remove dead code.
12386
12387         * class.cs (Property.Emit): More simplification.
12388         (Event.Emit): ditto.
12389
12390         Reworked to have less levels of indentation.
12391
12392 2001-11-08  Ravi Pratap  <ravi@ximian.com>
12393
12394         * class.cs (Property): Emit attributes.
12395
12396         (Field): Ditto.
12397
12398         (Event): Ditto.
12399
12400         (Indexer): Ditto.
12401
12402         (Operator): Ditto.
12403
12404         * enum.cs (Emit): Ditto.
12405
12406         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
12407         Enums too.
12408
12409         * class.cs (Field, Event, etc.): Move attribute generation into the
12410         Emit method everywhere.
12411
12412         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
12413         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
12414         as we had no way of defining nested enums !
12415
12416         * rootcontext.cs : Adjust code accordingly.
12417
12418         * typemanager.cs (AddEnumType): To keep track of enum types separately.
12419
12420 2001-11-07  Ravi Pratap  <ravi@ximian.com>
12421
12422         * expression.cs (EvalConstantExpression): Move into ecore.cs
12423
12424         * enum.cs (Enum): Rename some members and make them public and readonly
12425         according to our convention.
12426
12427         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
12428         nothing else.
12429
12430         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
12431
12432         (Enum::Emit): Write a simple version for now which doesn't try to compute
12433         expressions. I shall modify this to be more robust in just a while.
12434
12435         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
12436
12437         (TypeContainer::CloseType): Create the Enum types too.
12438
12439         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
12440
12441         * expression.cs (EvalConstantExpression): Get rid of completely.
12442
12443         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
12444         user-defined values and other cases.
12445
12446         (IsValidEnumLiteral): Helper function.
12447
12448         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
12449         out there in the case we had a literal FieldExpr.
12450
12451         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
12452
12453         (Literalize): Revamp a bit to take two arguments.
12454
12455         (EnumLiteral): New class which derives from Literal to wrap enum literals.
12456
12457 2001-11-06  Ravi Pratap  <ravi@ximian.com>
12458
12459         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
12460
12461         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
12462
12463         (Resolve): Use the above to ensure we have proper initializers.
12464
12465 2001-11-05  Ravi Pratap  <ravi@ximian.com>
12466
12467         * expression.cs (Expression::EvalConstantExpression): New method to 
12468         evaluate constant expressions.
12469
12470         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
12471
12472 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
12473
12474         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
12475         in an array.
12476
12477         (Binary.ResolveOperator): Handle operator != (object a, object b)
12478         and operator == (object a, object b);
12479
12480         (Binary.DoNumericPromotions): Indicate whether the numeric
12481         promotion was possible.
12482
12483         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
12484         Implement.  
12485
12486         Made the ArrayAccess implement interface IAssignMethod instead of
12487         IStackStore as the order in which arguments are passed reflects
12488         this.
12489
12490         * assign.cs: Instead of using expr.ExprClass to select the way of
12491         assinging, probe for the IStackStore/IAssignMethod interfaces.
12492
12493         * typemanager.cs: Load InitializeArray definition.
12494
12495         * rootcontext.cs (RootContext.MakeStaticData): Used to define
12496         static data that can be used to initialize arrays. 
12497
12498 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
12499
12500         * expression.cs: Handle operator== and operator!= for booleans.
12501
12502         (Conditioal.Reduce): Implement reducer for the ?: operator.
12503
12504         (Conditional.Resolve): Implement dead code elimination.
12505
12506         (Binary.Resolve): Catch string literals and return a new
12507         concatenated string.
12508
12509         (Unary.Reduce): Implement reduction of unary expressions.
12510
12511         * ecore.cs: Split out the expression core handling here.
12512
12513         (Expression.Reduce): New method used to perform constant folding
12514         and CSE.  This is needed to support constant-expressions. 
12515
12516         * statement.cs (Statement.EmitBoolExpression): Pass true and false
12517         targets, and optimize for !x.
12518
12519 2001-11-04  Ravi Pratap  <ravi@ximian.com>
12520
12521         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
12522         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
12523         set custom atttributes.
12524
12525         * literal.cs (Literal::GetValue): New abstract method to return the actual
12526         value of the literal, cast as an object.
12527
12528         (*Literal): Implement GetValue method.
12529
12530         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
12531         expressions to the arraylist but objects of type Argument.
12532
12533         * class.cs (TypeContainer::Emit): Emit our attributes too.
12534
12535         (Method::Emit, Constructor::Emit): Ditto.
12536
12537         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
12538         to be ignoring earlier.
12539
12540 2001-11-03  Ravi Pratap  <ravi@ximian.com>
12541
12542         * attribute.cs (AttributeSection::Define): Implement to do the business
12543         of constructing a CustomAttributeBuilder.
12544
12545         (Attribute): New trivial class. Increases readability of code.  
12546
12547         * cs-parser.jay : Update accordingly.
12548
12549         (positional_argument_list, named_argument_list, named_argument): New rules
12550
12551         (attribute_arguments): Use the above so that we are more correct.
12552
12553 2001-11-02  Ravi Pratap  <ravi@ximian.com>
12554
12555         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
12556         to perform all checks for a method with a params parameter.
12557
12558         (Invocation::OverloadResolve): Update to use the above method and therefore
12559         cope correctly with params method invocations.
12560
12561         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
12562         params too.
12563
12564         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
12565         constructors in our parent too because we can't afford to miss out on 
12566         protected ones ;-)
12567
12568         * attribute.cs (AttributeSection): New name for the class Attribute
12569
12570         Other trivial changes to improve readability.
12571
12572         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
12573         use the new class names.
12574
12575 2001-11-01  Ravi Pratap  <ravi@ximian.com>
12576
12577         * class.cs (Method::Define): Complete definition for params types too
12578
12579         (Indexer::Define): Ditto.
12580
12581         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
12582         Cope everywhere with a request for info about the array parameter.
12583
12584 2001-11-01  Ravi Pratap  <ravi@ximian.com>
12585
12586         * tree.cs (RecordNamespace): Fix up to check for the correct key.
12587
12588         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
12589         local_variable_type to extract the string corresponding to the type.
12590
12591         (local_variable_type): Fixup the action to use the new helper method.
12592
12593         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
12594         go.
12595
12596         * expression.cs : Clean out code which uses the above.
12597
12598 2001-10-31  Ravi Pratap  <ravi@ximian.com>
12599
12600         * typemanager.cs (RegisterMethod): Check if we already have an existing key
12601         and bale out if necessary by returning a false.
12602
12603         (RegisterProperty): Ditto.
12604
12605         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
12606         and print out appropriate error messages.
12607
12608         * interface.cs (everywhere): Ditto.
12609
12610         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
12611         location to constructor.
12612
12613         * class.cs (Property, Event, Indexer): Update accordingly.
12614
12615         * ../errors/cs111.cs : Added.
12616
12617         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
12618         of a method, as laid down by the spec.
12619
12620         (Invocation::OverloadResolve): Use the above method.
12621
12622 2001-10-31  Ravi Pratap  <ravi@ximian.com>
12623
12624         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
12625         now take a TypeContainer and a Parameters object.
12626
12627         (ParameterData): Modify return type of ParameterModifier method to be 
12628         Parameter.Modifier and not a string.
12629
12630         (ReflectionParameters, InternalParameters): Update accordingly.
12631
12632         * expression.cs (Argument::GetParameterModifier): Same here.
12633
12634         * support.cs (InternalParameters::ParameterType): Find a better way of determining
12635         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
12636         symbol in it at all so maybe this is only for now.
12637
12638 2001-10-30  Ravi Pratap  <ravi@ximian.com>
12639
12640         * support.cs (InternalParameters): Constructor now takes an extra argument 
12641         which is the actual Parameters class.
12642
12643         (ParameterDesc): Update to provide info on ref/out modifiers.
12644
12645         * class.cs (everywhere): Update call to InternalParameters to pass in
12646         the second argument too.
12647
12648         * support.cs (ParameterData): Add ParameterModifier, which is a method 
12649         to return the modifier info [ref/out etc]
12650
12651         (InternalParameters, ReflectionParameters): Implement the above.
12652
12653         * expression.cs (Argument::ParameterModifier): Similar function to return
12654         info about the argument's modifiers.
12655
12656         (Invocation::OverloadResolve): Update to take into account matching modifiers 
12657         too.
12658
12659         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
12660         a new SetFormalParameters object which we pass to InternalParameters.
12661
12662 2001-10-30  Ravi Pratap  <ravi@ximian.com>
12663
12664         * expression.cs (NewArray): Merge into the ArrayCreation class.
12665
12666 2001-10-29  Ravi Pratap  <ravi@ximian.com>
12667
12668         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
12669         NewUserdefinedArray into one as there wasn't much of a use in having
12670         two separate ones.
12671
12672         * expression.cs (Argument): Change field's name to ArgType from Type.
12673
12674         (Type): New readonly property which returns the proper type, taking into 
12675         account ref/out modifiers.
12676
12677         (everywhere): Adjust code accordingly for the above.
12678
12679         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
12680         whether we are emitting for a ref or out parameter.
12681
12682         * expression.cs (Argument::Emit): Use the above field to set the state.
12683
12684         (LocalVariableReference::Emit): Update to honour the flag and emit the
12685         right stuff.
12686
12687         * parameter.cs (Attributes): Set the correct flags for ref parameters.
12688
12689         * expression.cs (Argument::FullDesc): New function to provide a full desc.
12690
12691         * support.cs (ParameterData): Add method ParameterDesc to the interface.
12692
12693         (ReflectionParameters, InternalParameters): Implement the above method.
12694
12695         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
12696         reporting errors.
12697
12698         (Invocation::FullMethodDesc): Ditto. 
12699
12700 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
12701
12702         * cs-parser.jay: Add extra production for the second form of array
12703         creation. 
12704
12705         * expression.cs (ArrayCreation): Update to reflect the above
12706         change. 
12707
12708         * Small changes to prepare for Array initialization.
12709
12710 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
12711
12712         * typemanager.cs (ImplementsInterface): interface might be null;
12713         Deal with this problem;
12714
12715         Also, we do store negative hits on the cache (null values), so use
12716         this instead of calling t.GetInterfaces on the type everytime.
12717
12718 2001-10-28  Ravi Pratap  <ravi@ximian.com>
12719
12720         * typemanager.cs (IsBuiltinType): New method to help determine the same.
12721
12722         * expression.cs (New::DoResolve): Get rid of array creation code and instead
12723         split functionality out into different classes.
12724
12725         (New::FormArrayType): Move into NewBuiltinArray.
12726
12727         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
12728         quite useless.
12729
12730         (NewBuiltinArray): New class to handle creation of built-in arrays.
12731
12732         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
12733         account creation of one-dimensional arrays.
12734
12735         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
12736
12737         (NewUserdefinedArray::DoResolve): Implement.
12738
12739         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
12740
12741         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
12742         we maintain inside the TypeManager. This is necessary to perform lookups on the
12743         module builder.
12744
12745         (LookupType): Update to perform GetType on the module builders too.     
12746
12747         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
12748
12749         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
12750
12751 2001-10-23  Ravi Pratap  <ravi@ximian.com>
12752
12753         * expression.cs (New::DoResolve): Implement guts of array creation.
12754
12755         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
12756
12757 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
12758
12759         * expression.cs: Fix bug I introduced lsat night that broke
12760         Delegates. 
12761
12762         (Expression.Resolve): Report a 246 error (can not resolve name)
12763         if we find a SimpleName in the stream.
12764
12765         (Expression.ResolveLValue): Ditto.
12766
12767         (Expression.ResolveWithSimpleName): This function is a variant of
12768         ResolveName, this one allows SimpleNames to be returned without a
12769         warning.  The only consumer of SimpleNames is MemberAccess
12770
12771 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
12772
12773         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
12774         might arrive here.  I have my doubts that this is correct.
12775
12776         * statement.cs (Lock): Implement lock statement.
12777
12778         * cs-parser.jay: Small fixes to support `lock' and `using'
12779
12780         * cs-tokenizer.cs: Remove extra space
12781
12782         * driver.cs: New flag --checked, allows to turn on integer math
12783         checking. 
12784
12785         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
12786         Threading.Monitor.Exit 
12787
12788 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
12789
12790         * expression.cs (IndexerAccess::DoResolveLValue): Set the
12791         Expression Class to be IndexerAccess.
12792
12793         Notice that Indexer::DoResolve sets the eclass to Value.
12794
12795 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
12796
12797         * class.cs (TypeContainer::Emit): Emit code for indexers.
12798
12799         * assign.cs (IAssignMethod): New interface implemented by Indexers
12800         and Properties for handling assignment.
12801
12802         (Assign::Emit): Simplify and reuse code. 
12803
12804         * expression.cs (IndexerAccess, PropertyExpr): Implement
12805         IAssignMethod, clean up old code. 
12806
12807 2001-10-22  Ravi Pratap  <ravi@ximian.com>
12808
12809         * typemanager.cs (ImplementsInterface): New method to determine if a type
12810         implements a given interface. Provides a nice cache too.
12811
12812         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
12813         method.
12814
12815         (ConvertReferenceExplicit): Ditto.
12816
12817         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
12818         various methods, with correct names etc.
12819
12820         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
12821         Operator.UnaryNegation.
12822
12823         * cs-parser.jay (operator_declarator): Be a little clever in the case where
12824         we have a unary plus or minus operator.
12825
12826         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
12827         UnaryMinus.
12828
12829         * everywhere : update accordingly.
12830
12831         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
12832         respectively.
12833
12834         * class.cs (Method::Define): For the case where we are implementing a method
12835         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
12836         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
12837
12838 2001-10-21  Ravi Pratap  <ravi@ximian.com>
12839
12840         * interface.cs (FindMembers): Implement to work around S.R.E
12841         lameness.
12842
12843         * typemanager.cs (IsInterfaceType): Implement.
12844
12845         (FindMembers): Update to handle interface types too.
12846
12847         * expression.cs (ImplicitReferenceConversion): Re-write bits which
12848         use IsAssignableFrom as that is not correct - it doesn't work.
12849
12850         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
12851         and accordingly override EmitStatement.
12852
12853         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
12854         using the correct logic :-)
12855
12856 2001-10-19  Ravi Pratap  <ravi@ximian.com>
12857
12858         * ../errors/cs-11.cs : Add to demonstrate error -11 
12859
12860 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
12861
12862         * assign.cs (Assign::Resolve): Resolve right hand side first, and
12863         then pass this as a hint to ResolveLValue.
12864
12865         * expression.cs (FieldExpr): Add Location information
12866
12867         (FieldExpr::LValueResolve): Report assignment to readonly
12868         variable. 
12869
12870         (Expression::ExprClassFromMemberInfo): Pass location information.
12871
12872         (Expression::ResolveLValue): Add new method that resolves an
12873         LValue. 
12874
12875         (Expression::DoResolveLValue): Default invocation calls
12876         DoResolve. 
12877
12878         (Indexers): New class used to keep track of indexers in a given
12879         Type. 
12880
12881         (IStackStore): Renamed from LValue, as it did not really describe
12882         what this did.  Also ResolveLValue is gone from this interface and
12883         now is part of Expression.
12884
12885         (ElementAccess): Depending on the element access type
12886
12887         * typemanager.cs: Add `indexer_name_type' as a Core type
12888         (System.Runtime.CompilerServices.IndexerNameAttribute)
12889
12890         * statement.cs (Goto): Take a location.
12891
12892 2001-10-18  Ravi Pratap  <ravi@ximian.com>
12893
12894         * delegate.cs (Delegate::VerifyDelegate): New method to verify
12895         if two delegates are compatible.
12896
12897         (NewDelegate::DoResolve): Update to take care of the case when
12898         we instantiate a delegate from another delegate.
12899
12900         * typemanager.cs (FindMembers): Don't even try to look up members
12901         of Delegate types for now.
12902
12903 2001-10-18  Ravi Pratap  <ravi@ximian.com>
12904
12905         * delegate.cs (NewDelegate): New class to take care of delegate
12906         instantiation.
12907
12908         * expression.cs (New): Split the delegate related code out into 
12909         the NewDelegate class.
12910
12911         * delegate.cs (DelegateInvocation): New class to handle delegate 
12912         invocation.
12913
12914         * expression.cs (Invocation): Split out delegate related code into
12915         the DelegateInvocation class.
12916
12917 2001-10-17  Ravi Pratap  <ravi@ximian.com>
12918
12919         * expression.cs (New::DoResolve): Implement delegate creation fully
12920         and according to the spec.
12921
12922         (New::DoEmit): Update to handle delegates differently.
12923
12924         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
12925         because of which we were printing out arguments in reverse order !
12926
12927         * delegate.cs (VerifyMethod): Implement to check if the given method
12928         matches the delegate.
12929
12930         (FullDelegateDesc): Implement.
12931
12932         (VerifyApplicability): Implement.
12933
12934         * expression.cs (Invocation::DoResolve): Update to accordingly handle
12935         delegate invocations too.
12936
12937         (Invocation::Emit): Ditto.
12938
12939         * ../errors/cs1593.cs : Added.
12940
12941         * ../errors/cs1594.cs : Added.
12942
12943         * delegate.cs (InstanceExpression, TargetMethod): New properties.
12944
12945 2001-10-16  Ravi Pratap  <ravi@ximian.com>
12946
12947         * typemanager.cs (intptr_type): Core type for System.IntPtr
12948
12949         (InitCoreTypes): Update for the same.
12950
12951         (iasyncresult_type, asynccallback_type): Ditto.
12952
12953         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
12954         correct.
12955
12956         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
12957         too.
12958
12959         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
12960         the builders for the 4 members of a delegate type :-)
12961
12962         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
12963         type.
12964
12965         * expression.cs (New::DoResolve): Implement guts for delegate creation.
12966
12967         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
12968
12969 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
12970
12971         * statement.cs (Break::Emit): Implement.   
12972         (Continue::Emit): Implement.
12973
12974         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
12975         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
12976         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
12977         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
12978         end loop
12979
12980         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
12981         properties that track the label for the current loop (begin of the
12982         loop and end of the loop).
12983
12984 2001-10-15  Ravi Pratap  <ravi@ximian.com>
12985
12986         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
12987         use of emitting anything at all.
12988
12989         * class.cs, rootcontext.cs : Get rid of calls to the same.
12990
12991         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
12992
12993         (Populate): Define the constructor correctly and set the implementation
12994         attributes.
12995
12996         * typemanager.cs (delegate_types): New hashtable to hold delegates that
12997         have been defined.
12998
12999         (AddDelegateType): Implement.
13000
13001         (IsDelegateType): Implement helper method.
13002
13003         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
13004
13005         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
13006         and accordingly handle it.
13007
13008         * delegate.cs (Populate): Take TypeContainer argument.
13009         Implement bits to define the Invoke method. However, I still haven't figured out
13010         how to take care of the native int bit :-(
13011
13012         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
13013         Qualify the name of the delegate, not its return type !
13014
13015         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
13016         conversion.
13017
13018         (StandardConversionExists): Checking for array types turns out to be recursive.
13019
13020         (ConvertReferenceExplicit): Implement array conversion.
13021
13022         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
13023
13024 2001-10-12  Ravi Pratap  <ravi@ximian.com>
13025
13026         * cs-parser.jay (delegate_declaration): Store the fully qualified
13027         name as it is a type declaration.
13028
13029         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
13030         readonly.
13031
13032         (DefineDelegate): Renamed from Define. Does the same thing essentially,
13033         as TypeContainer::DefineType.
13034
13035         (Populate): Method in which all the definition of the various methods (Invoke)
13036         etc is done.
13037
13038         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
13039         see.
13040
13041         (CloseDelegate): Finally creates the delegate.
13042
13043         * class.cs (TypeContainer::DefineType): Update to define delegates.
13044         (Populate, Emit and CloseType): Do the same thing here too.
13045
13046         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
13047         delegates in all these operations.
13048
13049 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
13050
13051         * expression.cs: LocalTemporary: a new expression used to
13052         reference a temporary that has been created.
13053
13054         * assign.cs: Handle PropertyAccess back here, so that we can
13055         provide the proper semantic access to properties.
13056
13057         * expression.cs (Expression::ConvertReferenceExplicit): Implement
13058         a few more explicit conversions. 
13059
13060         * modifiers.cs: `NEW' modifier maps to HideBySig.
13061
13062         * expression.cs (PropertyExpr): Make this into an
13063         ExpressionStatement, and support the EmitStatement code path. 
13064
13065         Perform get/set error checking, clean up the interface.
13066
13067         * assign.cs: recognize PropertyExprs as targets, and if so, turn
13068         them into toplevel access objects.
13069
13070 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
13071
13072         * expression.cs: PropertyExpr::PropertyExpr: use work around the
13073         SRE.
13074
13075         * typemanager.cs: Keep track here of our PropertyBuilders again to
13076         work around lameness in SRE.
13077
13078 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
13079
13080         * expression.cs (LValue::LValueResolve): New method in the
13081         interface, used to perform a second resolution pass for LValues. 
13082
13083         (This::DoResolve): Catch the use of this in static methods.
13084
13085         (This::LValueResolve): Implement.
13086
13087         (This::Store): Remove warning, assigning to `this' in structures
13088         is 
13089
13090         (Invocation::Emit): Deal with invocation of
13091         methods on value types.  We need to pass the address to structure
13092         methods rather than the object itself.  (The equivalent code to
13093         emit "this" for structures leaves the entire structure on the
13094         stack instead of a pointer to it). 
13095
13096         (ParameterReference::DoResolve): Compute the real index for the
13097         argument based on whether the method takes or not a `this' pointer
13098         (ie, the method is static).
13099
13100         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
13101         value types returned from functions when we need to invoke a
13102         method on the sturcture.
13103
13104
13105 2001-10-11  Ravi Pratap  <ravi@ximian.com>
13106
13107         * class.cs (TypeContainer::DefineType): Method to actually do the business of
13108         defining the type in the Modulebuilder or Typebuilder. This is to take
13109         care of nested types which need to be defined on the TypeBuilder using
13110         DefineNestedMethod.
13111
13112         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
13113         methods in RootContext, only ported to be part of TypeContainer.
13114
13115         (TypeContainer::GetInterfaceOrClass): Ditto.
13116
13117         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
13118
13119         * interface.cs (Interface::DefineInterface): New method. Does exactly
13120         what RootContext.CreateInterface did earlier, only it takes care of nested types 
13121         too.
13122
13123         (Interface::GetInterfaces): Move from RootContext here and port.
13124
13125         (Interface::GetInterfaceByName): Same here.
13126
13127         * rootcontext.cs (ResolveTree): Re-write.
13128
13129         (PopulateTypes): Re-write.
13130
13131         * class.cs (TypeContainer::Populate): Populate nested types too.
13132         (TypeContainer::Emit): Emit nested members too.
13133
13134         * typemanager.cs (AddUserType): Do not make use of the FullName property,
13135         instead just use the name argument passed in as it is already fully
13136         qualified.
13137
13138         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
13139         to TypeContainer mapping to see if a type is user-defined.
13140
13141         * class.cs (TypeContainer::CloseType): Implement. 
13142
13143         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
13144         the default constructor.
13145
13146         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
13147         twice.
13148
13149         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
13150
13151         * interface.cs (CloseType): Create the type here.
13152
13153         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
13154         the hierarchy.
13155
13156         Remove all the methods which are now in TypeContainer.
13157
13158 2001-10-10  Ravi Pratap  <ravi@ximian.com>
13159
13160         * delegate.cs (Define): Re-write bits to define the delegate
13161         correctly.
13162
13163 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
13164
13165         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
13166
13167         * expression.cs (ImplicitReferenceConversion): handle null as well
13168         as a source to convert to any reference type.
13169
13170         * statement.cs (Return): Perform any implicit conversions to
13171         expected return type.  
13172
13173         Validate use of return statement.  
13174
13175         * codegen.cs (EmitContext): Pass the expected return type here.
13176
13177         * class.cs (Method, Constructor, Property): Pass expected return
13178         type to EmitContext.
13179
13180 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
13181
13182         * expression.cs: Make DoResolve take an EmitContext instead of a
13183         TypeContainer.
13184
13185         Replaced `l' and `location' for `loc', for consistency.
13186
13187         (Error, Warning): Remove unneeded Tc argument.
13188
13189         * assign.cs, literal.cs, constant.cs: Update to new calling
13190         convention. 
13191
13192         * codegen.cs: EmitContext now contains a flag indicating whether
13193         code is being generated in a static method or not.
13194
13195         * cs-parser.jay: DecomposeQI, new function that replaces the old
13196         QualifiedIdentifier.  Now we always decompose the assembled
13197         strings from qualified_identifier productions into a group of
13198         memberaccesses.
13199
13200 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
13201
13202         * rootcontext.cs: Deal with field-less struct types correctly now
13203         by passing the size option to Define Type.
13204
13205         * class.cs: Removed hack that created one static field. 
13206
13207 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13208
13209         * statement.cs: Moved most of the code generation here. 
13210
13211 2001-10-09  Ravi Pratap  <ravi@ximian.com>
13212
13213         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
13214         seem very right.
13215
13216         (ElementAccess): Remove useless bits for now - keep checks as the spec
13217         says.
13218
13219 2001-10-08  Ravi Pratap  <ravi@ximian.com>
13220
13221         * expression.cs (ElementAccess::DoResolve): Remove my crap code
13222         and start performing checks according to the spec.
13223
13224 2001-10-07  Ravi Pratap  <ravi@ximian.com>
13225
13226         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
13227         rank_specifiers instead.
13228
13229         (rank_specifiers): Change the order in which the rank specifiers are stored
13230
13231         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
13232
13233         * expression.cs (ElementAccess): Implement the LValue interface too.
13234
13235 2001-10-06  Ravi Pratap  <ravi@ximian.com>
13236
13237         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
13238         except that user defined conversions are not included.
13239
13240         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
13241         perform the conversion of the return type, if necessary.
13242
13243         (New::DoResolve): Check whether we are creating an array or an object
13244         and accordingly do the needful.
13245
13246         (New::Emit): Same here.
13247
13248         (New::DoResolve): Implement guts of array creation.
13249
13250         (New::FormLookupType): Helper function.
13251
13252 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13253
13254         * codegen.cs: Removed most of the code generation here, and move the
13255         corresponding code generation bits to the statement classes. 
13256
13257         Added support for try/catch/finalize and throw.
13258
13259         * cs-parser.jay: Added support for try/catch/finalize.
13260
13261         * class.cs: Catch static methods having the flags override,
13262         virtual or abstract.
13263
13264         * expression.cs (UserCast): This user cast was not really doing
13265         what it was supposed to do.  Which is to be born in fully resolved
13266         state.  Parts of the resolution were being performed at Emit time! 
13267
13268         Fixed this code.
13269
13270 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13271
13272         * expression.cs: Implicity convert the result from UserCast.
13273
13274 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13275
13276         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
13277         prevented it from working correctly. 
13278
13279         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
13280         merely ConvertImplicit.
13281
13282 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13283
13284         * typemanager.cs: Make the LookupTypeContainer function static,
13285         and not per-instance.  
13286
13287         * class.cs: Make static FindMembers (the one that takes a Type
13288         argument). 
13289
13290         * codegen.cs: Add EmitForeach here.
13291
13292         * cs-parser.jay: Make foreach a toplevel object instead of the
13293         inline expansion, as we need to perform semantic analysis on it. 
13294
13295 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13296
13297         * expression.cs (Expression::ImplicitUserConversion): Rename to
13298         UserDefinedConversion.
13299
13300         (Expression::UserDefinedConversion): Take an extra argument specifying 
13301         whether we look for explicit user conversions too.
13302
13303         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
13304
13305         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
13306
13307         (ExplicitUserConversion): Make it a call to UserDefinedConversion
13308         with the appropriate arguments.
13309
13310         * cs-parser.jay (cast_expression): Record location too.
13311
13312         * expression.cs (Cast): Record location info.
13313
13314         (Expression::ConvertExplicit): Take location argument.
13315
13316         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
13317         to determine if we are doing explicit conversions.
13318
13319         (UserCast::Emit): Update accordingly.
13320
13321         (Expression::ConvertExplicit): Report an error if everything fails.
13322
13323         * ../errors/cs0030.cs : Add.
13324
13325 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
13326
13327         * modifiers.cs: If the ABSTRACT keyword is present, also set the
13328         virtual and newslot bits. 
13329
13330         * class.cs (TypeContainer::RegisterRequiredImplementations):
13331         Record methods we need.
13332
13333         (TypeContainer::MakeKey): Helper function to make keys for
13334         MethodBases, since the Methodbase key is useless.
13335
13336         (TypeContainer::Populate): Call RegisterRequiredImplementations
13337         before defining the methods.   
13338
13339         Create a mapping for method_builders_to_methods ahead of time
13340         instead of inside a tight loop.
13341
13342         (::RequireMethods):  Accept an object as the data to set into the
13343         hashtable so we can report interface vs abstract method mismatch.
13344
13345 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13346
13347         * report.cs: Make all of it static.
13348
13349         * rootcontext.cs: Drop object_type and value_type computations, as
13350         we have those in the TypeManager anyways.
13351
13352         Drop report instance variable too, now it is a global.
13353
13354         * driver.cs: Use try/catch on command line handling.
13355
13356         Add --probe option to debug the error reporting system with a test
13357         suite. 
13358
13359         * report.cs: Add support for exiting program when a probe
13360         condition is reached.
13361
13362 2001-10-03  Ravi Pratap  <ravi@ximian.com>
13363
13364         * expression.cs (Binary::DoNumericPromotions): Fix the case when
13365         we do a forcible conversion regardless of type, to check if 
13366         ForceConversion returns a null.
13367
13368         (Binary::error19): Use location to report error.
13369
13370         (Unary::error23): Use location here too.
13371
13372         * ../errors/cs0019.cs : Check in.
13373
13374         * ../errors/cs0023.cs : Check in.
13375
13376         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
13377         case of a non-null MethodInfo object with a length of 0 !
13378
13379         (Binary::ResolveOperator): Flag error if overload resolution fails to find
13380         an applicable member - according to the spec :-)
13381         Also fix logic to find members in base types.
13382
13383         (Unary::ResolveOperator): Same here.
13384
13385         (Unary::report23): Change name to error23 and make first argument a TypeContainer
13386         as I was getting thoroughly confused between this and error19 :-)
13387
13388         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
13389         (::FindMostEncompassedType): Implement.
13390         (::FindMostEncompassingType): Implement.
13391         (::StandardConversionExists): Implement.
13392
13393         (UserImplicitCast): Re-vamp. We now need info about most specific
13394         source and target types so that we can do the necessary conversions.
13395
13396         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
13397         mathematical union with no duplicates.
13398
13399 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13400
13401         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
13402         in order from base classes to child classes, so that we can in
13403         child classes look up in our parent for method names and
13404         attributes (required for handling abstract, virtual, new, override
13405         constructs: we need to instrospect our base class, and if we dont
13406         populate the classes in order, the introspection might be
13407         incorrect.  For example, a method could query its parent before
13408         the parent has any methods and would determine that the parent has
13409         no abstract methods (while it could have had them)).
13410
13411         (RootContext::CreateType): Record the order in which we define the
13412         classes.
13413
13414 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
13415
13416         * class.cs (TypeContainer::Populate): Also method definitions can
13417         fail now, keep track of this.
13418
13419         (TypeContainer::FindMembers): Implement support for
13420         DeclaredOnly/noDeclaredOnly flag.
13421
13422         (Constructor::Emit) Return the ConstructorBuilder.
13423
13424         (Method::Emit) Return the MethodBuilder. 
13425         Check for abstract or virtual methods to be public.
13426
13427         * rootcontext.cs (RootContext::CreateType): Register all the
13428         abstract methods required for the class to be complete and the
13429         interface methods that must be implemented. 
13430
13431         * cs-parser.jay: Report error 501 (method requires body if it is
13432         not marked abstract or extern).
13433
13434         * expression.cs (TypeOf::Emit): Implement.
13435
13436         * typemanager.cs: runtime_handle_type, new global type.
13437
13438         * class.cs (Property::Emit): Generate code for properties.
13439
13440 2001-10-02  Ravi Pratap  <ravi@ximian.com>
13441
13442         * expression.cs (Unary::ResolveOperator): Find operators on base type
13443         too - we now conform exactly to the spec.
13444
13445         (Binary::ResolveOperator): Same here.
13446
13447         * class.cs (Operator::Define): Fix minor quirk in the tests.
13448
13449         * ../errors/cs0215.cs : Added.
13450
13451         * ../errors/cs0556.cs : Added.
13452
13453         * ../errors/cs0555.cs : Added.
13454
13455 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
13456
13457         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
13458         single integer which is really efficient
13459
13460 2001-10-01  Ravi Pratap  <ravi@ximian.com>
13461
13462         *  expression.cs (Expression::ImplicitUserConversion): Use location
13463         even in the case when we are examining True operators.
13464  
13465         * class.cs (Operator::Define): Perform extensive checks to conform
13466         with the rules for operator overloading in the spec.
13467
13468         * expression.cs (Expression::ImplicitReferenceConversion): Implement
13469         some of the other conversions mentioned in the spec.
13470
13471         * typemanager.cs (array_type): New static member for the System.Array built-in
13472         type.
13473
13474         (cloneable_interface): For System.ICloneable interface.
13475
13476         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
13477         we start resolving the tree and populating types.
13478
13479         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
13480  
13481 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
13482
13483         * expression.cs (Expression::ExprClassFromMemberInfo,
13484         Expression::Literalize): Create literal expressions from
13485         FieldInfos which are literals.
13486
13487         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
13488         type casts, because they were wrong.  The test suite in tests
13489         caught these ones.
13490
13491         (ImplicitNumericConversion): ushort to ulong requires a widening
13492         cast. 
13493
13494         Int32 constant to long requires widening cast as well.
13495
13496         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
13497         for integers because the type on the stack is not i4.
13498
13499 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
13500
13501         * expression.cs (report118): require location argument. 
13502
13503         * parameter.cs: Do not dereference potential null value.
13504
13505         * class.cs: Catch methods that lack the `new' keyword when
13506         overriding a name.  Report warnings when `new' is used without
13507         anything being there to override.
13508
13509         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
13510
13511         * class.cs: Only add constructor to hashtable if it is non-null
13512         (as now constructors can fail on define).
13513
13514         (TypeManager, Class, Struct): Take location arguments.
13515
13516         Catch field instance initialization in structs as errors.
13517
13518         accepting_filter: a new filter for FindMembers that is static so
13519         that we dont create an instance per invocation.
13520
13521         (Constructor::Define): Catch errors where a struct constructor is
13522         parameterless 
13523
13524         * cs-parser.jay: Pass location information for various new
13525         constructs. 
13526
13527         * delegate.cs (Delegate): take a location argument.
13528
13529         * driver.cs: Do not call EmitCode if there were problesm in the
13530         Definition of the types, as many Builders wont be there. 
13531
13532         * decl.cs (Decl::Decl): Require a location argument.
13533
13534         * cs-tokenizer.cs: Handle properly hex constants that can not fit
13535         into integers, and find the most appropiate integer for it.
13536
13537         * literal.cs: Implement ULongLiteral.
13538
13539         * rootcontext.cs: Provide better information about the location of
13540         failure when CreateType fails.
13541
13542 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
13543
13544         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
13545         as well.
13546
13547         * expression.cs (Binary::CheckShiftArguments): Add missing type
13548         computation.
13549         (Binary::ResolveOperator): Add type to the logical and and logical
13550         or, Bitwise And/Or and Exclusive Or code paths, it was missing
13551         before.
13552
13553         (Binary::DoNumericPromotions): In the case where either argument
13554         is ulong (and most signed types combined with ulong cause an
13555         error) perform implicit integer constant conversions as well.
13556
13557 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
13558
13559         * expression.cs (UserImplicitCast): Method should always be
13560         non-null. 
13561         (Invocation::BetterConversion): Simplified test for IntLiteral.
13562
13563         (Expression::ImplicitNumericConversion): Split this routine out.
13564         Put the code that performs implicit constant integer conversions
13565         here. 
13566
13567         (Expression::Resolve): Become a wrapper around DoResolve so we can
13568         check eclass and type being set after resolve.
13569
13570         (Invocation::Badness): Remove this dead function
13571
13572         (Binary::ResolveOperator): Do not compute the expensive argumnets
13573         unless we have a union for it.
13574
13575         (Probe::Emit): Is needs to do an isinst and then
13576         compare against null.
13577
13578         (::CanConvert): Added Location argument.  If the Location argument
13579         is null (Location.Null), then we do not report errors.  This is
13580         used by the `probe' mechanism of the Explicit conversion.  We do
13581         not want to generate an error for something that the user
13582         explicitly requested to be casted.  But the pipeline for an
13583         explicit cast first tests for potential implicit casts.
13584
13585         So for now, if the Location is null, it means `Probe only' to
13586         avoid adding another argument.   Might have to revise this
13587         strategy later.
13588
13589         (ClassCast): New class used to type cast objects into arbitrary
13590         classes (used in Explicit Reference Conversions).
13591
13592         Implement `as' as well.
13593
13594         Reverted all the patches from Ravi below: they were broken:
13595
13596                 * The use of `level' as a mechanism to stop recursive
13597                   invocations is wrong.  That was there just to catch the
13598                   bug with a strack trace but not as a way of addressing
13599                   the problem.
13600
13601                   To fix the problem we have to *understand* what is going
13602                   on and the interactions and come up with a plan, not
13603                   just get things going.
13604
13605                 * The use of the type conversion cache that I proposed
13606                   last night had an open topic: How does this work across
13607                   protection domains.  A user defined conversion might not
13608                   be public in the location where we are applying the
13609                   conversion, a different conversion might be selected
13610                   (ie, private A->B (better) but public B->A (worse),
13611                   inside A, A->B applies, but outside it, B->A will
13612                   apply).
13613
13614                 * On top of that (ie, even if the above is solved),
13615                   conversions in a cache need to be abstract.  Ie, `To
13616                   convert from an Int to a Short use an OpcodeCast', not
13617                   `To convert from an Int to a Short use the OpcodeCast on
13618                   the variable 5' (which is what this patch was doing).
13619
13620 2001-09-28  Ravi Pratap  <ravi@ximian.com>
13621
13622         * expression.cs (Invocation::ConversionExists): Re-write to use
13623         the conversion cache
13624
13625         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
13626         cache all conversions done, not just user-defined ones.
13627
13628         (Invocation::BetterConversion): The real culprit. Use ConversionExists
13629         to determine if a conversion exists instead of acutually trying to 
13630         perform the conversion. It's faster too.
13631
13632         (Expression::ConvertExplicit): Modify to use ConversionExists to check
13633         and only then attempt the implicit conversion.
13634
13635 2001-09-28  Ravi Pratap  <ravi@ximian.com>
13636
13637         * expression.cs (ConvertImplicit): Use a cache for conversions
13638         already found. Check level of recursion and bail out if necessary.
13639
13640 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
13641
13642         * typemanager.cs (string_concat_string_string, string_concat_object_object):
13643         Export standard methods that we expect for string operations.
13644
13645         * statement.cs (Block::UsageWarning): Track usage of variables and
13646         report the errors for not used variables.
13647
13648         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
13649         operator. 
13650
13651 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
13652
13653         * codegen.cs: remove unnneded code 
13654
13655         * expression.cs: Removed BuiltinTypeAccess class
13656
13657         Fix the order in which implicit conversions are
13658         done.  
13659
13660         The previous fixed dropped support for boxed conversions (adding a
13661         test to the test suite now)
13662
13663         (UserImplicitCast::CanConvert): Remove test for source being null,
13664         that code is broken.  We should not feed a null to begin with, if
13665         we do, then we should track the bug where the problem originates
13666         and not try to cover it up here.
13667
13668         Return a resolved expression of type UserImplicitCast on success
13669         rather than true/false.  Ravi: this is what I was talking about,
13670         the pattern is to use a static method as a "constructor" for
13671         objects. 
13672
13673         Also, do not create arguments until the very last minute,
13674         otherwise we always create the arguments even for lookups that
13675         will never be performed. 
13676
13677         (UserImplicitCast::Resolve): Eliminate, objects of type
13678         UserImplicitCast are born in a fully resolved state. 
13679
13680         * typemanager.cs (InitCoreTypes): Init also value_type
13681         (System.ValueType). 
13682
13683         * expression.cs (Cast::Resolve): First resolve the child expression.
13684
13685         (LValue): Add new method AddressOf to be used by
13686         the `&' operator.  
13687
13688         Change the argument of Store to take an EmitContext instead of an
13689         ILGenerator, because things like FieldExpr need to be able to call
13690         their children expression to generate the instance code. 
13691
13692         (Expression::Error, Expression::Warning): Sugar functions for
13693         reporting errors.
13694
13695         (Expression::MemberLookup): Accept a TypeContainer instead of a
13696         Report as the first argument.
13697
13698         (Expression::ResolvePrimary): Killed.  I still want to improve
13699         this as currently the code is just not right.
13700
13701         (Expression::ResolveMemberAccess): Simplify, but it is still
13702         wrong. 
13703
13704         (Unary::Resolve): Catch errors in AddressOf operators.
13705
13706         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
13707         index to a byte for the short-version, or the compiler will choose
13708         the wrong Emit call, which generates the wrong data.
13709
13710         (ParameterReference::Emit, ::Store): same.
13711
13712         (FieldExpr::AddressOf): Implement.
13713
13714         * typemanager.cs: TypeManager: made public variable instead of
13715         property.
13716
13717         * driver.cs: document --fatal.
13718
13719         * report.cs (ErrorMessage, WarningMessage): new names for the old
13720         Error and Warning classes.
13721
13722         * cs-parser.jay (member_access): Turn built-in access to types
13723         into a normal simplename
13724
13725 2001-09-27  Ravi Pratap  <ravi@ximian.com>
13726
13727         * expression.cs (Invocation::BetterConversion): Fix to cope
13728         with q being null, since this was introducing a bug.
13729
13730         * expression.cs (ConvertImplicit): Do built-in conversions first.
13731
13732 2001-09-27  Ravi Pratap  <ravi@ximian.com>
13733
13734         * expression.cs (UserImplicitCast::Resolve): Fix bug.
13735
13736 2001-09-27  Ravi Pratap  <ravi@ximian.com>
13737
13738         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
13739         I had introduced long ago (what's new ?).
13740
13741         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
13742         the work of all the checking. 
13743         (ConvertImplicit): Call CanConvert and only then create object if necessary.
13744         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
13745
13746         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
13747         that is the right way. 
13748
13749         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
13750         overloading resolution. Use everywhere instead of cutting and pasting code.
13751
13752         (Binary::ResolveOperator): Use MakeUnionSet.
13753
13754         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
13755         we have to convert to bool types. Not complete yet.
13756
13757 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
13758
13759         * typemanager.cs (TypeManager::CSharpName): support ushort.
13760
13761         * expression.cs (Expression::TryImplicitIntConversion): Attempts
13762         to provide an expression that performsn an implicit constant int
13763         conversion (section 6.1.6).
13764         (Expression::ConvertImplicitRequired): Reworked to include
13765         implicit constant expression conversions.
13766
13767         (Expression::ConvertNumericExplicit): Finished.
13768
13769         (Invocation::Emit): If InstanceExpression is null, then it means
13770         that we perform a call on this.
13771
13772 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
13773
13774         * expression.cs (Unary::Emit): Remove some dead code.
13775         (Probe): Implement Resolve and Emit for `is'.
13776         (Expression::ConvertImplicitRequired): Attempt to do constant
13777         expression conversions here.  Maybe should be moved to
13778         ConvertImplicit, but I am not sure.
13779         (Expression::ImplicitLongConstantConversionPossible,
13780         Expression::ImplicitIntConstantConversionPossible): New functions
13781         that tell whether is it possible to apply an implicit constant
13782         expression conversion.
13783
13784         (ConvertNumericExplicit): Started work on explicit numeric
13785         conversions.
13786
13787         * cs-parser.jay: Update operator constants.
13788
13789         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
13790         (Parameters::GetSignature): Hook up VerifyArgs here.
13791         (Parameters::VerifyArgs): Verifies that no two arguments have the
13792         same name. 
13793
13794         * class.cs (Operator): Update the operator names to reflect the
13795         ones that the spec expects (as we are just stringizing the
13796         operator names).
13797
13798         * expression.cs (Unary::ResolveOperator): Fix bug: Use
13799         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
13800         previous usage did only work for our methods.
13801         (Expression::ConvertImplicit): Handle decimal implicit numeric
13802         conversions as well.
13803         (Expression::InternalTypeConstructor): Used to invoke constructors
13804         on internal types for default promotions.
13805
13806         (Unary::Emit): Implement special handling for the pre/post
13807         increment/decrement for overloaded operators, as they need to have
13808         the same semantics as the other operators.
13809
13810         (Binary::ResolveOperator): ditto.
13811         (Invocation::ConversionExists): ditto.
13812         (UserImplicitCast::Resolve): ditto.
13813
13814 2001-09-26  Ravi Pratap  <ravi@ximian.com>
13815
13816         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
13817         operator, return after emitting body. Regression tests pass again !
13818
13819         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
13820         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
13821         (Invocation::OverloadResolve): Ditto.
13822         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
13823
13824         * everywhere : update calls to the above methods accordingly.
13825
13826 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
13827
13828         * assign.cs (Assign): Make it inherit from ExpressionStatement.
13829
13830         * expression.cs (ExpressionStatement): New base class used for
13831         expressions that can appear in statements, so that we can provide
13832         an alternate path to generate expression that do not leave a value
13833         on the stack.
13834
13835         (Expression::Emit, and all the derivatives): We no longer return
13836         whether a value is left on the stack or not.  Every expression
13837         after being emitted leaves a single value on the stack.
13838
13839         * codegen.cs (EmitContext::EmitStatementExpression): Use the
13840         facilties of ExpressionStatement if possible.
13841
13842         * cs-parser.jay: Update statement_expression.
13843
13844 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
13845
13846         * driver.cs: Change the wording of message
13847
13848 2001-09-25  Ravi Pratap  <ravi@ximian.com>
13849
13850         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
13851         the type of the expression to the return type of the method if
13852         we have an overloaded operator match ! The regression tests pass again !
13853         (Unary::ResolveOperator): Ditto.
13854
13855         * expression.cs (Invocation::ConversionExists): Correct the member lookup
13856         to find "op_Implicit", not "implicit" ;-)
13857         (UserImplicitCast): New class to take care of user-defined implicit conversions.
13858         (ConvertImplicit, ForceConversion): Take TypeContainer argument
13859
13860         * everywhere : Correct calls to the above accordingly.
13861
13862         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
13863         (ConvertImplicit): Do user-defined conversion if it exists.
13864
13865 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
13866
13867         * assign.cs: track location.
13868         (Resolve): Use implicit conversions on assignment.
13869
13870         * literal.cs: Oops.  Not good, Emit of short access values should
13871         pass (Bytes) or the wrong argument will be selected.
13872
13873         * expression.cs (Unary::Emit): Emit code for -expr.
13874
13875         (Unary::ResolveOperator): Handle `Substract' for non-constants
13876         (substract from zero from the non-constants).
13877         Deal with Doubles as well. 
13878
13879         (Expression::ConvertImplicitRequired): New routine that reports an
13880         error if no implicit conversion exists. 
13881
13882         (Invocation::OverloadResolve): Store the converted implicit
13883         expressions if we make them
13884
13885 2001-09-24  Ravi Pratap  <ravi@ximian.com>
13886
13887         * class.cs (ConstructorInitializer): Take a Location argument.
13888         (ConstructorBaseInitializer): Same here.
13889         (ConstructorThisInitializer): Same here.
13890
13891         * cs-parser.jay : Update all calls accordingly.
13892
13893         * expression.cs (Unary, Binary, New): Take location argument.
13894         Update accordingly everywhere.
13895
13896         * cs-parser.jay : Update all calls to the above to take a location
13897         argument.
13898
13899         * class.cs : Ditto.
13900
13901 2001-09-24  Ravi Pratap  <ravi@ximian.com>
13902
13903         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
13904         (Invocation::BetterConversion): Same here
13905         (Invocation::ConversionExists): Ditto.
13906
13907         (Invocation::ConversionExists): Implement.
13908
13909 2001-09-22  Ravi Pratap  <ravi@ximian.com>
13910
13911         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
13912         Also take an additional TypeContainer argument.
13913
13914         * All over : Pass in TypeContainer as argument to OverloadResolve.
13915
13916         * typemanager.cs (CSharpName): Update to check for the string type and return
13917         that too.
13918
13919         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
13920         a given method.
13921
13922 2001-09-21  Ravi Pratap  <ravi@ximian.com>
13923
13924         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
13925         (Invocation::BetterFunction): Implement.
13926         (Invocation::BetterConversion): Implement.
13927         (Invocation::ConversionExists): Skeleton, no implementation yet.
13928
13929         Okay, things work fine !
13930
13931 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
13932
13933         * typemanager.cs: declare and load enum_type, delegate_type and
13934         void_type. 
13935
13936         * expression.cs (Expression::Emit): Now emit returns a value that
13937         tells whether a value is left on the stack or not.  This strategy
13938         might be reveted tomorrow with a mechanism that would address
13939         multiple assignments.
13940         (Expression::report118): Utility routine to report mismatches on
13941         the ExprClass.
13942
13943         (Unary::Report23): Report impossible type/operator combination
13944         utility function.
13945
13946         (Unary::IsIncrementableNumber): Whether the type can be
13947         incremented or decremented with add.
13948         (Unary::ResolveOperator): Also allow enumerations to be bitwise
13949         complemented. 
13950         (Unary::ResolveOperator): Implement ++, !, ~,
13951
13952         (Invocation::Emit): Deal with new Emit convetion.
13953
13954         * All Expression derivatives: Updated their Emit method to return
13955         whether they leave values on the stack or not.
13956
13957         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
13958         stack for expressions that are statements. 
13959
13960 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
13961
13962         * expression.cs (LValue): New interface.  Must be implemented by
13963         LValue objects.
13964         (LocalVariableReference, ParameterReference, FieldExpr): Implement
13965         LValue interface.
13966
13967         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
13968         interface for generating code, simplifies the code.
13969
13970 2001-09-20  Ravi Pratap  <ravi@ximian.com>
13971
13972         * expression.cs (everywhere): Comment out return statements in ::Resolve
13973         methods to avoid the warnings.
13974
13975 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
13976
13977         * driver.cs (parse): Report error 2001 if we can not open the
13978         source file.
13979
13980         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
13981         not resolve it.
13982
13983         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
13984         object. 
13985
13986         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
13987         otherwise nested blocks end up with the same index.
13988
13989         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
13990
13991         * expression.cs:  Instead of having FIXMEs in the Resolve
13992         functions, throw exceptions so it is obvious that we are facing a
13993         bug. 
13994
13995         * cs-parser.jay (invocation_expression): Pass Location information.
13996
13997         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
13998         Use a basename for those routines because .NET does not like paths
13999         on them. 
14000
14001         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
14002         already defined.
14003
14004 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
14005
14006         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
14007         are loading the correct data types (throws an exception if not).
14008         (TypeManager::InitCoreTypes): Use CoreLookupType
14009
14010         * expression.cs (Unary::ResolveOperator): return the child
14011         expression for expressions which are just +expr.
14012         (Unary::ResolveOperator): Return negative literals for -LITERAL
14013         expressions (otherwise they are Unary {Literal}).
14014         (Invocation::Badness): Take into account `Implicit constant
14015         expression conversions'.
14016
14017         * literal.cs (LongLiteral): Implement long literal class.
14018         (IntLiteral): export the `Value' of the intliteral. 
14019
14020 2001-09-19  Ravi Pratap  <ravi@ximian.com>
14021
14022         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
14023
14024         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
14025         instead of 'Operator'
14026
14027         * expression.cs (Binary::ResolveOperator): Update accordingly.
14028         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
14029         and 'Minus'
14030
14031         * cs-parser.jay (unary_expression): Update to use the new names.
14032
14033         * gen-treedump.cs (GetUnary): Same here.
14034
14035         * expression.cs (Unary::Resolve): Implement.
14036         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
14037         operators are found instead of making noise ;-)
14038         (Unary::ResolveOperator): New method to do precisely the same thing which
14039         Binary::ResolveOperator does for Binary expressions.
14040         (Unary.method, .Arguments): Add.
14041         (Unary::OperName): Implement.   
14042         (Unary::ForceConversion): Copy and Paste !
14043
14044         * class.cs (Operator::Define): Fix a small bug for the case when we have 
14045         a unary operator.
14046
14047         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
14048         for the inbuilt operators. Only overloading works for now ;-)
14049
14050 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
14051
14052         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
14053         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
14054
14055         * expression.cs (This::Emit): Implement. 
14056         (This::Resolve): Implement.
14057         (TypeOf:Resolve): Implement.
14058         (Expression::ResolveSimpleName): Add an implicit this to instance
14059         field references. 
14060         (MemberAccess::Resolve): Deal with Parameters and Fields. 
14061         Bind instance variable to Field expressions.
14062         (FieldExpr::Instance): New field used to track the expression that
14063         represents the object instance.
14064         (FieldExpr::Resolve): Track potential errors from MemberLookup not
14065         binding 
14066         (FieldExpr::Emit): Implement.
14067
14068         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
14069         the last instruction contains a return opcode to avoid generating
14070         the last `ret' instruction (this generates correct code, and it is
14071         nice to pass the peverify output).
14072
14073         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
14074         initializer for static and instance variables.
14075         (Constructor::Emit): Allow initializer to be null in the case of
14076         static constructors.  Only emit initializer for instance
14077         constructors. 
14078
14079         (TypeContainer::FindMembers): Return a null array if there are no
14080         matches.
14081
14082         Also fix the code for the MemberTypes.Method branch, as it was not
14083         scanning that for operators (or tried to access null variables before).
14084
14085         * assign.cs (Assign::Emit): Handle instance and static fields. 
14086
14087         * TODO: Updated.
14088
14089         * driver.cs: Stop compilation if there are parse errors.
14090
14091         * cs-parser.jay (constructor_declaration): Provide default base
14092         initializer for non-static constructors.
14093         (constructor_declarator): Do not provide a default base
14094         initializers if none was specified.
14095         Catch the fact that constructors should not have parameters.
14096
14097         * class.cs: Do not emit parent class initializers for static
14098         constructors, that should be flagged as an error.
14099
14100 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14101
14102         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
14103         Move back code into TypeContainer::Populate.
14104
14105 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14106
14107         * class.cs (TypeContainer::AddConstructor): Fix the check to
14108         compare against Name, not Basename. 
14109         (Operator::OpType): Change Plus and Minus to Add and Subtract.
14110
14111         * cs-parser.jay : Update accordingly.
14112
14113         * class.cs (TypeContainer::FindMembers): For the case where we are searching
14114         for methods, don't forget to look into the operators too.
14115         (RegisterMethodBuilder): Helper method to take care of this for
14116         methods, constructors and operators.
14117         (Operator::Define): Completely revamp.
14118         (Operator.OperatorMethod, MethodName): New fields.
14119         (TypeContainer::Populate): Move the registering of builders into
14120         RegisterMethodBuilder.
14121         (Operator::Emit): Re-write.
14122
14123         * expression.cs (Binary::Emit): Comment out code path to emit method
14124         invocation stuff for the case when we have a user defined operator. I am
14125         just not able to get it right !
14126
14127 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14128
14129         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
14130         argument. 
14131
14132         (Expression::MemberLookup): Provide a version that allows to
14133         specify the MemberTypes and BindingFlags. 
14134
14135         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
14136         so it was not fetching variable information from outer blocks.
14137
14138         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
14139         Beforefieldinit as it was buggy.
14140
14141         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
14142         that Ravi put here.  
14143
14144         * class.cs (Constructor::Emit): Only emit if block is not null.
14145         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
14146         deal with this by semantically definining it as if the user had
14147         done it.
14148
14149         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
14150         constructors as we now "emit" them at a higher level.
14151
14152         (TypeContainer::DefineDefaultConstructor): Used to define the
14153         default constructors if none was provided.
14154
14155         (ConstructorInitializer): Add methods Resolve and Emit. 
14156
14157         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
14158
14159 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14160
14161         * class.cs (TypeContainer::EmitDefaultConstructor): Register
14162         the default constructor builder with our hashtable for methodbuilders
14163         to methodcores.
14164
14165         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
14166         and argument_count is 0 in which case we have a match.
14167         (Binary::ResolveOperator): More null checking and miscellaneous coding
14168         style cleanup.
14169
14170 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14171
14172         * rootcontext.cs (IsNameSpace): Compare against null.
14173
14174         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
14175
14176         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
14177         and Unary::Operator.
14178
14179         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
14180         accordingly.
14181
14182         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
14183         we have overloaded operators.
14184         (Binary::ResolveOperator): Implement the part which does the operator overload
14185         resolution.
14186
14187         * class.cs (Operator::Emit): Implement.
14188         (TypeContainer::Emit): Emit the operators we have too.
14189
14190         * expression.cs (Binary::Emit): Update to emit the appropriate code for
14191         the case when we have a user-defined operator.
14192
14193 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14194
14195         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
14196
14197 2001-09-16  Ravi Pratap  <ravi@ximian.com>
14198
14199         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
14200         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
14201         (Constructor::Emit): Implement.
14202         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
14203         if we have no work to do. 
14204         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
14205         Emit method.
14206
14207         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
14208         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
14209
14210         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
14211         of parent.parent.
14212
14213 2001-09-15  Ravi Pratap  <ravi@ximian.com>
14214
14215         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
14216         in the source.
14217         (Tree::RecordNamespace): Method to do what the name says ;-)
14218         (Tree::Namespaces): Property to get at the namespaces hashtable.
14219
14220         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
14221         keep track.
14222
14223         * rootcontext.cs (IsNamespace): Fixed it :-)
14224
14225 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14226
14227         * class.cs (TypeContainer::FindMembers): Add support for
14228         constructors. 
14229         (MethodCore): New class that encapsulates both the shared aspects
14230         of a Constructor and a Method.  
14231         (Method, Constructor): Factored pieces into MethodCore.
14232
14233         * driver.cs: Added --fatal which makes errors throw exceptions.
14234         Load System assembly as well as part of the standard library.
14235
14236         * report.cs: Allow throwing exceptions on errors for debugging.
14237
14238         * modifiers.cs: Do not use `parent', instead use the real type
14239         container to evaluate permission settings.
14240
14241         * class.cs: Put Ravi's patch back in.  He is right, and we will
14242         have to cope with the
14243
14244 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14245
14246         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
14247         FamORAssem, not FamANDAssem.
14248
14249 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14250
14251         * driver.cs: Added --parse option that only parses its input files
14252         and terminates.
14253
14254         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
14255         incorrect.  IsTopLevel is not used to tell whether an object is
14256         root_types or not (that can be achieved by testing this ==
14257         root_types).  But to see if this is a top-level *class* (not
14258         necessarly our "toplevel" container). 
14259
14260 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14261
14262         * enum.cs (Enum::Define): Modify to call the Lookup method on the
14263         parent instead of a direct call to GetType.
14264
14265 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14266
14267         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
14268         Modifiers.TypeAttr. This should just be a call to that method.
14269
14270         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
14271         object so that we can determine if we are top-level or not.
14272
14273         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
14274         TypeContainer too.
14275
14276         * enum.cs (Enum::Define): Ditto.
14277
14278         * modifiers.cs (FieldAttr): Re-write.
14279
14280         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
14281         (TypeContainer::HaveStaticConstructor): New property to provide access
14282         to precisely that info.
14283
14284         * modifiers.cs (MethodAttr): Re-write.
14285         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
14286
14287         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
14288         of top-level types as claimed.
14289
14290 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14291
14292         * expression.cs (MemberLookup): Fruitless attempt to lookup
14293         constructors.  Maybe I need to emit default constructors?  That
14294         might be it (currently .NET emits this for me automatically).
14295         (Invocation::OverloadResolve): Cope with Arguments == null.
14296         (Invocation::EmitArguments): new function, shared by the new
14297         constructor and us.
14298         (Invocation::Emit): Handle static and instance methods.  Emit
14299         proper call instruction for virtual or non-virtual invocations.
14300         (New::Emit): Implement.
14301         (New::Resolve): Implement.
14302         (MemberAccess:Resolve): Implement.
14303         (MethodGroupExpr::InstanceExpression): used conforming to the spec
14304         to track instances.
14305         (FieldExpr::Resolve): Set type.
14306
14307         * support.cs: Handle empty arguments.
14308                 
14309         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
14310         SimpleLookup): Auxiliary routines to help parse a qualifier
14311         identifier.  
14312
14313         Update qualifier_identifier rule.
14314
14315         * codegen.cs: Removed debugging messages.
14316
14317         * class.cs: Make this a global thing, this acts just as a "key" to
14318         objects that we might have around.
14319
14320         (Populate): Only initialize method_builders_to_methods once.
14321
14322         * expression.cs (PropertyExpr): Initialize type from the
14323         PropertyType. 
14324
14325         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
14326         Resolve pattern.  Attempt to implicitly convert value to boolean.
14327         Emit code.
14328
14329         * expression.cs: Set the type for the int32/int32 argument case.
14330         (Binary::ResolveOperator): Set the return type to boolean for
14331         comparission operators
14332
14333         * typemanager.cs: Remove debugging print code.
14334
14335         (Invocation::Resolve): resolve type.
14336
14337         * class.cs: Allocate a MemberInfo of the correct size, as the code
14338         elsewhere depends on the test to reflect the correct contents.
14339
14340         (Method::) Keep track of parameters, due to System.Reflection holes
14341
14342         (TypeContainer::Populate): Keep track of MethodBuilders to Method
14343         mapping here.
14344
14345         (TypeContainer::FindMembers): Use ArrayList and then copy an array
14346         of the exact size and return that.
14347
14348         (Class::LookupMethodByBuilder): New function that maps
14349         MethodBuilders to its methods.  Required to locate the information
14350         on methods because System.Reflection bit us again.
14351
14352         * support.cs: New file, contains an interface ParameterData and
14353         two implementations: ReflectionParameters and InternalParameters
14354         used to access Parameter information.  We will need to grow this
14355         as required.
14356
14357         * expression.cs (Invocation::GetParameterData): implement a cache
14358         and a wrapper around the ParameterData creation for methods. 
14359         (Invocation::OverloadResolve): Use new code.
14360
14361 2001-09-13  Ravi Pratap  <ravi@ximian.com>
14362
14363         * class.cs (TypeContainer::EmitField): Remove and move into 
14364         (Field::Define): here and modify accordingly.
14365         (Field.FieldBuilder): New member.
14366         (TypeContainer::Populate): Update accordingly.
14367         (TypeContainer::FindMembers): Implement.
14368
14369 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14370
14371         * statement.cs: (VariableInfo::VariableType): New field to be
14372         initialized with the full type once it is resolved. 
14373
14374 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
14375
14376         * parameter.cs (GetParameterInfo): Use a type cache to compute
14377         things only once, and to reuse this information
14378
14379         * expression.cs (LocalVariableReference::Emit): Implement.
14380         (OpcodeCast::Emit): fix.
14381
14382         (ParameterReference::Resolve): Implement.
14383         (ParameterReference::Emit): Implement.
14384
14385         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
14386         that are expressions need to stay as Expressions.
14387
14388         * typemanager.cs (CSharpName): Returns the C# name of a type if
14389         possible. 
14390
14391         * expression.cs (Expression::ConvertImplicit): New function that
14392         implements implicit type conversions.
14393
14394         (Expression::ImplicitReferenceConversion): Implements implicit
14395         reference conversions.
14396
14397         (EmptyCast): New type for transparent casts.
14398
14399         (OpcodeCast): New type for casts of types that are performed with
14400         a sequence of bytecodes.
14401
14402         (BoxedCast): New type used for casting value types into reference
14403         types.  Emits a box opcode.
14404
14405         (Binary::DoNumericPromotions): Implements numeric promotions of
14406         and computation of the Binary::Type.
14407
14408         (Binary::EmitBranchable): Optimization.
14409
14410         (Binary::Emit): Implement code emission for expressions.
14411
14412         * typemanager.cs (TypeManager): Added two new core types: sbyte
14413         and byte.
14414
14415 2001-09-12  Ravi Pratap  <ravi@ximian.com>
14416
14417         * class.cs (TypeContainer::FindMembers): Method which does exactly
14418         what Type.FindMembers does, only we don't have to use reflection. No
14419         implementation yet.
14420
14421         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
14422         typecontainer objects as we need to get at them.
14423         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
14424
14425         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
14426         typecontainer object.
14427
14428         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
14429         of just a Report object.
14430
14431 2001-09-11  Ravi Pratap  <ravi@ximian.com>
14432
14433         * class.cs (Event::Define): Go back to using the prefixes "add_" and
14434         "remove_"
14435         (TypeContainer::Populate): Now define the delegates of the type too.
14436         (TypeContainer.Delegates): Property to access the list of delegates defined
14437         in the type.
14438
14439         * delegates.cs (Delegate::Define): Implement partially.
14440
14441         * modifiers.cs (TypeAttr): Handle more flags.
14442
14443 2001-09-11  Ravi Pratap  <ravi@ximian.com>
14444
14445         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
14446         and not <=
14447         (Operator::Define): Re-write logic to get types by using the LookupType method
14448         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
14449         (Indexer::Define): Ditto.
14450         (Event::Define): Ditto.
14451         (Property::Define): Ditto.
14452
14453 2001-09-10  Ravi Pratap  <ravi@ximian.com>
14454
14455         * class.cs (TypeContainer::Populate): Now define operators too. 
14456         (TypeContainer.Operators): New property to access the list of operators
14457         in a type.
14458         (Operator.OperatorMethodBuilder): New member to hold the method builder
14459         for the operator we are defining.
14460         (Operator::Define): Implement.
14461
14462 2001-09-10  Ravi Pratap  <ravi@ximian.com>
14463
14464         * class.cs (Event::Define): Make the prefixes of the accessor methods
14465         addOn_ and removeOn_ 
14466
14467         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
14468         of the location being passed in too. Ideally, this should go later since all
14469         error reporting should be done through the Report object.
14470
14471         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
14472         (Populate): Iterate thru the indexers we have and define them too.
14473         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
14474         for the get and set accessors.
14475         (Indexer::Define): Implement.
14476
14477 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
14478
14479         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
14480         my previous implementation, did not work.
14481
14482         * typemanager.cs: Add a couple of missing types (the longs).
14483
14484         * literal.cs: Use TypeManager.bool_type instead of getting it.
14485
14486         * expression.cs (EventExpr): New kind of expressions.
14487         (Expressio::ExprClassFromMemberInfo): finish
14488
14489 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
14490
14491         * assign.cs: Emit stores to static fields differently.
14492
14493 2001-09-08  Ravi Pratap  <ravi@ximian.com>
14494
14495         * Merge in changes and adjust code to tackle conflicts. Backed out my
14496         code in Assign::Resolve ;-) 
14497
14498 2001-09-08  Ravi Pratap  <ravi@ximian.com>
14499
14500         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
14501         instead Report.Error and also pass in the location.
14502         (CSharpParser::Lexer): New readonly property to return the reference
14503         to the Tokenizer object.
14504         (declare_local_variables): Use Report.Error with location instead of plain 
14505         old error.
14506         (CheckDef): Ditto.
14507
14508         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
14509         (Operator.CheckBinaryOperator): Ditto.
14510
14511         * cs-parser.jay (operator_declarator): Update accordingly.
14512
14513         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
14514         (CheckBinaryOperator): Same here.
14515
14516         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
14517         on the name without any prefixes of namespace names etc. This is because we
14518         already might have something already fully qualified like 
14519         'System.Console.WriteLine'
14520
14521         * assign.cs (Resolve): Begin implementation. Stuck ;-)
14522
14523 2001-09-07  Ravi Pratap  <ravi@ximian.com>
14524
14525         * cs-tokenizer.cs (location): Return a string which also contains
14526         the file name.
14527
14528         * expression.cs (ElementAccess): New class for expressions of the
14529         type 'element access.'
14530         (BaseAccess): New class for expressions of the type 'base access.'
14531         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
14532         respectively.
14533
14534         * cs-parser.jay (element_access): Implement action.
14535         (base_access): Implement actions.
14536         (checked_expression, unchecked_expression): Implement.
14537
14538         * cs-parser.jay (local_variable_type): Correct and implement.
14539         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
14540
14541         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
14542
14543         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
14544         name and the specifiers.
14545
14546         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
14547
14548         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
14549         making them all public ;-)
14550
14551         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
14552         class anyways.
14553
14554 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
14555
14556         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
14557         PropertyExprs.
14558         (FieldExpr, PropertyExprs): New resolved expressions.
14559         (SimpleName::MemberStaticCheck): Perform static checks for access
14560         to non-static fields on static methods. Maybe this should be
14561         generalized for MemberAccesses. 
14562         (SimpleName::ResolveSimpleName): More work on simple name
14563         resolution. 
14564
14565         * cs-parser.jay (primary_expression/qualified_identifier): track
14566         the parameter index.
14567
14568         * codegen.cs (CodeGen::Save): Catch save exception, report error.
14569         (EmitContext::EmitBoolExpression): Chain to expression generation
14570         instead of temporary hack.
14571         (::EmitStatementExpression): Put generic expression code generation.
14572
14573         * assign.cs (Assign::Emit): Implement variable assignments to
14574         local variables, parameters and fields.
14575
14576 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
14577
14578         * statement.cs (Block::GetVariableInfo): New method, returns the
14579         VariableInfo for a variable name in a block.
14580         (Block::GetVariableType): Implement in terms of GetVariableInfo
14581
14582         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
14583         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
14584
14585 2001-09-06  Ravi Pratap  <ravi@ximian.com>
14586
14587         * cs-parser.jay (operator_declaration): Continue on my quest : update
14588         to take attributes argument.
14589         (event_declaration): Ditto.
14590         (enum_declaration): Ditto.
14591         (indexer_declaration): Ditto.
14592
14593         * class.cs (Operator::Operator): Update constructor accordingly.
14594         (Event::Event): Ditto.
14595
14596         * delegate.cs (Delegate::Delegate): Same here.
14597
14598         * enum.cs (Enum::Enum): Same here.
14599
14600 2001-09-05  Ravi Pratap  <ravi@ximian.com>
14601
14602         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
14603
14604         * ../tests/cs0658.cs : New file to demonstrate error 0658.
14605
14606         * attribute.cs (Attributes): New class to encapsulate all attributes which were
14607         being passed around as an arraylist.
14608         (Attributes::AddAttribute): Method to add attribute sections.
14609
14610         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
14611         (struct_declaration): Update accordingly.
14612         (constant_declaration): Update.
14613         (field_declaration): Update.
14614         (method_header): Update.
14615         (fixed_parameter): Update.
14616         (parameter_array): Ditto.
14617         (property_declaration): Ditto.
14618         (destructor_declaration): Ditto.
14619
14620         * class.cs (Struct::Struct): Update constructors accordingly.
14621         (Class::Class): Ditto.
14622         (Field::Field): Ditto.
14623         (Method::Method): Ditto.
14624         (Property::Property): Ditto.
14625         (TypeContainer::OptAttribute): update property's return type.
14626
14627         * interface.cs (Interface.opt_attributes): New member.
14628         (Interface::Interface): Update to take the extra Attributes argument.
14629
14630         * parameter.cs (Parameter::Parameter): Ditto.
14631
14632         * constant.cs (Constant::Constant): Ditto.
14633
14634         * interface.cs (InterfaceMemberBase): New OptAttributes field.
14635         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
14636         the attributes as a parameter.
14637         (InterfaceProperty): Update constructor call.
14638         (InterfaceEvent): Ditto.
14639         (InterfaceMethod): Ditto.
14640         (InterfaceIndexer): Ditto.
14641
14642         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
14643         pass the attributes too.
14644         (interface_event_declaration): Ditto.
14645         (interface_property_declaration): Ditto.
14646         (interface_method_declaration): Ditto.
14647         (interface_declaration): Ditto.
14648
14649 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
14650
14651         * class.cs (Method::Define): Track the "static Main" definition to
14652         create an entry point. 
14653
14654         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
14655         EntryPoint if we find it. 
14656
14657         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
14658         (EmitContext::ig): Make this variable public.
14659
14660         * driver.cs: Make the default output file be the first file name
14661         with the .exe extension.  
14662
14663         Detect empty compilations
14664
14665         Handle various kinds of output targets.  Handle --target and
14666         rename -t to --dumper.
14667
14668         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
14669         methods inherited from Expression return now an Expression.  This
14670         will is used during the tree rewriting as we resolve them during
14671         semantic analysis.
14672
14673         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
14674         the spec.  Missing entirely is the information about
14675         accessability of elements of it.
14676
14677         (Expression::ExprClassFromMemberInfo): New constructor for
14678         Expressions that creates a fully initialized Expression based on
14679         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
14680         a Type.
14681
14682         (Invocation::Resolve): Begin implementing resolution of invocations.
14683
14684         * literal.cs (StringLiteral):  Implement Emit.
14685
14686 2001-09-05  Ravi Pratap  <ravi@ximian.com>
14687
14688         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
14689         member.
14690
14691 2001-09-04  Ravi Pratap  <ravi@ximian.com>
14692
14693         * cs-parser.jay (attribute_arguments): Implement actions.
14694         (attribute): Fix bug in production. Implement action.
14695         (attribute_list): Implement.
14696         (attribute_target): Implement.
14697         (attribute_target_specifier, opt_target_specifier): Implement
14698         (CheckAttributeTarget): New method to check if the attribute target
14699         is valid.
14700         (attribute_section): Implement.
14701         (opt_attributes): Implement.
14702
14703         * attribute.cs : New file to handle attributes.
14704         (Attribute): Class to hold attribute info.
14705
14706         * cs-parser.jay (opt_attribute_target_specifier): Remove production
14707         (attribute_section): Modify production to use 2 different rules to 
14708         achieve the same thing. 1 s/r conflict down !
14709         Clean out commented, useless, non-reducing dimension_separator rules.
14710
14711         * class.cs (TypeContainer.attributes): New member to hold list
14712         of attributes for a type.
14713         (Struct::Struct): Modify to take one more argument, the attribute list.
14714         (Class::Class): Ditto.
14715         (Field::Field): Ditto.
14716         (Method::Method): Ditto.
14717         (Property::Property): Ditto.
14718
14719         * cs-parser.jay (struct_declaration): Update constructor call to
14720         pass in the attributes too.
14721         (class_declaration): Ditto.
14722         (constant_declaration): Ditto.
14723         (field_declaration): Ditto.
14724         (method_header): Ditto.
14725         (fixed_parameter): Ditto.
14726         (parameter_array): Ditto.
14727         (property_declaration): Ditto.
14728
14729         * constant.cs (Constant::Constant): Update constructor similarly.
14730         Use System.Collections.
14731
14732         * parameter.cs (Parameter::Parameter): Update as above.
14733
14734 2001-09-02  Ravi Pratap  <ravi@ximian.com>
14735
14736         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
14737         (TypeContainer.delegates): New member to hold list of delegates.
14738
14739         * cs-parser.jay (delegate_declaration): Implement the action correctly 
14740         this time as I seem to be on crack ;-)
14741
14742 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
14743
14744         * rootcontext.cs (RootContext::IsNamespace): new function, used to
14745         tell whether an identifier represents a namespace.
14746
14747         * expression.cs (NamespaceExpr): A namespace expression, used only
14748         temporarly during expression resolution.
14749         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
14750         utility functions to resolve names on expressions.
14751
14752 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
14753
14754         * codegen.cs: Add hook for StatementExpressions. 
14755
14756         * class.cs: Fix inverted test for static flag in methods.
14757
14758 2001-09-02  Ravi Pratap  <ravi@ximian.com>
14759
14760         * class.cs (Operator::CheckUnaryOperator): Correct error number used
14761         to make it coincide with MS' number.
14762         (Operator::CheckBinaryOperator): Ditto.
14763
14764         * ../errors/errors.txt : Remove error numbers added earlier.
14765
14766         * ../errors/cs1019.cs : Test case for error # 1019
14767
14768         * ../errros/cs1020.cs : Test case for error # 1020
14769
14770         * cs-parser.jay : Clean out commented cruft.
14771         (dimension_separators, dimension_separator): Comment out. Ostensibly not
14772         used anywhere - non-reducing rule.
14773         (namespace_declarations): Non-reducing rule - comment out.
14774
14775         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
14776         with TypeContainer::AddEnum.
14777
14778         * delegate.cs : New file for delegate handling classes.
14779         (Delegate): Class for declaring delegates.
14780
14781         * makefile : Update.
14782
14783         * cs-parser.jay (delegate_declaration): Implement.
14784
14785 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
14786
14787         * class.cs (Event::Define): Implement.
14788         (Event.EventBuilder): New member.
14789
14790         * class.cs (TypeContainer::Populate): Update to define all enums and events
14791         we have.
14792         (Events): New property for the events arraylist we hold. Shouldn't we move to using
14793         readonly fields for all these cases ?
14794
14795 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
14796
14797         * class.cs (Property): Revamp to use the convention of making fields readonly.
14798         Accordingly modify code elsewhere.
14799
14800         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
14801         the Define method of the Property class.
14802
14803         * class.cs : Clean up applied patch and update references to variables etc. Fix 
14804         trivial bug.
14805         (TypeContainer::Populate): Update to define all the properties we have. Also
14806         define all enumerations.
14807
14808         * enum.cs (Define): Implement.
14809
14810 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
14811
14812         * cs-parser.jay (overloadable_operator): The semantic value is an
14813         enum of the Operator class.
14814         (operator_declarator): Implement actions.
14815         (operator_declaration): Implement.
14816
14817         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
14818         validity of definitions.
14819         (Operator::CheckBinaryOperator): Static method to check for binary operators
14820         (TypeContainer::AddOperator): New method to add an operator to a type.
14821
14822         * cs-parser.jay (indexer_declaration): Added line to actually call the
14823         AddIndexer method so it gets added ;-)
14824
14825         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
14826         already taken care of by the MS compiler ?  
14827
14828 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
14829
14830         * class.cs (Operator): New class for operator declarations.
14831         (Operator::OpType): Enum for the various operators.
14832
14833 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
14834
14835         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
14836         ostensibly handle this in semantic analysis.
14837
14838         * cs-parser.jay (general_catch_clause): Comment out
14839         (specific_catch_clauses, specific_catch_clause): Ditto.
14840         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
14841         (catch_args, opt_catch_args): New productions.
14842         (catch_clause): Rewrite to use the new productions above
14843         (catch_clauses): Modify accordingly.
14844         (opt_catch_clauses): New production to use in try_statement
14845         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
14846         and re-write the code in the actions to extract the specific and
14847         general catch clauses by being a little smart ;-)
14848
14849         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
14850         Hooray, try and catch statements parse fine !
14851
14852 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
14853
14854         * statement.cs (Block::GetVariableType): Fix logic to extract the type
14855         string from the hashtable of variables.
14856
14857         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
14858         I end up making that mistake ;-)
14859         (catch_clauses): Fixed gross error which made Key and Value of the 
14860         DictionaryEntry the same : $1 !!
14861
14862 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
14863
14864         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
14865
14866         * cs-parser.jay (event_declaration): Correct to remove the semicolon
14867         when the add and remove accessors are specified. 
14868
14869 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
14870
14871         * cs-parser.jay (IndexerDeclaration): New helper class to hold
14872         information about indexer_declarator.
14873         (indexer_declarator): Implement actions.
14874         (parsing_indexer): New local boolean used to keep track of whether
14875         we are parsing indexers or properties. This is necessary because 
14876         implicit_parameters come into picture even for the get accessor in the 
14877         case of an indexer.
14878         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
14879
14880         * class.cs (Indexer): New class for indexer declarations.
14881         (TypeContainer::AddIndexer): New method to add an indexer to a type.
14882         (TypeContainer::indexers): New member to hold list of indexers for the
14883         type.
14884
14885 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
14886
14887         * cs-parser.jay (add_accessor_declaration): Implement action.
14888         (remove_accessor_declaration): Implement action.
14889         (event_accessors_declaration): Implement
14890         (variable_declarators): swap statements for first rule - trivial.
14891
14892         * class.cs (Event): New class to hold information about event
14893         declarations.
14894         (TypeContainer::AddEvent): New method to add an event to a type
14895         (TypeContainer::events): New member to hold list of events.
14896
14897         * cs-parser.jay (event_declaration): Implement actions.
14898
14899 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
14900
14901         * cs-parser.jay (dim_separators): Implement. Make it a string
14902         concatenating all the commas together, just as they appear.
14903         (opt_dim_separators): Modify accordingly
14904         (rank_specifiers): Update accordingly. Basically do the same
14905         thing - instead, collect the brackets here.
14906         (opt_rank_sepcifiers): Modify accordingly.
14907         (array_type): Modify to actually return the complete type string
14908         instead of ignoring the rank_specifiers.
14909         (expression_list): Implement to collect the expressions
14910         (variable_initializer): Implement. We make it a list of expressions
14911         essentially so that we can handle the array_initializer case neatly too.
14912         (variable_initializer_list): Implement.
14913         (array_initializer): Make it a list of variable_initializers
14914         (opt_array_initializer): Modify accordingly.
14915
14916         * expression.cs (New::NType): Add enumeration to help us
14917         keep track of whether we have an object/delegate creation
14918         or an array creation.
14919         (New:NewType, New::Rank, New::Indices, New::Initializers): New
14920         members to hold data about array creation.
14921         (New:New): Modify to update NewType
14922         (New:New): New Overloaded contructor for the array creation
14923         case.
14924
14925         * cs-parser.jay (array_creation_expression): Implement to call
14926         the overloaded New constructor.
14927
14928 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
14929
14930         * class.cs (TypeContainer::Constructors): Return member
14931         constructors instead of returning null.
14932
14933 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
14934
14935         * typemanager.cs (InitCoreTypes): Initialize the various core
14936         types after we have populated the type manager with the user
14937         defined types (this distinction will be important later while
14938         compiling corlib.dll)
14939
14940         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
14941         on Expression Classification.  Now all expressions have a method
14942         `Resolve' and a method `Emit'.
14943
14944         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
14945         generation from working.     Also add some temporary debugging
14946         code. 
14947
14948 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
14949
14950         * codegen.cs: Lots of code generation pieces.  This is only the
14951         beginning, will continue tomorrow with more touches of polish.  We
14952         handle the fundamentals of if, while, do, for, return.  Others are
14953         trickier and I need to start working on invocations soon.
14954
14955         * gen-treedump.cs: Bug fix, use s.Increment here instead of
14956         s.InitStatement. 
14957
14958         * codegen.cs (EmitContext): New struct, used during code
14959         emission to keep a context.   Most of the code generation will be
14960         here. 
14961
14962         * cs-parser.jay: Add embedded blocks to the list of statements of
14963         this block.  So code generation proceeds in a top down fashion.
14964
14965 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
14966
14967         * statement.cs: Add support for multiple child blocks.
14968
14969 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
14970
14971         * codegen.cs (EmitCode): New function, will emit the code for a
14972         Block of code given a TypeContainer and its ILGenerator. 
14973
14974         * statement.cs (Block): Standard public readonly optimization.
14975         (Block::Block constructors): Link children. 
14976         (Block::Child): Child Linker.
14977         (Block::EmitVariables): Emits IL variable declarations.
14978
14979         * class.cs: Drop support for MethodGroups here, delay until
14980         Semantic Analysis.
14981         (Method::): Applied the same simplification that I did before, and
14982         move from Properties to public readonly fields.
14983         (Method::ParameterTypes): Returns the parameter types for the
14984         function, and implements a cache that will be useful later when I
14985         do error checking and the semantic analysis on the methods is
14986         performed.
14987         (Constructor::GetCallingConvention): Renamed from CallingConvetion
14988         and made a method, optional argument tells whether this is a class
14989         or a structure to apply the `has-this' bit.
14990         (Method::GetCallingConvention): Implement, returns the calling
14991         convention. 
14992         (Method::Define): Defines the type, a second pass is performed
14993         later to populate the methods.
14994
14995         (Constructor::ParameterTypes): implement a cache similar to the
14996         one on Method::ParameterTypes, useful later when we do semantic
14997         analysis. 
14998
14999         (TypeContainer::EmitMethod):  New method.  Emits methods.
15000
15001         * expression.cs: Removed MethodGroup class from here.
15002
15003         * parameter.cs (Parameters::GetCallingConvention): new method.
15004
15005 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
15006
15007         * class.cs (TypeContainer::Populate): Drop RootContext from the
15008         argument. 
15009
15010         (Constructor::CallingConvention): Returns the calling convention.
15011         (Constructor::ParameterTypes): Returns the constructor parameter
15012         types. 
15013
15014         (TypeContainer::AddConstructor): Keep track of default constructor
15015         and the default static constructor.
15016
15017         (Constructor::) Another class that starts using `public readonly'
15018         instead of properties. 
15019
15020         (Constructor::IsDefault): Whether this is a default constructor. 
15021
15022         (Field::) use readonly public fields instead of properties also.
15023
15024         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
15025         track of static constructors;  If none is used, turn on
15026         BeforeFieldInit in the TypeAttributes. 
15027
15028         * cs-parser.jay (opt_argument_list): now the return can be null
15029         for the cases where there are no arguments. 
15030
15031         (constructor_declarator): If there is no implicit `base' or
15032         `this', then invoke the default parent constructor. 
15033
15034         * modifiers.cs (MethodAttr): New static function maps a set of
15035         modifiers flags into a MethodAttributes enum
15036         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
15037         MethodAttr, TypeAttr to represent the various mappings where the
15038         modifiers are used.
15039         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
15040
15041 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
15042
15043         * parameter.cs (GetParameterInfo): Fix bug where there would be no
15044         method arguments.
15045
15046         * interface.cs (PopulateIndexer): Implemented the code generator
15047         for interface indexers.
15048
15049 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
15050
15051         * interface.cs (InterfaceMemberBase): Now we track the new status
15052         here.  
15053
15054         (PopulateProperty): Implement property population.  Woohoo!  Got
15055         Methods and Properties going today. 
15056
15057         Removed all the properties for interfaces, and replaced them with
15058         `public readonly' fields. 
15059
15060 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
15061
15062         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
15063         initialize their hashtables/arraylists only when they are needed
15064         instead of doing this always.
15065
15066         * parameter.cs: Handle refs and out parameters.
15067
15068         * cs-parser.jay: Use an ArrayList to construct the arguments
15069         instead of the ParameterCollection, and then cast that to a
15070         Parameter[] array.
15071
15072         * parameter.cs: Drop the use of ParameterCollection and use
15073         instead arrays of Parameters.
15074
15075         (GetParameterInfo): Use the Type, not the Name when resolving
15076         types. 
15077
15078 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
15079
15080         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
15081         and instead use public readonly fields.
15082
15083         * class.cs: Put back walking code for type containers.
15084
15085 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
15086
15087         * class.cs (MakeConstant): Code to define constants.
15088
15089         * rootcontext.cs (LookupType): New function.  Used to locate types 
15090
15091
15092 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
15093
15094         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
15095         this System.Reflection code is.  Kudos to Microsoft
15096
15097         * typemanager.cs: Implement a type cache and avoid loading all
15098         types at boot time.  Wrap in LookupType the internals.  This made
15099         the compiler so much faster.  Wow.  I rule!
15100
15101         * driver.cs: Make sure we always load mscorlib first (for
15102         debugging purposes, nothing really important).
15103
15104         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
15105         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
15106
15107         * rootcontext.cs: Lookup types on their namespace;  Lookup types
15108         on namespaces that have been imported using the `using' keyword.
15109
15110         * class.cs (TypeContainer::TypeAttr): Virtualize.
15111         (Class::TypeAttr): Return attributes suitable for this bad boy.
15112         (Struct::TypeAttr): ditto.
15113         Handle nested classes.
15114         (TypeContainer::) Remove all the type visiting code, it is now
15115         replaced with the rootcontext.cs code
15116
15117         * rootcontext.cs (GetClassBases): Added support for structs. 
15118
15119 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
15120
15121         * interface.cs, statement.cs, class.cs, parameter.cs,
15122         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
15123         Drop use of TypeRefs, and use strings instead.
15124
15125 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
15126
15127         * rootcontext.cs: 
15128
15129         * class.cs (Struct::Struct): set the SEALED flags after
15130         checking the modifiers.
15131         (TypeContainer::TypeAttr): new property, returns the
15132         TypeAttributes for a class.  
15133
15134         * cs-parser.jay (type_list): Oops, list production was creating a
15135         new list of base types.
15136
15137         * rootcontext.cs (StdLib): New property.
15138         (GetInterfaceTypeByName): returns an interface by type name, and
15139         encapsulates error handling here.
15140         (GetInterfaces): simplified.
15141         (ResolveTree): Encapsulated all the tree resolution here.
15142         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
15143         types. 
15144
15145         * driver.cs: Add support for --nostdlib, to avoid loading the
15146         default assemblies.
15147         (Main): Do not put tree resolution here. 
15148
15149         * rootcontext.cs: Beginning of the class resolution.
15150
15151 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
15152
15153         * rootcontext.cs: Provide better error reporting. 
15154
15155         * cs-parser.jay (interface_base): set our $$ to be interfaces.
15156
15157         * rootcontext.cs (CreateInterface): Handle the case where there
15158         are no parent interfaces.
15159
15160         (CloseTypes): Routine to flush types at the end.
15161         (CreateInterface): Track types.
15162         (GetInterfaces): Returns an array of Types from the list of
15163         defined interfaces.
15164
15165         * typemanager.c (AddUserType): Mechanism to track user types (puts
15166         the type on the global type hash, and allows us to close it at the
15167         end). 
15168
15169 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
15170
15171         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
15172         RecordInterface instead.
15173
15174         * cs-parser.jay: Updated to reflect changes above.
15175
15176         * decl.cs (Definition): Keep track of the TypeBuilder type that
15177         represents this type here.  Not sure we will use it in the long
15178         run, but wont hurt for now.
15179
15180         * driver.cs: Smaller changes to accomodate the new code.
15181
15182         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
15183         when done. 
15184
15185         * rootcontext.cs (CreateInterface):  New method, used to create
15186         the System.TypeBuilder type for interfaces.
15187         (ResolveInterfaces): new entry point to resolve the interface
15188         hierarchy. 
15189         (CodeGen): Property, used to keep track of the code generator.
15190
15191 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
15192
15193         * cs-parser.jay: Add a second production for delegate_declaration
15194         with `VOID'.
15195
15196         (enum_body): Put an opt_comma here instead of putting it on
15197         enum_body or enum_member_declarations so we can handle trailing
15198         commas on enumeration members.  Gets rid of a shift/reduce.
15199
15200         (type_list): Need a COMMA in the middle.
15201
15202         (indexer_declaration): Tell tokenizer to recognize get/set
15203
15204         * Remove old targets.
15205
15206         * Re-add the parser target.
15207
15208 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15209
15210         * cs-parser.jay: Add precendence rules for a number of operators
15211         ot reduce the number of shift/reduce conflicts in the grammar.
15212
15213 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
15214
15215         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
15216         and put it here.
15217
15218         Get rid of old crufty code.
15219
15220         * rootcontext.cs: Use this to keep track of the parsed
15221         representation and the defined types available to the program. 
15222
15223         * gen-treedump.cs: adjust for new convention.
15224
15225         * type.cs: Split out the type manager, and the assembly builder
15226         from here. 
15227
15228         * typemanager.cs: the type manager will live here now.
15229
15230         * cil-codegen.cs: And the code generator here. 
15231
15232 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
15233
15234         * makefile: Fixed up for easy making.
15235
15236 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15237
15238         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
15239         the 
15240
15241         (unary_expression): Expand pre_increment_expression and
15242         post_decrement_expression to reduce a shift/reduce.
15243
15244 2001-07-11  Simon Cozens
15245
15246         * cs-tokenizer.cs: Hex numbers should begin with a 0.
15247
15248         Improve allow_keyword_as_indent name.
15249
15250 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
15251
15252         * Adjustments for Beta2. 
15253
15254 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
15255
15256         * decl.cs: Added `Define' abstract method.
15257         (InTransit): new property, used to catch recursive definitions. 
15258
15259         * interface.cs: Implement `Define'. 
15260
15261         * modifiers.cs: Map Modifiers.constants to
15262         System.Reflection.TypeAttribute flags.
15263
15264         * class.cs: Keep track of types and user-defined types.
15265         (BuilderInit): New method for creating an assembly
15266         (ResolveType): New function to launch the resolution process, only
15267         used by interfaces for now.
15268
15269         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
15270         that are inserted into the name space. 
15271
15272 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
15273
15274         * ARGH.  I have screwed up my tree so many times due to the use of
15275         rsync rather than using CVS.  Going to fix this at once. 
15276
15277         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
15278         load types.
15279
15280 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
15281
15282         * Experiment successful: Use System.Type rather that our own
15283         version of Type.  
15284
15285 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
15286
15287         * cs-parser.jay: Removed nsAliases from here.
15288
15289         Use new namespaces, handle `using XXX;' 
15290
15291         * namespace.cs: Reimplemented namespace handling, use a recursive
15292         definition of the class.  Now we can keep track of using clauses
15293         and catch invalid using clauses.
15294
15295 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
15296
15297         * gen-treedump.cs: Adapted for all the renaming.
15298
15299         * expression.cs (Expression): this class now has a Type property
15300         which returns an expression Type.
15301
15302         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
15303         `Type', as this has a different meaning now in the base
15304
15305 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
15306
15307         * interface.cs, class.cs: Removed from all the sources the
15308         references to signature computation, as we can not do method
15309         signature computation during the parsing time, as we are not
15310         trying to solve at that point distinguishing:
15311
15312         class X {
15313                 void a (Blah x) {}
15314                 void a (NS.Blah x) {}
15315         }
15316
15317         Which depending on the context might be valid or not, as we do not
15318         know if Blah is the same thing as NS.Blah at that point.
15319
15320         * Redid everything so the code uses TypeRefs now instead of
15321         Types.  TypeRefs are just temporary type placeholders, that need
15322         to be resolved.  They initially have a pointer to a string and the
15323         current scope in which they are used.  This is used later by the
15324         compiler to resolve the reference to an actual Type. 
15325
15326         * DeclSpace is no longer a CIR.Type, and neither are
15327         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
15328         are all DeclSpaces, but no Types. 
15329
15330         * type.cs (TypeRefManager): This implements the TypeRef manager,
15331         which keeps track of all the types that need to be resolved after
15332         the parsing has finished. 
15333
15334 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
15335
15336         * ARGH.  We are going to have to store `foreach' as a class rather
15337         than resolving it, as we need to verify error 1579 after name
15338         resolution.   *OR* we could keep a flag that says `This request to
15339         IEnumerator comes from a foreach statement' which we can then use
15340         to generate the error.
15341
15342 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
15343
15344         * class.cs (TypeContainer.AddMethod): we now add methods to the
15345         MethodGroup instead of the method hashtable.  
15346
15347         * expression.cs: Add MethodGroup abstraction, which gets us one
15348         step closer to the specification in the way we handle method
15349         declarations.  
15350
15351         * cs-parser.jay (primary_expression): qualified_identifier now
15352         tried to match up an identifier to a local variable reference or
15353         to a parameter reference.
15354
15355         current_local_parameters is now a parser global variable that
15356         points to the current parameters for the block, used during name
15357         lookup.
15358
15359         (property_declaration): Now creates an implicit `value' argument to
15360         the set accessor.
15361
15362 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
15363
15364         * parameter.cs: Do not use `param' arguments as part of the
15365         signature, per the spec.
15366
15367 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
15368
15369         * decl.cs: Base class for classes, structs and interfaces.  This
15370         is the "Declaration Space" 
15371
15372         * cs-parser.jay: Use CheckDef for checking declaration errors
15373         instead of having one on each function.
15374
15375         * class.cs: Factor out some code for handling error handling in
15376         accordance to the "Declarations" section in the "Basic Concepts"
15377         chapter in the ECMA C# spec.
15378
15379         * interface.cs: Make all interface member classes derive from
15380         InterfaceMemberBase.
15381
15382 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
15383
15384         * Many things: all interfaces are parsed and generated in
15385         gen-treedump.  Support for member variables, constructors,
15386         destructors, properties, constants is there.
15387
15388         Beginning of the IL backend, but very little done, just there for
15389         testing purposes. 
15390
15391 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
15392
15393         * cs-parser.jay: Fix labeled statement.
15394
15395         * cs-tokenizer.cs (escape): Escape " and ' always.
15396         ref_line, ref_name: keep track of the line/filename as instructed
15397         by #line by the compiler.
15398         Parse #line.
15399
15400 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
15401
15402         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
15403         to match the values in System.CodeDOM.
15404
15405         Divid renamed to Divide.
15406
15407         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
15408         statements. 
15409         (Statements.set): remove.
15410
15411         * System.CodeDOM/CodeCatchClause.cs: always have a valid
15412         statements. 
15413
15414         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
15415         falseStatements always have valid values. 
15416
15417         * cs-parser.jay: Use System.CodeDOM now.
15418