**** Merged r36411 from MCS ****
[mono.git] / mcs / gmcs / ChangeLog
1 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
2
3         Fix bug #69177 (Implemented decimal constant support)
4
5         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
6         (BinaryFold): Add DecimalConstant.
7
8         * const.cs (Define): Decimal constant 
9         (is not constant.
10         (ChangeType): Add decimal type handling.
11         (LookupConstantValue): Don't set value for decimal type but
12         emit DecimalConstantAttribute. Needed for constant optimization.
13
14         * constant.cs (ToDecimal): New method.
15         (ConvertToDecimal): New method.
16         (IntConstant): Implemented ConvertToDecimal.
17         (DecimalConstant.Emit): Emit optimized version for decimals in
18         int range.
19
20         * expression.cs (ResolveOperator): Changed order of constant
21         reduction to work correctly with native types which have
22         overloaded operators.
23         (ResolveMemberAccess): Extract constant value from attribute
24         for decimal type.
25
26         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
27
28         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
29         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
30         (ChangeType): Decimal is special.
31         (TypeToCoreType): Add decimal type.
32
33 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
34
35         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
36         decimal types.
37
38 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
39
40         * class.cs (EventField.ApplyAttributeBuilder): Fix error
41         test cs1667-5.cs.
42
43 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
44
45         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
46
47         * pending.cs (PendingImplementation): Grab only interfaces.
48
49 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
50
51         * statement.cs (ForeachHelperMethods): Add location member and
52         error 202 detection.
53
54 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
55
56         * expression.cs (DoResolveBase): Fixed wrong warning for out
57         variables.
58
59 2004-12-04  Martin Baulig  <martin@ximian.com>
60
61         * convert.cs (Convert.TypeParameter_to_Null): Use the constraints
62         to check whether the conversion is ok.
63
64         * typemanager.cs (TypeManager.GetTypeArguments): Just return
65         `Type.EmptyTypes' if we're not a generic TypeContainer.
66
67 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
68
69         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
70         old bug: when converting from the null literal to a pointer,
71         return an EmptyCast, not the NullLiteral.
72
73         This fixes #69921, the recent null_type changes probably made this
74         bug more prominent.
75
76 2004-12-03  Martin Baulig  <martin@ximian.com>
77
78         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
79         method as our child, call AnonymousMethod.Compatible() on it.
80
81 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
82
83         * class.cs (FieldBase): Use an unused bit field from the field to
84         encode the `has_offset' property from the FieldMember.  This saves
85         a couple of Ks on bootstrap compilation.
86
87         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
88         method as our child, return the AnonymousMethod resolved
89         expression.
90
91         * expression.cs (New.DoResolve): Allow return values from
92         NewDelegate to also include AnonymousMethods.
93
94         Fixes #70150.
95
96 2004-11-29  Raja R Harinath  <rharinath@novell.com>
97
98         * decl.cs (MemberCore.MemberName): Remove readonly to fix an error
99         cs1648 report.
100         * rootcontext.cs (ResolveCore::interfaces_first_stage): Add
101         System.Runtime.InteropServices._Exception, since it's a base
102         interface of the core type System.Exception in the net_2_0 profile.
103
104 2004-11-27  Martin Baulig  <martin@ximian.com>
105
106         * ecore.cs (Expression.StoreFromPtr): Use `stobj' for generic parameters.
107
108 2004-11-26  Raja R Harinath  <rharinath@novell.com>
109
110         * Makefile: Convert to use executable.make.
111         * gmcs.exe.sources: New.
112
113 2004-11-25  Martin Baulig  <martin@ximian.com>
114
115         * expression.cs (Invocation.InferType): Added support for byref types.
116
117 2004-11-25  Martin Baulig  <martin@ximian.com>
118
119         * statement.cs (Foreach.FetchMethodMoveNext): Wrap `mi.ReturnType'
120         in TypeManager.TypeToCoreType().
121
122 2004-11-25  Martin Baulig  <martin@ximian.com>
123
124         * iterators.cs (Iterator.DoDefineMembers): Override and lookup the
125         "Dispose" method from the `current_type'.
126         (Iterator.EmitMoveNext): Use the `dispose_method' we looked up in
127         DoDefineMembers() instead of using the MethodBuilder; this is
128         required for generic iterators.
129
130         * class.cs (TypeContainer.DoDefineMembers): Make this virtual.
131
132 2004-11-24  Martin Baulig  <martin@ximian.com>
133
134         * ecore.cs (Expression.LoadFromPtr): Use `ldobj' for generic parameters.
135
136 2004-11-20  Martin Baulig  <martin@ximian.com>
137
138         * expression.cs (Invocation.InferType): Correctly infer generic
139         instances; see gen-103.cs.
140         (Invocation.InferTypeArguments): If a generic method doesn't have
141         any unbound type parameters, we don't need to infer anything.
142
143 2004-11-19  Raja R Harinath  <rharinath@novell.com>
144
145         * Makefile (gmcs.exe): Update to new location of bootstrap mcs.exe.
146
147 2004-11-17  Raja R Harinath  <rharinath@novell.com>
148
149         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
150         (TypeHandle.GetMemberCache): New.
151         (TypeHandle.TypeHandle): Update.
152         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
153         (TypeManager.LookupParentInterfacesCache):
154         Rename from LookupInterfaceCache.  Optimize slightly.
155         (TypeManager.MemberLookup_FindMembers): Update.
156         * decl.cs (MemberCache.MemberCache): Set Container to null in the
157         multi-type variant.
158         (AddCacheContents): Rename from AddHashtable.
159         * class.cs (TypeContainer.parent_container): Remove.
160         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
161         (TypeContainer.DoDefineMembers): Don't initialize it.
162         Update to name changes.
163         
164 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
165
166         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
167         that factors the code to check access modifiers on override.  
168
169         (PropertyBase): Use the code here.
170
171         Patch from Lluis S'anchez, fixes bug #69361.
172
173 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
174
175         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
176         routine that is used to report the use of a captured variable
177         whose address has been taken.
178
179         There are two checks: one when variables are being captured and
180         the other check is when the address of a variable is taken. 
181         
182         (because an anonymous methods might be resolved before *or* after
183         the address has been taken) and 
184
185         * expression.cs (Conditional.DoResolve): Remove the special
186         casing that Martin added to trueExpr and falseExpr being both
187         NullLiteral.  We get the right behavior now just by introducing
188         the null_type into the compiler. 
189
190         * convert.cs (ExplicitConversion): Change the code to use
191         null_type instead of testing `expr is NullLiteral'.
192         (ImplicitConversionStandard): use null_type too.
193         (ImplicitReferenceConversionExists): use null_type too.
194         (ImplicitReferenceConversion): use null_type too.
195
196         * literal.cs: The type of `NullLiteral' is now null_type instead
197         of object_type. 
198         (Resolve): Set the type here.
199
200         * typemanager.cs: Introduce null_type.
201
202 2004-11-18  Martin Baulig  <martin@ximian.com>
203
204         * rootcontext.cs
205         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
206
207 2004-11-18  Martin Baulig  <martin@ximian.com>
208
209         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
210
211 2004-11-18  Martin Baulig  <martin@ximian.com>
212
213         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
214         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
215         call ResolveConstructedType() on it to resolve it without checking
216         constraints.
217         (Constraints.ResolveTypes): Check them here.
218         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
219         but don't check constraints.
220         (ConstructedType.ResolveAsTypeTerminal): Override this and also
221         check constraints here.
222         (ConstructedType.ResolveConstructedType): New public method.  This
223         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
224         resolve ourselves without checking constraints.
225
226         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
227
228 2004-11-18  Martin Baulig  <martin@ximian.com>
229
230         * decl.cs
231         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
232
233         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
234
235 2004-11-18  Martin Baulig  <martin@ximian.com>
236
237         * ecore.cs (TypeExpr.ResolveType): Removed.
238         (Expression.ResolveAsTypeTerminal): We always return a fully
239         resolved `TypeExpr', so we can just access its `Type'.
240
241         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
242
243 2004-11-17  Martin Baulig  <martin@ximian.com>
244
245         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
246         sure we don't return any unresolved TypeExpr's.
247         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
248         a `TypeExpr'.
249         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
250
251         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
252         unresolved `ConstructedType's.
253
254 2004-11-17  Martin Baulig  <martin@ximian.com>
255
256         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
257
258 2004-11-17  Martin Baulig  <martin@ximian.com>
259
260         * ecore.cs
261         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
262
263         * decl.cs (DeclSpace.ResolveType): Removed.
264         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
265
266 2004-11-17  Martin Baulig  <martin@ximian.com>
267
268         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
269         direction, like FindMembers() does.  Fixes #69546, testcase is in
270         test-315.cs.    
271
272 2004-11-16  Martin Baulig  <martin@ximian.com>
273
274         This is based on a patch from Marek Safar, see bug #69082.
275         Fixes bugs #63705 and #67130.
276
277         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
278         method; create a MemberCache for an interface type and cache the
279         result.
280
281         * decl.cs (IMemberContainer.ParentContainer): Removed.
282         (IMemberContainer.ParentCache): New property.
283         (MemberCache.SetupCacheForInterface): Removed.
284         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
285         to create a cache for an interface's "parent".
286
287         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
288         interfaces too.
289
290 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
291
292         * statement.cs: Avoid adding bools to a hashtable.
293
294 2004-11-15  Martin Baulig  <martin@ximian.com>
295
296         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
297
298 2004-11-11  Martin Baulig  <martin@ximian.com>
299
300         * typemanager.cs (TypeManager.GetMethodName): New method.
301
302         * class.cs (MethodData.Define): Include the generic arity in the
303         name of an explicit interface; also add it to the method name.
304
305         * pending.cs (PendingImplementation.InterfaceMethod): The method
306         name now includes the generic arity.
307
308 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
309
310         * expression.cs (Invocation.OverloadResolve): Flag error if we are
311         calling an unsafe method from a safe location.
312
313 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
314
315         Fix #69167
316         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
317
318 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
319
320         * namespace.cs (VerifyUsing): use GetPartialName instead of
321         ToString. 
322
323 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
324
325         * statement.cs (Return.Resolve): Fix regression in typo: if
326         `in_exc', we have to request a NeedReturnLabel, this was a typo
327         introduced in the anonymous method check-in.  Fixes #69131.
328
329         * Indexers were using the ShortName when defining themselves,
330         causing a regression in the compiler bootstrap when applying the
331         patch from 2004-11-02 (first part), now they use their full name
332         and the bug is gone.
333
334 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
335
336         * driver.cs: Strip the path from the names of embedded resources. Fixes
337         #68519.
338
339 2004-11-04  Raja R Harinath  <rharinath@novell.com>
340
341         Fix error message regression: cs0104-2.cs.
342         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
343         (AliasEntry.Resolve): Update.
344         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
345         'silent' flag.
346         (RootContext.LookupType): Update.
347
348 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
349
350         * cs-parser.jay: Add support for handling accessor modifiers
351         * class: Add support port accessor modifiers and error checking,
352         define PropertyMethod.Define as virtual (not abstract anymore)
353         * ecore.cs: Add checking for proeprties access with access modifiers
354         * iterators.cs: Modify Accessor constructor call based in the modified
355         constructor
356 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
357
358         * expression.cs (StringConcat): Handle being called twice,
359         as when we have a concat in a field init with more than two
360         ctors in the class
361
362 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
363
364         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
365         special case explicit implementations, we should always produce
366         the .property or .event declaration.
367         
368         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
369         since it will not return correct data if people use this
370         unresolved in the presence of using statements (see test-313).
371
372         * class.cs (MethodData.Define): If we are an explicit interface
373         implementation, set the method name to the full name of the
374         interface plus the name of the method.  
375
376         Notice that using the method.MethodName.GetFullName() does not
377         work, as it will only contain the name as declared on the source
378         file (it can be a shorthand in the presence of using statements)
379         and not the fully qualifed type name, for example:
380
381         using System;
382
383         class D : ICloneable {
384                 object ICloneable.Clone ()  {
385                 }
386         }
387
388         Would produce a method called `ICloneable.Clone' instead of
389         `System.ICloneable.Clone'.
390
391         * namespace.cs (Alias.Resolve): Use GetPartialName.
392         
393 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
394
395         * cs-parser.jay: Add error 1055 report.
396
397 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
398
399         * assign.cs (Assign.DoResolve): Only do the transform of
400         assignment into a New if the types are compatible, if not, fall
401         through and let the implicit code deal with the errors and with
402         the necessary conversions. 
403
404 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
405
406         * cs-parser.jay: Add error 1031 report.
407
408         * cs-tokenizer.cs: Add location for error 1038.
409
410 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
411
412         * cs-parser.jay: Add error 1016 report.
413
414 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
415
416         * cs-parser.jay: Add errors 1575,1611 report.
417
418 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
419
420         * cs-parser.jay: Add error 1001 report.
421
422 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
423
424         Fix #68850
425         * attribute.cs (GetMarshal): Add method argument for
426         caller identification.
427
428         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
429         agument for GetMarshal and RuntimeMissingSupport.
430
431 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
432
433         * attribute.cs (ExtractSecurityPermissionSet): Removed
434         TypeManager.code_access_permission_type.
435
436         * typemanager.cs: Removed TypeManager.code_access_permission_type.
437
438 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
439
440         * expression.cs (LocalVariableReference.DoResolveLValue): Check
441         for obsolete use of a variable here.   Fixes regression on errors
442         cs0619-25 and cs0619-26.
443
444 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
445
446         Fix #62358, implemented security attribute encoding.
447
448         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
449         Tests permitted SecurityAction for assembly or other types.
450         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
451         data from SecurityPermissionAttribute to PermisionSet class.
452
453         * class.cs (ApplyAttributeBuilder): Added special handling
454         for System.Security.Permissions.SecurityAttribute based types.
455
456         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
457         special handling for System.Security.Permissions.SecurityAttribute
458         based types.
459
460         * enum.cs (ApplyAttributeBuilder): Added special handling
461         for System.Security.Permissions.SecurityAttribute based types.
462
463         * parameter.cs (ApplyAttributeBuilder): Added special handling
464         for System.Security.Permissions.SecurityAttribute based types.
465
466         * rootcontext.cs: Next 2 core types.
467
468         * typemanager.cs (TypeManager.security_permission_attr_type):
469         Built in type for the SecurityPermission Attribute.
470         (code_access_permission_type): Build in type.
471
472 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
473
474         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
475         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
476         all of this information into
477         EmitContext.EmitCapturedVariableInstance.
478         
479         * codegen.cs (EmitCapturedVariableInstance): move here the
480         funcionality of emitting an ldarg.0 in the presence of a
481         remapping.   This centralizes the instance emit code.
482
483         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
484         then emit a load of this: it means that we have reached the
485         topmost ScopeInfo: the one that contains the pointer to the
486         instance of the class hosting the anonymous method.
487
488         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
489         captures to the topmost CaptureContext.
490
491 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
492
493         * expression.cs (LocalVariableReference): Move the knowledge about
494         the iterators into codegen's EmitCapturedVariableInstance.
495
496 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
497
498         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
499         all code paths return a value from an anonymous method (it is the
500         same as the 161 error, but for anonymous methods).
501
502 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
503
504         The introduction of anonymous methods in the compiler changed
505         various ways of doing things in the compiler.  The most
506         significant one is the hard split between the resolution phase
507         and the emission phases of the compiler.
508
509         For instance, routines that referenced local variables no
510         longer can safely create temporary variables during the
511         resolution phase: they must do so from the emission phase,
512         since the variable might have been "captured", hence access to
513         it can not be done with the local-variable operations from the runtime.
514         
515         * statement.cs 
516
517         (Block.Flags): New flag `IsTopLevel' to indicate that this block
518         is a toplevel block.
519
520         (ToplevelBlock): A new kind of Block, these are the blocks that
521         are created by the parser for all toplevel method bodies.  These
522         include methods, accessors and anonymous methods.
523
524         These contain some extra information not found in regular blocks:
525         A pointer to an optional CaptureContext (for tracking captured
526         local variables and parameters).  A pointer to the parent
527         ToplevelBlock.
528         
529         (Return.Resolve): Catch missmatches when returning a value from an
530         anonymous method (error 1662).
531         Invoke NeedReturnLabel from the Resolve phase instead of the emit
532         phase.
533
534         (Break.Resolve): ditto.
535
536         (SwitchLabel): instead of defining the labels during the
537         resolution phase, we now turned the public ILLabel and ILLabelCode
538         labels into methods called GetILLabelCode() and GetILLabel() that
539         only define the label during the Emit phase.
540
541         (GotoCase): Track the SwitchLabel instead of the computed label
542         (its contained therein).  Emit the code by using
543         SwitchLabel.GetILLabelCode ().
544
545         (LocalInfo.Flags.Captured): A new flag has been introduce to track
546         whether the Local has been captured or not.
547
548         (LocalInfo.IsCaptured): New property, used to tell whether the
549         local has been captured.
550         
551         * anonymous.cs: Vastly updated to contain the anonymous method
552         support.
553
554         The main classes here are: CaptureContext which tracks any
555         captured information for a toplevel block and ScopeInfo used to
556         track the activation frames for various local variables.   
557
558         Each toplevel block has an optional capture context associated
559         with it.  When a method contains an anonymous method both the
560         toplevel method and the anonymous method will create a capture
561         context.   When variables or parameters are captured, they are
562         recorded on the CaptureContext that owns them, for example:
563
564         void Demo () {
565              int a;
566              MyDelegate d = delegate {
567                  a = 1;
568              }
569         }
570
571         Here `a' will be recorded as captured on the toplevel
572         CapturedContext, the inner captured context will not have anything
573         (it will only have data if local variables or parameters from it
574         are captured in a nested anonymous method.
575
576         The ScopeInfo is used to track the activation frames for local
577         variables, for example:
578
579         for (int i = 0; i < 10; i++)
580                 for (int j = 0; j < 10; j++){
581                    MyDelegate d = delegate {
582                         call (i, j);
583                    }
584                 }
585
586         At runtime this captures a single captured variable `i', but it
587         captures 10 different versions of the variable `j'.  The variable
588         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
589         recorded on a child.  
590
591         The toplevel ScopeInfo will also track information like the `this'
592         pointer if instance variables were referenced (this is necessary
593         as the anonymous method lives inside a nested class in the host
594         type of the method). 
595
596         (AnonymousMethod): Expanded to track the Toplevel, implement
597         `AnonymousMethod.Compatible' to tell whether an anonymous method
598         can be converted to a target delegate type. 
599
600         The routine now also produces the anonymous method content
601
602         (AnonymousDelegate): A helper class that derives from
603         DelegateCreation, this is used to generate the code necessary to
604         produce the delegate for the anonymous method that was created. 
605
606         * assign.cs: API adjustments for new changes in
607         Convert.ImplicitStandardConversionExists.
608
609         * class.cs: Adjustments to cope with the fact that now toplevel
610         blocks are of type `ToplevelBlock'. 
611
612         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
613         insteda of standard blocks.
614
615         Flag errors if params arguments are passed to anonymous methods.
616
617         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
618         `CurrentAnonymousMethod' which points to the current Anonymous
619         Method.  The variable points to the AnonymousMethod class that
620         holds the code being compiled.  It is set in the new EmitContext
621         created for the anonymous method.
622
623         (EmitContext.Phase): Introduce a variable and an enumeration to
624         assist in enforcing some rules about when and where we are allowed
625         to invoke certain methods (EmitContext.NeedsReturnLabel is the
626         only one that enfonces this right now).
627
628         (EmitContext.HaveCaptureInfo): new helper method that returns
629         whether we have a CapturedContext initialized.
630
631         (EmitContext.CaptureVariable): New method used to register that a
632         LocalInfo must be flagged for capturing. 
633
634         (EmitContext.CapturedParameter): New method used to register that a
635         parameters must be flagged for capturing. 
636         
637         (EmitContext.CapturedField): New method used to register that a
638         field must be flagged for capturing. 
639
640         (EmitContext.HaveCapturedVariables,
641         EmitContext.HaveCapturedFields): Return whether there are captured
642         variables or fields. 
643
644         (EmitContext.EmitMethodHostInstance): This is used to emit the
645         instance for the anonymous method.  The instance might be null
646         (static methods), this (for anonymous methods that capture nothing
647         and happen to live side-by-side with the current method body) or a
648         more complicated expression if the method has a CaptureContext.
649
650         (EmitContext.EmitTopBlock): Routine that drives the emission of
651         code: it will first resolve the top block, then emit any metadata
652         and then emit the code.  The split is done so that we can extract
653         any anonymous methods and flag any captured variables/parameters.
654         
655         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
656         during this phase, the ILGenerator should not be used as labels
657         and local variables declared here might not be accessible to any
658         code that is part of an anonymous method.  
659
660         Exceptions to this include the temporary variables that are
661         created by some statements internally for holding temporary
662         variables. 
663         
664         (EmitContext.EmitMeta): New routine, in charge of emitting all the
665         metadata for a cb
666
667         (EmitContext.TemporaryReturn): This method is typically called
668         from the Emit phase, and its the only place where we allow the
669         ReturnLabel to be defined other than the EmitMeta.  The reason is
670         that otherwise we would have to duplicate a lot of logic in the
671         Resolve phases of various methods that today is on the Emit
672         phase. 
673
674         (EmitContext.NeedReturnLabel): This no longer creates the label,
675         as the ILGenerator is not valid during the resolve phase.
676
677         (EmitContext.EmitThis): Extended the knowledge in this class to
678         work in anonymous methods in addition to iterators. 
679
680         (EmitContext.EmitCapturedVariableInstance): This emits whatever
681         code is necessary on the stack to access the instance to a local
682         variable (the variable will be accessed as a field).
683
684         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
685         EmitContext.EmitAddressOfParameter): Routines to support
686         parameters (not completed at this point). 
687         
688         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
689         will also remove the parameters.
690
691         * convert.cs (Convert): Define a `ConstantEC' which points to a
692         null.  This is just to prefity some code that uses
693         ImplicitStandardConversion code and do not have an EmitContext
694         handy.
695
696         The idea is to flag explicitly that at that point in time, it is
697         known that the conversion will not trigger the delegate checking
698         code in implicit conversions (which requires a valid
699         EmitContext). 
700
701         Everywhere: pass new EmitContext parameter since
702         ImplicitStandardConversionExists now requires it to check for
703         anonymous method conversions. 
704
705         (Convert.ImplicitStandardConversionExists): If the type of an
706         expression is the anonymous_method_type, and the type is a
707         delegate, we invoke the AnonymousMethod.Compatible method to check
708         whether an implicit conversion is possible. 
709
710         (Convert.ImplicitConversionStandard): Only do implicit method
711         group conversions if the language level is not ISO_1.
712
713         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
714         MethodInfo for the Invoke method.  used by Delegate and
715         AnonymousDelegate.
716
717         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
718         method conversions if the target type is a delegate.
719
720         Removed extra debugging nops.
721
722         (LocalVariableReference): Turn the `local_info' into a public
723         field. 
724
725         Add `prepared' field, the same hack used for FieldExprs to cope
726         with composed assignments, as Local variables do not necessarily
727         operate purely on the stack as they used to: they can be captured
728         fields. 
729
730         Add `temp' for a temporary result, like fields.
731
732         Refactor DoResolve and DoResolveLValue into DoResolveBase.
733
734         It now copes with Local variables that are captured and emits the
735         proper instance variable to load it from a field in the captured
736         case. 
737
738         (ParameterReference.DoResolveBase): During the resolve phase,
739         capture parameters if we are in an anonymous method.
740
741         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
742         anonymous method, use the EmitContext helper routines to emit the
743         parameter reference.
744
745         * iterators.cs: Set RemapToProxy to true/false during the
746         EmitDispose class.
747
748         * parameters.cs (GetParameterByName): New helper method. 
749
750         * typemanager.cs (anonymous_method_type) a new type that
751         represents an anonyous method.  This is always an internal type,
752         used as a fencepost to test against the anonymous-methodness of an
753         expression. 
754         
755 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
756
757         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
758         561 report.
759         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
760
761 2004-11-10  Martin Baulig  <martin@ximian.com>
762
763         * expression.cs (Invocation.BetterFunction): If two methods have
764         equal parameter types, but only one of them is generic, the
765         non-generic one wins.
766         (New.DoResolve): Don't set `is_struct' to false if we're a generic
767         instance; just use `Type.IsValueType' to determine whether
768         something is a struct or not.
769         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
770         so we can be called multiple times.
771
772 2004-11-10  Martin Baulig  <martin@ximian.com>
773
774         * generic.cs (TypeParameter.DefineConstraints): New public method.
775         (TypeParameter.CheckAccessLevel): Override this and return true.
776         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
777         override ResolveType() anymore.
778         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
779
780 2004-11-10  Martin Baulig  <martin@ximian.com>
781
782         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
783         call DeclSpace.ResolveNestedType() on it.
784
785 2004-11-10  Martin Baulig  <martin@ximian.com>
786
787         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
788         non-null, call ParameterModifier() on it.
789
790 2004-11-10  Martin Baulig  <martin@ximian.com>
791
792         * iterators.cs
793         (Iterators): Added `current_type' and `this_type' fields.
794         (Iterators.DefineIterator): Create a new EmitContext and store it
795         in `ec'; compute `this_type'.
796
797 2004-11-10  Martin Baulig  <martin@ximian.com>
798
799         * typemanager.cs
800         (TypeManager.IsPrivateAccessible): New public method.
801         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
802
803 2004-11-10  Martin Baulig  <martin@ximian.com>
804
805         * class.cs (TypeContainer.DefineType): Call
806         TypeBuilder.DefineGenericParameters() before resolving the type
807         parameters.
808         (MethodData.parent_method): New protected field.
809         (MethodData..ctor): Added `MethodInfo parent_method' argument.
810         (MethodData.Define): Compute `parent_method'.
811
812         * decl.cs
813         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
814         (MemberCore.GetClsCompliantAttributeValue): Likewise.
815         (DeclSpace.ec): New protected field; store the EmitContext here.
816         (DeclSpace.EmitContext): New public property.
817         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
818         (DeclSpace.ResolveNestedType): New public method.
819         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
820         (DeclSpace.NestedAccessible): Added `Type tb' argument.
821         (DeclSpace.FamilyAccessible): Likewise.
822         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
823         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
824         EmitContext.
825
826         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
827         field.
828
829         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
830         (Enum.Emit): Don't create a new EmitContext.
831
832 2004-10-18  Martin Baulig  <martin@ximian.com>
833
834         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
835         `Type' directly, but call ResolveType() on it.
836         (Catch.Resolve): Likewise.
837         (Foreach.Resolve): Likewise.
838
839 2004-10-18  Martin Baulig  <martin@ximian.com>
840
841         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
842         `Type' directly, but call ResolveType() on it.
843         (Probe.DoResolve): Likewise.
844         (ArrayCreation.LookupType): Likewise.
845         (TypeOf.DoResolve): Likewise.
846         (SizeOf.DoResolve): Likewise.
847
848 2004-10-18  Raja R Harinath  <rharinath@novell.com>
849
850         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
851         the ResolveType.
852
853 2004-10-17  John Luke  <john.luke@gmail.com>
854
855         * class.cs (Operator.GetSignatureForError): use CSharpName
856
857         * parameter.cs (Parameter.GetSignatureForError): Returns
858         correct name even if was not defined.
859
860 2004-10-13  Raja R Harinath  <rharinath@novell.com>
861
862         Fix #65816.
863         * class.cs (TypeContainer.EmitContext): New property.
864         (DefineNestedTypes): Create an emitcontext for each part.
865         (MethodCore.DoDefineParameters): Use container's emitcontext.
866         Pass type array to InternalParameters.
867         (MemberBase.DoDefine): Use container's emitcontext.
868         (FieldMember.Define): Likewise.
869         (Event.Define): Likewise.
870         (SetMethod.GetParameterInfo): Change argument to EmitContext.
871         Pass type array to InternalParameters.
872         (SetIndexerMethod.GetParameterInfo): Likewise.
873         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
874         * delegate.cs (Define): Pass emitcontext to
875         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
876         array to InternalParameters.
877         * expression.cs (ParameterReference.DoResolveBase): Pass
878         emitcontext to GetParameterInfo.
879         (ComposedCast.DoResolveAsTypeStep): Remove check on
880         ec.ResolvingTypeTree.
881         * parameter.cs (Parameter.Resolve): Change argument to
882         EmitContext.  Use ResolveAsTypeTerminal.
883         (Parameter.GetSignature): Change argument to EmitContext.
884         (Parameters.ComputeSignature): Likewise.
885         (Parameters.ComputeParameterTypes): Likewise.
886         (Parameters.GetParameterInfo): Likewise.
887         (Parameters.ComputeAndDefineParameterTypes): Likewise.
888         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
889         * support.cs (InternalParameters..ctor): Remove variant that takes
890         a DeclSpace.
891         * typemanager.cs (system_intptr_expr): New.
892         (InitExpressionTypes): Initialize it.
893
894 2004-10-12  Chris Toshok  <toshok@ximian.com>
895
896         * cs-parser.jay: fix location for try_statement and catch_clause.
897
898 2004-10-18  Martin Baulig  <martin@ximian.com>
899
900         * class.cs (FieldMember.Define): Don't access the TypeExpr's
901         `Type' directly, but call ResolveType() on it.
902         (MemberBase.DoDefine): Likewise.
903
904         * expression.cs (New.DoResolve): Don't access the TypeExpr's
905         `Type' directly, but call ResolveType() on it.
906         (ComposedCast.DoResolveAsTypeStep): Likewise.
907
908         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
909         `Type' directly, but call ResolveType() on it.
910
911 2004-10-17  John Luke  <john.luke@gmail.com>
912
913         * class.cs (Operator.GetSignatureForError): use CSharpName
914
915         * parameter.cs (Parameter.GetSignatureForError): Returns
916         correct name even if was not defined.
917
918 2004-10-13  Raja R Harinath  <rharinath@novell.com>
919
920         Fix #65816.
921         * class.cs (TypeContainer.EmitContext): New property.
922         (DefineNestedTypes): Create an emitcontext for each part.
923         (MethodCore.DoDefineParameters): Use container's emitcontext.
924         Pass type array to InternalParameters.
925         (MemberBase.DoDefine): Use container's emitcontext.
926         (FieldMember.Define): Likewise.
927         (Event.Define): Likewise.
928         (SetMethod.GetParameterInfo): Change argument to EmitContext.
929         Pass type array to InternalParameters.
930         (SetIndexerMethod.GetParameterInfo): Likewise.
931         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
932         * delegate.cs (Define): Pass emitcontext to
933         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
934         array to InternalParameters.
935         * expression.cs (ParameterReference.DoResolveBase): Pass
936         emitcontext to GetParameterInfo.
937         (ComposedCast.DoResolveAsTypeStep): Remove check on
938         ec.ResolvingTypeTree.
939         * parameter.cs (Parameter.Resolve): Change argument to
940         EmitContext.  Use ResolveAsTypeTerminal.
941         (Parameter.GetSignature): Change argument to EmitContext.
942         (Parameters.ComputeSignature): Likewise.
943         (Parameters.ComputeParameterTypes): Likewise.
944         (Parameters.GetParameterInfo): Likewise.
945         (Parameters.ComputeAndDefineParameterTypes): Likewise.
946         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
947         * support.cs (InternalParameters..ctor): Remove variant that takes
948         a DeclSpace.
949         * typemanager.cs (system_intptr_expr): New.
950         (InitExpressionTypes): Initialize it.
951
952 2004-10-12  Chris Toshok  <toshok@ximian.com>
953
954         * cs-parser.jay: fix location for try_statement and catch_clause.
955
956 2004-10-07  Raja R Harinath  <rharinath@novell.com>
957
958         More DeclSpace.ResolveType avoidance.
959         * decl.cs (MemberCore.InUnsafe): New property.
960         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
961         with newly created EmitContext.
962         (FieldMember.Define): Likewise.
963         * delegate.cs (Delegate.Define): Likewise.
964         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
965         only if normal name-lookup fails.
966         (TypeExpr.DoResolve): Enable error-checking.
967         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
968         (SizeOf.DoResolve): Likewise.
969         (ComposedCast.DoResolveAsTypeStep): Likewise.
970         (StackAlloc.DoResolve): Likewise.
971         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
972         (Block.Unsafe): New property.
973         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
974         (Unsafe): Set 'unsafe' flag of contained block.
975         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
976         (Fixed.Resolve): Likewise.
977         (Catch.Resolve): Likewise.
978         (Using.ResolveLocalVariableDecls): Likewise.
979         (Foreach.Resolve): Likewise.
980
981 2004-10-05  John Luke <john.luke@gmail.com>
982
983         * cs-parser.jay: add location to error CS0175
984
985 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
986
987         * ecore.cs (Expression.Constantity): Add support for turning null
988         into a constant.
989
990         * const.cs (Const.Define): Allow constants to be reference types
991         as long as the value is Null.
992
993 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
994
995         * namespace.cs (NamespaceEntry.Using): No matter which warning
996         level is set, check if this namespace name has already been added.
997
998 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
999
1000         * expression.cs: reftype [!=]= null should always use br[true,false].
1001         # 67410
1002
1003 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1004
1005         Fix #67108
1006         * attribute.cs: Enum conversion moved to 
1007         GetAttributeArgumentExpression to be applied to the all
1008         expressions.
1009
1010 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1011
1012         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1013         * class.c (TypeContainer.DefineType): Flag error if
1014         base types aren't accessible due to access permissions.
1015         * decl.cs (DeclSpace.ResolveType): Move logic to
1016         Expression.ResolveAsTypeTerminal.
1017         (DeclSpace.ResolveTypeExpr): Thin layer over
1018         Expression.ResolveAsTypeTerminal.
1019         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1020         Refactor code into NestedAccess.  Use it.
1021         (DeclSpace.NestedAccess): New.
1022         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1023         argument to silence errors.  Check access permissions.
1024         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1025         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1026         (Cast.DoResolve): Likewise.
1027         (New.DoResolve): Likewise.
1028         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1029         (TypeOf.DoResolve): Likewise.
1030
1031         * expression.cs (Invocation.BetterConversion): Return the Type of
1032         the better conversion.  Implement section 14.4.2.3 more faithfully.
1033         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1034         section 14.4.2.2 explicit.
1035         (Invocation.OverloadResolve): Update.
1036         (Invocation): Remove is_base field.
1037         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1038         (Invocation.Emit): Likewise.
1039
1040 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1041
1042         * cs-parser.jay: Reverted 642 warning fix.
1043
1044 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1045
1046         Fix bug #66615
1047         * decl.cs (FindMemberWithSameName): Indexer can have more than
1048         1 argument.
1049
1050 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1051
1052         * expression.cs (LocalVariableReference.DoResolveLValue):
1053         Do not report warning 219 for out values.
1054         (EmptyExpression.Null): New member to avoid extra allocations.
1055
1056 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1057
1058         * cs-parser.jay: Fix wrong warning 642 report.
1059
1060         * cs-tokenizer.cs (CheckNextToken): New helper;
1061         Inspect next character if is same as expected.
1062
1063 2004-09-23  Martin Baulig  <martin@ximian.com>
1064
1065         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1066         (Convert.ImplicitReferenceConversionExists): Likewise.
1067
1068 2004-11-09  Raja R Harinath  <rharinath@novell.com>
1069
1070         * Makefile (DISTFILES): Comment out a few missing files.
1071
1072 2004-10-29  Raja R Harinath  <rharinath@novell.com>
1073
1074         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
1075         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
1076         (gmcs.exe): Invoke bootstrap-libs.
1077         (clean-local): Clean the net_2_0_bootstrap profile too.
1078         (PROGRAM_INSTALL_DIR): New.
1079         (install-local): Use it.
1080
1081 2004-10-13  Martin Baulig  <martin@ximian.com>
1082
1083         * generic.cs (TypeManager.InflatedConstraints): New nested class.
1084         (TypeParameter.DefineType): If we're a method type parameter and
1085         that method is overriding something, "inflate" its constraints.
1086
1087 2004-10-12  Martin Baulig  <martin@ximian.com>
1088
1089         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
1090         and have type arguments, create and resolve a ConstructedType.
1091
1092 2004-10-12  Martin Baulig  <martin@ximian.com>
1093
1094         * decl.cs (MemberCache.FindMemberToOverride): Use
1095         TypeManager.IsEqual() to compare the parameters and Type.Equals()
1096         to compare the invocationType.
1097
1098         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
1099         When comparing two type parameters, only do the signature-only
1100         comparision for method type parameters.
1101
1102 2004-10-11  Martin Baulig  <martin@ximian.com>
1103
1104         * report.cs: Don't make --fatal abort on warnings, we have
1105         -warnaserror for that.
1106
1107 2004-10-11  Martin Baulig  <martin@ximian.com>
1108
1109         * typemanager.cs
1110         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
1111         (TypeManager.IsEqual): Call ourself recursively instead of using
1112         Type.IsEqual(). 
1113
1114 2004-10-11  Martin Baulig  <martin@ximian.com>
1115
1116         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
1117         on our own type parameters, not on the ones we inherit from a containing
1118         class.
1119
1120         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
1121         the comparision.
1122
1123         * generic.cs (TypeParameter.Define): We may only be called once.
1124
1125         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
1126         instead of TypeManager.IsEqual().
1127
1128 2004-09-28  Martin Baulig  <martin@ximian.com>
1129
1130         * generic.cs
1131         (GenericConstraints.EffectiveBaseClass): New public property.
1132         (TypeParameter.GenericConstraints): New public property.
1133         (ConstructedType.CheckConstraints): Improved.
1134
1135         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
1136         (Convert.TypeParameterConversion): New private method; use this in
1137         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
1138         for all conversions related to type parameters.
1139
1140 2004-09-24  Martin Baulig  <martin@ximian.com>
1141
1142         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
1143         type parameter conversions for type parameters which are known to
1144         be reference types.
1145
1146 2004-09-24  Martin Baulig  <martin@ximian.com>
1147
1148         * generic.cs (GenericConstraints): Added `IsReferenceType' and
1149         `IsValueType' properties.
1150
1151         * support.cs (ReflectionConstraints): Use
1152         Type.GetGenericParameterConstraints() instead of the old hack.
1153
1154 2004-09-24  Martin Baulig  <martin@ximian.com>
1155
1156         * generic.cs (GenericConstraints): Moved here and made it an
1157         abstract class.
1158
1159         * support.cs (GenericConstraints): Moved to generic.cs.
1160
1161 2004-09-24  Martin Baulig  <martin@ximian.com>
1162
1163         * support.cs
1164         (ReflectionConstraints): Un-nested this class and made it public.
1165
1166         * typemanager.cs
1167         (TypeManager.GetTypeParameterConstraints): New public method.
1168         (TypeManager.HasConstructorConstraint): Use the attributes.
1169
1170 2004-09-24  Martin Baulig  <martin@ximian.com>
1171
1172         * support.cs (GenericConstraints): Replaced `HasConstructor',
1173         `IsReferenceType' and `IsValueType' with `Attributes'.
1174         (ReflectionParameters.ReflectionConstraints): Removed the Create()
1175         method and made the .ctor public.
1176
1177         * generic.cs (Constraints.Attributes): New public property.
1178         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
1179         `IsReferenceType' -> `HasReferenceTypeConstraint' and
1180         `IsValueType' -> `HasValueTypeConstraint'.
1181
1182 2004-09-23  Martin Baulig  <martin@ximian.com>
1183
1184         * generic.cs (Constraints): Reflect latest runtime changes.
1185
1186 2004-09-23  Martin Baulig  <martin@ximian.com>
1187
1188         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1189         (Convert.ImplicitReferenceConversionExists): Likewise.
1190
1191 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1192
1193         * class.cs (Operator.Define): Add error 448 and 559 report.
1194         
1195 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1196
1197         * class.cs (MemberBase.IsTypePermitted): New protected
1198         method for checking error CS0610.
1199
1200 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1201
1202         * class.cs (TypeContainer.HasExplicitLayout): New property
1203         Returns whether container has StructLayout attribute set Explicit.
1204         (FieldMember): New abstract class for consts and fields.
1205         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1206         (Field): Reuse FieldMember.
1207
1208         * const.cs (Const): Reuse FieldMember.
1209
1210         * rootcontext.cs: EmitConstants call moved to class.
1211
1212 2004-09-22  Martin Baulig  <martin@ximian.com>
1213
1214         Marek and me just fixed one of our oldest bugs: #28562 :-)
1215
1216         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1217
1218         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1219         we're an EnumConstant, just return that.
1220         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1221         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1222         to get the value which'll actually be written into the attribute.
1223         However, we have to use GetValue() to access the attribute's value
1224         in the compiler.        
1225
1226 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1227
1228         * constant.cs (Constant.IsNegative): New abstract property
1229         IsNegative.
1230
1231         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1232         (StackAlloc.DoResolve): Reused IsNegative.
1233
1234 2004-09-22  Martin Baulig  <martin@ximian.com>
1235
1236         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
1237         public method; like LookupTypeContainer, but also works for
1238         generic instances.
1239
1240         * report.cs (Report.SymbolRelatedToPreviousError): Use
1241         TypeManager.LookupGenericTypeContainer().       
1242
1243 2004-09-22  Martin Baulig  <martin@ximian.com>
1244
1245         Thanks to Peter Sestoft for this bug report.
1246
1247         * expression.cs (Conditional): If both the `trueExpr' and the
1248         `falseExpr' is a NullLiteral, return a NullLiteral.
1249
1250 2004-09-22  Martin Baulig  <martin@ximian.com>
1251
1252         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1253         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1254         for the "get_Current" call.
1255
1256 2004-09-21  Martin Baulig  <martin@ximian.com>
1257
1258         * convert.cs (Convert.ImplicitReferenceConversion): When
1259         converting to an interface type, first check whether we're
1260         converting from a reference type.
1261
1262 2004-09-14  Martin Baulig  <martin@ximian.com>
1263
1264         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1265
1266 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1267
1268         Fixed bug #61902
1269         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1270         called and is obsolete then this member suppress message
1271         when call is inside next [Obsolete] method or type.
1272
1273         * expression.cs: Use TestObsoleteMethodUsage member.
1274
1275 2004-09-14  Martin Baulig  <martin@ximian.com>
1276
1277         * genericparser.cs: Removed.
1278
1279 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1280
1281         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1282
1283 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1284
1285         * attribute.cs (Attribute.Resolve): Add error 653 report.
1286
1287         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1288         report.
1289         (Method.ApplyAttributeBuilder): Add error 685 report.
1290         (Operator.Define): Add error 564 report.
1291
1292         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1293
1294         * expression.cs (Invocation.DoResolve): Add error
1295         245 and 250 report.
1296
1297         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1298         error 674 report.
1299
1300 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1301
1302         * class.cs (ConstructorInitializer.Resolve):
1303         Wrong error number (515->516).
1304
1305 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1306
1307         * class.cs (Indexer.Define): Add error 631 report.
1308
1309 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1310
1311         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1312
1313 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1314
1315         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1316
1317 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1318
1319         * cs-parser.jay: Added error CS0241 report.
1320
1321 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1322
1323         * cs-parser.jay (fixed_statement): Introduce a scope for the
1324         declaration in the 'fixed' statement.
1325
1326 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1327
1328         * cs-parser.jay: Added CS0230 error report.
1329
1330 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1331
1332         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1333
1334 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1335
1336         * expression.cs (Argument.Resolve): Added error CS0192 and
1337         CS0199 report.
1338
1339 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1340
1341         C# 2.0 #pragma warning feature
1342
1343         * cs-tokenizer.cs (PreProcessPragma): New method; 
1344         Handles #pragma directive.
1345
1346         * report.cs (WarningRegions): New class; Support
1347         class for #pragma warning directive. It tests whether
1348         warning is enabled for a given line.
1349
1350 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1351
1352         * const.cs: Add more descriptive error report, tahnks to
1353         Sebastien. 
1354
1355 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1356
1357         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1358
1359 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1360
1361         * expression.cs: Apply patch from Ben: Remove dead code from
1362         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1363         as that code just threw an exception anwyays.
1364
1365         * const.cs: Remove the call to the turnintoconstant, for details
1366         see bug: #63144
1367         
1368         * literal.cs: The type of the null-literal is the null type;  So
1369         we use a placeholder type (literal.cs:System.Null, defined here)
1370         for it.
1371
1372         * expression.cs (Conditional.DoResolve): Remove some old code that
1373         is no longer needed, conversions have been fixed.
1374
1375         (ArrayCreationExpression.DoResolve): Return false if we fail to
1376         resolve the inner expression.
1377
1378 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1379
1380         Fix test-290.cs.
1381         * cs-parser.jay (delegate_declaration): Record a delegate
1382         declaration as a type declaration.
1383         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1384
1385 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1386
1387         * parameter.cs: Do not crash if the type can not be resolved. 
1388
1389         * expression.cs: Report errors with unsafe pointers, fixes #64896
1390
1391 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1392
1393         * expression.cs: Pointer arith always needs to do a conv.i
1394         if the operand is a long. fix 65320
1395
1396 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1397
1398         Fixed cs0619-37.cs, cs0619-38.cs
1399
1400         * enum.cs (GetObsoleteAttribute): Removed.
1401
1402         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1403         on Enum member is double staged. The first is tested member
1404         and then enum.
1405
1406 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1407
1408         Fixed #56986, #63631, #65231
1409
1410         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1411         adds member to name container.
1412         (TypeContainer.AddToTypeContainer): New method, adds type to
1413         name container.
1414         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1415         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1416         AddOperator): Simplified by reusing AddToMemberContainer.
1417         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1418         instead of field.
1419         (Method.CheckForDuplications): Fixed implementation to test all
1420         possibilities.
1421         (MemberBase): Detection whether member is explicit interface
1422         implementation is now in constructor.
1423         (MemberBase.UpdateMemberName): Handles IndexerName.
1424         (Accessor): Changed to keep also location information.
1425         (AbstractPropertyEventMethod): Is derived from MemberCore.
1426         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1427         will be emited or not.
1428         (PropertyBase.AreAccessorsDuplicateImplementation):
1429         Tests whether accessors are not in collision with some method.
1430         (Operator): Is derived from MethodCore to simplify common
1431         operations.
1432
1433         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1434         must be performed.
1435         (DeclSpace.AddToContainer): Adds the member to defined_names
1436         table. It tests for duplications and enclosing name conflicts.
1437
1438         * enum.cs (EnumMember): Clean up to reuse the base structures
1439
1440 2004-09-03  Martin Baulig  <martin@ximian.com>
1441
1442         Merged latest changes into gmcs.  Please keep this comment in
1443         here, it makes it easier for me to see what changed in MCS since
1444         the last time I merged.
1445
1446 2004-09-03  Martin Baulig  <martin@ximian.com>
1447
1448         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1449         into TypeContainer, to make partial classes work again.
1450
1451 2004-09-03  Martin Baulig  <martin@ximian.com>
1452
1453         * rootcontext.cs (RootContext.V2): Removed.
1454
1455 2004-03-23  Martin Baulig  <martin@ximian.com>
1456
1457         * expression.cs (Invocation.OverloadResolve): Added `bool
1458         may_fail' argument and use it instead of the Location.IsNull() hack.
1459
1460 2004-09-09  Martin Baulig  <martin@ximian.com>
1461
1462         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
1463
1464 2004-09-09  Martin Baulig  <martin@ximian.com>
1465
1466         * generic.cs (TypeParameter.DefineType): Added support for
1467         explicit interface methods.
1468
1469 2004-09-09  Martin Baulig  <martin@ximian.com>
1470
1471         * README.Changes: New document.  Started to list important changes
1472         between MCS and GMCS here.
1473
1474 2004-09-08  Martin Baulig  <martin@ximian.com>
1475
1476         * class.cs
1477         (TypeContainer.CheckRecursiveDefinition): New protected method.
1478         (TypeContainer.DefineType): Move the CS0146 check into
1479         CheckRecursiveDefinition().     
1480
1481 2004-09-06  Martin Baulig  <martin@ximian.com>
1482
1483         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
1484         types for the constructor constraint.
1485
1486 2004-09-03  Martin Baulig  <martin@ximian.com>
1487
1488         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1489         into TypeContainer, to make partial classes work again.
1490
1491 2004-09-03  Martin Baulig  <martin@ximian.com>
1492
1493         * rootcontext.cs (RootContext.V2): Removed.
1494
1495 2004-03-23  Martin Baulig  <martin@ximian.com>
1496
1497         * expression.cs (Invocation.OverloadResolve): Added `bool
1498         may_fail' argument and use it instead of the Location.IsNull() hack.
1499
1500 2004-09-03  Martin Baulig  <martin@ximian.com>
1501
1502         Merged latest changes into gmcs.  Please keep this comment in
1503         here, it makes it easier for me to see what changed in MCS since
1504         the last time I merged.
1505
1506 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1507
1508         Fix #61128.
1509         * expression.cs (BetterConversion): Don't allow either conversion 
1510         to be null.  Remove redundant implicit conversion test when 'q ==
1511         null' -- when this function is invoked, we already know that the
1512         implicit conversion exists.
1513         (BetterFunction): Assume that 'best' is non-null.  Remove
1514         redundant reimplementation of IsApplicable when 'best' is null.
1515         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1516         number of arguments.
1517         (IsAncestralType): Extract from OverloadResolve.
1518         (OverloadResolve): Make robust to the MethodGroupExpr being
1519         unsorted.  Implement all the logic of Section 14.5.5.1, and
1520         support overloading of methods from multiple applicable types.
1521         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1522
1523         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1524         (RealError, Warning): Append type of report to related symbol.
1525
1526 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1527
1528         * enum.cs: Fixed CLS-Compliance checks for enum members.
1529         Error tests cs3008-8.cs, cs3014-8.cs
1530
1531 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1532
1533         Fixed bug #62342, #63102
1534         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1535         like ImplementMethod.
1536
1537 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1538
1539         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1540         Fixed bug #65170.
1541
1542 2004-09-02  Martin Baulig  <martin@ximian.com>
1543
1544         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1545         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1546         on the MethodBase.
1547
1548 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1549
1550         C# 2.0 Static classes implemented
1551
1552         * class.cs (TypeContainer): instance_constructors,
1553         initialized_fields, initialized_static_fields,
1554         default_constructor, base_inteface_types are protected to be
1555         accessible from StaticClass.
1556         (TypeContainer.DefineDefaultConstructor): New virtual method
1557         for custom default constructor generating
1558         (StaticClass): New class to handle "Static classes" feature.
1559
1560         * cs-parser.jay: Handle static keyword on class like instance
1561         of StaticClass.
1562
1563         * driver.cs: Added "/langversion" command line switch with two
1564         options (iso-1, default).
1565
1566 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1567
1568         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1569
1570 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1571
1572         * delegate.cs: Style.
1573
1574 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1575
1576         * delegate.cs: Add seperate instance expr field for miguel.
1577
1578 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1579
1580         * PointerArithmetic (Resolve): make sure we are not doing
1581         pointer arith on void*. Also, make sure we are resolved
1582         by not setting eclass until resolve.
1583
1584         All callers: Make sure that PointerArithmetic gets resolved.
1585
1586 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1587
1588         * ArrayCreation (LookupType): If the type does not resolve 
1589         to an array, give an error.
1590
1591 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1592
1593         * statement.cs (Try.Resolve): Fixed bug #64222
1594
1595 2004-08-27  Martin Baulig  <martin@ximian.com>
1596
1597         * class.cs
1598         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1599         crash here.     
1600
1601 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1602
1603         * ecore.cs (Constantify): Get underlying type via
1604         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1605         Windows in special cases.
1606
1607 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1608
1609         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1610         for obtaining also private methods.
1611         (GetRemoveMethod): Used GetRemoveMethod (true)
1612         for obtaining also private methods.
1613
1614 2004-09-02  Martin Baulig  <martin@ximian.com>
1615
1616         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1617         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1618         on the MethodBase.
1619
1620 2004-08-27  Martin Baulig  <martin@ximian.com>
1621
1622         * class.cs
1623         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1624         crash here.     
1625
1626 2004-08-25  Martin Baulig  <martin@ximian.com>
1627
1628         * support.cs (ReflectionParameters..ctor): If this is a generic
1629         method, retrieve and store its type parameters.
1630         (InternalParameters..ctor): Added `TypeParameter[]' argument.
1631         (ReflectionParameters.GenericConstraints): The argument specifies
1632         the type parameter, not the method parameter.
1633         (InternalParameters.GenericConstraints): Likewise.
1634
1635         * generic.cs (TypeParameter.DefineType): Correctly handle
1636         constraints wrt. generic methods in interfaces and their
1637         implementations.        
1638
1639 2004-08-24  Martin Baulig  <martin@ximian.com>
1640
1641         * generic.cs (TypeParameter.IsSubclassOf): New public method.
1642         (Constraints.IsSubclassOf): New internal method.
1643
1644         * typemanager.cs (TypeManager.FindMembers): Added special support
1645         for GenericTypeParameterBuilder's.      
1646         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
1647         type parameters.
1648
1649 2004-08-24  Martin Baulig  <martin@ximian.com>
1650
1651         * typemanager.cs
1652         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
1653         this for accessibility checks.
1654         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
1655         IsNestedFamilyAccessible.
1656         (TypeManager.IsSubclassOf): New method, do what the name actually
1657         says.   
1658
1659 2004-08-24  Martin Baulig  <martin@ximian.com>
1660
1661         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
1662         as a SimpleName, include the generic arity.
1663
1664 2004-08-24  Martin Baulig  <martin@ximian.com>
1665
1666         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1667         MethodAttributes.HideBySig for operators.
1668
1669 2004-08-23  Martin Baulig  <martin@ximian.com>
1670
1671         Back to the old error reporting system :-)
1672
1673         * report.cs (Message): Removed.
1674         (Report.MessageData, ErrorData, WarningData): Removed.
1675         (Report.Error, Warning): Back to the old system.
1676
1677 2004-08-23  Martin Baulig  <martin@ximian.com>
1678
1679         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1680
1681         * class.cs (TypeContainer.ParentContainer): New public virtual
1682         method; replaces the explicit interface implementation.
1683         (ClassPart.ParentContainer): Override.
1684
1685 2004-08-23  Martin Baulig  <martin@ximian.com>
1686
1687         * statement.cs (Switch): Added support for constant switches; see
1688         #59428 or test-285.cs.
1689
1690 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1691
1692         Fixed bug #62740.
1693         * statement.cs (GetEnumeratorFilter): Removed useless
1694         logic because C# specs is strict. GetEnumerator must be
1695         public.
1696
1697 2004-08-22  Martin Baulig  <martin@ximian.com>
1698
1699         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1700         a switch and may break, reset the barrier.  Fixes #59867.
1701
1702 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1703
1704         CLS-Compliance speed up (~5% for corlib)
1705
1706         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1707         New method. Tests container for CLS-Compliant names
1708
1709         * class.cs (TypeContainer.VerifyClsName): New method.
1710         Checks whether container name is CLS Compliant.
1711         (Constructor): Implements IMethodData.
1712
1713         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1714         low-case table for CLS Compliance test.
1715         (MemberCache.VerifyClsParameterConflict): New method.
1716         Checks method parameters for CS3006 error.
1717
1718         * enum.cs (EnumMember): Is derived from MemberCore.
1719         (Enum.VerifyClsName): Optimized for better performance.
1720
1721 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1722
1723         * report.cs: Renamed Error_T to Error and changed all
1724         references.
1725
1726 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1727
1728         * class.cs (TypeContainer.IndexerArrayList): New inner class
1729         container for indexers.
1730         (TypeContainer.DefaultIndexerName): New constant for default
1731         indexer name. Replaced all "Item" with this constant.
1732         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1733
1734         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1735         DefaultMemberAttribute constructor.
1736
1737 2004-08-05  Martin Baulig  <martin@ximian.com>
1738
1739         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1740         Fix bug #59429.
1741
1742 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1743
1744         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1745         multi platforms problem.
1746
1747         * compiler.csproj: Included shared files.
1748
1749 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1750
1751         Fix bug 60333, 55971 in the more general way
1752         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1753         Added arg_type argument for constant conversion.
1754         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1755
1756 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1757
1758         Fix bug #59760
1759         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1760         OperatorArrayList, MethodCoreArrayList for typecontainer
1761         containers. Changed class member types to these new types.
1762         (MethodArrayList.DefineMembers): Added test for CS0659.
1763
1764 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1765
1766         * cfold.cs: Synchronize the folding with the code in expression.cs
1767         Binary.DoNumericPromotions for uint operands.
1768
1769         * attribute.cs: Revert patch from Raja, it introduced a regression
1770         while building Blam-1.2.1 (hard to isolate a test case).
1771
1772 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1773
1774         Fix for #55382
1775         * class.cs:
1776         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1777         name collision.
1778         (MethodCore.parent_method): New member. The method we're overriding
1779         if this is an override method.
1780         (MethodCore.CheckBase): Moved from Method class and made common.
1781         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1782         private.
1783         (MethodCore.CheckForDuplications): New abstract method. For custom
1784         member duplication search in a container
1785         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1786         method and its return type.
1787         (Event.conflict_symbol): New member. Symbol with same name in the
1788         parent class.
1789
1790         * decl.cs:
1791         (MemberCache.FindMemberWithSameName): New method. The method
1792         is looking for conflict with inherited symbols.
1793
1794 2004-08-04  Martin Baulig  <martin@ximian.com>
1795
1796         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1797
1798         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1799
1800 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1801
1802         * report.cs (Message): New enum for better error, warning reference in
1803         the code.
1804         (MessageData): New inner abstract class. It generally handles printing of
1805         error and warning messages.
1806         Removed unused Error, Warning, Message methods.
1807
1808 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1809
1810         Fix for cs0592-8.cs test
1811         * attribute.cs
1812         (Attributable.ValidAttributeTargets): Made public.
1813         (Attribute.ExplicitTarget): New member for explicit target value.
1814         (Attribute.CheckTargets): Now we translate explicit attribute
1815         target to Target here.
1816
1817 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1818
1819         * ecore.cs (MethodGroupExpr): new IsBase property.
1820
1821         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1822
1823         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1824         rather than an instance expr.
1825
1826         (DelegateCreation.Emit): Use the method group rather than
1827         the instance expression. Also, if you have base.Foo as the
1828         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1829
1830         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1831
1832         (NewDelegate.DoResolve): Only check for the existance of Invoke
1833         if the method is going to be needed. Use MethodGroupExpr.
1834
1835         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1836
1837         * expression.cs: For pointer arith., make sure to use
1838         the size of the type, not the size of the pointer to
1839         the type.
1840
1841 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1842
1843         Fix for #60722
1844         * class.cs (Class): Added error CS0502 test.
1845
1846 2004-08-03  John Luke  <jluke@cfl.rr.com>
1847             Raja R Harinath  <rharinath@novell.com>
1848
1849         Fix for #60997.
1850         * attribute.cs (Attribute.complained_before): New flag.
1851         (Attribute.ResolveType, Attribute.Resolve),
1852         (Attribute.DefinePInvokeMethod): Set it.
1853         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1854         
1855 2004-08-03  Martin Baulig  <martin@ximian.com>
1856
1857         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1858         use a user-defined operator; we still need to do numeric
1859         promotions in case one argument is a builtin type and the other
1860         one has an implicit conversion to that type.  Fixes #62322.
1861
1862 2004-08-18  Martin Baulig  <martin@ximian.com>
1863
1864         * class.cs (Method.Define): Use the correct method name when
1865         creating the MethodBuilder for a generic method.
1866
1867 2004-08-17  Martin Baulig  <martin@ximian.com>
1868
1869         * generic.cs (Constraints): Support type parameter constraints.
1870
1871 2004-08-16  Martin Baulig  <martin@ximian.com>
1872
1873         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
1874         (Token.GENERIC_DIMENSION): New token; this is returned if we
1875         encounter an unbound generic type in a typeof() expression.
1876
1877         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
1878         this token is only generated while parsing a typeof() expression.
1879         (typeof_expression): Removed the old unbound_type hack.
1880
1881         * generic.cs (TypeArguments.IsUnbound): New public property.
1882
1883         * decl.cs (MemberName): Added support for unbound types.
1884
1885 2004-08-14  Martin Baulig  <martin@ximian.com>
1886
1887         * typemanager.cs
1888         (TypeManager.IsEqualGenericInstance): New static method.
1889         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
1890         just used to check accessibility, so follow the rules of 26.1.6.        
1891
1892         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
1893         ConstructedType instead of a TypeExpression if we have type arguments.
1894
1895         * cs-parser.jay (typeof_expression): Support unbound generic types.
1896
1897         * ecore.cs (UnboundTypeExpression): New public class.
1898
1899 2004-08-12  Martin Baulig  <martin@ximian.com>
1900
1901         * typemanager.cs (TypeManager.IsNestedChildOf): Use
1902         TypeManager.IsEqual() rather than `=='.
1903
1904         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
1905         generic instances as well.
1906
1907 2004-08-12  Martin Baulig  <martin@ximian.com>
1908
1909         * expression.cs (Invocation.InferType): We can only infer method
1910         type parameters.  Fixes #62647.
1911
1912 2004-08-11  Martin Baulig  <martin@ximian.com>
1913
1914         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
1915         before resolving the base classes.
1916
1917 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
1918
1919         * Makefile: install .mdb file too.
1920
1921 2004-08-05  Martin Baulig  <martin@ximian.com>
1922
1923         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
1924         initializer, the current type is just the TypeBuilder, not the
1925         instantiated generic type.
1926         (FieldExpr.IsFieldInitializer): New public property.
1927
1928 2004-08-04  Martin Baulig  <martin@ximian.com>
1929
1930         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1931
1932         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1933
1934 2004-08-03  Martin Baulig  <martin@ximian.com>
1935
1936         * class.cs (MethodData.Define): If we're an explicit
1937         implementation, remove the generic arity from the type name.
1938
1939 2004-08-03  Martin Baulig  <martin@ximian.com>
1940
1941         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1942         use a user-defined operator; we still need to do numeric
1943         promotions in case one argument is a builtin type and the other
1944         one has an implicit conversion to that type.  Fixes #62322.
1945
1946 2004-08-02  Martin Baulig  <martin@ximian.com>
1947
1948         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
1949         `TypeExpr[]' array.
1950         (TypeContainer.GetClassBases): Return the unexpanded list of
1951         interfaces; we expand them later.
1952         (TypeContainer.DefineType): After creating the TypeBuilder, call
1953         TypeManager.ExpandInterfaces() to get an expanded and resolved
1954         list of interfaces.
1955
1956         * ecore.cs (TypeExpr.GetInterfaces): Removed
1957
1958         * generics.cs (Constraints.InterfaceConstraints): Remove.
1959         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
1960         register the interface constraints.
1961
1962         * typemanager.cs
1963         (TypeManager.AddUserType): Removed the `ifaces' argument.
1964         (TypeManager.AddTypeParameter): Likewise.
1965         (TypeManager.AddUserInterface): Removed, was unused.
1966         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
1967         `TypeExpr[]' array for the interfaces.
1968         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
1969         has been defined, returns a list of the resolved interfaces types.
1970         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
1971         (TypeManager.GetExplicitInterfaces): Likewise.  
1972
1973 2004-08-02  Martin Baulig  <martin@ximian.com>
1974
1975         * expression.cs (Invocation.EmitCall): If we're invoking a method
1976         on a type parameter, use the new `Constrained' prefix opcode.
1977
1978 2004-08-02  Martin Baulig  <martin@ximian.com>
1979
1980         * statement.cs (LocalInfo.Flags): Added `IsThis'.
1981         (LocalInfo.IsThis): New public property.
1982         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
1983
1984 2004-08-01  Martin Baulig  <martin@ximian.com>
1985
1986         * class.cs (TypeContainer.GetClassBases): Don't set the default
1987         here since we may get called from GetPartialBases().
1988         (TypeContainer.DefineType): If GetClassBases() didn't return a
1989         parent, use the default one.
1990
1991 2004-07-30  Martin Baulig  <martin@ximian.com>
1992
1993         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
1994
1995         * class.cs (SourceMethod): New public class, derive from the
1996         symbol writer's ISourceMethod.
1997         (Method): Use the new symbol writer API.
1998
1999         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2000         as argument and use the new symbol writer.
2001
2002         * location.cs
2003         (SourceFile): Implement the symbol writer's ISourceFile.
2004         (Location.SymbolDocument): Removed.
2005         (Location.SourceFile): New public property.
2006
2007         * symbolwriter.cs: Use the new symbol writer API.
2008
2009 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2010
2011         * Makefile (install-local): Remove.  Functionality moved to
2012         executable.make.
2013
2014 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2015
2016         * Makefile: Install mcs.exe.config file together with mcs.exe.
2017         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2018         correct runtime version.
2019         
2020 2004-07-25  Martin Baulig  <martin@ximian.com>
2021
2022         * class.cs
2023         (TypeContainer.RegisterOrder): Removed, this was unused.
2024         (TypeContainer, interface_order): Removed.
2025         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2026         TypeContainer as argument since we can also be called with a
2027         `PartialContainer' for a partial class/struct/interface.
2028         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2029         of checking whether we're an `Interface' - we could be a
2030         `PartialContainer'.
2031         (PartialContainer.Register): Override; call
2032         AddClass()/AddStruct()/AddInterface() on our parent.
2033
2034         * cs-parser.jay (interface_member_declaration): Add things to the
2035         `current_container', not the `current_class'.
2036
2037         * rootcontext.cs (RegisterOrder): The overloaded version which
2038         takes an `Interface' was unused, removed.
2039
2040         * typemanager.cs (TypeManager.LookupInterface): Return a
2041         `TypeContainer', not an `Interface'.
2042         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2043         contain a `PartialContainer' for an interface, so check it's
2044         `Kind' to figure out what it is.
2045
2046 2004-07-25  Martin Baulig  <martin@ximian.com>
2047
2048         * class.cs (Class.DefaultTypeAttributes): New public constant.
2049         (Struct.DefaultTypeAttributes): Likewise.
2050         (Interface.DefaultTypeAttributes): Likewise.
2051         (PartialContainer.TypeAttr): Override this and add the
2052         DefaultTypeAttributes.
2053
2054 2004-07-25  Martin Baulig  <martin@ximian.com>
2055
2056         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2057         we can just use the `Parent' field instead.
2058
2059 2004-07-25  Martin Baulig  <martin@ximian.com>
2060
2061         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2062
2063 2004-07-25  Martin Baulig  <martin@ximian.com>
2064
2065         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2066         our parts before defining any methods.
2067         (TypeContainer.VerifyImplements): Make this virtual.
2068         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2069         on our PartialContainer.
2070
2071 2004-07-25  Martin Baulig  <martin@ximian.com>
2072
2073         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2074
2075         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2076         argument, we can just use the `Parent' field instead.
2077
2078         * class.cs
2079         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2080         (MemberBase.DoDefine): Likewise.
2081
2082 2004-07-24  Martin Baulig  <martin@ximian.com>
2083
2084         * decl.cs (MemberCore.Parent): New public field.
2085         (DeclSpace.Parent): Moved to MemberCore.
2086
2087         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2088         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2089         parent's .ctor.
2090         (FieldBase, Field, Operator): Likewise.
2091         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2092         (EventField, Event): Likewise.
2093
2094 2004-07-23  Martin Baulig  <martin@ximian.com>
2095
2096         * class.cs (PartialContainer): New public class.
2097         (ClassPart): New public class.
2098         (TypeContainer): Added support for partial classes.
2099         (TypeContainer.GetClassBases): Splitted some of the functionality
2100         out into GetNormalBases() and GetPartialBases().
2101
2102         * cs-tokenizer.cs (Token.PARTIAL): New token.
2103         (Tokenizer.consume_identifier): Added some hacks to recognize
2104         `partial', but only if it's immediately followed by `class',
2105         `struct' or `interface'.
2106
2107         * cs-parser.jay: Added support for partial clases.
2108
2109 2004-07-23  Martin Baulig  <martin@ximian.com>
2110
2111         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2112         a `DeclSpace' and also made it readonly.
2113         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2114         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2115         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2116
2117         * cs-parser.jay: Pass the `current_class', not the
2118         `current_container' (at the moment, this is still the same thing)
2119         to a new Method, Property, Event, Indexer or Constructor.
2120
2121 2004-07-23  Martin Baulig  <martin@ximian.com>
2122
2123         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2124         and removed the `current_interface' one.
2125         (struct_declaration, class_declaration, interface_declaration):
2126         Set `current_class' to the newly created class/struct/interface;
2127         set their `Bases' and call Register() before parsing their body.
2128
2129 2004-07-23  Martin Baulig  <martin@ximian.com>
2130
2131         * class.cs (Kind): New public enum.
2132         (TypeContainer): Made this class abstract.
2133         (TypeContainer.Kind): New public readonly field.
2134         (TypeContainer.CheckDef): New public method; moved here from
2135         cs-parser.jay.
2136         (TypeContainer.Register): New public abstract method.
2137         (TypeContainer.GetPendingImplementations): New public abstract
2138         method.
2139         (TypeContainer.GetClassBases): Removed the `is_class' and
2140         `is_iface' parameters.
2141         (TypeContainer.DefineNestedTypes): Formerly known as
2142         DoDefineType().
2143         (ClassOrStruct): Made this class abstract.
2144
2145         * tree.cs (RootTypes): New public type. 
2146
2147 2004-07-20  Martin Baulig  <martin@ximian.com>
2148
2149         * tree.cs (Tree.RecordNamespace): Removed.
2150         (Tree.Namespaces): Removed.
2151
2152         * rootcontext.cs (RootContext.IsNamespace): Removed.
2153
2154         * cs-parser.jay (namespace_declaration): Just create a new
2155         NamespaceEntry here.
2156
2157 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
2158
2159         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
2160         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
2161         entry to make sure it runs in the correct runtime version.
2162         
2163 2004-07-18  Martin Baulig  <martin@ximian.com>
2164
2165         * generic.cs (ConstructedType.CheckConstraints): Improved
2166         constraints checking.
2167
2168 2004-07-18  Martin Baulig  <martin@ximian.com>
2169
2170         * expression.cs (Invocation.BetterMethod): Call
2171         TypeManager.TypeToCoreType() on all types and removed my previous
2172         hack; we're already doig the right thing here.
2173
2174 2004-07-17  Martin Baulig  <martin@ximian.com>
2175
2176         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
2177
2178 2004-07-16  Martin Baulig  <martin@ximian.com>
2179
2180         * iterators.cs: Added generics support.
2181
2182 2004-07-16  Martin Baulig  <martin@ximian.com>
2183
2184         * iterators.cs: Rewrote this.  We're now using one single Proxy
2185         class for both the IEnumerable and the IEnumerator interface and
2186         `Iterator' derives from Class so we can use the high-level API.
2187
2188         * class.cs (TypeContainer.AddIterator): New method.
2189         (TypeContainer.DoDefineType): New protected virtual method, which
2190         is called from DefineType().
2191         (TypeContainer.DoDefineMembers): Call DefineType() and
2192         DefineMembers() on all our iterators.
2193         (TypeContainer.Emit): Call Emit() on all our iterators.
2194         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2195
2196         * codegen.cs (EmitContext.CurrentIterator): New public field.
2197
2198 2004-07-15  Martin Baulig  <martin@ximian.com>
2199
2200         * typemanager.cs
2201         (TypeManager.not_supported_exception_type): New type.   
2202
2203 2004-07-14  Martin Baulig  <martin@ximian.com>
2204
2205         * typemanager.cs
2206         (TypeManager.generic_ienumerable_type): New type.
2207         (TypeManager.generic_ienumerator_type): New type.
2208
2209         * rootcontext.cs
2210         (RootContext.interfaces_first_stage): Added
2211         "System.Collections.Generic.IEnumerator`1" and
2212         "System.Collections.Generic.IEnumerable`1".     
2213
2214 2004-07-14  Martin Baulig  <martin@ximian.com>
2215
2216         * iterators.cs: Use real error numbers.
2217
2218 2004-07-14  Martin Baulig  <martin@ximian.com>
2219
2220         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2221         requires this to be a System.Collection.IEnumerable and not a
2222         class implementing that interface.
2223         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2224
2225 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2226
2227         * class.cs: Fixed previous fix, it broke some error tests.
2228
2229 2004-07-12  Martin Baulig  <martin@ximian.com>
2230
2231         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2232         Fixes #61293.
2233
2234 2004-07-14  Martin Baulig  <martin@ximian.com>
2235
2236         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
2237         an exclamation mark (!) for the generic arity to reflect the
2238         latest spec changes; ie. use "System.Collections.Generic.IList`1".
2239
2240 2004-07-13  Martin Baulig  <martin@ximian.com>
2241
2242         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
2243         specifiers being part of a type argument.
2244
2245 2004-07-13  Martin Baulig  <martin@ximian.com>
2246
2247         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
2248         name for generic types.
2249
2250 2004-07-13  Martin Baulig  <martin@ximian.com>
2251
2252         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
2253         bit to fix #60119.
2254
2255 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2256
2257         * assign.cs (LocalTemporary): Add new argument: is_address,If
2258         `is_address' is true, then the value that we store is the address
2259         to the real value, and not the value itself.
2260         
2261         * ecore.cs (PropertyExpr): use the new local temporary
2262         stuff to allow us to handle X.Y += z (where X is a struct)
2263
2264 2004-07-08  Martin Baulig  <martin@ximian.com>
2265
2266         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2267         not always return, just like we're doing in Using.Resolve().
2268
2269 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2270
2271         * cs-parser.jay (fixed_statement): flag this as Pinned.
2272
2273 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2274
2275         * typemanager.cs (TypeManager): Removed MakePinned method, this
2276         mechanism is replaced with the .NET 2.x compatible mechanism of
2277         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2278
2279         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2280         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2281         `IsFixed' property which has a different meaning.
2282
2283 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2284
2285         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2286         visible from inside a nested class, not just the names of the
2287         immediately enclosing class.
2288         Fix for bug #60730.
2289
2290 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2291
2292         * expression.cs (BetterConversion): Remove buggy special-case
2293         handling of "implicit constant expression conversions".  At this
2294         point, we already know that the conversion is possible -- we're
2295         only checking to see which is better.
2296
2297 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2298
2299         * cs-parser.jay: Added error CS0210 test.
2300
2301 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2302
2303         * cs-parser.jay: Added error CS0134 test.
2304
2305 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2306
2307         Fix bug #52507
2308         * cs-parser.jay: Added error CS0145 test.
2309
2310 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2311
2312         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2313
2314 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2315         
2316         * expression.cs (StackAlloc.Resolve): The argument may not
2317         be a constant; deal with this case.
2318         
2319 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2320
2321         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2322         GetIndexerAttributeValue.
2323         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2324
2325         * class.cs (Indexer.Define): Added error tests for CS0415,
2326         CS0609.
2327
2328 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2329
2330         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2331         property code.
2332
2333 2004-06-23  Martin Baulig  <martin@ximian.com>
2334
2335         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2336         neither return nor throw, reset the barrier as well.  Fixes #60457.
2337
2338 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2339
2340         * class.cs : EventAttributes is now set to None by default.
2341           This fixes bug #60459.
2342
2343 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2344
2345         Fix bug #60219
2346         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2347         Don't throw exception but return null (it's sufficient now).
2348
2349 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2350
2351         * typemanager.cs (GetArgumentTypes): Faster implementation.
2352
2353 2004-06-18  Martin Baulig  <martin@ximian.com>
2354
2355         * attribute.cs (Attribute.Resolve): Check whether we're an
2356         EmptyCast which a Constant child.  Fixes #60333.
2357
2358 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2359
2360         * statement.cs (EmitCollectionForeach): Account for the fact that
2361         not all valuetypes are in areas which we can take the address of.
2362         For these variables, we store to a temporary variable. Also, make
2363         sure that we dont emit a `callvirt' on a valuetype method.
2364
2365 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2366
2367         * expression.cs (StackAlloc.DoReSolve): Added test for
2368         negative parameter (CS0247).
2369
2370 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2371
2372         Fix bug #59792
2373         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2374
2375 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2376
2377         Fix bug #59781
2378         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2379         ulong.
2380
2381 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2382
2383         Fix bug #58254 & cs1555.cs, cs1556.cs
2384         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2385
2386 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2387
2388         * cs-parser.jay: Added error CS1669 test for indexers.
2389
2390 2004-06-18  Martin Baulig  <martin@ximian.com>
2391
2392         * generics.cs (GenericMethod.ctor): Don't take an Attributes
2393         argument.  Fixes #60441.
2394
2395 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
2396         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
2397         The name needs to have the actual name of the method in order
2398         for other tests (such as the one in OverloadResolve for Invoke
2399         on a delegate) to work. As well, it does not really help
2400         error reporting because the method group had multiple methods.
2401         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
2402         Make profiling work.
2403         
2404 2004-06-13  Martin Baulig  <martin@ximian.com>
2405
2406         * cs-parser.jay: Don't allow generic attributes.
2407
2408 2004-06-13  Martin Baulig  <martin@ximian.com>
2409
2410         * class.cs (MemberBase.DoDefineBase): New protected method.
2411         (MemberBase.DoDefine): Compute the `flags' in the new
2412         DoDefineBase() which must be called first.
2413         (Method.Define): Call DoDefineBase() first so we have the flags
2414         when defining the generic method.
2415
2416         * cs-parser.jay (interface_method_declaration): Support generic methods.
2417
2418 2004-06-13  Martin Baulig  <martin@ximian.com>
2419
2420         * decl.cs (TypeName): Removed.
2421         (MemberName): Removed TypeName and MemberNow; now we just have
2422         MemberName.
2423
2424         * cs-parser.jay: Don't distinguish between type arguments and type
2425         parameters in the grammar and simplified the rules a bit.  The
2426         reduce/reduce conflicts are now gone (except the one we inherited
2427         from mcs).
2428
2429 2004-06-11  Martin Baulig  <martin@ximian.com>
2430
2431         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2432         call this twice: for params and varargs methods.
2433
2434 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2435
2436         * class.cs:
2437         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2438
2439 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2440
2441         * attribute.cs (Attribute.GetValidTargets): Made public.
2442
2443         * class.cs: 
2444         (AbstractPropertyEventMethod): New class for better code sharing.
2445         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2446         CS1667 report.
2447         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2448
2449 2004-06-09  Martin Baulig  <martin@ximian.com>
2450
2451         * cs-parser.jay: Removed a reduce/reduce conflict.
2452
2453 2004-06-03  Martin Baulig  <martin@ximian.com>
2454
2455         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
2456         GetSimpleName() and return a SimpleName.
2457
2458         * ecore.cs (SimpleName.Arguments): New public field.
2459         (SimpleName): Added overloaded ctor which takes an additional
2460         TypeArguments argument.
2461         (SimpleName.SimpleNameResolve): Added support for generic methods.
2462         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
2463         formerly in MemberAccess.DoResolve(), but we also need it in
2464         SimpleNameResolve().
2465
2466         * expression.cs (MemberAccess.DoResolve): Use the new
2467         MethodGroupExpr.ResolveGeneric().       
2468
2469 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2470
2471         * decl.cs: If possible, use lookuptypedirect here. We can only do
2472         this if there is no `.' after the namespace. Avoids using
2473         LookupType, which does lots of slow processing.
2474         (FindNestedType) New method, does what it says :-).
2475         * namespace.cs: use LookupTypeDirect.
2476         * rootcontext.cs: use membercache, if possible.
2477         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2478
2479 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2480
2481         * expression.cs:
2482         According to the spec, 
2483
2484         In a member access of the form E.I, if E is a single identifier,
2485         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2486         field, property, localvariable, or parameter with the same type as
2487         the meaning of E as a type-name (§3.8), then both possible
2488         meanings of E are permitted.
2489
2490         We did not check that E as a simple-name had the same type as E as
2491         a type name.
2492
2493         This trivial check gives us 5-7% on bootstrap time.
2494
2495 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2496
2497         * expression.cs (Invocation.OverloadResolve): Avoid the
2498         use of hashtables and boxing here by allocating on demand.
2499
2500 2004-05-30  Martin Baulig  <martin@ximian.com>
2501
2502         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2503         we're doing a silent lookup.  Don't try to lookup nested types in
2504         TypeManager.object_type (thanks to Ben Maurer).
2505
2506 2004-05-30  Martin Baulig  <martin@ximian.com>
2507
2508         Committing a patch from Ben Maurer.
2509
2510         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2511
2512 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2513
2514         * convert.cs: add a trivial cache for overload operator resolution.
2515
2516 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
2517
2518         * attribute.cs
2519         (AttributeTester.GetObsoleteAttribute): Returns instance of
2520         ObsoleteAttribute when type is obsolete.
2521
2522         * class.cs
2523         (TypeContainer.VerifyObsoleteAttribute): Override.
2524         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2525         (MethodCode.VerifyObsoleteAttribute): Override.
2526         (MemberBase.VerifyObsoleteAttribute): Override.
2527
2528         * decl.cs
2529         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2530         and report proper error.
2531
2532         *delegate.cs
2533         (Delegate.VerifyObsoleteAttribute): Override.
2534
2535         * ecore.cs
2536         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2537         and report proper error.
2538         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2539
2540         * enum.cs
2541         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2542         and enum member.
2543
2544         * expression.cs
2545         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2546         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2547         Added test for ObsoleteAttribute.
2548
2549         * statement.cs
2550         (Catch): Derived from Statement.
2551
2552 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2553
2554         * decl.cs: If possible, use lookuptypedirect here. We can only do
2555         this if there is no `.' after the namespace. Avoids using
2556         LookupType, which does lots of slow processing.
2557         (FindNestedType) New method, does what it says :-).
2558         * namespace.cs: use LookupTypeDirect.
2559         * rootcontext.cs: use membercache, if possible.
2560         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2561
2562 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2563
2564         * expression.cs:
2565         According to the spec, 
2566
2567         In a member access of the form E.I, if E is a single identifier,
2568         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2569         field, property, localvariable, or parameter with the same type as
2570         the meaning of E as a type-name (§3.8), then both possible
2571         meanings of E are permitted.
2572
2573         We did not check that E as a simple-name had the same type as E as
2574         a type name.
2575
2576         This trivial check gives us 5-7% on bootstrap time.
2577
2578 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2579
2580         Fixed bug #59071 & cs0160.cs
2581         * statement.cs (Try.Resolve): Check here whether order of catch
2582         clauses matches their dependencies.
2583
2584 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2585
2586         Fixed bug #58624
2587         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
2588         unsafe type.
2589
2590 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2591
2592         * expression.cs (Invocation.OverloadResolve): Avoid the
2593         use of hashtables and boxing here by allocating on demand.
2594
2595 2004-05-30  Martin Baulig  <martin@ximian.com>
2596
2597         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2598         we're doing a silent lookup.  Don't try to lookup nested types in
2599         TypeManager.object_type (thanks to Ben Maurer).
2600
2601 2004-05-30  Martin Baulig  <martin@ximian.com>
2602
2603         Committing a patch from Ben Maurer.
2604
2605         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
2606
2607 2004-05-29  Martin Baulig  <martin@ximian.com>
2608
2609         * class.cs (IMethodData.ShouldIgnore): New method.
2610
2611         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2612         `Location' argument, we don't need it anywhere.  Use
2613         `IMethodData.ShouldIgnore ()' instead of
2614         `MethodData.GetMethodFlags ()'.
2615         (TypeManager.AddMethod): Removed.
2616         (TypeManager.AddMethod2): Renamed to AddMethod.
2617
2618 2004-05-29  Martin Baulig  <martin@ximian.com>
2619
2620         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2621
2622         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2623         converting from a class type S to an interface type and we already
2624         have an object on the stack, don't box it again.  Fixes #52578.
2625
2626 2004-05-29  Martin Baulig  <martin@ximian.com>
2627
2628         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2629         Added support for `params' parameters.  Fixes #59267.
2630
2631 2004-05-29  Martin Baulig  <martin@ximian.com>
2632
2633         * literal.cs (NullPointer): Provide a private .ctor which sets
2634         `type' to TypeManager.object_type.  Fixes #59048.
2635
2636 2004-05-29  Martin Baulig  <martin@ximian.com>
2637
2638         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2639         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2640
2641         * ecore.cs (EventExpr.instance_expr): Make the field private.
2642
2643 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2644
2645         Fixed bug #50080 & cs0214-2.cs
2646         * expression.cs (Cast.DoResolve): Check unsafe context here.
2647         
2648         * statement.cs (Resolve.DoResolve): Likewise.
2649
2650 2004-05-26  Martin Baulig  <martin@ximian.com>
2651
2652         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2653
2654         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2655         (RootContext.LookupType): Pass down the `silent' flag.
2656
2657 2004-05-25  Martin Baulig  <martin@ximian.com>
2658
2659         * expression.cs
2660         (MethodGroupExpr.IdenticalTypeName): New public property.
2661         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2662         expression actually refers to a type.
2663
2664 2004-05-25  Martin Baulig  <martin@ximian.com>
2665
2666         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2667         for #56176 and made it actually work.
2668
2669 2004-05-25  Martin Baulig  <martin@ximian.com>
2670
2671         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2672         (FieldExpr, PropertyExpr): Override and implement
2673         CacheTemporaries.  Fixes #52279.
2674
2675 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2676
2677         * location.cs: In the new compiler listing a file twice is a
2678         warning, not an error.
2679
2680 2004-05-24  Martin Baulig  <martin@ximian.com>
2681
2682         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2683         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2684
2685 2004-05-24  Martin Baulig  <martin@ximian.com>
2686
2687         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2688         walking the `using' list.  Fixes #53921.
2689
2690 2004-05-24  Martin Baulig  <martin@ximian.com>
2691
2692         * const.cs (Const.LookupConstantValue): Added support for
2693         EmptyCast's; fixes #55251.
2694
2695 2004-05-24  Martin Baulig  <martin@ximian.com>
2696
2697         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2698         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2699         which does the CS0135 check.  The reason is that we first need to
2700         check whether the variable actually exists.
2701
2702 2004-05-24  Martin Baulig  <martin@ximian.com>
2703
2704         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2705         than RootContext.LookupType() to find the explicit interface
2706         type.  Fixes #58584.
2707
2708 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2709
2710         * Makefile: Simplify.  Use executable.make.
2711         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2712
2713 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2714
2715         * decl.cs:
2716         * enum.cs:
2717         Use the invariant culture when doing String.Compare for CLS case
2718         sensitivity.
2719         
2720 2004-05-23  Martin Baulig  <martin@ximian.com>
2721
2722         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2723         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2724
2725         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2726
2727 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2728
2729         * class.cs (MemberBase.Define): Reuse MemberType member for 
2730         resolved type. Other methods can use it too.
2731
2732 2004-05-23  Martin Baulig  <martin@ximian.com>
2733
2734         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2735         the variable also exists in the current block (otherwise, we need
2736         to report a CS0103).  Fixes #58670.
2737
2738 2004-05-23  Martin Baulig  <martin@ximian.com>
2739
2740         * flowanalysis.cs (Reachability.Reachable): Compute this
2741         on-the-fly rather than storing it as a field.
2742
2743 2004-05-23  Martin Baulig  <martin@ximian.com>
2744
2745         * flowanalysis.cs (Reachability.And): Manually compute the
2746         resulting `barrier' from the reachability.      
2747        
2748 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2749
2750         Fix bug #57835
2751         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2752         instance of ObsoleteAttribute when symbol is obsolete.
2753
2754         * class.cs
2755         (IMethodData): Extended interface for ObsoleteAttribute support.
2756
2757 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2758
2759         * attribute.cs: Fix bug #55970
2760
2761 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2762
2763         Fix bug #52705
2764         * attribute.cs
2765         (GetObsoleteAttribute): New method. Creates the instance of
2766         ObsoleteAttribute.
2767         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2768         ObsoleteAttribute when member is obsolete.
2769         (AttributeTester.Report_ObsoleteMessage): Common method for
2770         Obsolete error/warning reporting.
2771
2772         * class.cs
2773         (TypeContainer.base_classs_type): New member for storing parent type.
2774
2775         * decl.cs
2776         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2777         for this MemberCore.
2778
2779 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2780
2781         * attribute.cs, const.cs: Fix bug #58590
2782
2783 2004-05-21  Martin Baulig  <martin@ximian.com>
2784
2785         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2786         out parameters if the end of the method is unreachable.  Fixes
2787         #58098. 
2788
2789 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2790
2791         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2792         Hari was right, why extra method.
2793
2794 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2795
2796         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2797
2798 2004-05-20  Martin Baulig  <martin@ximian.com>
2799
2800         * delegate.cs: Convert this file to Unix mode - like the original
2801         version in mcs is.
2802
2803 2004-05-20  Martin Baulig  <martin@ximian.com>
2804
2805         * attribute.cs: Convert this file to Unix mode - like the original
2806         version in mcs is.
2807
2808 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2809
2810        Fix bug #58688 (MCS does not report error when the same attribute
2811        is assigned twice)
2812
2813        * attribute.cs (Attribute.Emit): Distinction between null and default.
2814
2815 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2816
2817        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2818        of a top-level attribute without an attribute target.
2819        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2820        Make non-static.
2821        (Attribute.Conditional_GetConditionName), 
2822        (Attribute.Obsolete_GetObsoleteMessage): Update.
2823        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2824        part of ScanForIndexerName.
2825        (Attribute.CanIgnoreInvalidAttribute): New function.
2826        (Attribute.ScanForIndexerName): Move to ...
2827        (Attributes.ScanForIndexerName): ... here.
2828        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2829        (Attributes.Search): New internal variant that can choose not to
2830        complain if types aren't resolved.  The original signature now
2831        complains.
2832        (Attributes.GetClsCompliantAttribute): Use internal variant, with
2833        complaints suppressed.
2834        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2835        only if it not useful.
2836        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2837        top-level for attributes that are shared between the assembly
2838        and a top-level class.
2839        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2840        * class.cs: Update to reflect changes.
2841        (DefineIndexers): Fuse loops.
2842        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2843        a couple more variants of attribute names.
2844
2845 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2846
2847         Fix bug #52585 (Implemented explicit attribute declaration)
2848
2849         * attribute.cs:
2850         (Attributable.ValidAttributeTargets): New abstract method. It gets
2851         list of valid attribute targets for explicit target declaration.
2852         (Attribute.Target): It holds target itself.
2853         (AttributeSection): Removed.
2854         (Attribute.CheckTargets): New method. It checks whether attribute
2855         target is valid for the current element.
2856
2857         * class.cs:
2858         (EventProperty): New class. For events that are declared like
2859         property (with add and remove accessors).
2860         (EventField): New class. For events that are declared like field.
2861         class.cs
2862
2863         * cs-parser.jay: Implemented explicit attribute target declaration.
2864
2865         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2866         Override ValidAttributeTargets.
2867
2868         * parameter.cs:
2869         (ReturnParameter): Class for applying custom attributes on 
2870         the return type.
2871         (ParameterAtribute): New class. Class for applying custom
2872         attributes on the parameter type.
2873
2874 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
2875
2876         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
2877         definitions. 
2878
2879         (Method): Allow UNSAFE here.
2880
2881         * modifiers.cs: Support unsafe reporting.
2882
2883 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
2884
2885         * decl.cs: Fix bug #58478.
2886
2887 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2888
2889         * statement.cs: When checking for unreachable code on an EmptyStatement,
2890         set the location. Fixes bug #58488.
2891
2892 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
2893
2894         * driver.cs: Add -pkg handling.
2895
2896         From Gonzalo: UseShelLExecute=false
2897
2898 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
2899
2900         * attribute.cs:
2901         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
2902         for attribute.
2903         (Attribute.IsClsCompliaceRequired): Moved to base for better
2904         accesibility.
2905         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
2906         when attribute is AttributeUsageAttribute.
2907         (Attribute.GetValidTargets): Simplified.
2908         (Attribute.GetAttributeUsage): New method returns AttributeUsage
2909         attribute for this type.
2910         (Attribute.ApplyAttributes): Method renamed to Emit and make
2911         non-static.
2912         (GlobalAttributeSection): New class for special handling of global
2913         attributes (assembly, module).
2914         (AttributeSection.Emit): New method.
2915
2916         * class.cs: Implemented Attributable abstract methods.
2917         (MethodCore.LabelParameters): Moved to Parameter class.
2918         (Accessor): Is back simple class.
2919         (PropertyMethod): Implemented Attributable abstract class.
2920         (DelegateMethod): Implemented Attributable abstract class.
2921         (Event): New constructor for disctintion between normal Event
2922         and Event with accessors.
2923
2924         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
2925
2926         * codegen.cs, const.cs, decl.cs, delegate.cs:
2927         (CommonAssemblyModulClass): Implemented Attributable abstract class
2928         and simplified.
2929
2930         * enum.cs: Implement IAttributeSupport interface.
2931         (EnumMember): New class for emum members. Implemented Attributable
2932         abstract class
2933
2934         * parameter.cs:
2935         (ParameterBase): Is abstract.
2936         (ReturnParameter): New class for easier [return:] attribute handling.
2937
2938         * typemanager.cs: Removed builder_to_attr.
2939
2940 2004-05-11  Raja R Harinath  <rharinath@novell.com>
2941
2942         Fix bug #57151.
2943         * attribute.cs (Attribute.GetPositionalValue): New function.
2944         * class.cs (TypeContainer.VerifyMembers): New function.
2945         (TypeContainer.Emit): Use it.
2946         (ClassOrStruct): New base class for Class and Struct.
2947         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
2948         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
2949         class.
2950         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
2951         then each non-static field should have a FieldOffset attribute.
2952         Otherwise, none of the fields should have a FieldOffset attribute.
2953         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
2954         and FieldOffset attributes.
2955         * typemanager.cs (TypeManager.struct_layout_attribute_type)
2956         (TypeManager.field_offset_attribute_type): New core types.
2957         (TypeManager.InitCoreTypes): Initialize them.
2958
2959 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
2960
2961         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
2962         Return correct type.
2963         From bug #58270.
2964
2965 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
2966
2967         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
2968         be implicitly converted to ulong.
2969         
2970         * expression.cs: The logic for allowing operator &, | and ^ worked
2971         was wrong, it worked before because we did not report an error in
2972         an else branch.  Fixes 57895.
2973
2974         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
2975         allow volatile fields to be reference types.
2976
2977 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
2978
2979         * driver.cs: Add support for /debug-
2980
2981 2004-05-07  Raja R Harinath  <rharinath@novell.com>
2982
2983         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
2984         Add a 'complain' parameter to silence errors.
2985         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
2986         silently overlooked type-resolutions.
2987         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
2988         to reflect changes.
2989         (Attributes.Search): New function.
2990         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
2991         (Attributes.GetAttributeFullName): Remove hack.
2992         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
2993         Update to reflect changes.
2994         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
2995         Use Attributes.Search instead of nested loops.
2996
2997 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
2998
2999         * decl.cs:
3000         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3001         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3002         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3003
3004         * report.cs: (Report.Warning): Renamed to Warning_T because of
3005         parameter collision.
3006
3007 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3008
3009         * expression.cs (MemberAccess.ResolveMemberAccess):
3010         Exit with non-zero status after Report.Error.
3011         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3012         Likewise.
3013         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3014
3015 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3016
3017         * support.cs: Don't hang when the file is empty.
3018
3019 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3020
3021         * support.cs: In SeekableStreamReader, compute the preamble size of the
3022           underlying stream. Position changes should take into account that initial
3023           count of bytes.
3024
3025 2004-05-03  Todd Berman  <tberman@sevenl.net>
3026
3027         * driver.cs: remove unused GetSysVersion function.
3028
3029 2004-05-03  Todd Berman  <tberman@sevenl.net>
3030
3031         * driver.cs: Remove the hack from saturday, as well as the hack
3032         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3033         link_paths to get that bit proper.
3034
3035 2004-05-01  Todd Berman  <tberman@sevenl.net>
3036
3037         * driver.cs: Try a LoadFrom before a Load, this checks the current
3038         path. This is currently a bug in mono that is be fixed, however, this
3039         provides a workaround for now. This will be removed when the bug
3040         is fixed.
3041
3042 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3043
3044         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3045         incomplete key pairs (#57941).
3046
3047 2004-05-01  Todd Berman  <tberman@sevenl.net>
3048
3049         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3050         from the GAC
3051
3052 2004-04-30  Jackson Harper  <jackson@ximian.com>
3053
3054         * codegen.cs: Open keys readonly.
3055         
3056 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3057
3058         * typemanager.cs: don't report cyclic struct layout when a struct
3059         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3060         which has 2 Pango.Rectangle fields.
3061
3062 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3063
3064         * expression.cs: Handle IntPtr comparisons with IL code
3065         rather than a method call.
3066
3067 2004-04-29  Martin Baulig  <martin@ximian.com>
3068
3069         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3070         the list of PropertyInfo's in class hierarchy and find the
3071         accessor.  Fixes #56013.
3072
3073 2004-04-29  Martin Baulig  <martin@ximian.com>
3074
3075         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3076
3077 2004-04-29  Martin Baulig  <martin@ximian.com>
3078
3079         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3080
3081         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3082
3083 2004-04-29  Martin Baulig  <martin@ximian.com>
3084
3085         * class.cs (ConstructorInitializer.Resolve): Check whether the
3086         parent .ctor is accessible.  Fixes #52146.
3087
3088 2004-04-29  Martin Baulig  <martin@ximian.com>
3089
3090         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3091
3092         * statement.cs (Using.EmitLocalVariableDecls): Use
3093         TypeManager.idisposable_type, not typeof (IDisposable).
3094         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3095
3096 2004-04-29  Martin Baulig  <martin@ximian.com>
3097
3098         * class.cs (Event.Define): Don't emit the field and don't set
3099         RTSpecialName and SpecialName for events on interfaces.  Fixes
3100         #57703. 
3101
3102 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3103
3104         Refactor Attribute.ApplyAttributes.
3105         * attribute.cs (Attributable): New base class for objects that can
3106         have Attributes applied on them.
3107         (Attribute): Make AttributeUsage fields public.
3108         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3109         (Attribute.IsInternalCall): New property.
3110         (Attribute.UsageAttr): Convert to a public read-only property.
3111         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3112         (Attribute.ResolveType, Attribute.Resolve)
3113         (Attribute.ScanForIndexerName): Update to reflect changes.
3114         (Attribute.CheckAttributeTarget): Re-format.
3115         (Attribute.ApplyAttributes): Refactor, to various
3116         Attributable.ApplyAttributeBuilder methods.
3117         * decl.cs (MemberCore): Make Attributable.
3118         * class.cs (Accessor): Make Attributable.
3119         (MethodData.ApplyAttributes): Use proper attribute types, not
3120         attribute names.
3121         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3122         (TypeContainer.ApplyAttributeBuilder)
3123         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3124         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3125         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3126         (Operator.ApplyAttributeBuilder): New factored-out methods.
3127         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3128         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3129         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3130         * parameter.cs (ParameterBase): New Attributable base class
3131         that can also represent Return types.
3132         (Parameter): Update to the changes.
3133
3134 2004-04-29  Jackson Harper  <jackson@ximian.com>
3135
3136         * driver.cs: Prefer the corlib system version when looking for
3137         assemblies in the GAC. This is still a hack, but its a better hack
3138         now.
3139         
3140 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3141
3142         * decl.cs, enum.cs: Improved error 3005 reporting.
3143   
3144         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3145         (related_symbols): New private member for list of symbols
3146         related to reported error/warning.
3147         
3148         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3149
3150 2004-04-29  Martin Baulig  <martin@ximian.com>
3151
3152         * ecore.cs (Expression.Constantify): If we're an enum and
3153         TypeManager.TypeToCoreType() doesn't give us another type, use
3154         t.UnderlyingSystemType.  Fixes #56178.  
3155
3156 2004-04-29  Martin Baulig  <martin@ximian.com>
3157
3158         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3159         interfaces and for each interface, only add members directly
3160         declared in that interface.  Fixes #53255.
3161
3162 2004-04-28  Martin Baulig  <martin@ximian.com>
3163
3164         * expression.cs (ConditionalLogicalOperator): Use a temporary
3165         variable for `left' to avoid that we evaluate it more than once;
3166         bug #52588.
3167
3168 2004-04-28  Martin Baulig  <martin@ximian.com>
3169
3170         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3171         `void[]' (CS1547).
3172
3173 2004-04-28  Martin Baulig  <martin@ximian.com>
3174
3175         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3176         void (CS1547).
3177
3178         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3179         whether the type is not void (CS1547).
3180
3181 2004-04-28  Martin Baulig  <martin@ximian.com>
3182
3183         * expression.cs (Unary.DoResolveLValue): Override this and report
3184         CS0131 for anything but Operator.Indirection.
3185
3186 2004-04-28  Martin Baulig  <martin@ximian.com>
3187
3188         Committing a patch from Ben Maurer; see bug #50820.
3189
3190         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3191         check for classes.
3192
3193         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3194         classes.        
3195
3196 2004-04-28  Martin Baulig  <martin@ximian.com>
3197
3198         Committing a patch from Ben Maurer; see bug #50820.
3199
3200         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3201         check for classes.
3202
3203         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3204         classes.        
3205
3206 2004-04-28  Martin Baulig  <martin@ximian.com>
3207
3208         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3209         (Block.AddLabel): Call DoLookupLabel() to only search in the
3210         current block.
3211
3212 2004-04-28  Martin Baulig  <martin@ximian.com>
3213
3214         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3215         comparing StringConstants and NullLiterals in Equality and Inequality.
3216
3217 2004-04-28  Jackson Harper  <jackson@ximian.com>
3218
3219         * driver.cs: Attempt to load referenced assemblies from the
3220         GAC. This is the quick and dirty version of this method that
3221         doesnt take into account versions and just takes the first
3222         canidate found. Will be good enough for now as we will not have more
3223         then one version installed into the GAC until I update this method.
3224
3225 2004-04-28  Martin Baulig  <martin@ximian.com>
3226
3227         * typemanager.cs (TypeManager.CheckStructCycles): New public
3228         static method to check for cycles in the struct layout.
3229
3230         * rootcontext.cs (RootContext.PopulateTypes): Call
3231         TypeManager.CheckStructCycles() for each TypeContainer.
3232         [Note: We only need to visit each type once.]
3233
3234 2004-04-28  Martin Baulig  <martin@ximian.com>
3235
3236         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3237
3238         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3239         success and added `out object value'.  Use a `bool resolved' field
3240         to check whether we've already been called rather than
3241         `ConstantValue != null' since this breaks for NullLiterals.
3242
3243 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3244
3245         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3246         setting of this flag, since the 'set' method may be non-public.
3247
3248 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3249
3250         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3251         check on current_vector.Block.
3252
3253 2004-04-27  Martin Baulig  <martin@ximian.com>
3254
3255         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3256         a field initializer.  Fixes #56459.
3257
3258 2004-04-27  Martin Baulig  <martin@ximian.com>
3259
3260         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3261         we're not attempting to use an indexer.  Fixes #52154.
3262
3263 2004-04-27  Martin Baulig  <martin@ximian.com>
3264
3265         * statement.cs (Return): Don't create a return label if we don't
3266         need it; reverts my change from January 20th.  Thanks to Ben
3267         Maurer for this.
3268
3269 2004-04-27  Martin Baulig  <martin@ximian.com>
3270
3271         According to the spec, `goto' can only leave a nested scope, but
3272         never enter it.
3273
3274         * statement.cs (Block.LookupLabel): Only lookup in the current
3275         block, don't recurse into parent or child blocks.
3276         (Block.AddLabel): Check in parent and child blocks, report
3277         CS0140/CS0158 if we find a duplicate.
3278         (Block): Removed this indexer for label lookups.
3279         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3280         this already does the error reporting for us.
3281
3282         * flowanalysis.cs
3283         (FlowBranching.UsageVector.Block): New public variable; may be null.
3284         (FlowBranching.CreateSibling): Added `Block' argument.
3285         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3286         label for the target of a `goto' and check whether we're not
3287         leaving a `finally'.
3288
3289 2004-04-27  Martin Baulig  <martin@ximian.com>
3290
3291         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3292         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3293         just for returns).
3294
3295 2004-04-27  Martin Baulig  <martin@ximian.com>
3296
3297         * statement.cs (Block.AddLabel): Also check for implicit blocks
3298         and added a CS0158 check.
3299
3300 2004-04-27  Martin Baulig  <martin@ximian.com>
3301
3302         * flowanalysis.cs (FlowBranchingLoop): New class.
3303         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3304         UsageVector's instead of an ArrayList.
3305         (FlowBranching.Label): Likewise.
3306         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3307         (FlowBranching.AddBreakVector): New method.
3308
3309 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3310
3311         * attribute.cs: Small regression fix: only convert the type if we
3312         the type is different, fixes System.Drawing build.
3313
3314 2004-04-27  Martin Baulig  <martin@ximian.com>
3315
3316         * attribute.cs (Attribute.Resolve): If we have a constant value
3317         for a named field or property, implicity convert it to the correct
3318         type.
3319
3320 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3321
3322         * statement.cs (Block.Block): Implicit blocks share
3323         'child_variable_names' fields with parent blocks.
3324         (Block.AddChildVariableNames): Remove.
3325         (Block.AddVariable): Mark variable as "used by a child block" in
3326         every surrounding block.
3327         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3328         been used in a child block, complain about violation of "Invariant
3329         meaning in blocks" rule.
3330         * cs-parser.jay (declare_local_variables): Don't use
3331         AddChildVariableNames.
3332         (foreach_statement): Don't create an implicit block: 'foreach'
3333         introduces a scope.
3334
3335 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3336
3337         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3338         converting from 0L to ulong.  Fixes 57522.
3339
3340 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3341
3342         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3343         derived class hides via 'new' keyword field from base class (test-242.cs).
3344         TODO: Handle this in the more general way.
3345         
3346         * class.cs (CheckBase): Ditto.
3347
3348 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3349
3350         * decl.cs (caching_flags): New member for storing cached values
3351         as bit flags.
3352         (MemberCore.Flags): New enum where bit flags for caching_flags
3353         are defined.
3354         (MemberCore.cls_compliance): Moved to caching_flags.
3355         (DeclSpace.Created): Moved to caching_flags.
3356
3357         * class.cs: Use caching_flags instead of DeclSpace.Created
3358         
3359 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3360
3361         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3362         if we are only a derived class, not a nested class.
3363
3364         * typemanager.cs: Same as above, but do this at the MemberLookup
3365         level (used by field and methods, properties are handled in
3366         PropertyExpr).   Allow for the qualified access if we are a nested
3367         method. 
3368
3369 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3370
3371         * class.cs: Refactoring.
3372         (IMethodData): New inteface; Holds links to parent members
3373         to avoid member duplication (reduced memory allocation).
3374         (Method): Implemented IMethodData interface.
3375         (PropertyBase): New inner classes for get/set methods.
3376         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3377         (Event): New inner classes for add/remove methods.
3378         (Event.DelegateMethod): Implemented IMethodData interface.
3379
3380         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3381         EmitContext (related to class.cs refactoring).
3382
3383 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3384
3385         * delegate.cs (Delegate.VerifyApplicability): If the number of
3386         arguments are the same as the number of parameters, first try to
3387         verify applicability ignoring  any 'params' modifier on the last
3388         parameter.
3389         Fixes #56442.
3390
3391 2004-04-08  Martin Baulig  <martin@ximian.com>
3392
3393         Merged latest changes into gmcs.  Please keep this comment in
3394         here, it makes it easier for me to see what changed in MCS since
3395         the last time I merged.
3396
3397 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3398
3399         * class.cs (TypeContainer.AddIndexer): Use
3400         'ExplicitInterfaceName' to determine if interface name was
3401         explicitly specified.  'InterfaceType' is not initialized at this time.
3402         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3403         Indexers array is already in the required order.  Initialize
3404         'IndexerName' only if there are normal indexers.
3405         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3406         (TypeContainer.Emit): Emit DefaultMember attribute only if
3407         IndexerName is initialized.
3408         Fixes #56300.
3409
3410 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3411
3412         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3413         Fixes #57007
3414
3415 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3416
3417         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3418         attributes.
3419         Fix for #56456.
3420
3421         * attribute.cs (Attribute.Resolve): Check for duplicate named
3422         attributes.
3423         Fix for #56463.
3424
3425 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3426
3427         * iterators.cs (MarkYield): track whether we are in an exception,
3428         and generate code accordingly.  Use a temporary value to store the
3429         result for our state.
3430
3431         I had ignored a bit the interaction of try/catch with iterators
3432         since their behavior was not entirely obvious, but now it is
3433         possible to verify that our behavior is the same as MS .NET 2.0
3434
3435         Fixes 54814
3436
3437 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3438
3439         * iterators.cs: Avoid creating temporaries if there is no work to
3440         do. 
3441
3442         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3443         Enumerations, use TypeManager.EnumToUnderlying and call
3444         recursively. 
3445
3446         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3447         bug #57013
3448
3449         (This.Emit): Use EmitContext.EmitThis to emit our
3450         instance variable.
3451
3452         (This.EmitAssign): Ditto.
3453
3454         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3455         codepaths, we will move all the functionality into
3456         Mono.CSharp.This 
3457
3458         (FieldExpr.EmitAssign): Ditto.
3459
3460         This fixes several hidden bugs that I uncovered while doing a code
3461         review of this today.
3462
3463         * codegen.cs (EmitThis): reworked so the semantics are more clear
3464         and also support value types "this" instances.
3465
3466         * iterators.cs: Changed so that for iterators in value types, we
3467         do not pass the value type as a parameter.  
3468
3469         Initialization of the enumerator helpers is now done in the caller
3470         instead of passing the parameters to the constructors and having
3471         the constructor set the fields.
3472
3473         The fields have now `assembly' visibility instead of private.
3474
3475 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3476
3477         * expression.cs (Argument.Resolve): Check if fields passed as ref
3478         or out are contained in a MarshalByRefObject.
3479
3480         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3481         another compiler type.
3482
3483 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3484
3485         * class.cs (Indexer.Define): use the new name checking method.
3486         Also, return false on an error.
3487         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3488         (is_identifier_[start/part]_character): make static.
3489
3490 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3491
3492         * expression.cs (Binary.ResolveOperator): Do no append strings
3493         twice: since we can be invoked more than once (array evaluation)
3494         on the same concatenation, take care of this here.  Based on a fix
3495         from Ben (bug #56454)
3496
3497 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3498
3499         * codegen.cs: Fix another case where CS1548 must be reported (when 
3500         delay-sign isn't specified and no private is available #56564). Fix
3501         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3502         error when MCS is used on the MS runtime and we need to delay-sign 
3503         (which seems unsupported by AssemblyBuilder - see #56621).
3504
3505 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3506
3507         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3508         (TypeManager.ComputeNamespaces): Faster implementation for
3509         Microsoft runtime.
3510
3511         * compiler.csproj: Updated AssemblyName to mcs.
3512
3513 2004-05-11  Jackson Harper  <jackson@ximian.com>
3514
3515         * Makefile: Preserve MONO_PATH
3516         
3517 2004-05-11  Jackson Harper  <jackson@ximian.com>
3518
3519         * Makefile: Use mono and mcs to build gmcs
3520         
3521 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
3522
3523         * codegen.cs: Add patch from Robert Shade
3524         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
3525         sync with mcs.
3526
3527 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
3528
3529         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3530         incomplete key pairs (#57941).
3531
3532 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3533
3534         * codegen.cs: Fix another case where CS1548 must be reported (when 
3535         delay-sign isn't specified and no private is available #56564). Fix
3536         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3537         error when MCS is used on the MS runtime and we need to delay-sign 
3538         (which seems unsupported by AssemblyBuilder - see #56621).
3539
3540 2004-04-29  Jackson Harper  <jackson@ximian.com>
3541
3542         * Makefile: Set MONO_PATH to use the bootstrap corlib
3543         * driver.cs: Check the GAC for referenced assemblies.
3544                 
3545 2004-04-29  Martin Baulig  <martin@ximian.com>
3546
3547         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
3548
3549 2004-04-07  Martin Baulig  <martin@ximian.com>
3550
3551         * expression.cs (Binary.ResolveOperator): Added special case for
3552         Equality/Inequality between a type parameter and a null literal.
3553
3554 2004-04-07  Martin Baulig  <martin@ximian.com>
3555
3556         * convert.cs: Check null literal -> type parameter conversions.
3557
3558 2004-04-07  Martin Baulig  <martin@ximian.com>
3559
3560         * generic.cs (ConstructedType.CheckConstraints): Enforce the
3561         `class' and `struct' constraints.
3562
3563 2004-04-07  Martin Baulig  <martin@ximian.com>
3564
3565         * generic.cs (SpecialConstraint): New public enum.
3566         (Constraints.Resolve): Added support for the `class' and `struct'
3567         constraints.
3568
3569         * cs-parser.jay (type_parameter_constraint): Added support for the
3570         `class' and `struct' constraints.
3571
3572 2004-04-07  Martin Baulig  <martin@ximian.com>
3573
3574         * support.cs (GenericConstraints): Replaced `Types' by
3575         `ClassConstraint' and `InterfaceConstraints'; added
3576         `HasClassConstraint'.   
3577
3578 2004-04-07  Martin Baulig  <martin@ximian.com>
3579
3580         * generic.cs
3581         (Constraints.InterfaceConstraints): New public property.
3582         (Constraints.Types): Make this property public
3583         (TypeParameter): Implement IMemberContainer.
3584         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
3585         instead of a TypeBuilder/MethodBuilder; pass the interface
3586         constraints to TypeManager.AddTypeParameter().
3587         (TypeParameter.DefineType): Just take an EmitContext and no
3588         TypeBuilder/MethodBuilder.  Use the new public API.
3589
3590         * typemanager.cs (TypeManager.AddTypeParameter): Added
3591         `TypeExpr[]' argument; add the interfaces to the
3592         `builder_to_ifaces' hash.
3593         (TypeManager.LookupMemberContainer): For
3594         GenericTypeParameterBuilders, get the TypeParameter from the
3595         `builder_to_type_param'.
3596         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
3597         the TypeParameter and call FindMembers on it.
3598
3599 2004-04-07  Martin Baulig  <martin@ximian.com>
3600
3601         * class.cs
3602         (MethodCore.GenericMethod): Moved this field here from Method.
3603         (MethodCore.IsDuplicateImplementation): Take the number of type
3604         parameters into account if we're a generic method.
3605
3606         * expression.cs (Invocation.InferTypeArguments): Don't return true
3607         if `arguments' is null; we still need to check whether we actually
3608         don't need to infer anything in this case.
3609         (MemberAccess): Merged the functionality from GenericMemberAccess
3610         into this class.
3611
3612         * generic.cs (GenericMemberAccess): Removed.
3613
3614 2004-04-05  Martin Baulig  <martin@ximian.com>
3615
3616         * decl.cs (MemberCore): For generic classes, interfaces and
3617         structs, `Name' now includes the number of type parameters
3618         ("Stack!1.Node!1").
3619         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
3620         encode the number of type arguments in the type name.
3621
3622         * expression.cs (Expression.MemberLookup): Removed the
3623         `num_type_args' argument; we now encode the number of type
3624         arguments in the type name.
3625
3626         * ecore.cs (SimpleName): Encode the number of type arguments in
3627         the type name itself.
3628
3629         * generic.cs (ConstructedType): Likewise.
3630
3631         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
3632         `MemberName'; we now include the number of type parameters in the
3633         type name.
3634
3635         * typemanager.cs (TypeManager.CheckGeneric): Removed.
3636         (TypeManager.MemberLookup): Removed the
3637         `num_type_args' argument; we now encode the number of type
3638         arguments in the type name.     
3639
3640 2004-04-03  Martin Baulig  <martin@ximian.com>
3641
3642         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
3643         (MemberCore.MemberName): Moved here from MemberBase.
3644         (DeclSpace.SetParameterInfo): Just take the constraints as an
3645         ArrayList; we already have the type parameters in our
3646         `MemberName'; also do the CS0080 reporting here.
3647
3648         * cs-parser.jay (struct_declaration): Use `member_name' instead of
3649         `IDENTIFIER opt_type_parameter_list'; when constructing our
3650         `MemberName', it'll already include our type parameters.
3651         (class_declaration, interface_declaration): Likewise.
3652         (delegate_declaration): Likewise.
3653         (MakeName): Take a MemberName and return a MemberName.
3654         The following two changes are required to avoid shift/reduce conflicts:
3655         (member_name): Don't include a TypeName anymore; ie. this is now
3656         just 'IDENTIFIER opt_type_parameter_list'.
3657         (property_declaration, event_declaration): Use a
3658         `namespace_or_type_name' instead of a `member_name'.            
3659
3660 2004-04-03  Martin Baulig  <martin@ximian.com>
3661
3662         * decl.cs (MemberName): Renamed to `TypeName' and created a new
3663         `MemberName' class.
3664         (TypeName): Formerly known as MemberName.
3665
3666         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
3667         instead of a `MemberName'.
3668
3669         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
3670         (member_name): New rule; create a MemberName.
3671
3672 2004-04-02  Martin Baulig  <martin@ximian.com>
3673
3674         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
3675         (CS0305 and CS0308).
3676
3677 2004-04-02  Martin Baulig  <martin@ximian.com>
3678
3679         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
3680         support for nested types.
3681
3682 2004-04-02  Martin Baulig  <martin@ximian.com>
3683
3684         * ecore.cs (IAlias): New public interface.
3685         (TypeExpr, TypeExpression): Implement IAlias.
3686         (TypeAliasExpression): New public class.
3687
3688         * namespace.cs (Namespace): Implement IAlias.
3689         (Namespace.Lookup): Return an IAlias instead on an object.
3690         (Namespace.DefineName): Take an IAlias instead of an object.
3691         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
3692         an object.
3693         (NamespaceEntry.UsingAlias): Take a Membername instead of an
3694         Expression.
3695         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
3696         object.
3697         (NamespaceEntry.Lookup): Likewise.
3698
3699         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
3700         instead of a Type.      
3701
3702         * decl.cs (DeclSpace): Implement IAlias.
3703         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
3704
3705         * generic.cs (ConstructedType): Improved error checking.
3706
3707 2004-04-02  Martin Baulig  <martin@ximian.com>
3708
3709         * convert.cs: Added type parameter conversions.
3710
3711         * ecore.cs
3712         (UnboxCast.Emit): Emit an `unbox.any' for type params.
3713         (ClassCast.Emit): If the source type is a type parameter, box it.
3714         If the target type is a type parameter, emit an `unbox.any'
3715         instead of a `classcast'.1      
3716
3717 2004-04-01  Martin Baulig  <martin@ximian.com>
3718
3719         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
3720
3721 2004-04-01  Martin Baulig  <martin@ximian.com>
3722
3723         * generic.cs (ConstructedType.CheckConstraints): Use
3724         Convert.ImplicitStandardConversionExists(); user-defined implicit
3725         conversions are not allowed according to the spec.
3726
3727 2004-03-30  Martin Baulig  <martin@ximian.com>
3728
3729         * expression.cs (New): Added support for type parameters.
3730
3731         * typemanager.cs
3732         (TypeManager.activator_type): New public static field.
3733         (TypeManager.activator_create_instance): Likewise.
3734
3735 2004-03-30  Martin Baulig  <martin@ximian.com>
3736
3737         * typemanager.cs (TypeManager.HasConstructorConstraint): New
3738         public method.
3739
3740 2004-03-30  Martin Baulig  <martin@ximian.com>
3741
3742         * generic.cs (ConstructedType.CheckConstraints): Actually follow
3743         the spec here: the argument type must be convertible to the
3744         constraints.
3745
3746 2004-03-30  Martin Baulig  <martin@ximian.com>
3747
3748         * generic.cs
3749         (TypeParameter.Define, TypeParameter.DefineMethod): Call
3750         TypeManager.AddTypeParameter().
3751         (ConstructedType.CheckConstraints): Re-enable this and actually
3752         check whether we have a constructor constraint.
3753
3754         * typemanager.cs
3755         (TypeManager.builder_to_type_param): New static field.
3756         (TypeManager.AddTypeParameter): New static method.
3757         (TypeManager.LookupTypeParameter): New public method.
3758
3759 2004-03-30  Martin Baulig  <martin@ximian.com>
3760
3761         * generic.cs (TypeParameter.DefineType): Return a boolean and use
3762         the new API to actually define the constructor constraint.
3763
3764         * typemanager.cs
3765         (TypeManager.new_constraint_attr_type): New static field.
3766         (TypeManager.InitCoreTypes): Initialize it.
3767
3768 2004-03-30  Martin Baulig  <martin@ximian.com>
3769
3770         * generic.cs (Constraints): Completed error checking, use correct
3771         error numbers.
3772
3773 2004-03-29  Martin Baulig  <martin@ximian.com>
3774
3775         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
3776
3777         * expression.cs (Invocation.InferTypeArguments): Added overloaded
3778         public version which takes a `ParameterData pd' instead of an
3779         `ArrayList args'.
3780
3781 2004-03-29  Martin Baulig  <martin@ximian.com>
3782
3783         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
3784         not a MethodInfo.       
3785
3786 2004-03-29  Martin Baulig  <martin@ximian.com>
3787
3788         * expression.cs (Argument.ResolveMethodGroup): If we're a
3789         ConstructedType, call GetMemberAccess() on it.  
3790
3791 2004-03-29  Martin Baulig  <martin@ximian.com>
3792
3793         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
3794         (MethodCore.CheckGenericOverride): When overriding a generic
3795         method, check whether the constraints match.
3796
3797         * support.cs (GenericConstraints): New public interface.
3798         (ParameterData.GenericConstraints): New public method.
3799
3800         * parameter.cs (Parameter.Resolve): Check whether we're a generic
3801         method parameter and compute our constraints if appropriate.
3802         (Parameter.GenericConstraints): New public property.
3803
3804         * generic.cs (Constraints): Implement GenericConstraints.
3805
3806 2004-03-29  Martin Baulig  <martin@ximian.com>
3807
3808         * decl.cs (MemberCache.FindMemberToOverride): Use
3809         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
3810
3811 2004-03-29  Martin Baulig  <martin@ximian.com>
3812
3813         * generic.cs (GenericMethod.Define): Resolve our type parameters.
3814
3815 2004-03-29  Martin Baulig  <martin@ximian.com>
3816
3817         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
3818         not allowed on non-generic declarations").
3819
3820 2004-03-29  Martin Baulig  <martin@ximian.com>
3821
3822         * expression.cs (Invocation.InferTypeArguments): Added overloaded
3823         public version of this method.
3824
3825         * class.cs (MethodCore.IsDuplicateImplementation): Use
3826         Invocation.InferTypeArguments() to check this.
3827
3828 2004-03-29  Martin Baulig  <martin@ximian.com>
3829
3830         * convert.cs: Use TypeManager.IsDelegateType() instead of
3831         comparing types correctly.
3832
3833 2004-03-29  Martin Baulig  <martin@ximian.com>
3834
3835         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
3836         types directly to make it work for generic instances.
3837
3838         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
3839
3840 2004-03-29  Martin Baulig  <martin@ximian.com>
3841
3842         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
3843         support for arrays.     
3844
3845 2004-03-24  Martin Baulig  <martin@ximian.com>
3846
3847         * decl.cs (DeclSpace.FindType): Also use
3848         TypeManager.CheckGeneric() for types from the using clauses.
3849
3850 2004-03-23  Martin Baulig  <martin@ximian.com>
3851
3852         * expression.cs (Invocation.OverloadResolve): Added `bool
3853         may_fail' argument and use it instead of the Location.IsNull() hack.
3854
3855 2004-03-23  Martin Baulig  <martin@ximian.com>
3856
3857         * expression.cs (Invocation.InferType): Use correct type inference
3858         rules here.     
3859
3860 2004-03-23  Martin Baulig  <martin@ximian.com>
3861
3862         * ecore.cs (MethodGroupExpr.Name): Use
3863         TypeManager.CSharpSignature() instead of just the name.
3864
3865         * expression.cs (Invocation.OverloadResolve): Provide better error
3866         reporting.
3867         (Invocation.DoResolve): OverloadResolve() never returns null
3868         without reporting an error, so removed the error -6 reporting here.
3869
3870 2004-03-23  Martin Baulig  <martin@ximian.com>
3871
3872         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
3873         generic methods.
3874
3875         * cs-parser.jay (delegate_declaration): Support generic delegates.
3876
3877         * delegate.cs: Support generic delegates.
3878
3879 2004-03-22  Martin Baulig  <martin@ximian.com>
3880
3881         * expression.cs (Invocation.InferParamsTypeArguments): New static
3882         method; does type inference for params arguments.
3883
3884 2004-03-21  Martin Baulig  <martin@ximian.com>
3885
3886         * typemanager.cs (TypeManager.IsGenericMethod): New public static
3887         method; checks whether a method is a generic method.    
3888
3889         * expression.cs (Invocation.InferTypeArguments): New static method;
3890         infer type arguments for generic method invocation.
3891
3892         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
3893         property; we set this to true if we're resolving a generic method
3894         invocation and the user specified type arguments, ie. we're not
3895         doing type inference.
3896
3897 2004-03-20  Martin Baulig  <martin@ximian.com>
3898
3899         * class.cs (MethodData.DeclaringType): New public property.
3900         (MethodData.Define): Set DeclaringType here.
3901         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
3902         instead of OperatorMethodBuilder.DeclaringType.
3903
3904 2004-03-20  Martin Baulig  <martin@ximian.com>
3905
3906         * cs-tokenizer.cs (xtoken): Return a special
3907         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
3908
3909         * cs-parser.jay (default_value_expression): Switch to the new
3910         syntax (14.5.13).
3911
3912 2004-03-19  Martin Baulig  <martin@ximian.com>
3913
3914         * decl.cs (MemberName): New class.  We use this to "construct"
3915         namespace_or_type_name's.
3916
3917         * generics.cs (TypeArguments.GetDeclarations): New public method;
3918         returns the type arguments as a string[] and reports a CS0081 if
3919         one of them is not an identifier.
3920
3921         * class.cs (MemberBase): The .ctor now takes the name as a
3922         MemberName instead of a string.
3923         (MemberBase.ExplicitInterfaceName): Changed type from string to
3924         Expression.
3925         (MemberBase.DoDefine): If we're an explicit implementation, the
3926         InterfaceType may be a generic instance.
3927
3928         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
3929         (namespace_name): Call MemberName.GetName () to transform the
3930         MemberName into a string and ensure we don't have any type
3931         arguments.
3932         (type_name): Call MemberName.GetTypeExpression() to transfrom the
3933         MemberName into an expression.
3934         (method_header): Use namespace_or_type_name instead of member_name.     
3935
3936 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3937
3938         * rootcontext.cs: Add new types to the boot resolution.
3939
3940         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3941         MulticastDelegate is not allowed.
3942
3943         * typemanager.cs: Add new types to lookup: System.TypedReference
3944         and ArgIterator.
3945
3946         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3947         check for TypedReference or ArgIterator, they are not allowed. 
3948
3949         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3950         makes us properly catch 1510 in some conditions (see bug 56016 for
3951         details). 
3952
3953 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3954
3955         * CryptoConvert.cs: update from corlib version
3956         with endian fixes.
3957
3958 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3959
3960         * class.cs (Indexer.Define): Check indexername declaration
3961
3962 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3963
3964         * attribute.cs (IsClsCompliant): Fixed problem with handling
3965         all three states (compliant, not-compliant, undetected).
3966
3967 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3968
3969         * attribute.cs (Attribute): Location is now public.
3970         (Resolve): Store resolved arguments (pos_values) in attribute class.
3971         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3972         (GetClsCompliantAttributeValue): New method that gets
3973         CLSCompliantAttribute value.
3974         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3975         if exists else null.
3976         (AttributeTester): New class for CLS-Compliant verification routines.
3977
3978         * class.cs (Emit): Add CLS-Compliant verification.
3979         (Method.GetSignatureForError): Implemented.
3980         (Constructor.GetSignatureForError): Implemented
3981         (Constructor.HasCompliantArgs): Returns if constructor has
3982         CLS-Compliant arguments.
3983         (Constructor.Emit): Override.
3984         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3985         is needed to test only parameters.
3986         (FieldBase.GetSignatureForError): Implemented.
3987         (TypeContainer): New member for storing base interfaces.
3988         (TypeContainer.FindMembers): Search in base interfaces too.
3989
3990         * codegen.cs (GetClsComplianceAttribute): New method that gets
3991         assembly or module CLSCompliantAttribute value.
3992         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3993         for assembly.
3994         (ModuleClass.Emit): Add error 3012 test.
3995
3996         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3997
3998         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3999         state for all decl types.
4000         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
4001         if CLS-Compliant tests are required.
4002         (IsClsCompliaceRequired): New method. Analyze whether code
4003         must be CLS-Compliant.
4004         (IsExposedFromAssembly): New method. Returns true when MemberCore
4005         is exposed from assembly.
4006         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
4007         value or gets cached value.
4008         (HasClsCompliantAttribute): New method. Returns true if MemberCore
4009         is explicitly marked with CLSCompliantAttribute.
4010         (IsIdentifierClsCompliant): New abstract method. This method is
4011         used to testing error 3005.
4012         (IsIdentifierAndParamClsCompliant): New method. Common helper method
4013         for identifier and parameters CLS-Compliant testing.
4014         (VerifyClsCompliance): New method. The main virtual method for
4015         CLS-Compliant verifications.
4016         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
4017         null. I don't know why is null (too many public members !).
4018         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
4019         and get value of first CLSCompliantAttribute that found.
4020
4021         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
4022         (VerifyClsCompliance): Override and add extra tests.
4023
4024         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
4025         clscheck- disable CLS-Compliant verification event if assembly is has
4026         CLSCompliantAttribute(true).
4027
4028         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
4029         ApllyAttribute is now called in emit section as in the other cases.
4030         Possible future Emit integration.
4031         (IsIdentifierClsCompliant): New override.
4032         (VerifyClsCompliance): New override.
4033         (GetEnumeratorName): Returns full enum name.
4034
4035         * parameter.cs (GetSignatureForError): Implemented.
4036
4037         * report.cs (WarningData): New struct for Warning message information.
4038         (LocationOfPreviousError): New method.
4039         (Warning): New method. Reports warning based on the warning table.
4040         (Error_T): New method. Reports error based on the error table.
4041
4042         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
4043         verifications are done here.
4044
4045         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
4046
4047         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
4048         CLSCompliantAttribute.
4049         (all_imported_types): New member holds all imported types from other
4050         assemblies.
4051         (LoadAllImportedTypes): New method fills static table with exported types
4052         from all referenced assemblies.
4053         (Modules): New property returns all assembly modules.
4054
4055 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
4056
4057         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
4058         throwing a parser error.
4059
4060         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
4061         which removes the hardcoded get_/set_ prefixes for properties, as
4062         IL allows for the properties to be named something else.  
4063
4064         Bug #56013
4065
4066         * expression.cs: Do not override operand before we know if it is
4067         non-null.  Fix 56207
4068
4069 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4070
4071         * typemanager.cs: support for pinned variables.
4072
4073 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4074
4075         * decl.cs, typemanager.cs: Avoid using an arraylist
4076         as a buffer if there is only one result set.
4077
4078 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4079
4080         * expression.cs: Make sure you cant call a static method
4081         with an instance expression, bug #56174.
4082
4083 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
4084
4085         * class.cs (IsDuplicateImplementation): Improve error reporting to
4086         flag 663 (method only differs in parameter modifier).
4087
4088         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
4089         in preprocessor directives.
4090
4091         * location.cs (LookupFile): Allow for the empty path.
4092
4093         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
4094         better approach for some of that patch, but its failing with the
4095         CharSet enumeration.  For now try/catch will do.
4096
4097         * typemanager.cs: Do not crash if a struct does not have fields.
4098         Fixes 56150.
4099
4100 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4101
4102         * expression.cs: cs0213, cant fix a fixed expression.
4103         fixes 50231.
4104
4105 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4106
4107         * cs-parser.jay: detect invalid embeded statements gracefully.
4108         bug #51113.
4109
4110 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4111
4112         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
4113         As a regex:
4114         s/
4115         the invocation type may not be a subclass of the tye of the item/
4116         The type of the item must be a subclass of the invocation item.
4117         /g
4118
4119         Fixes bug #50820.
4120
4121 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
4122
4123         * attribute.cs: Added methods to get a string and a bool from an
4124         attribute. Required to information from AssemblyKeyFileAttribute,
4125         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
4126         * codegen.cs: Modified AssemblyName creation to include support for
4127         strongnames. Catch additional exceptions to report them as CS1548.
4128         * compiler.csproj: Updated include CryptoConvert.cs.
4129         * compiler.csproj.user: Removed file - user specific configuration.
4130         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
4131         Mono.Security assembly. The original class is maintained and tested in
4132         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
4133         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
4134         like CSC 8.0 (C# v2) supports.
4135         * Makefile: Added CryptoConvert.cs to mcs sources.
4136         * rootcontext.cs: Added new options for strongnames.
4137
4138 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
4139
4140         * driver.cs: For --expect-error, report error code `2'
4141         if the program compiled with no errors, error code `1' if
4142         it compiled with an error other than the one expected.
4143
4144 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
4145
4146         * compiler.csproj: Updated for Visual Studio .NET 2003.
4147         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
4148         * compiler.sln: Updated for Visual Studio .NET 2003.
4149
4150 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
4151
4152         * expression.cs: Fix bug #47234. We basically need to apply the
4153         rule that we prefer the conversion of null to a reference type
4154         when faced with a conversion to 'object' (csc behaviour).
4155
4156 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4157
4158         * statement.cs: Shorter form for foreach, eliminates
4159         a local variable. r=Martin.
4160
4161 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4162
4163         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
4164         checks if we can use brtrue/brfalse to test for 0.
4165         * expression.cs: use the above in the test for using brtrue/brfalse.
4166         cleanup code a bit.
4167
4168 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4169
4170         * expression.cs: Rewrite string concat stuff. Benefits:
4171
4172         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4173         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4174         rather than a concat chain.
4175
4176         * typemanager.cs: Add lookups for more concat overloads.
4177
4178 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4179
4180         * expression.cs: Emit shorter il code for array init.
4181
4182         newarr
4183         dup
4184         // set 1
4185
4186         // set 2
4187
4188         newarr
4189         stloc.x
4190
4191         ldloc.x
4192         // set 1
4193
4194         ldloc.x
4195         // set 2
4196
4197 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4198
4199         * statement.cs: Before, two switch blocks would be merged if the
4200         total size of the blocks (end_item - begin_item + 1) was less than
4201         two times the combined sizes of the blocks.
4202
4203         Now, it will only merge if after the merge at least half of the
4204         slots are filled.
4205
4206         fixes 55885.
4207
4208 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4209
4210         * class.cs : csc build fix for GetMethods(). See bug #52503.
4211
4212 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4213
4214         * expression.cs: Make sure fp comparisons work with NaN.
4215         This fixes bug #54303. Mig approved this patch a long
4216         time ago, but we were not able to test b/c the runtime
4217         had a related bug.
4218
4219 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4220
4221         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4222
4223 2004-03-19  Martin Baulig  <martin@ximian.com>
4224
4225         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
4226         two overloads may unify for some type parameter substitutions and
4227         report a CS0408 if appropriate.
4228
4229 2004-03-19  Martin Baulig  <martin@ximian.com>
4230
4231         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4232         error here and not in our caller.
4233
4234 2004-03-19  Martin Baulig  <martin@ximian.com>
4235
4236         * interface.cs: Completely killed this file.
4237         (Interface): We're now a TypeContainer and live in class.cs.
4238
4239         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4240         argument; we're now also called for interfaces.
4241         (TypeContainer.DefineMembers): Allow this method being called
4242         multiple times.
4243         (TypeContainer.GetMethods): New public method; formerly known as
4244         Interface.GetMethod().  This is used by PendingImplementation.
4245         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4246         it's now private and non-static.
4247         (Interface): Moved this here; it's now implemented similar to
4248         Class and Struct.
4249         (Method, Property, Event, Indexer): Added `bool is_interface'
4250         argument to their .ctor's.
4251         (MemberBase.IsInterface): New public field.
4252
4253         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4254         instances instead of InterfaceMethod, InterfaceProperty, etc.
4255         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4256         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4257
4258 2004-03-19  Martin Baulig  <martin@ximian.com>
4259
4260         * class.cs (MethodCore.IsDuplicateImplementation): New private
4261         method which does the CS0111 checking.
4262         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4263         Use IsDuplicateImplementation().
4264
4265 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4266
4267         * decl.cs (FindMemberToOverride): New method to find the correct
4268         method or property to override in the base class.
4269         * class.cs
4270             - Make Method/Property use the above method to find the
4271               version in the base class.
4272             - Remove the InheritableMemberSignatureCompare as it is now
4273               dead code.
4274
4275         This patch makes large code bases much faster to compile, as it is
4276         O(n) rather than O(n^2) to do this validation.
4277
4278         Also, it fixes bug 52458 which is that nested classes are not
4279         taken into account when finding the base class member.
4280
4281         Reviewed/Approved by Martin.
4282
4283 2004-03-17  Martin Baulig  <martin@ximian.com>
4284
4285         * expression.cs (MemberAccess.DoResolve): Take the parent's number
4286         of type arguments into account; use the `real_num_type_args'
4287         approach like in DoResolveAsTypeStep().
4288
4289         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
4290         nested types.
4291
4292 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4293
4294         * interface.cs: In all interface classes removed redundant
4295         member initialization.
4296
4297 2004-03-16  Martin Baulig  <martin@ximian.com>
4298
4299         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4300
4301 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4302
4303         * decl.cs (DefineTypeAndParents): New helper method to define a
4304         type's containers before the type itself is defined;  This is a
4305         bug exposed by the recent changes to Windows.Forms when an
4306         implemented interface was defined inside a class that had not been
4307         built yet.   
4308
4309         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4310
4311         (Check): Loop correctly to report errors modifiers
4312         (UNSAFE was not in the loop, since it was the same as TOP).
4313
4314         * interface.cs: Every interface member now takes a ModFlags,
4315         instead of a "is_new" bool, which we set on the base MemberCore. 
4316
4317         Every place where we called "UnsafeOk" in the interface, now we
4318         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4319         the unsafe settings from the member declaration instead of the
4320         container interface. 
4321
4322         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4323
4324         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4325         `set_indexer_name' to the pending bits (one per type).
4326
4327         We fixed a bug today that was picking the wrong method to
4328         override, since for properties the existing InterfaceMethod code
4329         basically ignored the method name.  Now we make sure that the
4330         method name is one of the valid indexer names.
4331
4332 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4333  
4334         * support.cs (SeekableStreamReader): Keep track of stream byte
4335         positions and don't mix them with character offsets to the buffer.
4336
4337         Patch from Gustavo Giráldez
4338
4339 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4340
4341         * interface.cs (InterfaceSetGetBase): Removed double member
4342         initialization, base class does it as well.
4343
4344 2004-03-13  Martin Baulig  <martin@ximian.com>
4345
4346         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4347         when compiling corlib.
4348
4349 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4350
4351         * convert.cs (ExplicitConversion): We were reporting an error on
4352         certain conversions (object_type source to a value type, when the
4353         expression was `null') before we had a chance to pass it through
4354         the user defined conversions.
4355
4356         * driver.cs: Replace / and \ in resource specifications to dots.
4357         Fixes 50752
4358
4359         * class.cs: Add check for duplicate operators.  Fixes 52477
4360
4361 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4362
4363         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4364         that are in the middle of the statements, not only at the end.
4365         Fixes #54987
4366
4367         * class.cs (TypeContainer.AddField): No longer set the
4368         `HaveStaticConstructor' flag, now we call it
4369         `UserDefineStaticConstructor' to diferentiate the slightly
4370         semantic difference.
4371
4372         The situation is that we were not adding BeforeFieldInit (from
4373         Modifiers.TypeAttr) to classes that could have it.
4374         BeforeFieldInit should be set to classes that have no static
4375         constructor. 
4376
4377         See:
4378
4379         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4380
4381         And most importantly Zoltan's comment:
4382
4383         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4384
4385         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4386          before its static fields are used', i.e. initialization does not need
4387          to be triggered by the first access to the type. Setting this flag
4388          helps the JIT to compile better code, since it can run the static
4389          constructor at JIT time, and does not need to generate code to call it
4390          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4391          this flag for lots of classes like String. 
4392          
4393          csc sets this flag if the type does not have an explicit static 
4394          constructor. The reasoning seems to be that if there are only static
4395          initalizers for a type, and no static constructor, then the programmer
4396          does not care when this initialization happens, so beforefieldinit
4397          can be used.
4398          
4399          This bug prevents the AOT compiler from being usable, since it 
4400          generates so many calls to mono_runtime_class_init that the AOT code
4401          is much slower than the JITted code. The JITted code is faster, 
4402          because it does not generate these calls if the vtable is type is
4403          already initialized, which is true in the majority of cases. But the
4404          AOT compiler can't do this."
4405
4406 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4407
4408         * class.cs (MethodData.Emit): Refactor the code so symbolic
4409         information is generated for destructors;  For some reasons we
4410         were taking a code path that did not generate symbolic information
4411         before. 
4412
4413 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4414
4415         * class.cs: Create a Constructor.CheckBase method that
4416         takes care of all validation type code. The method
4417         contains some code that was moved from Define.
4418
4419         It also includes new code that checks for duplicate ctors.
4420         This fixes bug #55148.
4421
4422 2004-03-09  Joshua Tauberer <tauberer@for.net>
4423
4424         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4425         a { ... }-style array creation invokes EmitStaticInitializers
4426         which is not good for reference-type arrays.  String, decimal
4427         and now null constants (NullCast) are not counted toward
4428         static initializers.
4429
4430 2004-03-05  Martin Baulig  <martin@ximian.com>
4431
4432         * location.cs (SourceFile.HasLineDirective): New public field;
4433         specifies whether the file contains or is referenced by a "#line"
4434         directive.
4435         (Location.DefineSymbolDocuments): Ignore source files which
4436         either contain or are referenced by a "#line" directive.        
4437
4438 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4439
4440         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4441         direct access to our parent, so check the method inline there.
4442
4443 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4444
4445         * expression.cs (Invocation.EmitCall): Miguel's last commit
4446         caused a regression. If you had:
4447
4448             T t = null;
4449             t.Foo ();
4450
4451         In Foo the implict this would be null.
4452
4453 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4454
4455         * expression.cs (Invocation.EmitCall): If the method is not
4456         virtual, do not emit a CallVirt to it, use Call.
4457
4458         * typemanager.cs (GetFullNameSignature): Improve the method to
4459         cope with ".ctor" and replace it with the type name.
4460
4461         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4462         as an argument the ConstructorBuilder where it is being defined,
4463         to catch the recursive constructor invocations.
4464
4465 2004-03-16  Martin Baulig  <martin@ximian.com>
4466
4467         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
4468         ConstructedType, call ResolveType() on it to get the type rather
4469         than just using `expr.Type'.
4470
4471 2004-03-16  Martin Baulig  <martin@ximian.com>
4472
4473         * generics.cs (ConstructedType.GetMemberAccess): Take the
4474         EmitContext instead on the TypeExpr and use
4475         ec.TypeContainer.CurrentType/ec.ContainerType.
4476
4477 2004-03-16  Martin Baulig  <martin@ximian.com>
4478
4479         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
4480         parameters before aliases.
4481
4482 2004-03-16  Martin Baulig  <martin@ximian.com>
4483
4484         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
4485         New oublic function; checks whether two generic instances may become
4486         equal under some instantiations (26.3.1).
4487
4488         * class.cs (TypeContainer.Define): Call
4489         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
4490         error.
4491
4492 2004-03-16  Martin Baulig  <martin@ximian.com>
4493
4494         * class.cs (TypeContainer.GetClassBases): Moved
4495         Error_TypeParameterAsBase() here and also check whether the base
4496         class is not an attribute.
4497
4498 2004-03-16  Martin Baulig  <martin@ximian.com>
4499
4500         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4501
4502 2004-03-16  Martin Baulig  <martin@ximian.com>
4503
4504         * class.cs (Error_TypeParameterAsBase): Use correct error number
4505         here (CS0689).  
4506
4507 2004-03-16  Martin Baulig  <martin@ximian.com>
4508
4509         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
4510         for generics.
4511
4512         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
4513         error reporting.
4514
4515 2004-03-15  Martin Baulig  <martin@ximian.com>
4516
4517         * typemanager.cs (TypeManager.GetFullName): New public method.
4518         (TypeManager.MemberLookup): Added `int_num_type_arguments'
4519         argument; only return members with the correct number of type
4520         arguments.
4521         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
4522         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
4523         whether the number of type arguments matches.
4524
4525         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
4526         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
4527
4528         * expression.cs (MemberAccess): Added public `NumTypeArguments'
4529         field; it's set by the protected .ctor when we're actually a
4530         GenericMemberAccess.
4531         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
4532         arguments and pass it to MemberLookupFinal ().
4533
4534         * ecore.cs (Expression.MemberLookup): Added `int
4535         num_type_arguments' argument; only return members with the correct
4536         number of type arguments.
4537         (Expression.MemberLookupFailed): Check whether the MemberLookup
4538         failed because we did not have the correct number of type
4539         arguments; report CS0305 in this case.
4540
4541         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
4542         `e.ResolveAsTypeTerminal()' already did so.
4543
4544 2004-03-15  Martin Baulig  <martin@ximian.com>
4545
4546         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
4547         we're a ConstructedType; in this case, the caller must report an
4548         error (for instance CS0131).
4549
4550         * generic.cs (TypeArguments): Added Location argument to the .ctor.
4551         (TypeArguments.Resolve): Actually report errors here.
4552
4553 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4554
4555         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4556         `set_indexer_name' to the pending bits (one per type).
4557
4558         We fixed a bug today that was picking the wrong method to
4559         override, since for properties the existing InterfaceMethod code
4560         basically ignored the method name.  Now we make sure that the
4561         method name is one of the valid indexer names.
4562
4563 2004-03-15  Martin Baulig  <martin@ximian.com>
4564
4565         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
4566         for generic instances.
4567
4568 2004-03-13  Martin Baulig  <martin@ximian.com>
4569
4570         * class.cs (TypeContainer.DefineType): Call
4571         TypeManager.AddUserType() immediately after creating the
4572         TypeBuilder; pass all type parameters when creating the
4573         CurrentType.
4574
4575         * decl.cs (DeclSpace.FindNestedType): New public method.
4576         (DeclSpace.FindType): Added `int num_type_args' argument; only
4577         return types with the correct number of type parameters.
4578         (DeclSpace.CountTypeParams): New public property.
4579
4580         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
4581         the number of type parameters; defaults to zero.
4582
4583         * generic.cs (TypeArguments.Count): New public property.
4584         (ConstructedType.DoResolveAsTypeStep): First call
4585         ds.FindNestedType() to find out whether we're nested in the
4586         current generic type; in this case, we inherit all type parameters
4587         from the current class.
4588
4589         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
4590         num_type_args' argument.
4591         (RootContext.LookupType): Added overloaded version which takes the
4592         number of type arguments; only return types with the correct
4593         number of type arguments.
4594
4595         * typemanager.cs (TypeManager.CheckGeneric): New public function;
4596         checks whether `Type t' has `int num_type_args'.
4597
4598 2004-03-13  Martin Baulig  <martin@ximian.com>
4599
4600         * generic.cs (GenericMethod.DefineType): New method; calls
4601         DefineType() on all the type parameters.
4602
4603         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
4604         (MethodData.Define): If we're a generic method, call
4605         GenericMethod.DefineType() to define the type parameters.       
4606
4607 2004-03-10  Martin Baulig  <martin@ximian.com>
4608
4609         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
4610         instead of IsAssignableFrom.    
4611
4612 2004-03-10  Martin Baulig  <martin@ximian.com>
4613
4614         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
4615
4616         * support.cs (ParameterData.HasArrayParameter): New property.
4617         (ReflectionParameters.ctor): Take a MethodBase instead of a
4618         ParameterInfo[].  If we have any type parameters, get the generic
4619         method definition and ask it whether we have variable arguments.
4620
4621 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4622
4623         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4624         routines to check if a type is an enumerable/enumerator allow
4625         classes that implement the IEnumerable or IEnumerator interfaces.
4626
4627         * class.cs (Property, Operator): Implement IIteratorContainer, and
4628         implement SetYields.
4629
4630         (Property.Define): Do the block swapping for get_methods in the
4631         context of iterators.   We need to check if Properties also
4632         include indexers or not.
4633
4634         (Operator): Assign the Block before invoking the
4635         OperatorMethod.Define, so we can trigger the Iterator code
4636         replacement. 
4637
4638         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4639         Property and Operator classes are not created when we parse the
4640         declarator but until we have the block completed, so we use a
4641         singleton SimpleIteratorContainer.Simple to flag whether the
4642         SetYields has been invoked.
4643
4644         We propagate this setting then to the Property or the Operator to
4645         allow the `yield' to function.
4646
4647 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4648
4649         * codegen.cs: Implemented attribute support for modules.
4650         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4651         Assembly/Module functionality.
4652
4653         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4654         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4655         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4656
4657 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4658
4659         * interface.cs (FindMembers): The operation is performed on all base
4660         interfaces and not only on the first. It is required for future CLS Compliance patch.
4661
4662 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4663
4664         * statement.cs, codegen.cs:
4665         This patch deals with patterns such as:
4666
4667         public class List : IEnumerable {
4668
4669                 public MyEnumerator GetEnumerator () {
4670                         return new MyEnumerator(this);
4671                 }
4672
4673                 IEnumerator IEnumerable.GetEnumerator () {
4674                         ...
4675                 }
4676                 
4677                 public struct MyEnumerator : IEnumerator {
4678                         ...
4679                 }
4680         }
4681
4682         Before, there were a few things we did wrong:
4683         1) we would emit callvirt on a struct, which is illegal
4684         2) we emited ldarg when we needed to emit ldarga
4685         3) we would mistakenly call the interface methods on an enumerator
4686         type that derived from IEnumerator and was in another assembly. For example:
4687
4688         public class MyEnumerator : IEnumerator
4689
4690         Would have the interface methods called, even if there were public impls of the
4691         method. In a struct, this lead to invalid IL code.
4692
4693 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4694
4695         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4696           renamed to Emit.
4697
4698         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4699
4700 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4701
4702         * cs-parser.jay: Fix small regression: we were not testing V2
4703         compiler features correctly.
4704
4705         * interface.cs: If the emit context is null, then create one
4706
4707 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4708
4709         * decl.cs (GetSignatureForError): New virtual method to get full name
4710           for error messages.
4711
4712         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4713           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4714
4715         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4716           Duplicated members and code in these classes has been removed.
4717           Better encapsulation in these classes.
4718
4719 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4720
4721         * assign.cs (Assign.DoResolve): When dealing with compound
4722         assignments, there is a new rule in ECMA C# 2.4 (might have been
4723         there before, but it is documented here) that states that in:
4724
4725         a op= b;
4726
4727         If b is of type int, and the `op' is a shift-operator, then the
4728         above is evaluated as:
4729
4730         a = (int) a op b 
4731
4732         * expression.cs (Binary.ResolveOperator): Instead of testing for
4733         int/uint/long/ulong, try to implicitly convert to any of those
4734         types and use that in pointer arithmetic.
4735
4736         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4737         method to print information for from the type, not from the
4738         null-method we were given.
4739
4740 2004-02-01  Duncan Mak  <duncan@ximian.com>
4741
4742         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4743         parsing for cmd, fixes bug #53694.
4744
4745 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4746
4747         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4748         in the member name duplication tests. Property and operator name duplication
4749         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4750
4751 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4752
4753         * interface.cs (PopulateMethod): Fixed crash when interface method
4754         returns not existing type (error test cs0246-3.cs).
4755
4756 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4757
4758         * cs-parser.jay (interface_accessors): Re-write actions to also
4759         store attributes attached to get and set methods. Fix spelling
4760         while at it.
4761
4762         (inteface_property_declaration): Modify accordingly.
4763
4764         (InterfaceAccessorInfo): New helper class to store information to pass
4765         around between rules that use interface_accessors.
4766
4767         * interface.cs (Emit): Apply attributes on the get and set
4768         accessors of properties and indexers too.
4769
4770         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4771         right MethodBuilder when applying attributes to the get and set accessors.
4772
4773 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4774
4775         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4776
4777 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4778
4779         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4780
4781 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4782
4783         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4784         changes that treat `yield' specially when present before `break'
4785         or `return' tokens.
4786
4787         * cs-tokenizer.cs: yield is no longer a keyword.
4788
4789 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4790
4791         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4792         setting for default constructors.
4793         For default constructors are almost every time set wrong Modifier. The
4794         generated IL code has been alright. But inside mcs this values was
4795         wrong and this was reason why several of my CLS Compliance tests
4796         failed.
4797
4798 2004-02-27  Martin Baulig  <martin@ximian.com>
4799
4800         * generics.cs (ConstructedType.ResolveType): Make the nested type
4801         stuff actually work.
4802
4803 2004-02-25  Martin Baulig  <martin@ximian.com>
4804
4805         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
4806         property; returns the type parameters just from the current type,
4807         ie. with the ones from outer classes.
4808         (DeclSpace.LookupGeneric): First search in the current class, then
4809         in outer classes.
4810         (DeclSpace.initialize_type_params): When hiding a type parameter
4811         from an outer class, put it into the `type_param_list' anyways.
4812
4813         * expression.cs (MemberAccess.expr): Made this field protected.
4814
4815         * class.cs (TypeContainer.Define): The `CurrentType' just contains
4816         the type parameters from the current class.
4817
4818         * generic.cs (ConstructedType.ResolveType): Support nested generic
4819         types by taking the type parameters which we inherit from outer
4820         classes into account.
4821         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
4822         support for nested generic types.
4823
4824 2004-02-23  Martin Baulig  <martin@ximian.com>
4825
4826         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
4827         field and check whether we're nested inside a generic type.
4828         (DeclSpace.ResolveType): If we're resolving to a generic type
4829         definition, create a ConstructedType and return its resolved type.
4830         (DeclSpace.initialize_type_params): New private method;
4831         initializes the `type_param_list' field from the type parameters
4832         from this and all enclosing classes.
4833         (DeclSpace.TypeParameters): Call initialize_type_params() unless
4834         we're already initialized.
4835
4836 2004-02-23  Martin Baulig  <martin@ximian.com>
4837
4838         * class.cs (Method.Define): Create the generic method before
4839         calling DoDefine().
4840         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
4841         the TypeContainer one); we use this for generic methods.
4842
4843         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
4844         parent's TypeBuilder.
4845
4846 2004-02-18  Martin Baulig  <martin@ximian.com>
4847
4848         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
4849         to check for equality.
4850
4851 2004-02-05  Martin Baulig  <martin@ximian.com>
4852
4853         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
4854         `ec.TypeContainer.CurrentType', use it instead of
4855         `ec.ContainerType' to check whether we're in the type's ctor.
4856
4857 2004-01-29  Martin Baulig  <martin@ximian.com>
4858
4859         * expression.cs (Invocation.DoResolve): If we're a
4860         `ConstructedType', then we're actually a generic method, so
4861         rewrite the expr as a GenericMemberAccess.
4862
4863         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
4864         here; manually parse it into a string.
4865
4866 2004-01-28  Martin Baulig  <martin@ximian.com>
4867
4868         * typemanager.cs (TypeManager.IsEqual): New static method.
4869         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
4870         check for equality instead of using `=='.
4871
4872 2004-01-26  Martin Baulig  <martin@ximian.com>
4873
4874         * decl.cs (DeclSpace.CurrentType): New public field.
4875
4876         * expression.cs (This.ResolveBase): If we have an
4877         `ec.TypeContainer.CurrentType', use it instead of
4878         `ec.ContainerType'.
4879
4880         * class.cs (TypeContainer.DefineType): If we're a generic type,
4881         create the `CurrentType' (unresolved).
4882         (TypeContainer.GenericType): New private field.
4883         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
4884         it and store it in `GenericType' before creating the MemberCache.
4885         (TypeContainer.GetMembers): If we have a `GenericType', call
4886         TypeManager.FindMembers() on it.
4887
4888         * interface.cs (Interface.GenericType): New private field.
4889         (Interface.DefineType): If we're a generic type, create the
4890         `CurrentType' (unresolved).
4891         (Interface.DefineMembers): If we have a `CurrentType', resolve it
4892         and store it in `GenericType' before creating the MemberCache.
4893         (Interface.GetMembers): If we have a `GenericType', call
4894         TypeManager.FindMembers() on it.
4895
4896 2004-01-22  Martin Baulig  <martin@ximian.com>
4897
4898         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4899         not a QualifiedIdentifier.  This is what `type_name_expression'
4900         was previously doing.
4901         (type_name_expression): Removed; the code is now in
4902         `namespace_or_type_name'.
4903         (qualified_identifier): Removed, use `namespace_or_type_name'
4904         instead.
4905         (QualifiedIdentifier): Removed this class.      
4906
4907 2004-01-22  Martin Baulig  <martin@ximian.com>
4908
4909         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4910         not a string as alias name.
4911
4912 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4913
4914         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4915         #52730 bug, and instead compute correctly the need to use a
4916         temporary variable when requesting an address based on the
4917         static/instace modified of the field and the constructor.
4918  
4919 2004-01-21  Martin Baulig  <martin@ximian.com>
4920
4921         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4922         class and namespace before looking up aliases.  Fixes #52517.
4923
4924 2004-01-21  Martin Baulig  <martin@ximian.com>
4925
4926         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4927         assinged in a 'try'; fixes exception4.cs.
4928
4929 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4930         * class.cs : Implemented parameter-less constructor for TypeContainer
4931
4932         * decl.cs: Attributes are now stored here. New property OptAttributes
4933
4934         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4935
4936         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4937
4938 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4939
4940         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4941           (CSharpSignature): New method for indexer and property signature.
4942
4943 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4944
4945         * pending.cs (IsVirtualFilter): Faster implementation.
4946
4947 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4948
4949         * typemanager.cs: Avoid inclusion of same assembly more than once.
4950
4951 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4952
4953         * cs-parser.jay: Fixed problem where the last assembly attribute
4954           has been applied also to following declaration (class, struct, etc.)
4955           
4956 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4957
4958         * class.cs: Added error CS0538, CS0539 reporting.
4959         Fixed crash on Microsoft runtime when field type is void.
4960
4961         * cs-parser.jay: Added error CS0537 reporting.
4962
4963         * pending.cs: Added error CS0535 reporting.
4964         Improved error report for errors CS0536, CS0534.
4965
4966 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4967
4968         Merge a few bits from the Anonymous Method MCS tree.
4969
4970         * statement.cs (ToplevelBlock): New class for toplevel methods,
4971         will hold anonymous methods, lifted variables.
4972
4973         * cs-parser.jay: Create toplevel blocks for delegates and for
4974         regular blocks of code. 
4975
4976 2004-01-20  Martin Baulig  <martin@ximian.com>
4977
4978         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4979         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4980         and `NeedExplicitReturn'; added `IsLastStatement'.
4981         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4982         have a `ReturnLabel' or we're not unreachable.
4983
4984         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4985         child's reachability; don't just override ours with it.  Fixes
4986         #58058 (lluis's example).
4987         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4988         InFinally(), InLoop(), InSwitch() and
4989         BreakCrossesTryCatchBoundary() methods.
4990
4991         * statement.cs (Return): Do all error checking in Resolve().
4992         Unless we are the last statement in a top-level block, always
4993         create a return label and jump to it.
4994         (Break, Continue): Do all error checking in Resolve(); also make
4995         sure we aren't leaving a `finally'.
4996         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4997         statement in a top-level block.
4998         (Block.Flags): Added `IsDestructor'.
4999         (Block.IsDestructor): New public property.
5000
5001 2004-01-20  Martin Baulig  <martin@ximian.com>
5002
5003         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
5004
5005 2004-01-20  Martin Baulig  <martin@ximian.com>
5006
5007         * statement.cs (Statement.ResolveUnreachable): New public method.
5008         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
5009         (Block.Resolve): Resolve unreachable statements.
5010
5011 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5012
5013         * expression.cs: We need to fix the case where we do
5014         not have a temp variable here.
5015
5016         * assign.cs: Only expression compound assignments need
5017         temporary variables.
5018
5019 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5020
5021         * flowanalysis.cs: Reduce memory allocation in a few ways:
5022           - A block with no variables should not allocate a bit
5023             vector for itself.
5024           - A method with no out parameters does not need any tracking
5025             for assignment of the parameters, so we need not allocate
5026             any data for it.
5027           - The arrays:
5028                 public readonly Type[] VariableTypes;
5029                 public readonly string[] VariableNames;
5030             Are redundant. The data is already stored in the variable
5031             map, so we need not allocate another array for it.
5032           - We need to add alot of checks for if (params | locals) == null
5033             due to the first two changes.
5034
5035 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
5036
5037         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
5038         implement IMemoryLocation, we store a copy on a local variable and
5039         take the address of it.  Patch from Benjamin Jemlich
5040
5041         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
5042         to use a special "type_name_expression" rule which reduces the
5043         number of "QualifiedIdentifier" classes created, and instead
5044         directly creates MemberAccess expressions.
5045
5046 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
5047
5048         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
5049         that fixes #52853.  Null literal assignment to ValueType
5050
5051         * class.cs (MethodData.Emit): Instead of checking the name of the
5052         method to determine if its a destructor, create a new derived
5053         class from Method called Destructor, and test for that.  
5054
5055         * cs-parser.jay: Create a Destructor object instead of a Method.  
5056
5057         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
5058
5059         Fixes: 52933
5060
5061 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
5062
5063         * expression.cs (Binary.ResolveOperator): Perform an implicit
5064         conversion from MethodGroups to their delegate types on the
5065         Addition operation.
5066
5067         * delegate.cs: Introduce a new class DelegateCreation that is the
5068         base class for `NewDelegate' and `ImplicitDelegateCreation',
5069         factor some code in here.
5070
5071         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
5072         conversion from MethodGroups to compatible delegate types. 
5073
5074         * ecore.cs (Expression.Resolve): Do not flag error 654
5075         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
5076         we allow conversions from MethodGroups to delegate types now.
5077
5078         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
5079         assignments in v2 either.
5080
5081 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
5082
5083         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
5084         static read-only fields in ctors.
5085
5086         Applied patch from Benjamin Jemlich 
5087
5088         * expression.cs (UnaryMutator): Avoid leaking local variables. 
5089
5090 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
5091
5092         * cs-tokenizer.cs (IsCastToken): Allow the various native types
5093         here to return true, as they can be used like this:
5094
5095                 (XXX) int.MEMBER ()
5096
5097         Fixed 49836 and all the other dups
5098
5099 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
5100
5101         * driver.cs: Implement /win32res and /win32icon.
5102
5103 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
5104
5105         * cs-parser.jay: Add a rule to improve error handling for the
5106         common mistake of placing modifiers after the type.
5107
5108 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
5109
5110         * cs-parser.jay (interface_event_declaration): Catch
5111         initialization of events on interfaces, and report cs0068
5112
5113         * cs-parser.jay (interface_event_declaration): Catch
5114         initialization of events. 
5115
5116         * ecore.cs: Better report missing constructors.
5117
5118         * expression.cs (Binary.ResolveOperator): My previous bug fix had
5119         the error reporting done in the wrong place.  Fix.
5120
5121         * expression.cs (Binary.ResolveOperator): Catch the 
5122         operator + (E x, E y) error earlier, and later allow for implicit
5123         conversions in operator +/- (E e, U x) from U to the underlying
5124         type of E.
5125
5126         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
5127         52596, if the container class is abstract, the default constructor
5128         is protected otherwise its public (before, we were always public).
5129
5130         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
5131         fixed statement.
5132
5133         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
5134         Jemlich that fixes bug #52597, MCS was generating invalid code for
5135         idisposable structs.   Thanks to Ben for following up with this
5136         bug as well.
5137
5138 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
5139
5140         * driver.cs: Allow assemblies without code to be generated, fixes
5141         52230.
5142
5143 2004-01-07  Nick Drochak <ndrochak@gol.com>
5144
5145         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
5146
5147 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
5148
5149         * cs-parser.jay: Add rules to improve error reporting if fields or
5150         methods are declared at the namespace level (error 116)
5151
5152         * Add rules to catch event add/remove
5153
5154 2004-01-04  David Sheldon <dave-mono@earth.li>
5155
5156   * expression.cs: Added matching ")" to error message for 
5157   CS0077
5158
5159 2004-01-03 Todd Berman <tberman@gentoo.org>
5160
5161         * ecore.cs, attribute.cs:
5162         Applying fix from #52429.
5163
5164 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5165
5166         * ecore.cs, expression.cs, statement.cs:
5167         Total rewrite of how we handle branching. We
5168         now handle complex boolean expressions with fewer
5169         jumps. As well if (x == 0) no longer emits a ceq.
5170
5171         if (x is Foo) is much faster now, because we generate
5172         better code.
5173
5174         Overall, we get a pretty big improvement on our benchmark
5175         tests. The code we generate is smaller and more readable.
5176
5177         I did a full two-stage bootstrap. The patch was reviewed
5178         by Martin and Miguel.
5179
5180 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5181
5182         * cs-parser.jay: Make primary_expression not take a QI.
5183         we dont need this because the member_access rule covers
5184         us here. So we replace the rule with just IDENTIFIER.
5185
5186         This has two good effects. First, we remove a s/r conflict.
5187         Second, we allocate many fewer QualifiedIdentifier objects.
5188
5189 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5190
5191         * attribute.cs: Handle MarshalAs attributes as pseudo, and
5192         set the correct information via SRE. This prevents
5193         hanging on the MS runtime. Fixes #29374.
5194
5195 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5196
5197         * convert.cs: correctly handle conversions to value types
5198         from Enum and ValueType as unboxing conversions.
5199
5200         Fixes bug #52569. Patch by Benjamin Jemlich.
5201
5202 2004-01-02  Ravi Pratap  <ravi@ximian.com>
5203
5204         * expression.cs (BetterConversion): Prefer int -> uint
5205         over int -> ulong (csc's behaviour). This fixed bug #52046.
5206
5207 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5208
5209         * decl.cs (MemberCache.FindMembers): now returns a
5210         MemberInfo [].
5211
5212         * typemanager.cs: In general, go with with ^^.
5213         (CopyNewMethods): take an IList.
5214         (RealMemberLookup): Only allocate an arraylist
5215         if we copy from two sets of methods.
5216
5217         This change basically does two things:
5218         1) Fewer array lists allocated due to CopyNewMethods.
5219         2) the explicit cast in MemberList costed ALOT.
5220
5221 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
5222
5223         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
5224         a hashtable to avoid needless string allocations when an identifier is
5225         used more than once (the common case).
5226
5227 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5228
5229         * pending.cs: MS's TypeBuilder.GetInterfaces ()
5230         is broken, it will not return anything. So, we
5231         have to use the information we have in mcs to
5232         do the task.
5233
5234         * typemanager.cs: Add a cache for GetInterfaces,
5235         since this will now be used more often (due to ^^)
5236
5237         (GetExplicitInterfaces) New method that gets the
5238         declared, not effective, interfaces on a type
5239         builder (eg, if you have interface IFoo, interface
5240         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
5241         { IBar }.
5242
5243         This patch makes MCS able to bootstrap itself on
5244         Windows again.
5245
5246 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5247
5248         * expression.cs: Remove the Nop's that Miguel put
5249         in by mistake.
5250
5251 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5252
5253         * report.cs, codegen.cs: Give the real stack trace to
5254         the error when an exception is thrown.
5255
5256 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5257
5258         * decl.cs: only allocate hashtables for ifaces if 
5259         it is an iface!
5260
5261 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5262
5263         * expression.cs: fix the error from cs0121-2.cs
5264         (a parent interface has two child interfaces that
5265         have a function with the same name and 0 params
5266         and the function is called through the parent).
5267
5268 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
5269
5270         * class.cs, rootcontext.cs, typmanager.cs: do not
5271         leak pointers.
5272
5273 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5274
5275         * codegen.cs: remove stack for the ec flow branching.
5276         It is already a linked list, so no need.
5277
5278 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5279
5280         * Makefile: Allow custom profiler here.
5281
5282 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5283
5284         * typemanager.cs (LookupType):
5285           - Use a static char [], because split takes
5286             a param array for args, so it was allocating
5287             every time.
5288           - Do not store true in a hashtable, it boxes.
5289
5290 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5291
5292         * flowanalysis.cs: bytify common enums.
5293
5294 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5295
5296         * modifiers.cs: Add a new set of flags for the
5297         flags allowed on explicit interface impls.
5298         * cs-parser.jay: catch the use of modifiers in
5299         interfaces correctly.
5300         * class.cs: catch private void IFoo.Blah ().
5301
5302         All related to bug #50572.
5303
5304 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5305
5306         * decl.cs: Rewrite the consistant accessability checking.
5307         Accessability is not linear, it must be implemented in
5308         a tableish way. Fixes #49704.
5309
5310 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5311
5312         * expression.cs: Handle negation in a checked context.
5313         We must use subtraction from zero. Fixes #38674.
5314
5315 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5316
5317         * class.cs: Ignore static void main in DLLs.
5318         * rootcontext.cs: Handle the target type here,
5319         since we are have to access it from class.cs
5320         * driver.cs: account for the above.
5321
5322 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5323
5324         * report.cs: Give line numbers and files if available.
5325
5326 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
5327
5328         * driver.cs: Implement /addmodule.
5329
5330         * typemanager.cs:  Change 'modules' field so it now contains Modules not
5331         ModuleBuilders.
5332
5333 2003-12-20  Martin Baulig  <martin@ximian.com>
5334
5335         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
5336         (FieldBase.IsAssigned): Removed this field.
5337         (FieldBase.SetAssigned): New public method.
5338         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
5339
5340 2003-12-20  Martin Baulig  <martin@ximian.com>
5341
5342         * expression.cs (LocalVariableReference.DoResolve): Don't set
5343         `vi.Used' if we're called from DoResolveLValue().
5344
5345         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
5346         returns the usage vector it just merged into the current one -
5347         pass this one to UsageWarning().
5348         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
5349         of the `EmitContext', don't call this recursively on our children.
5350
5351 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
5352
5353         * driver.cs: Implement /target:module.
5354
5355 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
5356
5357         * support.cs (CharArrayHashtable): New helper class.
5358
5359         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
5360         char arrays, not strings, so we can avoid creating a string in
5361         consume_identifier if the identifier is a keyword.
5362
5363 2003-12-16  Martin Baulig  <martin@ximian.com>
5364
5365         * statement.cs (LocalInfo.Assigned): Removed this property.
5366         (LocalInfo.Flags): Removed `Assigned'.
5367         (LocalInfo.IsAssigned): New public method; takes the EmitContext
5368         and uses flow analysis.
5369         (Block.UsageWarning): Made this method private.
5370         (Block.Resolve): Call UsageWarning() if appropriate.
5371
5372         * expression.cs (LocalVariableReference.DoResolve): Always set
5373         LocalInfo.Used here.
5374
5375 2003-12-13  Martin Baulig  <martin@ximian.com>
5376
5377         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
5378         any value here; we're now using flow analysis to figure out
5379         whether a statement/block returns a value.
5380
5381 2003-12-13  Martin Baulig  <martin@ximian.com>
5382
5383         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
5384         working again.
5385         (FlowBranching.MergeFinally): Don't call
5386         `branching.CheckOutParameters()' here, this is called in
5387         MergeTopBlock().
5388         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5389         when adding the `finally' vector.       
5390
5391 2003-12-13  Martin Baulig  <martin@ximian.com>
5392
5393         * flowanalysis.cs
5394         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5395         actually work and also fix #48962.
5396
5397 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5398
5399         * decl.cs: Do not check System.Object for nested types,
5400         since we know it does not have any. Big bang for buck:
5401
5402         BEFORE:
5403            Run 1:   8.35 seconds
5404            Run 2:   8.32 seconds
5405            corlib:  17.99 seconds
5406         AFTER:
5407            Run 1:   8.17 seconds
5408            Run 2:   8.17 seconds
5409            corlib:  17.39 seconds
5410
5411 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5412
5413         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5414         time we are returning 0 members, so we save alot here.
5415
5416 2003-12-11  Martin Baulig  <martin@ximian.com>
5417
5418         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5419         `MergeChild()', also just take the `FlowBranching' as argument;
5420         call Merge() on it and return the result.
5421         (FlowBranching.Merge): We don't need to do anything if we just
5422         have one sibling.
5423
5424 2003-12-11  Martin Baulig  <martin@ximian.com>
5425
5426         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5427         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5428         Maurer for this idea.
5429
5430 2003-12-11  Martin Baulig  <martin@ximian.com>
5431
5432         * flowanalysis.cs (MergeResult): This class is now gone; we now
5433         use the `UsageVector' for this.  The reason for this is that if a
5434         branching just has one sibling, we don't need to "merge" them at
5435         all - that's the next step to do.
5436         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5437         `MergeResult'.
5438
5439 2003-12-11  Martin Baulig  <martin@ximian.com>
5440
5441         Reworked flow analyis and made it more precise and bug-free.  The
5442         most important change is that we're now using a special `Reachability'
5443         class instead of having "magic" meanings of `FlowReturns'.  I'll
5444         do some more cleanups and optimizations and also add some more
5445         documentation this week.
5446
5447         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5448         largely reworked this class.
5449         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5450         the new `Reachability' class instead of having "magic" values here.
5451         (FlowBranching): We're now using an instance of `Reachability'
5452         instead of having separate `Returns', `Breaks' etc. fields.
5453
5454         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5455         based on flow analysis; ignore the return value of block.Emit ().
5456
5457 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5458
5459         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5460         if they are private.
5461
5462 2003-12-09  Martin Baulig  <martin@ximian.com>
5463
5464         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5465         call them directly on the UsageVector.
5466
5467 2003-12-09  Martin Baulig  <martin@ximian.com>
5468
5469         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5470         Changed return type from `FlowReturns' to `Reachability'.
5471
5472 2003-12-09  Martin Baulig  <martin@ximian.com>
5473
5474         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5475         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5476         `Reachable' fields with a single `Reachability' one.
5477
5478 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5479
5480         * class.cs (FindMembers): Remove foreach's.
5481
5482         Bootstrap times:
5483
5484         BEFORE
5485                 Run 1:   8.74 seconds
5486                 Run 2:   8.71 seconds
5487
5488         AFTER
5489                 Run 1:   8.64 seconds
5490                 Run 2:   8.58 seconds
5491
5492
5493 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5494
5495         * cs-parser.jay:
5496         * gen-treedump.cs:
5497         * statement.cs:
5498         This patch does a few things:
5499                 1. EmptyStatement is now a singleton, so it is never reallocated.
5500                 2. All blah is EmptyStatement constructs have been changed to
5501                    blah == EmptyStatement.Value, which is much faster and valid
5502                    now that EmptyStatement is a singleton.
5503                 3. When resolving a block, rather than allocating a new array for
5504                    the non-empty statements, empty statements are replaced with
5505                    EmptyStatement.Value
5506                 4. Some recursive functions have been made non-recursive.
5507         Mainly the performance impact is from (3), however (1) and (2) are needed for
5508         this to work. (4) does not make a big difference in normal situations, however
5509         it makes the profile look saner.
5510
5511         Bootstrap times:
5512
5513         BEFORE
5514         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5515         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5516         Total memory allocated: 56397 KB
5517
5518         AFTER
5519         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5520         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5521         Total memory allocated: 55666 KB
5522
5523 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5524
5525         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5526         than the hashtable in a hashtable version
5527
5528         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5529         we always end up concating a string. This results in a huge perf
5530         loss, because many strings have to be tracked by the GC. In this
5531         patch, we first use a hashtable that works with two keys, so that
5532         the strings do not need to be concat'ed.
5533
5534         Bootstrap times:
5535         BEFORE
5536                 Run 1:   8.74 seconds
5537                 Run 2:   8.71 seconds
5538
5539         AFTER
5540                 Run 1:   8.65 seconds
5541                 Run 2:   8.56 seconds
5542
5543 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5544
5545         * Makefile: Add a new target `do-time' that does a quick and simple
5546         profile, leaving easy to parse output.
5547
5548 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5549
5550         * codegen.cs (Init): Create the dynamic assembly with 
5551         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5552
5553 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5554
5555         * support.cs: Make the PtrHashtable use only one
5556         instance of its comparer.
5557
5558 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5559
5560         * typemanager.cs: Fix lookup of GetNamespaces.
5561
5562 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5563
5564         * expression.cs: Removed redundant line.
5565
5566         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5567         ArrayLists, use for loops with bounds.  
5568
5569         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5570         arraylist.
5571
5572         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5573         arraylists, use for loop with bounds.
5574
5575         The above three changes give us a 0.071 second performance
5576         improvement out of 3.294 seconds down to 3.223.  On my machine
5577         the above changes reduced the memory usage by 1,387 KB during
5578         compiler bootstrap.
5579
5580         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5581         QualifiedIdentifiers.  Before we created a new string through
5582         concatenation, and mostly later on, the result would be
5583         manipulated by DecomposeQI through string manipulation.
5584
5585         This reduced the compiler memory usage for bootstrapping from
5586         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5587         compile times in 0.05 seconds.
5588
5589 2003-11-28  Dick Porter  <dick@ximian.com>
5590
5591         * support.cs: Do string compares with the Invariant culture.
5592
5593         * rootcontext.cs: 
5594         * gen-treedump.cs: 
5595         * expression.cs: 
5596         * driver.cs: 
5597         * decl.cs: 
5598         * codegen.cs: 
5599         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5600         the comparison is done with the Invariant culture.
5601
5602 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5603
5604         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5605         GetEnumerator method.
5606
5607         (ProbeCollectionType): Iterate starting at the most specific type
5608         upwards looking for a GetEnumerator
5609
5610         * expression.cs: Shift count can be up to 31 for int/uint and 63
5611         for long/ulong.
5612
5613 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5614
5615         * statement.cs (Block.LookupLabel): Also look for the label on the
5616         children blocks.  Use a hash table to keep track of visited
5617         nodes. 
5618
5619         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5620         we actually did transform the other operand, otherwise fall back
5621         to the common codepath that casts to long.
5622
5623         * cs-tokenizer.cs: Use the same code pattern as the int case.
5624         Maybe I should do the parsing myself, and avoid depending on the
5625         Parse routines to get this done.
5626
5627 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5628
5629         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5630         which fixes bug 51347.  This time test it.
5631
5632         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5633         attributes for example can not tell the difference between these.
5634         The difference was only a syntax feature of the language. 
5635
5636         * attribute.cs: Apply attributes to delegates.
5637
5638         * delegate.cs: Call the apply attributes method.
5639
5640 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5641
5642         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5643         comparing 0 vs Byte.MinValue, not the value
5644
5645         (ImplicitConversionRequired): When reporting a conversion error,
5646         use error 31 to print out the constant error instead of the
5647         simpler 29.
5648
5649         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5650         which fixes bug 51347.
5651
5652 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5653
5654         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5655         which fixes the -warnaserror command line option.
5656
5657 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5658
5659         * cfold.cs (DoNumericPromotions): During constant folding of
5660         additions on UIntConstant, special case intconstants with
5661         IntConstants like we do on the expression binary operator. 
5662
5663 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5664
5665         * convert.cs (ImplicitReferenceConversion): We were missing a case
5666         (System.Enum are not value types or class types, so we need to
5667         classify them separatedly).
5668
5669         * driver.cs: We do not support error 2007.
5670
5671 2003-11-12 Jackson Harper <jackson@ximian.com>
5672
5673         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5674         system directory. Also use the full file name so users can
5675         libraries names mscorlib-o-tron.dll in a non system dir.
5676         
5677 2004-01-04  David Sheldon <dave-mono@earth.li>
5678
5679         * expression.cs: Added matching ")" to error message for CS0077.
5680
5681 2003-12-19  Martin Baulig  <martin@ximian.com>
5682
5683         * typemanager.cs (TypeManager.IsEqualGenericType): New public
5684         static method; see documentation in the method.
5685         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
5686
5687         * convert.cs (Convert.ImplicitReferenceConversion,
5688         Convert.ImplicitReferenceConversionExists): Add support for
5689         generic type declarations; see gen-36.cs.
5690
5691 2003-12-19  Martin Baulig  <martin@ximian.com>
5692
5693         * pending.cs (Pending.InterfaceMethod): Use
5694         `Type.IsAssignableFrom()' instead of `=='.
5695
5696 2003-12-18  Martin Baulig  <martin@ximian.com>
5697
5698         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
5699         byref types first.
5700
5701         * convert.cs (Convert.ImplicitStandardConversionExists): Use
5702         `expr_type.Equals (target_type)' instead of `=='.
5703
5704 2003-12-08  Martin Baulig  <martin@ximian.com>
5705
5706         * generics.cs (Constraints.Types): Removed.
5707         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
5708         to Type's.
5709         (Constraints.ResolveTypes): New public method; resolves the
5710         TypeExpr's to Type's.
5711         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
5712         longer takes the constraints.
5713         (TypeParameter.DefineMethod): Likewise.
5714         (TypeParameter.DefineType): New public method.  Calls
5715         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
5716         the constraints.
5717
5718 2003-12-08  Martin Baulig  <martin@ximian.com>
5719
5720         * convert.cs (Convert.ImplicitConversionStandard): Use
5721         `expr_type.Equals (target_type)' instead of `=='.
5722
5723 2003-12-08  Martin Baulig  <martin@ximian.com>
5724
5725         * typemanager.cs (TypeManager.GetReferenceType): Call
5726         `Type.MakeByRefType ()'.
5727
5728 2003-12-08  Martin Baulig  <martin@ximian.com>
5729
5730         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
5731         just has some special meaning in some situations.  For instance,
5732         it is allowed to use `where' as the name of a variable etc.
5733
5734 2003-12-04  Martin Baulig  <martin@ximian.com>
5735
5736         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
5737         `Type.MakeArrayType()' for array types.
5738
5739 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
5740
5741         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
5742         debugging message.
5743
5744         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
5745         corlib to compile.
5746
5747 2003-11-16  Martin Baulig  <martin@ximian.com>
5748
5749         * codegen.cs (EmitContext.IsGeneric): Removed.
5750
5751         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
5752         ResolveGeneric() on the DeclSpace.
5753
5754 2003-11-16  Martin Baulig  <martin@ximian.com>
5755
5756         * generic.cs (TypeArguments.Resolve):
5757         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
5758         `ResolveType()' on it to get the Type.
5759
5760 2003-11-15  Martin Baulig  <martin@ximian.com>
5761
5762         * generic.cs (ConstructedType.GetInterfaces): Override this.
5763
5764 2003-11-14  Martin Baulig  <martin@ximian.com>
5765
5766         * interface.cs (Interface.DefineType): Define all type parameters
5767         before adding the interfaces we inherit.
5768
5769 2003-11-11  Martin Baulig  <martin@ximian.com>
5770
5771         * generic.cs (ConstructedType.ResolveType): Always call
5772         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
5773
5774 2003-11-10  Martin Baulig  <martin@ximian.com>
5775
5776         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5777         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5778         calling `ResolveType()' on them, directly assign their `Type'.
5779
5780 2003-11-08  Martin Baulig  <martin@ximian.com>
5781
5782         * generic.cs (ConstructedType): Override `IsClass' etc.
5783
5784 2003-11-08  Martin Baulig  <martin@ximian.com>
5785
5786         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5787         return value and the `out parent' parameter.
5788         (TypeContainer.DefineType): Moved the CS0644 check into
5789         GetClassBases().  Don't pass the interface types to the
5790         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5791         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5792
5793         * ecore.cs (TypeExpr.IsAttribute): New property.
5794         (TypeExpr.GetInterfaces): New method.
5795
5796         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5797         TypeExpr instead of a Type.
5798         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5799         (Interface.DefineType): Don't pass the interface types to the
5800         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5801         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5802
5803         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5804         instead of a `Type[]'.
5805         (TypeManager.RegisterBuilder): Likewise.
5806         (TypeManager.AddUserInterface): Likewise.
5807         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5808         `Type[]' and also return a `TypeExpr[]'.
5809         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5810
5811 2003-11-08  Martin Baulig  <martin@ximian.com>
5812
5813         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5814         Expression.     
5815
5816 2003-11-08  Martin Baulig  <martin@ximian.com>
5817
5818         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5819         TypeManager.ResolveExpressionTypes().
5820
5821         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5822         instead of an Expression.
5823         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5824         (TypeExpression): New public class; formerly known as `TypeExpr'.
5825
5826         * expression.cs (ComposedCast): Derive from TypeExpr.
5827
5828         * typemanager.cs (TypeManager.system_*_expr): These are now
5829         TypExpr's instead of Expression's.
5830         (TypeManager.ResolveExpressionTypes): New public static function;
5831         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5832         of them.        
5833
5834 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5835
5836         * expression.cs (New.DoResolve): Do not dereference value that
5837         might be a null return.
5838
5839         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5840         sure that the constant value has the right type.  Fixes an
5841         unreported bug, similar to 50425.
5842
5843         * const.cs (Const.LookupConstantValue): Call
5844         ImplicitStandardConversionExists before doing a conversion to
5845         avoid havng the TypeManager.ChangeType do conversions.
5846
5847         Reduced the number of casts used
5848
5849         (Const.ChangeType): New routine to enable reuse of the constant
5850         type changing code from statement.
5851
5852         * typemanager.cs (ChangeType): Move common initialization to
5853         static global variables.
5854
5855         Fixes #50425.
5856
5857         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5858         every value type to go through, even if it was void.  Fix that. 
5859
5860         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5861         character of the define, and the is_identifier_part_character for
5862         the rest of the string.
5863
5864 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5865
5866         * expression.cs (UnaryMutator.EmitCode): When I updated
5867         LocalVariableReference.DoResolve, I overdid it, and dropped an
5868         optimization done on local variable references.
5869
5870 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5871
5872         * ecore.cs: Convert the return from Ldlen into an int.
5873
5874 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5875
5876         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5877         the accessibility, this is a special case for toplevel non-public
5878         classes (internal for instance).
5879
5880 2003-10-20  Nick Drochak <ndrochak@gol.com>
5881
5882         * ecore.cs: Fix typo and build.  Needed another right paren.
5883
5884 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5885
5886         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5887         `internal' case regular and protected, but not allowing protected
5888         to be evaluated later.  Bug 49840
5889
5890 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5891
5892         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5893         to kb.Nlast, and not the kb.nFirst to isolate the switch
5894         statement.
5895
5896         Extract the underlying type, so enumerations of long/ulong are
5897         treated like long/ulong.
5898
5899 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5900
5901         * expression.cs (New): Overload the meaning of RequestedType to
5902         track the possible creation of the NewDelegate type, since
5903         DoResolve is invoked more than once for new constructors on field
5904         initialization.
5905
5906         See bugs: #48800 and #37014
5907
5908         * cs-parser.jay (declare_local_constants): Take an arraylist
5909         instead of a single constant.
5910
5911         (local_constant_declaration): It should take a
5912         constant_declarators, not a constant_declarator.  Fixes 49487
5913
5914         * convert.cs: Fix error report.
5915
5916 2003-10-13 Jackson Harper <jackson@ximian.com>
5917
5918         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5919         bug #49611
5920         
5921 2003-11-03  Martin Baulig  <martin@ximian.com>
5922
5923         * expression.cs (ArrayAccess.GetStoreOpcode): Added
5924         `out bool has_type_arg'; if set, we need to pass the type to
5925         ig.Emit().
5926         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
5927         Stelem_Any/Ldelem_Any for generic parameters.   
5928
5929 2003-11-02  Martin Baulig  <martin@ximian.com>
5930
5931         * expression.cs (Invocation.EmitCall): Use
5932         `TypeManager.IsValueType()' to check whether it's a value type.
5933         Don't set `struct_call' when calling a method on a type parameter.
5934
5935 2003-11-02  Martin Baulig  <martin@ximian.com>
5936
5937         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
5938         and removed the TypeBuilder argument.
5939
5940         * typemanager.cs (TypeManager.IsValueType): Return
5941         `t.IsGenericParameter || t.IsValueType'.
5942
5943 2003-10-25  Martin Baulig  <martin@ximian.com>
5944
5945         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
5946         call ConstructedType.Resolve() on it.
5947
5948         * generic.cs (ConstructedType.Resolve): Set `type' on success.
5949
5950 2003-10-25  Martin Baulig  <martin@ximian.com>
5951
5952         * class.cs (TypeContainer.GetClassBases): Changed
5953         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
5954         CS8214 reporting here.
5955         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
5956         instead of a `Type' for our parent.  In case of a recursive
5957         declaration (see tests/gen-23.cs for an example), our parent is a
5958         ConstructedType and it doesn't have its type set.  So, first
5959         create our own TypeBuilder, then call constructed.Resolve() to get
5960         the parent's type and finally TypeBuilder.SetParent() it.
5961
5962         * ecore.cs (TypeExpr.Name): New public virtual property.
5963
5964         * generic.cs
5965         (ConstructedType): We're now a TypeExpr and not just an Expression.
5966         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
5967         arguments here; this is done later.
5968         (ConstructedType.Resolve): New public method to resolve the type
5969         arguments and bind them.
5970
5971 2003-10-21  Martin Baulig  <martin@ximian.com>
5972
5973         * convert.cs: Use `TypeManager.IsValueType' instead of
5974         'type.IsValueType' everywhere.
5975
5976         * typemanager.cs (TypeManager.IsValueType): Return true for type
5977         parameters.  The reason for this is that we need to box a type
5978         parameter when converting it to a reference type.
5979
5980         * cs-parser.jay: Added support for default value expressions.
5981
5982         * generics.cs (DefaultValueExpression): New public class.       
5983
5984 2003-10-17  Martin Baulig  <martin@ximian.com>
5985
5986         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
5987         TypeContainer so we can also use this for Interfaces.
5988         (TypeParameter.Resolve): Likewise.
5989
5990         * interface.cs (Interface.DefineType): Added support for generic
5991         interfaces.
5992
5993         * cs-parser.jay: Added support for generic structs and interfaces.
5994
5995 2003-10-17  Martin Baulig  <martin@ximian.com>
5996
5997         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
5998         call generic methods :-)
5999
6000 2003-10-16  Martin Baulig  <martin@ximian.com>
6001
6002         * cs-parser.jay (namespace_or_type_name): Only create a
6003         GenericMemberAccess if we actually have type arguments.
6004
6005 2003-10-13  Martin Baulig  <martin@ximian.com>
6006
6007         * class.cs (Method.Define): If we're a generic method, call
6008         TypeBuilder.DefineGenericMethod () before resolving
6009         the parameters.
6010         (MethodData): Added .ctor which takes an additional MethodBuilder
6011         argument; this is used for generic methods.
6012         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
6013         we already have a MethodBuilder.
6014
6015 2003-10-10  Martin Baulig  <martin@ximian.com>
6016
6017         * class.cs (Method): Added .ctor which takes a `GenericMethod'
6018         instead of a `DeclSpace'.  This is used for generic methods.
6019
6020         * cs-parser.jay (method_header): Added support for generic
6021         methods; create a `GenericMethod' instance and pass it to the
6022         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
6023         parameters and locals.
6024
6025         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
6026         since we already have the location.  Check whether we're a generic
6027         type declaration or a generic method and create the correct type
6028         parameter.
6029
6030         * generic.cs (TypeParameter.DefineMethod): New public method.
6031         (GenericMethod): New public class; derives from DeclSpace and is
6032         used for generic methods.       
6033
6034 2003-10-09  Martin Baulig  <martin@ximian.com>
6035
6036         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
6037         to the .ctor.
6038         (MethodCore.DoDefineParameters): Removed the TypeContainer
6039         argument; use the DeclSpace which was passed to the .ctor instead.
6040         (MethodCore.CheckParameter): Take a DeclSpace instead of a
6041         TypeContainer; we only need a DeclSpace here.
6042
6043 2003-10-09  Martin Baulig  <martin@ximian.com>
6044
6045         * class.cs (MethodData): Added additional `DeclSpace ds' argument
6046         to the .ctor.
6047         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
6048         EmitContext's .ctor.    
6049
6050 2003-10-09  Martin Baulig  <martin@ximian.com>
6051
6052         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
6053         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
6054         AsAccessible(), moved them as well.
6055
6056         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
6057
6058 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
6059
6060         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
6061         generation for >=, as spotted by Paolo, bug 48679.  
6062         Patch from David Waite.
6063
6064         * cs-tokenizer.cs: Add handling for #pragma.
6065
6066         * cs-parser.jay: Allow for both yield and yield return in the
6067         syntax.  The anti-cobolization of C# fight will go on!
6068
6069         * class.cs (TypeBuilder.DefineType): Catch error condition here
6070         (Parent.DefineType erroring out and returning null).
6071
6072         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6073         coping with enumerations variables, we were mistakenly processing
6074         them as a regular value type instead of built-in types.  Fixes the
6075         bug #48063
6076
6077         * typemanager.cs (IsBuiltinOrEnum): New method.
6078
6079 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
6080
6081         * cs-parser.jay: Upgrade: yield now needs the return clause.
6082
6083 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
6084
6085         * cs-parser.jay : Renamed yyName to yyNames related to jay.
6086
6087 2003-09-29  Martin Baulig  <martin@ximian.com>
6088
6089         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
6090         inflated generic methods.
6091
6092         * generics.cs (ConstructedType): Distinguish between open and
6093         closed constructed types; correctly resolve the arguments.
6094
6095 2003-09-22  Martin Baulig  <martin@ximian.com>
6096
6097         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
6098         all type arguments meet their constraints.
6099
6100 2003-09-19  Martin Baulig  <martin@ximian.com>
6101
6102         * decl.cs (MemberCache.SetupCacheForInterface): Take a
6103         `MemberCache parent' argument.  Normally, an interface doesn't
6104         have a parent type except System.Object, but we use this in gmcs
6105         for generic type parameters.
6106
6107 2003-09-18  Martin Baulig  <martin@ximian.com>
6108
6109         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
6110         on `type.IsInterface'; don't check whether the type has a parent
6111         to determine whether it's an interface.
6112
6113 2003-09-17  Martin Baulig  <martin@ximian.com>
6114
6115         * generic.cs (ConstructedType.ToString): Always use `name' as the
6116         type name.
6117
6118 2003-09-15  Martin Baulig  <martin@ximian.com>
6119
6120         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
6121
6122         * generic.cs (Constraints.Resolve): New public method; this is
6123         called to resolve the constraint types and to check whether all
6124         the constraints are correct.
6125         (Constraints.Types): New public property.
6126         (TypeParameter.Resolve): New public method; resolves all the
6127         type's constraints.
6128
6129         * class.cs (TypeContainer.DefineType): Call
6130         TypeParameter.Resolve() before actually defining the type.
6131
6132 2003-09-15  Martin Baulig  <martin@ximian.com>
6133
6134         * class.cs (TypeContainer.DefineType): Added an error flag to
6135         avoid reporting duplicate CS0146's ("class definition is
6136         circular.").
6137
6138         * driver.cs (Driver.MainDriver): Abort if
6139         RootContext.ResolveTree() reported any errors.
6140
6141 2003-09-07  Martin Baulig  <martin@ximian.com>
6142
6143         * report.cs (Error, Warning): Added overloaded versions which take
6144         a `params object[] args' and call String.Format().
6145
6146 2003-09-07  Martin Baulig  <martin@ximian.com>
6147
6148         * decl.cs (DeclSpace..ctor): Don't call
6149         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
6150         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
6151         (DeclSpace.RecordDecl): New method.
6152
6153         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
6154
6155 2003-09-02  Ravi Pratap  <ravi@ximian.com>
6156
6157         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
6158         value attributes to be applied to ParameterBuilders.
6159
6160         * class.cs (MethodCore.LabelParameters): Make static and more
6161         generic so that it can be used from other places - like interface
6162         methods, for instance.
6163
6164         * interface.cs (Interface.Emit): Call LabelParameters before
6165         emitting attributes on the InterfaceMethod.
6166
6167 2003-09-07  Martin Baulig  <martin@ximian.com>
6168
6169         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
6170         if the number of type parameters doesn't match.
6171
6172 2003-09-04  Martin Baulig  <martin@ximian.com>
6173
6174         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
6175         for arrays of generic type params (ie. `!0[]').
6176
6177 2003-09-04  Martin Baulig  <martin@ximian.com>
6178
6179         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
6180         for the moment.
6181
6182 2003-09-04  Martin Baulig  <martin@ximian.com>
6183
6184         * decl.cs (DeclSpace.LookupGeneric): New method.
6185         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
6186         moment.
6187
6188         * generic.cs (TypeParameterExpr): Take a TypeParameter as
6189         argument, not just a string.
6190         (TypeParameter.Define): New public method; this is called to
6191         actually define the generic parameter; after this, you can use the
6192         new `Type' property to get the type.
6193
6194 2003-09-04  Martin Baulig  <martin@ximian.com>
6195
6196         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
6197         is now an ArrayList; initialize the result of the `TypeParameters'
6198         property here.
6199         (DeclSpace.GetGenericData): Removed.
6200         (DeclSpace.LookupGeneric): Temporarily removed; we need to
6201         implement this in a different way.
6202         (DeclSpace.GetTypeParameters): Removed; there's now a
6203         `TypeParameters' property.
6204         (DeclSpace.TypeParameters): New public property.
6205
6206         * generic.cs (Constraints): Make this class public.
6207         (TypeParameter): New public class.
6208
6209 2003-09-04  Martin Baulig  <martin@ximian.com>
6210
6211         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
6212         generic parameters.
6213
6214         * class.cs (TypeContainer.DefineType): Call
6215         TypeBuilder.DefineGenericParameter () on all generic parameters if
6216         this is a generic type.
6217
6218 2003-08-28  Martin Baulig  <martin@ximian.com>
6219
6220         * sample-stack.il: Compile this with ilasm: "ilasm /dll
6221         sample-stack.il".
6222
6223         * sample-hello.cs: Compile this with gmcs: "gmcs
6224         /r:sample-stack.dll sample-hello.cs".
6225
6226 2003-08-28  Martin Baulig  <martin@ximian.com>
6227
6228         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
6229         the parameters to the generic type.
6230
6231 2003-08-28  Martin Baulig  <martin@ximian.com>
6232
6233         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
6234
6235 2003-08-28  Martin Baulig  <martin@ximian.com>
6236
6237         * cs-parser.jay (opt_type_argument_list): Use
6238         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
6239         (primary_expression): Replace `qualified_identifier' with `type_name'.
6240         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
6241
6242         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
6243         parser to check whether it is syntactically a type parameter list;
6244         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
6245         this case.
6246
6247 2003-08-26  Martin Baulig  <martin@ximian.com>
6248
6249         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
6250         resolving aliases; fixes #47927.
6251
6252 2003-08-26  Martin Baulig  <martin@ximian.com>
6253
6254         * statement.cs (Using.DoResolve): This is internally emitting a
6255         try/finally clause, so we need to set ec.NeedExplicitReturn if we
6256         do not always return.  Fixes #47681.
6257
6258 2003-08-26  Martin Baulig  <martin@ximian.com>
6259
6260         * decl.cs (MemberCore): Moved WarningNotHiding(),
6261         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
6262         into MemberBase.
6263         (AdditionResult): Make this nested in DeclSpace.
6264         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
6265         argument; call NamespaceEntry.Define() unless we're nested in a
6266         class or struct.
6267
6268         * namespace.cs (Namespace.DefineName): New public function.  This
6269         is called from DeclSpace's .ctor to add 
6270         (Namespace.Lookup): Include DeclSpaces in the lookup.
6271
6272         * class.cs (Operator): Derive from MemberBase, not MemberCore.
6273
6274         * const.cs (Const): Derive from MemberBase, not MemberCore.     
6275
6276 2003-08-25  Martin Baulig  <martin@ximian.com>
6277
6278         * convert.cs (Convert.ExplicitReferenceConversion): When
6279         converting from an interface type to a class, unbox if the target
6280         type is a struct type.  Fixes #47822.
6281
6282 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6283
6284         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
6285         #47854.
6286
6287 2003-08-22  Martin Baulig  <martin@ximian.com>
6288
6289         * class.cs (TypeManager.DefineType): When defining a nested type,
6290         call DefineType() on our parent; fixes #47801.
6291
6292 2003-08-22  Martin Baulig  <martin@ximian.com>
6293
6294         * class.cs (MethodData.Define): While checking if a method is an
6295         interface implementation, improve the test a bit more to fix #47654.
6296
6297 2003-08-22  Martin Baulig  <martin@ximian.com>
6298
6299         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
6300         correctly; fixes #47722.
6301
6302 2003-08-22  Martin Baulig  <martin@ximian.com>
6303
6304         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
6305         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
6306
6307         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
6308
6309 2003-08-22  Martin Baulig  <martin@ximian.com>
6310
6311         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
6312         can only be assigned in static constructors.  Fixes #47161.
6313
6314 2003-08-22  Martin Baulig  <martin@ximian.com>
6315
6316         Rewrote and improved the flow analysis code.
6317
6318         * flowbranching.cs (FlowBranching): Make this class abstract.
6319         (FlowBranching.CreateBranching): New static function to create a
6320         new flow branching.
6321         (FlowBranchingBlock, FlowBranchingException): New classes.
6322         (FlowBranching.UsageVector.Type): New public readonly field.
6323         (FlowBranching.UsageVector.Breaks): Removed the setter.
6324         (FlowBranching.UsageVector.Returns): Removed the setter.
6325         (FlowBranching.UsageVector): Added Break(), Return(),
6326         NeverReachable() and Throw() methods to modify the reachability.
6327         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
6328         done by FlowBranching.Merge().
6329         (FlowBranching.UsageVector.MergeChild): New method; merges the
6330         merge result into the current vector.
6331         (FlowBranching.Merge): New abstract method to merge a branching.
6332
6333 2003-08-12  Martin Baulig  <martin@ximian.com>
6334
6335         * expression.cs (Indirection.CacheTemporaries): Create the
6336         LocalTemporary with the pointer type, not its element type.
6337
6338 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
6339
6340         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
6341         token was a keyword or not.
6342
6343         Add `error' options where an IDENTIFIER was expected;  Provide
6344         CheckToken and CheckIdentifierToken convenience error reporting
6345         functions. 
6346
6347         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
6348
6349         * decl.cs: Rename `NamespaceEntry Namespace' public field into
6350         NameSpaceEntry NameSpaceEntry.
6351
6352         (LookupInterfaceOrClass): Avoid creating a full qualified name
6353         from namespace and name: avoid doing lookups when we know the
6354         namespace is non-existant.   Use new Tree.LookupByNamespace which
6355         looks up DeclSpaces based on their namespace, name pair.
6356
6357         * driver.cs: Provide a new `parser verbose' to display the
6358         exception thrown during parsing.  This is turned off by default
6359         now, so the output of a failure from mcs is more graceful.
6360
6361         * namespace.cs: Track all the namespaces defined in a hashtable
6362         for quick lookup.
6363
6364         (IsNamespace): New method
6365
6366 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
6367
6368         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
6369         we know that we need to concatenate (full typename can never be
6370         null). 
6371
6372         * class.cs: ditto.
6373
6374         * statement.cs: Use a bitfield;  Do not initialize to null things
6375         which are done by the constructor by default.
6376
6377         * cs-parser.jay: bug fix, parameter was 4, not 3.
6378
6379         * expression.cs: Just use the property;
6380
6381         * statement.cs: No need for GetVariableInfo method.
6382
6383 2003-08-08  Martin Baulig  <martin@ximian.com>
6384
6385         * flowanalysis.cs (FlowReturns): This is now nested in the
6386         `FlowBranching' class.
6387         (MyBitVector): Moved this here from statement.cs.
6388         (FlowBranching.SiblingType): New enum type.
6389         (FlowBranching.CreateSibling): Added `SiblingType' argument.
6390
6391 2003-08-07  Martin Baulig  <martin@ximian.com>
6392
6393         * flowanalysis.cs (FlowBranchingType): This is now nested in the
6394         `FlowBranching' class and called `BranchingType'.
6395
6396 2003-08-07  Martin Baulig  <martin@ximian.com>
6397
6398         * flowanalysis.cs: Moved all the control flow analysis code into
6399         its own file.
6400
6401 2003-08-07  Martin Baulig  <martin@ximian.com>
6402
6403         * assign.cs (Assign.DoResolve): `target' must either be an
6404         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
6405         #37319.
6406
6407 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
6408
6409         * expression.cs (BinaryMethod): This kind of expression is created by the
6410         Binary class if it determines that the operator has to be handled
6411         by a method.
6412
6413         (BinaryDelegate): This kind of expression is created if we are
6414         dealing with a + or - operator on delegates.
6415
6416         (Binary): remove method, argumetns, and DelegateOperator: when
6417         dealing with methods, 
6418
6419         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
6420
6421         * statement.cs (Block): use bitfields for the three extra booleans
6422         we had in use.   Remove unused topblock parameter.
6423
6424         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
6425
6426         * assign.cs: Drop extra unneeded tests.
6427
6428 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
6429
6430         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
6431
6432         * statement.cs (Foreach): Use VariableStorage instead of
6433         LocalBuilders.   
6434
6435         * codegen.cs (VariableStorage): New class used by clients that
6436         require a variable stored: locals or fields for variables that
6437         need to live across yield.
6438
6439         Maybe provide a convenience api for EmitThis+EmitLoad?
6440
6441         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
6442         these bad boys.
6443
6444 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
6445
6446         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
6447         RemapParameterLValue): New methods that are used to turn a
6448         precomputed FieldInfo into an expression like this:
6449
6450                 instance.FieldInfo
6451
6452         The idea is to use this instead of making LocalVariableReference
6453         have more than one meaning.
6454
6455         * cs-parser.jay: Add error production to BASE.
6456
6457         * ecore.cs: Deal with TypeManager.GetField returning null, which
6458         is now a valid return value.
6459
6460         (FieldExprNoAddress): New expression for Fields whose address can
6461         not be taken.
6462
6463         * expression.cs (LocalVariableReference): During the resolve
6464         phases, create new expressions if we are in a remapping context.
6465         Remove code that dealt with remapping here.
6466
6467         (ParameterReference): same.
6468
6469         (ProxyInstance): New expression, like the `This' expression, but
6470         it is born fully resolved.  We know what we are doing, so remove
6471         the errors that are targeted to user-provided uses of `this'.
6472
6473         * statement.cs (Foreach): our variable is now stored as an
6474         Expression;  During resolution, follow the protocol, dont just
6475         assume it will return this.
6476
6477 2003-08-06  Martin Baulig  <martin@ximian.com>
6478
6479         * support.cs (SeekableStreamReader.cs): New public class.
6480
6481         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
6482         SeekableStreamReader instead of the normal StreamReader.
6483
6484 2003-08-04  Martin Baulig  <martin@ximian.com>
6485
6486         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
6487         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
6488         deambiguate casts and delegate invocations.
6489         (parenthesized_expression): Use the new tokens to ensure this is
6490         not a cast of method invocation.
6491
6492         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
6493         when reading a `)' and Deambiguate_CloseParens () was previously
6494         called.
6495
6496         * expression.cs (ParenthesizedExpression): New class.  This is
6497         just used for the CS0075 test.
6498         (Binary.DoResolve): Check for CS0075.   
6499
6500 2003-07-29  Ravi Pratap  <ravi@ximian.com>
6501
6502         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
6503         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
6504         reference comparison.
6505
6506         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
6507         examine the ReturnType for equality - this is necessary in the
6508         cases of implicit and explicit operators whose signature also
6509         includes the return type.
6510
6511 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
6512
6513         * namespace.cs: Cache the result of the namespace computation,
6514         instead of computing it every time.
6515
6516 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6517
6518         * decl.cs: Use a global arraylist that we reuse over invocations
6519         to avoid excesive memory consumption.  Reduces memory usage on an
6520         mcs compile by one meg (45 average).
6521
6522         * typemanager.cs (LookupTypeReflection): In .NET pointers are
6523         private, work around that.
6524
6525 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
6526
6527         * literal.cs (IntLiteral): Define Zero and One static literals. 
6528
6529         * cs-parser.jay (integer_literal): use static literals to reduce
6530         memory usage for the most used literals (0, 1 and -1).  211kb
6531         reduced in memory usage.
6532
6533         Replace all calls to `new ArrayList' with `new
6534         ArrayList(4)' which is a good average number for most allocations,
6535         and also requires only 16 bytes of memory for its buffer by
6536         default. 
6537
6538         This reduced MCS memory usage in seven megabytes for the RSS after
6539         bootstrapping.
6540
6541 2003-07-28  Ravi Pratap  <ravi@ximian.com>
6542
6543         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
6544         handle params methods the correct way by forming only one
6545         applicable set with params and normal methods in them. Earlier we
6546         were looking at params methods only if we found no normal methods
6547         which was not the correct thing to do.
6548
6549         (Invocation.BetterFunction): Take separate arguments indicating
6550         when candidate and the best method are params methods in their
6551         expanded form.
6552
6553         This fixes bugs #43367 and #46199.
6554
6555         * attribute.cs: Documentation updates.
6556
6557         (CheckAttribute): Rename to CheckAttributeTarget.
6558         (GetValidPlaces): Rename to GetValidTargets.
6559
6560         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
6561         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
6562
6563         Fixes bug #44468.
6564
6565 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
6566
6567         * codegen.cs: Compute IsGeneric correctly.
6568
6569         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
6570         resolution. 
6571
6572         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
6573         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
6574         regressions, and I was chasing more bugs than I required.
6575
6576         * interface.cs: Use expressions for base type names (like classes
6577         and structs have been doing for a while now), and resolve that.
6578         This patch should probably go into head as well.
6579
6580         This makes it one less user of FindType.
6581
6582 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6583
6584         This compiler can not self host currently.  Need to fix that.
6585         
6586         * Makefile: compile to `gmcs.exe'
6587
6588         * driver.cs: Turn on v2 by default on gmcs.
6589
6590         * generic.cs (ConstructedType): Does no longer take a container
6591         type argument;  That will be taken care of later.
6592
6593         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
6594         Use SimpleName to resolve for now, so we can continue the work on
6595         the parser, until we get Type.GetType that understands generics.
6596
6597         (ConstructedType.ToString): Implement
6598
6599         (TypeArguments.Resolve): Resolve the child expressions as types. 
6600         
6601         * cs-parser.jay: Rename interface_constraints to
6602         type_parameter_constraints
6603
6604         (namespace_or_type_name): Only use constructed types for the basic
6605         construction, we will deal with identifier<...> later.
6606
6607         (type/type_name): No longer call DecomposeQI, as
6608         namespace_or_type_name is always decoded now.
6609         
6610 2003-07-22  Ravi Pratap  <ravi@ximian.com>
6611
6612         * expression.cs (Invocation.OverloadResolve): Follow the spec more
6613         closely: we eliminate methods in base types when we have an
6614         applicable method in a top-level type.
6615
6616         Please see section 14.5.5.1 for an exact description of what goes
6617         on. 
6618
6619         This fixes bug #45127 and a host of other related to corlib compilation.
6620
6621         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
6622         array is the method corresponding to the top-level type (this is
6623         because of the changes made to icall.c) so we change this
6624         accordingly.
6625
6626         (MethodGroupExpr.Name): This too.
6627
6628         * typemanager.cs (GetElementType): New method which does the right
6629         thing when compiling corlib. 
6630
6631         * everywhere: Make use of the above in the relevant places.
6632
6633 2003-07-22  Martin Baulig  <martin@ximian.com>
6634
6635         * cs-parser.jay (invocation_expression): Moved
6636         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
6637         `cast_expression', but create a InvocationOrCast which later
6638         resolves to either an Invocation or a Cast.
6639
6640         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
6641         method; call this before EmitStatement() to make sure that this
6642         expression can be used as a statement.
6643
6644         * expression.cs (InvocationOrCast): New class; resolves to either
6645         an Invocation or a Cast.
6646
6647         * statement.cs (StatementExpression): Call ResolveStatement() on
6648         the ExpressionStatement before emitting it.
6649
6650 2003-07-21  Martin Baulig  <martin@ximian.com>
6651
6652         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
6653         `ref' and `out' attributes match; fixes #46220.
6654         (MemberAccess.ResolveMemberAccess): You can't reference a type
6655         through an expression; fixes #33180.
6656         (Indexers.GetIndexersForType): Don't return the indexers from
6657         interfaces the class implements; fixes #46502.
6658
6659 2003-07-21  Martin Baulig  <martin@ximian.com>
6660
6661         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
6662         CS0661 checks; fixes bug #30442.
6663
6664 2003-07-21  Martin Baulig  <martin@ximian.com>
6665
6666         * decl.cs (AdditionResult): Added `Error'.
6667
6668         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
6669
6670         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
6671         cs0031.cs actually work.
6672
6673  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6674  
6675         * cs-parser.jay (namespace_name): do not use
6676         namespace_or_type_name, use qualified_identifier, because
6677         namespace_or_type_name will soon return a composed expression
6678         instead of a string.
6679  
6680         (namespace_or_type_name): Instead of returning a string, now this
6681         production returns an expression.
6682  
6683         * codegen.cs (EmitContext): Setup IsGeneric property based on
6684         whether our DeclSpace is generic, our the method is generic.
6685  
6686         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
6687         the method is generic.
6688  
6689         * cs-parser.jay (type_arguments, opt_type_argument_list,
6690         type_parameters, type_parameter_list, opt_type_parameter_list,
6691         type_parameter,, opt_type_parameter_constraints_clauses,
6692         type_parameter_constraints_clauses,
6693         type_parameter_constraint_clause, type_parameter_constraint,
6694         interface_constraints): Add new production
6695  
6696         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
6697         DeclSpace is generic or not.
6698  
6699         (DeclSpace.SetParameterInfo): New routine, used to set the
6700         parameter info for a type.
6701  
6702         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
6703         returns a GenericTypeExpr
6704  
6705         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
6706         generic, lookup the generic argument.
6707  
6708         * attribute.cs: Do not allow TypeParameterExpressions in
6709         Attributes.
6710  
6711         * class.cs: Do not allow the Main method to be defined in a
6712         Generic container.
6713  
6714         * expression.cs (SizeOf): Do not allow generic types to be used as
6715         arguments to sizeof.
6716  
6717         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
6718         it: whether a type is generic or not.  Only works for types we are
6719         currently building for now.
6720         
6721 2003-07-20  Martin Baulig  <martin@ximian.com>
6722
6723         * namespace.cs: Fixed that bug which caused a crash when compiling
6724         the debugger's GUI.
6725
6726 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6727
6728         * typemanager.cs (LookupTypeReflection): Never expose types which
6729         are NotPublic, NestedPrivate, NestedAssembly, or
6730         NestedFamANDAssem.  We used to return these, and later do a check
6731         that would report a meaningful error, but the problem is that we
6732         would not get the real match, if there was a name override.
6733
6734 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
6735
6736         * namespace.cs (Namespace, Name): Do not compute the namespace
6737         name dynamically, compute it in the constructor.  This reduced
6738         memory usage by 1697 KB.
6739
6740         * driver.cs: Use --pause to pause at the end.
6741
6742 2003-07-17  Peter Williams  <peter@newton.cx>
6743
6744         * Makefile: Change the name of the test target so that it doesn't
6745         conflict with the recursive test target.
6746
6747 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
6748
6749         * expression.cs (LocalVariableReference.Emit, EmitAssign,
6750         AddressOf): Do not use EmitThis, that was wrong, use the actual
6751         this pointer.
6752
6753 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
6754
6755         * class.cs (MethodData.Define): While checking if a method is an
6756         interface implementation, improve the test: If we are not public
6757         (use new test here: use the computed MethodAttributes directly,
6758         instead of the parsed modifier flags) check if the `implementing'
6759         method comes from an interface or not.
6760
6761         * pending.cs (VerifyPendingMethods): Slightly better error
6762         message.
6763
6764         * makefile: add test target that does the mcs bootstrap.
6765
6766 2003-07-16  Ravi Pratap  <ravi@ximian.com>
6767
6768         * interface.cs (Define): Do nothing here since there are no
6769         members to populate etc. Move the attribute emission out of here
6770         since this was just totally the wrong place to put it. Attribute
6771         application happens during the 'Emit' phase, not in the 'Define'
6772         phase.
6773
6774         (Emit): Add this method and move the attribute emission here
6775
6776         * rootcontext.cs (EmitCode): Call the Emit method on interface
6777         types too.
6778
6779 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6780
6781         * expression.cs (OverloadResolve): Report error only if Location
6782         is not 'Null' which means that there was a probe going on.
6783
6784 2003-07-14  Martin Baulig  <martin@ximian.com>
6785
6786         * expression.cs (ConditionalLogicalOperator): New public class to
6787         implement user defined conditional logical operators.
6788         This is section 14.11.2 in the spec and bug #40505.
6789
6790 2003-07-14  Martin Baulig  <martin@ximian.com>
6791
6792         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6793
6794 2003-07-14  Martin Baulig  <martin@ximian.com>
6795
6796         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6797
6798         * ecore.cs (IVariable.VerifyFixed): New interface method.
6799
6800         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6801         operator, check whether the variable is actually fixed.  Fixes bug
6802         #36055.  Set a variable definitely assigned when taking its
6803         address as required by the spec.
6804
6805         * statement.cs (LocalInfo.IsFixed): New field.
6806         (LocalInfo.MakePinned): Set `IsFixed' to true.
6807
6808 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6809
6810         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6811         for .ctors, ensure that we only ask for members declared in the
6812         attribute type (BindingFlags.DeclaredOnly).
6813
6814         Fixes bug #43632.
6815
6816         * expression.cs (Error_WrongNumArguments): Report error 1501
6817         correctly the way CSC does.
6818
6819 2003-07-13  Martin Baulig  <martin@ximian.com>
6820
6821         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6822         lookup on the fully qualified name, to make things like "X.X" work
6823         where "X.X" is a fully qualified type name, but we also have a
6824         namespace "X" in the using list.  Fixes #41975.
6825
6826 2003-07-13  Martin Baulig  <martin@ximian.com>
6827
6828         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6829         function. If we're a CompoundAssign, we need to create an embedded
6830         CompoundAssign, not an embedded Assign.
6831         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6832         Fixes #45854.
6833
6834 2003-07-13  Martin Baulig  <martin@ximian.com>
6835
6836         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6837         work to fix bug #46088.
6838
6839 2003-07-13  Ravi Pratap <ravi@ximian.com>
6840
6841         * class.cs (Operator.Emit): Do not emit attributes here - it is
6842         taken care of by the Method class that we delegate too. This takes
6843         care of bug #45876.
6844
6845 2003-07-10  Martin Baulig  <martin@ximian.com>
6846
6847         * expression.cs (TypeOfVoid): New class.
6848         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6849
6850 2003-07-10  Martin Baulig  <martin@ximian.com>
6851
6852         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6853         bug #35957.
6854
6855 2003-07-10  Martin Baulig  <martin@ximian.com>
6856
6857         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6858         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6859
6860         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6861
6862         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6863
6864 2003-07-10  Martin Baulig  <martin@ximian.com>
6865
6866         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6867         of decimal.  Fixes #42850.
6868
6869         NOTE: I also fixed the created byte blob, but this doesn't work on
6870         the MS runtime and csc never produces any byte blobs for decimal
6871         arrays.
6872
6873 2003-07-10  Martin Baulig  <martin@ximian.com>
6874
6875         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6876         structs; fixes #32068.
6877         (Block.AddChildVariableNames): Fixed #44302.
6878
6879 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6880
6881         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6882
6883 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6884
6885         * attribute.cs: And this test is onger needed.
6886
6887 2003-07-08  Martin Baulig  <martin@ximian.com>
6888
6889         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6890         inaccessible types.  Fixes #36313.
6891
6892         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6893
6894         * namespace.cs (NamespaceEntry): Create implicit entries for all
6895         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6896         implicit entries for N1.N2 and N1.
6897
6898 2003-07-08  Martin Baulig  <martin@ximian.com>
6899
6900         Rewrote the handling of namespaces to fix a lot of the issues
6901         wrt. `using' aliases etc.
6902
6903         * namespace.cs (Namespace): Splitted this class into a
6904         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6905
6906         * typemanager.cs (TypeManager.IsNamespace): Removed.
6907         (TypeManager.ComputeNamespaces): Only compute namespaces from
6908         loaded assemblies here, not the namespaces from the assembly we're
6909         currently compiling.
6910
6911 2003-07-08  Martin Baulig  <martin@ximian.com>
6912
6913         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6914
6915 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6916
6917         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6918         already fixed it.  
6919
6920         I thought about the memory savings here, but LookupTypeReflection
6921         is used under already very constrained scenarios.  Compiling
6922         corlib or mcs only exposes one hit, so it would not really reduce
6923         any memory consumption.
6924
6925 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6926
6927         * typemanager.cs: fixes bug #45889 by only adding public types from
6928         other assemblies to the list of known types.
6929
6930 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6931
6932         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6933         on the type we resolved.
6934
6935 2003-07-05  Martin Baulig  <martin@ximian.com>
6936
6937         * pending.cs (PendingImplementation.ParentImplements): Don't
6938         create the proxy if the parent is abstract.
6939
6940         * class.cs (TypeContainer.DefineIndexers): Process explicit
6941         interface implementations first.  Fixes #37714.
6942
6943 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6944
6945         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6946         defined recursively;  but since we modify the input parameters
6947         (left is set to `this' temporarily), we reset this value if the
6948         left_is_explicit is false, which gives the original semantics to
6949         the code.  
6950
6951         * literal.cs (NullPointer): new class used to represent a null
6952         literal in a pointer context.
6953
6954         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6955         type is a pointer, use a NullPointer object instead of a
6956         NullLiteral.   Closes 43687
6957
6958         (ExplicitConversion): Convert pointer values using
6959         the conv opcode to the proper type.
6960
6961         * ecore.cs (New): change ValueTypeVariable property into a method,
6962         that returns whether the valuetype is suitable for being used.
6963
6964         * expression.cs (Binary.DoNumericPromotions): Only return if we
6965         the int constant was a valid uint, and we can return both left and
6966         right as uints.  If not, we continue processing, to trigger the
6967         type conversion.  This fixes 39018.
6968
6969         * statement.cs (Block.EmitMeta): During constant resolution, set
6970         the CurrentBlock property on the emitcontext, so that we resolve
6971         constants propertly.
6972
6973 2003-07-02  Martin Baulig  <martin@ximian.com>
6974
6975         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6976         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6977
6978         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6979         than emitting it here.
6980
6981         * statement.cs: Fixed some more flow analysis bugs.
6982
6983 2003-07-02  Martin Baulig  <martin@ximian.com>
6984
6985         * class.cs (MethodData.Define): When implementing interface
6986         methods, set Final unless we're Virtual.
6987
6988         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6989         check work for interface methods.
6990
6991 2003-07-01  Martin Baulig  <martin@ximian.com>
6992
6993         * ecore.cs (EmitContext.This): Replaced this property with a
6994         GetThis() method which takes a Location argument.  This ensures
6995         that we get the correct error location for a CS0188.
6996
6997 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6998
6999         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
7000         ImplicitStandardConversion.
7001
7002         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
7003
7004 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
7005
7006         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
7007         optimization.
7008
7009 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
7010
7011         * class.cs (Constructor.Define): Turn off initlocals for unsafe
7012         constructors.
7013
7014         (MethodData.Define): Turn off initlocals for unsafe methods.
7015
7016 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
7017
7018         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
7019         complete;  Fixes #37521.
7020
7021         * delegate.cs: Use Modifiers.TypeAttr to compute the
7022         TypeAttributes, instead of rolling our own.  This makes the flags
7023         correct for the delegates.
7024
7025 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
7026
7027         * class.cs (Constructor.Define): Set the private flag for static
7028         constructors as well.
7029
7030         * cs-parser.jay (statement_expression): Set the return value to
7031         null, to avoid a crash when we catch an error.
7032
7033 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
7034
7035         * cs-parser.jay: Applied patch from Jackson that adds support for
7036         extern and unsafe modifiers to destructor declarations.
7037
7038         * expression.cs: Report error 21 if the user is trying to index a
7039         System.Array.
7040
7041         * driver.cs: Add an error message, suggested by the bug report.
7042
7043         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
7044         if we do not have a ": this ()" constructor initializer.  Fixes 45149
7045
7046 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
7047
7048         * namespace.cs: Add some information to reduce FAQs.
7049
7050 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
7051
7052         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
7053         underlying enumeration types.  Fixes #43915.
7054
7055         * expression.cs: Treat ushort/short as legal values to be used in
7056         bitwise operations.
7057
7058 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
7059
7060         * delegate.cs: transfer custom attributes for paramenters from
7061         the delegate declaration to Invoke and BeginInvoke.
7062
7063 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
7064
7065         * attribute.cs: handle custom marshalers and emit marshal info
7066         for fields, too.
7067
7068 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
7069
7070         * makefile.gnu: Added anonymous.cs to the compiler sources.
7071
7072 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
7073
7074         * iterators.cs: Change the name of the proxy class to include two
7075         underscores.
7076
7077         * cs-parser.jay: Update grammar to include anonymous methods.
7078
7079         * anonymous.cs: new file.
7080
7081 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
7082
7083         * class.cs (Field.Define): Add missing test for pointers and
7084         safety. 
7085
7086 2003-05-27  Ravi Pratap  <ravi@ximian.com>
7087
7088         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
7089         we use the stobj opcode.
7090
7091         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
7092         since it wasn't the correct fix. 
7093
7094         It still is puzzling that we are required to use stobj for IntPtr
7095         which seems to be a ValueType.
7096
7097 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
7098
7099         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
7100         during regular simple name resolution.   Now, the trick is that
7101         instead of returning for processing the simplename, we do a
7102         TypeManager.LookupType (ie, a rooted lookup as opposed to a
7103         contextual lookup type).   If a match is found, return that, if
7104         not, return for further composition.
7105
7106         This fixes long-standing 30485.
7107
7108         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
7109         using the address to initialize an object, do an Stobj instead of
7110         using the regular Stelem.
7111
7112         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
7113         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
7114         Because if we are a BaseIndexerAccess that value will be true.
7115         Fixes 43643.
7116
7117         * statement.cs (GotoCase.Resolve): Return after reporting an
7118         error, do not attempt to continue. 
7119
7120         * expression.cs (PointerArithmetic.Emit): If our operand is a
7121         long, convert our constants to match the operand before
7122         multiplying.  Convert to I type before adding.   Fixes 43670.
7123
7124 2003-05-14  Ravi Pratap  <ravi@ximian.com>
7125
7126         * enum.cs (ImplicitConversionExists) : Rename to
7127         ImplicitEnumConversionExists to remove ambiguity. 
7128
7129         * ecore.cs (NullCast): New type of cast expression class which
7130         basically is very similar to EmptyCast with the difference being
7131         it still is a constant since it is used only to cast a null to
7132         something else
7133         (eg. (string) null)
7134
7135         * convert.cs (ImplicitReferenceConversion): When casting a null
7136         literal, we return a NullCast.
7137
7138         * literal.cs (NullLiteralTyped): Remove - I don't see why this
7139         should be around anymore.
7140
7141         The renaming (reported was slightly wrong). Corrections:
7142
7143         ConvertImplicitStandard -> ImplicitConversionStandard
7144         ConvertExplicitStandard -> ExplicitConversionStandard
7145
7146         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
7147         before passing them in !
7148
7149         * convert.cs (ImplicitConversionStandard): When comparing for
7150         equal expr and target types, ensure that expr is not a
7151         NullLiteral.
7152
7153         In general, we must not be checking (expr_type ==
7154         target_type) in the top level conversion methods
7155         (ImplicitConversion, ExplicitConversion etc). This checking is
7156         done in the methods that they delegate to.
7157
7158 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
7159
7160         * convert.cs: Move Error_CannotConvertType,
7161         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
7162         ImplicitNumericConversion, ImplicitConversionExists,
7163         ImplicitUserConversionExists, StandardConversionExists,
7164         FindMostEncompassedType, FindMostSpecificSource,
7165         FindMostSpecificTarget, ImplicitUserConversion,
7166         ExplicitUserConversion, GetConversionOperators,
7167         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
7168         TryImplicitIntConversion, Error_CannotConvertImplicit,
7169         ConvertImplicitRequired, ConvertNumericExplicit,
7170         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
7171         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
7172         its own file.
7173
7174         Perform the following renames:
7175
7176         StandardConversionExists -> ImplicitStandardConversionExists
7177         ConvertImplicit -> ImplicitConversion
7178         ConvertImplicitStandard -> ImplicitStandardConversion
7179         TryImplicitIntConversion -> ImplicitIntConversion
7180         ConvertImplicitRequired -> ImplicitConversionRequired
7181         ConvertNumericExplicit -> ExplicitNumericConversion
7182         ConvertReferenceExplicit -> ExplicitReferenceConversion
7183         ConvertExplicit -> ExplicitConversion
7184         ConvertExplicitStandard -> ExplicitStandardConversion
7185
7186 2003-05-19  Martin Baulig  <martin@ximian.com>
7187
7188         * statement.cs (TypeInfo.StructInfo): Made this type protected.
7189         (TypeInfo): Added support for structs having structs as fields.
7190
7191         * ecore.cs (FieldExpr): Implement IVariable.
7192         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
7193         VariableInfo for the field.
7194
7195 2003-05-18  Martin Baulig  <martin@ximian.com>
7196
7197         * expression.cs (This.DoResolve): Report a CS0027 if we're
7198         emitting a field initializer.
7199
7200 2003-05-18  Martin Baulig  <martin@ximian.com>
7201
7202         * expression.cs (This.ResolveBase): New public function.
7203         (This.DoResolve): Check for CS0188.
7204
7205         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
7206         This.Resolve().
7207
7208         * ecore.cs (MethodGroupExpr.DoResolve): Set the
7209         `instance_expression' to null if we don't have any non-static
7210         methods.
7211
7212 2003-05-18  Martin Baulig  <martin@ximian.com>
7213
7214         Reworked the way how local variables and parameters are handled by
7215         the flow analysis code.
7216
7217         * statement.cs (TypeInfo, VariableMap): New public classes.
7218         (VariableInfo): New public class.  This is now responsible for
7219         checking whether a variable has been assigned.  It is used for
7220         parameters and local variables.
7221         (Block.EmitMeta): Take the InternalParameters as argument; compute
7222         the layout of the flow vectors here.
7223         (Block.LocalMap, Block.ParameterMap): New public properties.
7224         (FlowBranching): The .ctor doesn't get the InternalParameters
7225         anymore since Block.EmitMeta() now computes the layout of the flow
7226         vector.
7227         (MyStructInfo): This class is now known as `StructInfo' and nested
7228         in `TypeInfo'; we don't access this directly anymore.
7229
7230         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
7231         property and removed IsAssigned(), IsFieldAssigned(),
7232         SetAssigned() and SetFieldAssigned(); we now call them on the
7233         VariableInfo so we don't need to duplicate this code everywhere.
7234
7235         * expression.cs (ParameterReference): Added `Block block' argument
7236         to the .ctor.
7237         (LocalVariableReference, ParameterReference, This): The new
7238         VariableInfo class is now responsible for all the definite
7239         assignment stuff.
7240
7241         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
7242         IsParameterAssigned, SetParameterAssigned): Removed.
7243
7244 2003-05-18  Martin Baulig  <martin@ximian.com>
7245
7246         * typemanager.cs (InitCoreTypes): Try calling
7247         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
7248         the 3-args-version.  Corlib now also needs our `void_type'.
7249         (GetMethod): Added overloaded version which takes an optional
7250         `bool report_errors' to allow lookups of optional methods.
7251
7252 2003-05-12  Martin Baulig  <martin@ximian.com>
7253
7254         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
7255         only used for locals and not for parameters.
7256
7257 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
7258
7259         * support.cs (InternalParameters.ParameterType): Return the
7260         ExternalType of the parameter.
7261
7262         * parameter.cs (Parameter.ExternalType): drop the two arguments,
7263         they were unused.
7264
7265 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
7266
7267         * class.cs (MethodData.Define): Do not set the `newslot' on
7268         interface members, if they are also flagged as "override".
7269
7270         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
7271         better code for ++i and i++.  This only works for static fields
7272         and local variables.
7273
7274         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
7275         want to pull the DeclSpace out of the builder_to_declspace instead
7276         of the TypeBuilder (like in TypeContainer.FindMembers).
7277
7278         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
7279         instead of LookupTypeContainer.  Fixes the crash on .NET for
7280         looking up interface members.
7281
7282         * const.cs: Create our own emit context during the Definition
7283         stage, so that constants are evaluated in the proper context, when
7284         a recursive definition happens.
7285
7286 2003-05-11  Martin Baulig  <martin@ximian.com>
7287
7288         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
7289         new block for a switch section.
7290         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
7291         the adding/lookup in the switch block.  Fixes #39828.
7292
7293 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
7294
7295         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
7296         functionality: I needed to convert the data after I had performed
7297         the add/sub operation into the operands type size.
7298
7299         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
7300         pass the type for the box operation, otherwise the resulting
7301         object would have been of type object.
7302
7303         (BoxedCast): Add constructor to specify the type to box as.
7304
7305 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
7306
7307         * iterators.cs: I was reusing the `count' variable inadvertently,
7308         take steps to not allow this to happen.
7309
7310 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
7311
7312         * attribute.cs (Attribute.Resolve): Params attributes are encoded
7313         by creating an array at the point where the params starts and
7314         putting all those arguments there, then adjusting the size of the
7315         array.
7316
7317 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
7318
7319         * expression.cs (New.AddressOf): Implement interface
7320         IMemoryLocation.  This is used when the `new' operator is used in
7321         the context of an invocation to a method on a value type.
7322
7323         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
7324         example. 
7325
7326         * namespace.cs: Also check the using aliases here.
7327
7328         * driver.cs: Move the test for using validity after the types have
7329         been entered, so we do a single pass that also includes the using
7330         aliases. 
7331
7332         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
7333         in the regular case.   CreateSiblingForFinally is doing extra
7334         error checking.
7335
7336         * attribute.cs (GetAttributeArgumentExpression): Store the result
7337         on an out value, and use the return value to indicate failure
7338         instead of using null (which is a valid return for Constant.GetValue).
7339
7340         * statement.cs: Perform the analysis flow for the increment
7341         portion after the statement, because this will be the real flow of
7342         execution.  Fixes #42385
7343
7344         * codegen.cs (EmitContext.EmitArgument,
7345         EmitContext.EmitStoreArgument): New helper functions when the
7346         RemapToProxy flag is set.
7347
7348         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
7349         function.
7350
7351         Add support for remapping parameters. 
7352
7353         * iterators.cs: Propagate parameter values;  Store parameter
7354         values in the proxy classes.
7355
7356 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
7357
7358         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
7359         need a proxy reference;  I do not know what I was thinking
7360
7361         * cs-parser.jay (constructor_initializer): catch another error,
7362         and display nice message.
7363
7364         (field_declaration): catch void field declaration
7365         to flag a better error. 
7366
7367         * class.cs (MemberBase.CheckBase): Report an error instead of a
7368         warning if a new protected member is declared in a struct. 
7369         (Field.Define): catch the error of readonly/volatile.
7370
7371         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
7372
7373         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
7374         volatile variable is taken
7375
7376 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
7377
7378         * statement.cs (Fixed.Resolve): Report an error if we are not in
7379         an unsafe context.
7380
7381 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
7382
7383         * typemanager.cs: reuse the code that handles type clashes for
7384         delegates and enumerations.
7385
7386         * class.cs (Report28): Always report.
7387
7388         * expression.cs (EncodeAsAttribute): Allow nulls here.
7389
7390 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
7391
7392         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
7393         the functionality for testing whether an expression is valid for
7394         an attribute here.  Also handle the case of arrays of elements
7395         being stored. 
7396
7397         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
7398         encoding a linear array into an array of objects that are suitable
7399         to be passed to an CustomAttributeBuilder.
7400
7401         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
7402
7403         * ecore.cs: (FieldExpr): Handle field remapping here.
7404
7405         * iteratators.cs: Pass the instance variable (if the method is an
7406         instance method) to the constructors, so we can access the field
7407         variables on the class.
7408
7409         TODO: Test this with structs.  I think the THIS variable on
7410         structs might have to be a pointer, and not a refenrece
7411
7412 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
7413
7414         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
7415         local variables to fields in a proxy class.
7416
7417         * iterators.cs (PopulateProxy): Rename our internal fields to
7418         <XXX>.  
7419         Create a <THIS> field if we are an instance method, so we can
7420         reference our parent container variables.
7421         (MapVariable): Called back from the EmitContext code to enter a
7422         new variable to field mapping into the proxy class (we just create
7423         a FieldBuilder).
7424
7425         * expression.cs
7426         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
7427         for using the remapped locals to fields.
7428
7429         I placed the code here, because that gives the same semantics to
7430         local variables, and only changes the Emit code.
7431
7432         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
7433         statements inside iterators.
7434         (VariableInfo): Add a FieldBuilder for the cases when we are
7435         remapping local variables to fields in a proxy class
7436
7437         * ecore.cs (SimpleNameResolve): Avoid testing two times for
7438         current_block != null.
7439
7440         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
7441         not cope with strings, as it has been moved to the
7442         TableSwitchEmit.  Fixed bug in switch generation.
7443
7444         * expression.cs (New.DoResolve): Provide more context for the user
7445         when reporting an error.
7446
7447         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
7448         pointers. 
7449
7450         * expression.cs (MemberAccess.DoResolve): When we get a type back,
7451         check the permissions for it.  Note than in a type-resolution
7452         context the check was already present in DeclSpace.ResolveType,
7453         but was missing from the MemberAccess.
7454
7455         (ArrayCreation.CheckIndices): warn if the user has
7456         more nested levels of expressions, but there are no more
7457         dimensions specified.  Avoids crash on bug 41906.
7458
7459 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
7460
7461         * statement.cs (Block): replace Implicit bool, for a generic
7462         flags.   
7463         New flag: `Unchecked'.  This is used during the EmitMeta phase
7464         (which is out-of-line with the regular Resolve/Emit process for a
7465         statement, as this is done ahead of time, but still gets a chance
7466         to call constant resolve).
7467
7468         (Block.Flags): new enum for adding a new flag.
7469
7470         (Block.EmitMeta): track the state of unchecked.
7471
7472         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
7473         to enable constant resolution to work there as well.
7474
7475 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
7476
7477         * typemanager.cs (ienumerable_type): Also look up
7478         System.Collections.IEnumerable. 
7479
7480 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
7481
7482         TODO: Test more than one conditional per method.
7483
7484         * class.cs (Indexer.Define): Report the location where the user is
7485         referencing the unsupported feature.
7486
7487         (MethodData): Overload the use of `conditionals' to
7488         minimize the creation of needless ArrayLists.   This saves roughly
7489         212kb on my machine.
7490
7491         (Method): Implement the new IIteratorContainer interface.
7492         (Method.SetYields): Implement the method by setting the ModFlags
7493         to contain METHOD_YIELDS.
7494
7495         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
7496         which just got set to null.
7497
7498         * iterators.cs: New file.
7499
7500         (Yield, YieldBreak): New statements.
7501
7502         * statement.cs (Return.Resolve): Flag an error if we are used in
7503         an iterator method.
7504
7505         * codegen.cs (InIterator): New flag set if the code is being
7506         compiled in an iterator method.
7507
7508         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
7509         internal modifier, and we just use it to avoid adding extra
7510         fields, as this is seldom used.  
7511
7512         * cs-parser.jay: Add yield_statement (yield and yield break).
7513
7514         * driver.cs: New flag -v2 to turn on version 2 features. 
7515
7516         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
7517         hashtable when v2 is enabled.
7518
7519 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
7520
7521         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
7522         there is already a namespace defined with this name.
7523
7524         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
7525         people upgraded their corlibs.
7526
7527         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
7528         always use fully qualified types, no need to use the compiler
7529         front end.
7530
7531         (TypeManager.IsNamespace): Use binarysearch.
7532
7533         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
7534         AddDelegate): I did not quite use the new IsValid API properly: I
7535         have to pass the short-name and the fullname.  I was passing only
7536         the basename instead of the fullname sometimes. 
7537
7538         (TypeContainer.DefineType): call NamespaceClash.
7539
7540         * interface.cs (Interface.DefineType): use NamespaceClash before
7541         defining the type.
7542
7543         * delegate.cs (Delegate.DefineType): use NamespaceClash before
7544         defining the type.
7545
7546         * enum.cs: (Enum.DefineType): use NamespaceClash before
7547         defining the type.
7548
7549         * typemanager.cs (: 3-line patch that gives us some tasty 11%
7550         speed increase.  First, use the negative_hits cache when we get a
7551         negative.  Second, add the type with its full original name
7552         instead of the new . and + encoded name (reflection uses + to
7553         separate type from a nested type).  Use LookupTypeReflection
7554         directly which bypasses the type->name hashtable (that we already
7555         know does not contain the type.
7556
7557         * decl.cs (DeclSpace.ResolveTypeExpr): track the
7558         location/container type. 
7559
7560         * driver.cs: When passing utf8, use directly the UTF8Encoding.
7561
7562 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
7563
7564         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
7565
7566         * delegate.cs (NewDelegate.Resolve): Test whether an instance
7567         method is being referenced in the method group from a static
7568         context, and report error 120 if so.
7569
7570         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
7571         Error118. 
7572
7573         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
7574         is created, we create the A namespace).
7575
7576         * cs-parser.jay: A namespace also introduces a DeclarationFound.
7577         Fixes #41591
7578
7579 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
7580
7581         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
7582         invocation to ModuleBuilder.GetType with the same values will
7583         return a new type instance, so we need to cache its return
7584         values. 
7585
7586         * expression.cs (Binary.ResolveOperator): Only allow the compare
7587         operators on enums if they are of the same type.
7588
7589         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
7590         types of ValueType on their own case.  Before we were giving them
7591         the same treatment as objects.
7592
7593         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
7594         fullname.  Short name is used to compare against container name.
7595         Fullname is used to check against defined namespace names.
7596
7597         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
7598         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
7599
7600         (Method.CheckBase): Call parent.
7601         (MemberBase.CheckBase): Check for protected members on sealed
7602         classes.
7603         (PropertyBase.CheckBase): Call parent.
7604         (Field.Define): Call parent.
7605
7606         * report.cs: Negative error codes are now mapped to 8000 - code,
7607         so that the display is render more nicely.
7608
7609         * typemanager.cs: Do not use try/catch, instead report a regular
7610         error. 
7611
7612         (GetPointerType, GetReferenceType): These methods provide
7613         mechanisms to obtain the T* and T& from a T.  We had the code
7614         previously scattered around the code base, and it also used
7615         TypeManager.LookupType that would go through plenty of caches.
7616         This one goes directly to the type source.
7617
7618         In some places we did the Type.GetType followed by
7619         ModuleBuilder.GetType, but not in others, so this unifies the
7620         processing as well.
7621
7622         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
7623         statements now that we have namespace information.
7624
7625         * typemanager.cs (IsNamespace): New method, returns whether the
7626         string presented is a namespace or not.
7627
7628         (ComputeNamespaces): New public entry point, computes the list of
7629         available namespaces, using the GetNamespaces API call in Mono, or
7630         the slower version in MS.NET.   
7631
7632         Now before we start the semantic analysis phase, we have a
7633         complete list of namespaces including everything that the user has
7634         provided.
7635
7636         Deleted old code to cache namespaces in .nsc files.
7637
7638 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
7639
7640         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
7641         class/struct location definition Location for the implicit
7642         constructor location.
7643
7644         (Operator.Define): Use the location of the operator for the
7645         implicit Method definition.
7646
7647         (Constructor.Emit): use the constructor location for the implicit
7648         base initializer constructor.
7649
7650         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
7651         and the Expression class now contains two new methods:
7652
7653         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
7654         isolate type lookup from the rest of the resolution process.
7655
7656         Since we use Expressions to hold type definitions due to the way
7657         we parse the input we have historically overloaded Resolve to
7658         perform the Type lookups if a special flag is passed.  Now this is
7659         eliminated and two methods take their place. 
7660
7661         The differences in the two methods between xStep and xTerminal is
7662         that xStep is involved in our current lookup system that uses
7663         SimpleNames to compose a name, while xTerminal is used just to
7664         catch the case where the simplename lookup failed.
7665
7666 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
7667
7668         * expression.cs (ResolveMemberAccess): Remove redundant code.
7669         TypeExpr expressions are always born fully resolved.
7670
7671         * interface.cs (PopulateMethod): Do not lookup the types twice.
7672         We were doing it once during SemanticAnalysis and once during
7673         PopulateMethod.
7674
7675         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
7676         in local variable type definitions, were being returned as a
7677         SimpleName (we decomposed everything into a string), that is
7678         because primary_expression was being used instead of a type in the
7679         grammar (reduce/reduce conflicts).
7680
7681         The part that was wrong is that we converted the expression into a
7682         string (an oversimplification in one hand, compounded with primary
7683         expressions doing string concatenation).
7684
7685         So things like:
7686
7687         A.B.C [] x;
7688
7689         Would return "A.B.C[]" as a SimpleName.  This stopped things like
7690         using clauses from working on this particular context.  And a type
7691         was being matched directly against "A.B.C[]".
7692
7693         We now use the correct approach, and allow for ComposedCast to be
7694         part of the unary expression.  So the "A.B.C []" become a composed
7695         cast of "A.B.C" (as a nested group of MemberAccess with a
7696         SimpleName at the end) plus the rank composition "[]". 
7697
7698         Also fixes 35567
7699
7700 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
7701
7702         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
7703         for the access level checking.
7704
7705         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
7706         `TypeContainer container', because I kept getting confused when I
7707         was debugging this code.
7708
7709         * expression.cs (Indexers): Instead of tracking getters/setters,
7710         we now track them in parallel.  We create one arraylist less, but
7711         most importantly it is possible now for the LValue code to find a
7712         matching get for a set.
7713
7714         (IndexerAccess.DoResolveLValue): Update the code.
7715         GetIndexersForType has been modified already to extract all the
7716         indexers from a type.  The code assumed it did not.
7717
7718         Also make the code set the correct return type for the indexer.
7719         This was fixed a long time ago for properties, but was missing for
7720         indexers.  It used to be void_type.
7721
7722         (Binary.Emit): Test first for doubles instead of
7723         floats, as they are more common.
7724
7725         (Binary.EmitBranchable): Use the .un version of the branch opcodes
7726         when dealing with floats and the <=, >= operators.  This fixes bug
7727         #39314 
7728
7729         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
7730         to load the array value by emitting a load on the foreach variable
7731         type.  This was incorrect.  
7732
7733         We now emit the code to load an element using the the array
7734         variable type, and then we emit the conversion operator.
7735
7736         Fixed #40176
7737
7738 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
7739
7740         * attribute.cs: Avoid allocation of ArrayLists in the common case.
7741
7742 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
7743
7744         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
7745         test for protection before we test for signatures. 
7746
7747         (MethodSignature.ToString): implement.
7748
7749         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
7750         to the case where we reduced into a LongConstant.
7751
7752         * decl.cs (CheckAccessLevel): If the type is an array, we can not
7753         depend on whether the information is acurrate, because the
7754         Microsoft runtime will always claim that the array type is public,
7755         regardless of the real state.
7756
7757         If the type is a pointer, another problem happens: the type is
7758         reported as non-public in Microsoft.  
7759
7760         In both cases we have to call CheckAccessLevel recursively with
7761         the underlying type as the argument to be tested.
7762
7763 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
7764
7765         * assign.cs (Assign.Emit): If we are dealing with a compound
7766         assignment expression, we should use the code path that stores the
7767         intermediate result in a temporary value.  This fixes #40903.
7768
7769         *expression.cs (Indirection.ToString): Provide ToString method for
7770         debugging. 
7771
7772 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7773
7774         * class.cs: Null out fields holding references to Block objects so
7775         they can be garbage collected.
7776
7777         * expression.cs (OverloadResolve): Remove unused local.
7778
7779 2003-04-07  Martin Baulig  <martin@ximian.com>
7780
7781         * codegen.cs (EmitContext.CurrentFile): New public field.
7782         (EmitContext.Mark): Use the CurrentFile to check whether the
7783         location is in the correct file.
7784         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7785
7786 2003-04-07  Martin Baulig  <martin@ximian.com>
7787
7788         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7789
7790         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7791         location.  [FIXME: The location argument which gets passed to this
7792         method is sometimes wrong!]
7793
7794 2003-04-07  Nick Drochak <ndrochak@gol.com>
7795
7796         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7797
7798 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7799
7800         * expression.cs (Indirection.EmitAssign): We were using the
7801         temporary, but returning immediately instead of continuing the
7802         EmitAssing flow.
7803
7804 2003-04-06  Martin Baulig  <martin@ximian.com>
7805
7806         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7807         if it's a nested child, but also deriving from the outer class.
7808         See test 190.cs.
7809
7810         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7811         nested child, but also deriving from the outer class.  See
7812         test-190.cs.
7813         (FilterWithClosure): We may access private members of the outer
7814         class if we're a nested child and deriving from the outer class.
7815         (RealMemberLookup): Only set `closure_private_ok' if the
7816         `original_bf' contained BindingFlags.NonPublic.
7817
7818 2003-04-05  Martin Baulig  <martin@ximian.com>
7819
7820         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
7821         probe if its a type parameter, and if so, flag an error.
7822
7823         * decl.cs: Move here the SetParameterInfo code from class.cs.
7824         Handle IsGeneric here.
7825
7826         Handle a variety of errors in the parameter info definition.
7827
7828         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
7829         type parameters here.
7830
7831         * cs-parser.jay (class_declaration): report errors for parameters
7832         here as well.
7833
7834 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
7835
7836         * generic.cs: New file, contains support code for generics.
7837
7838         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
7839         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
7840
7841         Update parser for the above removals.
7842
7843         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
7844         now taken care of in the parser.
7845
7846 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7847
7848         * class.cs (Event.Define): Do not allow abstract events to have
7849         initializers. 
7850
7851 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7852
7853         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7854         block in event declarations.
7855
7856         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7857         value type, get its address.
7858
7859         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7860         leaving a class on the stack instead of a boolean value (int
7861         0/1).  Change the code so we compare against null, and then the
7862         result against zero.
7863
7864         * class.cs (TypeContainer.GetClassBases): We were checking for the
7865         parent class being sealed too late.
7866
7867         * expression.cs (Binary.Emit): For <= and >= when dealing with
7868         floating point values, use cgt.un and clt.un instead of cgt and
7869         clt alone.
7870
7871 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7872
7873         * statement.cs: Apply the same optimization as MS: skip the 
7874         GetEnumerator returning an IEnumerator, and use the one returning a 
7875         CharEnumerator instead. This allows us to avoid the try-finally block 
7876         and the boxing.
7877
7878 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7879
7880         * cs-parser.jay: Attributes cannot be applied to
7881                          namespaces. Fixes #40473
7882
7883 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7884
7885         * class.cs:
7886         (Add*): check if the name is valid using the full name for constants,
7887         fields, properties and events.
7888
7889 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7890
7891         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7892         char constants to be part of the enumeration.
7893
7894         * expression.cs (Conditional.DoResolve): Add support for operator
7895         true. Implements the missing functionality from 14.12
7896
7897         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7898         operator true/false as required by the spec.
7899
7900         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7901         implicit conversion to boolean.
7902
7903         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7904         also one where the type implements `operator true'. 
7905
7906         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7907         get an expression that will invoke operator true based on an
7908         expression.  
7909
7910         (GetConversionOperators): Removed the hack that called op_True
7911         here.  
7912
7913         (Expression.ResolveBoolean): Move this from Statement.
7914
7915 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7916
7917         * ecore.cs (FieldExpr): do not allow initialization of initonly
7918         fields on derived classes
7919
7920 2003-03-13  Martin Baulig  <martin@ximian.com>
7921
7922         * statement.cs (Block.Emit): Call ig.BeginScope() and
7923         ig.EndScope() when compiling with debugging info; call
7924         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7925
7926 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7927
7928         * expression.cs (Indexers): Do not construct immediately, allow
7929         for new members to be appended as we go.  Fixes 38143
7930
7931 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7932
7933         * expression.cs: save/restore context when resolving an unchecked
7934         expression.
7935
7936 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7937
7938         * cfold.cs: Catch division by zero in modulus operator during
7939         constant folding.
7940
7941 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7942
7943         * interface.cs (Interface.DefineMembers): Avoid defining members
7944         twice. 
7945
7946 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7947
7948         * driver.cs: handle the +/- options for -noconfig
7949
7950         * statement.cs (Unckeched.Resolve): Also track the state of
7951         unchecked in the Resolve phase.
7952
7953 2003-02-27  Martin Baulig  <martin@ximian.com>
7954
7955         * ecore.cs (Expression.MemberLookup): Don't create a
7956         MethodGroupExpr for something which is not a method.  Fixes #38291.
7957
7958 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7959
7960         * class.cs (MemberBase.CheckParameters): Also check that the type
7961         is unmanaged if it is a pointer.
7962
7963         * expression.cs (SizeOf.Resolve): Add location information.
7964
7965         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7966         a managed type is declared.
7967
7968         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7969         parameter modifiers as well.  Fixes bug 38606
7970
7971         * class.cs: Very sad.  Am backing out the speed up changes
7972         introduced by the ArrayList -> Array in the TypeContainer, as they
7973         were not actually that much faster, and introduced a bug (no error
7974         reports on duplicated methods).
7975
7976         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7977         source first, this will guarantee that we have a valid expression
7978         before calling in lower levels functions that will require a
7979         resolved object.  Then use this original_source in the
7980         target.ResolveLValue instead of the original source that was
7981         passed to us.
7982
7983         Another change.  Use target.Resolve instead of LValueResolve.
7984         Although we are resolving for LValues, we will let the Assign code
7985         take care of that (it will be called again from Resolve).  This
7986         basically allows code like this:
7987
7988         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7989         class Y { void A (X x) { x [0] += o; }
7990
7991         The problem was that the indexer was trying to resolve for
7992         set_Item (idx, object o) and never finding one.  The real set_Item
7993         was set_Item (idx, X).  By delaying the process we get the right
7994         semantics. 
7995
7996         Fixes bug 36505
7997
7998 2003-02-23  Martin Baulig  <martin@ximian.com>
7999
8000         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
8001         while calling DoEmit ().
8002
8003         * codegen.cs (EmitContext.Mark): Don't mark locations in other
8004         source files; if you use the #line directive inside a method, the
8005         compiler stops emitting line numbers for the debugger until it
8006         reaches the end of the method or another #line directive which
8007         restores the original file.
8008
8009 2003-02-23  Martin Baulig  <martin@ximian.com>
8010
8011         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
8012
8013 2003-02-23  Martin Baulig  <martin@ximian.com>
8014
8015         * statement.cs (Block.AddChildVariableNames): We need to call this
8016         recursively, not just for our immediate children.
8017
8018 2003-02-23  Martin Baulig  <martin@ximian.com>
8019
8020         * class.cs (Event.Define): Always make the field private, like csc does.
8021
8022         * typemanager.cs (TypeManager.RealMemberLookup): Make events
8023         actually work, fixes bug #37521.
8024
8025 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
8026
8027         * delegate.cs: When creating the various temporary "Parameters"
8028         classes, make sure that we call the ComputeAndDefineParameterTypes
8029         on those new parameters (just like we do with the formal ones), to
8030         allow them to be resolved in the context of the DeclSpace.
8031
8032         This fixes the bug that Dick observed in Bugzilla #38530.
8033
8034 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
8035
8036         * expression.cs (ResolveMemberAccess): When resolving a constant,
8037         do not attempt to pull a constant if the value was not able to
8038         generate a valid constant.
8039
8040         * const.cs (LookupConstantValue): Do not report more errors than required.
8041
8042 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8043
8044         * expression.cs: fixes bug #38328.
8045
8046 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8047
8048         * class.cs: Changed all the various members that can be part of a
8049         class from being an ArrayList to be an Array of the right type.
8050         During the DefineType type_list, interface_list, delegate_list and
8051         enum_list are turned into types, interfaces, delegates and enums
8052         arrays.  
8053
8054         And during the member population, indexer_list, event_list,
8055         constant_list, field_list, instance_constructor_list, method_list,
8056         operator_list and property_list are turned into their real arrays.
8057
8058         Although we could probably perform this operation earlier, for
8059         good error reporting we need to keep the lists and remove the
8060         lists for longer than required.
8061
8062         This optimization was triggered by Paolo profiling the compiler
8063         speed on the output of `gen-sample-program.pl' perl script. 
8064
8065         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
8066         not crash in methods like MemberLookupFailed that use this field.  
8067
8068         This problem arises when the compiler fails to resolve a type
8069         during interface type definition for example.
8070
8071 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8072
8073         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
8074         inherit from System.Object, so we have to stop at null, not only
8075         when reaching System.Object.
8076
8077 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
8078
8079         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
8080         DeclaredOnly because the parent indexer might have had a different
8081         name, but did not loop until the top of the hierarchy was reached.
8082
8083         The problem this one fixes is 35492: when a class implemented an
8084         indexer from an interface, we were getting the interface method
8085         (which was abstract) and we were flagging an error (can not invoke
8086         abstract method).
8087
8088         This also keeps bug 33089 functioning, and test-148 functioning.
8089
8090         * typemanager.cs (IsSpecialMethod): The correct way of figuring
8091         out if a method is special is to see if it is declared in a
8092         property or event, or whether it is one of the predefined operator
8093         names.   This should fix correctly #36804.
8094
8095 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
8096
8097         The goal here is to remove the dependency on EmptyCast.Peel ().
8098         Killing it completely.
8099
8100         The problem is that currently in a number of places where
8101         constants are expected, we have to "probe" for an EmptyCast, and
8102         Peel, which is not the correct thing to do, as this will be
8103         repetitive and will likely lead to errors. 
8104
8105         The idea is to remove any EmptyCasts that are used in casts that
8106         can be reduced to constants, so we only have to cope with
8107         constants. 
8108
8109         This bug hunt was triggered by Bug 37363 and the desire to remove
8110         the duplicate pattern where we were "peeling" emptycasts to check
8111         whether they were constants.  Now constants will always be
8112         constants.
8113
8114         * ecore.cs: Use an enumconstant here instead of wrapping with
8115         EmptyCast.  
8116
8117         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
8118         throwing me off.  By handling this we can get rid of a few hacks.
8119
8120         * statement.cs (Switch): Removed Peel() code.
8121
8122 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
8123
8124         * class.cs: Location information for error 508
8125
8126         * expression.cs (New.DoResolve): Add a guard against double
8127         resolution of an expression.  
8128
8129         The New DoResolve might be called twice when initializing field
8130         expressions (see EmitFieldInitializers, the call to
8131         GetInitializerExpression will perform a resolve on the expression,
8132         and later the assign will trigger another resolution
8133
8134         This leads to bugs (#37014)
8135
8136         * delegate.cs: The signature for EndInvoke should contain any ref
8137         or out parameters as well.  We were not doing this in the past. 
8138
8139         * class.cs (Field.Define): Do not overwrite the type definition
8140         inside the `volatile' group.  Turns out that volatile enumerations
8141         were changing the type here to perform a validity test, which
8142         broke conversions. 
8143
8144 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
8145
8146         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
8147         and structs, we do not want to load the instance variable
8148
8149         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
8150         enum_type has to be handled like an object reference (implicit
8151         conversions exists from this to object), but the regular IsClass
8152         and IsValueType tests will never return true for this one.
8153
8154         Also we use TypeManager.IsValueType instead of type.IsValueType,
8155         just for consistency with the rest of the code (this is only
8156         needed if we ever use the construct exposed by test-180.cs inside
8157         corlib, which we dont today).
8158
8159 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
8160
8161         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
8162         just InternalCall.
8163
8164 2003-02-09  Martin Baulig  <martin@ximian.com>
8165
8166         * namespace.cs (Namespace..ctor): Added SourceFile argument.
8167         (Namespace.DefineNamespaces): New static public method; this is
8168         called when we're compiling with debugging to add all namespaces
8169         to the symbol file.
8170
8171         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
8172         pass it to the Namespace's .ctor.
8173
8174         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
8175         and MethodBase arguments; pass the namespace ID to the symwriter;
8176         pass the MethodBase instead of the token to the symwriter.
8177         (SymbolWriter.DefineNamespace): New method to add a namespace to
8178         the symbol file.
8179
8180 2003-02-09  Martin Baulig  <martin@ximian.com>
8181
8182         * symbolwriter.cs: New file.  This is a wrapper around
8183         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
8184         methods here in near future.
8185
8186 2003-02-09  Martin Baulig  <martin@ximian.com>
8187
8188         * codegen.cs (EmitContext.Mark): Just pass the arguments to
8189         ILGenerator.MarkSequencePoint() which are actually used by the
8190         symbol writer.
8191
8192 2003-02-09  Martin Baulig  <martin@ximian.com>
8193
8194         * location.cs (SourceFile): New public sealed class.  This
8195         contains the name and an index which is used in the location's token.
8196         (Location): Reserve an appropriate number of bits in the token for
8197         the source file instead of walking over that list, this gives us a
8198         really huge performance improvement when compiling with debugging.
8199
8200         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
8201         `SourceFile' argument instead of a string.
8202         (Driver.ProcessFile): Add all the files via Location.AddFile(),
8203         but don't parse/tokenize here, we need to generate the list of all
8204         source files before we do that.
8205         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
8206         the files.
8207
8208         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
8209         instead of a string.
8210
8211         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
8212         of a string.
8213
8214 2003-02-09  Martin Baulig  <martin@ximian.com>
8215
8216         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
8217         filename on `#line default'.
8218
8219 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
8220
8221         * statement.cs: don't clear the pinned var when the fixed statement
8222         returns from the method (fixes bug#37752).
8223
8224 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
8225
8226         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
8227         to IsValueType.
8228
8229 2003-02-07  Martin Baulig  <martin@ximian.com>
8230
8231         * driver.cs: Removed the `--debug-args' command line argument.
8232
8233         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
8234         automatically by the AsssemblyBuilder.
8235         (CodeGen.InitializeSymbolWriter): We don't need to call any
8236         initialization function on the symbol writer anymore.  This method
8237         doesn't take any arguments.
8238
8239 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
8240
8241         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
8242         from referenced assemblies as well.
8243
8244 2003-02-02  Martin Baulig  <martin@ximian.com>
8245
8246         * class.cs (MethodData.Emit): Generate debugging info for external methods.
8247
8248 2003-02-02  Martin Baulig  <martin@ximian.com>
8249
8250         * class.cs (Constructor.Emit): Open the symbol writer before
8251         emitting the constructor initializer.
8252         (ConstructorInitializer.Emit): Call ec.Mark() to allow
8253         single-stepping through constructor initializers.
8254
8255 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
8256
8257         * class.cs: Handle error 549: do not allow virtual methods in
8258         sealed classes. 
8259
8260 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
8261
8262         * decl.cs: Check access levels when resolving types
8263
8264 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
8265
8266         * statement.cs: Add parameters and locals set in catch blocks that might 
8267         return to set vector
8268
8269 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
8270
8271         * class.cs (Operator): Set the SpecialName flags for operators.
8272
8273         * expression.cs (Invocation.DoResolve): Only block calls to
8274         accessors and operators on SpecialName methods.
8275
8276         (Cast.TryReduce): Handle conversions from char constants.
8277
8278
8279 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
8280
8281         * statement.cs: small memory and time optimization in FlowBranching.
8282
8283 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
8284
8285         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
8286         problem that the last fix but in the other sid (Set).
8287
8288         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
8289         access when there is no indexer in the hierarchy.
8290
8291 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
8292
8293         * class.cs: Combine some if statements.
8294
8295 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8296
8297         * driver.cs: fixed bug #37187.
8298
8299 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
8300
8301         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
8302         any indexer, it's needed to build a list with all the indexers in the
8303         hierarchy (AllGetters), else we have problems. Fixes #35653.
8304
8305 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
8306
8307         * class.cs (MethodData.Define): It is wrong for an interface
8308         implementation to be static in both cases: explicit and implicit.
8309         We were only handling this in one case.
8310
8311         Improve the if situation there to not have negations.
8312
8313         * class.cs (Field.Define): Turns out that we do not need to check
8314         the unsafe bit on field definition, only on usage.  Remove the test.
8315
8316 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8317
8318         * driver.cs: use assembly.Location instead of Codebase (the latest
8319         patch made mcs fail when using MS assemblies).
8320
8321 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
8322
8323         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
8324         get the path to *corlib.dll.
8325
8326 2003-01-21  Nick Drochak <ndrochak@gol.com>
8327
8328         * cs-tokenizer.cs:
8329         * pending.cs:
8330         * typemanager.cs: Remove compiler warnings
8331
8332 2003-01-20  Duncan Mak  <duncan@ximian.com>
8333
8334         * AssemblyInfo.cs: Bump the version number to 0.19.
8335
8336 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8337
8338         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
8339
8340 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
8341
8342         * class.cs (Constructor::Emit): Emit debugging info for constructors.
8343
8344 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
8345
8346         * cs-parser.jay: Small fix: we were not comparing the constructor
8347         name correctly.   Thanks to Zoltan for the initial pointer.
8348
8349 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
8350
8351         * cs-tokenizer.cs: Set file name when specified with #line
8352
8353 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
8354
8355         * cs-parser.jay: Only perform the constructor checks here if we
8356         are named like the class;  This will help provider a better
8357         error.  The constructor path is taken when a type definition is
8358         not found, but most likely the user forgot to add the type, so
8359         report that rather than the constructor error.
8360
8361 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
8362
8363         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
8364         allocations.
8365
8366 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8367
8368         * cs-parser.jay: Add cleanup call.
8369
8370 2003-01-13  Duncan Mak  <duncan@ximian.com>
8371
8372         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
8373         consistent with other methods.
8374
8375 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8376
8377         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
8378
8379 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
8380
8381         * attribute.cs: only set GuidAttr to true when we have a
8382         GuidAttribute.
8383
8384 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8385
8386         * ecore.cs:
8387         * expression.cs:
8388         * typemanager.cs: fixes to allow mcs compile corlib with the new
8389         Type.IsSubclassOf fix.
8390
8391 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
8392
8393         * expression.cs (LocalVariableReference.DoResolve): Classify a
8394         constant as a value, not as a variable.   Also, set the type for
8395         the variable.
8396
8397         * cs-parser.jay (fixed_statement): take a type instead of a
8398         pointer_type, so we can produce a better error message later.
8399
8400         * statement.cs (Fixed.Resolve): Flag types that are not pointers
8401         as an error.  
8402
8403         (For.DoEmit): Make inifinite loops have a
8404         non-conditional branch back.
8405
8406         (Fixed.DoEmit): First populate the pinned variables, then emit the
8407         statement, then clear the variables.  Before I was emitting the
8408         code once for each fixed piece.
8409
8410
8411 2003-01-08  Martin Baulig  <martin@ximian.com>
8412
8413         * statement.cs (FlowBranching.MergeChild): A break in a
8414         SWITCH_SECTION does not leave a loop.  Fixes #36155.
8415
8416 2003-01-08  Martin Baulig  <martin@ximian.com>
8417
8418         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
8419         lives in the same number space than `param_map'.  Fixes #36154.
8420
8421 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
8422
8423         * cs-parser.jay (constructor_declaration): Set the
8424         Constructor.ModFlags before probing for it.  This makes the
8425         compiler report 514, 515 and 132 (the code was there, but got
8426         broken). 
8427
8428         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
8429         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
8430         (GotoCase.Resolve): Set `Returns' to ALWAYS.
8431
8432 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
8433
8434         * enum.cs: create the enum static fields using the enum type.
8435
8436 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
8437
8438         * class.cs: don't try to create the ParamBuilder for the return
8439         type if it's not needed (and handle it breaking for the ms runtime
8440         anyway).
8441
8442 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
8443
8444         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
8445
8446 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
8447
8448         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
8449         the command.   This showed up while compiling the JANET source
8450         code, which used \r as its only newline separator.
8451
8452 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
8453
8454         * class.cs (Method.Define): If we are an operator (because it
8455         reuses our code), then set the SpecialName and HideBySig.  #36128
8456
8457 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
8458
8459         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
8460         exception, report error 120 `object reference required'.
8461
8462         * driver.cs: Add --pause option, used during to measure the size
8463         of the process as it goes with --timestamp.
8464
8465         * expression.cs (Invocation.DoResolve): Do not allow methods with
8466         SpecialName to be invoked.
8467
8468 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
8469
8470         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
8471         number before adding it.
8472
8473 2002-12-21  Ravi Pratap  <ravi@ximian.com>
8474
8475         * ecore.cs (StandardImplicitConversion): When in an unsafe
8476         context, we allow conversion between void * to any other pointer
8477         type. This fixes bug #35973.
8478
8479 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
8480
8481         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
8482         is not thrown when extensionless outputs are used 
8483
8484 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8485
8486         * rootcontext.cs: fixed compilation of corlib.
8487
8488 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
8489
8490         * attribute.cs (Attributes.Contains): Add new method.
8491
8492         * class.cs (MethodCore.LabelParameters): if the parameter is an
8493         `out' parameter, check that no attribute `[In]' has been passed.
8494
8495         * enum.cs: Handle the `value__' name in an enumeration.
8496
8497 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
8498
8499         * decl.cs: Added special case to allow overrides on "protected
8500         internal" methods
8501
8502 2002-12-18  Ravi Pratap  <ravi@ximian.com>
8503
8504         * attribute.cs (Attributes.AddAttributeSection): Rename to this
8505         since it makes much more sense.
8506
8507         (Attributes.ctor): Don't require a Location parameter.
8508
8509         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
8510
8511         * attribute.cs (ApplyAttributes): Remove extra Location parameters
8512         since we already have that information per attribute.
8513
8514         * everywhere : make appropriate changes.
8515
8516         * class.cs (LabelParameters): Write the code which actually
8517         applies attributes to the return type. We can't do this on the MS
8518         .NET runtime so we flag a warning in the case an exception is
8519         thrown.
8520
8521 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
8522
8523         * const.cs: Handle implicit null conversions here too.
8524
8525 2002-12-17  Ravi Pratap  <ravi@ximian.com>
8526
8527         * class.cs (MethodCore.LabelParameters): Remove the extra
8528         Type [] parameter since it is completely unnecessary. Instead
8529         pass in the method's attributes so that we can extract
8530         the "return" attribute.
8531
8532 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
8533
8534         * cs-parser.jay (parse): Use Report.Error to flag errors instead
8535         of ignoring it and letting the compile continue.
8536
8537         * typemanager.cs (ChangeType): use an extra argument to return an
8538         error condition instead of throwing an exception.
8539
8540 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
8541
8542         * expression.cs (Unary.TryReduce): mimic the code for the regular
8543         code path.  Perform an implicit cast in the cases where we can
8544         implicitly convert to one of the integral types, and then reduce
8545         based on that constant.   This fixes bug #35483.
8546
8547 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8548
8549         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
8550
8551 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8552
8553         * namespace.cs: fixed bug #35489.
8554
8555 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
8556
8557         * class.cs: Remove some dead code.
8558
8559         * cs-parser.jay: Estimate the number of methods needed
8560         (RootContext.MethodCount);
8561
8562         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
8563         numbers instead of StringBuilders.
8564
8565         * support.cs (PtrHashtable): Add constructor with initial size;
8566         We can now reduce reallocations of the method table.
8567
8568 2002-12-10  Ravi Pratap  <ravi@ximian.com>
8569
8570         * attribute.cs (ApplyAttributes): Keep track of the emitted
8571         attributes on a per-target basis. This fixes bug #35413.
8572
8573 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
8574
8575         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
8576         default to the Windows 1252 encoding.
8577
8578         (UnixParseOption): Support version, thanks to Alp for the missing
8579         pointer. 
8580
8581         * AssemblyInfo.cs: Add nice assembly information.
8582
8583         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
8584         (bug 35169).
8585
8586         * cs-parser.jay: Allow a trailing comma before the close bracked
8587         in the attribute_section production.
8588
8589         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
8590         address of the instance was being taken, I will take this out,
8591         because we take the address of the object immediately here.
8592
8593 2002-12-09  Ravi Pratap  <ravi@ximian.com>
8594
8595         * typemanager.cs (AreMultipleAllowed): Take care of the most
8596         obvious case where attribute type is not in the current assembly -
8597         stupid me ;-)
8598
8599 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
8600
8601         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
8602         definitions, instead of doing that afterwards.  
8603
8604         Also we use a nice little hack, depending on the constructor, we
8605         know if we are a "composed" name or a simple name.  Hence, we
8606         avoid the IndexOf test, and we avoid 
8607
8608         * codegen.cs: Add code to assist in a bug reporter to track down
8609         the source of a compiler crash. 
8610
8611 2002-12-07  Ravi Pratap  <ravi@ximian.com>
8612
8613         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
8614         types have been emitted for a given element and flag an error
8615         if something which does not have AllowMultiple set is used more
8616         than once.
8617
8618         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
8619         attribute types and their corresponding AllowMultiple properties
8620
8621         (AreMultipleAllowed): Check the property for a given type.
8622
8623         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
8624         property in the case we have a TypeContainer.
8625
8626         (Attributes.AddAttribute): Detect duplicates and just skip on
8627         adding them. This trivial fix catches a pretty gross error in our
8628         attribute emission - global attributes were being emitted twice!
8629
8630         Bugzilla bug #33187 is now fixed.
8631
8632 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
8633
8634         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
8635         instead of pp_and).
8636
8637         * expression.cs (Binary.ResolveOperator): I can only use the
8638         Concat (string, string, string) and Concat (string, string,
8639         string, string) if the child is actually a concatenation of
8640         strings. 
8641
8642 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
8643
8644         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
8645         context where we need a 2-character lookahead.
8646
8647         * pending.cs (PendingImplementation): Rework so we can keep track
8648         of interface types all the time, and flag those which were
8649         implemented by parents as optional.
8650
8651 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
8652
8653         * expression.cs (Binary.ResolveOperator): Use
8654         String.Concat(string,string,string) or
8655         String.Concat(string,string,string,string) when possible. 
8656
8657         * typemanager: More helper methods.
8658
8659
8660 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
8661
8662         * pending.cs: remove the bogus return from GetMissingInterfaces()
8663         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
8664
8665 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8666
8667         * namespace.cs: avoid duplicated 'using xxx' being added to
8668         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
8669         when we get more than one 'using' statement for the same namespace.
8670         Report a CS0105 warning for it.
8671
8672 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
8673
8674         * cs-tokenizer.cs (consume_identifier): use read directly, instead
8675         of calling getChar/putback, uses internal knowledge of it.    
8676
8677         (xtoken): Reorder tokenizer so most common patterns are checked
8678         first.  This reduces the compilation time in another 5% (from 8.11s
8679         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
8680
8681         The parsing time is 22% of the compilation in mcs, and from that
8682         64% is spent on the tokenization process.  
8683
8684         I tried using a binary search for keywords, but this is slower
8685         than the hashtable.  Another option would be to do a couple of
8686         things:
8687
8688                 * Not use a StringBuilder, instead use an array of chars,
8689                   with a set value.  Notice that this way we could catch
8690                   the 645 error without having to do it *afterwards*.
8691
8692                 * We could write a hand-parser to avoid the hashtable
8693                   compares altogether.
8694
8695         The identifier consumption process takes 37% of the tokenization
8696         time.  Another 15% is spent on is_number.  56% of the time spent
8697         on is_number is spent on Int64.Parse:
8698
8699                 * We could probably choose based on the string length to
8700                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
8701                   computations. 
8702
8703         Another 3% is spend on wrapping `xtoken' in the `token' function.
8704
8705         Handle 0xa0 as whitespace (#34752)
8706
8707 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
8708
8709         * typemanager.cs (IsCLRType): New routine to tell whether a type
8710         is one of the builtin types.  
8711
8712         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
8713         typecode in more places instead of doing pointer comparissions.
8714         We could leverage some knowledge about the way the typecodes are
8715         laid out.
8716
8717         New code to cache namespaces in assemblies, it is currently not
8718         invoked, to be used soon.
8719
8720         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
8721
8722         * expression.cs (Binary.ResolveOperator): specially handle
8723         strings, and do not perform user-defined operator overloading for
8724         built-in types.
8725
8726 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
8727
8728         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
8729         internalcall as it is a pretty simple operation;  Avoid whenever
8730         possible to call Char.IsLetter.
8731
8732         (consume_identifier): Cut by half the number of
8733         hashtable calls by merging the is_keyword and GetKeyword behavior.
8734
8735         Do not short-circuit, because if we do, we
8736         report errors (ie, #if false && true would produce an invalid
8737         directive error);
8738
8739
8740 2002-11-24  Martin Baulig  <martin@ximian.com>
8741
8742         * expression.cs (Cast.TryReduce): If we're in checked syntax,
8743         check constant ranges and report a CS0221.  Fixes #33186.
8744
8745 2002-11-24  Martin Baulig  <martin@ximian.com>
8746
8747         * cs-parser.jay: Make this work for uninitialized variable
8748         declarations in the `for' initializer.  Fixes #32416.
8749
8750 2002-11-24  Martin Baulig  <martin@ximian.com>
8751
8752         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
8753         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
8754
8755 2002-11-24  Martin Baulig  <martin@ximian.com>
8756
8757         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
8758         argument; if true, we also check for user-defined conversions.
8759         This is only needed if both arguments are of a user-defined type.
8760         Fixes #30443, added test-175.cs.
8761         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
8762
8763         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
8764
8765 2002-11-24  Martin Baulig  <martin@ximian.com>
8766
8767         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
8768         function to get the store opcode.
8769         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
8770         only emit the Ldelema if the store opcode is Stobj.  You must run
8771         both test-34 and test-167 to test this.  Fixes #34529.
8772
8773 2002-11-23  Martin Baulig  <martin@ximian.com>
8774
8775         * ecore.cs (Expression.MemberLookup): Added additional
8776         `qualifier_type' argument which is used when we're being called
8777         from MemberAccess.DoResolve() and null if we're called from a
8778         SimpleName lookup.
8779         (Expression.MemberLookupFailed): New method to report errors; this
8780         does the CS1540 check and reports the correct error message.
8781
8782         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
8783         argument for the CS1540 check and redone the way how we're dealing
8784         with private members.  See the comment in the source code for details.
8785         (FilterWithClosure): Reverted this back to revision 1.197; renamed
8786         `closure_start_type' to `closure_qualifier_type' and check whether
8787         it's not null.  It was not this filter being broken, it was just
8788         being called with the wrong arguments.
8789
8790         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
8791         and pass it the correct `qualifier_type'; this also does the error
8792         handling for us.
8793
8794 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
8795
8796         * expression.cs (Invocation.EmitParams): If the we are dealing
8797         with a non-built-in value type, load its address as well.
8798
8799         (ArrayCreation): Use a a pretty constant instead
8800         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8801         static initializers.  
8802
8803         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8804         because they are not really value types, just glorified integers. 
8805
8806         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8807
8808         * ecore.cs: Remove redundant code for enumerations, make them use
8809         the same code path as everything else, fixes the casting issue
8810         with enumerations in Windows.Forms.
8811
8812         * attribute.cs: Do only cast to string if it is a string, the
8813         validation happens later.
8814
8815         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8816         people upgrade their corlibs.
8817
8818         * ecore.cs: Oops, enumerations were not following the entire code path
8819
8820 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8821
8822         * typemanager.cs (FilterWithClosure): Commented out the test for
8823         1540 in typemanager.cs, as it has problems when accessing
8824         protected methods from a parent class (see test-174.cs). 
8825
8826         * attribute.cs (Attribute.ValidateGuid): new method.
8827         (Attribute.Resolve): Use above.
8828
8829 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8830
8831         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8832
8833         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8834         handling for enumerations, as we only needed the TypeContainer
8835         functionality to begin with (this is required for the fix below to
8836         work for enums that reference constants in a container class for
8837         example). 
8838
8839         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8840
8841         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8842         a valid TypeBuilder to perform lookups on.o
8843
8844         * class.cs (InheritableMemberSignatureCompare): Use true in the
8845         call to GetGetMethod and GetSetMethod, because we are comparing
8846         the signature, and we need to get the methods *even* if they are
8847         private. 
8848
8849         (PropertyBase.CheckBase): ditto.
8850
8851         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8852         GotoCase.Resolve): Use Peel on EmpytCasts.
8853
8854         * ecore.cs (EmptyCast): drop child, add Peel method.
8855
8856 2002-11-17  Martin Baulig  <martin@ximian.com>
8857
8858         * ecore.cs (EmptyCast.Child): New public property.
8859
8860         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8861         label resolved to an EmptyCast.  Fixes #34162.
8862         (GotoCase.Resolve): Likewise.
8863         (Block.EmitMeta): Likewise.
8864
8865 2002-11-17  Martin Baulig  <martin@ximian.com>
8866
8867         * expression.cs (Invocation.BetterConversion): Prefer int over
8868         uint; short over ushort; long over ulong for integer literals.
8869         Use ImplicitConversionExists instead of StandardConversionExists
8870         since we also need to check for user-defined implicit conversions.
8871         Fixes #34165.  Added test-173.cs.
8872
8873 2002-11-16  Martin Baulig  <martin@ximian.com>
8874
8875         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8876         with the `true' and `false' literals.  Fixes #33151.
8877
8878 2002-11-16  Martin Baulig  <martin@ximian.com>
8879
8880         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8881         October 22nd; don't do the cs1540 check for static members.
8882
8883         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8884         now using our own filter here and doing the cs1540 check again.
8885
8886 2002-11-16  Martin Baulig  <martin@ximian.com>
8887
8888         * support.cs (InternalParameters): Don't crash if we don't have
8889         any fixed parameters.  Fixes #33532.
8890
8891 2002-11-16  Martin Baulig  <martin@ximian.com>
8892
8893         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8894         when looking up static methods to make this work on Windows.
8895         Fixes #33773.
8896
8897 2002-11-16  Martin Baulig  <martin@ximian.com>
8898
8899         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8900         a setter rather than using PropertyInfo.CanWrite.
8901
8902 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8903
8904         * class.cs: Allow acces to block member by subclasses. Fixes build
8905         breaker.
8906
8907 2002-11-14  Martin Baulig  <martin@ximian.com>
8908
8909         * class.cs (Constructor.Emit): Added the extern/block check.
8910         Fixes bug #33678.
8911
8912 2002-11-14  Martin Baulig  <martin@ximian.com>
8913
8914         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8915         iteration while looking for indexers, this is needed because the
8916         indexer may have a different name in our base classes.  Fixed the
8917         error reporting (no indexers at all, not get accessor, no
8918         overloaded match).  Fixes bug #33089.
8919         (IndexerAccess.DoResolveLValue): Likewise.
8920
8921 2002-11-14  Martin Baulig  <martin@ximian.com>
8922
8923         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8924         indexers.  Fixes the first part of bug #33089.
8925         (MethodSignature.InheritableMemberSignatureCompare): Added support
8926         for properties.
8927
8928 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8929
8930         * attribute.cs (Attribute.Resolve): Catch the
8931         NullReferenceException and report it since it isn't supposed to
8932         happen. 
8933
8934 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8935
8936         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8937         LogicalOr and LogicalAnd that can benefit from recursively
8938         handling EmitBranchable.  The code now should be nice for Paolo.
8939
8940 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8941
8942         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8943         the Type lookups, as we perform quite a number of lookups on
8944         non-Types.  This can be removed once we can deterministically tell
8945         whether we have a type or a namespace in advance.
8946
8947         But this might require special hacks from our corlib.
8948
8949         * TODO: updated.
8950
8951         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8952         and double which avoids a conversion from an integer to a double.
8953
8954         * expression.cs: tiny optimization, avoid calling IsConstant,
8955         because it effectively performs the lookup twice.
8956
8957 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8958
8959         But a bogus return here to keep the semantics of the old code
8960         until the Mono runtime is fixed.
8961
8962         * pending.cs (GetMissingInterfaces): New method used to remove all
8963         the interfaces that are already implemented by our parent
8964         classes from the list of pending methods. 
8965
8966         * interface.cs: Add checks for calls after ResolveTypeExpr.
8967
8968 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8969
8970         * class.cs (Class.Emit): Report warning 67: event not used if the
8971         warning level is beyond 3.
8972
8973         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8974         being a NullLiteral.
8975
8976         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8977         specifiers. 
8978
8979         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8980         path that might fail if a type can not be resolved.
8981
8982         * expression.cs (Binary.Emit): Emit unsigned versions of the
8983         operators. 
8984
8985         * driver.cs: use error 5.
8986
8987 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8988
8989         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8990
8991 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8992
8993         * cs-parser.jay (switch_section): A beautiful patch from Martin
8994         Baulig that fixed 33094.
8995
8996 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8997
8998         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8999         Check whether the base is abstract and report an error if so.
9000
9001         * expression.cs (IndexerAccess.DoResolveLValue,
9002         IndexerAccess.DoResolve): ditto. 
9003
9004         (Invocation.DoResolve): ditto.
9005
9006         (Invocation.FullMethodDesc): Improve the report string.
9007
9008         * statement.cs (Block): Eliminate IsVariableDefined as it is
9009         basically just a wrapper for GetVariableInfo.
9010
9011         * ecore.cs (SimpleName): Use new 
9012
9013         * support.cs (ReflectionParamter.ParameterType): We unwrap the
9014         type, as we return the actual parameter ref/unref state on a
9015         different call.
9016
9017 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
9018
9019         * support.cs: Return proper flags REF/OUT fixing the previous
9020         commit.  
9021
9022         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
9023         not used to mean `ref' but `ref or out' in ParameterReference
9024
9025         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
9026         full type signature instead of calling TypeManger.CSharpName
9027         ourselves. 
9028
9029         * support.cs (InternalParameters.ParameterDesc): Do not compare
9030         directly to the modflags, because REF/OUT will actually be bitsets
9031         if set. 
9032
9033         * delegate.cs (VerifyMethod): Check also the modifiers.
9034
9035         * cs-tokenizer.cs: Fix bug where floating point values with an
9036         exponent where a sign was missing was ignored.
9037
9038         * driver.cs: Allow multiple assemblies to be specified in a single
9039         /r: argument
9040
9041 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
9042
9043         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
9044         because identifiers after a parenthesis would end up in this kind
9045         of production, and we needed to desamiguate it for having casts
9046         like:
9047
9048                 (UserDefinedType *) xxx
9049
9050 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
9051
9052         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
9053         we should set on the Bindingflags.NonPublic, but not turn on
9054         private_ok.  private_ok controls whether a Private member is
9055         returned (this is chekced on the filter routine), while the
9056         BindingFlags.NonPublic just controls whether private/protected
9057         will be allowed.   This fixes the problem part of the problem of
9058         private properties being allowed to be used in derived classes.
9059
9060         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
9061         so we can call the children DoResolveLValue method (this will
9062         properly signal errors on lvalue assignments to base properties)
9063
9064         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
9065         getter are null, and we have a property info, we know that this
9066         happened because the lookup failed, so we report an error 122 for
9067         protection level violation.
9068
9069         We also silently return if setter and getter are null in the
9070         resolve functions, this condition only happens if we have flagged
9071         the error before.  This is the other half of the problem. 
9072
9073         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
9074         not have accessibility information, that is why we were returning
9075         true in the filter function in typemanager.cs.
9076
9077         To properly report 122 (property is inaccessible because of its
9078         protection level) correctly, we report this error in ResolveAccess
9079         by failing if both the setter and the getter are lacking (ie, the
9080         lookup failed). 
9081
9082         DoResolve and DoLResolve have been modified to check for both
9083         setter/getter being null and returning silently, the reason being
9084         that I did not want to put the knowledge about this error in upper
9085         layers, like:
9086
9087         int old = Report.Errors;
9088         x = new PropertyExpr (...);
9089         if (old != Report.Errors)
9090                 return null;
9091         else
9092                 return x;
9093
9094         So the property expr is returned, but it is invalid, so the error
9095         will be flagged during the resolve process. 
9096
9097         * class.cs: Remove InheritablePropertySignatureCompare from the
9098         class, as we no longer depend on the property signature to compute
9099         whether it is possible to implement a method or not.
9100
9101         The reason is that calling PropertyInfo.GetGetMethod will return
9102         null (in .NET, in Mono it works, and we should change this), in
9103         cases where the Get Method does not exist in that particular
9104         class.
9105
9106         So this code:
9107
9108         class X { public virtual int A { get { return 1; } } }
9109         class Y : X { }
9110         class Z : Y { public override int A { get { return 2; } } }
9111
9112         Would fail in Z because the parent (Y) would not have the property
9113         defined.  So we avoid this completely now (because the alternative
9114         fix was ugly and slow), and we now depend exclusively on the
9115         method names.
9116
9117         (PropertyBase.CheckBase): Use a method-base mechanism to find our
9118         reference method, instead of using the property.
9119
9120         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
9121         routines are gone now.
9122
9123         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
9124         names, they were incorrectly named.
9125
9126         * cs-tokenizer.cs: Return are more gentle token on failure. 
9127
9128         * pending.cs (PendingImplementation.InterfaceMethod): This routine
9129         had an out-of-sync index variable, which caused it to remove from
9130         the list of pending methods the wrong method sometimes.
9131
9132 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
9133
9134         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
9135         CanWrite, because those refer to this particular instance of the
9136         property, and do not take into account the fact that we can
9137         override single members of a property.
9138
9139         Constructor requires an EmitContext.  The resolution process does
9140         not happen here, but we need to compute the accessors before,
9141         because the resolution does not always happen for properties.
9142
9143         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
9144         subclass, before we did not update this flag, but we did update
9145         bindingflags. 
9146
9147         (GetAccessors): Drop this routine, as it did not work in the
9148         presence of partially overwritten set/get methods. 
9149
9150         Notice that this broke the cs1540 detection, but that will require
9151         more thinking. 
9152
9153 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9154
9155         * class.cs:
9156         * codegen.cs:
9157         * driver.cs: issue a warning instead of an error if we don't support
9158         debugging for the platform. Also ignore a couple of errors that may
9159         arise when trying to write the symbols. Undo my previous patch.
9160
9161 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9162
9163         * driver.cs: ignore /debug switch except for Unix platforms.
9164
9165 2002-10-23  Nick Drochak  <ndrochak@gol.com>
9166
9167         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
9168
9169 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
9170
9171         * driver.cs: Do not make mcs-debug conditional, so we do not break
9172         builds that use it.
9173
9174         * statement.cs (UsageVector.MergeChildren): I would like Martin to
9175         review this patch.  But basically after all the children variables
9176         have been merged, the value of "Breaks" was not being set to
9177         new_breaks for Switch blocks.  I think that it should be set after
9178         it has executed.  Currently I set this to the value of new_breaks,
9179         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
9180         conservative, but I do not understand this code very well.
9181
9182         I did not break anything in the build, so that is good ;-)
9183
9184         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
9185
9186 2002-10-20  Mark Crichton  <crichton@gimp.org>
9187
9188         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
9189
9190 2002-10-20  Nick Drochak  <ndrochak@gol.com>
9191
9192         * cfold.cs: Fixed compile blocker.
9193
9194 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
9195
9196         * driver.cs: I was chekcing the key, not the file.
9197
9198 2002-10-19  Ravi Pratap  <ravi@ximian.com>
9199
9200         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
9201         message that we were generating - we just need to silently return
9202         a null.
9203
9204 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
9205
9206         * class.cs (Event.Define): Change my previous commit, as this
9207         breaks the debugger.  This is a temporary hack, as it seems like
9208         the compiler is generating events incorrectly to begin with.
9209
9210         * expression.cs (Binary.ResolveOperator): Added support for 
9211         "U operator - (E x, E y)"
9212
9213         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
9214         y)".
9215
9216         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
9217         init-only variables, but this path did not take into account that
9218         there might be also instance readonly variables.  Correct this
9219         problem. 
9220
9221         This fixes bug 32253
9222
9223         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
9224         delegates as well.
9225
9226         * driver.cs: Change the extension for modules to `netmodule'
9227
9228         * cs-parser.jay: Improved slightly the location tracking for
9229         the debugger symbols.
9230
9231         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
9232         modifiers that were specified instead of the hardcoded value
9233         (FamAndAssem).  This was basically ignoring the static modifier,
9234         and others.  Fixes 32429.
9235
9236         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
9237         fixed a bug in the process (32476)
9238
9239         * expression.cs (ArrayAccess.EmitAssign): Patch from
9240         hwang_rob@yahoo.ca that fixes bug 31834.3
9241
9242 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
9243
9244         * driver.cs: Make the module extension .netmodule.
9245
9246 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
9247
9248         * driver.cs: Report an error if the resource file is not found
9249         instead of crashing.
9250
9251         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
9252         false, like Emit does.
9253
9254 2002-10-16  Nick Drochak  <ndrochak@gol.com>
9255
9256         * typemanager.cs: Remove unused private member.  Also reported mcs
9257         bug to report this as a warning like csc.
9258
9259 2002-10-15  Martin Baulig  <martin@gnome.org>
9260
9261         * statement.cs (Statement.Emit): Made this a virtual method; emits
9262         the line number info and calls DoEmit().
9263         (Statement.DoEmit): New protected abstract method, formerly knows
9264         as Statement.Emit().
9265
9266         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
9267
9268 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
9269
9270         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
9271         have fixed a remaining problem: not every AddXXXX was adding a
9272         fully qualified name.  
9273
9274         Now everyone registers a fully qualified name in the DeclSpace as
9275         being defined instead of the partial name.  
9276
9277         Downsides: we are slower than we need to be due to the excess
9278         copies and the names being registered this way.  
9279
9280         The reason for this is that we currently depend (on the corlib
9281         bootstrap for instance) that types are fully qualified, because
9282         we dump all the types in the namespace, and we should really have
9283         types inserted into the proper namespace, so we can only store the
9284         basenames in the defined_names array.
9285
9286 2002-10-10  Martin Baulig  <martin@gnome.org>
9287
9288         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
9289         from bug #31834, see the bug report for a testcase which is
9290         miscompiled.
9291
9292 2002-10-10  Martin Baulig  <martin@gnome.org>
9293
9294         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
9295         flow analysis code for this.
9296
9297         * statement.cs (Do, While, For): Tell the flow analysis code about
9298         infinite loops.
9299         (FlowBranching.UsageVector): Added support for infinite loops.
9300         (Block.Resolve): Moved the dead code elimination here and use flow
9301         analysis to do it.
9302
9303 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
9304
9305         * class.cs (Field.Define): Catch cycles on struct type
9306         definitions. 
9307
9308         * typemanager.cs (IsUnmanagedtype): Do not recursively check
9309         fields if the fields are static.  We only need to check instance
9310         fields. 
9311
9312         * expression.cs (As.DoResolve): Test for reference type.
9313
9314         * statement.cs (Using.ResolveExpression): Use
9315         ConvertImplicitRequired, not ConvertImplicit which reports an
9316         error on failture
9317         (Using.ResolveLocalVariableDecls): ditto.
9318
9319         * expression.cs (Binary.ResolveOperator): Report errors in a few
9320         places where we had to.
9321
9322         * typemanager.cs (IsUnmanagedtype): Finish implementation.
9323
9324 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
9325
9326         * expression.cs: Use StoreFromPtr instead of extracting the type
9327         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
9328
9329         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
9330         an enumeration value to a System.Enum, but System.Enum is not a
9331         value type, but an class type, so we need to box.
9332
9333         (Expression.ConvertExplicit): One codepath could return
9334         errors but not flag them.  Fix this.  Fixes #31853
9335
9336         * parameter.cs (Resolve): Do not allow void as a parameter type.
9337
9338 2002-10-06  Martin Baulig  <martin@gnome.org>
9339
9340         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
9341         if it's a class type and not a struct.  Fixes #31815.
9342
9343 2002-10-06  Martin Baulig  <martin@gnome.org>
9344
9345         * statement.cs: Reworked the flow analysis code a bit to make it
9346         usable for dead code elimination.
9347
9348 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9349
9350         * cs-parser.jay: allow empty source files. Fixes bug #31781.
9351
9352 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9353
9354         * expression.cs (ComposedCast.DoResolveType): A quick workaround
9355         to fix the test 165, will investigate deeper.
9356
9357 2002-10-04  Martin Baulig  <martin@gnome.org>
9358
9359         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
9360         finally blocks actually work.
9361         (Try.Resolve): We don't need to create a sibling for `finally' if
9362         there is no finally block.
9363
9364 2002-10-04  Martin Baulig  <martin@gnome.org>
9365
9366         * class.cs (Constructor.Define): The default accessibility for a
9367         non-default constructor is private, not public.
9368
9369 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9370
9371         * class.cs (Constructor): Make AllowedModifiers public, add
9372         EXTERN.
9373
9374         * cs-parser.jay: Perform the modifiers test here, as the
9375         constructor for the Constructor class usually receives a zero
9376         because of the way we create it (first we create, later we
9377         customize, and we were never checking the modifiers).
9378
9379         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
9380         is a version of LookupTypeReflection that includes the type-name
9381         cache.  This can be used as a fast path for functions that know
9382         the fully qualified name and are only calling into *.GetType() to
9383         obtain a composed type.
9384
9385         This is also used by TypeManager.LookupType during its type
9386         composition.
9387
9388         (LookupType): We now also track the real type name, as sometimes
9389         we can get a quey for the real type name from things like
9390         ComposedCast.  This fixes bug 31422.
9391
9392         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
9393         complete type fullname, it does not have to go through the type
9394         resolution system to obtain the composed version of the type (for
9395         obtaining arrays or pointers).
9396
9397         (Conditional.Emit): Use the EmitBoolExpression to
9398         generate nicer code, as requested by Paolo.
9399
9400         (ArrayCreation.CheckIndices): Use the patch from
9401         hwang_rob@yahoo.ca to validate the array initializers. 
9402
9403 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
9404
9405         * class.cs (ConstructorInitializer.Emit): simplify code by using
9406         Invocation.EmitCall, and at the same time, fix the bugs in calling
9407         parent constructors that took variable arguments. 
9408
9409         * ecore.cs (Expression.ConvertNumericExplicit,
9410         Expression.ImplicitNumericConversion): Remove the code that
9411         manually wrapped decimal (InternalTypeConstructor call is now gone
9412         as well).
9413
9414         * expression.cs (Cast.TryReduce): Also handle decimal types when
9415         trying to perform a constant fold on the type.
9416
9417         * typemanager.cs (IsUnmanagedtype): Partially implemented.
9418
9419         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
9420         that only turned off an error report, and did nothing else. 
9421
9422 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
9423
9424         * driver.cs: Handle and ignore /fullpaths
9425
9426 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
9427
9428         * expression.cs (Binary.ResolveOperator): Catch the case where
9429         DoNumericPromotions returns true, 
9430
9431         (Binary.DoNumericPromotions): Simplify the code, and the tests.
9432
9433 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
9434
9435         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
9436         report error 70.
9437
9438 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
9439
9440         * ecore.cs (ConvertNumericExplicit): It is not enough that the
9441         conversion exists, but it is also required that the conversion be
9442         performed.  This manifested in "(Type64Enum) 2".  
9443
9444         * class.cs (TypeManager.AddMethod): The fix is not to change
9445         AddEnum, because that one was using a fully qualified name (every
9446         DeclSpace derivative does), but to change the AddMethod routine
9447         that was using an un-namespaced name.  This now correctly reports
9448         the duplicated name.
9449
9450         Revert patch until I can properly fix it.  The issue
9451         is that we have a shared Type space across all namespaces
9452         currently, which is wrong.
9453
9454         Options include making the Namespace a DeclSpace, and merge
9455         current_namespace/current_container in the parser.
9456
9457 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
9458
9459         * cs-parser.jay: Improve error reporting when we get a different
9460         kind of expression in local_variable_type and
9461         local_variable_pointer_type. 
9462
9463         Propagate this to avoid missleading errors being reported.
9464
9465         * ecore.cs (ImplicitReferenceConversion): treat
9466         TypeManager.value_type as a target just like object_type.   As
9467         code like this:
9468
9469         ValueType v = 1;
9470
9471         Is valid, and needs to result in the int 1 being boxed before it
9472         is assigned to the value type v.
9473
9474         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
9475         to validate the enumeration name.
9476
9477         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
9478         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
9479         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
9480
9481         * ecore.cs (TryImplicitIntConversion): When doing an
9482         implicit-enumeration-conversion, check if the type is 64-bits and
9483         perform a conversion before passing to EnumConstant.
9484
9485 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
9486
9487         * decl.cs (Error_AmbiguousTypeReference); New routine used to
9488         report ambiguous type references.  Unlike the MS version, we
9489         report what the ambiguity is.   Innovation at work ;-)
9490
9491         (DeclSpace.FindType): Require a location argument to
9492         display when we display an ambiguous error.
9493
9494         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
9495
9496         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
9497
9498         * expression.cs (EmitDynamicInitializers): Apply patch from
9499         hwang_rob@yahoo.ca that fixes the order in which we emit our
9500         initializers. 
9501
9502 2002-09-21  Martin Baulig  <martin@gnome.org>
9503
9504         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
9505         delegate takes no arguments.
9506
9507 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
9508
9509         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
9510         from integers.
9511
9512         * expression.cs: Extract the underlying type.
9513
9514         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
9515
9516         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
9517
9518 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
9519
9520         * class.cs (TypeContainer.DefineType): We can not use the nice
9521         PackingSize with the size set to 1 DefineType method, because it
9522         will not allow us to define the interfaces that the struct
9523         implements.
9524
9525         This completes the fixing of bug 27287
9526
9527         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
9528         means also structs.  This fixes part of the problem. 
9529         (Expresion.ImplicitReferenceConversionExists): ditto.
9530
9531         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
9532         error if there were no errors reported during the type lookup
9533         process, to avoid duplicates or redundant errors.  Without this
9534         you would get an ambiguous errors plus a type not found.  We have
9535         beaten the user enough with the first error.  
9536
9537         (DeclSparce.FindType): Emit a warning if we have an ambiguous
9538         reference. 
9539
9540         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
9541         during the resolution process, stop the lookup, this avoids
9542         repeated error reports (same error twice).
9543
9544         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
9545
9546         * typemanager.cs (LookupType): Redo the type lookup code to match
9547         the needs of System.Reflection.  
9548
9549         The issue is that System.Reflection requires references to nested
9550         types to begin with a "+" sign instead of a dot.  So toplevel
9551         types look like: "NameSpace.TopLevelClass", and nested ones look
9552         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
9553         levels. 
9554
9555 2002-09-19  Martin Baulig  <martin@gnome.org>
9556
9557         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
9558         says that a method always returns or always throws an exception,
9559         don't report the CS0161.
9560
9561         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
9562         set `Returns = new_returns'.
9563
9564 2002-09-19  Martin Baulig  <martin@gnome.org>
9565
9566         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
9567         to an enum constant, check for a CS0176.
9568
9569 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
9570
9571         * class.cs (TypeContainer.CheckPairedOperators): Now we check
9572         for operators that must be in pairs and report errors.
9573
9574         * ecore.cs (SimpleName.DoResolveType): During the initial type
9575         resolution process, when we define types recursively, we must
9576         check first for types in our current scope before we perform
9577         lookups in the enclosing scopes.
9578
9579         * expression.cs (MakeByteBlob): Handle Decimal blobs.
9580
9581         (Invocation.VerifyArgumentsCompat): Call
9582         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
9583         I thought we were supposed to always call this, but there are a
9584         few places in the code where we dont do it.
9585
9586 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
9587
9588         * driver.cs: Add support in -linkres and -resource to specify the
9589         name of the identifier.
9590
9591 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9592
9593         * ecore.cs (StandardConversionExists): Sync with the conversion
9594         code: allow anything-* to void* conversions.
9595
9596         (FindMostSpecificSource): Use an Expression argument
9597         instead of a Type, because we might be handed over a Literal which
9598         gets a few more implicit conversions that plain types do not.  So
9599         this information was being lost.
9600
9601         Also, we drop the temporary type-holder expression when not
9602         required.
9603
9604 2002-09-17  Martin Baulig  <martin@gnome.org>
9605
9606         * class.cs (PropertyBase.CheckBase): Don't check the base class if
9607         this is an explicit interface implementation.
9608
9609 2002-09-17  Martin Baulig  <martin@gnome.org>
9610
9611         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
9612         different `IndexerName' attributes.
9613
9614         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
9615         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
9616         virtual CommonResolve().
9617
9618 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9619
9620         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
9621         and convert that to the UnderlyingType.
9622
9623         * statement.cs (Foreach.Resolve): Indexers are just like variables
9624         or PropertyAccesses.
9625
9626         * cs-tokenizer.cs (consume_string): Track line numbers and columns
9627         inside quoted strings, we were not doing this before.
9628
9629 2002-09-16  Martin Baulig  <martin@gnome.org>
9630
9631         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
9632         resolve it.  This is needed for the definite assignment check of the
9633         instance expression, fixes bug #29846.
9634         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
9635
9636 2002-09-16  Nick Drochak  <ndrochak@gol.com>
9637
9638         * parameter.cs: Fix compile error.  Cannot reference static member
9639         from an instance object.  Is this an mcs bug?
9640
9641 2002-09-14  Martin Baulig  <martin@gnome.org>
9642
9643         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
9644         multiple times.  Fixes bug #30295, added test-166.cs.
9645
9646 2002-09-14  Martin Baulig  <martin@gnome.org>
9647
9648         * statement.cs (Block.Emit): Don't emit unreachable code.
9649         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
9650         `break' statements.
9651         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
9652
9653 2002-09-14  Martin Baulig  <martin@gnome.org>
9654
9655         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
9656         is set.
9657
9658 2002-09-14  Martin Baulig  <martin@gnome.org>
9659
9660         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
9661         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
9662         be false on the ms runtime.
9663
9664 2002-09-13  Martin Baulig  <martin@gnome.org>
9665
9666         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
9667         the CS0038 error message.
9668
9669 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
9670
9671         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
9672         constant inside, return it.
9673
9674 2002-09-12  Martin Baulig  <martin@gnome.org>
9675
9676         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
9677         implicit conversion can be done between enum types.
9678
9679         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
9680         check whether an implicit conversion to the current enum's UnderlyingType
9681         exists and report an error if not.
9682
9683         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
9684         without debugging support.
9685
9686         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
9687         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
9688
9689 2002-09-12  Martin Baulig  <martin@gnome.org>
9690
9691         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
9692
9693         * ecore.cs (IMemberExpr.DeclaringType): New property.
9694         (SimpleName.SimpleNameResolve): Check whether we're accessing a
9695         nonstatic member of an outer type (CS0038).
9696
9697 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
9698
9699         * driver.cs: Activate the using-error detector at warning level
9700         4 (at least for MS-compatible APIs).
9701
9702         * namespace.cs (VerifyUsing): Small buglett fix.
9703
9704         * pending.cs (PendingImplementation): pass the container pointer. 
9705
9706         * interface.cs (GetMethods): Allow for recursive definition.  Long
9707         term, I would like to move every type to support recursive
9708         definitions, not the current ordering mechanism that we have right
9709         now.
9710
9711         The situation is this: Attributes are handled before interfaces,
9712         so we can apply attributes to interfaces.  But some attributes
9713         implement interfaces, we will now handle the simple cases
9714         (recursive definitions will just get an error).  
9715
9716         * parameter.cs: Only invalidate types at the end if we fail to
9717         lookup all types.  
9718
9719 2002-09-09  Martin Baulig  <martin@gnome.org>
9720
9721         * ecore.cs (PropertyExpr.Emit): Also check for
9722         TypeManager.system_int_array_get_length so this'll also work when
9723         compiling corlib.  Fixes #30003.
9724
9725 2002-09-09  Martin Baulig  <martin@gnome.org>
9726
9727         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
9728         and throw an exception if we can't get the type's size.  Fixed #30040,
9729         added test-165.cs.
9730
9731 2002-09-09  Martin Baulig  <martin@gnome.org>
9732
9733         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
9734
9735         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
9736         context.  Fixes bug #30027.
9737
9738         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
9739         virtual functions.  Fixes bug #30043, added test-164.cs.
9740
9741 2002-09-08  Ravi Pratap  <ravi@ximian.com>
9742
9743         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
9744
9745 2002-09-08  Nick Drochak  <ndrochak@gol.com>
9746
9747         * driver.cs: Use an object to get the windows codepage since it's not a
9748         static property.
9749
9750 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
9751
9752         * statement.cs (For.Emit): for infinite loops (test == null)
9753         return whether there is a break inside, not always "true".
9754
9755         * namespace.cs (UsingEntry): New struct to hold the name of the
9756         using definition, the location where it is defined, and whether it
9757         has been used in a successful type lookup.
9758
9759         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
9760         strings.
9761
9762         * decl.cs: ditto.
9763
9764 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9765
9766         * attribute.cs : Fix incorrect code which relied on catching
9767         a NullReferenceException to detect a null being passed in
9768         where an object was expected.
9769
9770 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
9771
9772         * statement.cs (Try): flag the catch variable as assigned
9773
9774         * expression.cs (Cast): Simplified by using ResolveType instead of
9775         manually resolving.
9776
9777         * statement.cs (Catch): Fix bug by using ResolveType.
9778
9779 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9780
9781         * expression.cs (BetterConversion): Special case for when we have
9782         a NullLiteral as the argument and we have to choose between string
9783         and object types - we choose string the way csc does.
9784
9785         * attribute.cs (Attribute.Resolve): Catch the
9786         NullReferenceException and report error #182 since the Mono
9787         runtime no more has the bug and having this exception raised means
9788         we tried to select a constructor which takes an object and is
9789         passed a null.
9790
9791 2002-09-05  Ravi Pratap  <ravi@ximian.com>
9792
9793         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
9794         message (1502, 1503) when we can't locate a method after overload
9795         resolution. This is much more informative and closes the bug
9796         Miguel reported.
9797
9798         * interface.cs (PopulateMethod): Return if there are no argument
9799         types. Fixes a NullReferenceException bug.
9800
9801         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9802         expressions too. Previously we were checking only in one place for
9803         positional arguments leaving out named arguments.
9804
9805         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9806         type to the enum type is not allowed. Remove code corresponding to
9807         that.
9808
9809         (ConvertNumericExplicit): Allow explicit conversions from
9810         the underlying type to enum type. This precisely follows the spec
9811         and closes a bug filed by Gonzalo.
9812
9813 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9814
9815         * compiler.csproj:
9816         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9817
9818 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9819
9820         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9821         it was important that we stored the right value after the
9822         reduction in `converted'.
9823
9824 2002-09-04  Martin Baulig  <martin@gnome.org>
9825
9826         * location.cs (Location.SymbolDocument): Use full pathnames for the
9827         source files.
9828
9829 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9830
9831         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9832         of the expression resolve mechanism, because that will catch the
9833         SimpleName error failures.
9834
9835         (Conditional): If we can not resolve the
9836         expression, return, do not crash.
9837
9838 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9839
9840         * cs-tokenizer.cs:
9841         (location): display token name instead of its number.
9842
9843 2002-08-28  Martin Baulig  <martin@gnome.org>
9844
9845         * expression.cs (Binary.ResolveOperator): Don't silently return
9846         but return an error if an operator cannot be applied between two
9847         enum types.
9848
9849 2002-08-28  Martin Baulig  <martin@gnome.org>
9850
9851         * class.cs (Constructor.Define): Set the permission attributes
9852         correctly instead of making all constructors public.
9853
9854 2002-08-28  Martin Baulig  <martin@gnome.org>
9855
9856         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9857         for private members before reporting a CS0103; if we find anything,
9858         it's a CS0122.
9859
9860 2002-08-28  Martin Baulig  <martin@gnome.org>
9861
9862         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9863         to check whether `closure_start_type == closure_invocation_type',
9864         we also need to check whether `m.DeclaringType == closure_invocation_type'
9865         before bypassing the permission checks.  We might be accessing
9866         protected/private members from the base class.
9867         (TypeManager.RealMemberLookup): Only set private_ok if private
9868         members were requested via BindingFlags.NonPublic.
9869
9870         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9871
9872         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9873         MethodGroupExpr.IsExplicitImpl if appropriate.
9874         (Invocation.DoResolve): Don't report the CS0120 for explicit
9875         interface implementations.
9876
9877 2002-08-27  Martin Baulig  <martin@gnome.org>
9878
9879         * expression.cs (Invocation.DoResolve): If this is a static
9880         method and we don't have an InstanceExpression, we must report
9881         a CS0120.
9882
9883 2002-08-25  Martin Baulig  <martin@gnome.org>
9884
9885         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9886         `==' between a valuetype and an object.
9887
9888 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9889
9890         * ecore.cs (TypeExpr): Provide a ToString method.
9891
9892 2002-08-24  Martin Baulig  <martin@gnome.org>
9893
9894         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9895         now called proggie.dbg and it's a binary file.
9896
9897 2002-08-23  Martin Baulig  <martin@gnome.org>
9898
9899         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9900
9901 2002-08-23  Martin Baulig  <martin@gnome.org>
9902
9903         * struct.cs (MyStructInfo.ctor): Make this work with empty
9904         structs; it's not allowed to use foreach() on null.
9905
9906 2002-08-23  Martin Baulig  <martin@gnome.org>
9907
9908         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9909         writer the full pathname of the generated assembly.
9910
9911 2002-08-23  Martin Baulig  <martin@gnome.org>
9912
9913         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9914         A `finally' block never returns or breaks; improved handling of
9915         unreachable code.
9916
9917 2002-08-23  Martin Baulig  <martin@gnome.org>
9918
9919         * statement.cs (Throw.Resolve): Allow `throw null'.
9920
9921 2002-08-23  Martin Baulig  <martin@gnome.org>
9922
9923         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9924         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9925         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9926         MemberLookup would return a wrong event if this is an explicit
9927         interface implementation and the class has an event with the same
9928         name.
9929
9930 2002-08-23  Martin Baulig  <martin@gnome.org>
9931
9932         * statement.cs (Block.AddChildVariableNames): New public method.
9933         (Block.AddChildVariableName): Likewise.
9934         (Block.IsVariableNameUsedInChildBlock): Likewise.
9935         (Block.AddVariable): Check whether a variable name has already
9936         been used in a child block.
9937
9938         * cs-parser.jay (declare_local_variables): Mark all variable names
9939         from the current block as being used in a child block in the
9940         implicit block.
9941
9942 2002-08-23  Martin Baulig  <martin@gnome.org>
9943
9944         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9945         find the symbol writer.
9946
9947         * driver.cs: csc also allows the arguments to /define being
9948         separated by commas, not only by semicolons.
9949
9950 2002-08-23  Martin Baulig  <martin@gnome.org>
9951
9952         * interface.cs (Interface.GetMembers): Added static check for events.
9953
9954 2002-08-15  Martin Baulig  <martin@gnome.org>
9955
9956         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9957         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9958
9959         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9960         why the MethodData.EmitDestructor() change was necessary.
9961
9962 2002-08-20  Martin Baulig  <martin@gnome.org>
9963
9964         * class.cs (TypeContainer.FindMembers): Added static check for events.
9965
9966         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9967
9968         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9969         use Type.GetEvents(), not Type.FindMembers().
9970
9971 2002-08-20  Martin Baulig  <martin@gnome.org>
9972
9973         * decl.cs (MemberCache): Added a special method cache which will
9974         be used for method-only searched.  This ensures that a method
9975         search will return a MethodInfo with the correct ReflectedType for
9976         inherited methods.      
9977
9978 2002-08-20  Martin Baulig  <martin@gnome.org>
9979
9980         * decl.cs (DeclSpace.FindMembers): Made this public.
9981
9982 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9983
9984         * delegate.cs: fixed build on windows.
9985         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9986
9987 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9988
9989         * ecore.cs (StandardConversionExists): Return a false
9990         if we are trying to convert the void type to anything else
9991         since that is not allowed.
9992
9993         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9994         we flag error 70 in the event an event is trying to be accessed
9995         directly from outside the declaring type.
9996
9997 2002-08-20  Martin Baulig  <martin@gnome.org>
9998
9999         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
10000         MemberCache from typemanager.cs to decl.cs.
10001
10002 2002-08-19  Martin Baulig  <martin@gnome.org>
10003
10004         * class.cs (TypeContainer): Implement IMemberContainer.
10005         (TypeContainer.DefineMembers): Create the MemberCache.
10006         (TypeContainer.FindMembers): Do better BindingFlags checking; only
10007         return public members if BindingFlags.Public was given, check
10008         whether members are static.
10009
10010 2002-08-16  Martin Baulig  <martin@gnome.org>
10011
10012         * decl.cs (DeclSpace.Define): Splitted this in Define and
10013         DefineMembers.  DefineMembers is called first and initializes the
10014         MemberCache.
10015
10016         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
10017         DefineMembers() on all our DeclSpaces.
10018
10019         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
10020         but call DefineMembers() on all nested interfaces.  We call their
10021         Define() in our new Define() function.
10022
10023         * interface.cs (Interface): Implement IMemberContainer.
10024         (Interface.Define): Moved all code except the attribute stuf to
10025         DefineMembers().
10026         (Interface.DefineMembers): Initialize the member cache.
10027
10028         * typemanager.cs (IMemberFinder): Removed this interface, we don't
10029         need this anymore since we can use MemberCache.FindMembers directly.
10030
10031 2002-08-19  Martin Baulig  <martin@gnome.org>
10032
10033         * typemanager.cs (MemberCache): When creating the cache for an
10034         interface type, add all inherited members.
10035         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
10036         to `out bool used_cache' and documented it.
10037         (TypeManager.MemberLookup): If we already used the cache in the first
10038         iteration, we don't need to do the interfaces check.
10039
10040 2002-08-19  Martin Baulig  <martin@gnome.org>
10041
10042         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
10043         here from IMemberFinder and don't implement this interface anymore.
10044         (DeclSpace.MemberCache): Moved here from IMemberFinder.
10045
10046         * typemanager.cs (IMemberFinder): This interface is now only used by
10047         classes which actually support the member cache.
10048         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
10049         since we only put DeclSpaces into this Hashtable.
10050         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
10051         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
10052
10053 2002-08-16  Martin Baulig  <martin@gnome.org>
10054
10055         * typemanager.cs (ICachingMemberFinder): Removed.
10056         (IMemberFinder.MemberCache): New property.
10057         (TypeManager.FindMembers): Merged this with RealFindMembers().
10058         This function will never be called from TypeManager.MemberLookup()
10059         so we can't use the cache here, just the IMemberFinder.
10060         (TypeManager.MemberLookup_FindMembers): Check whether the
10061         IMemberFinder has a MemberCache and call the cache's FindMembers
10062         function.
10063         (MemberCache): Rewrote larger parts of this yet another time and
10064         cleaned it up a bit.
10065
10066 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
10067
10068         * driver.cs (LoadArgs): Support quoting.
10069
10070         (Usage): Show the CSC-like command line arguments.
10071
10072         Improved a few error messages.
10073
10074 2002-08-15  Martin Baulig  <martin@gnome.org>
10075
10076         * typemanager.cs (IMemberContainer.Type): New property.
10077         (IMemberContainer.IsInterface): New property.
10078
10079         The following changes are conditional to BROKEN_RUNTIME, which is
10080         defined at the top of the file.
10081
10082         * typemanager.cs (MemberCache.MemberCache): Don't add the base
10083         class'es members, but add all members from TypeHandle.ObjectType
10084         if we're an interface.
10085         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
10086         is the current type.
10087         (MemberCache.CacheEntry.Container): Removed this field.
10088         (TypeHandle.GetMembers): Include inherited members.
10089
10090 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10091
10092         * typemanager.cs: fixed compilation and added a comment on a field that
10093         is never used.
10094
10095 2002-08-15  Martin Baulig  <martin@gnome.org>
10096
10097         * class.cs (ConstructorInitializer.Resolve): In the
10098         Expression.MemberLookup call, use the queried_type as
10099         invocation_type.
10100
10101         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
10102         declared' attribute, it's always true.
10103         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
10104         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
10105         temporary wrapper for FindMembers which tells MemberLookup whether
10106         members from the base classes are included in the return value.
10107         This will go away soon.
10108         (TypeManager.MemberLookup): Use this temporary hack here; once the
10109         new MemberCache is completed, we don't need to do the DeclaredOnly
10110         looping here anymore since the MemberCache will take care of this.
10111         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
10112         (MemberCache): When creating the MemberCache for a class, get
10113         members from the current class and all its base classes.
10114         (MemberCache.CacheEntry.Container): New field.  This is a
10115         temporary hack until the Mono runtime is fixed to distinguish
10116         between ReflectedType and DeclaringType.  It allows us to use MCS
10117         with both the MS runtime and the unfixed Mono runtime without
10118         problems and without accecting performance.
10119         (MemberCache.SearchMembers): The DeclaredOnly looping from
10120         TypeManager.MemberLookup is now done here.      
10121
10122 2002-08-14  Martin Baulig  <martin@gnome.org>
10123
10124         * statement.cs (MyStructInfo.MyStructInfo): Don't call
10125         Type.GetFields on dynamic types but get the fields from the
10126         corresponding TypeContainer.
10127         (MyStructInfo.GetStructInfo): Added check for enum types.
10128
10129         * typemanager.cs (MemberList.IsSynchronized): Implemented.
10130         (MemberList.SyncRoot): Implemented.
10131         (TypeManager.FilterWithClosure): No need to check permissions if
10132         closure_start_type == closure_invocation_type, don't crash if
10133         closure_invocation_type is null.
10134
10135 2002-08-13  Martin Baulig  <martin@gnome.org>
10136
10137         Rewrote TypeContainer.FindMembers to use a member cache.  This
10138         gives us a speed increase of about 35% for the self-hosting MCS
10139         build and of about 15-20% for the class libs (both on GNU/Linux).
10140
10141         * report.cs (Timer): New class to get enhanced profiling.  This
10142         whole class is "TIMER" conditional since it remarkably slows down
10143         compilation speed.
10144
10145         * class.cs (MemberList): New class.  This is an IList wrapper
10146         which we're now using instead of passing MemberInfo[]'s around to
10147         avoid copying this array unnecessarily.
10148         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
10149         (ICachingMemberFinder, IMemberContainer): New interface.
10150         (TypeManager.FilterWithClosure): If `criteria' is null, the name
10151         has already been checked, otherwise use it for the name comparision.
10152         (TypeManager.FindMembers): Renamed to RealMemberFinder and
10153         provided wrapper which tries to use ICachingMemberFinder.FindMembers
10154         if possible.  Returns a MemberList, not a MemberInfo [].
10155         (TypeHandle): New class, implements IMemberContainer.  We create
10156         one instance of this class per type, it contains a MemberCache
10157         which is used to do the member lookups.
10158         (MemberCache): New class.  Each instance of this class contains
10159         all members of a type and a name-based hash table.
10160         (MemberCache.FindMembers): This is our new member lookup
10161         function.  First, it looks up all members of the requested name in
10162         the hash table.  Then, it walks this list and sorts out all
10163         applicable members and returns them.
10164
10165 2002-08-13  Martin Baulig  <martin@gnome.org>
10166
10167         In addition to a nice code cleanup, this gives us a performance
10168         increase of about 1.4% on GNU/Linux - not much, but it's already
10169         half a second for the self-hosting MCS compilation.
10170
10171         * typemanager.cs (IMemberFinder): New interface.  It is used by
10172         TypeManager.FindMembers to call FindMembers on a TypeContainer,
10173         Enum, Delegate or Interface.
10174         (TypeManager.finder_to_member_finder): New PtrHashtable.
10175         (TypeManager.finder_to_container): Removed.
10176         (TypeManager.finder_to_delegate): Removed.
10177         (TypeManager.finder_to_interface): Removed.
10178         (TypeManager.finder_to_enum): Removed.
10179
10180         * interface.cs (Interface): Implement IMemberFinder.
10181
10182         * delegate.cs (Delegate): Implement IMemberFinder.
10183
10184         * enum.cs (Enum): Implement IMemberFinder.
10185
10186         * class.cs (TypeContainer): Implement IMemberFinder.
10187
10188 2002-08-12  Martin Baulig  <martin@gnome.org>
10189
10190         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
10191
10192 2002-08-12  Martin Baulig  <martin@gnome.org>
10193
10194         * ecore.cs (ITypeExpression): New interface for expressions which
10195         resolve to a type.
10196         (TypeExpression): Renamed to TypeLookupExpression.
10197         (Expression.DoResolve): If we're doing a types-only lookup, the
10198         expression must implement the ITypeExpression interface and we
10199         call DoResolveType() on it.
10200         (SimpleName): Implement the new ITypeExpression interface.
10201         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
10202         hack, the situation that we're only looking up types can't happen
10203         anymore when this method is called.  Moved the type lookup code to
10204         DoResolveType() and call it.
10205         (SimpleName.DoResolveType): This ITypeExpression interface method
10206         is now doing the types-only lookup.
10207         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
10208         (ResolveFlags): Added MaskExprClass.
10209
10210         * expression.cs (MemberAccess): Implement the ITypeExpression
10211         interface.
10212         (MemberAccess.DoResolve): Added support for a types-only lookup
10213         when we're called via ITypeExpression.DoResolveType().
10214         (ComposedCast): Implement the ITypeExpression interface.
10215
10216         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
10217         Expression.Resolve() with ResolveFlags.Type instead.
10218
10219 2002-08-12  Martin Baulig  <martin@gnome.org>
10220
10221         * interface.cs (Interface.Define): Apply attributes.
10222
10223         * attribute.cs (Attribute.ApplyAttributes): Added support for
10224         interface attributes.
10225
10226 2002-08-11  Martin Baulig  <martin@gnome.org>
10227
10228         * statement.cs (Block.Emit): Only check the "this" variable if we
10229         do not always throw an exception.
10230
10231         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
10232         whether the property has a set accessor.
10233
10234 2002-08-11  Martin Baulig  <martin@gnome.org>
10235
10236         Added control flow analysis support for structs.
10237
10238         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
10239         with control flow analysis turned off.
10240         (IVariable): New interface.
10241         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
10242         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
10243         (FieldExpr.DoResolve): Resolve the instance expression with flow
10244         analysis turned off and do the definite assignment check after the
10245         resolving when we know what the expression will resolve to.
10246
10247         * expression.cs (LocalVariableReference, ParameterReference):
10248         Implement the new IVariable interface, only call the flow analysis
10249         code if ec.DoFlowAnalysis is true.
10250         (This): Added constructor which takes a Block argument.  Implement
10251         the new IVariable interface.
10252         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
10253         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
10254         This does the definite assignment checks for struct members.
10255
10256         * class.cs (Constructor.Emit): If this is a non-static `struct'
10257         constructor which doesn't have any initializer, call
10258         Block.AddThisVariable() to tell the flow analysis code that all
10259         struct elements must be initialized before control returns from
10260         the constructor.
10261
10262         * statement.cs (MyStructInfo): New public class.
10263         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
10264         argument to this indexer.  If non-zero, check an individual struct
10265         member, not the whole struct.
10266         (FlowBranching.CheckOutParameters): Check struct members.
10267         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
10268         overloaded versions of these methods which take an additional
10269         `int field_idx' argument to check struct members.
10270         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
10271         overloaded versions of these methods which take an additional
10272         `string field_name' argument to check struct member.s
10273         (VariableInfo): Implement the IVariable interface.
10274         (VariableInfo.StructInfo): New public property.  Returns the
10275         MyStructInfo instance of the variable if it's a struct or null.
10276         (Block.AddThisVariable): New public method.  This is called from
10277         Constructor.Emit() for non-static `struct' constructor which do
10278         not have any initializer.  It creates a special variable for the
10279         "this" instance variable which will be checked by the flow
10280         analysis code to ensure that all of the struct's fields are
10281         initialized before control returns from the constructor.
10282         (UsageVector): Added support for struct members.  If a
10283         variable/parameter is a struct with N members, we reserve a slot
10284         in the usage vector for each member.  A struct is considered fully
10285         initialized if either the struct itself (slot 0) or all its
10286         members are initialized.
10287
10288 2002-08-08  Martin Baulig  <martin@gnome.org>
10289
10290         * driver.cs (Driver.MainDriver): Only report an error CS5001
10291         if there were no compilation errors.
10292
10293         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
10294         `UnsafeContext' property to determine whether the parent is in
10295         unsafe context rather than checking the parent's ModFlags:
10296         classes nested in an unsafe class are unsafe as well.
10297
10298 2002-08-08  Martin Baulig  <martin@gnome.org>
10299
10300         * statement.cs (UsageVector.MergeChildren): Distinguish between
10301         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
10302         we return.  Added test17() and test18() to test-154.cs.
10303
10304 2002-08-08  Martin Baulig  <martin@gnome.org>
10305
10306         * typemanager.cs (TypeManager.FilterWithClosure): If we have
10307         Family access, make sure the invoking type isn't a subclass of the
10308         queried type (that'd be a CS1540).
10309
10310         * ecore.cs (Expression.MemberLookup): Added overloaded version of
10311         this method which takes an additional `Type invocation_type'.
10312
10313         * expression.cs (BaseAccess.DoResolve): Use the base type as
10314         invocation and query type.
10315         (MemberAccess.DoResolve): If the lookup failed and we're about to
10316         report a CS0122, try a lookup with the ec.ContainerType - if this
10317         succeeds, we must report a CS1540.
10318
10319 2002-08-08  Martin Baulig  <martin@gnome.org>
10320
10321         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
10322         (MethodGroupExpr): Implement the IMemberExpr interface.
10323
10324         * expression (MemberAccess.ResolveMemberAccess): No need to have
10325         any special code for MethodGroupExprs anymore, they're now
10326         IMemberExprs.   
10327
10328 2002-08-08  Martin Baulig  <martin@gnome.org>
10329
10330         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
10331         Family, FamANDAssem and FamORAssem permissions.
10332         (TypeManager.IsSubclassOrNestedChildOf): New public method.
10333
10334 2002-08-08  Martin Baulig  <martin@gnome.org>
10335
10336         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
10337         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
10338         or loop block.
10339
10340 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
10341
10342         * driver.cs: implemented /resource option to embed managed resources.
10343
10344 2002-08-07  Martin Baulig  <martin@gnome.org>
10345
10346         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
10347         (FieldBase.HasFieldInitializer): New public property.
10348         (FieldBase.GetInitializerExpression): New public method.  Resolves and
10349         returns the field initializer and makes sure it is only resolved once.
10350         (TypeContainer.EmitFieldInitializers): Call
10351         FieldBase.GetInitializerExpression to get the initializer, this ensures
10352         that it isn't resolved multiple times.
10353
10354         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
10355         the resolving process (SimpleName/MemberLookup) that we're currently
10356         emitting a field initializer (which must not access any instance members,
10357         this is an error CS0236).
10358
10359         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
10360         argument, if the `IsFieldInitializer' flag is set, we must report and
10361         error CS0236 and not an error CS0120.   
10362
10363 2002-08-07  Martin Baulig  <martin@gnome.org>
10364
10365         * ecore.cs (IMemberExpr): New public interface.
10366         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
10367         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
10368         if the expression is an IMemberExpr.
10369
10370         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
10371         to be null, implicitly default to `this' if we're non-static in
10372         this case.  Simplified the code a lot by using the new IMemberExpr
10373         interface.  Also fixed bug #28176 here.
10374
10375 2002-08-06  Martin Baulig  <martin@gnome.org>
10376
10377         * cs-parser.jay (SimpleLookup): Removed.  We need to create
10378         ParameterReferences during semantic analysis so that we can do a
10379         type-only search when resolving Cast, TypeOf and SizeOf.
10380         (block): Pass the `current_local_parameters' to the Block's
10381         constructor.
10382
10383         * class.cs (ConstructorInitializer): Added `Parameters parameters'
10384         argument to the constructor.
10385         (ConstructorInitializer.Resolve): Create a temporary implicit
10386         block with the parameters.
10387
10388         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
10389         references here if we aren't doing a type-only search.
10390
10391         * statement.cs (Block): Added constructor which takes a
10392         `Parameters parameters' argument.
10393         (Block.Parameters): New public property.
10394
10395         * support.cs (InternalParameters.Parameters): Renamed `parameters'
10396         to `Parameters' and made it public readonly.
10397
10398 2002-08-06  Martin Baulig  <martin@gnome.org>
10399
10400         * ecore.cs (Expression.Warning): Made this public as well.
10401
10402         * report.cs (Report.Debug): Print the contents of collections.
10403
10404 2002-08-06  Martin Baulig  <martin@gnome.org>
10405
10406         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
10407         used to tell Resolve() which kinds of expressions it may return.
10408         (Expression.Resolve): Added overloaded version of this method which
10409         takes a `ResolveFlags flags' argument.  This can be used to tell
10410         Resolve() which kinds of expressions it may return.  Reports a
10411         CS0118 on error.
10412         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
10413         ResolveFlags.SimpleName.
10414         (Expression.Error118): Added overloaded version of this method which
10415         takes a `ResolveFlags flags' argument.  It uses the flags to determine
10416         which kinds of expressions are allowed.
10417
10418         * expression.cs (Argument.ResolveMethodGroup): New public method.
10419         Resolves an argument, but allows a MethodGroup to be returned.
10420         This is used when invoking a delegate.
10421
10422         * TODO: Updated a bit.
10423
10424 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10425
10426         Fixed compilation with csc.
10427
10428         * ecore.cs: Expression.Error made public. Is this correct? Should
10429         Warning be made public too?
10430
10431         * expression.cs: use ea.Location instead of ea.loc.
10432         [FIXME:  Filed as bug #28607: MCS must report these errors.]
10433
10434 2002-08-06  Martin Baulig  <martin@gnome.org>
10435
10436         * ecore.cs (Expression.loc): Moved the location here instead of
10437         duplicating it in all derived classes.
10438         (Expression.Location): New public property.
10439         (Expression.Error, Expression.Warning): Made them non-static and
10440         removed the location argument.
10441         (Expression.Warning): Added overloaded version which takes an
10442         `int level' argument.
10443         (Expression.Error118): Make this non-static and removed the
10444         expression and location arguments.
10445         (TypeExpr): Added location argument to the constructor.
10446
10447         * expression.cs (StaticCallExpr): Added location argument to
10448         the constructor.
10449         (Indirection, PointerArithmetic): Likewise.
10450         (CheckedExpr, UnCheckedExpr): Likewise.
10451         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
10452         (StringPtr): Likewise.
10453
10454
10455 2002-08-05  Martin Baulig  <martin@gnome.org>
10456
10457         * expression.cs (BaseAccess.DoResolve): Actually report errors.
10458
10459         * assign.cs (Assign.DoResolve): Check whether the source
10460         expression is a value or variable.
10461
10462         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
10463         while resolving the corresponding blocks.
10464
10465         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
10466         an error, don't silently return null.
10467
10468         * statement.cs (Block.AddVariable): Do the error reporting here
10469         and distinguish between CS0128 and CS0136.
10470         (Block.DoResolve): Report all unused labels (warning CS0164).
10471         (LabeledStatement): Pass the location to the constructor.
10472         (LabeledStatement.HasBeenReferenced): New property.
10473         (LabeledStatement.Resolve): Set it to true here.
10474
10475         * statement.cs (Return.Emit): Return success even after reporting
10476         a type mismatch error (CS0126 or CS0127), this is what csc does and
10477         it avoids confusing the users with any consecutive errors.
10478
10479 2002-08-05  Martin Baulig  <martin@gnome.org>
10480
10481         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
10482
10483         * const.cs (Const.LookupConstantValue): Catch circular definitions.
10484
10485         * expression.cs (MemberAccess.DoResolve): Silently return if an
10486         error has already been reported.
10487
10488         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
10489         error has already been reported.
10490
10491 2002-08-05  Martin Baulig  <martin@gnome.org>
10492
10493         * statement.cs (UsageVector): Only initialize the `parameters'
10494         vector if we actually have any "out" parameters.
10495
10496 2002-08-05  Martin Baulig  <martin@gnome.org>
10497
10498         * expression.cs (Binary.ResolveOperator): When combining delegates,
10499         they must have the same type.
10500
10501 2002-08-05  Martin Baulig  <martin@gnome.org>
10502
10503         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
10504         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
10505         work with the ms runtime and we also don't need it: if we're a
10506         PropertyBuilder and not in the `indexer_arguments' hash, then we
10507         are a property and not an indexer.
10508
10509         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
10510         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
10511         since the latter one doesn't work with the ms runtime.
10512
10513 2002-08-03  Martin Baulig  <martin@gnome.org>
10514
10515         Fixed bugs #27998 and #22735.
10516
10517         * class.cs (Method.IsOperator): New public field.
10518         (Method.CheckBase): Report CS0111 if there's already a method
10519         with the same parameters in the current class.  Report CS0508 when
10520         attempting to change the return type of an inherited method.
10521         (MethodData.Emit): Report CS0179 if a method doesn't have a body
10522         and it's not marked abstract or extern.
10523         (PropertyBase): New abstract base class for Property and Indexer.
10524         (PropertyBase.CheckBase): Moved here from Property and made it work
10525         for indexers.
10526         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
10527         the same so we can reuse it there.
10528         (Property, Indexer): Derive from PropertyBase.
10529         (MethodSignature.inheritable_property_signature_filter): New delegate
10530         to find properties and indexers.
10531
10532         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
10533         argument and improved error reporting.
10534
10535         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
10536         EmptyReadOnlyParameters and made it a property.
10537
10538         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
10539         version of this method which takes a `PropertyInfo indexer'.
10540         (TypeManager.RegisterIndexer): New method.
10541
10542         * class.cs: Added myself as author of this file :-)
10543
10544 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10545
10546         * class.cs: fixed compilation on windoze.
10547
10548 2002-08-03  Martin Baulig  <martin@gnome.org>
10549
10550         * interface.cs (Interface.GetInterfaceBases): Check whether all
10551         base interfaces are at least as accessible than the current one.
10552
10553         * class.cs (TypeContainer.GetClassBases): Check whether base types
10554         are at least as accessible than the current type.
10555         (TypeContainer.AsAccessible): Implemented and made non-static.
10556         (MemberBase.CheckParameters): Report errors if the accessibility
10557         checks fail.
10558
10559         * delegate.cs (Delegate.Delegate): The default visibility is
10560         internal for top-level types and private for nested types.
10561         (Delegate.Define): Report errors if the accessibility checks fail.
10562
10563         * enum.cs (Enum.Enum): The default visibility is internal for
10564         top-level types and private for nested types.
10565         (Enum.DefineType): Compute the correct visibility.
10566
10567         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
10568         function which takes a `bool is_toplevel' instead of a TypeContainer.
10569
10570         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
10571         builtin type.
10572
10573 2002-08-02  Martin Baulig  <martin@gnome.org>
10574
10575         * expression.cs (LocalVariableReferenc): Added constructor which
10576         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
10577         (LocalVariableReference.IsReadOnly): New property.
10578         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
10579         variable is readonly, use our own readonly flag to do this; you can
10580         use the new constructor to get a writable reference to a read-only
10581         variable.
10582
10583         * cs-parser.jay (foreach_statement, using_statement): Get a writable
10584         reference to the local variable.
10585
10586 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
10587
10588         * rootcontext.cs (ResolveCore): Also include System.Exception
10589
10590         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
10591         we reach an EmptyStatement.
10592
10593         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
10594         is also fine.
10595
10596         * expression.cs (Binary.ResolveOperator): Check error result in
10597         two places.
10598
10599         use brtrue/brfalse directly and avoid compares to null.
10600
10601 2002-08-02  Martin Baulig  <martin@gnome.org>
10602
10603         * class.cs (TypeContainer.Define): Define all nested interfaces here.
10604         Fixes bug #28407, added test-155.cs.
10605
10606 2002-08-01  Martin Baulig  <martin@gnome.org>
10607
10608         * class.cs (Event.EmitDefaultMethod): Make this work with static
10609         events.  Fixes #28311, added verify-3.cs.
10610
10611 2002-08-01  Martin Baulig  <martin@gnome.org>
10612
10613         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
10614         `is_disposable' fields.
10615         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
10616         `hm.is_disposable' if we're using the collection pattern.
10617         (Foreach.EmitCollectionForeach): Use the correct type for the
10618         enumerator's local variable, only emit the try/finally block if
10619         necessary (fixes #27713).
10620
10621 2002-08-01  Martin Baulig  <martin@gnome.org>
10622
10623         * ecore.cs (Expression.report118): Renamed to Error118 and made
10624         it public static.
10625
10626         * statement.cs (Throw.Resolve): Check whether the expression is of
10627         the correct type (CS0118) and whether the type derives from
10628         System.Exception (CS0155).
10629         (Catch.Resolve): New method.  Do the type lookup here and check
10630         whether it derives from System.Exception (CS0155).
10631         (Catch.CatchType, Catch.IsGeneral): New public properties.
10632
10633         * typemanager.cs (TypeManager.exception_type): Added.
10634
10635 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
10636
10637         * driver.cs: Updated About function.
10638
10639 2002-07-31  Martin Baulig  <martin@gnome.org>
10640
10641         Implemented Control Flow Analysis.
10642
10643         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
10644         (EmitContext.CurrentBranching): Added.
10645         (EmitContext.StartFlowBranching): Added.
10646         (EmitContext.EndFlowBranching): Added.
10647         (EmitContext.KillFlowBranching): Added.
10648         (EmitContext.IsVariableAssigned): Added.
10649         (EmitContext.SetVariableAssigned): Added.
10650         (EmitContext.IsParameterAssigned): Added.
10651         (EmitContext.SetParameterAssigned): Added.
10652         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
10653         Added control flow analysis stuff here.
10654
10655         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
10656         resolve the expression as lvalue.
10657         (LocalVariableReference.DoResolve): Check whether the variable has
10658         already been assigned.
10659         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
10660         the parameter as assigned here.
10661         (ParameterReference.DoResolve): Check whether the parameter has already
10662         been assigned.
10663         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
10664         expression as lvalue.
10665
10666         * statement.cs (FlowBranching): New class for the flow analysis code.
10667         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
10668         (LabeledStatement.IsDefined): New public property.
10669         (LabeledStatement.AddUsageVector): New public method to tell flow
10670         analyis that the label may be reached via a forward jump.
10671         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
10672         flow analysis.
10673         (VariableInfo.Number): New public field.  This is used by flow analysis
10674         to number all locals of a block.
10675         (Block.CountVariables): New public property.  This is the number of
10676         local variables in this block (including the locals from all parent
10677         blocks).
10678         (Block.EmitMeta): Number all the variables.
10679
10680         * statement.cs: Added flow analysis support to all classes.
10681
10682 2002-07-31  Martin Baulig  <martin@gnome.org>
10683
10684         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
10685         To get debugging messages, compile mcs with /define:MCS_DEBUG and
10686         then use this argument.
10687
10688         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
10689
10690         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
10691         use this to specify /define options.
10692
10693 2002-07-29  Martin Baulig  <martin@gnome.org>
10694
10695         * statement.cs (Fixed): Moved all code that does variable lookups
10696         and resolvings from Emit to Resolve.
10697
10698         * statement.cs (For): Moved all code that does variable lookups
10699         and resolvings from Emit to Resolve.
10700
10701         * statement.cs (Using): Moved all code that does variable lookups
10702         and resolvings from Emit to Resolve.
10703
10704 2002-07-29  Martin Baulig  <martin@gnome.org>
10705
10706         * attribute.cs (Attribute.Resolve): Explicitly catch a
10707         System.NullReferenceException when creating the
10708         CustromAttributeBuilder and report a different warning message.
10709
10710 2002-07-29  Martin Baulig  <martin@gnome.org>
10711
10712         * support.cs (ParameterData.ParameterName): Added method to
10713         get the name of a parameter.
10714
10715         * typemanager.cs (TypeManager.IsValueType): New public method.
10716
10717 2002-07-29  Martin Baulig  <martin@gnome.org>
10718
10719         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
10720         is a flag which specifies that it's either ref or out.
10721         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
10722         the out parameter to `out Parameter.Modifier mod', also set the
10723         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
10724
10725         * support.cs (InternalParameters.ParameterModifier): Distinguish
10726         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10727         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10728
10729         * expression.cs (Argument.GetParameterModifier): Distinguish
10730         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10731         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10732
10733 2002-07-29  Martin Baulig  <martin@gnome.org>
10734
10735         * expression.cs (ParameterReference.ParameterReference): Added
10736         `Location loc' argument to the constructor.
10737
10738         * cs-parser.jay: Pass location to ParameterReference.
10739
10740 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
10741
10742         * statement.cs (Try): Initialize the location.
10743
10744         * cs-parser.jay: pass location to Try.
10745
10746         * expression.cs (Unary.Reduce): Change the prototype to return
10747         whether a constant fold could be performed or not.  The result is
10748         returned in an out parameters.  In the case of Indirection and
10749         AddressOf, we want to perform the full tests.
10750
10751 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
10752
10753         * statement.cs (Statement.Emit): Flag dead code.
10754
10755 2002-07-27  Andrew Birkett  <andy@nobugs.org>
10756
10757         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
10758
10759 2002-07-27  Martin Baulig  <martin@gnome.org>
10760
10761         * class.cs (MethodData.Define): Put back call to
10762         TypeManager.AddMethod(), accidentally commented this out.
10763
10764         * report.cs (Debug): New public method to print debugging information,
10765         this is `[Conditional ("DEBUG")]'.
10766
10767 2002-07-26  Martin Baulig  <martin@gnome.org>
10768
10769         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
10770         (switch_statement): Push the current_block to the switch_stack and
10771         pop it again when we're done with the switch.
10772         (switch_section): The new block is a child of the current_block.
10773         Fixes bug #24007, added test-152.cs.
10774
10775 2002-07-27  Martin Baulig  <martin@gnome.org>
10776
10777         * expression.cs (Invocation.EmitArguments): When calling a varargs
10778         function with only its fixed arguments, we need to pass an empty
10779         array.
10780
10781 2002-07-27  Martin Baulig  <martin@gnome.org>
10782
10783         Mono 0.13 has been released.
10784
10785 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
10786
10787         * driver.cs: Rename --resource to --linkres, because that is what
10788         we do currently, we dont support --resource yet.
10789
10790         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
10791
10792 2002-07-25  Martin Baulig  <martin@gnome.org>
10793
10794         * class.cs (MethodData): New public class.  This is a `method builder'
10795         class for a method or one accessor of a Property/Indexer/Event.
10796         (MethodData.GetMethodFlags): Moved here from MemberBase.
10797         (MethodData.ApplyAttributes): Likewise.
10798         (MethodData.ApplyObsoleteAttribute): Likewise.
10799         (MethodData.ApplyConditionalAttribute): Likewise.
10800         (MethodData.ApplyDllImportAttribute): Likewise.
10801         (MethodData.CheckAbstractAndExternal): Likewise.
10802         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10803         (MethodData.Emit): Formerly known as Method.Emit().
10804         (MemberBase): Moved everything which was specific to a single
10805         accessor/method to MethodData.
10806         (Method): Create a new MethodData and call Define() and Emit() on it.
10807         (Property, Indexer, Event): Create a new MethodData objects for each
10808         accessor and call Define() and Emit() on them.
10809
10810 2002-07-25  Martin Baulig  <martin@gnome.org>
10811
10812         Made MethodCore derive from MemberBase to reuse the code from there.
10813         MemberBase now also checks for attributes.
10814
10815         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10816         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10817         as virtual.
10818         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10819         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10820         (MemberBase.ApplyAttributes): New virtual method; applies the
10821         attributes to a method or accessor.
10822         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10823         (MemberBase.ApplyConditionalAttribute): Likewise.
10824         (MemberBase.ApplyDllImportAttribute): Likewise.
10825         (MemberBase.CheckAbstractAndExternal): Likewise.
10826         (MethodCore.ParameterTypes): This is now a property instead of a
10827         method, it's initialized from DoDefineParameters().
10828         (MethodCore.ParameterInfo): Removed the set accessor.
10829         (MethodCore.DoDefineParameters): New protected virtual method to
10830         initialize ParameterTypes and ParameterInfo.
10831         (Method.GetReturnType): We can now simply return the MemberType.
10832         (Method.GetMethodFlags): Override the MemberBase version and add
10833         the conditional flags.
10834         (Method.CheckBase): Moved some code from Define() here, call
10835         DoDefineParameters() here.
10836         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10837         here to avoid some larger code duplication.
10838         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10839         ensure that abstract and external accessors don't declare a body.
10840
10841         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10842         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10843         lookup in the attribute's parent classes, so we need to abort as soon
10844         as we found the first match.
10845         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10846         the attribute has no arguments.
10847
10848         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10849         of a Method.
10850
10851 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10852
10853         * cs-parser.jay: reverted previous patch.
10854
10855 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10856
10857         * cs-parser.jay: fixed bug #22119.
10858
10859 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10860
10861         * attribute.cs: fixed compilation. The error was:
10862         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10863         be assigned to before control leaves the current method."
10864         [FIXME:  Filed as bug #28186: MCS must report this error.]
10865
10866 2002-07-25  Martin Baulig  <martin@gnome.org>
10867
10868         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10869         method to pull the condition name ouf of a Conditional attribute.
10870         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10871         the obsolete message and error flag out of an Obsolete attribute.
10872
10873         * class.cs (Method.GetMethodFlags): New public method to get the
10874         TypeManager.MethodFlags for this method.
10875         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10876         private methods.
10877         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10878         if we're overriding a virtual function, set the new private variable
10879         `parent_method'; call the new TypeManager.AddMethod().
10880
10881         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10882         the MethodBuilder and the Method in a PtrHashtable.
10883         (TypeManager.builder_to_method): Added for this purpose.
10884         (TypeManager.MethodFlags): Added IsObsoleteError.
10885         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10886         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10887         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10888         the message from the attribute.
10889
10890 2002-07-24  Martin Baulig  <martin@gnome.org>
10891
10892         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10893         preprocessor directives, ensure that the argument to #define/#undef is
10894         exactly one identifier and that it's actually an identifier.
10895
10896         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10897         did not work ....
10898
10899 2002-07-24  Martin Baulig  <martin@gnome.org>
10900
10901         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10902         initialize it to TypeManager.object_type in the constructor.
10903         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10904         of the `hm.get_current' method if we're using the collection pattern.
10905         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10906         for the explicit conversion to make it work when we're using the collection
10907         pattern and the `Current' property has a different return type than `object'.
10908         Fixes #27713.
10909
10910 2002-07-24  Martin Baulig  <martin@gnome.org>
10911
10912         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10913         does not match, but don't report any errors.  This method is called in
10914         order for all methods in a MethodGroupExpr until a matching method is
10915         found, so we don't want to bail out if the first method doesn't match.
10916         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10917         matches, report the 123.  Fixes #28070.
10918
10919 2002-07-24  Martin Baulig  <martin@gnome.org>
10920
10921         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10922         TypeManager.TypeToCoreType() to the top of the method so the
10923         following equality checks will work.  Fixes #28107.
10924
10925 2002-07-24  Martin Baulig  <martin@gnome.org>
10926
10927         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10928         operand is of type uint, and the other operand is of type sbyte,
10929         short or int, the operands are converted to type long." -
10930         Actually do what this comment already told us.  Fixes bug #28106,
10931         added test-150.cs.
10932
10933 2002-07-24  Martin Baulig  <martin@gnome.org>
10934
10935         * class.cs (MethodBase): New abstract class.  This is now a base
10936         class for Property, Indexer and Event to avoid some code duplication
10937         in their Define() and DefineMethods() methods.
10938         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10939         generic methods for Define() and DefineMethods().
10940         (FieldBase): Derive from MemberBase, not MemberCore.
10941         (Property): Derive from MemberBase, not MemberCore.
10942         (Property.DefineMethod): Moved all the code from this method to the
10943         new MethodBase.DefineAccessor(), just call it with appropriate
10944         argumetnts.
10945         (Property.Define): Call the new Property.DoDefine(), this does some
10946         sanity checks and we don't need to duplicate the code everywhere.
10947         (Event): Derive from MemberBase, not MemberCore.
10948         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10949         accessors, this will also make them work with interface events.
10950         (Indexer): Derive from MemberBase, not MemberCore.
10951         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10952         (Indexer.Define): Use the new MethodBase functions.
10953
10954         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10955         argument to the constructor.
10956         (Interface.FindMembers): Added support for interface events.
10957         (Interface.PopluateEvent): Implemented.
10958
10959         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10960
10961 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10962
10963         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10964         but this is required to check for a method name being the same as
10965         the containing class.  
10966
10967         Handle this now.
10968
10969 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10970
10971         * interface.cs: initialize variable.
10972
10973 2002-07-23  Martin Baulig  <martin@gnome.org>
10974
10975         Implemented the IndexerName attribute in interfaces.
10976
10977         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10978         name if this is an explicit interface implementation.
10979         (Indexer.InterfaceIndexerName): New public variable.  If we're
10980         implementing an interface indexer, this is the IndexerName in that
10981         interface.  Otherwise, it's the IndexerName.
10982         (Indexer.DefineMethod): If we're implementing interface indexer,
10983         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10984         and Pending.ImplementIndexer methods.
10985         (Indexer.Define): Also define the PropertyBuilder if we're
10986         implementing an interface indexer and this is neither an explicit
10987         interface implementation nor do the IndexerName match the one in
10988         the interface.
10989
10990         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10991         If a method is defined here, then we always need to create a proxy
10992         for it.  This is used when implementing interface indexers.
10993         (Pending.IsInterfaceIndexer): New public method.
10994         (Pending.ImplementIndexer): New public method.
10995         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10996         This is used when implementing interface indexers to define a proxy
10997         if necessary.
10998         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10999         define a proxy if necessary.
11000
11001         * interface.cs (Interface.IndexerName): New public variable.
11002         (Interface.PopulateIndexer): Set the IndexerName.
11003         (Interface.DefineIndexers): New private method.  Populate all the
11004         indexers and make sure their IndexerNames match.
11005
11006         * typemanager.cs (IndexerPropertyName): Added support for interface
11007         indexers.
11008
11009 2002-07-22  Martin Baulig  <martin@gnome.org>
11010
11011         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
11012         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
11013         ret if HasReturnLabel.
11014         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
11015         variables.
11016
11017         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
11018         and set the ec.LoopBeginTryCatchLevel.
11019         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
11020         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
11021         the current ec.TryCatchLevel, the branch goes out of an exception
11022         block.  In this case, we need to use Leave and not Br.
11023
11024 2002-07-22  Martin Baulig  <martin@gnome.org>
11025
11026         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
11027         block unless the block does not always return or it is contained in
11028         another try { ... } catch { ... } block.  Fixes bug #26506.
11029         Added verify-1.cs to the test suite.
11030
11031 2002-07-22  Martin Baulig  <martin@gnome.org>
11032
11033         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
11034         then we do not always return.  Fixes bug #24985.
11035
11036 2002-07-22  Martin Baulig  <martin@gnome.org>
11037
11038         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
11039         lookup on a per-class level; ie. walk up the class hierarchy until we
11040         found at least one applicable method, then choose the best among them.
11041         Fixes bug #24463 and test-29.cs.
11042
11043 2002-07-22  Martin Baulig  <martin@gnome.org>
11044
11045         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
11046         return types of the methods.  The return type is not part of the
11047         signature and we must not check it to make the `new' modifier work.
11048         Fixes bug #27999, also added test-147.cs.
11049         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
11050
11051         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
11052         on the method's return type.
11053
11054 2002-07-21  Martin Baulig  <martin@gnome.org>
11055
11056         * assign.cs: Make this work if the rightmost source is a constant and
11057         we need to do an implicit type conversion.  Also adding a few more tests
11058         to test-38.cs which should have caught this.
11059
11060         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
11061         target in the makefile for this.  The makefile.gnu is primarily intended
11062         for end-users who don't want to debug the compiler.
11063
11064 2002-07-21  Martin Baulig  <martin@gnome.org>
11065
11066         * assign.cs: Improved the Assign class so it can now handle embedded
11067         assignments (X = Y = Z = something).  As a side-effect this'll now also
11068         consume less local variables.  test-38.cs now passes with MCS, added
11069         a few new test cases to that test.
11070
11071 2002-07-20  Martin Baulig  <martin@gnome.org>
11072
11073         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
11074         instructions.  Fixes bug #27977, also added test-146.cs.
11075
11076 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11077
11078         * cs-tokenizer.cs: fixed getHex ().
11079
11080 2002-07-19  Martin Baulig  <martin@gnome.org>
11081
11082         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
11083         not Type.GetType() to lookup the array type.  This is needed when
11084         we're constructing an array of a user-defined type.
11085         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
11086         single-dimensional arrays, but also for single-dimensial arrays of
11087         type decimal.
11088
11089 2002-07-19  Martin Baulig  <martin@gnome.org>
11090
11091         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
11092         this function is called, it's not allowed to share LocalBuilders
11093         among ILGenerators.
11094
11095 2002-07-19  Martin Baulig  <martin@gnome.org>
11096
11097         * expression.cs (Argument.Resolve): Report an error 118 when trying
11098         to pass a type as argument.
11099
11100 2002-07-18  Martin Baulig  <martin@gnome.org>
11101
11102         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
11103         Conv_R_Un for the signed `long' type.
11104
11105 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
11106
11107         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
11108         `expr' for the temporary result, as that will fail if we do
11109         multiple resolves on the same expression.
11110
11111 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
11112
11113         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
11114         ec.TypeContainer for looking up aliases. 
11115
11116         * class.cs (TypeContainer): Remove LookupAlias from here.
11117
11118         * decl.cs (DeclSpace); Move here.
11119
11120 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
11121
11122         * class.cs (FindMembers): Only call filter if the constructor
11123         bulider is not null.
11124
11125         Also handle delegates in `NestedTypes' now.  Now we will perform
11126         type lookups using the standard resolution process.  This also
11127         fixes a bug.
11128
11129         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
11130         This uses Expressions (the limited kind that can be parsed by the
11131         tree) instead of strings.
11132
11133         * expression.cs (ComposedCast.ToString): Implement, used to flag
11134         errors since now we have to render expressions.
11135
11136         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
11137         FormArrayType. 
11138
11139         * ecore.cs (SimpleName.ToString): ditto.
11140
11141         * cs-parser.jay: Instead of using strings to assemble types, use
11142         Expressions to assemble the type (using SimpleName, ComposedCast,
11143         MemberAccess).  This should fix the type lookups in declarations,
11144         because we were using a different code path for this.
11145
11146         * statement.cs (Block.Resolve): Continue processing statements
11147         even when there is an error.
11148
11149 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
11150
11151         * class.cs (Event.Define): Also remove the `remove' method from
11152         the list of pending items.
11153
11154         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
11155         generate more compact code. 
11156
11157 2002-07-17  Martin Baulig  <martin@gnome.org>
11158
11159         * const.cs (Const.LookupConstantValue): Add support for constant
11160         `unchecked' and `checked' expressions.
11161         Also adding test case test-140.cs for this.
11162
11163 2002-07-17  Martin Baulig  <martin@gnome.org>
11164
11165         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
11166         check whether mi.ReturnType implements the IEnumerator interface; the
11167         `==' and the IsAssignableFrom() will fail in this situation.
11168
11169 2002-07-16  Ravi Pratap  <ravi@ximian.com>
11170
11171         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
11172         here too.
11173
11174 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11175
11176         * expression.cs: fixed bug #27811.
11177
11178 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
11179
11180         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
11181         Molaro: when we are a ref, the value already contains a pointer
11182         value, do not take the address of it.
11183
11184 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
11185         * removed mb-parser.jay and mb-tokenizer.cs
11186
11187 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11188
11189         * expression.cs: check against the building corlib void type.
11190
11191 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
11192
11193         * ecore.cs: fix for valuetype static readonly fields: when 
11194         initializing them, we need their address, not the address of a copy.
11195
11196 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
11197
11198         * typemanager.cs: register also enum_type in corlib.
11199
11200 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11201
11202         * class.cs: allow calling this (but not base) initializers in structs.
11203
11204 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
11205
11206         * ecore.cs: make sure we compare against the building base types
11207         in GetTypeSize ().
11208
11209 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
11210
11211         * typemanager.cs: fix TypeToCoreType() to handle void and object
11212         (corlib gets no more typerefs after this change).
11213
11214 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
11215
11216         * expression.cs (ArrayCreation.EmitArrayArguments): use
11217         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
11218
11219         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
11220         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
11221         array indexes, the runtime actually forbids them.
11222
11223         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
11224         for array arguments here.
11225
11226         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
11227         instead of the default for ValueTypes.
11228
11229         (New.DoEmit): Use IsValueType instead of
11230         IsSubclassOf (value_type)
11231         (New.DoResolve): ditto.
11232         (Invocation.EmitCall): ditto.
11233
11234         * assign.cs (Assign): ditto.
11235
11236         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
11237         Statements *are* currently doing part of their resolution during
11238         Emit.  
11239
11240         Expressions do always resolve during resolve, but statements are
11241         only required to propagate resolution to their children.
11242
11243 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
11244
11245         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
11246
11247         (LoadAssembly): Do not add the dll if it is already specified
11248
11249         (MainDriver): Add the System directory to the link path at the end,
11250         after all the other -L arguments. 
11251
11252         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
11253         wrong opcode for loading bytes and bools (ldelem.i1 instead of
11254         ldelem.u1) and using the opposite for sbytes.
11255
11256         This fixes Digger, and we can finally run it.
11257
11258         * driver.cs (UnixParseOption): Move the option parsing here.  
11259         (CSCParseOption): Implement CSC-like parsing of options.
11260
11261         We now support both modes of operation, the old Unix way, and the
11262         new CSC-like way.  This should help those who wanted to make cross
11263         platform makefiles.
11264
11265         The only thing broken is that /r:, /reference: and /lib: are not
11266         implemented, because I want to make those have the same semantics
11267         as the CSC compiler has, and kill once and for all the confussion
11268         around this.   Will be doing this tomorrow.
11269
11270         * statement.cs (Unsafe.Resolve): The state is checked during
11271         resolve, not emit, so we have to set the flags for IsUnsfe here.
11272
11273 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11274
11275         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
11276         not catch the Error_ObjectRefRequired in SimpleName (as it is
11277         possible to have a class/instance variable name that later gets
11278         deambiguated), we have to check this here.      
11279
11280 2002-07-10  Ravi Pratap  <ravi@ximian.com>
11281
11282         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
11283         make static and put into Expression.
11284
11285         (Event.Define): Register the private field of the event with the 
11286         TypeManager so that GetFieldFromEvent can get at it.
11287
11288         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
11289         keep track of the private field associated with an event which
11290         has no accessors.
11291
11292         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
11293         private field.
11294
11295         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
11296
11297 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11298
11299         * expression.cs (Binary.EmitBranchable): this routine emits the
11300         Binary expression in a branchable context.  This basically means:
11301         we need to branch somewhere, not just get the value on the stack.
11302
11303         This works together with Statement.EmitBoolExpression.
11304
11305         * statement.cs (Statement.EmitBoolExpression): Use
11306         EmitBranchable. 
11307
11308 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
11309
11310         * statement.cs (For): Reduce the number of jumps in loops.
11311
11312         (For): Implement loop inversion for the For statement.
11313
11314         (Break): We can be breaking out of a Try/Catch controlled section
11315         (foreach might have an implicit try/catch clause), so we need to
11316         use Leave instead of Br.
11317
11318         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
11319         now).  If the instace expression supports IMemoryLocation, we use
11320         the AddressOf method from the IMemoryLocation to extract the
11321         address instead of emitting the instance.
11322
11323         This showed up with `This', as we were emitting the instance
11324         always (Emit) instead of the Address of This.  Particularly
11325         interesting when This is a value type, as we dont want the Emit
11326         effect (which was to load the object).
11327
11328 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
11329
11330         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
11331
11332         * statement.cs (Checked): Set the CheckedState during the resolve
11333         process too, as the ConvCast operations track the checked state on
11334         the resolve process, and not emit.
11335
11336         * cs-parser.jay (namespace_member_declaration): Flag that we have
11337         found a declaration when we do.  This is used to flag error 1529
11338
11339         * driver.cs: Report ok when we display the help only.
11340
11341 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
11342
11343         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
11344
11345 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
11346
11347         * cs-tokenizer.cs (define): We also have to track locally the
11348         defines.  AllDefines is just used for the Conditional Attribute,
11349         but we also need the local defines for the current source code. 
11350
11351 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
11352
11353         * statement.cs (While, For, Do): These loops can exit through a
11354         Break statement, use this information to tell whether the
11355         statement is the last piece of code.
11356
11357         (Break): Flag that we break.
11358
11359         * codegen.cs (EmitContexts): New `Breaks' state variable.
11360
11361 2002-07-03  Martin Baulig  <martin@gnome.org>
11362
11363         * class.cs (TypeContainer.MethodModifiersValid): Allow override
11364         modifiers in method declarations in structs.  Otherwise, you won't
11365         be able to override things like Object.Equals().
11366
11367 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11368
11369         * class.cs (Method, Property, Indexer): Do not allow the public
11370         modifier to be used in explicit interface implementations.
11371
11372         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
11373         override modifiers in method declarations in structs
11374
11375 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
11376
11377         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
11378         integer or real overflow, report an error
11379
11380 2002-07-02  Martin Baulig  <martin@gnome.org>
11381
11382         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
11383         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
11384         to tell the runtime about our newly created System.Object and
11385         System.ValueType types.
11386
11387 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11388
11389         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
11390         struct instead of Ldarg/Starg.
11391
11392 2002-07-02  Martin Baulig  <martin@gnome.org>
11393
11394         * expression.cs (Indirection.Indirection): Call
11395         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
11396
11397 2002-07-02  Martin Baulig  <martin@gnome.org>
11398
11399         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
11400         ValueType, call TypeManager.TypeToCoreType() on it.
11401         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
11402         the OpCodes.Newarr argument.
11403
11404 2002-07-02  Martin Baulig  <martin@gnome.org>
11405
11406         * expression.cs (Invocation.EmitCall): When compiling corlib,
11407         replace all calls to the system's System.Array type to calls to
11408         the newly created one.
11409
11410         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
11411         System.Array methods.
11412         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
11413         from the system's System.Array type which must be replaced.
11414
11415 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
11416
11417         * typemanager.cs: load unverifiable_code_ctor so we can build
11418         corlib using the correct type. Avoid using GetTypeCode() with
11419         TypeBuilders.
11420         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
11421         TypeManager.object_type to allow building corlib.
11422
11423 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
11424
11425         * ecore.cs: handle System.Enum separately in LoadFromPtr().
11426
11427 2002-07-01  Martin Baulig  <martin@gnome.org>
11428
11429         * class.cs: Make the last change actually work, we need to check
11430         whether `ifaces != null' to avoid a crash.
11431
11432 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11433
11434         * class.cs: when we build structs without fields that implement
11435         interfaces, we need to add the interfaces separately, since there is
11436         no API to both set the size and add the interfaces at type creation
11437         time.
11438
11439 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11440
11441         * expression.cs: the dimension arguments to the array constructors
11442         need to be converted if they are a long.
11443
11444 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
11445
11446         * class.cs: don't emit ldarg.0 if there is no parent constructor
11447         (fixes showstopper for corlib).
11448
11449 2002-06-29  Martin Baulig  <martin@gnome.org>
11450
11451         MCS now compiles corlib on GNU/Linux :-)
11452
11453         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
11454         ie. check for MethodImplOptions.InternalCall.
11455
11456         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
11457         and TypeManager.attribute_type are null, so we must explicitly check
11458         whether parent is not null to find out whether it's an attribute type.
11459         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
11460         and SetBuilder, not only if the property is neither abstract nor external.
11461         This is necessary to set the MethodImplOptions on the accessor methods.
11462         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
11463         SetBuilder, see Property.Emit().
11464
11465         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
11466         populate "System.Object", "System.ValueType" and "System.Attribute" since
11467         they've already been populated from BootCorlib_PopulateCoreTypes().
11468
11469 2002-06-29  Martin Baulig  <martin@gnome.org>
11470
11471         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
11472         is the NullLiteral, we also need to make sure that target_type is not
11473         an enum type.   
11474
11475 2002-06-29  Martin Baulig  <martin@gnome.org>
11476
11477         * rootcontext.cs (RootContext.ResolveCore): We must initialize
11478         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
11479         before calling BootstrapCorlib_ResolveDelegate ().
11480
11481 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11482
11483         * statement.cs: fixed build-breaker. All tests passed ok.
11484
11485 2002-06-27  Martin Baulig  <martin@gnome.org>
11486
11487         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
11488         for System.Decimal when compiling corlib.
11489
11490 2002-06-27  Martin Baulig  <martin@gnome.org>
11491
11492         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
11493         switch blocks which contain nothing but a default clause.
11494
11495 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
11496
11497        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
11498
11499 2002-06-27  Martin Baulig  <martin@gnome.org>
11500
11501         * ecore.cs (PropertyExpr.PropertyExpr): Call
11502         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
11503
11504         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
11505         is already a TypeBuilder.
11506
11507 2002-06-27  Martin Baulig  <martin@gnome.org>
11508
11509         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
11510         `target_type == TypeManager.array_type', not IsAssignableFrom() in
11511         the "from an array-type to System.Array" case.  This makes it work
11512         when compiling corlib.
11513
11514 2002-06-27  Martin Baulig  <martin@gnome.org>
11515
11516         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
11517         non-static PropertyExpr, set its InstanceExpression.  This makes
11518         the `ICollection.Count' property work in System/Array.cs.
11519
11520 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
11521
11522         * driver.cs: Made error handling more consistent.  Errors now
11523         tracked by Report class, so many methods which used to return int
11524         now return void.  Main() now prints success/failure and 
11525         errors/warnings message.
11526
11527         Renamed '--probe' compiler argument to '--expect-error'.  Removed
11528         the magic number return values (123 and 124).  Now, if the
11529         expected error occurs, the compiler exits with success (exit value
11530         0).  If the compilation completes without seeing that particular
11531         error, the compiler exits with failure (exit value 1).  The
11532         makefile in mcs/errors has been changed to handle the new behaviour.
11533
11534         * report.cs: Made 'expected error' number a property and renamed
11535         it from 'Probe' to 'ExpectedError'.
11536
11537         * genericparser.cs: Removed error handling support, since it is
11538         now all done by Report class.
11539
11540         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
11541         class, so parse() no longer returns an int.
11542
11543         * namespace.cs: Use Report.Error instead of GenericParser.error
11544
11545 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
11546
11547         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
11548         TypeContainer.AddOperator): At the front of the list put the
11549         explicit implementations, so they get resolved/defined first. 
11550
11551 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
11552
11553         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
11554         interface type is implemented by this TypeContainer.  Used during
11555         explicit interface implementation.
11556
11557         (Property.Define, Indexer.Define, Method.Define): Validate that
11558         the given interface in the explicit implementation is one of the
11559         base classes for the containing type.
11560
11561         Also if we are explicitly implementing an interface, but there is
11562         no match in the pending implementation table, report an error.
11563
11564         (Property.Define): Only define the property if we are
11565         not explicitly implementing a property from an interface.  Use the
11566         correct name also for those properties (the same CSC uses,
11567         although that is really not needed).
11568
11569         (Property.Emit): Do not emit attributes for explicitly implemented
11570         properties, as there is no TypeBuilder.
11571
11572         (Indexer.Emit): ditto.
11573
11574         Hiding then means that we do not really *implement* a pending
11575         implementation, which makes code fail.
11576
11577 2002-06-22  Martin Baulig  <martin@gnome.org>
11578
11579         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
11580         the return value of Object.GetType().  [FIXME: we need to do this whenever
11581         we get a type back from the reflection library].
11582
11583 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
11584
11585         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
11586
11587 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
11588
11589         * attribute.cs: Return null if we can not look up the type.
11590
11591         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
11592         the interface types found.
11593
11594         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
11595         interface types found.
11596
11597         * typemanager.cs (GetInterfaces): Make this routine returns alll
11598         the interfaces and work around the lame differences between
11599         System.Type and System.Reflection.Emit.TypeBuilder in the results
11600         result for GetInterfaces.
11601
11602         (ExpandInterfaces): Given an array of interface types, expand and
11603         eliminate repeated ocurrences of an interface.  This expands in
11604         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
11605         be IA, IB, IC.
11606
11607 2002-06-21  Martin Baulig  <martin@gnome.org>
11608
11609         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
11610         on System.Enum.
11611
11612 2002-06-21  Martin Baulig  <martin@gnome.org>
11613
11614         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
11615         and called with one of the core types, return the corresponding typebuilder for
11616         that type.
11617
11618         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
11619         element type.
11620
11621 2002-06-21  Martin Baulig  <martin@gnome.org>
11622
11623         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
11624         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
11625         (Expression.ConvertReferenceExplicit): Likewise.
11626
11627         * expression.cs (ElementAccess.DoResolve): Likewise.
11628         (ElementAccess.DoResolveLValue): Likewise.
11629
11630 2002-06-10  Martin Baulig  <martin@gnome.org>
11631
11632         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
11633         add the "value" parameter to the parameter list.
11634
11635         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
11636         to our caller.
11637
11638 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
11639
11640         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
11641         the argument to an int, uint, long or ulong, per the spec.  Also
11642         catch negative constants in array creation.
11643
11644 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
11645
11646         * class.cs: do not allow the same interface to appear twice in
11647         the definition list.
11648
11649 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
11650
11651         * ecore.cs: don't use ldlen with System.Array.
11652
11653 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
11654
11655         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
11656
11657 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
11658
11659         * modifiers.cs: produce correct field attributes for protected
11660         internal. Easy fix so miguel can work on ther harder stuff:-)
11661
11662 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
11663
11664         * pending.cs: New file.  Move the code from class.cs here.
11665         Support clearning the pending flag for all methods (when not doing
11666         explicit interface implementation).
11667
11668 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
11669
11670         * rootcontext.cs: added a couple more types needed to bootstrap.
11671
11672 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
11673
11674         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
11675         constructor in the type, instead of any constructor in the type
11676         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
11677         a bug in the Mono runtime when applying the params attribute). 
11678
11679 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
11680         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
11681
11682 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
11683
11684         * expression.cs (Unary.ResolveOperator): Use TypeManager
11685         to resolve the type.
11686
11687 2002-06-13  Ravi Pratap  <ravi@ximian.com>
11688
11689         * cs-parser.jay (enum_member_declaration): Pass in the attributes
11690         attached.
11691
11692         * enum.cs (AddEnumMember): Add support to store the attributes associated 
11693         with each member too.
11694
11695         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
11696         field builders too - this takes care of the enum member case.
11697
11698 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
11699
11700         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
11701         address-of operator on both value types and pointers.
11702
11703 2002-06-10  Martin Baulig  <martin@gnome.org>
11704
11705         * interface.cs (Interface.PopulateIndexer): Add the indexer's
11706         PropertyBuilder to the `property_builders' list.
11707
11708         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
11709         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
11710         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
11711         find any indexers which are inherited from an interface.
11712
11713 2002-06-09  Martin Baulig  <martin@gnome.org>
11714
11715         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
11716         the same type as the constant if necessary.  There's also a test-130.cs
11717         for this.
11718
11719         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
11720
11721         * typemanager.cs (TypeManager.ChangeType): Previously known as
11722         Enum.ChangeEnumType().
11723
11724 2002-06-09  Martin Baulig  <martin@gnome.org>
11725
11726         * expression.cs (Cast.TryReduce): Added support for consts.
11727
11728 2002-06-08  Ravi Pratap  <ravi@ximian.com>
11729
11730         * class.cs (Accessor): Hold attributes information so we can pass
11731         it along.
11732
11733         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
11734         Modify to pass in attributes attached to the methods.
11735
11736         (add_accessor_declaration, remove_accessor_declaration): Ditto.
11737
11738         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
11739         to handle the Accessor kind :-)
11740
11741         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
11742
11743 2002-06-08  Martin Baulig  <martin@gnome.org>
11744
11745         * expression.cs (Unary.TryReduceNegative): Added support for
11746         ULongConstants.
11747
11748 2002-06-08  Martin Baulig  <martin@gnome.org>
11749
11750         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
11751         name can't be found in the `defined_names' - the caller will do a
11752         MemberLookup in this case and thus find methods in System.Enum
11753         such as Enum.IsDefined().
11754
11755 2002-06-08  Martin Baulig  <martin@gnome.org>
11756
11757         * enum.cs (Enum.ChangeEnumType): This is a custom version of
11758         Convert.ChangeType() which works with TypeBuilder created types.
11759         (Enum.LookupEnumValue, Enum.Define): Use it here.
11760
11761         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
11762         `TypeBuilder.BaseType != null' check.
11763         (TypeContainer.FindMembers): Only lookup parent members if we
11764         actually have a parent.
11765         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
11766         (ConstructorInitializer.Resolve): Likewise.
11767
11768         * interface.cs (Interface.FindMembers): Added
11769         `TypeBuilder.BaseType != null' check.
11770
11771         * rootcontext.cs (RootContext.ResolveCore): Added
11772         "System.Runtime.CompilerServices.IndexerNameAttribute" to
11773         classes_second_stage.
11774
11775         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
11776         debug_type and trace_type when compiling with --nostdlib.       
11777
11778 2002-06-07  Martin Baulig  <martin@gnome.org>
11779
11780         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
11781         (AddField): Set it to true when adding a non-static field.
11782         (DefineType): Use `have_nonstatic_fields' to find out whether we
11783         have non-static fields, not `Fields != null'.
11784
11785 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
11786
11787         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
11788         dereferencing a null on the static-field code path)
11789
11790 2002-05-30  Martin Baulig  <martin@gnome.org>
11791
11792         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
11793         to take command line arguments.  Use reflection to call the new
11794         custom `Initialize' function on the symbol writer and pass it the
11795         command line arguments.
11796
11797         * driver.cs (--debug-args): New command line argument to pass command
11798         line arguments to the symbol writer.
11799
11800 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11801
11802         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11803         the target type for indexers and properties.  Thanks to Joe for
11804         catching this.
11805
11806 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11807
11808         * typemanager.cs (MethodFlags): returns the method flags
11809         (Obsolete/ShouldIgnore) that control warning emission and whether
11810         the invocation should be made, or ignored. 
11811
11812         * expression.cs (Invocation.Emit): Remove previous hack, we should
11813         not do this on matching a base type, we should do this based on an attribute
11814
11815         Only emit calls to System.Diagnostics.Debug and
11816         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11817         on the command line.
11818
11819         * rootcontext.cs: Global settings for tracing and debugging.
11820
11821         * cs-tokenizer.cs (define): New utility function to track
11822         defines.   Set the global settings for TRACE and DEBUG if found.
11823
11824 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11825
11826         * interface.cs (Populate*): Pass in the TypeContainer as well as
11827         the DeclSpace as parameters so that we can create EmitContexts and
11828         then use that to apply attributes etc.
11829
11830         (PopulateMethod, PopulateEvent, PopulateProperty)
11831         (PopulateIndexer): Apply attributes everywhere.
11832
11833         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11834         etc.
11835
11836         (ApplyAttributes): Update accordingly.
11837
11838         We now apply interface attributes for all members too.
11839
11840 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11841
11842         * class.cs (Indexer.Define); Correctly check if we are explicit
11843         implementation (instead of checking the Name for a ".", we
11844         directly look up if the InterfaceType was specified).
11845
11846         Delay the creation of the PropertyBuilder.
11847
11848         Only create the PropertyBuilder if we are not an explicit
11849         interface implementation.   This means that explicit interface
11850         implementation members do not participate in regular function
11851         lookups, and hence fixes another major ambiguity problem in
11852         overload resolution (that was the visible effect).
11853
11854         (DefineMethod): Return whether we are doing an interface
11855         implementation. 
11856
11857         * typemanager.cs: Temporary hack until we get attributes in
11858         interfaces (Ravi is working on that) and we get IndexerName
11859         support in interfaces.
11860
11861         * interface.cs: Register the indexers as properties.
11862
11863         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11864         warning, I have verified that this is a bug in the .NET runtime
11865         (JavaScript suffers of the same problem).
11866
11867         * typemanager.cs (MemberLookup): When looking up members for
11868         interfaces, the parent of an interface is the implicit
11869         System.Object (so we succeed in searches of Object methods in an
11870         interface method invocation.  Example:  IEnumerable x;  x.ToString
11871         ()) 
11872
11873 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11874
11875         * class.cs (Event): Events should also register if they do
11876         implement the methods that an interface requires.
11877
11878         * typemanager.cs (MemberLookup); use the new GetInterfaces
11879         method. 
11880
11881         (GetInterfaces): The code used to lookup interfaces for a type is
11882         used in more than one place, factor it here. 
11883
11884         * driver.cs: Track the errors at the bottom of the file, we kept
11885         on going.
11886
11887         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11888         instance if the method we are calling is static!
11889
11890 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11891
11892         * attribute.cs (ApplyAttributes): Make this function filter out
11893         the IndexerName attribute (as that attribute in reality is never
11894         applied) and return the string constant for the IndexerName
11895         attribute. 
11896
11897         * class.cs (TypeContainer.Emit): Validate that all the indexers
11898         have the same IndexerName attribute, and if so, set the
11899         DefaultName attribute on the class. 
11900
11901         * typemanager.cs: The return value might contain other stuff (not
11902         only methods).  For instance, consider a method with an "Item"
11903         property and an Item method.
11904
11905         * class.cs: If there is a problem with the parameter types,
11906         return. 
11907
11908 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11909
11910         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11911         looks at user defined conversion after making a call to 
11912         StandardConversionExists - we need this for overload resolution.
11913
11914         * expression.cs : Update accordingly the various method calls.
11915
11916         This fixes 2 bugs filed against implicit user defined conversions 
11917
11918 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11919
11920         * statement.cs: Track the result of the assignment.
11921
11922 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11923
11924         * expression.cs (MemberAccess): Improved error reporting for
11925         inaccessible members.
11926
11927 2002-05-22  Martin Baulig  <martin@gnome.org>
11928
11929         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11930         itself with debugging support.
11931
11932 2002-05-22  Martin Baulig  <martin@gnome.org>
11933
11934         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11935         Removed, this isn't needed anymore.
11936
11937 2002-05-20  Martin Baulig  <martin@gnome.org>
11938
11939         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11940         be underlying type for an enum.
11941
11942 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11943
11944         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11945         that splits out the loading of just the core types.
11946
11947         * rootcontext.cs (ResolveCore): Split the struct resolution in
11948         two, so we can load the enumeration underlying types before any
11949         enums are used.
11950
11951         * expression.cs (Is): Bandaid until we fix properly Switch (see
11952         bug #24985 for details).
11953
11954         * typemanager.cs (ImplementsInterface): The hashtable will contain
11955         a null if there are no interfaces implemented.
11956
11957 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11958
11959         * cs-parser.jay (indexer_declarator): It is fine to have array
11960         parameters
11961
11962 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11963
11964         * typemanager.cs: (RegisterBuilder): New function used to register
11965         TypeBuilders that implement interfaces.  Since
11966         TypeBuilder.GetInterfaces (as usual) does not work with lame
11967         Reflection.Emit. 
11968         (AddUserType): register interfaces.
11969
11970         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11971         dealing with TypeBuilder.  Also, arrays are showing up as
11972         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11973         methods can not be invoked on them!
11974
11975         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11976         (ImplicitReferenceConversionExists): Split out from
11977         StandardConversionExists. 
11978
11979         * expression.cs (As): We were only implementing one of the three
11980         cases for the as operator.  We now implement them all.
11981         (Is): Implement the various other cases for Is as well.
11982
11983         * typemanager.cs (CACHE): New define used to control if we want or
11984         not the FindMembers cache.  Seems to have a negative impact on
11985         performance currently
11986
11987         (MemberLookup): Nested types have full acess to
11988         enclosing type members
11989
11990         Remove code that coped with instance/static returns for events, we
11991         now catch this in RealFindMembers.
11992
11993         (RealFindMembers): only perform static lookup if the instance
11994         lookup did not return a type or an event.  
11995
11996 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11997
11998         * assign.cs (CompoundAssign): We pass more semantic information
11999         now to Compound Assignments than we did before: now we have all
12000         the information at hand, and now we resolve the target *before* we
12001         do the expression expansion, which allows the "CacheValue" method
12002         to have the effect we intended (before, a [x] += 1 would generate
12003         two differen ArrayAccess expressions from the ElementAccess,
12004         during the resolution process).
12005
12006         (CompoundAssign.DoResolve): Resolve target and original_source here.
12007
12008 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
12009
12010         * expression.cs (ArrayAccess): dropped debugging information. 
12011
12012         * typemanager.cs: Small bug fix: I was always returning i_members,
12013         instead of one of i_members or s_members (depending on which had
12014         the content).
12015
12016         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
12017         method is invoked before any code generation takes place, and it
12018         is a mechanism to inform that the expression will be invoked more
12019         than once, and that the method should use temporary values to
12020         avoid having side effects
12021
12022         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
12023
12024         * ecore.cs (Expression.CacheTemporaries): Provide empty default
12025         implementation.
12026
12027         * expression.cs (Indirection, ArrayAccess): Add support for
12028         CacheTemporaries in these two bad boys. 
12029
12030         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
12031         ldobj or ldind_ref.  
12032         (StoreFromPtr): Handle stobj as well.
12033
12034         * expression.cs (UnaryMutator): Share more code.
12035
12036         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
12037         down: I was not tracking the Filter function as well, which
12038         was affecting the results of the cache.
12039
12040 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
12041
12042         * attribute.cs: Remove the hack to handle the CharSet property on
12043         StructLayouts. 
12044
12045 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
12046
12047         * attribute.cs (DoResolve): More uglyness, we now only try to
12048         resolve the attribute partially, to extract the CharSet
12049         information (only if we are a StructLayout attribute).  Otherwise 
12050
12051         (GetExtraTypeInfo): Add some code to conditionally kill in the
12052         future this.   I am more and more convinced that the .NET
12053         framework has special code to handle the attribute setting on
12054         certain elements.
12055
12056         * expression.cs (IsParamsMethodApplicable): Revert my previous
12057         foreach change here, it was wrong.
12058
12059 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
12060
12061         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
12062         (pp_expr): do not abort on unknown input, just return.
12063         (eval): abort if there are pending chars.
12064
12065         * attribute.cs (Attribute.Resolve): Positional parameters are
12066         optional.  Deal with that case.
12067
12068         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
12069         the Ansi/Unicode/Auto information for the type.
12070
12071         (TypeContainer.DefineType): instantiate the EmitContext here, as
12072         we will be using it during the type definition (to resolve
12073         attributes) and during the emit phase.
12074
12075         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
12076         to pull type information out of the attributes
12077
12078         (Attribute.Resolve): track the constructor builder, and allow for
12079         multiple invocations (structs and classes will use this).
12080
12081         * ecore.cs (MemberLookupFinal): new version with all the
12082         parameters customizable.
12083
12084         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
12085         constructors.  Return if the result value is null (as the error
12086         would have been flagged already by MemberLookupFinal)
12087
12088         Do not allow instances of abstract classes or interfaces to be
12089         created.
12090
12091         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
12092         We have to compare the assembly property here when dealing with
12093         FamANDAssem and Assembly access modifiers, because we might be
12094         creating an assembly from *modules* (that means that we are not
12095         getting TypeBuilders for types defined in other modules that are
12096         part of this assembly).
12097
12098         (Method.Emit): If the method is marked abstract and has a body,
12099         emit an error. 
12100
12101         (TypeContainer.DefineMembers): If both the defined member and the
12102         parent name match are methods, then do not emit any warnings: let
12103         the Method.Define routine take care of flagging warnings.  But if
12104         there is a mismatch (method overrides something else, or method is
12105         overriwritten by something, then emit warning).
12106
12107         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
12108         set to null, this means `do not check for the return type on the
12109         signature'. 
12110
12111         (Method.Define): set the return type for the method signature to
12112         null, so that we get methods with the same name and parameters and
12113         different return types.  This is used to flag warning 114 (you are
12114         hiding a method, and you probably want to use the new/override
12115         keywords instead).
12116
12117         * typemanager.cs (MemberLookup): Implemented proper access
12118         control, closing a long standing set of bug reports.  The problem
12119         was that the Framework only has two bits: Public and NonPublic,
12120         and NonPublic includes private and protected methods, but we need
12121         to enforce the FamANDAssem, FamOrAssem and Family. 
12122
12123 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
12124
12125         * statement.cs (GotoCase): Return true: Ammounts to giving up
12126         knowledge on whether we return or not, and letting the other case
12127         be responsible for it.
12128
12129 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
12130
12131         * driver.cs: Do not load directories for each file processed, only
12132         do it if there is a pattern.
12133
12134         * ecore.cs: Report readonly assigns here as well, as we might have
12135         been resolved only by MemberAccess.
12136
12137         (SimpleName.SimpleNameResolve): Also be useful for LValue
12138         resolution.   We need this to propagate assign to local readonly variables
12139
12140         * typemanager.cs: Use a ptrhashtable for the criteria, because we
12141         do not want to reuse potential criteria memory.
12142
12143         * class.cs (MyEventBuilder): Set reflected_type;
12144
12145         * ecore.cs (Constantify): Added support for constifying bools.
12146
12147         (RootContext.LookupType): Added a cache for values looked up in
12148         the declaration space.
12149
12150         * typemanager.cs (FindMembers): Now is a front-end to
12151         RealFindMembers, and provides a two-level hashtable-based cache to
12152         the request.  
12153
12154         15% performance improvement: from 22.5 to 19.2 seconds.
12155
12156         * expression.cs (IsParamsMethodApplicable): use foreach.
12157         (Invocation.DoResolve): ditto.
12158         (New.DoResolve): ditto.
12159         (ArrayCreation.DoResolve): ditto.
12160
12161         * ecore.cs (FindMostEncompassingType): use foreach.
12162
12163         * delegate.cs (NewDelegate.DoResolve): Use foreach
12164
12165         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
12166         (RemoveMethods): use foreach.
12167
12168         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
12169         nested foreach statements instead of for, and also break out of
12170         the inner loop once a match is found.
12171
12172         (Invocation.OverloadResolve): Use foreach, simplify the code. 
12173
12174 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
12175
12176         * cfold.cs (BinaryFold): During an enumeration evaluation context,
12177         we actually unwrap the expression to allow for extra information
12178         to be extracted. 
12179
12180         * expression.cs: Use Shr_Un on unsigned operations. 
12181
12182 2002-05-08  Ravi Pratap  <ravi@ximian.com>
12183
12184         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
12185         applicable operators was not being considered correctly. This closes
12186         the bug Miguel reported.
12187
12188 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
12189
12190         * attribute.cs: check that the type derives from System.Attribute
12191         and report the correct error in that case (moved the duplicate code to
12192         its own method, too).
12193
12194 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
12195
12196         * attribute.cs: lookup attribute type name as the spec says: first the
12197         bare attribute name and then name + "Attribute" (nant compiles with
12198         mcs after this fix).
12199
12200 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
12201
12202         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
12203         Because of the way we parse things, we should try to see if a
12204         UIntConstant can fit in an integer.
12205
12206 2002-05-07  Ravi Pratap  <ravi@ximian.com>
12207
12208         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
12209         when we are in an explicit context.
12210
12211         (ConvertReferenceExplicit): When converting from Iface type S to Class
12212         T make sure the rules are implemented as an OR.
12213
12214         * parameter.cs (ParameterType): Make it a property for now although the
12215         purpose really isn't anything immediate.
12216
12217         * expression.cs (Is*Applicable): Do better checking on the parameter type
12218         of a ref/out parameter. The ones from the system assemblies are already 
12219         marked with the correct type so we don't need to do any correction.
12220
12221         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
12222         the object type is standard too so include that.
12223
12224 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12225
12226         * ecore.cs (StandardConversionExists): Augment with missing code:
12227         deal with IntConstant, LongConstants and Enumerations.
12228
12229         * assign.cs: Report the error, instead of failing silently
12230
12231         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
12232         typecontainer that they are declared, because the
12233         typecontainer/namespace will have the list of using clauses that
12234         need to be applied.
12235
12236         Assembly Attributes were escaping the normal registration
12237         mechanism. 
12238
12239         (EmitCode): Apply attributes within an EmitContext that represents
12240         the container they were declared on.
12241
12242         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
12243
12244 2002-05-06  Ravi Pratap  <ravi@ximian.com>
12245
12246         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
12247         Revamp completely - make much cleaner as we now operate only
12248         on a set of Types.
12249
12250         (FindMostSpecificSource, FindMostSpecificTarget): New methods
12251         to implement the logic detailed in the spec more correctly.
12252
12253         (UserDefinedConversion): Update accordingly.
12254
12255 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12256
12257         * statement.cs: Return flow analysis information up.
12258
12259         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
12260         and the default.
12261
12262         (token): Do not consume an extra character before calling
12263         decimal_digits.
12264
12265 2002-05-06  Piers Haken <piersh@friskit.com>
12266
12267         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
12268
12269 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12270
12271         * class.cs (Constructor.Emit): Set the IsStatic flag in the
12272         EmitContext during the instance constructor initializer
12273         resolution, to stop access to instance variables.
12274
12275         This is mandated by the spec, last paragraph of the `constructor
12276         initializers' section. 
12277
12278 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
12279
12280         * cs-parser.jay, class.cs (Accessor): new class used to represent
12281         an accessor (get or set).  In the past we used `null' to represent
12282         a missing accessor.  But this is ambiguous because there was no
12283         way to tell in abstract indexers/properties if one of them was
12284         specified.
12285
12286         Now there is a way of addressing that.
12287
12288         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
12289         instead of FindMembers.
12290
12291         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
12292         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
12293
12294         * attribute.cs: Treat indexers and properties as the same in terms
12295         of applying attributes
12296
12297         * ecore.cs (FindMostEncompassedType): Use statically initialized
12298         EmptyExpressions()s like we do elsewhere to avoid creating useless
12299         objects (and we take this out of the tight loop).
12300
12301         (GetConversionOperators): Move the code to extract the actual
12302         operators to a separate routine to clean things up.
12303
12304 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
12305
12306         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
12307         events are always registered FieldBuilders.
12308
12309         * class.cs (FieldBase): New class shared by Fields 
12310
12311         * delegate.cs: If we are a toplevel delegate, use our full name.
12312         If we are a nested delegate, then only use our tail name.
12313
12314 2002-05-02  Ravi Pratap  <ravi@ximian.com>
12315
12316         * expression.cs (IsApplicable): Ensure that we add the "&" to
12317         ref/out types before comparing it with the type of the argument.
12318
12319         (IsParamsMethodApplicable): Ditto.
12320
12321         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
12322         silly me ;-)
12323
12324         * delegate.cs : Handle the case when we have more than one applicable
12325         method. Flag an error only when we finish checking all.
12326
12327 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
12328
12329         * expression.cs: Add support for boolean static initializers.
12330
12331 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
12332
12333         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
12334
12335         * parameter.cs (ComputeParameterTypes,
12336         ComputeAndDefineParameterTypes): Better error handling: now we
12337         clear the `types' cache if we fail during any of the type lookups.
12338         We also return the status code correctly to our caller
12339
12340         * delegate.cs: If we fail to define a delegate, abort the extra
12341         steps. 
12342
12343         * expression.cs (Binary.ResolveOperator): for
12344         operator==(object,object) and operator !=(object, object) we also
12345         have to verify that there is an implicit conversion from one to
12346         the other.
12347
12348         (ArrayAccess.DoResolve): Array Access can operate on
12349         non-variables. 
12350
12351 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
12352
12353         * assign.cs (CompoundAssign): A new class used as a "flag" that
12354         the assignment actually is happening as part of a compound
12355         assignment operator.
12356
12357         During compound assignment, a few new rules exist to enable things
12358         like:
12359
12360         byte b |= 1 + 2
12361
12362         From the spec:
12363
12364         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
12365         to the type of x) if y is implicitly convertible to the type of x,
12366         and the operator is a builtin operator and the return type of the
12367         operator is explicitly convertible to the type of x. 
12368
12369         * rootcontext.cs: Reset warning level to 2.  4 catches various
12370         "interesting" features in mcs, we must clean this up at some
12371         point, but currently am trying to kill other bugs ;-)
12372
12373         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
12374         in container classes as well.  
12375
12376         * expression.cs (Binary.ResolveOperator): Handle string case
12377         before anything else (as operator overloading does emit an error
12378         before doing anything else).
12379
12380         This code could go away when we move to a table driven model, but
12381         i could not come up with a good plan last night.
12382
12383 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
12384
12385         * typemanager.cs (CSharpName): reimplementation using regex.
12386         * class.cs: added null check for fields in Emit
12387         * rootcontext.cs: set warninglevel to 4
12388
12389 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
12390
12391         * typemanager.cs (CSharpName): reimplemented with Lupus
12392         suggestion.
12393
12394 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
12395
12396         * statement.cs (If): correclty implement Resolve, because we were
12397         not catching sem errors in there.  The same process is needed
12398         everywhere else. 
12399         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
12400
12401
12402         (Statement.Warning_DeadCodeFound): Factorize code.
12403         (While): Report dead code here too.
12404
12405         (Statement): Added Resolve virtual method to allow
12406         for resolution split from the emit code.
12407
12408 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12409
12410         * statement.cs (EmitBoolExpression): No longer try to resolve the
12411         expression here.    
12412         (MakeBoolean): New utility function that resolve, implicitly
12413         converts to boolean and tags the expression. 
12414
12415
12416         (If, Do): Implement dead code elimination.
12417         (While): Implement loop inversion
12418
12419         (Do, While, For, If): Resolve the expression prior to calling our
12420         code generation.
12421
12422 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
12423
12424         * class.cs:
12425           - added method Report28 (warning: program has more than one entry point)
12426           - added method IsEntryPoint, implements paragraph 10.1 of the spec
12427           - modified method Method.Define, the part at the end of the method
12428
12429         * rootcontext.cs: added static public Location EntryPointLocation;
12430           
12431         * ../errors/cs0028.cs : Add test case for the above warning.              
12432
12433         * typemanager.cs:
12434           - modified method CSharpName to allow arrays of primitive type to
12435             be printed nicely (e.g. instead of System.Int32[][] it now prints
12436             int[][])
12437           - added method CSharpSignature: returns the signature of a method
12438             in string format to be used in reporting errors, warnings, etc.
12439
12440         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
12441         with String.Empty.
12442
12443 2002-04-26  Ravi Pratap  <ravi@ximian.com>
12444
12445         * delegate.cs (Define): Fix extremely silly bug where I was
12446         setting the type of the 'object' parameter of the BeginInvoke
12447         method to System.IAsyncResult instead of System.Object ;-)
12448
12449 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12450
12451         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
12452         here. 
12453
12454         (Constructor.Emit): return if we fail to initialize the
12455         constructor.  Another door closed!  
12456
12457         * expression.cs (New.DoResolve): Improve error message (from -6 to
12458         1501).  Use DeclaredOnly lookup to find the exact constructor.
12459
12460         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
12461         loop.  This is useful.
12462
12463         * cs-parser.jay: Adjust the default parameters so that destructors
12464         have the proper signature.
12465
12466 2002-04-26  Martin Baulig  <martin@gnome.org>
12467
12468         * driver.cs (LoadAssembly): If `assembly' contains any characters
12469         which are only valid in path names and not in assembly names
12470         (currently slash, backslash and point), use Assembly.LoadFrom ()
12471         instead of Assembly.Load () on the `assembly' (before iteration
12472         over the link_paths).
12473
12474 2002-04-26  Martin Baulig  <martin@gnome.org>
12475
12476         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
12477
12478 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
12479
12480         * class.cs (Property): use the new typemanager.MemberLookup
12481
12482         (TypeContainer.MemberLookup): Implement using the
12483         TypeManager.MemberLookup now. 
12484
12485         * typemanager.cs: Make MemberLookup a function of the TypeManager,
12486         and return MemberInfos, so that these can be used without an
12487         EmitContext (what we had before).
12488
12489 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
12490
12491         * expression.cs: Fix the case where the argument to params if the
12492         type of the params.  I omitted handling this before.   Fixed
12493
12494 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12495
12496         * driver.cs: Call BootCorlib_PopulateCoreType
12497
12498         * class.cs (Property.CheckBase): Check for properties only, not
12499         for all members. 
12500
12501         * interface.cs: Temporary hack: try/catch around the
12502         CustomAttributeBuilder, because I am getting an exception that I
12503         do not understand.
12504
12505         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
12506         types whose definitions are required to be there (attributes are
12507         defined before standard types).
12508
12509         Compute definitions as we boot the various types, as they are used
12510         immediately (value_type class will need object_type, but if we do
12511         not initialize object_type, we will pass a null, which will let
12512         the runtime pick the System.Object from the existing corlib, which
12513         is not what we want).
12514
12515 2002-04-22  Patrik Torstensson <totte@labs2.com>
12516
12517         * cs-tokenizer.cs: fixed a number of trim() issues.
12518
12519 2002-04-22  Ravi Pratap  <ravi@ximian.com>
12520
12521         * expression.cs (Argument.Type): Ensure that we return the correct
12522         type when we have out or ref parameters [in which case we 
12523         append a "&"].
12524
12525 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12526
12527         * class.cs (Property, Indexer): Allow extern modifier in there. 
12528
12529         * typemanager.cs (InitBaseTypes): Initializes object_type and
12530         value_type, since those will be used early on during the bootstrap
12531         process to compile corlib.
12532
12533         (InitCoreTypes): Move code from here to InitBaseTypes.
12534
12535 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
12536
12537         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
12538         single-dimension arrays as using the ldlen opcode.  
12539
12540         Daniel Lewis discovered this optimization.  
12541
12542         * typemanager.cs: Add signature for System.Array::get_Length
12543
12544 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12545
12546         * statement.cs: report the error when the foreach does not apply to an
12547         array nor a collection.
12548
12549 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
12550
12551         * expression.cs: Add implicit conversions to the operator ~.
12552
12553         * constant.cs (DecimalConstant.Emit): Emit decimal value.
12554
12555         * typemanager.cs: Locate the decimal constructor.
12556
12557 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12558
12559         * attribute.cs: use the new property of TypeOf.
12560         * expression.cs: added 'get' property around typearg.
12561
12562         These changes fix a build breaker reported by NickD. Is this the
12563         correct way to fix?  If not, please, revert my changes and make it
12564         work :-).
12565
12566 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
12567
12568         * attribute.cs: Add support for typeof in attribute invocations.
12569         I am not sure that this is right though.
12570
12571 2002-04-14  Duncan Mak  <duncan@ximian.com>
12572
12573         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
12574         Binary.Operator.Division case.
12575
12576 2002-04-13  Ravi Pratap  <ravi@ximian.com>
12577
12578         * class.cs (DefineType): Ensure that we do a proper check on
12579         attribute types and also register it with the TypeManager.
12580
12581         (TypeContainer.Targets): The default for attribute types is
12582         AttributeTargets.All.
12583
12584         * attribute.cs (ApplyAttributes): Registering the attribute type
12585         is done elsewhere, not when we discover we have a Usage attribute.
12586
12587 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12588
12589         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
12590         and get rid of is_delegate parameter.
12591
12592         * everywhere : update.
12593
12594 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12595
12596         * cs-parser.jay (compilation_unit): Revamp completely to use
12597         some new ideas that I got from Rhys' grammar to solve the problems
12598         with assembly level attributes.
12599
12600         (outer_declaration): New grammar production.
12601
12602         (attribute_sections): Add.
12603
12604         (opt_attributes): Base on attribute_sections
12605
12606         (namespace_declaration): Allow opt_attributes to tackle the case
12607         when we have assembly level attributes - we are clever in this
12608         regard now ;-)
12609
12610         * attribute.cs (ApplyAttributes): Do not worry about assembly 
12611         attributes in the non-global context.
12612
12613         * rootcontext.cs (AddGlobalAttributes): Go back to using this
12614         instead of SetGlobalAttributes.
12615
12616         * class.cs, rootcontext.cs : Ensure we define and generate 
12617         attribute types before anything else.
12618
12619         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
12620         and flag the new error -20 for the case when the attribute type
12621         does not have valid targets specified. csc does not catch this.
12622
12623         * ../errors/errors.txt : update for error # -20
12624
12625 2002-04-11  Ravi Pratap  <ravi@ximian.com>
12626
12627         * support.cs (InternalParameters.ParameterModifier): Do some null
12628         checking and return sane values.
12629
12630         * class.cs (Method.Define): If we are a PInvoke method, ensure
12631         that we are static and extern. Report error # 601
12632
12633         * ../errors/cs0601.cs : Add test case for the above error.
12634
12635 2002-04-07  Ravi Pratap  <ravi@ximian.com>
12636
12637         * rootcontext.cs (attribute_types): We need to keep type of
12638         all attribute types separately and emit code for them first.
12639
12640         (RegisterAttribute) : Implement.
12641
12642         * class.cs (DefineType): Check if the current Type is a custom
12643         attribute type and register it accordingly.
12644
12645         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
12646         adding the first attribute twice and rename to
12647
12648         (SetGlobalAttributes): this.
12649
12650         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
12651         lookups.
12652
12653         * attribute.cs (ApplyAttributes): Take an additional argument telling us
12654         if we are processing global arguments. Hmm, I am unsure of this.
12655
12656 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12657
12658         * expression.cs: added static array of strings to avoid calling
12659         Enum.ToString () for Operator in Binary. Significant recover of
12660         performance.
12661
12662 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
12663
12664         * class.cs (FindMembers): Allow the Builders of the various
12665         members to be null.  If they are skip them.  This only happens
12666         during the PInvoke declaration.
12667
12668 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
12669
12670         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
12671         failure, so we do not keep going afterwards.
12672
12673         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
12674         wanted to pass `false' as the `is_delegate' argument.  If this is
12675         the case, why not use delegate_type == null to mean `is_delegate =
12676         false' and anything else as is_delegate = true.
12677
12678 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
12679
12680         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
12681         code for the section, not the beginning of the tests.
12682
12683 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
12684
12685         * cfold.cs: Handle operator + (Enum x, Underlying x) 
12686
12687         * expression.cs (Binary): same.  Warn about errors where we have
12688         Enum/Enum in operator + as well.
12689
12690 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
12691
12692         * statement.cs:
12693                 - added support for switch(bool)
12694                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
12695                 - add TableSwitchEmit() to handle table-based switch statements
12696
12697 2002-04-05  Ravi Pratap  <ravi@ximian.com>
12698
12699         * expression.cs (Invocation.OverloadResolve): Factor out code which
12700         does parameter compatibility checking with arguments so that we can 
12701         re-use the code even from Delegate.VerifyApplicability
12702
12703         (VerifyArgumentsCompat): Move above code here.
12704
12705         * delegate.cs (VerifyApplicability): Get rid of duplicate code
12706         and instead make a call to the above method.
12707
12708 2002-03-31  Ravi Pratap  <ravi@ximian.com>
12709
12710         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
12711         We use it to keep track of classes which are attribute types.
12712
12713 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
12714
12715         * delegate.cs (Delegate.Define): Correctly define the types in the
12716         presence of fixed and array parameters.
12717
12718         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
12719         doing FindMembers.
12720
12721         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
12722         include NonPublic after the first iteration.
12723
12724         * class.cs (Indexer.CheckBase): Only check if both parents are
12725         non-null. 
12726
12727         * cs-parser.jay (accessor_body): If empty, set to null.
12728
12729         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
12730         same code path here to resolve constants names that we did have in
12731         MemberAccess.DoResolve.  There is too much code duplicated here.
12732
12733 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
12734
12735         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
12736
12737         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
12738         to MakeUnionSet.
12739
12740         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
12741         tokens, numbers and strings.
12742
12743         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
12744         parenthesis.
12745
12746         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
12747         asyncronous parameters and the regular parameters.  
12748
12749         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
12750         specify the target directory.
12751
12752         * expression.cs: (This.DoResolve): Simplify
12753         (As.Emit): Optimize, do not generate IsInst if the expression is
12754         always of the given type.
12755
12756         (Is.DoResolve): Bug fix, we were reporting both always/never for
12757         the is expression.
12758
12759         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
12760         creating too many unnecessary arrays.
12761
12762 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
12763
12764         * class.cs (EmitFieldInitializer): Use Assign expression to assign
12765         fields instead of rolling our own initializer.   Takes care of all
12766         implicit conversions, and drops unnecessary static checks/argument.
12767
12768 2002-03-31  Dick Porter  <dick@ximian.com>
12769
12770         * driver.cs: use the GetDirectories() return values properly, and
12771         use "/" as path separator.
12772
12773 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
12774
12775         * expression.cs (Unary): Optimize - - expr into expr.
12776         (Binary): Optimize a + (-b) into a -b.
12777
12778         * codegen.cs (CodeGen): Made all methods static.
12779
12780 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
12781
12782         * rootcontext.cs: 
12783
12784         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
12785         TypeBuilder property.
12786
12787         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
12788         instead. 
12789
12790         * tree.cs: Removed the various RecordXXXX, and replaced with a
12791         single RecordDecl.  Removed all the accessor methods, and just
12792         left a single access point Type 
12793
12794         * enum.cs: Rename DefineEnum to DefineType.
12795
12796         * decl.cs: New abstract method `DefineType' used to unify the
12797         Defines for Enumerations, Interfaces, TypeContainers and
12798         Delegates.
12799
12800         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12801         LookupBaseClasses method that used to live in class.cs and
12802         interface.cs here, and renamed to FindType.
12803
12804         * delegate.cs: Implement DefineType.  Take advantage of the
12805         refactored pattern for locating the parent builder without taking
12806         the parent_builder argument (which we know does not work if we are
12807         nested, and triggering a toplevel definition).
12808
12809 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12810
12811         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12812         accessibility of a member has changed during override and report
12813         an error if so.
12814
12815         * class.cs (Method.Define, Property.Define): Only complain on
12816         overrides if the method is private, any other accessibility is
12817         fine (and since we just checked the permission is the same, we are
12818         good to go).
12819
12820         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12821         and elif are processed always.  The other pre-processing
12822         directives are only processed if we are "taking" the path
12823
12824 2002-03-29  Martin Baulig  <martin@gnome.org>
12825
12826         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12827         current location is not Null.
12828
12829         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12830         a separate method so we can profile it.
12831
12832         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12833         `span.Seconds' are just seconds, but no minutes or hours.
12834         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12835
12836 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12837
12838         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12839         Remove the gratuitous set of Final:
12840
12841                                 // If an interface implementation, then we can set Final.
12842                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12843                                     implementing.DeclaringType.IsInterface)
12844                                         flags |= MethodAttributes.Final;
12845
12846         I do not know what I was smoking when I used that.
12847
12848
12849         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12850         step into fixing the name resolution issues for delegates and
12851         unifying the toplevel name resolution.
12852
12853 2002-03-28  Martin Baulig  <martin@gnome.org>
12854
12855         * class.cs (Method.Emit): If we have a symbol writer, call its
12856         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12857         tell it about the current method.
12858
12859         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12860         writer that we're going to emit the first byte of IL code for a new
12861         statement (a new source line).
12862         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12863         EmitContext.Mark() before emitting any code.
12864
12865         * location.cs (SymbolDocument): Return null when we're Null.
12866
12867         * statement.cs (Statement): Moved the `Location loc' variable here.
12868         (Statement.EmitBoolExpression): If we have a symbol writer, call
12869         ec.Mark() before emitting any code to tell it that we're at the
12870         beginning of a new statement.
12871         (StatementExpression): Added `Location' argument to the constructor.
12872         (Block): Added public readonly variable `StartLocation' and public
12873         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12874         (Block): Added constructor which takes a start and end location.
12875         (Block.SetEndLocation): New method. This sets the end location.
12876         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12877         local variables we create.
12878         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12879         each statement and do also mark the begin and end of the block.
12880
12881         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12882         tell it the current lexer.Location, use Location.Null for the end of the
12883         block.
12884         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12885         current block, set its end location using SetEndLocation().
12886         (statement_expression): StatementExpression constructor now takes the
12887         lexer.Location as additional argument.
12888         (for_statement, declare_local_variables): Likewise.
12889         (declare_local_variables): When creating a new implicit block, use the
12890         new Block constructor and pass it the lexer.Location.
12891
12892 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12893
12894         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12895         members also on the parent interfaces recursively.
12896
12897 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12898
12899         * report.cs: Use new formats, since Gonzalo finished the missing
12900         bits. 
12901
12902         * expression.cs (Binary.ResolveOperator): added missing operator|
12903         operator& and operator^ for bool/bool.
12904
12905         * cs-parser.jay: CheckDef now takes a Location argument that is
12906         used to report errors more precisly (instead of reporting the end
12907         of a definition, we try to track something which is a lot closer
12908         to the source of the problem).
12909
12910         * cs-tokenizer.cs: Track global token use, so we can properly flag
12911         the use of #define/#undef after the first token has been seen.
12912
12913         Also, rename the reportXXXX to Error_DescriptiveName
12914
12915         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12916         TypeContainer, so that Enum and Interface can use this too.
12917
12918         * class.cs (TypeContainer.LookupInterfaceOrClass,
12919         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12920         `builder' argument.  Typically this was used to pass the parent
12921         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12922         the definition).  
12923
12924         The problem is that a nested class could trigger the definition of
12925         a toplevel class, and the builder would be obviously wrong in that
12926         case. 
12927
12928         So we drop this argument, and we compute dynamically the
12929         TypeBuilder/ModuleBuilder (the correct information was available
12930         to us anyways from DeclSpace.Parent)
12931
12932         * interface.cs (Interface.DefineInterface): Drop builder
12933         parameter cleanup like class.cs
12934
12935         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12936         like class.cs
12937
12938         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12939         values. 
12940
12941         (Try.Emit): Propagate the returns value from the statement.
12942
12943         (Return.Emit): Even if we are leavning 
12944
12945         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12946
12947         * modifiers.cs: Fix the computation of MethodAttributes flags.
12948
12949 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12950
12951         * driver.cs: allow compilation of files that start with '/'.
12952         Add a default case when checking the argument of --target.
12953
12954 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12955
12956         * interface.cs: Implement the same search algorithm for types in
12957         the interface code.
12958
12959         * delegate.cs: Do not allow multiple definition.
12960
12961         * Recovered ChangeLog that got accidentally amputated
12962
12963         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12964
12965         * rootcontext.cs: Load manually enum to allow core classes to
12966         contain enumerations.
12967
12968         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12969         Update to new static methods in TypeManager.
12970
12971         * typemanager.cs (GetMethod, GetConstructor): Use our
12972         implementation of FindMembers to find the members, since during
12973         corlib compilation, the types are TypeBuilders and GetMethod and
12974         GetConstructor do not work.
12975
12976         Make all methods in TypeManager static.
12977
12978         (InitCodeHelpers): Split the functionality from
12979         the InitCodeTypes function.
12980
12981         * driver.cs: Call InitCodeHelpers after we have populated the
12982         types. 
12983
12984         * cs-parser.jay (delegate_declaration): we did not used to compute
12985         the delegate name correctly for void delegates.
12986
12987 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12988
12989         * rootcontext.cs (RootContext): Init the interface_resolve_order
12990         and type_container_resolve_order always.
12991
12992         (ResolveCore, BootstrapCorlib_ResolveClass,
12993         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12994         compiler when compiling with --nostdlib
12995
12996         * class.cs (TypeContainer.DefineType): Check that our parent is
12997         not null.  This test is most important when we are bootstraping
12998         the core types.
12999
13000         * codegen.cs: Split out the symbol writing code.
13001
13002 2002-03-25  Martin Baulig  <martin@gnome.org>
13003
13004         * driver.cs (-g): Made -g an alias for --debug.
13005
13006 2002-03-24  Martin Baulig  <martin@gnome.org>
13007
13008         * codegen.cs (SymbolWriter): New public variable. Returns the
13009         current symbol writer.
13010         (CodeGen): Added `bool want_debugging_support' argument to the
13011          constructor. If true, tell the ModuleBuild that we want debugging
13012         support and ask it for the ISymbolWriter.
13013         (Save): If we have a symbol writer, call it's Close() method after
13014         saving the assembly.
13015
13016         * driver.c (--debug): New command line argument to create a
13017         debugger information file.
13018
13019         * location.cs (SymbolDocument): New public property. Returns an
13020         ISymbolDocumentWriter object for the current source file or null
13021         if we don't have a symbol writer.
13022
13023 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
13024
13025         * driver.cs (LoadAssembly): Correctly return when all the paths
13026         have been tried and not before.
13027
13028         * statement.cs (Switch.Emit): return the actual coverage for this
13029         statement (returns/not-returns)
13030
13031         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
13032         switch of the statement if we are the last switch section.  That
13033         kills two problems: try/catch problems (we used to emit an empty
13034         nop at the end) and switch statements where all branches would
13035         return. 
13036
13037 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
13038
13039         * driver.cs: Add default assemblies (the equivalent to the
13040         Microsoft CSC.RSP file)
13041
13042         * cs-tokenizer.cs: When updating `cols and setting it to zero,
13043         also update tokens_seen and set it to false.
13044
13045         * driver.cs: Implement --recurse for Mike.
13046
13047         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
13048         correctly splitting out the paths.
13049
13050 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
13051
13052         * interface.cs (Interface.PopulateProperty): Instead of using
13053         `parent' as the declaration space for the set parameters, use
13054         `this' 
13055
13056         * support.cs (InternalParameters): InternalParameters constructor
13057         takes a DeclSpace instead of a TypeContainer.
13058
13059         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
13060         types are being initialized, load the address of it before calling
13061         the function.  
13062
13063         (New): Provide a mechanism to disable the generation of local
13064         value type temporaries when the caller will be providing us with
13065         an address to store it.
13066
13067         (ArrayCreation.EmitDynamicInitializers): Use it.
13068
13069 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
13070
13071         * expression.cs (Invocation.EmitArguments): Only probe for array
13072         property if there is more than one argument.  Sorry about that.
13073
13074         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
13075         empty param arrays.
13076
13077         * class.cs (Method.LabelParameters): Fix incorrect code path that
13078         prevented the `ParamArrayAttribute' from being applied to the
13079         params attribute.
13080
13081 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
13082
13083         * support.cs (ReflectionParameters): Correctly compute whether the
13084         last argument is a params array.  Fixes the problem with
13085         string.Split ('a')
13086
13087         * typemanager.cs: Make the assemblies array always be non-null
13088         (empty, but non-null)
13089
13090         * tree.cs (RecordDecl): New function that abstracts the recording
13091         of names.  This reports error 101, and provides a pointer to the
13092         previous declaration.  Fixes a crash in the compiler.
13093
13094         * cs-parser.jay (constructor_declaration): Update to new grammar,
13095         and provide a constructor_body that can be empty.
13096
13097 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
13098
13099         * driver.cs: Add support for --resources.
13100
13101         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
13102         Make all types for the various array helper methods be integer.
13103
13104         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
13105         CheckState to ConvCast.
13106
13107         (ConvCast): Now it takes a `checked' state argument, to avoid
13108         depending on the emit context for the conversion, and just using
13109         the resolve time setting.
13110
13111         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
13112         instead of Invocation.EmitArguments.  We do not emit the original
13113         arguments, instead we emit those which have been converted to
13114         unsigned int expressions.
13115
13116         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
13117
13118         * codegen.cs: ditto.
13119
13120         * expression.cs (LocalVariableReference): Drop the use of the
13121         Store function that depended on the variable index.
13122
13123         * statement.cs (VariableInfo): Drop the `Idx' property from this
13124         class, as this is not taking into account the indexes for
13125         temporaries tat we generate during the execution, getting the
13126         indexes wrong.
13127
13128         * class.cs: First emit class initializers, then call the parent
13129         constructor. 
13130
13131         * expression.cs (Binary): Fix opcode emision.
13132         (UnaryMutator.EmitCode): Support checked code generation
13133
13134         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
13135         matches for events for both the Static and Instance scans,
13136         pointing to the same element.   Fix that.
13137
13138 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
13139
13140         * rootcontext.cs (ResolveTree): Always set the
13141         interface_resolve_order, because nested interfaces will be calling
13142         into us.
13143
13144         * class.cs (GetInterfaceOrClass): Track the same resolution
13145         process used by TypeManager.LookupType.  This fixes the nested
13146         type lookups in class declarations (separate path from
13147         LookupType). 
13148
13149         (TypeContainer.DefineType): Also define nested interfaces.
13150         (TypeContainer.RegisterOrder): New public function used to
13151         register the order in which child interfaces need to be closed.
13152
13153         Nested interfaces need to be closed after their parents have been
13154         created. 
13155
13156         * interface.cs (InterfaceAttr): Put all the logic for computing
13157         the interface attribute here. 
13158
13159         (DefineInterface): Register our interface order with the
13160         RootContext or with the TypeContainer depending on the case.
13161
13162 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
13163
13164         * cs-parser.jay: rework foreach statement to work with the new
13165         changes to the policy on SimpleNames.
13166
13167         * report.cs: support Stacktrace on warnings as well.
13168
13169         * makefile: drop --unsafe and /unsafe from the compile.
13170
13171 2002-03-13  Ravi Pratap  <ravi@ximian.com>
13172
13173         * ecore.cs (StandardConversionExists): Modify to take an Expression
13174         as the first parameter. Ensure we do null -> reference type conversion
13175         checking.
13176
13177         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
13178         temporary Expression objects.
13179
13180 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
13181
13182         * interface.cs: workaround bug in method overloading resolution
13183         (there is already a bugzilla bug for it).
13184
13185 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
13186
13187         We could also solve this problem by having a separate path for
13188         performing type lookups, instead of DoResolve, we could have a
13189         ResolveType entry point, and only participating pieces of the
13190         production (simplename, deref, array) would implement this. 
13191
13192         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
13193         signal SimpleName to only resolve type names and not attempt to
13194         resolve anything else.
13195
13196         * expression.cs (Cast): Set the flag.
13197
13198         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
13199
13200         * class.cs: Only report 108 if there is no `new' modifier.
13201
13202         * cs-parser.jay: rework foreach statement to work with the new
13203         changes to the policy on SimpleNames.
13204         
13205         * report.cs: support Stacktrace on warnings as well.
13206
13207         * makefile: drop --unsafe and /unsafe from the compile.
13208
13209 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
13210
13211         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
13212         lookups here, instead of doing that at parse time.  This means
13213         that our grammar will not introduce `LocalVariableReferences' as
13214         expressions at this point.  That solves the problem of code like
13215         this:
13216
13217         class X {
13218            static void Main ()
13219            { int X = 1;
13220             { X x = null }}}
13221
13222         This is only half the fix.  The full fix requires parameters to
13223         also be handled in this way.
13224
13225         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
13226         makes the use more obvious of the DeclSpace.  The
13227         ec.TypeContainer.TypeBuilder is now only used to pull the
13228         TypeBuilder for it.
13229
13230         My theory is that I can get rid of the TypeBuilder completely from
13231         the EmitContext, and have typecasts where it is used (from
13232         DeclSpace to where it matters).  
13233
13234         The only pending problem is that the code that implements Aliases
13235         is on TypeContainer, and probably should go in DeclSpace.
13236
13237         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
13238         lookups here, instead of doing that at parse time.  This means
13239         that our grammar will not introduce `LocalVariableReferences' as
13240         expressions at this point.  That solves the problem of code like
13241         this:
13242
13243         class X {
13244            static void Main ()
13245            { int X = 1;
13246             { X x = null }}}
13247
13248         This is only half the fix.  The full fix requires parameters to
13249         also be handled in this way.
13250
13251         * class.cs (Property.DefineMethod): When implementing an interface
13252         method, set newslot, when implementing an abstract method, do not
13253         set the flag (before we tried never setting it, or always setting
13254         it, which is the difference).
13255         (Indexer.DefineMethod): same.
13256         (Method.DefineMethod): same.
13257
13258         * ecore.cs: Only set the status used flag if we get back a Field.
13259
13260         * attribute.cs: Temporary hack, so Paolo can keep working.
13261
13262 2002-03-08  Ravi Pratap  <ravi@ximian.com>
13263
13264         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
13265         the unmanaged type in the case we have a MarshalAs attribute.
13266
13267         (Resolve): Handle the case when we are parsing the special MarshalAs
13268         attribute [we need to store the unmanaged type to use later]
13269
13270         * typemanager.cs (marshal_as_attr_type): Built in type for the 
13271         MarshalAs Attribute.
13272
13273         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
13274         on parameters and accordingly set the marshalling info.
13275
13276 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
13277
13278         * class.cs: Optimizing slightly by removing redundant code after
13279         we switched to the `NoTypes' return value.
13280         (Property.DefineMethod): use NoTypes here too.
13281
13282         This fixes the bug I introduced in my last batch of changes.
13283
13284 2002-03-05  Ravi Pratap  <ravi@ximian.com>
13285
13286         * tree.cs (RecordEnum): Add. We now keep track of enums too.
13287
13288         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
13289         Enums since those are types too. 
13290
13291         * cs-parser.jay (enum_declaration): Record enums as we parse them.
13292
13293         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
13294         thanks to a call during the lookup process.
13295
13296 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
13297
13298         * statement.cs (Foreach): Lots of work to accomodate a particular
13299         kind of foreach statement that I had not kept in mind.  It is
13300         possible to have foreachs on classes that provide a GetEnumerator
13301         method that return objects that implement the "pattern" for using
13302         a foreach, there is no need to support GetEnumerator
13303         specifically. 
13304
13305         This is needed to compile nant.
13306
13307         * decl.cs: Only report 114 if the member is not `Finalize' and if
13308         the warning level is at least 2.
13309
13310         * class.cs: Moved the compare function from Method to
13311         MethodSignature. 
13312
13313         (MethodSignature.InheritableMemberSignatureCompare): Add new
13314         filter function that is used to extract inheritable methods from a
13315         class. 
13316
13317         (Method.Define): Use the new `inheritable_method_signature_filter'
13318         delegate
13319
13320         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
13321         command. 
13322
13323 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
13324
13325         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
13326
13327         * cs-parser.jay: Add opt_semicolon to the interface declaration.
13328
13329         * expression.cs: Pass location information to
13330         ConvertImplicitStandard. 
13331
13332         * class.cs: Added debugging code to track return values from
13333         interfaces. 
13334
13335 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
13336
13337         * expression.cs (Is.DoResolve): If either side of the `is' is an
13338         interface, do not flag the warning.
13339
13340         * ecore.cs (ImplicitReferenceConversion): We need a separate test
13341         for interfaces
13342
13343         * report.cs: Allow for --fatal to be used with --probe.
13344
13345         * typemanager.cs (NoTypes): Move the definition for the empty Type
13346         array here. 
13347
13348         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
13349         properties. 
13350         (TypeContainer.DefineProxy): New function used to proxy to parent
13351         implementations when implementing interfaces.
13352         (TypeContainer.ParentImplements): used to lookup if our parent
13353         implements a public function that is required by an interface.
13354         (TypeContainer.VerifyPendingMethods): Hook this up.
13355
13356         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
13357         `modules' and `assemblies' arraylists into arrays.  We only grow
13358         these are the very early start up of the program, so this improves
13359         the speedof LookupType (nicely measured).
13360
13361         * expression.cs (MakeByteBlob): Replaced unsafe code with
13362         BitConverter, as suggested by Paolo.
13363
13364         * cfold.cs (ConstantFold.Binary): Special case: perform constant
13365         folding of string concatenation, but if either side is a string,
13366         and the other is not, then return null, and let the runtime use
13367         the concatenation on the string plus the object (using
13368         `Object.ToString'). 
13369
13370 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
13371
13372         Constant Folding has been implemented now.
13373
13374         * expression.cs (Unary.Reduce): Do not throw an exception, catch
13375         the error instead on types that are not supported in one's
13376         complement. 
13377
13378         * constant.cs (Constant and all children): New set of functions to
13379         perform implict and explicit conversions.
13380
13381         * ecore.cs (EnumConstant): Implement the new functions to perform
13382         conversion by proxying to the child expression.
13383
13384         * codegen.cs: (ConstantCheckState): Constant evaluation has its
13385         own separate setting that can not be turned off from the command
13386         line using --unchecked or --checked and is only controlled using
13387         the checked/unchecked statements and expressions.  This setting is
13388         used by the constant folder to flag errors.
13389
13390         * expression.cs (CheckedExpr, UncheckedExpr): Set the
13391         ConstantCheckState as well.   
13392
13393         During Resolve, they also have to flag the state, because the
13394         constant folder runs completely in the Resolve phase.
13395
13396         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
13397         well.
13398
13399 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13400
13401         * cfold.cs: New file, this file contains the constant folder.
13402
13403         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
13404         argument to track whether we are using the resulting address to
13405         load or store a value and provide better error messages. 
13406
13407         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
13408         new AddressOf arguments.
13409
13410         * statement.cs (Foreach.EmitCollectionForeach): Update
13411
13412         * expression.cs (Argument.Emit): Call AddressOf with proper
13413         arguments to track usage.
13414
13415         (New.DoEmit): Call AddressOf with new arguments.
13416
13417         (Unary.Emit): Adjust AddressOf call.
13418
13419 2002-03-01  Ravi Pratap  <ravi@ximian.com>
13420
13421         * cs-parser.jay (member_access): Change the case for pre-defined types
13422         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
13423         this suggestion.
13424
13425         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
13426         a method body.
13427
13428         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
13429         essentially like methods and apply attributes like MethodImplOptions to them too.
13430
13431         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
13432         not being null.
13433
13434         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
13435         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
13436         is the DeclSpace.
13437
13438         * Update code everywhere accordingly.
13439
13440         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
13441
13442         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
13443
13444 2002-02-28  Ravi Pratap  <ravi@ximian.com>
13445
13446         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
13447         try performing lookups against those instead of jumping straight into using
13448         the 'using' clauses.
13449
13450         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
13451
13452         (LookupType): Perform lookups in implicit parents too.
13453
13454         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
13455         sequence as RootContext.LookupType. 
13456
13457         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
13458         the various cases of namespace lookups into this method.
13459
13460 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13461
13462         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
13463         in positional arguments)
13464
13465         * class.cs (Operator): Update the AllowedModifiers to contain
13466         extern. 
13467
13468         * cs-parser.jay: Update operator declaration to allow for the
13469         operator body to be empty.
13470
13471         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
13472         values. 
13473
13474 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
13475
13476         * class.cs (Method.Emit): Label parameters.
13477
13478         * driver.cs: Return 1 or 0 as the program exit code.
13479
13480 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
13481
13482         * expression.cs: Special case the `null' object when trying to
13483         auto-compute the type, as anything can be explicitly converted to
13484         that. 
13485
13486         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
13487         spotting this Paolo.
13488
13489         (Expression.ImplicitNumericConversion): Perform comparissions of
13490         the type using the underlying type in the case of an enumeration
13491         rather than using the enumeration type for the compare.
13492
13493         Cope with the underlying == type case, which is not possible to
13494         catch before. 
13495
13496         (Expression.ConvertNumericExplicit): Perform comparissions of
13497         the type using the underlying type in the case of an enumeration
13498         rather than using the enumeration type for the compare.
13499
13500         * driver.cs: If the user does not supply an extension, assume .exe
13501
13502         * cs-parser.jay (if_statement): Rewrote so that we can track the
13503         location for the if statement.
13504
13505         * expression.cs (Binary.ConstantFold): Only concat strings when
13506         the operation is "+", not everything ;-)
13507
13508         * statement.cs (Statement.EmitBoolExpression): Take a location
13509         argument. 
13510         (If, While, Do): Track location.
13511
13512         * expression.cs (Binary.ResolveOperator): In the object + string
13513         case, I was missing a call to ConvertImplicit
13514
13515 2002-02-25  Ravi Pratap  <ravi@ximian.com>
13516
13517         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
13518         Location arguments. Ensure we use RootContext.LookupType to do our work
13519         and not try to do a direct Type.GetType and ModuleBuilder.GetType
13520
13521         * interface.cs (PopulateMethod): Handle the type of the parameter being
13522         null gracefully.
13523
13524         * expression.cs (Invocation.BetterFunction): Handle the case when we 
13525         have a params method with no fixed arguments and a call is made with no
13526         arguments.
13527
13528 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
13529
13530         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
13531         the verbatim-string-literal
13532
13533         * support.cs (InternalParameters.ParameterModifier): handle null
13534         fixed parameters.
13535         (InternalParameters.ParameterType): ditto.
13536
13537         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
13538         duplicating the name of the variable parameter.
13539         (GetParameterByName): Fix bug where we were not looking up array
13540         paramters if they were the only present (thanks Paolo!).
13541         (GetParameterInfo): We only have an empty set of types if both
13542         fixed and array are set to null.
13543         (GetParameterInfo-idx): Handle FixedParameter == null
13544
13545         * cs-parser.jay: Handle the case where there is no catch
13546         statements (missing null test).
13547
13548 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
13549
13550         * driver.cs (MainDriver): Be conservative on our command line
13551         handling.
13552
13553         Catch DirectoryNotFoundException when calling GetFiles.
13554
13555         (SplitPathAndPattern): Used to split the input specification into
13556         a path and a pattern that we can feed to Directory.GetFiles.
13557
13558 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
13559
13560         * statement.cs (Fixed): Implement the last case of the Fixed
13561         statement (string handling).
13562
13563         * expression.cs (StringPtr): New class used to return a char * to
13564         a string;  Used by the Fixed statement.
13565
13566         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
13567
13568         * expression.cs (Binary.ResolveOperator): Remove redundant
13569         MemberLookup pn parent type.
13570         Optimize union call, we do not need a union if the types are the same.
13571         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
13572         type.
13573
13574         Specialize the use of MemberLookup everywhere, instead of using
13575         the default settings. 
13576
13577         (StackAlloc): Implement stackalloc keyword.
13578
13579         * cs-parser.jay: Add rule to parse stackalloc.
13580
13581         * driver.cs: Handle /h, /help, /?
13582
13583         * expression.cs (MakeByteBlob): Removed the hacks we had in place
13584         before we supported unsafe code.
13585
13586         * makefile: add --unsafe to the self compilation of mcs.
13587
13588 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
13589
13590         * expression.cs (PointerArithmetic): New class that is used to
13591         perform pointer arithmetic.
13592         (Binary.Resolve): Handle pointer arithmetic
13593         Handle pointer comparission.
13594         (ArrayPtr): Utility expression class that is used to take the
13595         address of an array.
13596
13597         (ElementAccess): Implement array access for pointers
13598
13599         * statement.cs (Fixed): Implement fixed statement for arrays, we
13600         are missing one more case before we are done.
13601
13602         * expression.cs (Indirection): Implement EmitAssign and set the
13603         ExprClass to Variable.  This allows pointer dereferences to be
13604         treated as variables, and to have values assigned to them.
13605
13606         * ecore.cs (Expression.StoreFromPtr): New utility function to
13607         store values dereferencing.
13608
13609 2002-02-20  Ravi Pratap  <ravi@ximian.com>
13610
13611         * expression.cs (Binary.ResolveOperator): Ensure that we are
13612         not trying to operate on a void type - this fixes the reported
13613         bug.
13614
13615         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
13616         the parent implementation is sealed.
13617
13618         * ../errors/cs0239.cs : Add.
13619
13620         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
13621
13622         * typemanager.cs (unverifiable_code_type): Corresponds to 
13623         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
13624         which have unsafe code in them.
13625
13626         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
13627         unsafe context.
13628
13629 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
13630
13631         * cs-tokenizer.cs: Add support for @"litreal strings"
13632
13633         Make tokenizer accept pre-processor directives
13634         on any column (remove the old C-like limitation). 
13635
13636         * rootcontext.cs (EmitCode): Emit any global attributes.
13637         (AddGlobalAttributes): Used to keep track of assembly attributes. 
13638
13639         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
13640
13641         * cs-parser.jay: Add support for global attributes.  
13642
13643 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
13644
13645         * expression.cs (Indirection): New helper class.  Unary will
13646         create Indirection classes to be able to implement the
13647         IMemoryLocation interface on it.
13648
13649 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
13650
13651         * cs-parser.jay (fixed_statement): reference the right statement.
13652
13653         * statement.cs (Fixed.Emit): Finish implementing the fixed
13654         statement for the &x case.
13655
13656 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
13657
13658         * class.cs (Property.Define, Method.Define): Remove newslot when
13659         `implementing'.  
13660
13661         * modifiers.cs: My use of NewSlot when `Abstract' was set was
13662         wrong.  NewSlot should only be used if the `new' keyword is present.
13663
13664         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
13665         locating our system dir.  Sorry about this.
13666
13667 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13668
13669         * driver.cs (GetSystemDir): Compute correctly the location of our
13670         system assemblies.  I was using the compiler directory instead of
13671         the library directory.
13672
13673 2002-02-13  Ravi Pratap  <ravi@ximian.com>
13674
13675         * expression.cs (BetterFunction): Put back in what Miguel commented out
13676         since it is the correct fix. The problem is elsewhere ;-)
13677
13678         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
13679         parameters of the parms method are themselves compatible or not !
13680
13681         (StandardConversionExists): Fix very dangerous bug where we were forgetting
13682         to check that a class implements an interface before saying that an implicit
13683         conversion was allowed. Use ImplementsInterface to do the checking.
13684
13685 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13686
13687         * class.cs (Method.Define): Track whether we are an explicit
13688         implementation or not.  And only call DefineMethodOverride if we
13689         are an explicit implementation.
13690
13691         (Property.DefineMethod): Ditto.
13692
13693 2002-02-11  Ravi Pratap  <ravi@ximian.com>
13694
13695         * expression.cs (BetterFunction): Catch hideous bug which was
13696          preventing us from detecting ambiguous calls due to implicit casts i.e
13697         cs0121.
13698
13699 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
13700
13701         * support.cs (Pair): Remove un-needed method.  I figured why I was
13702         getting the error in cs-parser.jay, the variable in a foreach loop
13703         is readonly, and the compiler does not really treat this as a variable.
13704
13705         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
13706         instead of EQUALS in grammar.  
13707
13708         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
13709
13710         * expression.cs (Unary.DoResolve): Check whether the argument is
13711         managed or not.
13712
13713 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
13714
13715         * support.cs: Api for Pair to set a value.  Despite the fact that
13716         the variables are public the MS C# compiler refuses to compile
13717         code that accesses the field if the variable is part of a foreach
13718         statement. 
13719
13720         * statement.cs (Fixed): Begin implementation of the fixed
13721         statement.
13722
13723         (Block.AddVariable): Return the VariableInfo on success and null
13724         on failure instead of true/false. 
13725
13726         * cs-parser.jay (foreach): Catch errors on variables already
13727         defined (we were ignoring this value before) and properly unwind
13728         the block hierarchy
13729
13730         (fixed_statement): grammar for the fixed statement.
13731
13732 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
13733
13734         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
13735         pointer types to be incretemented.
13736
13737         (SizeOf): Implement.
13738
13739         * cs-parser.jay (pointer_member_access): Implement
13740         expr->IDENTIFIER production.
13741
13742         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
13743         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
13744         on safe contexts.
13745
13746         (Unary): Implement indirection.
13747
13748         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
13749         use in non-unsafe context).
13750
13751         (SimpleName.DoResolve): Check for pointers in field access on safe
13752         contexts. 
13753
13754         (Expression.LoadFromPtr): Factor the load-indirect code in this
13755         function.  This was duplicated in UnboxCast and ParameterReference
13756
13757 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
13758
13759         * expression.cs (ComposedCast): report an error if a pointer cast
13760         is used in a safe region.
13761
13762         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
13763         pointer type casts in unsafe context.
13764
13765         * codegen.cs (EmitContext): Set up IsUnsafe.
13766
13767         * cs-parser.jay (non_expression_type): Add productions for pointer
13768         casts. 
13769
13770         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
13771         code.  We should not use force into static mode if the method is
13772         not virtual.  Fixes bug in MIS
13773
13774         * statement.cs (Do.Emit, While.Emit, For.Emit,
13775         Statement.EmitBoolExpression): Add support to Do and While to
13776         propagate infinite loop as `I do return' semantics.
13777
13778         Improve the For case to also test for boolean constants.
13779
13780         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
13781         to the list of attributes we can add.
13782
13783         Remove `EmitContext' argument.
13784
13785         * class.cs (Method.Define): Apply parameter attributes.
13786         (Constructor.Define): Apply parameter attributes.
13787         (MethodCore.LabelParameters): Move here the core of labeling
13788         parameters. 
13789
13790         * support.cs (ReflectionParameters.ParameterModifier,
13791         InternalParameters.ParameterModifier): Use IsByRef on the type and
13792         only return the OUT bit for these parameters instead of in/out/ref
13793         flags.
13794
13795         This is because I miss-understood things.  The ParameterInfo.IsIn
13796         and IsOut represent whether the parameter has the [In] and [Out]
13797         attributes set.  
13798
13799 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13800
13801         * ecore.cs (FieldExpr.Emit): Release temporaries.
13802
13803         * assign.cs (LocalTemporary.Release): new function.
13804
13805         * codegen.cs (EmitContext.GetTemporaryStorage,
13806         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13807         temporary storage.  Now we can "put back" localbuilders when we
13808         are done with them
13809
13810 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13811
13812         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13813         need to make a copy of the variable to generate verifiable code.
13814
13815 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13816
13817         * driver.cs: Compute dynamically the system directory.
13818
13819         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13820         Slower, but more generally useful.  Used by the abstract
13821         registering implementation. 
13822
13823         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13824         the rules for the special rule on Type/instances.  First check if
13825         we have the same name, and if so, try that special static path
13826         rather than the instance path.
13827
13828 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13829
13830         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13831         for, while and if.
13832
13833         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13834         Enum, ValueType, Delegate or Array for non-corlib compiles.
13835
13836         * cs-tokenizer.cs: Catch long identifiers (645)
13837
13838         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13839         piece of code.
13840
13841         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13842         fix, we were returning too early, so we were not registering
13843         pending methods from abstract classes.
13844
13845         Do not register pending methods if the class is abstract.
13846
13847         * expression.cs (Conditional.DoResolve): Report circular implicit
13848         conversions when we neecd to compute it for conditional
13849         expressions. 
13850
13851         (Is.DoResolve): If the expression is always of the provided type,
13852         flag warning 183.  If the expression can not ever be of the
13853         provided type flag warning 184.
13854
13855         * class.cs: Catch 169 as well.
13856
13857         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13858         read. 
13859
13860 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13861
13862         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13863
13864 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13865
13866         * interface.cs: (PopulateMethod): Check for pointers being defined
13867         only if the unsafe context is active.
13868         (PopulateProperty): ditto.
13869         (PopulateIndexer): ditto.
13870
13871         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13872         specified.  If pointers are present, make sure that they are
13873         present in an unsafe context.
13874         (Constructor, Constructor.Define): ditto.
13875         (Field, Field.Define): ditto.
13876         (Property, Property.Define): ditto.
13877         (Event, Event.Define): ditto.
13878
13879         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13880         hashtable if there are classes or structs defined.
13881
13882         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13883         code, as the constant resolution moved.
13884
13885         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13886         the metadata, so we can flag error 133. 
13887
13888         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13889         pointer is being declared in an unsafe context.
13890
13891 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13892
13893         * modifiers.cs (Modifiers.Check): Require a Location argument.
13894         Report error 227 for Unsafe use.
13895
13896         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13897
13898         * statement.cs (For.Emit): If the test is null, then report that
13899         we do `return', as we wont reach anything afterwards.
13900
13901         (Switch.SwitchGoverningType): Track the expression that matched
13902         the conversion.
13903
13904         * driver.cs: Allow negative numbers as an error code to flag.
13905
13906         * cs-parser.jay: Handle 1551.
13907
13908         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13909
13910 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13911
13912         * cs-parser.jay: Report 1518 (type declaration can only contain
13913         class, struct, interface, enum or delegate)
13914
13915         (switch_label): Report 1523 (keywords `case' or `default' must
13916         preced code)
13917
13918         (opt_switch_sections): Report 1522 (empty switch)
13919
13920         * driver.cs: Report 1515 (response file specified multiple times)
13921         Report 1516 (Source file specified multiple times).
13922
13923         * expression.cs (Argument.Resolve): Signal 1510
13924
13925         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13926         access not allowed in static code)
13927
13928 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13929
13930         * typemanager.cs (IsPointerType): Utility method which we are going
13931         to need a lot.
13932
13933         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13934         the object type, so we take care of that.
13935
13936         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13937
13938         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13939         added to non-params parameters :-)
13940
13941         * typemanager.cs (CSharpName): Include 'void' type too. 
13942
13943         (void_ptr_type): Include in the set of core types.
13944
13945         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13946         duplicating code.
13947
13948         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13949         an unsafe context.
13950
13951         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13952         completely forgotten about it.
13953
13954 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13955
13956         * cs-parser.jay (pointer_type): Add. This begins our implementation
13957         of parsing rules for unsafe code.
13958
13959         (unsafe_statement): Implement.
13960
13961         (embedded_statement): Modify to include the above.
13962
13963         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13964
13965         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13966         if the current context is an unsafe one.
13967
13968         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13969         are handled differently, we need separate rules for them.
13970
13971         (local_variable_declaration): Update to use local_variable_pointer_type
13972         to allow variable declarations of unmanaged pointer types.
13973
13974         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13975         in unsafe contexts.
13976
13977         * ../errors/cs0214.cs : Add.
13978
13979 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13980
13981         * makefile: remove 'response' file when cleaning.
13982
13983 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13984
13985         * cs-parser.jay: Report 1524.
13986
13987 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13988
13989         * typemanager.cs (RegisterMethod): drop checking if we have
13990         registered this from here
13991
13992 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13993
13994         * class.cs (Method.EmitDestructor): Implement calling our base
13995         destructor. 
13996
13997         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13998         value of InFinally.
13999
14000         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
14001         this routine and will wrap the call in a try/catch block.  Deal
14002         with the case.
14003
14004 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
14005
14006         * ecore.cs (Expression.MemberLookup): instead of taking a
14007         parameter `same_type' that was used to tell whether we could
14008         access private members we compute our containing type from the
14009         EmitContext.
14010
14011         (FieldExpr): Added partial support for volatile fields.  This does
14012         not work for volatile fields exposed from assemblies, as I can not
14013         figure out how to extract the modreq from it.
14014
14015         Updated all the source files to use this.
14016
14017         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
14018         because it is referenced by MemberLookup very often. 
14019
14020 2002-01-09  Ravi Pratap  <ravi@ximian.com>
14021
14022         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
14023         TypeBuilder.GetCustomAttributes to retrieve what we need.
14024
14025         Get rid of redundant default_member_attr_type as this is the same as
14026         default_member_type which already exists.
14027
14028         * interface.cs, attribute.cs : Update accordingly.
14029
14030 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
14031
14032         * typemanager.cs: Enable IndexerPropertyName again.  It does not
14033         work for TYpeBuilders though.  Ravi, can you please fix this?
14034
14035         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
14036
14037         * expression.cs (Argument.Emit): Handle the case of ref objects
14038         being passed to ref functions;  
14039
14040         (ParameterReference.EmitLoad): Loads the content of the pointer
14041         without dereferencing.
14042
14043 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14044
14045         * cs-tokenizer.cs: Implemented the pre-processing expressions.
14046
14047 2002-01-08  Ravi Pratap  <ravi@ximian.com>
14048
14049         * class.cs (Indexer.DefineMethod): Incorporate the interface
14050         type in the name of the method if we are doing explicit interface
14051         implementation.
14052
14053         * expression.cs (ConversionExists): Remove as it is completely obsolete.
14054
14055         (BetterConversion): Fix extremely trivial bug where we were referring to
14056         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
14057         again !
14058
14059         * ../errors/bug16.cs : Add although we have fixed it.
14060
14061 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14062
14063         * expression.cs (BaseIndexer): Begin implementation.
14064
14065         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
14066
14067         * cs-parser.jay (indexer_declarator): Use qualified_identifier
14068         production directly to remove a shift/reduce, and implement
14069         explicit interface implementation.
14070
14071         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
14072         after a floating point suffix.
14073
14074         * expression.cs (DoNumericPromotions): Improved the conversion for
14075         uint/uint.  If we have a constant, we avoid doing a typecast to a
14076         larger type.
14077
14078         * class.cs (Indexer): Implement explicit interface implementation
14079         for indexers.
14080
14081 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
14082
14083         * class.cs: make the default instance constructor public and hidebysig.
14084
14085 2001-01-03  Ravi Pratap  <ravi@ximian.com>
14086
14087         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
14088         so we can call it from elsewhere.
14089
14090         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
14091         we emit it internally if the class has a defined indexer; otherwise the user
14092         emits it by decorating the class definition with the DefaultMemberAttribute.
14093
14094         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
14095         attribute is not used on a type which defines an indexer.
14096
14097         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
14098         character when we skip whitespace.
14099
14100         * ../errors/cs0646.cs : Add.
14101
14102 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
14103
14104         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
14105         again. 
14106
14107         * makefile: Add practical target `mcs3.exe' which builds the third
14108         generation compiler. 
14109
14110         * expression.cs (New): Fix structures constructor calling.
14111
14112         * class.cs (Property, Method, Indexer): Emit Final flag on the
14113         method if we are an interface implementation and we are not
14114         abstract. 
14115
14116         * ecore.cs (PropertyExpr): New public field `IsBase', tells
14117         whether this property is referencing a `base' method.
14118
14119         * expression.cs (Invocation.EmitCall): take an extra argument:
14120         is_base, this is used to determine whether the `call' or
14121         `callvirt' opcode should be used.
14122
14123
14124         * delegate.cs: update EmitCall.
14125
14126         * class.cs (Method.Define): Set NewSlot for the cases where we are
14127         not implementing an interface method.
14128
14129         (Property.Define): ditto.
14130
14131 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
14132
14133         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
14134         'r'.  Allows mcs to parse itself fully.
14135
14136 2002-01-02  Ravi Pratap  <ravi@ximian.com>
14137
14138         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
14139         of the number of initializers that require the InitializeArray method.
14140
14141         (CheckIndices): Store the Expression in all cases - not the plain value. Also
14142         update the above field where necessary.
14143
14144         (MakeByteBlob): Update accordingly.
14145
14146         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
14147         greater than 2.
14148
14149         (EmitDynamicInitializers): Update in accordance with the new optimization.
14150
14151         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
14152         same OpCode applies.
14153
14154         * cs-parser.jay : Fix some glaring errors I introduced.
14155
14156 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
14157
14158         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
14159         so that we can check for name clashes there too.
14160
14161         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
14162         for interface indexers.
14163
14164         * interfaces.cs (Define): Emit the default member attribute.
14165
14166         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
14167         variable was being referred to while setting the value ;-)
14168
14169 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
14170
14171         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
14172         byte-by-byte information when we know the data is zero.
14173
14174         Make the block always a multiple of 4, because
14175         DefineInitializedData has a bug.
14176
14177         * assign.cs: Fix, we should assign from the temporary, not from
14178         the source. 
14179
14180         * expression.cs (MakeByteBlob): Fix my incorrect code.
14181
14182 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
14183
14184         * typemanager.cs (EnumToUnderlying): This function is used to get
14185         the underlying type from an enumeration, because it does not
14186         always work. 
14187
14188         * constant.cs: Use the I4_S form for values between -128 and 127.
14189
14190         * statement.cs (Block.LookupLabel): Looks up a label.
14191         (Block): Drop support for labeled blocks.
14192
14193         (LabeledStatement): New kind of statement that represents a label
14194         only.
14195
14196         (Goto): Finally implement this bad boy.
14197
14198         * cs-parser.jay: Update to reflect new mechanism to implement
14199         labels.
14200
14201 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
14202
14203         * codegen.cs (EmitContext.This): a codegen property that keeps the
14204         a single instance of this instead of creating many different this
14205         instances. 
14206
14207         * delegate.cs (Delegate.DoResolve): Update to use the property;
14208
14209         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
14210
14211         * expression.cs (BaseAccess.DoResolve): Ditto.
14212
14213 2001-12-29  Ravi Pratap  <ravi@ximian.com>
14214
14215         * typemanager.cs (methodimpl_attr_type): Add to hold the type
14216         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
14217
14218         (InitCoreTypes): Update accordingly.
14219
14220         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
14221         so we can quickly store the state.
14222
14223         (ApplyAttributes): Set the correct implementation flags
14224         for InternalCall methods.
14225
14226 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
14227
14228         * expression.cs (EmitCall): if a method is not virtual, then do
14229         not use callvirt on it.
14230
14231         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
14232         user defined stuff) requires the use of stobj, which takes an
14233         address on the stack instead of an array and an index.  So emit
14234         the Ldelema operation for it.
14235
14236         (EmitStoreOpcode): Use stobj for valuetypes.
14237
14238         (UnaryMutator.EmitCode): Use the right 1 value depending on
14239         whether we are dealing with int64/uint64, float or doubles.
14240
14241         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
14242         constructors that I implemented last night.
14243
14244         (Constructor.IsDefault): Fix to work properly for static
14245         constructors.
14246
14247         * cs-parser.jay (CheckDef): report method signature errors.
14248         Update error number 103 to be 132.
14249
14250         * decl.cs: New AdditionResult enumeration value: MethodExists.
14251         Although we do this check for methods later on in the semantic
14252         analysis, catching repeated default constructors is so easy that
14253         we catch these here. 
14254
14255         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
14256         promotions code.
14257
14258         (ParameterReference.EmitAssign, Emit): handle
14259         bools as bytes.
14260
14261         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
14262         (ArrayAccess.EmitStoreOpcode): ditto.
14263
14264         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
14265
14266         * expression.cs (MakeByteBlob): Complete all the missing types
14267         (uint, short, ushort, byte, sbyte)
14268
14269         * class.cs: Only init instance field initializers on instance
14270         constructors. 
14271
14272         Rename `constructors' to instance_constructors. 
14273
14274         (TypeContainer.AddConstructor): Only add constructors to the list
14275         if it is not static.
14276
14277         Make sure that we handle default_static_constructor independently
14278         everywhere where we handle instance_constructors
14279
14280 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
14281
14282         * class.cs: Do not lookup or create a base initializer for a
14283         static constructor.
14284
14285         (ConstructorInitializer.Resolve): use the proper type to lookup
14286         for constructors.
14287
14288         * cs-parser.jay: Report error 1585 (modifiers between type and name).
14289
14290         * enum.cs, interface.cs: Remove CloseType, this is taken care by
14291         in DeclSpace. 
14292
14293         * decl.cs: CloseType is now an virtual method, the default
14294         implementation just closes this type.
14295
14296 2001-12-28  Ravi Pratap  <ravi@ximian.com>
14297
14298         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
14299         to PreserveSig by default. Also emit HideBySig on such methods.
14300
14301         Basically, set the defaults to standard values.
14302
14303         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
14304         argument, if candidate is better, it can't be worse than the best !
14305
14306         (Invocation): Re-write bits to differentiate between methods being
14307         applicable in their expanded form and their normal form - for params
14308         methods of course.
14309
14310         Get rid of use_standard everywhere as only standard conversions are allowed
14311         in overload resolution. 
14312
14313         More spec conformance.
14314
14315 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14316
14317         * driver.cs: Add --timestamp, to see where the compiler spends
14318         most of its time.
14319
14320         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
14321         `this' in static code.
14322
14323         (SimpleName.DoResolve): Implement in terms of a helper function
14324         that allows static-references to be passed upstream to
14325         MemberAccess.
14326
14327         (Expression.ResolveWithSimpleName): Resolve specially simple
14328         names when called by MemberAccess to implement the special
14329         semantics. 
14330
14331         (Expression.ImplicitReferenceConversion): Handle conversions from
14332         Null to reference types before others, as Null's type is
14333         System.Object. 
14334
14335         * expression.cs (Invocation.EmitCall): Handle the special case of
14336         calling methods declared on a reference type from a ValueType
14337         (Base classes System.Object and System.Enum)
14338
14339         (MemberAccess.Resolve): Only perform lookups on Enumerations if
14340         the left hand side is a TypeExpr, not on every enumeration. 
14341
14342         (Binary.Resolve): If types are reference types, then do a cast to
14343         object on operators != and == of both arguments.
14344
14345         * typemanager.cs (FindMembers): Extract instance and static
14346         members if requested.
14347
14348         * interface.cs (PopulateProperty): Use void_type instead of null
14349         as the return type for the setter method.
14350
14351         (PopulateIndexer): ditto.
14352
14353 2001-12-27  Ravi Pratap  <ravi@ximian.com>
14354
14355         * support.cs (ReflectionParameters): Fix minor bug where we
14356         were examining the wrong parameter for the ParamArray attribute.
14357
14358         Cope with requests for the type of the parameter at position
14359         greater than the params parameter's. We now return the element
14360         type of the params array as that makes more sense.
14361
14362         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
14363         accordingly as we no longer have to extract the element type
14364         ourselves.
14365
14366         (Invocation.OverloadResolve): Update.
14367
14368 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14369
14370         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
14371         against IEnumerator, test whether the return value is a descendant
14372         of the IEnumerator interface.
14373
14374         * class.cs (Indexer.Define): Use an auxiliary method to implement
14375         the other bits of the method definition.  Begin support for
14376         explicit interface implementation.
14377
14378         (Property.DefineMethod): Use TypeManager.void_type instead of null
14379         for an empty return value.
14380
14381 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
14382
14383         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
14384         dealing with a FieldExpr which is composed of a FieldBuilder, in
14385         the code path we did extract the constant, but we should have
14386         obtained the underlying value to be able to cast it (otherwise we
14387         end up in an infinite loop, this is what Ravi was running into).
14388
14389         (ArrayCreation.UpdateIndices): Arrays might be empty.
14390
14391         (MemberAccess.ResolveMemberAccess): Add support for section
14392         14.5.4.1 that deals with the special case of E.I when E is a type
14393         and something else, that I can be a reference to a static member.
14394
14395         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
14396         handle a particular array type to create byte blobs, it is just
14397         something we dont generate byteblobs for.
14398
14399         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
14400         arguments. 
14401
14402         * location.cs (Push): remove the key from the hashtable that we
14403         are about to add.   This happens for empty files.
14404
14405         * driver.cs: Dispose files after we have parsed them.
14406
14407         (tokenize): new function that only runs the tokenizer on its
14408         input, for speed testing.
14409
14410 2001-12-26  Ravi Pratap  <ravi@ximian.com>
14411
14412         * class.cs (Event.Define): Define the private field only if there
14413         are no accessors defined.
14414
14415         * expression.cs (ResolveMemberAccess): If there is no associated
14416         field with the event, that means we have an event defined with its
14417         own accessors and we should flag error cs0070 since transforming
14418         ourselves into a field is not valid in that case.
14419
14420         * ecore.cs (SimpleName.DoResolve): Same as above.
14421
14422         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
14423         and charset to sane values.
14424
14425 2001-12-25  Ravi Pratap  <ravi@ximian.com>
14426
14427         * assign.cs (DoResolve): Perform check on events only if they 
14428         are being accessed outside the declaring type.
14429
14430         * cs-parser.jay (event_declarations): Update rules to correctly
14431         set the type of the implicit parameter etc.
14432
14433         (add_accessor, remove_accessor): Set current local parameters.
14434
14435         * expression.cs (Binary): For delegate addition and subtraction,
14436         cast the return value from the method into the appropriate delegate
14437         type.
14438
14439 2001-12-24  Ravi Pratap  <ravi@ximian.com>
14440
14441         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
14442         of these as the workaround is unnecessary.
14443
14444         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
14445         delegate data - none of that is needed at all.
14446
14447         Re-write bits to extract the instance expression and the delegate method
14448         correctly.
14449
14450         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
14451         on delegates too.
14452
14453         * attribute.cs (ApplyAttributes): New method to take care of common tasks
14454         of attaching attributes instead of duplicating code everywhere.
14455
14456         * everywhere : Update code to do attribute emission using the above method.
14457
14458 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14459
14460         * expression.cs (IsParamsMethodApplicable): if there are not
14461         parameters, return immediately.
14462
14463         * ecore.cs: The 0 literal can be implicity converted to an enum
14464         type. 
14465
14466         (SimpleName.DoResolve): First lookup the type, then lookup the
14467         members. 
14468
14469         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
14470         want to get its address.  If the InstanceExpression is not
14471         addressable, store the result in a temporary variable, then get
14472         the address of it.
14473
14474         * codegen.cs: Only display 219 errors on warning level or above. 
14475
14476         * expression.cs (ArrayAccess): Make it implement the
14477         IMemoryLocation interface.
14478
14479         (Binary.DoResolve): handle the operator == (object a, object b)
14480         and operator != (object a, object b) without incurring into a
14481         BoxedCast (because 5 != o should never be performed).
14482
14483         Handle binary enumerator operators.
14484
14485         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
14486         value type, otherwise use Ldelem_ref.
14487
14488         Use precomputed names;
14489
14490         (AddressOf): Implement address of
14491
14492         * cs-parser.jay (labeled_statement): Fix recursive block
14493         addition by reworking the production.
14494
14495         * expression.cs (New.DoEmit): New has a special case:
14496                 
14497                  If we are dealing with a ValueType, we have a few
14498                  situations to deal with:
14499                 
14500                     * The target of New is a ValueType variable, that is
14501                       easy, we just pass this as the variable reference
14502                 
14503                     * The target of New is being passed as an argument,
14504                       to a boxing operation or a function that takes a
14505                       ValueType.
14506                 
14507                       In this case, we need to create a temporary variable
14508                       that is the argument of New.
14509
14510
14511 2001-12-23  Ravi Pratap  <ravi@ximian.com>
14512
14513         * rootcontext.cs (LookupType): Check that current_type is not null before
14514         going about looking at nested types.
14515
14516         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
14517         not implement the IAssignMethod interface any more.
14518
14519         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
14520         where we tranform them into FieldExprs if they are being resolved from within
14521         the declaring type.
14522
14523         * ecore.cs (SimpleName.DoResolve): Do the same here.
14524
14525         * assign.cs (DoResolve, Emit): Clean up code considerably. 
14526
14527         * ../errors/bug10.cs : Add.
14528
14529         * ../errors/cs0070.cs : Add.
14530
14531         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
14532
14533         * assign.cs : Get rid of EventIsLocal everywhere.
14534
14535 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14536
14537         * ecore.cs (ConvertIntLiteral): finished the implementation.
14538
14539         * statement.cs (SwitchLabel): Convert the value we are using as a
14540         key before looking up the table.
14541
14542 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14543
14544         * codegen.cs (EmitTopBlock): Require a Location argument now.
14545
14546         * cs-parser.jay (constructor_declarator): We need to setup
14547         current_local_parameters before we parse the
14548         opt_constructor_initializer, to allow the variables to be bound
14549         to the constructor arguments.
14550
14551         * rootcontext.cs (LookupType): First lookup nested classes in our
14552         class and our parents before we go looking outside our class.
14553
14554         * expression.cs (ConstantFold): Extract/debox the values at the
14555         beginnning. 
14556
14557         * rootcontext.cs (EmitCode): Resolve the constants first before we
14558         resolve the types.  This is not really needed, but it helps debugging.
14559
14560         * statement.cs: report location.
14561
14562         * cs-parser.jay: pass location to throw statement.
14563
14564         * driver.cs: Small bug fix.
14565
14566         * report.cs: Updated format to be 4-zero filled digits.
14567
14568 2001-12-22  Ravi Pratap  <ravi@ximian.com>
14569
14570         * expression.cs (CheckIndices): Fix minor bug where the wrong
14571         variable was being referred to ;-)
14572
14573         (DoEmit): Do not call EmitStaticInitializers when the 
14574         underlying type is System.Object.
14575
14576 2001-12-21  Ravi Pratap  <ravi@ximian.com>
14577
14578         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
14579         and do the usual workaround for SRE.
14580
14581         * class.cs (MyEventBuilder.EventType): New member to get at the type
14582         of the event, quickly.
14583
14584         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
14585
14586         * assign.cs (Assign.DoResolve): Handle the case when the target
14587         is an EventExpr and perform the necessary checks.
14588
14589         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
14590         interface.
14591
14592         (SimpleName.MemberStaticCheck): Include check for EventExpr.
14593
14594         (EventExpr): Set the type in the constructor itself since we 
14595         are meant to be born fully resolved.
14596
14597         (EventExpr.Define): Revert code I wrote earlier.
14598                 
14599         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
14600         instance expression is null. The instance expression is a This in that case
14601         or a null, depending on whether it is a static method or not.
14602
14603         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
14604         refers to more than one method.
14605
14606         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
14607         and accordingly flag errors.
14608
14609 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14610
14611         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
14612
14613 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14614
14615         * location.cs (ToString): Provide useful rutine.
14616
14617 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14618
14619         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
14620         objects, return the actual integral boxed.
14621
14622         * statement.cs (SwitchLabel): define an ILLabel for each
14623         SwitchLabel. 
14624
14625         (Switch.CheckSwitch): If the value is a Literal, extract
14626         the underlying literal.
14627
14628         Also in the unused hashtable we had, add the SwitchLabel so we can
14629         quickly look this value up.
14630
14631         * constant.cs: Implement a bunch of new constants.  Rewrite
14632         Literal based on this.  Made changes everywhere to adapt to this.
14633
14634         * expression.cs (Expression.MakeByteBlob): Optimize routine by
14635         dereferencing array only once, and also copes with enumrations.
14636
14637         bytes are two bytes wide, not one.
14638
14639         (Cast): Perform constant conversions.
14640
14641         * ecore.cs (TryImplicitIntConversion): Return literals instead of
14642         wrappers to the literals here.
14643
14644         * expression.cs (DoNumericPromotions): long literals can converted
14645         to ulong implicity (this is taken care of elsewhere, but I was
14646         missing this spot).
14647
14648         * ecore.cs (Expression.Literalize): Make the return type Literal,
14649         to improve type checking.
14650
14651         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
14652
14653 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14654
14655         * literal.cs: Revert code from ravi that checked the bounds.  The
14656         bounds are sane by the definition of the type itself. 
14657
14658         * typemanager.cs: Fix implementation of ImplementsInterface.  We
14659         need to actually look up in our parent hierarchy for interfaces
14660         implemented. 
14661
14662         * const.cs: Use the underlying type for enumerations
14663
14664         * delegate.cs: Compute the basename for the delegate creation,
14665         that should fix the delegate test case, and restore the correct
14666         Type Lookup semantics in rootcontext
14667
14668         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
14669         referencing a nested type with the Reflection API is using the "+"
14670         sign. 
14671
14672         * cs-parser.jay: Do not require EOF token at the end.
14673
14674 2001-12-20  Ravi Pratap  <ravi@ximian.com>
14675
14676         * rootcontext.cs (LookupType): Concatenate type names with
14677         a '.' instead of a '+' The test suite passes again.
14678
14679         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
14680         field of the enumeration.
14681
14682         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
14683         the case when the member is an EventExpr.
14684
14685         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
14686         static has an associated instance expression.
14687
14688         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
14689
14690         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
14691
14692         * class.cs (Event.Define): Register event and perform appropriate checks
14693         for error #111.
14694
14695         We define the Add and Remove methods even if the use provides none because
14696         in that case, we provide default implementations ourselves.
14697
14698         Define a private field of the type of the event. This is done by the CSC compiler
14699         and we should be doing it too ;-)
14700
14701         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
14702         More methods we use in code we generate.
14703
14704         (multicast_delegate_type, delegate_type): Two separate types since the distinction
14705         is important.
14706
14707         (InitCoreTypes): Update accordingly for the above.
14708
14709         * class.cs (Event.Emit): Generate code for default accessors that we provide
14710
14711         (EmitDefaultMethod): Do the job in the above.
14712
14713         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
14714         appropriate place.
14715
14716 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14717
14718         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
14719         builders even if we were missing one.
14720
14721         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
14722         pass the Basename as our class name instead of the Name.  The
14723         basename will be correctly composed for us.
14724
14725         * parameter.cs (Paramters): Now takes a Location argument.
14726
14727         * decl.cs (DeclSpace.LookupType): Removed convenience function and
14728         make all the code call directly LookupType in RootContext and take
14729         this chance to pass the Location information everywhere.
14730
14731         * Everywhere: pass Location information.
14732
14733 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
14734
14735         * class.cs (Constructor.Define): Updated way of detecting the
14736         length of the parameters.
14737
14738         (TypeContainer.DefineType): Use basename as the type name for
14739         nested types.
14740
14741         (TypeContainer.Define): Do not recursively define types here, as
14742         definition is taken care in order by the RootContext.
14743
14744         * tree.cs: Keep track of namespaces in a per-file basis.
14745
14746         * parameter.cs (Parameter.ComputeSignature): Update to use
14747         DeclSpace. 
14748
14749         (Parameters.GetSignature): ditto.
14750
14751         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
14752         instead of a TypeContainer.
14753
14754         (Interface.SemanticAnalysis): Use `this' instead of our parent to
14755         resolve names.  Because we need to be resolve in our context, not
14756         our parents.
14757
14758         * driver.cs: Implement response files.
14759
14760         * class.cs (TypeContainer.DefineType): If we are defined, do not
14761         redefine ourselves.
14762
14763         (Event.Emit): Emit the code for add/remove handlers.
14764         (Event.Define): Save the MethodBuilders for add/remove.
14765
14766         * typemanager.cs: Use pair here too.
14767
14768         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
14769         DictionaryEntry requires the first argument to be non-null.  
14770
14771         (enum_declaration): Compute full name for registering the
14772         enumeration.
14773
14774         (delegate_declaration): Instead of using
14775         formal_parameter_list, use opt_formal_parameter_list as the list
14776         can be empty.
14777
14778         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
14779         (EventParsing): New property that controls whether `add' and
14780         `remove' are returned as tokens or identifiers (for events);
14781
14782 2001-12-19  Ravi Pratap  <ravi@ximian.com>
14783
14784         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
14785         use MyEventBuilder only and let it wrap the real builder for us.
14786
14787         (MyEventBuilder): Revamp constructor etc.
14788
14789         Implement all operations that we perform on EventBuilder in precisely the same
14790         way here too.
14791
14792         (FindMembers): Update to use the EventBuilder member.
14793
14794         (Event.Emit): Update accordingly.
14795
14796 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14797
14798         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14799         by calling the appropriate methods.
14800
14801         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14802         useful.
14803
14804         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14805
14806 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14807
14808         * delegate.cs (Delegate.Populate): Check that the return type
14809         and various parameters types are indeed accessible.
14810
14811         * class.cs (Constructor.Define): Same here.
14812
14813         (Field.Define): Ditto.
14814
14815         (Event.Define): Ditto.
14816
14817         (Operator.Define): Check that the underlying Method defined itself
14818         correctly - so it's MethodBuilder should not be null.
14819
14820         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14821         expression happens to be null.
14822
14823         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14824         members but as of now we don't seem to be able to do anything really useful with it.
14825
14826         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14827         not the EventBuilder.
14828
14829 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14830
14831         * cs-tokenizer.cs: Add support for defines.
14832         Add support for #if, #elif, #else, #endif
14833
14834         (eval_var): evaluates a variable.
14835         (eval): stubbed for evaluating functions.
14836
14837         * cs-parser.jay: Pass the defines information
14838
14839         * driver.cs: Add --define command line option.
14840
14841         * decl.cs: Move MemberCore here.
14842
14843         Make it the base class for DeclSpace.  This allows us to catch and
14844         report 108 and 109 for everything now.
14845
14846         * class.cs (TypeContainer.Define): Extract all the members
14847         before populating and emit the warning 108 (new keyword required
14848         to override) instead of having each member implement this.
14849
14850         (MemberCore.Define): New abstract method, we will be using this in
14851         the warning reporting engine in Populate.
14852
14853         (Operator.Define): Adjust to new MemberCore protocol. 
14854
14855         * const.cs (Const): This does not derive from Expression, it is a
14856         temporary object we use to create fields, it is a MemberCore. 
14857
14858         * class.cs (Method.Define): Allow the entry point to be in a
14859         specific class.
14860
14861         * driver.cs: Rewrite the argument handler to clean it up a bit.
14862
14863         * rootcontext.cs: Made it just an auxiliary namespace feature by
14864         making everything static.
14865
14866         * driver.cs: Adapt code to use RootContext type name instead of
14867         instance variable.
14868
14869         * delegate.cs: Remove RootContext argument.
14870
14871         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14872         argument. 
14873
14874         * class.cs (Event.Define): The lookup can fail.
14875
14876         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14877
14878         * expression.cs: Resolve the this instance before invoking the code.
14879
14880 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14881
14882         * cs-parser.jay: Add a production in element_access that allows
14883         the thing to become a "type" reference.  This way we can parse
14884         things like "(string [])" as a type.
14885
14886         Note that this still does not handle the more complex rules of
14887         casts. 
14888
14889
14890         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14891
14892         * ecore.cs: (CopyNewMethods): new utility function used to
14893         assemble the list of methods from running FindMembers.
14894
14895         (MemberLookup): Rework FindMembers so that 
14896
14897 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14898
14899         * class.cs (TypeContainer): Remove Delegates who fail to be
14900         defined.
14901
14902         * delegate.cs (Populate): Verify that we dont get null return
14903         values.   TODO: Check for AsAccessible.
14904
14905         * cs-parser.jay: Use basename to emit error 574 (destructor should
14906         have the same name as container class), not the full name.
14907
14908         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14909         possible representation.  
14910
14911         Also implements integer type suffixes U and L.
14912
14913 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14914
14915         * expression.cs (ArrayCreation.DoResolve): We need to do the
14916         argument resolution *always*.
14917
14918         * decl.cs: Make this hold the namespace.  Hold the root context as
14919         well.
14920         (LookupType): Move here.
14921
14922         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14923
14924         * location.cs (Row, Name): Fixed the code, it was always returning
14925         references to the first file.
14926
14927         * interface.cs: Register properties defined through interfaces.
14928
14929         * driver.cs: Add support for globbing on the command line
14930
14931         * class.cs (Field): Make it derive from MemberCore as well.
14932         (Event): ditto.
14933
14934 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14935
14936         * class.cs (Event::Define): Check that the type of the event is a delegate
14937         type else flag error #66.
14938
14939         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14940         same.
14941
14942         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14943         values of EntryPoint, CharSet etc etc.
14944
14945         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14946
14947         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14948         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14949         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14950         which needs this to do its work.
14951
14952         * ../errors/cs0066.cs : Add.
14953
14954 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14955
14956         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14957         helper functions.
14958
14959         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14960         clears out the parameters field.
14961         (MemberSignatureCompare): Cleanup
14962
14963         (MemberCore): New base class used to share code between MethodCore
14964         and Property.
14965
14966         (RegisterRequiredImplementations) BindingFlags.Public requires
14967         either BindingFlags.Instace or Static.  Use instance here.
14968
14969         (Property): Refactored code to cope better with the full spec.
14970
14971         * parameter.cs (GetParameterInfo): Return an empty array instead
14972         of null on error.
14973
14974         * class.cs (Property): Abstract or extern properties have no bodies.
14975
14976         * parameter.cs (GetParameterInfo): return a zero-sized array.
14977
14978         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14979         method modifier validation to the typecontainer so we can reuse
14980         this on properties.
14981
14982         (MethodCore.ParameterTypes): return an empty sized array of types.
14983
14984         (Property.Define): Test property modifier validity.
14985
14986         Add tests for sealed/override too.
14987
14988         (Method.Emit): abstract or extern methods have no bodies.
14989
14990 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14991
14992         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14993         thing.
14994
14995         (Method::Define, ::Emit): Modify accordingly.
14996
14997         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14998
14999         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
15000
15001         * makefile: Pass in /unsafe.
15002
15003 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
15004
15005         * class.cs (MakeKey): Kill routine.
15006
15007         * class.cs (TypeContainer.Define): Correctly define explicit
15008         method implementations (they require the full interface name plus
15009         the method name).
15010
15011         * typemanager.cs: Deply the PtrHashtable here and stop using the
15012         lame keys.  Things work so much better.
15013
15014         This of course broke everyone who depended on `RegisterMethod' to
15015         do the `test for existance' test.  This has to be done elsewhere.
15016
15017         * support.cs (PtrHashtable): A hashtable that avoid comparing with
15018         the object stupid Equals method (because, that like fails all over
15019         the place).  We still do not use it.
15020
15021         * class.cs (TypeContainer.SetRequiredInterface,
15022         TypeContainer.RequireMethods): Killed these two routines and moved
15023         all the functionality to RegisterRequiredImplementations.
15024
15025         (TypeContainer.RegisterRequiredImplementations): This routine now
15026         registers all the implementations required in an array for the
15027         interfaces and abstract methods.  We use an array of structures
15028         which can be computed ahead of time to reduce memory usage and we
15029         also assume that lookups are cheap as most classes will not
15030         implement too many interfaces.
15031
15032         We also avoid creating too many MethodSignatures.
15033
15034         (TypeContainer.IsInterfaceMethod): Update and optionally does not
15035         clear the "pending" bit if we find that there are problems with
15036         the declaration.
15037
15038         (TypeContainer.VerifyPendingMethods): Update to report errors of
15039         methods that look like implementations but are not.
15040
15041         (TypeContainer.Define): Add support for explicit interface method
15042         implementation. 
15043
15044 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
15045
15046         * typemanager.cs: Keep track of the parameters here instead of
15047         being a feature of the TypeContainer.
15048
15049         * class.cs: Drop the registration of parameters here, as
15050         InterfaceMethods are also interface declarations.
15051
15052         * delegate.cs: Register methods with the TypeManager not only with
15053         the TypeContainer.  This code was buggy.
15054
15055         * interface.cs: Full registation here.
15056
15057 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
15058
15059         * expression.cs: Remove reducer for binary expressions, it can not
15060         be done this way.
15061
15062         * const.cs: Put here the code that used to go into constant.cs
15063
15064         * constant.cs: Put here the code for constants, this is a new base
15065         class for Literals.
15066
15067         * literal.cs: Make Literal derive from Constant.
15068
15069 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
15070
15071         * statement.cs (Return.Emit): Report error 157 if the user
15072         attempts to return from a finally block.
15073
15074         (Return.Emit): Instead of emitting a return, jump to the end of
15075         the function.
15076
15077         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
15078         LocalBuilder to store the result of the function.  ReturnLabel is
15079         the target where we jump.
15080
15081
15082 2001-12-09  Radek Doulik  <rodo@ximian.com>
15083
15084         * cs-parser.jay: remember alias in current namespace
15085
15086         * ecore.cs (SimpleName::DoResolve): use aliases for types or
15087         namespaces
15088
15089         * class.cs (LookupAlias): lookup alias in my_namespace
15090
15091         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
15092         aliases hashtable
15093         (LookupAlias): lookup alias in this and if needed in parent
15094         namespaces
15095
15096 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
15097
15098         * support.cs: 
15099
15100         * rootcontext.cs: (ModuleBuilder) Made static, first step into
15101         making things static.  I need this to avoid passing the
15102         TypeContainer when calling ParameterType.
15103
15104         * support.cs (InternalParameters.ParameterType): Remove ugly hack
15105         that did string manipulation to compute the type and then call
15106         GetType.  Use Parameter.ParameterType instead.
15107
15108         * cs-tokenizer.cs: Consume the suffix for floating values.
15109
15110         * expression.cs (ParameterReference): figure out whether this is a
15111         reference parameter or not.  Kill an extra variable by computing
15112         the arg_idx during emission.
15113
15114         * parameter.cs (Parameters.GetParameterInfo): New overloaded
15115         function that returns whether a parameter is an out/ref value or not.
15116
15117         (Parameter.ParameterType): The type of the parameter (base,
15118         without ref/out applied).
15119
15120         (Parameter.Resolve): Perform resolution here.
15121         (Parameter.ExternalType): The full type (with ref/out applied).
15122
15123         * statement.cs (Using.Emit, Using.EmitExpression): Implement
15124         support for expressions on the using statement.
15125
15126 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
15127
15128         * statement.cs (Using.EmitLocalVariableDecls): Split the
15129         localvariable handling of the using statement.
15130
15131         (Block.EmitMeta): Keep track of variable count across blocks.  We
15132         were reusing slots on separate branches of blocks.
15133
15134         (Try.Emit): Emit the general code block, we were not emitting it. 
15135
15136         Check the type of the declaration to be an IDisposable or
15137         something that can be implicity converted to it. 
15138
15139         Emit conversions if required.
15140
15141         * ecore.cs (EmptyExpression): New utility class.
15142         (Expression.ImplicitConversionExists): New utility function.
15143
15144 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
15145
15146         * statement.cs (Using): Implement.
15147
15148         * expression.cs (LocalVariableReference): Support read only variables.
15149
15150         * statement.cs: Remove the explicit emit for the Leave opcode.
15151         (VariableInfo): Add a readonly field.
15152
15153 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
15154
15155         * ecore.cs (ConvCast): new class used to encapsulate the various
15156         explicit integer conversions that works in both checked and
15157         unchecked contexts.
15158
15159         (Expression.ConvertNumericExplicit): Use new ConvCast class to
15160         properly generate the overflow opcodes.
15161
15162 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
15163
15164         * statement.cs: The correct type for the EmptyExpression is the
15165         element_type, not the variable type.  Ravi pointed this out.
15166
15167 2001-12-04  Ravi Pratap  <ravi@ximian.com>
15168
15169         * class.cs (Method::Define): Handle PInvoke methods specially
15170         by using DefinePInvokeMethod instead of the usual one.
15171
15172         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
15173         above to do the task of extracting information and defining the method.
15174
15175 2001-12-04  Ravi Pratap  <ravi@ximian.com>
15176
15177         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
15178         of the condition for string type.
15179
15180         (Emit): Move that here. 
15181
15182         (ArrayCreation::CheckIndices): Keep string literals in their expression
15183         form.
15184
15185         (EmitDynamicInitializers): Handle strings appropriately.
15186
15187 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
15188
15189         * codegen.cs (EmitContext): Replace multiple variables with a
15190         single pointer to the current Switch statement.
15191
15192         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
15193         EmitContext.
15194
15195 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
15196
15197         * statement.cs 
15198
15199         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
15200         default'.
15201
15202         (Foreach.Emit): Foreach on arrays was not setting
15203         up the loop variables (for break/continue).
15204
15205         (GotoCase): Semi-implented.
15206
15207 2001-12-03  Ravi Pratap  <ravi@ximian.com>
15208
15209         * attribute.cs (CheckAttribute): Handle system attributes by using
15210         Attribute.GetAttributes to examine information we need.
15211
15212         (GetValidPlaces): Same here.
15213
15214         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
15215
15216         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
15217
15218         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
15219
15220         (Method::Define): Set appropriate flags if we have a DllImport attribute.
15221
15222         (Method::Emit): Handle the case when we are a PInvoke method.
15223
15224 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
15225
15226         * expression.cs: Use ResolveWithSimpleName on compound names.
15227
15228 2001-12-02  Ravi Pratap  <ravi@ximian.com>
15229
15230         * constant.cs (EmitConstant): Make sure we resolve the associated expression
15231         before trying to reduce it.
15232
15233         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
15234
15235         * constant.cs (LookupConstantValue): Implement.
15236
15237         (EmitConstant): Use the above in emitting the constant.
15238
15239         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
15240         that are user-defined by doing a LookupConstantValue on them.
15241
15242         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
15243         too, like above.
15244
15245 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
15246
15247         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
15248
15249         (BaseAccess.DoResolve): Implement.
15250
15251         (MemberAccess.DoResolve): Split this routine into a
15252         ResolveMemberAccess routine that can be used independently
15253
15254 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
15255
15256         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
15257         As that share bits of the implementation.  Is returns a boolean,
15258         while As returns the Type that is being probed.
15259
15260 2001-12-01  Ravi Pratap  <ravi@ximian.com>
15261
15262         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
15263         instead of a Literal - much easier.
15264
15265         (EnumInTransit): Remove - utterly useless :-)
15266
15267         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
15268
15269         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
15270
15271         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
15272         chain when we have no associated expression.
15273
15274 2001-11-30  Ravi Pratap  <ravi@ximian.com>
15275
15276         * constant.cs (Define): Use Location while reporting the errror.
15277
15278         Also emit a warning when 'new' is used and there is no inherited
15279         member to hide.
15280
15281         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
15282         populated.
15283
15284         (LookupEnumValue): Implement to lookup an enum member's value and define it
15285         if necessary.
15286
15287         (Populate): Re-write accordingly to use the above routine.
15288
15289 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
15290
15291         * expression.cs (This): Fix prototype for DoResolveLValue to
15292         override the base class DoResolveLValue.
15293
15294         * cs-parser.cs: Report errors cs574 and cs575 (destructor
15295         declarations) 
15296
15297         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
15298         (we need to load the address of the field here).  This fixes
15299         test-22. 
15300
15301         (FieldExpr.DoResolveLValue): Call the DoResolve
15302         function to initialize the Instance expression.
15303
15304         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
15305         correctly the GetEnumerator operation on a value type.
15306
15307         * cs-parser.jay: Add more simple parsing error catches.
15308
15309         * statement.cs (Switch): Add support for string switches.
15310         Handle null specially.
15311
15312         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
15313
15314 2001-11-28  Ravi Pratap  <ravi@ximian.com>
15315
15316         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
15317
15318         (declare_local_constant): New helper function.
15319
15320         * statement.cs (AddConstant): Keep a separate record of constants
15321
15322         (IsConstant): Implement to determine if a variable is a constant.
15323
15324         (GetConstantExpression): Implement.
15325
15326         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
15327
15328         * statement.cs (IsVariableDefined): Re-write.
15329
15330 2001-11-27  Ravi Pratap  <ravi@ximian.com>
15331
15332         * class.cs (TypeContainer::FindMembers): Look for constants
15333         in the case when we are looking for MemberTypes.Field
15334
15335         * expression.cs (MemberAccess::DoResolve): Check that in the
15336         case we are a FieldExpr and a Literal, we are not being accessed
15337         by an instance reference.
15338
15339         * cs-parser.jay (local_constant_declaration): Implement.
15340
15341         (declaration_statement): Implement for constant declarations.
15342
15343 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
15344
15345         * statement.cs (Switch): Catch double defaults.
15346
15347         (Switch): More work on the switch() statement
15348         implementation.  It works for integral values now, need to finish
15349         string support.
15350
15351
15352 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15353
15354         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
15355         integer literals into other integer literals.  To be used by
15356         switch. 
15357
15358 2001-11-24  Ravi Pratap  <ravi@ximian.com>
15359
15360         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
15361         some memory.
15362
15363         (EmitDynamicInitializers): Cope with the above since we extract data
15364         directly from ArrayData now.
15365
15366         (ExpectInitializers): Keep track of whether initializers are mandatory
15367         or not.
15368
15369         (Bounds): Make it a hashtable to prevent the same dimension being 
15370         recorded for every element in that dimension.
15371
15372         (EmitDynamicInitializers): Fix bug which prevented the Set array method
15373         from being found.
15374
15375         Also fix bug which was causing the indices to be emitted in the reverse
15376         order.
15377
15378 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15379
15380         * expression.cs (ArrayCreation): Implement the bits that Ravi left
15381         unfinished.  They do not work, because the underlying code is
15382         sloppy.
15383
15384 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15385
15386         * cs-parser.jay: Remove bogus fixme.
15387
15388         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
15389         on Switch statement.
15390
15391 2001-11-23  Ravi Pratap  <ravi@ximian.com>
15392
15393         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
15394         the same. 
15395
15396         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
15397         parameter. Apparently, any expression is allowed. 
15398
15399         (ValidateInitializers): Update accordingly.
15400
15401         (CheckIndices): Fix some tricky bugs thanks to recursion.
15402
15403         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
15404         I was being completely brain-dead.
15405
15406         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
15407         and re-write acordingly.
15408
15409         (DelegateInvocation): Re-write accordingly.
15410
15411         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
15412
15413         (MakeByteBlob): Handle types more correctly.
15414
15415         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
15416         initialization from expressions but it is incomplete because I am a complete
15417         Dodo :-|
15418
15419 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15420
15421         * statement.cs (If.Emit): Fix a bug that generated incorrect code
15422         on If.  Basically, we have to return `true' (ie, we do return to
15423         our caller) only if both branches of the if return.
15424
15425         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
15426         short-circuit operators, handle them as short circuit operators. 
15427
15428         (Cast.DoResolve): Resolve type.
15429         (Cast.Cast): Take an expression as the target type.
15430
15431         * cs-parser.jay (cast_expression): Remove old hack that only
15432         allowed a limited set of types to be handled.  Now we take a
15433         unary_expression and we resolve to a type during semantic
15434         analysis.
15435
15436         Use the grammar productions from Rhys to handle casts (this is
15437         not complete like Rhys syntax yet, we fail to handle that corner
15438         case that C# has regarding (-x), but we will get there.
15439
15440 2001-11-22  Ravi Pratap  <ravi@ximian.com>
15441
15442         * class.cs (EmitFieldInitializer): Take care of the case when we have a
15443         field which is an array type.
15444
15445         * cs-parser.jay (declare_local_variables): Support array initialization too.
15446
15447         * typemanager.cs (MakeKey): Implement.
15448
15449         (everywhere): Use the above appropriately.
15450
15451         * cs-parser.jay (for_statement): Update for array initialization while
15452         declaring variables.
15453
15454         * ecore.cs : The error message was correct, it's the variable's names that
15455         were misleading ;-) Make the code more readable.
15456
15457         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
15458         the correct type etc.
15459
15460         (ConvertExplicit): Handle Enum types by examining the underlying type.
15461
15462 2001-11-21  Ravi Pratap  <ravi@ximian.com>
15463
15464         * parameter.cs (GetCallingConvention): Always return
15465         CallingConventions.Standard for now.
15466
15467 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15468
15469         * expression.cs (Binary.ResolveOperator): Update the values of `l'
15470         and `r' after calling DoNumericPromotions.
15471
15472         * ecore.cs: Fix error message (the types were in the wrong order).
15473
15474         * statement.cs (Foreach.ProbeCollectionType): Need to pass
15475         BindingFlags.Instance as well 
15476
15477         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
15478         implicit int literal conversion in an empty cast so that we
15479         propagate the right type upstream.
15480
15481         (UnboxCast): new class used to unbox value types.
15482         (Expression.ConvertExplicit): Add explicit type conversions done
15483         by unboxing.
15484
15485         (Expression.ImplicitNumericConversion): Oops, forgot to test for
15486         the target type before applying the implicit LongLiterals to ULong
15487         literal cast.
15488
15489 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
15490
15491         * cs-parser.jay (for_statement): Reworked the way For works: now
15492         we declare manually any variables that are introduced in
15493         for_initializer to solve the problem of having out-of-band code
15494         emition (that is what got for broken).
15495
15496         (declaration_statement): Perform the actual variable declaration
15497         that used to be done in local_variable_declaration here.
15498
15499         (local_variable_declaration): Do not declare anything, just pass
15500         the information on a DictionaryEntry
15501
15502 2001-11-20  Ravi Pratap  <ravi@ximian.com>
15503
15504         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
15505         re-write of the logic to now make it recursive.
15506
15507         (UpdateIndices): Re-write accordingly.
15508
15509         Store element data in a separate ArrayData list in the above methods.
15510
15511         (MakeByteBlob): Implement to dump the array data into a byte array.
15512
15513 2001-11-19  Ravi Pratap  <ravi@ximian.com>
15514
15515         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
15516         into CheckIndices.
15517
15518         * constant.cs (Define): Implement.
15519
15520         (EmitConstant): Re-write fully.
15521
15522         Pass in location info.
15523
15524         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
15525         respectively.
15526
15527         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
15528         DictionaryEntry since we need location info too.
15529
15530         (constant_declaration): Update accordingly.
15531
15532         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
15533         code into another method : UpdateIndices.
15534
15535 2001-11-18  Ravi Pratap  <ravi@ximian.com>
15536
15537         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
15538         some type checking etc.
15539
15540 2001-11-17  Ravi Pratap  <ravi@ximian.com>
15541
15542         * expression.cs (ArrayCreation::ValidateInitializers): Implement
15543         bits to provide dimension info if the user skips doing that.
15544
15545         Update second constructor to store the rank correctly.
15546
15547 2001-11-16  Ravi Pratap  <ravi@ximian.com>
15548
15549         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
15550         and try to implement.
15551
15552         * ../errors/cs0150.cs : Add.
15553
15554         * ../errors/cs0178.cs : Add.
15555
15556 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
15557
15558         * statement.cs: Implement foreach on multi-dimensional arrays. 
15559
15560         * parameter.cs (Parameters.GetParameterByName): Also lookup the
15561         name of the params argument.
15562
15563         * expression.cs: Use EmitStoreOpcode to get the right opcode while
15564         initializing the array.
15565
15566         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
15567         we can use this elsewhere.
15568
15569         * statement.cs: Finish implementation of foreach for single
15570         dimension arrays.
15571
15572         * cs-parser.jay: Use an out-of-band stack to pass information
15573         around, I wonder why I need this.
15574
15575         foreach_block: Make the new foreach_block the current_block.
15576
15577         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
15578         function used to return a static Parameters structure.  Used for
15579         empty parameters, as those are created very frequently.
15580
15581         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
15582
15583 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15584
15585         * interface.cs : Default modifier is private, not public. The
15586         make verify test passes again.
15587
15588 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15589
15590         * support.cs (ReflectionParameters): Fix logic to determine
15591         whether the last parameter is a params one. Test 9 passes again.
15592
15593         * delegate.cs (Populate): Register the builders we define with
15594         RegisterParameterForBuilder. Test 19 passes again.
15595
15596         * cs-parser.jay (property_declaration): Reference $6 instead
15597         of $$ to get at the location.
15598
15599         (indexer_declaration): Similar stuff.
15600
15601         (attribute): Ditto.
15602
15603         * class.cs (Property): Register parameters for the Get and Set methods
15604         if they exist. Test 23 passes again.
15605
15606         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
15607         call to EmitArguments as we are sure there aren't any params arguments. 
15608         Test 32 passes again.
15609
15610         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
15611         IndexOutOfRangeException. 
15612
15613         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
15614         Test 33 now passes again.
15615
15616 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
15617
15618         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
15619         broke a bunch of things.  Will have to come up with a better way
15620         of tracking locations.
15621
15622         * statement.cs: Implemented foreach for single dimension arrays.
15623
15624 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15625
15626         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
15627         an error.  This removes the lookup from the critical path.
15628
15629         * cs-parser.jay: Removed use of temporary_loc, which is completely
15630         broken. 
15631
15632 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
15633
15634         * support.cs (ReflectionParameters.ParameterModifier): Report
15635         whether the argument is a PARAMS argument or not.
15636
15637         * class.cs: Set the attribute `ParamArrayAttribute' on the
15638         parameter argument.
15639
15640         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
15641         and cons_param_array_attribute (ConstructorInfo for
15642         ParamArrayAttribute)., 
15643
15644         * codegen.cs: Emit the return using the `Return' statement, that
15645         way we can report the error correctly for missing return values. 
15646
15647         * class.cs (Method.Emit): Clean up.
15648
15649         * expression.cs (Argument.Resolve): Take another argument: the
15650         location where this argument is used.  Notice that this is not
15651         part of the "Argument" class as to reduce the size of the
15652         structure (we know the approximate location anyways).
15653
15654         Test if the argument is a variable-reference, if not, then
15655         complain with a 206.
15656
15657         (Argument.Emit): Emit addresses of variables.
15658
15659         (Argument.FullDesc): Simplify.
15660
15661         (Invocation.DoResolve): Update for Argument.Resolve.
15662
15663         (ElementAccess.DoResolve): ditto.
15664
15665         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
15666         method should be virtual, as this method is always virtual.
15667
15668         (NewDelegate.DoResolve): Update for Argument.Resolve.
15669
15670         * class.cs (ConstructorInitializer.DoResolve): ditto.
15671
15672         * attribute.cs (Attribute.Resolve): ditto.
15673
15674 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
15675
15676         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
15677
15678         * expression.cs (ParameterReference): Drop IStackStorage and implement
15679         IAssignMethod instead. 
15680
15681         (LocalVariableReference): ditto.
15682
15683         * ecore.cs (FieldExpr): Drop IStackStorage and implement
15684         IAssignMethod instead. 
15685
15686 2001-11-13  Miguel de Icaza <miguel@ximian.com>
15687
15688         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
15689         enumerations that are used in heavily used structures derive from
15690         byte in a laughable and pathetic attempt to reduce memory usage.
15691         This is the kind of pre-optimzations that you should not do at
15692         home without adult supervision.
15693
15694         * expression.cs (UnaryMutator): New class, used to handle ++ and
15695         -- separatedly from the other unary operators.  Cleans up the
15696         code, and kills the ExpressionStatement dependency in Unary.
15697
15698         (Unary): Removed `method' and `Arguments' from this class, making
15699         it smaller, and moving it all to SimpleCall, so I can reuse this
15700         code in other locations and avoid creating a lot of transient data
15701         strucutres when not required.
15702
15703         * cs-parser.jay: Adjust for new changes.
15704
15705 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
15706
15707         * enum.cs (Enum.Populate): If there is a failure during
15708         definition, return
15709
15710         * cs-parser.jay (opt_enum_base): we used to catch type errors
15711         here, but this is really incorrect.  The type error should be
15712         catched during semantic analysis.
15713
15714 2001-12-11  Ravi Pratap  <ravi@ximian.com>
15715
15716         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
15717         current_local_parameters as expected since I, in my stupidity, had forgotten
15718         to do this :-)
15719
15720         * attribute.cs (GetValidPlaces): Fix stupid bug.
15721
15722         * class.cs (Method::Emit): Perform check on applicability of attributes.
15723
15724         (Constructor::Emit): Ditto.
15725
15726         (Field::Emit): Ditto.
15727
15728         (Field.Location): Store location information.
15729
15730         (Property, Event, Indexer, Operator): Ditto.
15731
15732         * cs-parser.jay (field_declaration): Pass in location for each field.
15733
15734         * ../errors/cs0592.cs : Add.
15735
15736 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15737
15738         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
15739
15740         (InitCoreTypes): Update accordingly.
15741
15742         (RegisterAttrType, LookupAttr): Implement.
15743
15744         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
15745         info about the same.
15746
15747         (Resolve): Update to populate the above as necessary.
15748
15749         (Error592): Helper.
15750
15751         (GetValidPlaces): Helper to the above.
15752
15753         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
15754
15755         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
15756
15757 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15758
15759         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
15760
15761         * ../errors/cs0617.cs : Add.
15762
15763 2001-11-11  Ravi Pratap  <ravi@ximian.com>
15764
15765         * enum.cs (Emit): Rename to Populate to be more consistent with what
15766         we expect it to do and when exactly it is called.
15767
15768         * class.cs, rootcontext.cs : Update accordingly.
15769
15770         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
15771         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
15772
15773         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
15774
15775         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
15776         of a fieldinfo using the above, when dealing with a FieldBuilder.
15777
15778 2001-11-10  Ravi Pratap  <ravi@ximian.com>
15779
15780         * ../errors/cs0031.cs : Add.
15781
15782         * ../errors/cs1008.cs : Add.
15783
15784         * ../errrors/cs0543.cs : Add.
15785
15786         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
15787         enum type.
15788
15789         (FindMembers): Implement.
15790
15791         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
15792         enums and delegates too.
15793
15794         (enum_types): Rename to builder_to_enum.
15795
15796         (delegate_types): Rename to builder_to_delegate.
15797
15798         * delegate.cs (FindMembers): Implement.
15799
15800 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15801
15802         * typemanager.cs (IsEnumType): Implement.
15803
15804         * enum.cs (Emit): Re-write parts to account for the underlying type
15805         better and perform checking etc.
15806
15807         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15808         of the underlying type.
15809
15810         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15811         value
15812
15813         * enum.cs (error31): Helper to report error #31.
15814
15815         * cs-parser.jay (enum_declaration): Store location of each member too.
15816
15817         * enum.cs (member_to_location): New hashtable. 
15818
15819         (AddEnumMember): Update location hashtable.
15820
15821         (Emit): Use the location of each member while reporting errors.
15822
15823 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15824
15825         * cs-parser.jay: A for_initializer if is a
15826         local_variable_declaration really ammount to have an implicit
15827         block with the variable declaration and no initializer for for.
15828
15829         * statement.cs (For.Emit): Cope with null initializers.
15830
15831         This fixes the infinite loop on for initializers.
15832
15833 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15834
15835         * enum.cs: More cleanup.
15836
15837         * ecore.cs: Remove dead code.
15838
15839         * class.cs (Property.Emit): More simplification.
15840         (Event.Emit): ditto.
15841
15842         Reworked to have less levels of indentation.
15843
15844 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15845
15846         * class.cs (Property): Emit attributes.
15847
15848         (Field): Ditto.
15849
15850         (Event): Ditto.
15851
15852         (Indexer): Ditto.
15853
15854         (Operator): Ditto.
15855
15856         * enum.cs (Emit): Ditto.
15857
15858         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15859         Enums too.
15860
15861         * class.cs (Field, Event, etc.): Move attribute generation into the
15862         Emit method everywhere.
15863
15864         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15865         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15866         as we had no way of defining nested enums !
15867
15868         * rootcontext.cs : Adjust code accordingly.
15869
15870         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15871
15872 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15873
15874         * expression.cs (EvalConstantExpression): Move into ecore.cs
15875
15876         * enum.cs (Enum): Rename some members and make them public and readonly
15877         according to our convention.
15878
15879         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15880         nothing else.
15881
15882         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15883
15884         (Enum::Emit): Write a simple version for now which doesn't try to compute
15885         expressions. I shall modify this to be more robust in just a while.
15886
15887         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15888
15889         (TypeContainer::CloseType): Create the Enum types too.
15890
15891         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15892
15893         * expression.cs (EvalConstantExpression): Get rid of completely.
15894
15895         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15896         user-defined values and other cases.
15897
15898         (IsValidEnumLiteral): Helper function.
15899
15900         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15901         out there in the case we had a literal FieldExpr.
15902
15903         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15904
15905         (Literalize): Revamp a bit to take two arguments.
15906
15907         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15908
15909 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15910
15911         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15912
15913         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15914
15915         (Resolve): Use the above to ensure we have proper initializers.
15916
15917 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15918
15919         * expression.cs (Expression::EvalConstantExpression): New method to 
15920         evaluate constant expressions.
15921
15922         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15923
15924 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15925
15926         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15927         in an array.
15928
15929         (Binary.ResolveOperator): Handle operator != (object a, object b)
15930         and operator == (object a, object b);
15931
15932         (Binary.DoNumericPromotions): Indicate whether the numeric
15933         promotion was possible.
15934
15935         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15936         Implement.  
15937
15938         Made the ArrayAccess implement interface IAssignMethod instead of
15939         IStackStore as the order in which arguments are passed reflects
15940         this.
15941
15942         * assign.cs: Instead of using expr.ExprClass to select the way of
15943         assinging, probe for the IStackStore/IAssignMethod interfaces.
15944
15945         * typemanager.cs: Load InitializeArray definition.
15946
15947         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15948         static data that can be used to initialize arrays. 
15949
15950 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15951
15952         * expression.cs: Handle operator== and operator!= for booleans.
15953
15954         (Conditioal.Reduce): Implement reducer for the ?: operator.
15955
15956         (Conditional.Resolve): Implement dead code elimination.
15957
15958         (Binary.Resolve): Catch string literals and return a new
15959         concatenated string.
15960
15961         (Unary.Reduce): Implement reduction of unary expressions.
15962
15963         * ecore.cs: Split out the expression core handling here.
15964
15965         (Expression.Reduce): New method used to perform constant folding
15966         and CSE.  This is needed to support constant-expressions. 
15967
15968         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15969         targets, and optimize for !x.
15970
15971 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15972
15973         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15974         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15975         set custom atttributes.
15976
15977         * literal.cs (Literal::GetValue): New abstract method to return the actual
15978         value of the literal, cast as an object.
15979
15980         (*Literal): Implement GetValue method.
15981
15982         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15983         expressions to the arraylist but objects of type Argument.
15984
15985         * class.cs (TypeContainer::Emit): Emit our attributes too.
15986
15987         (Method::Emit, Constructor::Emit): Ditto.
15988
15989         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15990         to be ignoring earlier.
15991
15992 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15993
15994         * attribute.cs (AttributeSection::Define): Implement to do the business
15995         of constructing a CustomAttributeBuilder.
15996
15997         (Attribute): New trivial class. Increases readability of code.  
15998
15999         * cs-parser.jay : Update accordingly.
16000
16001         (positional_argument_list, named_argument_list, named_argument): New rules
16002
16003         (attribute_arguments): Use the above so that we are more correct.
16004
16005 2001-11-02  Ravi Pratap  <ravi@ximian.com>
16006
16007         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
16008         to perform all checks for a method with a params parameter.
16009
16010         (Invocation::OverloadResolve): Update to use the above method and therefore
16011         cope correctly with params method invocations.
16012
16013         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
16014         params too.
16015
16016         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
16017         constructors in our parent too because we can't afford to miss out on 
16018         protected ones ;-)
16019
16020         * attribute.cs (AttributeSection): New name for the class Attribute
16021
16022         Other trivial changes to improve readability.
16023
16024         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
16025         use the new class names.
16026
16027 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16028
16029         * class.cs (Method::Define): Complete definition for params types too
16030
16031         (Indexer::Define): Ditto.
16032
16033         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
16034         Cope everywhere with a request for info about the array parameter.
16035
16036 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16037
16038         * tree.cs (RecordNamespace): Fix up to check for the correct key.
16039
16040         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
16041         local_variable_type to extract the string corresponding to the type.
16042
16043         (local_variable_type): Fixup the action to use the new helper method.
16044
16045         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
16046         go.
16047
16048         * expression.cs : Clean out code which uses the above.
16049
16050 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16051
16052         * typemanager.cs (RegisterMethod): Check if we already have an existing key
16053         and bale out if necessary by returning a false.
16054
16055         (RegisterProperty): Ditto.
16056
16057         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
16058         and print out appropriate error messages.
16059
16060         * interface.cs (everywhere): Ditto.
16061
16062         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
16063         location to constructor.
16064
16065         * class.cs (Property, Event, Indexer): Update accordingly.
16066
16067         * ../errors/cs111.cs : Added.
16068
16069         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
16070         of a method, as laid down by the spec.
16071
16072         (Invocation::OverloadResolve): Use the above method.
16073
16074 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16075
16076         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
16077         now take a TypeContainer and a Parameters object.
16078
16079         (ParameterData): Modify return type of ParameterModifier method to be 
16080         Parameter.Modifier and not a string.
16081
16082         (ReflectionParameters, InternalParameters): Update accordingly.
16083
16084         * expression.cs (Argument::GetParameterModifier): Same here.
16085
16086         * support.cs (InternalParameters::ParameterType): Find a better way of determining
16087         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
16088         symbol in it at all so maybe this is only for now.
16089
16090 2001-10-30  Ravi Pratap  <ravi@ximian.com>
16091
16092         * support.cs (InternalParameters): Constructor now takes an extra argument 
16093         which is the actual Parameters class.
16094
16095         (ParameterDesc): Update to provide info on ref/out modifiers.
16096
16097         * class.cs (everywhere): Update call to InternalParameters to pass in
16098         the second argument too.
16099
16100         * support.cs (ParameterData): Add ParameterModifier, which is a method 
16101         to return the modifier info [ref/out etc]
16102
16103         (InternalParameters, ReflectionParameters): Implement the above.
16104
16105         * expression.cs (Argument::ParameterModifier): Similar function to return
16106         info about the argument's modifiers.
16107
16108         (Invocation::OverloadResolve): Update to take into account matching modifiers 
16109         too.
16110
16111         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
16112         a new SetFormalParameters object which we pass to InternalParameters.
16113
16114 2001-10-30  Ravi Pratap  <ravi@ximian.com>
16115
16116         * expression.cs (NewArray): Merge into the ArrayCreation class.
16117
16118 2001-10-29  Ravi Pratap  <ravi@ximian.com>
16119
16120         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
16121         NewUserdefinedArray into one as there wasn't much of a use in having
16122         two separate ones.
16123
16124         * expression.cs (Argument): Change field's name to ArgType from Type.
16125
16126         (Type): New readonly property which returns the proper type, taking into 
16127         account ref/out modifiers.
16128
16129         (everywhere): Adjust code accordingly for the above.
16130
16131         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
16132         whether we are emitting for a ref or out parameter.
16133
16134         * expression.cs (Argument::Emit): Use the above field to set the state.
16135
16136         (LocalVariableReference::Emit): Update to honour the flag and emit the
16137         right stuff.
16138
16139         * parameter.cs (Attributes): Set the correct flags for ref parameters.
16140
16141         * expression.cs (Argument::FullDesc): New function to provide a full desc.
16142
16143         * support.cs (ParameterData): Add method ParameterDesc to the interface.
16144
16145         (ReflectionParameters, InternalParameters): Implement the above method.
16146
16147         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
16148         reporting errors.
16149
16150         (Invocation::FullMethodDesc): Ditto. 
16151
16152 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
16153
16154         * cs-parser.jay: Add extra production for the second form of array
16155         creation. 
16156
16157         * expression.cs (ArrayCreation): Update to reflect the above
16158         change. 
16159
16160         * Small changes to prepare for Array initialization.
16161
16162 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
16163
16164         * typemanager.cs (ImplementsInterface): interface might be null;
16165         Deal with this problem;
16166
16167         Also, we do store negative hits on the cache (null values), so use
16168         this instead of calling t.GetInterfaces on the type everytime.
16169
16170 2001-10-28  Ravi Pratap  <ravi@ximian.com>
16171
16172         * typemanager.cs (IsBuiltinType): New method to help determine the same.
16173
16174         * expression.cs (New::DoResolve): Get rid of array creation code and instead
16175         split functionality out into different classes.
16176
16177         (New::FormArrayType): Move into NewBuiltinArray.
16178
16179         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
16180         quite useless.
16181
16182         (NewBuiltinArray): New class to handle creation of built-in arrays.
16183
16184         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
16185         account creation of one-dimensional arrays.
16186
16187         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
16188
16189         (NewUserdefinedArray::DoResolve): Implement.
16190
16191         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
16192
16193         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
16194         we maintain inside the TypeManager. This is necessary to perform lookups on the
16195         module builder.
16196
16197         (LookupType): Update to perform GetType on the module builders too.     
16198
16199         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
16200
16201         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
16202
16203 2001-10-23  Ravi Pratap  <ravi@ximian.com>
16204
16205         * expression.cs (New::DoResolve): Implement guts of array creation.
16206
16207         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
16208
16209 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
16210
16211         * expression.cs: Fix bug I introduced lsat night that broke
16212         Delegates. 
16213
16214         (Expression.Resolve): Report a 246 error (can not resolve name)
16215         if we find a SimpleName in the stream.
16216
16217         (Expression.ResolveLValue): Ditto.
16218
16219         (Expression.ResolveWithSimpleName): This function is a variant of
16220         ResolveName, this one allows SimpleNames to be returned without a
16221         warning.  The only consumer of SimpleNames is MemberAccess
16222
16223 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
16224
16225         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
16226         might arrive here.  I have my doubts that this is correct.
16227
16228         * statement.cs (Lock): Implement lock statement.
16229
16230         * cs-parser.jay: Small fixes to support `lock' and `using'
16231
16232         * cs-tokenizer.cs: Remove extra space
16233
16234         * driver.cs: New flag --checked, allows to turn on integer math
16235         checking. 
16236
16237         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
16238         Threading.Monitor.Exit 
16239
16240 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
16241
16242         * expression.cs (IndexerAccess::DoResolveLValue): Set the
16243         Expression Class to be IndexerAccess.
16244
16245         Notice that Indexer::DoResolve sets the eclass to Value.
16246
16247 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
16248
16249         * class.cs (TypeContainer::Emit): Emit code for indexers.
16250
16251         * assign.cs (IAssignMethod): New interface implemented by Indexers
16252         and Properties for handling assignment.
16253
16254         (Assign::Emit): Simplify and reuse code. 
16255
16256         * expression.cs (IndexerAccess, PropertyExpr): Implement
16257         IAssignMethod, clean up old code. 
16258
16259 2001-10-22  Ravi Pratap  <ravi@ximian.com>
16260
16261         * typemanager.cs (ImplementsInterface): New method to determine if a type
16262         implements a given interface. Provides a nice cache too.
16263
16264         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
16265         method.
16266
16267         (ConvertReferenceExplicit): Ditto.
16268
16269         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
16270         various methods, with correct names etc.
16271
16272         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
16273         Operator.UnaryNegation.
16274
16275         * cs-parser.jay (operator_declarator): Be a little clever in the case where
16276         we have a unary plus or minus operator.
16277
16278         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
16279         UnaryMinus.
16280
16281         * everywhere : update accordingly.
16282
16283         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
16284         respectively.
16285
16286         * class.cs (Method::Define): For the case where we are implementing a method
16287         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
16288         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
16289
16290 2001-10-21  Ravi Pratap  <ravi@ximian.com>
16291
16292         * interface.cs (FindMembers): Implement to work around S.R.E
16293         lameness.
16294
16295         * typemanager.cs (IsInterfaceType): Implement.
16296
16297         (FindMembers): Update to handle interface types too.
16298
16299         * expression.cs (ImplicitReferenceConversion): Re-write bits which
16300         use IsAssignableFrom as that is not correct - it doesn't work.
16301
16302         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
16303         and accordingly override EmitStatement.
16304
16305         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
16306         using the correct logic :-)
16307
16308 2001-10-19  Ravi Pratap  <ravi@ximian.com>
16309
16310         * ../errors/cs-11.cs : Add to demonstrate error -11 
16311
16312 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
16313
16314         * assign.cs (Assign::Resolve): Resolve right hand side first, and
16315         then pass this as a hint to ResolveLValue.
16316
16317         * expression.cs (FieldExpr): Add Location information
16318
16319         (FieldExpr::LValueResolve): Report assignment to readonly
16320         variable. 
16321
16322         (Expression::ExprClassFromMemberInfo): Pass location information.
16323
16324         (Expression::ResolveLValue): Add new method that resolves an
16325         LValue. 
16326
16327         (Expression::DoResolveLValue): Default invocation calls
16328         DoResolve. 
16329
16330         (Indexers): New class used to keep track of indexers in a given
16331         Type. 
16332
16333         (IStackStore): Renamed from LValue, as it did not really describe
16334         what this did.  Also ResolveLValue is gone from this interface and
16335         now is part of Expression.
16336
16337         (ElementAccess): Depending on the element access type
16338
16339         * typemanager.cs: Add `indexer_name_type' as a Core type
16340         (System.Runtime.CompilerServices.IndexerNameAttribute)
16341
16342         * statement.cs (Goto): Take a location.
16343
16344 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16345
16346         * delegate.cs (Delegate::VerifyDelegate): New method to verify
16347         if two delegates are compatible.
16348
16349         (NewDelegate::DoResolve): Update to take care of the case when
16350         we instantiate a delegate from another delegate.
16351
16352         * typemanager.cs (FindMembers): Don't even try to look up members
16353         of Delegate types for now.
16354
16355 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16356
16357         * delegate.cs (NewDelegate): New class to take care of delegate
16358         instantiation.
16359
16360         * expression.cs (New): Split the delegate related code out into 
16361         the NewDelegate class.
16362
16363         * delegate.cs (DelegateInvocation): New class to handle delegate 
16364         invocation.
16365
16366         * expression.cs (Invocation): Split out delegate related code into
16367         the DelegateInvocation class.
16368
16369 2001-10-17  Ravi Pratap  <ravi@ximian.com>
16370
16371         * expression.cs (New::DoResolve): Implement delegate creation fully
16372         and according to the spec.
16373
16374         (New::DoEmit): Update to handle delegates differently.
16375
16376         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
16377         because of which we were printing out arguments in reverse order !
16378
16379         * delegate.cs (VerifyMethod): Implement to check if the given method
16380         matches the delegate.
16381
16382         (FullDelegateDesc): Implement.
16383
16384         (VerifyApplicability): Implement.
16385
16386         * expression.cs (Invocation::DoResolve): Update to accordingly handle
16387         delegate invocations too.
16388
16389         (Invocation::Emit): Ditto.
16390
16391         * ../errors/cs1593.cs : Added.
16392
16393         * ../errors/cs1594.cs : Added.
16394
16395         * delegate.cs (InstanceExpression, TargetMethod): New properties.
16396
16397 2001-10-16  Ravi Pratap  <ravi@ximian.com>
16398
16399         * typemanager.cs (intptr_type): Core type for System.IntPtr
16400
16401         (InitCoreTypes): Update for the same.
16402
16403         (iasyncresult_type, asynccallback_type): Ditto.
16404
16405         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
16406         correct.
16407
16408         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
16409         too.
16410
16411         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
16412         the builders for the 4 members of a delegate type :-)
16413
16414         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
16415         type.
16416
16417         * expression.cs (New::DoResolve): Implement guts for delegate creation.
16418
16419         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
16420
16421 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
16422
16423         * statement.cs (Break::Emit): Implement.   
16424         (Continue::Emit): Implement.
16425
16426         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16427         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16428         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16429         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
16430         end loop
16431
16432         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
16433         properties that track the label for the current loop (begin of the
16434         loop and end of the loop).
16435
16436 2001-10-15  Ravi Pratap  <ravi@ximian.com>
16437
16438         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
16439         use of emitting anything at all.
16440
16441         * class.cs, rootcontext.cs : Get rid of calls to the same.
16442
16443         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
16444
16445         (Populate): Define the constructor correctly and set the implementation
16446         attributes.
16447
16448         * typemanager.cs (delegate_types): New hashtable to hold delegates that
16449         have been defined.
16450
16451         (AddDelegateType): Implement.
16452
16453         (IsDelegateType): Implement helper method.
16454
16455         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
16456
16457         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
16458         and accordingly handle it.
16459
16460         * delegate.cs (Populate): Take TypeContainer argument.
16461         Implement bits to define the Invoke method. However, I still haven't figured out
16462         how to take care of the native int bit :-(
16463
16464         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
16465         Qualify the name of the delegate, not its return type !
16466
16467         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
16468         conversion.
16469
16470         (StandardConversionExists): Checking for array types turns out to be recursive.
16471
16472         (ConvertReferenceExplicit): Implement array conversion.
16473
16474         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
16475
16476 2001-10-12  Ravi Pratap  <ravi@ximian.com>
16477
16478         * cs-parser.jay (delegate_declaration): Store the fully qualified
16479         name as it is a type declaration.
16480
16481         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
16482         readonly.
16483
16484         (DefineDelegate): Renamed from Define. Does the same thing essentially,
16485         as TypeContainer::DefineType.
16486
16487         (Populate): Method in which all the definition of the various methods (Invoke)
16488         etc is done.
16489
16490         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
16491         see.
16492
16493         (CloseDelegate): Finally creates the delegate.
16494
16495         * class.cs (TypeContainer::DefineType): Update to define delegates.
16496         (Populate, Emit and CloseType): Do the same thing here too.
16497
16498         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
16499         delegates in all these operations.
16500
16501 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
16502
16503         * expression.cs: LocalTemporary: a new expression used to
16504         reference a temporary that has been created.
16505
16506         * assign.cs: Handle PropertyAccess back here, so that we can
16507         provide the proper semantic access to properties.
16508
16509         * expression.cs (Expression::ConvertReferenceExplicit): Implement
16510         a few more explicit conversions. 
16511
16512         * modifiers.cs: `NEW' modifier maps to HideBySig.
16513
16514         * expression.cs (PropertyExpr): Make this into an
16515         ExpressionStatement, and support the EmitStatement code path. 
16516
16517         Perform get/set error checking, clean up the interface.
16518
16519         * assign.cs: recognize PropertyExprs as targets, and if so, turn
16520         them into toplevel access objects.
16521
16522 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
16523
16524         * expression.cs: PropertyExpr::PropertyExpr: use work around the
16525         SRE.
16526
16527         * typemanager.cs: Keep track here of our PropertyBuilders again to
16528         work around lameness in SRE.
16529
16530 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
16531
16532         * expression.cs (LValue::LValueResolve): New method in the
16533         interface, used to perform a second resolution pass for LValues. 
16534
16535         (This::DoResolve): Catch the use of this in static methods.
16536
16537         (This::LValueResolve): Implement.
16538
16539         (This::Store): Remove warning, assigning to `this' in structures
16540         is 
16541
16542         (Invocation::Emit): Deal with invocation of
16543         methods on value types.  We need to pass the address to structure
16544         methods rather than the object itself.  (The equivalent code to
16545         emit "this" for structures leaves the entire structure on the
16546         stack instead of a pointer to it). 
16547
16548         (ParameterReference::DoResolve): Compute the real index for the
16549         argument based on whether the method takes or not a `this' pointer
16550         (ie, the method is static).
16551
16552         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
16553         value types returned from functions when we need to invoke a
16554         method on the sturcture.
16555
16556
16557 2001-10-11  Ravi Pratap  <ravi@ximian.com>
16558
16559         * class.cs (TypeContainer::DefineType): Method to actually do the business of
16560         defining the type in the Modulebuilder or Typebuilder. This is to take
16561         care of nested types which need to be defined on the TypeBuilder using
16562         DefineNestedMethod.
16563
16564         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
16565         methods in RootContext, only ported to be part of TypeContainer.
16566
16567         (TypeContainer::GetInterfaceOrClass): Ditto.
16568
16569         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
16570
16571         * interface.cs (Interface::DefineInterface): New method. Does exactly
16572         what RootContext.CreateInterface did earlier, only it takes care of nested types 
16573         too.
16574
16575         (Interface::GetInterfaces): Move from RootContext here and port.
16576
16577         (Interface::GetInterfaceByName): Same here.
16578
16579         * rootcontext.cs (ResolveTree): Re-write.
16580
16581         (PopulateTypes): Re-write.
16582
16583         * class.cs (TypeContainer::Populate): Populate nested types too.
16584         (TypeContainer::Emit): Emit nested members too.
16585
16586         * typemanager.cs (AddUserType): Do not make use of the FullName property,
16587         instead just use the name argument passed in as it is already fully
16588         qualified.
16589
16590         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
16591         to TypeContainer mapping to see if a type is user-defined.
16592
16593         * class.cs (TypeContainer::CloseType): Implement. 
16594
16595         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
16596         the default constructor.
16597
16598         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
16599         twice.
16600
16601         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
16602
16603         * interface.cs (CloseType): Create the type here.
16604
16605         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
16606         the hierarchy.
16607
16608         Remove all the methods which are now in TypeContainer.
16609
16610 2001-10-10  Ravi Pratap  <ravi@ximian.com>
16611
16612         * delegate.cs (Define): Re-write bits to define the delegate
16613         correctly.
16614
16615 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
16616
16617         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
16618
16619         * expression.cs (ImplicitReferenceConversion): handle null as well
16620         as a source to convert to any reference type.
16621
16622         * statement.cs (Return): Perform any implicit conversions to
16623         expected return type.  
16624
16625         Validate use of return statement.  
16626
16627         * codegen.cs (EmitContext): Pass the expected return type here.
16628
16629         * class.cs (Method, Constructor, Property): Pass expected return
16630         type to EmitContext.
16631
16632 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
16633
16634         * expression.cs: Make DoResolve take an EmitContext instead of a
16635         TypeContainer.
16636
16637         Replaced `l' and `location' for `loc', for consistency.
16638
16639         (Error, Warning): Remove unneeded Tc argument.
16640
16641         * assign.cs, literal.cs, constant.cs: Update to new calling
16642         convention. 
16643
16644         * codegen.cs: EmitContext now contains a flag indicating whether
16645         code is being generated in a static method or not.
16646
16647         * cs-parser.jay: DecomposeQI, new function that replaces the old
16648         QualifiedIdentifier.  Now we always decompose the assembled
16649         strings from qualified_identifier productions into a group of
16650         memberaccesses.
16651
16652 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
16653
16654         * rootcontext.cs: Deal with field-less struct types correctly now
16655         by passing the size option to Define Type.
16656
16657         * class.cs: Removed hack that created one static field. 
16658
16659 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16660
16661         * statement.cs: Moved most of the code generation here. 
16662
16663 2001-10-09  Ravi Pratap  <ravi@ximian.com>
16664
16665         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
16666         seem very right.
16667
16668         (ElementAccess): Remove useless bits for now - keep checks as the spec
16669         says.
16670
16671 2001-10-08  Ravi Pratap  <ravi@ximian.com>
16672
16673         * expression.cs (ElementAccess::DoResolve): Remove my crap code
16674         and start performing checks according to the spec.
16675
16676 2001-10-07  Ravi Pratap  <ravi@ximian.com>
16677
16678         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
16679         rank_specifiers instead.
16680
16681         (rank_specifiers): Change the order in which the rank specifiers are stored
16682
16683         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
16684
16685         * expression.cs (ElementAccess): Implement the LValue interface too.
16686
16687 2001-10-06  Ravi Pratap  <ravi@ximian.com>
16688
16689         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
16690         except that user defined conversions are not included.
16691
16692         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
16693         perform the conversion of the return type, if necessary.
16694
16695         (New::DoResolve): Check whether we are creating an array or an object
16696         and accordingly do the needful.
16697
16698         (New::Emit): Same here.
16699
16700         (New::DoResolve): Implement guts of array creation.
16701
16702         (New::FormLookupType): Helper function.
16703
16704 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16705
16706         * codegen.cs: Removed most of the code generation here, and move the
16707         corresponding code generation bits to the statement classes. 
16708
16709         Added support for try/catch/finalize and throw.
16710
16711         * cs-parser.jay: Added support for try/catch/finalize.
16712
16713         * class.cs: Catch static methods having the flags override,
16714         virtual or abstract.
16715
16716         * expression.cs (UserCast): This user cast was not really doing
16717         what it was supposed to do.  Which is to be born in fully resolved
16718         state.  Parts of the resolution were being performed at Emit time! 
16719
16720         Fixed this code.
16721
16722 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16723
16724         * expression.cs: Implicity convert the result from UserCast.
16725
16726 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16727
16728         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
16729         prevented it from working correctly. 
16730
16731         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
16732         merely ConvertImplicit.
16733
16734 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16735
16736         * typemanager.cs: Make the LookupTypeContainer function static,
16737         and not per-instance.  
16738
16739         * class.cs: Make static FindMembers (the one that takes a Type
16740         argument). 
16741
16742         * codegen.cs: Add EmitForeach here.
16743
16744         * cs-parser.jay: Make foreach a toplevel object instead of the
16745         inline expansion, as we need to perform semantic analysis on it. 
16746
16747 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16748
16749         * expression.cs (Expression::ImplicitUserConversion): Rename to
16750         UserDefinedConversion.
16751
16752         (Expression::UserDefinedConversion): Take an extra argument specifying 
16753         whether we look for explicit user conversions too.
16754
16755         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
16756
16757         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
16758
16759         (ExplicitUserConversion): Make it a call to UserDefinedConversion
16760         with the appropriate arguments.
16761
16762         * cs-parser.jay (cast_expression): Record location too.
16763
16764         * expression.cs (Cast): Record location info.
16765
16766         (Expression::ConvertExplicit): Take location argument.
16767
16768         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
16769         to determine if we are doing explicit conversions.
16770
16771         (UserCast::Emit): Update accordingly.
16772
16773         (Expression::ConvertExplicit): Report an error if everything fails.
16774
16775         * ../errors/cs0030.cs : Add.
16776
16777 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
16778
16779         * modifiers.cs: If the ABSTRACT keyword is present, also set the
16780         virtual and newslot bits. 
16781
16782         * class.cs (TypeContainer::RegisterRequiredImplementations):
16783         Record methods we need.
16784
16785         (TypeContainer::MakeKey): Helper function to make keys for
16786         MethodBases, since the Methodbase key is useless.
16787
16788         (TypeContainer::Populate): Call RegisterRequiredImplementations
16789         before defining the methods.   
16790
16791         Create a mapping for method_builders_to_methods ahead of time
16792         instead of inside a tight loop.
16793
16794         (::RequireMethods):  Accept an object as the data to set into the
16795         hashtable so we can report interface vs abstract method mismatch.
16796
16797 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16798
16799         * report.cs: Make all of it static.
16800
16801         * rootcontext.cs: Drop object_type and value_type computations, as
16802         we have those in the TypeManager anyways.
16803
16804         Drop report instance variable too, now it is a global.
16805
16806         * driver.cs: Use try/catch on command line handling.
16807
16808         Add --probe option to debug the error reporting system with a test
16809         suite. 
16810
16811         * report.cs: Add support for exiting program when a probe
16812         condition is reached.
16813
16814 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16815
16816         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16817         we do a forcible conversion regardless of type, to check if 
16818         ForceConversion returns a null.
16819
16820         (Binary::error19): Use location to report error.
16821
16822         (Unary::error23): Use location here too.
16823
16824         * ../errors/cs0019.cs : Check in.
16825
16826         * ../errors/cs0023.cs : Check in.
16827
16828         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16829         case of a non-null MethodInfo object with a length of 0 !
16830
16831         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16832         an applicable member - according to the spec :-)
16833         Also fix logic to find members in base types.
16834
16835         (Unary::ResolveOperator): Same here.
16836
16837         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16838         as I was getting thoroughly confused between this and error19 :-)
16839
16840         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16841         (::FindMostEncompassedType): Implement.
16842         (::FindMostEncompassingType): Implement.
16843         (::StandardConversionExists): Implement.
16844
16845         (UserImplicitCast): Re-vamp. We now need info about most specific
16846         source and target types so that we can do the necessary conversions.
16847
16848         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16849         mathematical union with no duplicates.
16850
16851 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16852
16853         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16854         in order from base classes to child classes, so that we can in
16855         child classes look up in our parent for method names and
16856         attributes (required for handling abstract, virtual, new, override
16857         constructs: we need to instrospect our base class, and if we dont
16858         populate the classes in order, the introspection might be
16859         incorrect.  For example, a method could query its parent before
16860         the parent has any methods and would determine that the parent has
16861         no abstract methods (while it could have had them)).
16862
16863         (RootContext::CreateType): Record the order in which we define the
16864         classes.
16865
16866 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16867
16868         * class.cs (TypeContainer::Populate): Also method definitions can
16869         fail now, keep track of this.
16870
16871         (TypeContainer::FindMembers): Implement support for
16872         DeclaredOnly/noDeclaredOnly flag.
16873
16874         (Constructor::Emit) Return the ConstructorBuilder.
16875
16876         (Method::Emit) Return the MethodBuilder. 
16877         Check for abstract or virtual methods to be public.
16878
16879         * rootcontext.cs (RootContext::CreateType): Register all the
16880         abstract methods required for the class to be complete and the
16881         interface methods that must be implemented. 
16882
16883         * cs-parser.jay: Report error 501 (method requires body if it is
16884         not marked abstract or extern).
16885
16886         * expression.cs (TypeOf::Emit): Implement.
16887
16888         * typemanager.cs: runtime_handle_type, new global type.
16889
16890         * class.cs (Property::Emit): Generate code for properties.
16891
16892 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16893
16894         * expression.cs (Unary::ResolveOperator): Find operators on base type
16895         too - we now conform exactly to the spec.
16896
16897         (Binary::ResolveOperator): Same here.
16898
16899         * class.cs (Operator::Define): Fix minor quirk in the tests.
16900
16901         * ../errors/cs0215.cs : Added.
16902
16903         * ../errors/cs0556.cs : Added.
16904
16905         * ../errors/cs0555.cs : Added.
16906
16907 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16908
16909         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16910         single integer which is really efficient
16911
16912 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16913
16914         *  expression.cs (Expression::ImplicitUserConversion): Use location
16915         even in the case when we are examining True operators.
16916  
16917         * class.cs (Operator::Define): Perform extensive checks to conform
16918         with the rules for operator overloading in the spec.
16919
16920         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16921         some of the other conversions mentioned in the spec.
16922
16923         * typemanager.cs (array_type): New static member for the System.Array built-in
16924         type.
16925
16926         (cloneable_interface): For System.ICloneable interface.
16927
16928         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16929         we start resolving the tree and populating types.
16930
16931         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16932  
16933 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16934
16935         * expression.cs (Expression::ExprClassFromMemberInfo,
16936         Expression::Literalize): Create literal expressions from
16937         FieldInfos which are literals.
16938
16939         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16940         type casts, because they were wrong.  The test suite in tests
16941         caught these ones.
16942
16943         (ImplicitNumericConversion): ushort to ulong requires a widening
16944         cast. 
16945
16946         Int32 constant to long requires widening cast as well.
16947
16948         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16949         for integers because the type on the stack is not i4.
16950
16951 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16952
16953         * expression.cs (report118): require location argument. 
16954
16955         * parameter.cs: Do not dereference potential null value.
16956
16957         * class.cs: Catch methods that lack the `new' keyword when
16958         overriding a name.  Report warnings when `new' is used without
16959         anything being there to override.
16960
16961         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16962
16963         * class.cs: Only add constructor to hashtable if it is non-null
16964         (as now constructors can fail on define).
16965
16966         (TypeManager, Class, Struct): Take location arguments.
16967
16968         Catch field instance initialization in structs as errors.
16969
16970         accepting_filter: a new filter for FindMembers that is static so
16971         that we dont create an instance per invocation.
16972
16973         (Constructor::Define): Catch errors where a struct constructor is
16974         parameterless 
16975
16976         * cs-parser.jay: Pass location information for various new
16977         constructs. 
16978
16979         * delegate.cs (Delegate): take a location argument.
16980
16981         * driver.cs: Do not call EmitCode if there were problesm in the
16982         Definition of the types, as many Builders wont be there. 
16983
16984         * decl.cs (Decl::Decl): Require a location argument.
16985
16986         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16987         into integers, and find the most appropiate integer for it.
16988
16989         * literal.cs: Implement ULongLiteral.
16990
16991         * rootcontext.cs: Provide better information about the location of
16992         failure when CreateType fails.
16993
16994 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16995
16996         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16997         as well.
16998
16999         * expression.cs (Binary::CheckShiftArguments): Add missing type
17000         computation.
17001         (Binary::ResolveOperator): Add type to the logical and and logical
17002         or, Bitwise And/Or and Exclusive Or code paths, it was missing
17003         before.
17004
17005         (Binary::DoNumericPromotions): In the case where either argument
17006         is ulong (and most signed types combined with ulong cause an
17007         error) perform implicit integer constant conversions as well.
17008
17009 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17010
17011         * expression.cs (UserImplicitCast): Method should always be
17012         non-null. 
17013         (Invocation::BetterConversion): Simplified test for IntLiteral.
17014
17015         (Expression::ImplicitNumericConversion): Split this routine out.
17016         Put the code that performs implicit constant integer conversions
17017         here. 
17018
17019         (Expression::Resolve): Become a wrapper around DoResolve so we can
17020         check eclass and type being set after resolve.
17021
17022         (Invocation::Badness): Remove this dead function
17023
17024         (Binary::ResolveOperator): Do not compute the expensive argumnets
17025         unless we have a union for it.
17026
17027         (Probe::Emit): Is needs to do an isinst and then
17028         compare against null.
17029
17030         (::CanConvert): Added Location argument.  If the Location argument
17031         is null (Location.Null), then we do not report errors.  This is
17032         used by the `probe' mechanism of the Explicit conversion.  We do
17033         not want to generate an error for something that the user
17034         explicitly requested to be casted.  But the pipeline for an
17035         explicit cast first tests for potential implicit casts.
17036
17037         So for now, if the Location is null, it means `Probe only' to
17038         avoid adding another argument.   Might have to revise this
17039         strategy later.
17040
17041         (ClassCast): New class used to type cast objects into arbitrary
17042         classes (used in Explicit Reference Conversions).
17043
17044         Implement `as' as well.
17045
17046         Reverted all the patches from Ravi below: they were broken:
17047
17048                 * The use of `level' as a mechanism to stop recursive
17049                   invocations is wrong.  That was there just to catch the
17050                   bug with a strack trace but not as a way of addressing
17051                   the problem.
17052
17053                   To fix the problem we have to *understand* what is going
17054                   on and the interactions and come up with a plan, not
17055                   just get things going.
17056
17057                 * The use of the type conversion cache that I proposed
17058                   last night had an open topic: How does this work across
17059                   protection domains.  A user defined conversion might not
17060                   be public in the location where we are applying the
17061                   conversion, a different conversion might be selected
17062                   (ie, private A->B (better) but public B->A (worse),
17063                   inside A, A->B applies, but outside it, B->A will
17064                   apply).
17065
17066                 * On top of that (ie, even if the above is solved),
17067                   conversions in a cache need to be abstract.  Ie, `To
17068                   convert from an Int to a Short use an OpcodeCast', not
17069                   `To convert from an Int to a Short use the OpcodeCast on
17070                   the variable 5' (which is what this patch was doing).
17071
17072 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17073
17074         * expression.cs (Invocation::ConversionExists): Re-write to use
17075         the conversion cache
17076
17077         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
17078         cache all conversions done, not just user-defined ones.
17079
17080         (Invocation::BetterConversion): The real culprit. Use ConversionExists
17081         to determine if a conversion exists instead of acutually trying to 
17082         perform the conversion. It's faster too.
17083
17084         (Expression::ConvertExplicit): Modify to use ConversionExists to check
17085         and only then attempt the implicit conversion.
17086
17087 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17088
17089         * expression.cs (ConvertImplicit): Use a cache for conversions
17090         already found. Check level of recursion and bail out if necessary.
17091
17092 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17093
17094         * typemanager.cs (string_concat_string_string, string_concat_object_object):
17095         Export standard methods that we expect for string operations.
17096
17097         * statement.cs (Block::UsageWarning): Track usage of variables and
17098         report the errors for not used variables.
17099
17100         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
17101         operator. 
17102
17103 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17104
17105         * codegen.cs: remove unnneded code 
17106
17107         * expression.cs: Removed BuiltinTypeAccess class
17108
17109         Fix the order in which implicit conversions are
17110         done.  
17111
17112         The previous fixed dropped support for boxed conversions (adding a
17113         test to the test suite now)
17114
17115         (UserImplicitCast::CanConvert): Remove test for source being null,
17116         that code is broken.  We should not feed a null to begin with, if
17117         we do, then we should track the bug where the problem originates
17118         and not try to cover it up here.
17119
17120         Return a resolved expression of type UserImplicitCast on success
17121         rather than true/false.  Ravi: this is what I was talking about,
17122         the pattern is to use a static method as a "constructor" for
17123         objects. 
17124
17125         Also, do not create arguments until the very last minute,
17126         otherwise we always create the arguments even for lookups that
17127         will never be performed. 
17128
17129         (UserImplicitCast::Resolve): Eliminate, objects of type
17130         UserImplicitCast are born in a fully resolved state. 
17131
17132         * typemanager.cs (InitCoreTypes): Init also value_type
17133         (System.ValueType). 
17134
17135         * expression.cs (Cast::Resolve): First resolve the child expression.
17136
17137         (LValue): Add new method AddressOf to be used by
17138         the `&' operator.  
17139
17140         Change the argument of Store to take an EmitContext instead of an
17141         ILGenerator, because things like FieldExpr need to be able to call
17142         their children expression to generate the instance code. 
17143
17144         (Expression::Error, Expression::Warning): Sugar functions for
17145         reporting errors.
17146
17147         (Expression::MemberLookup): Accept a TypeContainer instead of a
17148         Report as the first argument.
17149
17150         (Expression::ResolvePrimary): Killed.  I still want to improve
17151         this as currently the code is just not right.
17152
17153         (Expression::ResolveMemberAccess): Simplify, but it is still
17154         wrong. 
17155
17156         (Unary::Resolve): Catch errors in AddressOf operators.
17157
17158         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
17159         index to a byte for the short-version, or the compiler will choose
17160         the wrong Emit call, which generates the wrong data.
17161
17162         (ParameterReference::Emit, ::Store): same.
17163
17164         (FieldExpr::AddressOf): Implement.
17165
17166         * typemanager.cs: TypeManager: made public variable instead of
17167         property.
17168
17169         * driver.cs: document --fatal.
17170
17171         * report.cs (ErrorMessage, WarningMessage): new names for the old
17172         Error and Warning classes.
17173
17174         * cs-parser.jay (member_access): Turn built-in access to types
17175         into a normal simplename
17176
17177 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17178
17179         * expression.cs (Invocation::BetterConversion): Fix to cope
17180         with q being null, since this was introducing a bug.
17181
17182         * expression.cs (ConvertImplicit): Do built-in conversions first.
17183
17184 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17185
17186         * expression.cs (UserImplicitCast::Resolve): Fix bug.
17187
17188 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17189
17190         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
17191         I had introduced long ago (what's new ?).
17192
17193         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
17194         the work of all the checking. 
17195         (ConvertImplicit): Call CanConvert and only then create object if necessary.
17196         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
17197
17198         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
17199         that is the right way. 
17200
17201         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
17202         overloading resolution. Use everywhere instead of cutting and pasting code.
17203
17204         (Binary::ResolveOperator): Use MakeUnionSet.
17205
17206         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
17207         we have to convert to bool types. Not complete yet.
17208
17209 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17210
17211         * typemanager.cs (TypeManager::CSharpName): support ushort.
17212
17213         * expression.cs (Expression::TryImplicitIntConversion): Attempts
17214         to provide an expression that performsn an implicit constant int
17215         conversion (section 6.1.6).
17216         (Expression::ConvertImplicitRequired): Reworked to include
17217         implicit constant expression conversions.
17218
17219         (Expression::ConvertNumericExplicit): Finished.
17220
17221         (Invocation::Emit): If InstanceExpression is null, then it means
17222         that we perform a call on this.
17223
17224 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
17225
17226         * expression.cs (Unary::Emit): Remove some dead code.
17227         (Probe): Implement Resolve and Emit for `is'.
17228         (Expression::ConvertImplicitRequired): Attempt to do constant
17229         expression conversions here.  Maybe should be moved to
17230         ConvertImplicit, but I am not sure.
17231         (Expression::ImplicitLongConstantConversionPossible,
17232         Expression::ImplicitIntConstantConversionPossible): New functions
17233         that tell whether is it possible to apply an implicit constant
17234         expression conversion.
17235
17236         (ConvertNumericExplicit): Started work on explicit numeric
17237         conversions.
17238
17239         * cs-parser.jay: Update operator constants.
17240
17241         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
17242         (Parameters::GetSignature): Hook up VerifyArgs here.
17243         (Parameters::VerifyArgs): Verifies that no two arguments have the
17244         same name. 
17245
17246         * class.cs (Operator): Update the operator names to reflect the
17247         ones that the spec expects (as we are just stringizing the
17248         operator names).
17249
17250         * expression.cs (Unary::ResolveOperator): Fix bug: Use
17251         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
17252         previous usage did only work for our methods.
17253         (Expression::ConvertImplicit): Handle decimal implicit numeric
17254         conversions as well.
17255         (Expression::InternalTypeConstructor): Used to invoke constructors
17256         on internal types for default promotions.
17257
17258         (Unary::Emit): Implement special handling for the pre/post
17259         increment/decrement for overloaded operators, as they need to have
17260         the same semantics as the other operators.
17261
17262         (Binary::ResolveOperator): ditto.
17263         (Invocation::ConversionExists): ditto.
17264         (UserImplicitCast::Resolve): ditto.
17265
17266 2001-09-26  Ravi Pratap  <ravi@ximian.com>
17267
17268         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
17269         operator, return after emitting body. Regression tests pass again !
17270
17271         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
17272         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
17273         (Invocation::OverloadResolve): Ditto.
17274         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
17275
17276         * everywhere : update calls to the above methods accordingly.
17277
17278 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
17279
17280         * assign.cs (Assign): Make it inherit from ExpressionStatement.
17281
17282         * expression.cs (ExpressionStatement): New base class used for
17283         expressions that can appear in statements, so that we can provide
17284         an alternate path to generate expression that do not leave a value
17285         on the stack.
17286
17287         (Expression::Emit, and all the derivatives): We no longer return
17288         whether a value is left on the stack or not.  Every expression
17289         after being emitted leaves a single value on the stack.
17290
17291         * codegen.cs (EmitContext::EmitStatementExpression): Use the
17292         facilties of ExpressionStatement if possible.
17293
17294         * cs-parser.jay: Update statement_expression.
17295
17296 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
17297
17298         * driver.cs: Change the wording of message
17299
17300 2001-09-25  Ravi Pratap  <ravi@ximian.com>
17301
17302         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
17303         the type of the expression to the return type of the method if
17304         we have an overloaded operator match ! The regression tests pass again !
17305         (Unary::ResolveOperator): Ditto.
17306
17307         * expression.cs (Invocation::ConversionExists): Correct the member lookup
17308         to find "op_Implicit", not "implicit" ;-)
17309         (UserImplicitCast): New class to take care of user-defined implicit conversions.
17310         (ConvertImplicit, ForceConversion): Take TypeContainer argument
17311
17312         * everywhere : Correct calls to the above accordingly.
17313
17314         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
17315         (ConvertImplicit): Do user-defined conversion if it exists.
17316
17317 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
17318
17319         * assign.cs: track location.
17320         (Resolve): Use implicit conversions on assignment.
17321
17322         * literal.cs: Oops.  Not good, Emit of short access values should
17323         pass (Bytes) or the wrong argument will be selected.
17324
17325         * expression.cs (Unary::Emit): Emit code for -expr.
17326
17327         (Unary::ResolveOperator): Handle `Substract' for non-constants
17328         (substract from zero from the non-constants).
17329         Deal with Doubles as well. 
17330
17331         (Expression::ConvertImplicitRequired): New routine that reports an
17332         error if no implicit conversion exists. 
17333
17334         (Invocation::OverloadResolve): Store the converted implicit
17335         expressions if we make them
17336
17337 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17338
17339         * class.cs (ConstructorInitializer): Take a Location argument.
17340         (ConstructorBaseInitializer): Same here.
17341         (ConstructorThisInitializer): Same here.
17342
17343         * cs-parser.jay : Update all calls accordingly.
17344
17345         * expression.cs (Unary, Binary, New): Take location argument.
17346         Update accordingly everywhere.
17347
17348         * cs-parser.jay : Update all calls to the above to take a location
17349         argument.
17350
17351         * class.cs : Ditto.
17352
17353 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17354
17355         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
17356         (Invocation::BetterConversion): Same here
17357         (Invocation::ConversionExists): Ditto.
17358
17359         (Invocation::ConversionExists): Implement.
17360
17361 2001-09-22  Ravi Pratap  <ravi@ximian.com>
17362
17363         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
17364         Also take an additional TypeContainer argument.
17365
17366         * All over : Pass in TypeContainer as argument to OverloadResolve.
17367
17368         * typemanager.cs (CSharpName): Update to check for the string type and return
17369         that too.
17370
17371         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
17372         a given method.
17373
17374 2001-09-21  Ravi Pratap  <ravi@ximian.com>
17375
17376         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
17377         (Invocation::BetterFunction): Implement.
17378         (Invocation::BetterConversion): Implement.
17379         (Invocation::ConversionExists): Skeleton, no implementation yet.
17380
17381         Okay, things work fine !
17382
17383 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
17384
17385         * typemanager.cs: declare and load enum_type, delegate_type and
17386         void_type. 
17387
17388         * expression.cs (Expression::Emit): Now emit returns a value that
17389         tells whether a value is left on the stack or not.  This strategy
17390         might be reveted tomorrow with a mechanism that would address
17391         multiple assignments.
17392         (Expression::report118): Utility routine to report mismatches on
17393         the ExprClass.
17394
17395         (Unary::Report23): Report impossible type/operator combination
17396         utility function.
17397
17398         (Unary::IsIncrementableNumber): Whether the type can be
17399         incremented or decremented with add.
17400         (Unary::ResolveOperator): Also allow enumerations to be bitwise
17401         complemented. 
17402         (Unary::ResolveOperator): Implement ++, !, ~,
17403
17404         (Invocation::Emit): Deal with new Emit convetion.
17405
17406         * All Expression derivatives: Updated their Emit method to return
17407         whether they leave values on the stack or not.
17408
17409         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
17410         stack for expressions that are statements. 
17411
17412 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17413
17414         * expression.cs (LValue): New interface.  Must be implemented by
17415         LValue objects.
17416         (LocalVariableReference, ParameterReference, FieldExpr): Implement
17417         LValue interface.
17418
17419         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
17420         interface for generating code, simplifies the code.
17421
17422 2001-09-20  Ravi Pratap  <ravi@ximian.com>
17423
17424         * expression.cs (everywhere): Comment out return statements in ::Resolve
17425         methods to avoid the warnings.
17426
17427 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17428
17429         * driver.cs (parse): Report error 2001 if we can not open the
17430         source file.
17431
17432         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
17433         not resolve it.
17434
17435         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
17436         object. 
17437
17438         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
17439         otherwise nested blocks end up with the same index.
17440
17441         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
17442
17443         * expression.cs:  Instead of having FIXMEs in the Resolve
17444         functions, throw exceptions so it is obvious that we are facing a
17445         bug. 
17446
17447         * cs-parser.jay (invocation_expression): Pass Location information.
17448
17449         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
17450         Use a basename for those routines because .NET does not like paths
17451         on them. 
17452
17453         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
17454         already defined.
17455
17456 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
17457
17458         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
17459         are loading the correct data types (throws an exception if not).
17460         (TypeManager::InitCoreTypes): Use CoreLookupType
17461
17462         * expression.cs (Unary::ResolveOperator): return the child
17463         expression for expressions which are just +expr.
17464         (Unary::ResolveOperator): Return negative literals for -LITERAL
17465         expressions (otherwise they are Unary {Literal}).
17466         (Invocation::Badness): Take into account `Implicit constant
17467         expression conversions'.
17468
17469         * literal.cs (LongLiteral): Implement long literal class.
17470         (IntLiteral): export the `Value' of the intliteral. 
17471
17472 2001-09-19  Ravi Pratap  <ravi@ximian.com>
17473
17474         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
17475
17476         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
17477         instead of 'Operator'
17478
17479         * expression.cs (Binary::ResolveOperator): Update accordingly.
17480         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
17481         and 'Minus'
17482
17483         * cs-parser.jay (unary_expression): Update to use the new names.
17484
17485         * gen-treedump.cs (GetUnary): Same here.
17486
17487         * expression.cs (Unary::Resolve): Implement.
17488         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
17489         operators are found instead of making noise ;-)
17490         (Unary::ResolveOperator): New method to do precisely the same thing which
17491         Binary::ResolveOperator does for Binary expressions.
17492         (Unary.method, .Arguments): Add.
17493         (Unary::OperName): Implement.   
17494         (Unary::ForceConversion): Copy and Paste !
17495
17496         * class.cs (Operator::Define): Fix a small bug for the case when we have 
17497         a unary operator.
17498
17499         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
17500         for the inbuilt operators. Only overloading works for now ;-)
17501
17502 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
17503
17504         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
17505         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
17506
17507         * expression.cs (This::Emit): Implement. 
17508         (This::Resolve): Implement.
17509         (TypeOf:Resolve): Implement.
17510         (Expression::ResolveSimpleName): Add an implicit this to instance
17511         field references. 
17512         (MemberAccess::Resolve): Deal with Parameters and Fields. 
17513         Bind instance variable to Field expressions.
17514         (FieldExpr::Instance): New field used to track the expression that
17515         represents the object instance.
17516         (FieldExpr::Resolve): Track potential errors from MemberLookup not
17517         binding 
17518         (FieldExpr::Emit): Implement.
17519
17520         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
17521         the last instruction contains a return opcode to avoid generating
17522         the last `ret' instruction (this generates correct code, and it is
17523         nice to pass the peverify output).
17524
17525         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
17526         initializer for static and instance variables.
17527         (Constructor::Emit): Allow initializer to be null in the case of
17528         static constructors.  Only emit initializer for instance
17529         constructors. 
17530
17531         (TypeContainer::FindMembers): Return a null array if there are no
17532         matches.
17533
17534         Also fix the code for the MemberTypes.Method branch, as it was not
17535         scanning that for operators (or tried to access null variables before).
17536
17537         * assign.cs (Assign::Emit): Handle instance and static fields. 
17538
17539         * TODO: Updated.
17540
17541         * driver.cs: Stop compilation if there are parse errors.
17542
17543         * cs-parser.jay (constructor_declaration): Provide default base
17544         initializer for non-static constructors.
17545         (constructor_declarator): Do not provide a default base
17546         initializers if none was specified.
17547         Catch the fact that constructors should not have parameters.
17548
17549         * class.cs: Do not emit parent class initializers for static
17550         constructors, that should be flagged as an error.
17551
17552 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17553
17554         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
17555         Move back code into TypeContainer::Populate.
17556
17557 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17558
17559         * class.cs (TypeContainer::AddConstructor): Fix the check to
17560         compare against Name, not Basename. 
17561         (Operator::OpType): Change Plus and Minus to Add and Subtract.
17562
17563         * cs-parser.jay : Update accordingly.
17564
17565         * class.cs (TypeContainer::FindMembers): For the case where we are searching
17566         for methods, don't forget to look into the operators too.
17567         (RegisterMethodBuilder): Helper method to take care of this for
17568         methods, constructors and operators.
17569         (Operator::Define): Completely revamp.
17570         (Operator.OperatorMethod, MethodName): New fields.
17571         (TypeContainer::Populate): Move the registering of builders into
17572         RegisterMethodBuilder.
17573         (Operator::Emit): Re-write.
17574
17575         * expression.cs (Binary::Emit): Comment out code path to emit method
17576         invocation stuff for the case when we have a user defined operator. I am
17577         just not able to get it right !
17578
17579 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17580
17581         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
17582         argument. 
17583
17584         (Expression::MemberLookup): Provide a version that allows to
17585         specify the MemberTypes and BindingFlags. 
17586
17587         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
17588         so it was not fetching variable information from outer blocks.
17589
17590         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
17591         Beforefieldinit as it was buggy.
17592
17593         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
17594         that Ravi put here.  
17595
17596         * class.cs (Constructor::Emit): Only emit if block is not null.
17597         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
17598         deal with this by semantically definining it as if the user had
17599         done it.
17600
17601         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
17602         constructors as we now "emit" them at a higher level.
17603
17604         (TypeContainer::DefineDefaultConstructor): Used to define the
17605         default constructors if none was provided.
17606
17607         (ConstructorInitializer): Add methods Resolve and Emit. 
17608
17609         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
17610
17611 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17612
17613         * class.cs (TypeContainer::EmitDefaultConstructor): Register
17614         the default constructor builder with our hashtable for methodbuilders
17615         to methodcores.
17616
17617         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
17618         and argument_count is 0 in which case we have a match.
17619         (Binary::ResolveOperator): More null checking and miscellaneous coding
17620         style cleanup.
17621
17622 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17623
17624         * rootcontext.cs (IsNameSpace): Compare against null.
17625
17626         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
17627
17628         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
17629         and Unary::Operator.
17630
17631         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
17632         accordingly.
17633
17634         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
17635         we have overloaded operators.
17636         (Binary::ResolveOperator): Implement the part which does the operator overload
17637         resolution.
17638
17639         * class.cs (Operator::Emit): Implement.
17640         (TypeContainer::Emit): Emit the operators we have too.
17641
17642         * expression.cs (Binary::Emit): Update to emit the appropriate code for
17643         the case when we have a user-defined operator.
17644
17645 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17646
17647         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
17648
17649 2001-09-16  Ravi Pratap  <ravi@ximian.com>
17650
17651         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
17652         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
17653         (Constructor::Emit): Implement.
17654         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
17655         if we have no work to do. 
17656         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
17657         Emit method.
17658
17659         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
17660         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
17661
17662         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
17663         of parent.parent.
17664
17665 2001-09-15  Ravi Pratap  <ravi@ximian.com>
17666
17667         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
17668         in the source.
17669         (Tree::RecordNamespace): Method to do what the name says ;-)
17670         (Tree::Namespaces): Property to get at the namespaces hashtable.
17671
17672         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
17673         keep track.
17674
17675         * rootcontext.cs (IsNamespace): Fixed it :-)
17676
17677 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17678
17679         * class.cs (TypeContainer::FindMembers): Add support for
17680         constructors. 
17681         (MethodCore): New class that encapsulates both the shared aspects
17682         of a Constructor and a Method.  
17683         (Method, Constructor): Factored pieces into MethodCore.
17684
17685         * driver.cs: Added --fatal which makes errors throw exceptions.
17686         Load System assembly as well as part of the standard library.
17687
17688         * report.cs: Allow throwing exceptions on errors for debugging.
17689
17690         * modifiers.cs: Do not use `parent', instead use the real type
17691         container to evaluate permission settings.
17692
17693         * class.cs: Put Ravi's patch back in.  He is right, and we will
17694         have to cope with the
17695
17696 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17697
17698         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
17699         FamORAssem, not FamANDAssem.
17700
17701 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17702
17703         * driver.cs: Added --parse option that only parses its input files
17704         and terminates.
17705
17706         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
17707         incorrect.  IsTopLevel is not used to tell whether an object is
17708         root_types or not (that can be achieved by testing this ==
17709         root_types).  But to see if this is a top-level *class* (not
17710         necessarly our "toplevel" container). 
17711
17712 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17713
17714         * enum.cs (Enum::Define): Modify to call the Lookup method on the
17715         parent instead of a direct call to GetType.
17716
17717 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17718
17719         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
17720         Modifiers.TypeAttr. This should just be a call to that method.
17721
17722         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
17723         object so that we can determine if we are top-level or not.
17724
17725         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
17726         TypeContainer too.
17727
17728         * enum.cs (Enum::Define): Ditto.
17729
17730         * modifiers.cs (FieldAttr): Re-write.
17731
17732         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
17733         (TypeContainer::HaveStaticConstructor): New property to provide access
17734         to precisely that info.
17735
17736         * modifiers.cs (MethodAttr): Re-write.
17737         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
17738
17739         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
17740         of top-level types as claimed.
17741
17742 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17743
17744         * expression.cs (MemberLookup): Fruitless attempt to lookup
17745         constructors.  Maybe I need to emit default constructors?  That
17746         might be it (currently .NET emits this for me automatically).
17747         (Invocation::OverloadResolve): Cope with Arguments == null.
17748         (Invocation::EmitArguments): new function, shared by the new
17749         constructor and us.
17750         (Invocation::Emit): Handle static and instance methods.  Emit
17751         proper call instruction for virtual or non-virtual invocations.
17752         (New::Emit): Implement.
17753         (New::Resolve): Implement.
17754         (MemberAccess:Resolve): Implement.
17755         (MethodGroupExpr::InstanceExpression): used conforming to the spec
17756         to track instances.
17757         (FieldExpr::Resolve): Set type.
17758
17759         * support.cs: Handle empty arguments.
17760                 
17761         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
17762         SimpleLookup): Auxiliary routines to help parse a qualifier
17763         identifier.  
17764
17765         Update qualifier_identifier rule.
17766
17767         * codegen.cs: Removed debugging messages.
17768
17769         * class.cs: Make this a global thing, this acts just as a "key" to
17770         objects that we might have around.
17771
17772         (Populate): Only initialize method_builders_to_methods once.
17773
17774         * expression.cs (PropertyExpr): Initialize type from the
17775         PropertyType. 
17776
17777         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
17778         Resolve pattern.  Attempt to implicitly convert value to boolean.
17779         Emit code.
17780
17781         * expression.cs: Set the type for the int32/int32 argument case.
17782         (Binary::ResolveOperator): Set the return type to boolean for
17783         comparission operators
17784
17785         * typemanager.cs: Remove debugging print code.
17786
17787         (Invocation::Resolve): resolve type.
17788
17789         * class.cs: Allocate a MemberInfo of the correct size, as the code
17790         elsewhere depends on the test to reflect the correct contents.
17791
17792         (Method::) Keep track of parameters, due to System.Reflection holes
17793
17794         (TypeContainer::Populate): Keep track of MethodBuilders to Method
17795         mapping here.
17796
17797         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17798         of the exact size and return that.
17799
17800         (Class::LookupMethodByBuilder): New function that maps
17801         MethodBuilders to its methods.  Required to locate the information
17802         on methods because System.Reflection bit us again.
17803
17804         * support.cs: New file, contains an interface ParameterData and
17805         two implementations: ReflectionParameters and InternalParameters
17806         used to access Parameter information.  We will need to grow this
17807         as required.
17808
17809         * expression.cs (Invocation::GetParameterData): implement a cache
17810         and a wrapper around the ParameterData creation for methods. 
17811         (Invocation::OverloadResolve): Use new code.
17812
17813 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17814
17815         * class.cs (TypeContainer::EmitField): Remove and move into 
17816         (Field::Define): here and modify accordingly.
17817         (Field.FieldBuilder): New member.
17818         (TypeContainer::Populate): Update accordingly.
17819         (TypeContainer::FindMembers): Implement.
17820
17821 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17822
17823         * statement.cs: (VariableInfo::VariableType): New field to be
17824         initialized with the full type once it is resolved. 
17825
17826 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17827
17828         * parameter.cs (GetParameterInfo): Use a type cache to compute
17829         things only once, and to reuse this information
17830
17831         * expression.cs (LocalVariableReference::Emit): Implement.
17832         (OpcodeCast::Emit): fix.
17833
17834         (ParameterReference::Resolve): Implement.
17835         (ParameterReference::Emit): Implement.
17836
17837         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17838         that are expressions need to stay as Expressions.
17839
17840         * typemanager.cs (CSharpName): Returns the C# name of a type if
17841         possible. 
17842
17843         * expression.cs (Expression::ConvertImplicit): New function that
17844         implements implicit type conversions.
17845
17846         (Expression::ImplicitReferenceConversion): Implements implicit
17847         reference conversions.
17848
17849         (EmptyCast): New type for transparent casts.
17850
17851         (OpcodeCast): New type for casts of types that are performed with
17852         a sequence of bytecodes.
17853
17854         (BoxedCast): New type used for casting value types into reference
17855         types.  Emits a box opcode.
17856
17857         (Binary::DoNumericPromotions): Implements numeric promotions of
17858         and computation of the Binary::Type.
17859
17860         (Binary::EmitBranchable): Optimization.
17861
17862         (Binary::Emit): Implement code emission for expressions.
17863
17864         * typemanager.cs (TypeManager): Added two new core types: sbyte
17865         and byte.
17866
17867 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17868
17869         * class.cs (TypeContainer::FindMembers): Method which does exactly
17870         what Type.FindMembers does, only we don't have to use reflection. No
17871         implementation yet.
17872
17873         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17874         typecontainer objects as we need to get at them.
17875         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17876
17877         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17878         typecontainer object.
17879
17880         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17881         of just a Report object.
17882
17883 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17884
17885         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17886         "remove_"
17887         (TypeContainer::Populate): Now define the delegates of the type too.
17888         (TypeContainer.Delegates): Property to access the list of delegates defined
17889         in the type.
17890
17891         * delegates.cs (Delegate::Define): Implement partially.
17892
17893         * modifiers.cs (TypeAttr): Handle more flags.
17894
17895 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17896
17897         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17898         and not <=
17899         (Operator::Define): Re-write logic to get types by using the LookupType method
17900         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17901         (Indexer::Define): Ditto.
17902         (Event::Define): Ditto.
17903         (Property::Define): Ditto.
17904
17905 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17906
17907         * class.cs (TypeContainer::Populate): Now define operators too. 
17908         (TypeContainer.Operators): New property to access the list of operators
17909         in a type.
17910         (Operator.OperatorMethodBuilder): New member to hold the method builder
17911         for the operator we are defining.
17912         (Operator::Define): Implement.
17913
17914 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17915
17916         * class.cs (Event::Define): Make the prefixes of the accessor methods
17917         addOn_ and removeOn_ 
17918
17919         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17920         of the location being passed in too. Ideally, this should go later since all
17921         error reporting should be done through the Report object.
17922
17923         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17924         (Populate): Iterate thru the indexers we have and define them too.
17925         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17926         for the get and set accessors.
17927         (Indexer::Define): Implement.
17928
17929 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17930
17931         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17932         my previous implementation, did not work.
17933
17934         * typemanager.cs: Add a couple of missing types (the longs).
17935
17936         * literal.cs: Use TypeManager.bool_type instead of getting it.
17937
17938         * expression.cs (EventExpr): New kind of expressions.
17939         (Expressio::ExprClassFromMemberInfo): finish
17940
17941 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17942
17943         * assign.cs: Emit stores to static fields differently.
17944
17945 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17946
17947         * Merge in changes and adjust code to tackle conflicts. Backed out my
17948         code in Assign::Resolve ;-) 
17949
17950 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17951
17952         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17953         instead Report.Error and also pass in the location.
17954         (CSharpParser::Lexer): New readonly property to return the reference
17955         to the Tokenizer object.
17956         (declare_local_variables): Use Report.Error with location instead of plain 
17957         old error.
17958         (CheckDef): Ditto.
17959
17960         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17961         (Operator.CheckBinaryOperator): Ditto.
17962
17963         * cs-parser.jay (operator_declarator): Update accordingly.
17964
17965         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17966         (CheckBinaryOperator): Same here.
17967
17968         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17969         on the name without any prefixes of namespace names etc. This is because we
17970         already might have something already fully qualified like 
17971         'System.Console.WriteLine'
17972
17973         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17974
17975 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17976
17977         * cs-tokenizer.cs (location): Return a string which also contains
17978         the file name.
17979
17980         * expression.cs (ElementAccess): New class for expressions of the
17981         type 'element access.'
17982         (BaseAccess): New class for expressions of the type 'base access.'
17983         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17984         respectively.
17985
17986         * cs-parser.jay (element_access): Implement action.
17987         (base_access): Implement actions.
17988         (checked_expression, unchecked_expression): Implement.
17989
17990         * cs-parser.jay (local_variable_type): Correct and implement.
17991         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17992
17993         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17994
17995         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17996         name and the specifiers.
17997
17998         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17999
18000         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
18001         making them all public ;-)
18002
18003         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
18004         class anyways.
18005
18006 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
18007
18008         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
18009         PropertyExprs.
18010         (FieldExpr, PropertyExprs): New resolved expressions.
18011         (SimpleName::MemberStaticCheck): Perform static checks for access
18012         to non-static fields on static methods. Maybe this should be
18013         generalized for MemberAccesses. 
18014         (SimpleName::ResolveSimpleName): More work on simple name
18015         resolution. 
18016
18017         * cs-parser.jay (primary_expression/qualified_identifier): track
18018         the parameter index.
18019
18020         * codegen.cs (CodeGen::Save): Catch save exception, report error.
18021         (EmitContext::EmitBoolExpression): Chain to expression generation
18022         instead of temporary hack.
18023         (::EmitStatementExpression): Put generic expression code generation.
18024
18025         * assign.cs (Assign::Emit): Implement variable assignments to
18026         local variables, parameters and fields.
18027
18028 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
18029
18030         * statement.cs (Block::GetVariableInfo): New method, returns the
18031         VariableInfo for a variable name in a block.
18032         (Block::GetVariableType): Implement in terms of GetVariableInfo
18033
18034         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
18035         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
18036
18037 2001-09-06  Ravi Pratap  <ravi@ximian.com>
18038
18039         * cs-parser.jay (operator_declaration): Continue on my quest : update
18040         to take attributes argument.
18041         (event_declaration): Ditto.
18042         (enum_declaration): Ditto.
18043         (indexer_declaration): Ditto.
18044
18045         * class.cs (Operator::Operator): Update constructor accordingly.
18046         (Event::Event): Ditto.
18047
18048         * delegate.cs (Delegate::Delegate): Same here.
18049
18050         * enum.cs (Enum::Enum): Same here.
18051
18052 2001-09-05  Ravi Pratap  <ravi@ximian.com>
18053
18054         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
18055
18056         * ../tests/cs0658.cs : New file to demonstrate error 0658.
18057
18058         * attribute.cs (Attributes): New class to encapsulate all attributes which were
18059         being passed around as an arraylist.
18060         (Attributes::AddAttribute): Method to add attribute sections.
18061
18062         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
18063         (struct_declaration): Update accordingly.
18064         (constant_declaration): Update.
18065         (field_declaration): Update.
18066         (method_header): Update.
18067         (fixed_parameter): Update.
18068         (parameter_array): Ditto.
18069         (property_declaration): Ditto.
18070         (destructor_declaration): Ditto.
18071
18072         * class.cs (Struct::Struct): Update constructors accordingly.
18073         (Class::Class): Ditto.
18074         (Field::Field): Ditto.
18075         (Method::Method): Ditto.
18076         (Property::Property): Ditto.
18077         (TypeContainer::OptAttribute): update property's return type.
18078
18079         * interface.cs (Interface.opt_attributes): New member.
18080         (Interface::Interface): Update to take the extra Attributes argument.
18081
18082         * parameter.cs (Parameter::Parameter): Ditto.
18083
18084         * constant.cs (Constant::Constant): Ditto.
18085
18086         * interface.cs (InterfaceMemberBase): New OptAttributes field.
18087         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
18088         the attributes as a parameter.
18089         (InterfaceProperty): Update constructor call.
18090         (InterfaceEvent): Ditto.
18091         (InterfaceMethod): Ditto.
18092         (InterfaceIndexer): Ditto.
18093
18094         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
18095         pass the attributes too.
18096         (interface_event_declaration): Ditto.
18097         (interface_property_declaration): Ditto.
18098         (interface_method_declaration): Ditto.
18099         (interface_declaration): Ditto.
18100
18101 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
18102
18103         * class.cs (Method::Define): Track the "static Main" definition to
18104         create an entry point. 
18105
18106         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
18107         EntryPoint if we find it. 
18108
18109         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
18110         (EmitContext::ig): Make this variable public.
18111
18112         * driver.cs: Make the default output file be the first file name
18113         with the .exe extension.  
18114
18115         Detect empty compilations
18116
18117         Handle various kinds of output targets.  Handle --target and
18118         rename -t to --dumper.
18119
18120         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
18121         methods inherited from Expression return now an Expression.  This
18122         will is used during the tree rewriting as we resolve them during
18123         semantic analysis.
18124
18125         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
18126         the spec.  Missing entirely is the information about
18127         accessability of elements of it.
18128
18129         (Expression::ExprClassFromMemberInfo): New constructor for
18130         Expressions that creates a fully initialized Expression based on
18131         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
18132         a Type.
18133
18134         (Invocation::Resolve): Begin implementing resolution of invocations.
18135
18136         * literal.cs (StringLiteral):  Implement Emit.
18137
18138 2001-09-05  Ravi Pratap  <ravi@ximian.com>
18139
18140         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
18141         member.
18142
18143 2001-09-04  Ravi Pratap  <ravi@ximian.com>
18144
18145         * cs-parser.jay (attribute_arguments): Implement actions.
18146         (attribute): Fix bug in production. Implement action.
18147         (attribute_list): Implement.
18148         (attribute_target): Implement.
18149         (attribute_target_specifier, opt_target_specifier): Implement
18150         (CheckAttributeTarget): New method to check if the attribute target
18151         is valid.
18152         (attribute_section): Implement.
18153         (opt_attributes): Implement.
18154
18155         * attribute.cs : New file to handle attributes.
18156         (Attribute): Class to hold attribute info.
18157
18158         * cs-parser.jay (opt_attribute_target_specifier): Remove production
18159         (attribute_section): Modify production to use 2 different rules to 
18160         achieve the same thing. 1 s/r conflict down !
18161         Clean out commented, useless, non-reducing dimension_separator rules.
18162
18163         * class.cs (TypeContainer.attributes): New member to hold list
18164         of attributes for a type.
18165         (Struct::Struct): Modify to take one more argument, the attribute list.
18166         (Class::Class): Ditto.
18167         (Field::Field): Ditto.
18168         (Method::Method): Ditto.
18169         (Property::Property): Ditto.
18170
18171         * cs-parser.jay (struct_declaration): Update constructor call to
18172         pass in the attributes too.
18173         (class_declaration): Ditto.
18174         (constant_declaration): Ditto.
18175         (field_declaration): Ditto.
18176         (method_header): Ditto.
18177         (fixed_parameter): Ditto.
18178         (parameter_array): Ditto.
18179         (property_declaration): Ditto.
18180
18181         * constant.cs (Constant::Constant): Update constructor similarly.
18182         Use System.Collections.
18183
18184         * parameter.cs (Parameter::Parameter): Update as above.
18185
18186 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18187
18188         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
18189         (TypeContainer.delegates): New member to hold list of delegates.
18190
18191         * cs-parser.jay (delegate_declaration): Implement the action correctly 
18192         this time as I seem to be on crack ;-)
18193
18194 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
18195
18196         * rootcontext.cs (RootContext::IsNamespace): new function, used to
18197         tell whether an identifier represents a namespace.
18198
18199         * expression.cs (NamespaceExpr): A namespace expression, used only
18200         temporarly during expression resolution.
18201         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
18202         utility functions to resolve names on expressions.
18203
18204 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
18205
18206         * codegen.cs: Add hook for StatementExpressions. 
18207
18208         * class.cs: Fix inverted test for static flag in methods.
18209
18210 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18211
18212         * class.cs (Operator::CheckUnaryOperator): Correct error number used
18213         to make it coincide with MS' number.
18214         (Operator::CheckBinaryOperator): Ditto.
18215
18216         * ../errors/errors.txt : Remove error numbers added earlier.
18217
18218         * ../errors/cs1019.cs : Test case for error # 1019
18219
18220         * ../errros/cs1020.cs : Test case for error # 1020
18221
18222         * cs-parser.jay : Clean out commented cruft.
18223         (dimension_separators, dimension_separator): Comment out. Ostensibly not
18224         used anywhere - non-reducing rule.
18225         (namespace_declarations): Non-reducing rule - comment out.
18226
18227         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
18228         with TypeContainer::AddEnum.
18229
18230         * delegate.cs : New file for delegate handling classes.
18231         (Delegate): Class for declaring delegates.
18232
18233         * makefile : Update.
18234
18235         * cs-parser.jay (delegate_declaration): Implement.
18236
18237 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
18238
18239         * class.cs (Event::Define): Implement.
18240         (Event.EventBuilder): New member.
18241
18242         * class.cs (TypeContainer::Populate): Update to define all enums and events
18243         we have.
18244         (Events): New property for the events arraylist we hold. Shouldn't we move to using
18245         readonly fields for all these cases ?
18246
18247 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
18248
18249         * class.cs (Property): Revamp to use the convention of making fields readonly.
18250         Accordingly modify code elsewhere.
18251
18252         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
18253         the Define method of the Property class.
18254
18255         * class.cs : Clean up applied patch and update references to variables etc. Fix 
18256         trivial bug.
18257         (TypeContainer::Populate): Update to define all the properties we have. Also
18258         define all enumerations.
18259
18260         * enum.cs (Define): Implement.
18261
18262 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
18263
18264         * cs-parser.jay (overloadable_operator): The semantic value is an
18265         enum of the Operator class.
18266         (operator_declarator): Implement actions.
18267         (operator_declaration): Implement.
18268
18269         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
18270         validity of definitions.
18271         (Operator::CheckBinaryOperator): Static method to check for binary operators
18272         (TypeContainer::AddOperator): New method to add an operator to a type.
18273
18274         * cs-parser.jay (indexer_declaration): Added line to actually call the
18275         AddIndexer method so it gets added ;-)
18276
18277         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
18278         already taken care of by the MS compiler ?  
18279
18280 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18281
18282         * class.cs (Operator): New class for operator declarations.
18283         (Operator::OpType): Enum for the various operators.
18284
18285 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18286
18287         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
18288         ostensibly handle this in semantic analysis.
18289
18290         * cs-parser.jay (general_catch_clause): Comment out
18291         (specific_catch_clauses, specific_catch_clause): Ditto.
18292         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
18293         (catch_args, opt_catch_args): New productions.
18294         (catch_clause): Rewrite to use the new productions above
18295         (catch_clauses): Modify accordingly.
18296         (opt_catch_clauses): New production to use in try_statement
18297         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
18298         and re-write the code in the actions to extract the specific and
18299         general catch clauses by being a little smart ;-)
18300
18301         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
18302         Hooray, try and catch statements parse fine !
18303
18304 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18305
18306         * statement.cs (Block::GetVariableType): Fix logic to extract the type
18307         string from the hashtable of variables.
18308
18309         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
18310         I end up making that mistake ;-)
18311         (catch_clauses): Fixed gross error which made Key and Value of the 
18312         DictionaryEntry the same : $1 !!
18313
18314 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18315
18316         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
18317
18318         * cs-parser.jay (event_declaration): Correct to remove the semicolon
18319         when the add and remove accessors are specified. 
18320
18321 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18322
18323         * cs-parser.jay (IndexerDeclaration): New helper class to hold
18324         information about indexer_declarator.
18325         (indexer_declarator): Implement actions.
18326         (parsing_indexer): New local boolean used to keep track of whether
18327         we are parsing indexers or properties. This is necessary because 
18328         implicit_parameters come into picture even for the get accessor in the 
18329         case of an indexer.
18330         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
18331
18332         * class.cs (Indexer): New class for indexer declarations.
18333         (TypeContainer::AddIndexer): New method to add an indexer to a type.
18334         (TypeContainer::indexers): New member to hold list of indexers for the
18335         type.
18336
18337 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18338
18339         * cs-parser.jay (add_accessor_declaration): Implement action.
18340         (remove_accessor_declaration): Implement action.
18341         (event_accessors_declaration): Implement
18342         (variable_declarators): swap statements for first rule - trivial.
18343
18344         * class.cs (Event): New class to hold information about event
18345         declarations.
18346         (TypeContainer::AddEvent): New method to add an event to a type
18347         (TypeContainer::events): New member to hold list of events.
18348
18349         * cs-parser.jay (event_declaration): Implement actions.
18350
18351 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18352
18353         * cs-parser.jay (dim_separators): Implement. Make it a string
18354         concatenating all the commas together, just as they appear.
18355         (opt_dim_separators): Modify accordingly
18356         (rank_specifiers): Update accordingly. Basically do the same
18357         thing - instead, collect the brackets here.
18358         (opt_rank_sepcifiers): Modify accordingly.
18359         (array_type): Modify to actually return the complete type string
18360         instead of ignoring the rank_specifiers.
18361         (expression_list): Implement to collect the expressions
18362         (variable_initializer): Implement. We make it a list of expressions
18363         essentially so that we can handle the array_initializer case neatly too.
18364         (variable_initializer_list): Implement.
18365         (array_initializer): Make it a list of variable_initializers
18366         (opt_array_initializer): Modify accordingly.
18367
18368         * expression.cs (New::NType): Add enumeration to help us
18369         keep track of whether we have an object/delegate creation
18370         or an array creation.
18371         (New:NewType, New::Rank, New::Indices, New::Initializers): New
18372         members to hold data about array creation.
18373         (New:New): Modify to update NewType
18374         (New:New): New Overloaded contructor for the array creation
18375         case.
18376
18377         * cs-parser.jay (array_creation_expression): Implement to call
18378         the overloaded New constructor.
18379
18380 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
18381
18382         * class.cs (TypeContainer::Constructors): Return member
18383         constructors instead of returning null.
18384
18385 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
18386
18387         * typemanager.cs (InitCoreTypes): Initialize the various core
18388         types after we have populated the type manager with the user
18389         defined types (this distinction will be important later while
18390         compiling corlib.dll)
18391
18392         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
18393         on Expression Classification.  Now all expressions have a method
18394         `Resolve' and a method `Emit'.
18395
18396         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
18397         generation from working.     Also add some temporary debugging
18398         code. 
18399
18400 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
18401
18402         * codegen.cs: Lots of code generation pieces.  This is only the
18403         beginning, will continue tomorrow with more touches of polish.  We
18404         handle the fundamentals of if, while, do, for, return.  Others are
18405         trickier and I need to start working on invocations soon.
18406
18407         * gen-treedump.cs: Bug fix, use s.Increment here instead of
18408         s.InitStatement. 
18409
18410         * codegen.cs (EmitContext): New struct, used during code
18411         emission to keep a context.   Most of the code generation will be
18412         here. 
18413
18414         * cs-parser.jay: Add embedded blocks to the list of statements of
18415         this block.  So code generation proceeds in a top down fashion.
18416
18417 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
18418
18419         * statement.cs: Add support for multiple child blocks.
18420
18421 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
18422
18423         * codegen.cs (EmitCode): New function, will emit the code for a
18424         Block of code given a TypeContainer and its ILGenerator. 
18425
18426         * statement.cs (Block): Standard public readonly optimization.
18427         (Block::Block constructors): Link children. 
18428         (Block::Child): Child Linker.
18429         (Block::EmitVariables): Emits IL variable declarations.
18430
18431         * class.cs: Drop support for MethodGroups here, delay until
18432         Semantic Analysis.
18433         (Method::): Applied the same simplification that I did before, and
18434         move from Properties to public readonly fields.
18435         (Method::ParameterTypes): Returns the parameter types for the
18436         function, and implements a cache that will be useful later when I
18437         do error checking and the semantic analysis on the methods is
18438         performed.
18439         (Constructor::GetCallingConvention): Renamed from CallingConvetion
18440         and made a method, optional argument tells whether this is a class
18441         or a structure to apply the `has-this' bit.
18442         (Method::GetCallingConvention): Implement, returns the calling
18443         convention. 
18444         (Method::Define): Defines the type, a second pass is performed
18445         later to populate the methods.
18446
18447         (Constructor::ParameterTypes): implement a cache similar to the
18448         one on Method::ParameterTypes, useful later when we do semantic
18449         analysis. 
18450
18451         (TypeContainer::EmitMethod):  New method.  Emits methods.
18452
18453         * expression.cs: Removed MethodGroup class from here.
18454
18455         * parameter.cs (Parameters::GetCallingConvention): new method.
18456
18457 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
18458
18459         * class.cs (TypeContainer::Populate): Drop RootContext from the
18460         argument. 
18461
18462         (Constructor::CallingConvention): Returns the calling convention.
18463         (Constructor::ParameterTypes): Returns the constructor parameter
18464         types. 
18465
18466         (TypeContainer::AddConstructor): Keep track of default constructor
18467         and the default static constructor.
18468
18469         (Constructor::) Another class that starts using `public readonly'
18470         instead of properties. 
18471
18472         (Constructor::IsDefault): Whether this is a default constructor. 
18473
18474         (Field::) use readonly public fields instead of properties also.
18475
18476         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
18477         track of static constructors;  If none is used, turn on
18478         BeforeFieldInit in the TypeAttributes. 
18479
18480         * cs-parser.jay (opt_argument_list): now the return can be null
18481         for the cases where there are no arguments. 
18482
18483         (constructor_declarator): If there is no implicit `base' or
18484         `this', then invoke the default parent constructor. 
18485
18486         * modifiers.cs (MethodAttr): New static function maps a set of
18487         modifiers flags into a MethodAttributes enum
18488         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
18489         MethodAttr, TypeAttr to represent the various mappings where the
18490         modifiers are used.
18491         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
18492
18493 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
18494
18495         * parameter.cs (GetParameterInfo): Fix bug where there would be no
18496         method arguments.
18497
18498         * interface.cs (PopulateIndexer): Implemented the code generator
18499         for interface indexers.
18500
18501 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
18502
18503         * interface.cs (InterfaceMemberBase): Now we track the new status
18504         here.  
18505
18506         (PopulateProperty): Implement property population.  Woohoo!  Got
18507         Methods and Properties going today. 
18508
18509         Removed all the properties for interfaces, and replaced them with
18510         `public readonly' fields. 
18511
18512 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
18513
18514         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
18515         initialize their hashtables/arraylists only when they are needed
18516         instead of doing this always.
18517
18518         * parameter.cs: Handle refs and out parameters.
18519
18520         * cs-parser.jay: Use an ArrayList to construct the arguments
18521         instead of the ParameterCollection, and then cast that to a
18522         Parameter[] array.
18523
18524         * parameter.cs: Drop the use of ParameterCollection and use
18525         instead arrays of Parameters.
18526
18527         (GetParameterInfo): Use the Type, not the Name when resolving
18528         types. 
18529
18530 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
18531
18532         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
18533         and instead use public readonly fields.
18534
18535         * class.cs: Put back walking code for type containers.
18536
18537 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
18538
18539         * class.cs (MakeConstant): Code to define constants.
18540
18541         * rootcontext.cs (LookupType): New function.  Used to locate types 
18542
18543
18544 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
18545
18546         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
18547         this System.Reflection code is.  Kudos to Microsoft
18548
18549         * typemanager.cs: Implement a type cache and avoid loading all
18550         types at boot time.  Wrap in LookupType the internals.  This made
18551         the compiler so much faster.  Wow.  I rule!
18552
18553         * driver.cs: Make sure we always load mscorlib first (for
18554         debugging purposes, nothing really important).
18555
18556         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
18557         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
18558
18559         * rootcontext.cs: Lookup types on their namespace;  Lookup types
18560         on namespaces that have been imported using the `using' keyword.
18561
18562         * class.cs (TypeContainer::TypeAttr): Virtualize.
18563         (Class::TypeAttr): Return attributes suitable for this bad boy.
18564         (Struct::TypeAttr): ditto.
18565         Handle nested classes.
18566         (TypeContainer::) Remove all the type visiting code, it is now
18567         replaced with the rootcontext.cs code
18568
18569         * rootcontext.cs (GetClassBases): Added support for structs. 
18570
18571 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
18572
18573         * interface.cs, statement.cs, class.cs, parameter.cs,
18574         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
18575         Drop use of TypeRefs, and use strings instead.
18576
18577 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
18578
18579         * rootcontext.cs: 
18580
18581         * class.cs (Struct::Struct): set the SEALED flags after
18582         checking the modifiers.
18583         (TypeContainer::TypeAttr): new property, returns the
18584         TypeAttributes for a class.  
18585
18586         * cs-parser.jay (type_list): Oops, list production was creating a
18587         new list of base types.
18588
18589         * rootcontext.cs (StdLib): New property.
18590         (GetInterfaceTypeByName): returns an interface by type name, and
18591         encapsulates error handling here.
18592         (GetInterfaces): simplified.
18593         (ResolveTree): Encapsulated all the tree resolution here.
18594         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
18595         types. 
18596
18597         * driver.cs: Add support for --nostdlib, to avoid loading the
18598         default assemblies.
18599         (Main): Do not put tree resolution here. 
18600
18601         * rootcontext.cs: Beginning of the class resolution.
18602
18603 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
18604
18605         * rootcontext.cs: Provide better error reporting. 
18606
18607         * cs-parser.jay (interface_base): set our $$ to be interfaces.
18608
18609         * rootcontext.cs (CreateInterface): Handle the case where there
18610         are no parent interfaces.
18611
18612         (CloseTypes): Routine to flush types at the end.
18613         (CreateInterface): Track types.
18614         (GetInterfaces): Returns an array of Types from the list of
18615         defined interfaces.
18616
18617         * typemanager.c (AddUserType): Mechanism to track user types (puts
18618         the type on the global type hash, and allows us to close it at the
18619         end). 
18620
18621 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
18622
18623         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
18624         RecordInterface instead.
18625
18626         * cs-parser.jay: Updated to reflect changes above.
18627
18628         * decl.cs (Definition): Keep track of the TypeBuilder type that
18629         represents this type here.  Not sure we will use it in the long
18630         run, but wont hurt for now.
18631
18632         * driver.cs: Smaller changes to accomodate the new code.
18633
18634         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
18635         when done. 
18636
18637         * rootcontext.cs (CreateInterface):  New method, used to create
18638         the System.TypeBuilder type for interfaces.
18639         (ResolveInterfaces): new entry point to resolve the interface
18640         hierarchy. 
18641         (CodeGen): Property, used to keep track of the code generator.
18642
18643 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
18644
18645         * cs-parser.jay: Add a second production for delegate_declaration
18646         with `VOID'.
18647
18648         (enum_body): Put an opt_comma here instead of putting it on
18649         enum_body or enum_member_declarations so we can handle trailing
18650         commas on enumeration members.  Gets rid of a shift/reduce.
18651
18652         (type_list): Need a COMMA in the middle.
18653
18654         (indexer_declaration): Tell tokenizer to recognize get/set
18655
18656         * Remove old targets.
18657
18658         * Re-add the parser target.
18659
18660 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18661
18662         * cs-parser.jay: Add precendence rules for a number of operators
18663         ot reduce the number of shift/reduce conflicts in the grammar.
18664
18665 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
18666
18667         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
18668         and put it here.
18669
18670         Get rid of old crufty code.
18671
18672         * rootcontext.cs: Use this to keep track of the parsed
18673         representation and the defined types available to the program. 
18674
18675         * gen-treedump.cs: adjust for new convention.
18676
18677         * type.cs: Split out the type manager, and the assembly builder
18678         from here. 
18679
18680         * typemanager.cs: the type manager will live here now.
18681
18682         * cil-codegen.cs: And the code generator here. 
18683
18684 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
18685
18686         * makefile: Fixed up for easy making.
18687
18688 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18689
18690         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
18691         the 
18692
18693         (unary_expression): Expand pre_increment_expression and
18694         post_decrement_expression to reduce a shift/reduce.
18695
18696 2001-07-11  Simon Cozens
18697
18698         * cs-tokenizer.cs: Hex numbers should begin with a 0.
18699
18700         Improve allow_keyword_as_indent name.
18701
18702 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
18703
18704         * Adjustments for Beta2. 
18705
18706 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
18707
18708         * decl.cs: Added `Define' abstract method.
18709         (InTransit): new property, used to catch recursive definitions. 
18710
18711         * interface.cs: Implement `Define'. 
18712
18713         * modifiers.cs: Map Modifiers.constants to
18714         System.Reflection.TypeAttribute flags.
18715
18716         * class.cs: Keep track of types and user-defined types.
18717         (BuilderInit): New method for creating an assembly
18718         (ResolveType): New function to launch the resolution process, only
18719         used by interfaces for now.
18720
18721         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
18722         that are inserted into the name space. 
18723
18724 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
18725
18726         * ARGH.  I have screwed up my tree so many times due to the use of
18727         rsync rather than using CVS.  Going to fix this at once. 
18728
18729         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
18730         load types.
18731
18732 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
18733
18734         * Experiment successful: Use System.Type rather that our own
18735         version of Type.  
18736
18737 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
18738
18739         * cs-parser.jay: Removed nsAliases from here.
18740
18741         Use new namespaces, handle `using XXX;' 
18742
18743         * namespace.cs: Reimplemented namespace handling, use a recursive
18744         definition of the class.  Now we can keep track of using clauses
18745         and catch invalid using clauses.
18746
18747 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
18748
18749         * gen-treedump.cs: Adapted for all the renaming.
18750
18751         * expression.cs (Expression): this class now has a Type property
18752         which returns an expression Type.
18753
18754         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
18755         `Type', as this has a different meaning now in the base
18756
18757 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
18758
18759         * interface.cs, class.cs: Removed from all the sources the
18760         references to signature computation, as we can not do method
18761         signature computation during the parsing time, as we are not
18762         trying to solve at that point distinguishing:
18763
18764         class X {
18765                 void a (Blah x) {}
18766                 void a (NS.Blah x) {}
18767         }
18768
18769         Which depending on the context might be valid or not, as we do not
18770         know if Blah is the same thing as NS.Blah at that point.
18771
18772         * Redid everything so the code uses TypeRefs now instead of
18773         Types.  TypeRefs are just temporary type placeholders, that need
18774         to be resolved.  They initially have a pointer to a string and the
18775         current scope in which they are used.  This is used later by the
18776         compiler to resolve the reference to an actual Type. 
18777
18778         * DeclSpace is no longer a CIR.Type, and neither are
18779         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
18780         are all DeclSpaces, but no Types. 
18781
18782         * type.cs (TypeRefManager): This implements the TypeRef manager,
18783         which keeps track of all the types that need to be resolved after
18784         the parsing has finished. 
18785
18786 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
18787
18788         * ARGH.  We are going to have to store `foreach' as a class rather
18789         than resolving it, as we need to verify error 1579 after name
18790         resolution.   *OR* we could keep a flag that says `This request to
18791         IEnumerator comes from a foreach statement' which we can then use
18792         to generate the error.
18793
18794 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
18795
18796         * class.cs (TypeContainer.AddMethod): we now add methods to the
18797         MethodGroup instead of the method hashtable.  
18798
18799         * expression.cs: Add MethodGroup abstraction, which gets us one
18800         step closer to the specification in the way we handle method
18801         declarations.  
18802
18803         * cs-parser.jay (primary_expression): qualified_identifier now
18804         tried to match up an identifier to a local variable reference or
18805         to a parameter reference.
18806
18807         current_local_parameters is now a parser global variable that
18808         points to the current parameters for the block, used during name
18809         lookup.
18810
18811         (property_declaration): Now creates an implicit `value' argument to
18812         the set accessor.
18813
18814 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18815
18816         * parameter.cs: Do not use `param' arguments as part of the
18817         signature, per the spec.
18818
18819 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18820
18821         * decl.cs: Base class for classes, structs and interfaces.  This
18822         is the "Declaration Space" 
18823
18824         * cs-parser.jay: Use CheckDef for checking declaration errors
18825         instead of having one on each function.
18826
18827         * class.cs: Factor out some code for handling error handling in
18828         accordance to the "Declarations" section in the "Basic Concepts"
18829         chapter in the ECMA C# spec.
18830
18831         * interface.cs: Make all interface member classes derive from
18832         InterfaceMemberBase.
18833
18834 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18835
18836         * Many things: all interfaces are parsed and generated in
18837         gen-treedump.  Support for member variables, constructors,
18838         destructors, properties, constants is there.
18839
18840         Beginning of the IL backend, but very little done, just there for
18841         testing purposes. 
18842
18843 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18844
18845         * cs-parser.jay: Fix labeled statement.
18846
18847         * cs-tokenizer.cs (escape): Escape " and ' always.
18848         ref_line, ref_name: keep track of the line/filename as instructed
18849         by #line by the compiler.
18850         Parse #line.
18851
18852 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18853
18854         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18855         to match the values in System.CodeDOM.
18856
18857         Divid renamed to Divide.
18858
18859         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18860         statements. 
18861         (Statements.set): remove.
18862
18863         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18864         statements. 
18865
18866         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18867         falseStatements always have valid values. 
18868
18869         * cs-parser.jay: Use System.CodeDOM now.
18870