* Mono.Posix.dll.sources: Rename Mono.Posix to Mono.Unix.
[mono.git] / mcs / mcs / ChangeLog
1 2004-11-16  Martin Baulig  <martin@ximian.com>
2
3         This is based on a patch from Marek Safar, see bug #69082.
4         Fixes bugs #63705 and #67130.
5
6         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
7         method; create a MemberCache for an interface type and cache the
8         result.
9
10         * decl.cs (IMemberContainer.ParentContainer): Removed.
11         (IMemberContainer.ParentCache): New property.
12         (MemberCache.SetupCacheForInterface): Removed.
13         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
14         to create a cache for an interface's "parent".
15
16         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
17         interfaces too.
18
19 2004-11-16  Martin Baulig  <martin@ximian.com>
20
21         Merged back from gmcs; these changes already went into gmcs a
22         couple of weeks ago.
23
24         * typemanager.cs
25         (TypeManager.AddUserType): Removed the `ifaces' argument.
26         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
27         `TypeExpr []'.
28         (TypeManager.AddUserInterface): Removed.
29         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
30         `TypeExpr []'.
31         (TypeManager.GetInterfaces): Likewise.
32         (TypeManager.GetExplicitInterfaces): Likewise.
33
34         * ecore.cs (TypeExpr.GetInterfaces): Removed.
35
36         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
37         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
38
39 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
40
41         * statement.cs: Avoid adding bools to a hashtable.
42
43 2004-11-10  Martin Baulig  <martin@ximian.com>
44
45         Merged latest changes into gmcs.  Please keep this comment in
46         here, it makes it easier for me to see what changed in MCS since
47         the last time I merged.
48
49 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
50
51         * expression.cs (Invocation.OverloadResolve): Flag error if we are
52         calling an unsafe method from a safe location.
53
54 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
55
56         Fix #69167
57         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
58
59 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
60
61         * namespace.cs (VerifyUsing): use GetPartialName instead of
62         ToString. 
63
64 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
65
66         * statement.cs (Return.Resolve): Fix regression in typo: if
67         `in_exc', we have to request a NeedReturnLabel, this was a typo
68         introduced in the anonymous method check-in.  Fixes #69131.
69
70         * Indexers were using the ShortName when defining themselves,
71         causing a regression in the compiler bootstrap when applying the
72         patch from 2004-11-02 (first part), now they use their full name
73         and the bug is gone.
74
75 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
76
77         * driver.cs: Strip the path from the names of embedded resources. Fixes
78         #68519.
79
80 2004-11-04  Raja R Harinath  <rharinath@novell.com>
81
82         Fix error message regression: cs0104-2.cs.
83         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
84         (AliasEntry.Resolve): Update.
85         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
86         'silent' flag.
87         (RootContext.LookupType): Update.
88
89 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
90
91         * cs-parser.jay: Add support for handling accessor modifiers
92         * class: Add support port accessor modifiers and error checking,
93         define PropertyMethod.Define as virtual (not abstract anymore)
94         * ecore.cs: Add checking for proeprties access with access modifiers
95         * iterators.cs: Modify Accessor constructor call based in the modified
96         constructor
97 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
98
99         * expression.cs (StringConcat): Handle being called twice,
100         as when we have a concat in a field init with more than two
101         ctors in the class
102
103 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
104
105         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
106         special case explicit implementations, we should always produce
107         the .property or .event declaration.
108         
109         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
110         since it will not return correct data if people use this
111         unresolved in the presence of using statements (see test-313).
112
113         * class.cs (MethodData.Define): If we are an explicit interface
114         implementation, set the method name to the full name of the
115         interface plus the name of the method.  
116
117         Notice that using the method.MethodName.GetFullName() does not
118         work, as it will only contain the name as declared on the source
119         file (it can be a shorthand in the presence of using statements)
120         and not the fully qualifed type name, for example:
121
122         using System;
123
124         class D : ICloneable {
125                 object ICloneable.Clone ()  {
126                 }
127         }
128
129         Would produce a method called `ICloneable.Clone' instead of
130         `System.ICloneable.Clone'.
131
132         * namespace.cs (Alias.Resolve): Use GetPartialName.
133         
134 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
135
136         * cs-parser.jay: Add error 1055 report.
137
138 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
139
140         * assign.cs (Assign.DoResolve): Only do the transform of
141         assignment into a New if the types are compatible, if not, fall
142         through and let the implicit code deal with the errors and with
143         the necessary conversions. 
144
145 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
146
147         * cs-parser.jay: Add error 1031 report.
148
149         * cs-tokenizer.cs: Add location for error 1038.
150
151 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
152
153         * cs-parser.jay: Add error 1016 report.
154
155 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
156
157         * cs-parser.jay: Add errors 1575,1611 report.
158
159 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
160
161         * cs-parser.jay: Add error 1001 report.
162
163 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
164
165         Fix #68850
166         * attribute.cs (GetMarshal): Add method argument for
167         caller identification.
168
169         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
170         agument for GetMarshal and RuntimeMissingSupport.
171
172 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
173
174         * attribute.cs (ExtractSecurityPermissionSet): Removed
175         TypeManager.code_access_permission_type.
176
177         * typemanager.cs: Removed TypeManager.code_access_permission_type.
178
179 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
180
181         * expression.cs (LocalVariableReference.DoResolveLValue): Check
182         for obsolete use of a variable here.   Fixes regression on errors
183         cs0619-25 and cs0619-26.
184
185 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
186
187         Fix #62358, implemented security attribute encoding.
188
189         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
190         Tests permitted SecurityAction for assembly or other types.
191         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
192         data from SecurityPermissionAttribute to PermisionSet class.
193
194         * class.cs (ApplyAttributeBuilder): Added special handling
195         for System.Security.Permissions.SecurityAttribute based types.
196
197         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
198         special handling for System.Security.Permissions.SecurityAttribute
199         based types.
200
201         * enum.cs (ApplyAttributeBuilder): Added special handling
202         for System.Security.Permissions.SecurityAttribute based types.
203
204         * parameter.cs (ApplyAttributeBuilder): Added special handling
205         for System.Security.Permissions.SecurityAttribute based types.
206
207         * rootcontext.cs: Next 2 core types.
208
209         * typemanager.cs (TypeManager.security_permission_attr_type):
210         Built in type for the SecurityPermission Attribute.
211         (code_access_permission_type): Build in type.
212
213 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
214
215         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
216         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
217         all of this information into
218         EmitContext.EmitCapturedVariableInstance.
219         
220         * codegen.cs (EmitCapturedVariableInstance): move here the
221         funcionality of emitting an ldarg.0 in the presence of a
222         remapping.   This centralizes the instance emit code.
223
224         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
225         then emit a load of this: it means that we have reached the
226         topmost ScopeInfo: the one that contains the pointer to the
227         instance of the class hosting the anonymous method.
228
229         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
230         captures to the topmost CaptureContext.
231
232 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
233
234         * expression.cs (LocalVariableReference): Move the knowledge about
235         the iterators into codegen's EmitCapturedVariableInstance.
236
237 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
238
239         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
240         all code paths return a value from an anonymous method (it is the
241         same as the 161 error, but for anonymous methods).
242
243 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
244
245         The introduction of anonymous methods in the compiler changed
246         various ways of doing things in the compiler.  The most
247         significant one is the hard split between the resolution phase
248         and the emission phases of the compiler.
249
250         For instance, routines that referenced local variables no
251         longer can safely create temporary variables during the
252         resolution phase: they must do so from the emission phase,
253         since the variable might have been "captured", hence access to
254         it can not be done with the local-variable operations from the runtime.
255         
256         * statement.cs 
257
258         (Block.Flags): New flag `IsTopLevel' to indicate that this block
259         is a toplevel block.
260
261         (ToplevelBlock): A new kind of Block, these are the blocks that
262         are created by the parser for all toplevel method bodies.  These
263         include methods, accessors and anonymous methods.
264
265         These contain some extra information not found in regular blocks:
266         A pointer to an optional CaptureContext (for tracking captured
267         local variables and parameters).  A pointer to the parent
268         ToplevelBlock.
269         
270         (Return.Resolve): Catch missmatches when returning a value from an
271         anonymous method (error 1662).
272         Invoke NeedReturnLabel from the Resolve phase instead of the emit
273         phase.
274
275         (Break.Resolve): ditto.
276
277         (SwitchLabel): instead of defining the labels during the
278         resolution phase, we now turned the public ILLabel and ILLabelCode
279         labels into methods called GetILLabelCode() and GetILLabel() that
280         only define the label during the Emit phase.
281
282         (GotoCase): Track the SwitchLabel instead of the computed label
283         (its contained therein).  Emit the code by using
284         SwitchLabel.GetILLabelCode ().
285
286         (LocalInfo.Flags.Captured): A new flag has been introduce to track
287         whether the Local has been captured or not.
288
289         (LocalInfo.IsCaptured): New property, used to tell whether the
290         local has been captured.
291         
292         * anonymous.cs: Vastly updated to contain the anonymous method
293         support.
294
295         The main classes here are: CaptureContext which tracks any
296         captured information for a toplevel block and ScopeInfo used to
297         track the activation frames for various local variables.   
298
299         Each toplevel block has an optional capture context associated
300         with it.  When a method contains an anonymous method both the
301         toplevel method and the anonymous method will create a capture
302         context.   When variables or parameters are captured, they are
303         recorded on the CaptureContext that owns them, for example:
304
305         void Demo () {
306              int a;
307              MyDelegate d = delegate {
308                  a = 1;
309              }
310         }
311
312         Here `a' will be recorded as captured on the toplevel
313         CapturedContext, the inner captured context will not have anything
314         (it will only have data if local variables or parameters from it
315         are captured in a nested anonymous method.
316
317         The ScopeInfo is used to track the activation frames for local
318         variables, for example:
319
320         for (int i = 0; i < 10; i++)
321                 for (int j = 0; j < 10; j++){
322                    MyDelegate d = delegate {
323                         call (i, j);
324                    }
325                 }
326
327         At runtime this captures a single captured variable `i', but it
328         captures 10 different versions of the variable `j'.  The variable
329         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
330         recorded on a child.  
331
332         The toplevel ScopeInfo will also track information like the `this'
333         pointer if instance variables were referenced (this is necessary
334         as the anonymous method lives inside a nested class in the host
335         type of the method). 
336
337         (AnonymousMethod): Expanded to track the Toplevel, implement
338         `AnonymousMethod.Compatible' to tell whether an anonymous method
339         can be converted to a target delegate type. 
340
341         The routine now also produces the anonymous method content
342
343         (AnonymousDelegate): A helper class that derives from
344         DelegateCreation, this is used to generate the code necessary to
345         produce the delegate for the anonymous method that was created. 
346
347         * assign.cs: API adjustments for new changes in
348         Convert.ImplicitStandardConversionExists.
349
350         * class.cs: Adjustments to cope with the fact that now toplevel
351         blocks are of type `ToplevelBlock'. 
352
353         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
354         insteda of standard blocks.
355
356         Flag errors if params arguments are passed to anonymous methods.
357
358         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
359         `CurrentAnonymousMethod' which points to the current Anonymous
360         Method.  The variable points to the AnonymousMethod class that
361         holds the code being compiled.  It is set in the new EmitContext
362         created for the anonymous method.
363
364         (EmitContext.Phase): Introduce a variable and an enumeration to
365         assist in enforcing some rules about when and where we are allowed
366         to invoke certain methods (EmitContext.NeedsReturnLabel is the
367         only one that enfonces this right now).
368
369         (EmitContext.HaveCaptureInfo): new helper method that returns
370         whether we have a CapturedContext initialized.
371
372         (EmitContext.CaptureVariable): New method used to register that a
373         LocalInfo must be flagged for capturing. 
374
375         (EmitContext.CapturedParameter): New method used to register that a
376         parameters must be flagged for capturing. 
377         
378         (EmitContext.CapturedField): New method used to register that a
379         field must be flagged for capturing. 
380
381         (EmitContext.HaveCapturedVariables,
382         EmitContext.HaveCapturedFields): Return whether there are captured
383         variables or fields. 
384
385         (EmitContext.EmitMethodHostInstance): This is used to emit the
386         instance for the anonymous method.  The instance might be null
387         (static methods), this (for anonymous methods that capture nothing
388         and happen to live side-by-side with the current method body) or a
389         more complicated expression if the method has a CaptureContext.
390
391         (EmitContext.EmitTopBlock): Routine that drives the emission of
392         code: it will first resolve the top block, then emit any metadata
393         and then emit the code.  The split is done so that we can extract
394         any anonymous methods and flag any captured variables/parameters.
395         
396         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
397         during this phase, the ILGenerator should not be used as labels
398         and local variables declared here might not be accessible to any
399         code that is part of an anonymous method.  
400
401         Exceptions to this include the temporary variables that are
402         created by some statements internally for holding temporary
403         variables. 
404         
405         (EmitContext.EmitMeta): New routine, in charge of emitting all the
406         metadata for a cb
407
408         (EmitContext.TemporaryReturn): This method is typically called
409         from the Emit phase, and its the only place where we allow the
410         ReturnLabel to be defined other than the EmitMeta.  The reason is
411         that otherwise we would have to duplicate a lot of logic in the
412         Resolve phases of various methods that today is on the Emit
413         phase. 
414
415         (EmitContext.NeedReturnLabel): This no longer creates the label,
416         as the ILGenerator is not valid during the resolve phase.
417
418         (EmitContext.EmitThis): Extended the knowledge in this class to
419         work in anonymous methods in addition to iterators. 
420
421         (EmitContext.EmitCapturedVariableInstance): This emits whatever
422         code is necessary on the stack to access the instance to a local
423         variable (the variable will be accessed as a field).
424
425         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
426         EmitContext.EmitAddressOfParameter): Routines to support
427         parameters (not completed at this point). 
428         
429         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
430         will also remove the parameters.
431
432         * convert.cs (Convert): Define a `ConstantEC' which points to a
433         null.  This is just to prefity some code that uses
434         ImplicitStandardConversion code and do not have an EmitContext
435         handy.
436
437         The idea is to flag explicitly that at that point in time, it is
438         known that the conversion will not trigger the delegate checking
439         code in implicit conversions (which requires a valid
440         EmitContext). 
441
442         Everywhere: pass new EmitContext parameter since
443         ImplicitStandardConversionExists now requires it to check for
444         anonymous method conversions. 
445
446         (Convert.ImplicitStandardConversionExists): If the type of an
447         expression is the anonymous_method_type, and the type is a
448         delegate, we invoke the AnonymousMethod.Compatible method to check
449         whether an implicit conversion is possible. 
450
451         (Convert.ImplicitConversionStandard): Only do implicit method
452         group conversions if the language level is not ISO_1.
453
454         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
455         MethodInfo for the Invoke method.  used by Delegate and
456         AnonymousDelegate.
457
458         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
459         method conversions if the target type is a delegate.
460
461         Removed extra debugging nops.
462
463         (LocalVariableReference): Turn the `local_info' into a public
464         field. 
465
466         Add `prepared' field, the same hack used for FieldExprs to cope
467         with composed assignments, as Local variables do not necessarily
468         operate purely on the stack as they used to: they can be captured
469         fields. 
470
471         Add `temp' for a temporary result, like fields.
472
473         Refactor DoResolve and DoResolveLValue into DoResolveBase.
474
475         It now copes with Local variables that are captured and emits the
476         proper instance variable to load it from a field in the captured
477         case. 
478
479         (ParameterReference.DoResolveBase): During the resolve phase,
480         capture parameters if we are in an anonymous method.
481
482         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
483         anonymous method, use the EmitContext helper routines to emit the
484         parameter reference.
485
486         * iterators.cs: Set RemapToProxy to true/false during the
487         EmitDispose class.
488
489         * parameters.cs (GetParameterByName): New helper method. 
490
491         * typemanager.cs (anonymous_method_type) a new type that
492         represents an anonyous method.  This is always an internal type,
493         used as a fencepost to test against the anonymous-methodness of an
494         expression. 
495         
496 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
497
498         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
499         561 report.
500         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
501
502 2004-10-18  Martin Baulig  <martin@ximian.com>
503
504         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
505         `Type' directly, but call ResolveType() on it.
506         (Catch.Resolve): Likewise.
507         (Foreach.Resolve): Likewise.
508
509 2004-10-18  Martin Baulig  <martin@ximian.com>
510
511         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
512         `Type' directly, but call ResolveType() on it.
513         (Probe.DoResolve): Likewise.
514         (ArrayCreation.LookupType): Likewise.
515         (TypeOf.DoResolve): Likewise.
516         (SizeOf.DoResolve): Likewise.
517
518 2004-10-18  Martin Baulig  <martin@ximian.com>
519
520         * expression.cs (Invocation.BetterFunction): Put back
521         TypeManager.TypeToCoreType().
522
523 2004-10-18  Raja R Harinath  <rharinath@novell.com>
524
525         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
526         the ResolveType.
527
528 2004-10-18  Martin Baulig  <martin@ximian.com>
529
530         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
531         `Type' directly, but call ResolveType() on it.
532
533 2004-10-18  Martin Baulig  <martin@ximian.com>
534
535         * class.cs (FieldMember.Define): Don't access the TypeExpr's
536         `Type' directly, but call ResolveType() on it.
537         (MemberBase.DoDefine): Likewise.
538
539         * expression.cs (New.DoResolve): Don't access the TypeExpr's
540         `Type' directly, but call ResolveType() on it.
541         (ComposedCast.DoResolveAsTypeStep): Likewise.
542
543         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
544         `Type' directly, but call ResolveType() on it.
545
546 2004-10-17  John Luke  <john.luke@gmail.com>
547
548         * class.cs (Operator.GetSignatureForError): use CSharpName
549
550         * parameter.cs (Parameter.GetSignatureForError): Returns
551         correct name even if was not defined.
552
553 2004-10-13  Raja R Harinath  <rharinath@novell.com>
554
555         Fix #65816.
556         * class.cs (TypeContainer.EmitContext): New property.
557         (DefineNestedTypes): Create an emitcontext for each part.
558         (MethodCore.DoDefineParameters): Use container's emitcontext.
559         Pass type array to InternalParameters.
560         (MemberBase.DoDefine): Use container's emitcontext.
561         (FieldMember.Define): Likewise.
562         (Event.Define): Likewise.
563         (SetMethod.GetParameterInfo): Change argument to EmitContext.
564         Pass type array to InternalParameters.
565         (SetIndexerMethod.GetParameterInfo): Likewise.
566         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
567         * delegate.cs (Define): Pass emitcontext to
568         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
569         array to InternalParameters.
570         * expression.cs (ParameterReference.DoResolveBase): Pass
571         emitcontext to GetParameterInfo.
572         (ComposedCast.DoResolveAsTypeStep): Remove check on
573         ec.ResolvingTypeTree.
574         * parameter.cs (Parameter.Resolve): Change argument to
575         EmitContext.  Use ResolveAsTypeTerminal.
576         (Parameter.GetSignature): Change argument to EmitContext.
577         (Parameters.ComputeSignature): Likewise.
578         (Parameters.ComputeParameterTypes): Likewise.
579         (Parameters.GetParameterInfo): Likewise.
580         (Parameters.ComputeAndDefineParameterTypes): Likewise.
581         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
582         * support.cs (InternalParameters..ctor): Remove variant that takes
583         a DeclSpace.
584         * typemanager.cs (system_intptr_expr): New.
585         (InitExpressionTypes): Initialize it.
586
587 2004-10-12  Chris Toshok  <toshok@ximian.com>
588
589         * cs-parser.jay: fix location for try_statement and catch_clause.
590
591 2004-10-11  Martin Baulig  <martin@ximian.com>
592
593         * report.cs: Don't make --fatal abort on warnings, we have
594         -warnaserror for that.
595
596 2004-10-07  Raja R Harinath  <rharinath@novell.com>
597
598         More DeclSpace.ResolveType avoidance.
599         * decl.cs (MemberCore.InUnsafe): New property.
600         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
601         with newly created EmitContext.
602         (FieldMember.Define): Likewise.
603         * delegate.cs (Delegate.Define): Likewise.
604         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
605         only if normal name-lookup fails.
606         (TypeExpr.DoResolve): Enable error-checking.
607         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
608         (SizeOf.DoResolve): Likewise.
609         (ComposedCast.DoResolveAsTypeStep): Likewise.
610         (StackAlloc.DoResolve): Likewise.
611         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
612         (Block.Unsafe): New property.
613         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
614         (Unsafe): Set 'unsafe' flag of contained block.
615         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
616         (Fixed.Resolve): Likewise.
617         (Catch.Resolve): Likewise.
618         (Using.ResolveLocalVariableDecls): Likewise.
619         (Foreach.Resolve): Likewise.
620
621 2004-10-05  John Luke <john.luke@gmail.com>
622
623         * cs-parser.jay: add location to error CS0175
624
625 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
626
627         * ecore.cs (Expression.Constantity): Add support for turning null
628         into a constant.
629
630         * const.cs (Const.Define): Allow constants to be reference types
631         as long as the value is Null.
632
633 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
634
635         * namespace.cs (NamespaceEntry.Using): No matter which warning
636         level is set, check if this namespace name has already been added.
637
638 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
639
640         * expression.cs: reftype [!=]= null should always use br[true,false].
641         # 67410
642
643 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
644
645         Fix #67108
646         * attribute.cs: Enum conversion moved to 
647         GetAttributeArgumentExpression to be applied to the all
648         expressions.
649
650 2004-10-01  Raja R Harinath  <rharinath@novell.com>
651
652         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
653         * class.c (TypeContainer.DefineType): Flag error if
654         base types aren't accessible due to access permissions.
655         * decl.cs (DeclSpace.ResolveType): Move logic to
656         Expression.ResolveAsTypeTerminal.
657         (DeclSpace.ResolveTypeExpr): Thin layer over
658         Expression.ResolveAsTypeTerminal.
659         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
660         Refactor code into NestedAccess.  Use it.
661         (DeclSpace.NestedAccess): New.
662         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
663         argument to silence errors.  Check access permissions.
664         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
665         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
666         (Cast.DoResolve): Likewise.
667         (New.DoResolve): Likewise.
668         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
669         (TypeOf.DoResolve): Likewise.
670
671         * expression.cs (Invocation.BetterConversion): Return the Type of
672         the better conversion.  Implement section 14.4.2.3 more faithfully.
673         (Invocation.BetterFunction): Make boolean.  Make correspondence to
674         section 14.4.2.2 explicit.
675         (Invocation.OverloadResolve): Update.
676         (Invocation): Remove is_base field.
677         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
678         (Invocation.Emit): Likewise.
679
680 2004-09-27  Raja R Harinath  <rharinath@novell.com>
681
682         * README: Update to changes.
683
684 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
685
686         * cs-parser.jay: Reverted 642 warning fix.
687
688 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
689
690         Fix bug #66615
691         * decl.cs (FindMemberWithSameName): Indexer can have more than
692         1 argument.
693
694 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
695
696         * expression.cs (LocalVariableReference.DoResolveLValue):
697         Do not report warning 219 for out values.
698         (EmptyExpression.Null): New member to avoid extra allocations.
699
700 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
701
702         * cs-parser.jay: Fix wrong warning 642 report.
703
704         * cs-tokenizer.cs (CheckNextToken): New helper;
705         Inspect next character if is same as expected.
706
707 2004-09-23  Martin Baulig  <martin@ximian.com>
708
709         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
710         (Convert.ImplicitReferenceConversionExists): Likewise.
711
712 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
713
714         * class.cs (Operator.Define): Add error 448 and 559 report.
715
716 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
717
718         * class.cs (MemberBase.IsTypePermitted): New protected
719         method for checking error CS0610.
720
721 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
722
723         * class.cs (TypeContainer.HasExplicitLayout): New property
724         Returns whether container has StructLayout attribute set Explicit.
725         (FieldMember): New abstract class for consts and fields.
726         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
727         (Field): Reuse FieldMember.
728
729         * const.cs (Const): Reuse FieldMember.
730
731         * rootcontext.cs: EmitConstants call moved to class.
732
733 2004-09-22  Martin Baulig  <martin@ximian.com>
734
735         Thanks to Peter Sestoft for this bug report.
736
737         * expression.cs (Conditional): If both the `trueExpr' and the
738         `falseExpr' is a NullLiteral, return a NullLiteral.
739
740 2004-09-22  Martin Baulig  <martin@ximian.com>
741
742         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
743         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
744         for the "get_Current" call.
745
746 2004-09-22  Martin Baulig  <martin@ximian.com>
747
748         Marek and me just fixed one of our oldest bugs: #28562 :-)
749
750         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
751
752         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
753         we're an EnumConstant, just return that.
754         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
755         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
756         to get the value which'll actually be written into the attribute.
757         However, we have to use GetValue() to access the attribute's value
758         in the compiler.        
759
760 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
761
762         * constant.cs (Constant.IsNegative): New abstract property
763         IsNegative.
764
765         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
766         (StackAlloc.DoResolve): Reused IsNegative.
767
768 2004-09-21  Martin Baulig  <martin@ximian.com>
769
770         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
771         if we're used in an iterator, we may be called from different
772         methods.
773
774         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
775         we actually have an exception block.
776
777 2004-09-20  John Luke <jluke@cfl.rr.com>
778
779         * class.cs, cs-parser.jay: Improve the error report for 1520:
780         report the actual line where the error happens, not where the
781         class was declared.
782
783         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
784         Pass location information that was available elsewhere.
785
786 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
787
788         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
789         runtime to delay sign assemblies.
790
791 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
792
793         * cs-parser.jay: Do not report the stack trace, this is barely
794         used nowadays.
795
796 2004-08-22  John Luke  <john.luke@gmail.com>
797  
798         * driver.cs : check that a resource id is not already used
799         before adding it, report CS1508 if it is, bug #63637
800
801 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
802
803         * ecore.cs: Removed dead code.
804
805 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
806
807         * class.cs: Do not report warning CS0067 on the interfaces.
808
809 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
810
811         * cs-parser.jay: Add error 504 report.
812
813 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
814
815         * rootcontext.cs: WarningLevel is 4 by default now.
816
817         * statement.cs (Fixed.Resolve): Do not null
818         VariableInfo.
819
820 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
821
822         Fixed bug #55780
823         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
824         deep search when property is not virtual.
825         (PropertyExpr.ResolveAccessors): Make one call for both
826         accessors.
827
828 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
829
830         Fixed bug #65766
831         * statement.cs: Error 152 report constains also location.
832
833 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
834
835         Fixed bug #65766
836         * const.cs: Explicitly set constant as static.
837
838 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
839
840         Fixed bug #64226
841         * cs-parser.jay: Add error 1017 report.
842
843 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
844
845         Fixed bug #59980, #64224
846         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
847
848         * typemanager.cs (IsSpecialMethod): Simplified
849
850 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
851
852         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
853         condition with better params.
854
855 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
856
857         Fixed bug #65238
858         * attribute.cs (Resolve): Property has to have both
859         accessors.
860
861 2004-09-14  Martin Baulig  <martin@ximian.com>
862
863         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
864
865 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
866
867         Fixed bug #61902
868         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
869         called and is obsolete then this member suppress message
870         when call is inside next [Obsolete] method or type.
871
872         * expression.cs: Use TestObsoleteMethodUsage member.
873
874 2004-09-14  Martin Baulig  <martin@ximian.com>
875
876         * cs-parser.jay: Sync a bit with the GMCS version.
877
878 2004-09-14  Martin Baulig  <martin@ximian.com>
879
880         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
881         (CSharpParser.yacc_verbose_flag): New public field.
882
883         * genericparser.cs: Removed.
884
885 2004-09-14  Raja R Harinath  <rharinath@novell.com>
886
887         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
888
889 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
890
891         * class.cs (MethodCore.CheckBase): Fix bug #65757.
892
893 2004-09-10  Martin Baulig  <martin@ximian.com>
894
895         Backported my MemberName changes from GMCS into MCS.
896
897         - we are now using a special `MemberName' class instead of using
898         strings; in GMCS, the `MemberName' also contains the type
899         arguments.
900
901         - changed the grammar rules a bit:
902           * the old `member_name' is now a `namespace_or_type_name':
903             The rule is that we use `namespace_or_type_name' everywhere
904             where we expect either a "member name" (GetEnumerator) or a
905             "member name" with an explicit interface name
906             (IEnumerable.GetEnumerator).
907             In GMCS, the explicit interface name may include type arguments
908             (IEnumerable<T>.GetEnumerator).
909           * we use `member_name' instead of just `IDENTIFIER' for
910             "member names":
911             The rule is that we use `member_name' wherever a member may
912             have type parameters in GMCS.       
913
914         * decl.cs (MemberName): New public class.
915         (MemberCore.MemberName): New public readonly field.
916         (MemberCore.ctor): Take a `MemberName' argument, not a string.
917         (DeclSpace): Likewise.
918
919         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
920         * enum.cs (Enum.ctor): Likewise.
921
922         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
923         MemberName.     
924         (AliasEntry.ctor): Take a MemberName, not an Expression.
925         (AliasEntry.UsingAlias): Likewise.
926
927         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
928         (IMethodData.MemberName): Changed type from string to MemberName.
929         (MemberBase.ExplicitInterfaceName): Likewise.
930         (AbstractPropertyEventMethod.SetupName): Make this private.
931         (AbstractPropertyEventMethod.ctor): Added `string prefix'
932         argument; compute the member name here.
933         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
934         on the `member.MemberName' and the `prefix'.
935
936         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
937         not `type_name'.
938         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
939         thus, we get a `MemberName' instead of a `string'.  These
940         declarations may have type parameters in GMCS.
941         (interface_method_declaration, delegate_declaration): Likewise.
942         (class_declaration, interface_declaration): Likewise.
943         (method_header): Use `namespace_or_type_name' instead of
944         `member_name'.  We may be an explicit interface implementation.
945         (property_declaration, event_declaration): Likewise.
946         (member_name): This is now just an `IDENTIFIER', not a
947         `namespace_or_type_name'.
948         (type_name, interface_type): Removed.
949         (namespace_or_type_name): Return a MemberName, not an Expression.
950         (primary_expression): Use `member_name' instead of `IDENTIFIER';
951         call GetTypeExpression() on the MemberName to get an expression.
952         (IndexerDeclaration.interface_type): Changed type from string to
953         MemberName.
954         (MakeName): Operate on MemberName's instead of string's.
955
956 2004-09-13  Raja R Harinath  <rharinath@novell.com>
957
958         Fix bug #55770.
959         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
960         (NamespaceEntry.Lookup): Add new argument to flag if we want the
961         lookup to avoid symbols introduced by 'using'.
962         * rootcontext.cs (NamespaceLookup): Update.
963
964 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
965
966         * class.cs (TypeContainer.DoDefineMembers): Do not call
967         DefineDefaultConstructor for static classes.
968
969 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
970
971         * attribute.cs (Attribute.Resolve): Add error 653 report.
972
973         * class.cs (Class.ApplyAttributeBuilder): Add error 641
974         report.
975         (Method.ApplyAttributeBuilder): Add error 685 report.
976         (Operator.Define): Add error 564 report.
977
978         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
979
980         * expression.cs (Invocation.DoResolve): Add error
981         245 and 250 report.
982
983         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
984         error 674 report.
985
986 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
987
988         * class.cs (ConstructorInitializer.Resolve):
989         Wrong error number (515->516).
990
991 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
992
993         * class.cs (Indexer.Define): Add error 631 report.
994
995 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
996
997         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
998
999 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1000
1001         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1002
1003 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1004
1005         * cs-parser.jay: Added error CS0241 report.
1006
1007 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1008
1009         * cs-parser.jay (fixed_statement): Introduce a scope for the
1010         declaration in the 'fixed' statement.
1011
1012 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1013
1014         * cs-parser.jay: Added CS0230 error report.
1015
1016 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1017
1018         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1019
1020 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1021
1022         * expression.cs (Argument.Resolve): Added error CS0192 and
1023         CS0199 report.
1024
1025 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1026
1027         C# 2.0 #pragma warning feature
1028
1029         * cs-tokenizer.cs (PreProcessPragma): New method; 
1030         Handles #pragma directive.
1031
1032         * report.cs (WarningRegions): New class; Support
1033         class for #pragma warning directive. It tests whether
1034         warning is enabled for a given line.
1035
1036 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1037
1038         * const.cs: Add more descriptive error report, tahnks to
1039         Sebastien. 
1040
1041 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1042
1043         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1044
1045 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1046
1047         * expression.cs: Apply patch from Ben: Remove dead code from
1048         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1049         as that code just threw an exception anwyays.
1050
1051         * const.cs: Remove the call to the turnintoconstant, for details
1052         see bug: #63144
1053         
1054         * literal.cs: The type of the null-literal is the null type;  So
1055         we use a placeholder type (literal.cs:System.Null, defined here)
1056         for it.
1057
1058         * expression.cs (Conditional.DoResolve): Remove some old code that
1059         is no longer needed, conversions have been fixed.
1060
1061         (ArrayCreationExpression.DoResolve): Return false if we fail to
1062         resolve the inner expression.
1063
1064 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1065
1066         Fix test-290.cs.
1067         * cs-parser.jay (delegate_declaration): Record a delegate
1068         declaration as a type declaration.
1069         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1070
1071 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1072
1073         * parameter.cs: Do not crash if the type can not be resolved. 
1074
1075         * expression.cs: Report errors with unsafe pointers, fixes #64896
1076
1077 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1078
1079         * expression.cs: Pointer arith always needs to do a conv.i
1080         if the operand is a long. fix 65320
1081
1082 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1083
1084         Fixed cs0619-37.cs, cs0619-38.cs
1085
1086         * enum.cs (GetObsoleteAttribute): Removed.
1087
1088         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1089         on Enum member is double staged. The first is tested member
1090         and then enum.
1091
1092 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1093
1094         Fixed #56986, #63631, #65231
1095
1096         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1097         adds member to name container.
1098         (TypeContainer.AddToTypeContainer): New method, adds type to
1099         name container.
1100         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1101         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1102         AddOperator): Simplified by reusing AddToMemberContainer.
1103         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1104         instead of field.
1105         (Method.CheckForDuplications): Fixed implementation to test all
1106         possibilities.
1107         (MemberBase): Detection whether member is explicit interface
1108         implementation is now in constructor.
1109         (MemberBase.UpdateMemberName): Handles IndexerName.
1110         (Accessor): Changed to keep also location information.
1111         (AbstractPropertyEventMethod): Is derived from MemberCore.
1112         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1113         will be emited or not.
1114         (PropertyBase.AreAccessorsDuplicateImplementation):
1115         Tests whether accessors are not in collision with some method.
1116         (Operator): Is derived from MethodCore to simplify common
1117         operations.
1118
1119         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1120         must be performed.
1121         (DeclSpace.AddToContainer): Adds the member to defined_names
1122         table. It tests for duplications and enclosing name conflicts.
1123
1124         * enum.cs (EnumMember): Clean up to reuse the base structures
1125
1126 2004-09-03  Martin Baulig  <martin@ximian.com>
1127
1128         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1129         into TypeContainer, to make partial classes work again.
1130
1131 2004-09-03  Martin Baulig  <martin@ximian.com>
1132
1133         * rootcontext.cs (RootContext.V2): Removed.
1134
1135 2004-03-23  Martin Baulig  <martin@ximian.com>
1136
1137         * expression.cs (Invocation.OverloadResolve): Added `bool
1138         may_fail' argument and use it instead of the Location.IsNull() hack.
1139
1140 2004-09-03  Martin Baulig  <martin@ximian.com>
1141
1142         Merged latest changes into gmcs.  Please keep this comment in
1143         here, it makes it easier for me to see what changed in MCS since
1144         the last time I merged.
1145
1146 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1147
1148         Fix #61128.
1149         * expression.cs (BetterConversion): Don't allow either conversion 
1150         to be null.  Remove redundant implicit conversion test when 'q ==
1151         null' -- when this function is invoked, we already know that the
1152         implicit conversion exists.
1153         (BetterFunction): Assume that 'best' is non-null.  Remove
1154         redundant reimplementation of IsApplicable when 'best' is null.
1155         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1156         number of arguments.
1157         (IsAncestralType): Extract from OverloadResolve.
1158         (OverloadResolve): Make robust to the MethodGroupExpr being
1159         unsorted.  Implement all the logic of Section 14.5.5.1, and
1160         support overloading of methods from multiple applicable types.
1161         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1162
1163         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1164         (RealError, Warning): Append type of report to related symbol.
1165
1166 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1167
1168         * enum.cs: Fixed CLS-Compliance checks for enum members.
1169         Error tests cs3008-8.cs, cs3014-8.cs
1170
1171 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1172
1173         Fixed bug #62342, #63102
1174         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1175         like ImplementMethod.
1176
1177 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1178
1179         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1180         Fixed bug #65170.
1181
1182 2004-09-02  Martin Baulig  <martin@ximian.com>
1183
1184         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1185         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1186         on the MethodBase.
1187
1188 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1189
1190         C# 2.0 Static classes implemented
1191
1192         * class.cs (TypeContainer): instance_constructors,
1193         initialized_fields, initialized_static_fields,
1194         default_constructor, base_inteface_types are protected to be
1195         accessible from StaticClass.
1196         (TypeContainer.DefineDefaultConstructor): New virtual method
1197         for custom default constructor generating
1198         (StaticClass): New class to handle "Static classes" feature.
1199
1200         * cs-parser.jay: Handle static keyword on class like instance
1201         of StaticClass.
1202
1203         * driver.cs: Added "/langversion" command line switch with two
1204         options (iso-1, default).
1205
1206 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1207
1208         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1209
1210 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1211
1212         * delegate.cs: Style.
1213
1214 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1215
1216         * delegate.cs: Add seperate instance expr field for miguel.
1217
1218 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1219
1220         * PointerArithmetic (Resolve): make sure we are not doing
1221         pointer arith on void*. Also, make sure we are resolved
1222         by not setting eclass until resolve.
1223
1224         All callers: Make sure that PointerArithmetic gets resolved.
1225
1226 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1227
1228         * ArrayCreation (LookupType): If the type does not resolve 
1229         to an array, give an error.
1230
1231 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1232
1233         * statement.cs (Try.Resolve): Fixed bug #64222
1234
1235 2004-08-27  Martin Baulig  <martin@ximian.com>
1236
1237         * class.cs
1238         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1239         crash here.     
1240
1241 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1242
1243         * ecore.cs (Constantify): Get underlying type via
1244         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1245         Windows in special cases.
1246
1247 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1248
1249         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1250         for obtaining also private methods.
1251         (GetRemoveMethod): Used GetRemoveMethod (true)
1252         for obtaining also private methods.
1253
1254 2004-08-24  Martin Baulig  <martin@ximian.com>
1255
1256         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1257         MethodAttributes.HideBySig for operators.
1258
1259 2004-08-23  Martin Baulig  <martin@ximian.com>
1260
1261         Back to the old error reporting system :-)
1262
1263         * report.cs (Message): Removed.
1264         (Report.MessageData, ErrorData, WarningData): Removed.
1265         (Report.Error, Warning): Back to the old system.
1266
1267 2004-08-23  Martin Baulig  <martin@ximian.com>
1268
1269         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1270
1271         * class.cs (TypeContainer.ParentContainer): New public virtual
1272         method; replaces the explicit interface implementation.
1273         (ClassPart.ParentContainer): Override.
1274
1275 2004-08-23  Martin Baulig  <martin@ximian.com>
1276
1277         * statement.cs (Switch): Added support for constant switches; see
1278         #59428 or test-285.cs.
1279
1280 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1281
1282         Fixed bug #62740.
1283         * statement.cs (GetEnumeratorFilter): Removed useless
1284         logic because C# specs is strict. GetEnumerator must be
1285         public.
1286
1287 2004-08-22  Martin Baulig  <martin@ximian.com>
1288
1289         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1290         a switch and may break, reset the barrier.  Fixes #59867.
1291
1292 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1293
1294         CLS-Compliance speed up (~5% for corlib)
1295
1296         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1297         New method. Tests container for CLS-Compliant names
1298
1299         * class.cs (TypeContainer.VerifyClsName): New method.
1300         Checks whether container name is CLS Compliant.
1301         (Constructor): Implements IMethodData.
1302
1303         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1304         low-case table for CLS Compliance test.
1305         (MemberCache.VerifyClsParameterConflict): New method.
1306         Checks method parameters for CS3006 error.
1307
1308         * enum.cs (EnumMember): Is derived from MemberCore.
1309         (Enum.VerifyClsName): Optimized for better performance.
1310
1311 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1312
1313         * report.cs: Renamed Error_T to Error and changed all
1314         references.
1315
1316 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1317
1318         * class.cs (TypeContainer.IndexerArrayList): New inner class
1319         container for indexers.
1320         (TypeContainer.DefaultIndexerName): New constant for default
1321         indexer name. Replaced all "Item" with this constant.
1322         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1323
1324         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1325         DefaultMemberAttribute constructor.
1326
1327 2004-08-05  Martin Baulig  <martin@ximian.com>
1328
1329         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1330         Fix bug #59429.
1331
1332 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1333
1334         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1335         multi platforms problem.
1336
1337         * compiler.csproj: Included shared files.
1338
1339 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1340
1341         Fix bug 60333, 55971 in the more general way
1342         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1343         Added arg_type argument for constant conversion.
1344         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1345
1346 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1347
1348         Fix bug #59760
1349         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1350         OperatorArrayList, MethodCoreArrayList for typecontainer
1351         containers. Changed class member types to these new types.
1352         (MethodArrayList.DefineMembers): Added test for CS0659.
1353
1354 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1355
1356         * cfold.cs: Synchronize the folding with the code in expression.cs
1357         Binary.DoNumericPromotions for uint operands.
1358
1359         * attribute.cs: Revert patch from Raja, it introduced a regression
1360         while building Blam-1.2.1 (hard to isolate a test case).
1361
1362 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1363
1364         Fix for #55382
1365         * class.cs:
1366         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1367         name collision.
1368         (MethodCore.parent_method): New member. The method we're overriding
1369         if this is an override method.
1370         (MethodCore.CheckBase): Moved from Method class and made common.
1371         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1372         private.
1373         (MethodCore.CheckForDuplications): New abstract method. For custom
1374         member duplication search in a container
1375         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1376         method and its return type.
1377         (Event.conflict_symbol): New member. Symbol with same name in the
1378         parent class.
1379
1380         * decl.cs:
1381         (MemberCache.FindMemberWithSameName): New method. The method
1382         is looking for conflict with inherited symbols.
1383
1384 2004-08-04  Martin Baulig  <martin@ximian.com>
1385
1386         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1387
1388         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1389
1390 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1391
1392         * report.cs (Message): New enum for better error, warning reference in
1393         the code.
1394         (MessageData): New inner abstract class. It generally handles printing of
1395         error and warning messages.
1396         Removed unused Error, Warning, Message methods.
1397
1398 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1399
1400         Fix for cs0592-8.cs test
1401         * attribute.cs
1402         (Attributable.ValidAttributeTargets): Made public.
1403         (Attribute.ExplicitTarget): New member for explicit target value.
1404         (Attribute.CheckTargets): Now we translate explicit attribute
1405         target to Target here.
1406
1407 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1408
1409         * ecore.cs (MethodGroupExpr): new IsBase property.
1410
1411         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1412
1413         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1414         rather than an instance expr.
1415
1416         (DelegateCreation.Emit): Use the method group rather than
1417         the instance expression. Also, if you have base.Foo as the
1418         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1419
1420         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1421
1422         (NewDelegate.DoResolve): Only check for the existance of Invoke
1423         if the method is going to be needed. Use MethodGroupExpr.
1424
1425         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1426
1427         * expression.cs: For pointer arith., make sure to use
1428         the size of the type, not the size of the pointer to
1429         the type.
1430
1431 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1432
1433         Fix for #60722
1434         * class.cs (Class): Added error CS0502 test.
1435
1436 2004-08-03  John Luke  <jluke@cfl.rr.com>
1437             Raja R Harinath  <rharinath@novell.com>
1438
1439         Fix for #60997.
1440         * attribute.cs (Attribute.complained_before): New flag.
1441         (Attribute.ResolveType, Attribute.Resolve),
1442         (Attribute.DefinePInvokeMethod): Set it.
1443         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1444         
1445 2004-08-03  Martin Baulig  <martin@ximian.com>
1446
1447         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1448         use a user-defined operator; we still need to do numeric
1449         promotions in case one argument is a builtin type and the other
1450         one has an implicit conversion to that type.  Fixes #62322.
1451
1452 2004-08-02  Martin Baulig  <martin@ximian.com>
1453
1454         * statement.cs (LocalInfo.Flags): Added `IsThis'.
1455         (LocalInfo.IsThis): New public property.
1456         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
1457
1458 2004-08-01  Martin Baulig  <martin@ximian.com>
1459
1460         * class.cs (TypeContainer.GetClassBases): Don't set the default
1461         here since we may get called from GetPartialBases().
1462         (TypeContainer.DefineType): If GetClassBases() didn't return a
1463         parent, use the default one.
1464
1465 2004-07-30  Duncan Mak  <duncan@ximian.com>
1466
1467         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
1468
1469 2004-07-30  Martin Baulig  <martin@ximian.com>
1470
1471         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
1472
1473         * class.cs (SourceMethod): New public class, derive from the
1474         symbol writer's ISourceMethod.
1475         (Method): Use the new symbol writer API.
1476
1477         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
1478         as argument and use the new symbol writer.
1479
1480         * location.cs
1481         (SourceFile): Implement the symbol writer's ISourceFile.
1482         (Location.SymbolDocument): Removed.
1483         (Location.SourceFile): New public property.
1484
1485         * symbolwriter.cs: Use the new symbol writer API.
1486
1487 2004-07-30  Raja R Harinath  <rharinath@novell.com>
1488
1489         * Makefile (install-local): Remove.  Functionality moved to
1490         executable.make.
1491
1492 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
1493
1494         * Makefile: Install mcs.exe.config file together with mcs.exe.
1495         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
1496         correct runtime version.
1497         
1498 2004-07-25  Martin Baulig  <martin@ximian.com>
1499
1500         * class.cs
1501         (TypeContainer.RegisterOrder): Removed, this was unused.
1502         (TypeContainer, interface_order): Removed.
1503         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
1504         TypeContainer as argument since we can also be called with a
1505         `PartialContainer' for a partial class/struct/interface.
1506         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
1507         of checking whether we're an `Interface' - we could be a
1508         `PartialContainer'.
1509         (PartialContainer.Register): Override; call
1510         AddClass()/AddStruct()/AddInterface() on our parent.
1511
1512         * cs-parser.jay (interface_member_declaration): Add things to the
1513         `current_container', not the `current_class'.
1514
1515         * rootcontext.cs (RegisterOrder): The overloaded version which
1516         takes an `Interface' was unused, removed.
1517
1518         * typemanager.cs (TypeManager.LookupInterface): Return a
1519         `TypeContainer', not an `Interface'.
1520         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
1521         contain a `PartialContainer' for an interface, so check it's
1522         `Kind' to figure out what it is.
1523
1524 2004-07-25  Martin Baulig  <martin@ximian.com>
1525
1526         * class.cs (Class.DefaultTypeAttributes): New public constant.
1527         (Struct.DefaultTypeAttributes): Likewise.
1528         (Interface.DefaultTypeAttributes): Likewise.
1529         (PartialContainer.TypeAttr): Override this and add the
1530         DefaultTypeAttributes.
1531
1532 2004-07-25  Martin Baulig  <martin@ximian.com>
1533
1534         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
1535         we can just use the `Parent' field instead.
1536
1537 2004-07-25  Martin Baulig  <martin@ximian.com>
1538
1539         * class.cs (TypeContainer.Emit): Renamed to EmitType().
1540
1541 2004-07-25  Martin Baulig  <martin@ximian.com>
1542
1543         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
1544         our parts before defining any methods.
1545         (TypeContainer.VerifyImplements): Make this virtual.
1546         (ClassPart.VerifyImplements): Override and call VerifyImplements()
1547         on our PartialContainer.
1548
1549 2004-07-25  Martin Baulig  <martin@ximian.com>
1550
1551         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1552
1553         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1554         argument, we can just use the `Parent' field instead.
1555
1556         * class.cs
1557         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1558         (MemberBase.DoDefine): Likewise.
1559
1560 2004-07-24  Martin Baulig  <martin@ximian.com>
1561
1562         * decl.cs (MemberCore.Parent): New public field.
1563         (DeclSpace.Parent): Moved to MemberCore.
1564
1565         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1566         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1567         parent's .ctor.
1568         (FieldBase, Field, Operator): Likewise.
1569         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1570         (EventField, Event): Likewise.
1571
1572 2004-07-23  Martin Baulig  <martin@ximian.com>
1573
1574         * class.cs (PartialContainer): New public class.
1575         (ClassPart): New public class.
1576         (TypeContainer): Added support for partial classes.
1577         (TypeContainer.GetClassBases): Splitted some of the functionality
1578         out into GetNormalBases() and GetPartialBases().
1579
1580         * cs-tokenizer.cs (Token.PARTIAL): New token.
1581         (Tokenizer.consume_identifier): Added some hacks to recognize
1582         `partial', but only if it's immediately followed by `class',
1583         `struct' or `interface'.
1584
1585         * cs-parser.jay: Added support for partial clases.
1586
1587 2004-07-23  Martin Baulig  <martin@ximian.com>
1588
1589         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1590         a `DeclSpace' and also made it readonly.
1591         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1592         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1593         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1594
1595         * cs-parser.jay: Pass the `current_class', not the
1596         `current_container' (at the moment, this is still the same thing)
1597         to a new Method, Property, Event, Indexer or Constructor.
1598
1599 2004-07-23  Martin Baulig  <martin@ximian.com>
1600
1601         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1602         and removed the `current_interface' one.
1603         (struct_declaration, class_declaration, interface_declaration):
1604         Set `current_class' to the newly created class/struct/interface;
1605         set their `Bases' and call Register() before parsing their body.
1606
1607 2004-07-23  Martin Baulig  <martin@ximian.com>
1608
1609         * class.cs (Kind): New public enum.
1610         (TypeContainer): Made this class abstract.
1611         (TypeContainer.Kind): New public readonly field.
1612         (TypeContainer.CheckDef): New public method; moved here from
1613         cs-parser.jay.
1614         (TypeContainer.Register): New public abstract method.
1615         (TypeContainer.GetPendingImplementations): New public abstract
1616         method.
1617         (TypeContainer.GetClassBases): Removed the `is_class' and
1618         `is_iface' parameters.
1619         (TypeContainer.DefineNestedTypes): Formerly known as
1620         DoDefineType().
1621         (ClassOrStruct): Made this class abstract.
1622
1623         * tree.cs (RootTypes): New public type. 
1624
1625 2004-07-20  Martin Baulig  <martin@ximian.com>
1626
1627         * tree.cs (Tree.RecordNamespace): Removed.
1628         (Tree.Namespaces): Removed.
1629
1630         * rootcontext.cs (RootContext.IsNamespace): Removed.
1631
1632         * cs-parser.jay (namespace_declaration): Just create a new
1633         NamespaceEntry here.
1634
1635 2004-07-20  Martin Baulig  <martin@ximian.com>
1636
1637         * statement.cs (ExceptionStatement): New abstract class.  This is
1638         now used as a base class for everyone who's using `finally'.
1639         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
1640         our local variables before using them.
1641
1642         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
1643         virtual method.  This is used by Yield.Resolve() to "steal" an
1644         outer block's `finally' clauses.
1645         (FlowBranchingException): The .ctor now takes an ExceptionStatement
1646         argument.
1647
1648         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
1649         version which takes an ExceptionStatement.  This version must be
1650         used to create exception branchings.
1651
1652         * iterator.cs
1653         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
1654         (Iterator.EmitMoveNext): Added exception support; protect the
1655         block with a `fault' clause, properly handle 'finally' clauses.
1656         (Iterator.EmitDispose): Run all the `finally' clauses here.
1657
1658 2004-07-20  Martin Baulig  <martin@ximian.com>
1659
1660         * iterator.cs: This is the first of a set of changes in the
1661         iterator code.  Match the spec more closely: if we're an
1662         IEnumerable, then GetEnumerator() must be called.  The first time
1663         GetEnumerator() is called, it returns the current instance; all
1664         subsequent invocations (if any) must create a copy.
1665
1666 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
1667
1668         * expression.cs: Resolve the constant expression before returning
1669         it. 
1670
1671 2004-07-19  Martin Baulig  <martin@ximian.com>
1672
1673         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
1674         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
1675         the return type of the new EmitContext.
1676
1677 2004-07-18  Martin Baulig  <martin@ximian.com>
1678
1679         * class.cs (Property.Define): Fix iterators.
1680
1681         * iterators.cs (Iterator.Define): Moved the
1682         `container.AddInterator (this)' call here from the .ctor; only do
1683         it if we resolved successfully.
1684
1685 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
1686
1687         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
1688         `true' for preprocessing directives that we parse.  The return
1689         value indicates whether we should return to regular tokenizing or
1690         not, not whether it was parsed successfully.
1691
1692         In the past if we were in: #if false ... #line #endif, we would
1693         resume parsing after `#line'.  See bug 61604.
1694
1695         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
1696         building: IsEnumType should return true only for enums, not for
1697         enums or System.Enum itself.  This fixes #61593.
1698
1699         Likely what happened is that corlib was wrong: mcs depended on
1700         this bug in some places.  The bug got fixed, we had to add the
1701         hack, which caused bug 61593.
1702
1703         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
1704         that was a workaround for the older conditions.
1705
1706 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
1707
1708         * assign.cs: IAssignMethod has a new interface, as documented
1709         inline. All assignment code now uses this new api.
1710
1711         * ecore.cs, expression.cs: All classes which implement
1712         IAssignMethod now use the new interface.
1713
1714         * expression.cs (Invocation): add a hack to EmitCall so that
1715         IndexerAccess can be the target of a compound assignment without
1716         evaluating its arguments twice.
1717
1718         * statement.cs: Handle changes in Invocation api.
1719
1720 2004-07-16  Martin Baulig  <martin@ximian.com>
1721
1722         * iterators.cs: Rewrote this.  We're now using one single Proxy
1723         class for both the IEnumerable and the IEnumerator interface and
1724         `Iterator' derives from Class so we can use the high-level API.
1725
1726         * class.cs (TypeContainer.AddIterator): New method.
1727         (TypeContainer.DoDefineType): New protected virtual method, which
1728         is called from DefineType().
1729         (TypeContainer.DoDefineMembers): Call DefineType() and
1730         DefineMembers() on all our iterators.
1731         (TypeContainer.Emit): Call Emit() on all our iterators.
1732         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1733
1734         * codegen.cs (EmitContext.CurrentIterator): New public field.
1735
1736 2004-07-15  Martin Baulig  <martin@ximian.com>
1737
1738         * typemanager.cs
1739         (TypeManager.not_supported_exception_type): New type.   
1740
1741 2004-07-14  Martin Baulig  <martin@ximian.com>
1742
1743         * iterators.cs: Use real error numbers.
1744
1745 2004-07-14  Martin Baulig  <martin@ximian.com>
1746
1747         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1748         requires this to be a System.Collection.IEnumerable and not a
1749         class implementing that interface.
1750         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1751
1752 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1753
1754         * class.cs: Fixed previous fix, it broke some error tests.
1755
1756 2004-07-12  Martin Baulig  <martin@ximian.com>
1757
1758         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1759         Fixes #61293.
1760
1761 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1762
1763         * assign.cs (LocalTemporary): Add new argument: is_address,If
1764         `is_address' is true, then the value that we store is the address
1765         to the real value, and not the value itself.
1766         
1767         * ecore.cs (PropertyExpr): use the new local temporary
1768         stuff to allow us to handle X.Y += z (where X is a struct)
1769
1770 2004-07-08  Martin Baulig  <martin@ximian.com>
1771
1772         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1773         not always return, just like we're doing in Using.Resolve().
1774
1775 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1776
1777         * cs-parser.jay (fixed_statement): flag this as Pinned.
1778
1779 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1780
1781         * typemanager.cs (TypeManager): Removed MakePinned method, this
1782         mechanism is replaced with the .NET 2.x compatible mechanism of
1783         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1784
1785         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1786         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1787         `IsFixed' property which has a different meaning.
1788
1789 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1790
1791         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1792         visible from inside a nested class, not just the names of the
1793         immediately enclosing class.
1794         Fix for bug #60730.
1795
1796 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1797
1798         * expression.cs (BetterConversion): Remove buggy special-case
1799         handling of "implicit constant expression conversions".  At this
1800         point, we already know that the conversion is possible -- we're
1801         only checking to see which is better.
1802
1803 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1804
1805         * cs-parser.jay: Added error CS0210 test.
1806
1807 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1808
1809         * cs-parser.jay: Added error CS0134 test.
1810
1811 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1812
1813         Fix bug #52507
1814         * cs-parser.jay: Added error CS0145 test.
1815
1816 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1817
1818         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1819
1820 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1821         
1822         * expression.cs (StackAlloc.Resolve): The argument may not
1823         be a constant; deal with this case.
1824         
1825 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1826
1827         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1828         GetIndexerAttributeValue.
1829         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1830
1831         * class.cs (Indexer.Define): Added error tests for CS0415,
1832         CS0609.
1833
1834 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1835
1836         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1837         property code.
1838
1839 2004-06-23  Martin Baulig  <martin@ximian.com>
1840
1841         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1842         neither return nor throw, reset the barrier as well.  Fixes #60457.
1843
1844 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1845
1846         * class.cs : EventAttributes is now set to None by default.
1847           This fixes bug #60459.
1848
1849 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1850
1851         Fix bug #60219
1852         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1853         Don't throw exception but return null (it's sufficient now).
1854
1855 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1856
1857         * typemanager.cs (GetArgumentTypes): Faster implementation.
1858
1859 2004-06-18  Martin Baulig  <martin@ximian.com>
1860
1861         * attribute.cs (Attribute.Resolve): Check whether we're an
1862         EmptyCast which a Constant child.  Fixes #60333.
1863
1864 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1865
1866         * statement.cs (EmitCollectionForeach): Account for the fact that
1867         not all valuetypes are in areas which we can take the address of.
1868         For these variables, we store to a temporary variable. Also, make
1869         sure that we dont emit a `callvirt' on a valuetype method.
1870
1871 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1872
1873         * expression.cs (StackAlloc.DoReSolve): Added test for
1874         negative parameter (CS0247).
1875
1876 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1877
1878         Fix bug #59792
1879         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1880
1881 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1882
1883         Fix bug #59781
1884         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1885         ulong.
1886
1887 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1888
1889         Fix bug #58254 & cs1555.cs, cs1556.cs
1890         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1891
1892 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1893
1894         * cs-parser.jay: Added error CS1669 test for indexers.
1895
1896 2004-06-11  Martin Baulig  <martin@ximian.com>
1897
1898         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1899         call this twice: for params and varargs methods.
1900
1901 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1902
1903         * class.cs:
1904         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1905
1906 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1907
1908         * attribute.cs (Attribute.GetValidTargets): Made public.
1909
1910         * class.cs: 
1911         (AbstractPropertyEventMethod): New class for better code sharing.
1912         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1913         CS1667 report.
1914         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1915
1916 2004-06-11  Raja R Harinath  <rharinath@novell.com>
1917
1918         Fix bug #59477.
1919         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
1920         that the call to Resolve is part of a MemberAccess.
1921         (Expression.Resolve): Use it for SimpleName resolution.
1922         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
1923         Add 'intermediate' boolean argument.
1924         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
1925         error message when the SimpleName can be resolved ambiguously
1926         between an expression and a type.
1927         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
1928         public.
1929         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
1930         call on the left-side.
1931
1932 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1933
1934         * class.cs:
1935         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
1936
1937 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1938
1939         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
1940
1941 2004-06-11  Martin Baulig  <martin@ximian.com>
1942
1943         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
1944         varargs methods if applicable.
1945
1946 2004-06-11  Martin Baulig  <martin@ximian.com>
1947
1948         * expression.cs (Invocation.EmitCall): Don't use
1949         `method.CallingConvention == CallingConventions.VarArgs' since the
1950         method could also have `CallingConventions.HasThis'.
1951
1952 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1953
1954         * class.cs (Event.GetSignatureForError): Implemented.
1955         Fixed crash in error test cs3010.cs
1956
1957 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
1958
1959         * cs-tokenizer.cs: Change the way we track __arglist to be
1960         consistent with the other keywords.
1961
1962 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
1963
1964         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
1965         tomorrow.
1966
1967 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
1968
1969         * codegen.cs: Check that all referenced assemblies have a strongname
1970         before strongnaming the compiled assembly. If not report error CS1577.
1971         Fix bug #56563. Patch by Jackson Harper.
1972         * typemanager.cs: Added a method to return all referenced assemblies.
1973         Fix bug #56563. Patch by Jackson Harper.
1974
1975 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1976
1977         * class.cs:
1978         (Method.ApplyAttributeBuilder): Moved and added conditional
1979         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
1980
1981         * delegate.cs:
1982         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
1983
1984 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1985
1986         Fixed #59640
1987         * class.cs: (EventField.attribute_targets): Changed default target.
1988
1989 2004-06-08  Martin Baulig  <martin@ximian.com>
1990
1991         * expression.cs (Invocation.EmitCall): Enable varargs methods.
1992
1993 2004-06-08  Martin Baulig  <martin@ximian.com>
1994
1995         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
1996
1997 2004-06-07  Martin Baulig  <martin@ximian.com>
1998
1999         Added support for varargs methods.
2000
2001         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2002         keyword.
2003
2004         * cs-parser.jay: Added support for `__arglist'.
2005
2006         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2007
2008         * expression.cs (Argument.AType): Added `ArgList'.
2009         (Invocation): Added support for varargs methods.
2010         (ArglistAccess): New public class.
2011         (Arglist): New public class.
2012
2013         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2014
2015         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2016         a method's top-level block if the method has varargs.
2017
2018         * support.cs (ReflectionParameters, InternalParameters): Added
2019         support for varargs methods.    
2020
2021 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2022
2023         * class.cs: Provide location in indexer error report.
2024
2025         * driver.cs: Use standard names.
2026
2027         * namespace.cs: Catch the use of using after a namespace has been
2028         declared also on using aliases.
2029
2030 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2031
2032         Bug #50820.
2033         * typemanager.cs (closure_private_ok, closure_invocation_type)
2034         (closure_qualifier_type, closure_invocation_assembly)
2035         (FilterWithClosure): Move to ...
2036         (Closure): New internal nested class.
2037         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2038         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2039         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2040         (MemberLookup, MemberLookupFailed): Use it.
2041         * expression.cs (New.DoResolve): Treat the lookup for the
2042         constructor as being qualified by the 'new'ed type.
2043         (Indexers.GetIndexersForTypeOrInterface): Update.
2044
2045 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2046
2047         * attribute.cs
2048         (GetConditionalAttributeValue): New method. Returns
2049         condition of ConditionalAttribute.
2050         (SearchMulti): New method.  Returns all attributes of type 't'.
2051         Use it when attribute is AllowMultiple = true.
2052         (IsConditionalMethodExcluded): New method.
2053
2054         * class.cs
2055         (Method.IsExcluded): Implemented. Returns true if method has conditional
2056         attribute and the conditions is not defined (method is excluded).
2057         (IMethodData): Extended interface for ConditionalAttribute support.
2058         (PropertyMethod.IsExcluded): Implemented.
2059
2060         * decl.cs
2061         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2062
2063         * expression.cs
2064         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2065         on the method.
2066
2067 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2068
2069         * expression.cs (ArrayCreationExpression): Make this just an
2070         `expression'. It can't be a statement, so the code here was
2071         dead.
2072
2073 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2074
2075         Fixed #59072
2076         * typemanager.cs (GetFullNameSignature): New method for
2077         MethodBase types.
2078
2079 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2080
2081         Fixed #56452
2082         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2083         Use this method when MethodBuilder is null.
2084         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2085         Added test for error CS0626 (MONO reports error for this situation).
2086         (IMethodData.GetSignatureForError): Extended interface.
2087
2088 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2089
2090         * attribute.cs
2091         (AttributeTester.GetObsoleteAttribute): Returns instance of
2092         ObsoleteAttribute when type is obsolete.
2093
2094         * class.cs
2095         (TypeContainer.VerifyObsoleteAttribute): Override.
2096         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2097         (MethodCode.VerifyObsoleteAttribute): Override.
2098         (MemberBase.VerifyObsoleteAttribute): Override.
2099
2100         * decl.cs
2101         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2102         and report proper error.
2103
2104         *delegate.cs
2105         Delegate.VerifyObsoleteAttribute): Override.
2106
2107         * ecore.cs
2108         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2109         and report proper error.
2110         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2111
2112         * enum.cs
2113         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2114         and enum member.
2115
2116         * expression.cs
2117         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2118         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2119         Added test for ObsoleteAttribute.
2120
2121         * statement.cs
2122         (Catch): Derived from Statement.
2123
2124 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2125  
2126         Fixed bug #59071 & cs0160.cs
2127  
2128         * statement.cs (Try.Resolve): Check here whether order of catch
2129         clauses matches their dependencies.
2130
2131 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2132
2133         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2134         caused a regression: #59343.  Referencing nested classes from an
2135         assembly stopped working.
2136
2137 2004-05-31  Martin Baulig  <martin@ximian.com>
2138
2139         MCS is now frozen for beta 2.
2140
2141 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2142
2143         * convert.cs: add a trivial cache for overload operator resolution.
2144
2145 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2146
2147         * decl.cs: If possible, use lookuptypedirect here. We can only do
2148         this if there is no `.' after the namespace. Avoids using
2149         LookupType, which does lots of slow processing.
2150         (FindNestedType) New method, does what it says :-).
2151         * namespace.cs: use LookupTypeDirect.
2152         * rootcontext.cs: use membercache, if possible.
2153         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2154
2155 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2156
2157         * expression.cs:
2158         According to the spec, 
2159
2160         In a member access of the form E.I, if E is a single identifier,
2161         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2162         field, property, localvariable, or parameter with the same type as
2163         the meaning of E as a type-name (§3.8), then both possible
2164         meanings of E are permitted.
2165
2166         We did not check that E as a simple-name had the same type as E as
2167         a type name.
2168
2169         This trivial check gives us 5-7% on bootstrap time.
2170
2171 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2172
2173         * expression.cs (Invocation.OverloadResolve): Avoid the
2174         use of hashtables and boxing here by allocating on demand.
2175
2176 2004-05-30  Martin Baulig  <martin@ximian.com>
2177
2178         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2179         we're doing a silent lookup.  Don't try to lookup nested types in
2180         TypeManager.object_type (thanks to Ben Maurer).
2181
2182 2004-05-30  Martin Baulig  <martin@ximian.com>
2183
2184         Committing a patch from Ben Maurer.
2185
2186         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2187
2188 2004-05-29  Martin Baulig  <martin@ximian.com>
2189
2190         * class.cs (IMethodData.ShouldIgnore): New method.
2191
2192         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2193         `Location' argument, we don't need it anywhere.  Use
2194         `IMethodData.ShouldIgnore ()' instead of
2195         `MethodData.GetMethodFlags ()'.
2196         (TypeManager.AddMethod): Removed.
2197         (TypeManager.AddMethod2): Renamed to AddMethod.
2198
2199 2004-05-29  Martin Baulig  <martin@ximian.com>
2200
2201         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2202
2203         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2204         converting from a class type S to an interface type and we already
2205         have an object on the stack, don't box it again.  Fixes #52578.
2206
2207 2004-05-29  Martin Baulig  <martin@ximian.com>
2208
2209         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2210         Added support for `params' parameters.  Fixes #59267.
2211
2212 2004-05-29  Martin Baulig  <martin@ximian.com>
2213
2214         * literal.cs (NullPointer): Provide a private .ctor which sets
2215         `type' to TypeManager.object_type.  Fixes #59048.
2216
2217 2004-05-29  Martin Baulig  <martin@ximian.com>
2218
2219         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2220         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2221
2222         * ecore.cs (EventExpr.instance_expr): Make the field private.
2223
2224 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2225
2226         Fixed bug #50080 & cs0214-2.cs
2227         * expression.cs (Cast.DoResolve): Check unsafe context here.
2228         
2229         * statement.cs (Resolve.DoResolve): Likewise.
2230
2231 2004-05-26  Martin Baulig  <martin@ximian.com>
2232
2233         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2234
2235         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2236         (RootContext.LookupType): Pass down the `silent' flag.
2237
2238 2004-05-25  Martin Baulig  <martin@ximian.com>
2239
2240         * expression.cs
2241         (MethodGroupExpr.IdenticalTypeName): New public property.
2242         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2243         expression actually refers to a type.
2244
2245 2004-05-25  Martin Baulig  <martin@ximian.com>
2246
2247         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2248         for #56176 and made it actually work.
2249
2250 2004-05-25  Martin Baulig  <martin@ximian.com>
2251
2252         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2253         (FieldExpr, PropertyExpr): Override and implement
2254         CacheTemporaries.  Fixes #52279.
2255
2256 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2257
2258         * location.cs: In the new compiler listing a file twice is a
2259         warning, not an error.
2260
2261 2004-05-24  Martin Baulig  <martin@ximian.com>
2262
2263         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2264         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2265
2266 2004-05-24  Martin Baulig  <martin@ximian.com>
2267
2268         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2269         walking the `using' list.  Fixes #53921.
2270
2271 2004-05-24  Martin Baulig  <martin@ximian.com>
2272
2273         * const.cs (Const.LookupConstantValue): Added support for
2274         EmptyCast's; fixes #55251.
2275
2276 2004-05-24  Martin Baulig  <martin@ximian.com>
2277
2278         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2279         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2280         which does the CS0135 check.  The reason is that we first need to
2281         check whether the variable actually exists.
2282
2283 2004-05-24  Martin Baulig  <martin@ximian.com>
2284
2285         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2286         than RootContext.LookupType() to find the explicit interface
2287         type.  Fixes #58584.
2288
2289 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2290
2291         * Makefile: Simplify.  Use executable.make.
2292         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2293
2294 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2295
2296         * decl.cs:
2297         * enum.cs:
2298         Use the invariant culture when doing String.Compare for CLS case
2299         sensitivity.
2300         
2301 2004-05-23  Martin Baulig  <martin@ximian.com>
2302
2303         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2304         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2305
2306         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2307         
2308 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2309
2310         * class.cs (MemberBase.Define): Reuse MemberType member for 
2311         resolved type. Other methods can use it too.
2312
2313 2004-05-23  Martin Baulig  <martin@ximian.com>
2314
2315         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2316         the variable also exists in the current block (otherwise, we need
2317         to report a CS0103).  Fixes #58670.
2318
2319 2004-05-23  Martin Baulig  <martin@ximian.com>
2320
2321         * flowanalysis.cs (Reachability.Reachable): Compute this
2322         on-the-fly rather than storing it as a field.
2323
2324 2004-05-23  Martin Baulig  <martin@ximian.com>
2325
2326         * flowanalysis.cs (Reachability.And): Manually compute the
2327         resulting `barrier' from the reachability.      
2328        
2329 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2330
2331         Fix bug #57835
2332         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2333         instance of ObsoleteAttribute when symbol is obsolete.
2334
2335         * class.cs
2336         (IMethodData): Extended interface for ObsoleteAttribute support.
2337
2338 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2339
2340         * attribute.cs: Fix bug #55970
2341
2342 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2343
2344         Fix bug #52705
2345         * attribute.cs
2346         (GetObsoleteAttribute): New method. Creates the instance of
2347         ObsoleteAttribute.
2348         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2349         ObsoleteAttribute when member is obsolete.
2350         (AttributeTester.Report_ObsoleteMessage): Common method for
2351         Obsolete error/warning reporting.
2352
2353         * class.cs
2354         (TypeContainer.base_classs_type): New member for storing parent type.
2355
2356         * decl.cs
2357         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2358         for this MemberCore.
2359
2360 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2361
2362         * attribute.cs, const.cs: Fix bug #58590
2363
2364 2004-05-21  Martin Baulig  <martin@ximian.com>
2365
2366         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2367         out parameters if the end of the method is unreachable.  Fixes
2368         #58098. 
2369
2370 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2371
2372         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2373         Hari was right, why extra method.
2374
2375 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2376
2377         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2378
2379 2004-05-20  Martin Baulig  <martin@ximian.com>
2380
2381         Merged this back from gmcs to keep the differences to a minumum.
2382
2383         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
2384         instead of a Declspace.
2385         (Attribute.ResolveType): Likewise.
2386         (Attributes.Search): Likewise.
2387         (Attributes.Contains): Likewise.
2388         (Attributes.GetClsCompliantAttribute): Likewise.
2389
2390         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
2391         argument.
2392         (MethodData.ApplyAttributes): Take an EmitContext instead of a
2393         DeclSpace.
2394
2395 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2396
2397         Fix bug #58688 (MCS does not report error when the same attribute
2398         is assigned twice)
2399
2400         * attribute.cs (Attribute.Emit): Distinction between null and default.
2401
2402 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2403
2404         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2405         of a top-level attribute without an attribute target.
2406         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2407         Make non-static.
2408         (Attribute.Conditional_GetConditionName), 
2409         (Attribute.Obsolete_GetObsoleteMessage): Update.
2410         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2411         part of ScanForIndexerName.
2412         (Attribute.CanIgnoreInvalidAttribute): New function.
2413         (Attribute.ScanForIndexerName): Move to ...
2414         (Attributes.ScanForIndexerName): ... here.
2415         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2416         (Attributes.Search): New internal variant that can choose not to
2417         complain if types aren't resolved.  The original signature now
2418         complains.
2419         (Attributes.GetClsCompliantAttribute): Use internal variant, with
2420         complaints suppressed.
2421         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2422         only if it not useful.
2423         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2424         top-level for attributes that are shared between the assembly
2425         and a top-level class.
2426         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2427         * class.cs: Update to reflect changes.
2428         (DefineIndexers): Fuse loops.
2429         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2430         a couple more variants of attribute names.
2431
2432 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2433
2434         Fix bug #52585 (Implemented explicit attribute declaration)
2435
2436         * attribute.cs:
2437         (Attributable.ValidAttributeTargets): New abstract method. It gets
2438         list of valid attribute targets for explicit target declaration.
2439         (Attribute.Target): It holds target itself.
2440         (AttributeSection): Removed.
2441         (Attribute.CheckTargets): New method. It checks whether attribute
2442         target is valid for the current element.
2443
2444         * class.cs:
2445         (EventProperty): New class. For events that are declared like
2446         property (with add and remove accessors).
2447         (EventField): New class. For events that are declared like field.
2448         class.cs
2449
2450         * cs-parser.jay: Implemented explicit attribute target declaration.
2451
2452         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2453         Override ValidAttributeTargets.
2454
2455         * parameter.cs:
2456         (ReturnParameter): Class for applying custom attributes on 
2457         the return type.
2458         (ParameterAtribute): New class. Class for applying custom
2459         attributes on the parameter type.
2460
2461 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
2462
2463         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
2464         definitions. 
2465
2466         (Method): Allow UNSAFE here.
2467
2468         * modifiers.cs: Support unsafe reporting.
2469
2470 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
2471
2472         * decl.cs: Fix bug #58478.
2473
2474 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2475
2476         * statement.cs: When checking for unreachable code on an EmptyStatement,
2477         set the location. Fixes bug #58488.
2478
2479 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
2480
2481         * driver.cs: Add -pkg handling.
2482
2483         From Gonzalo: UseShelLExecute=false
2484
2485 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
2486
2487         * attribute.cs:
2488         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
2489         for attribute.
2490         (Attribute.IsClsCompliaceRequired): Moved to base for better
2491         accesibility.
2492         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
2493         when attribute is AttributeUsageAttribute.
2494         (Attribute.GetValidTargets): Simplified.
2495         (Attribute.GetAttributeUsage): New method returns AttributeUsage
2496         attribute for this type.
2497         (Attribute.ApplyAttributes): Method renamed to Emit and make
2498         non-static.
2499         (GlobalAttributeSection): New class for special handling of global
2500         attributes (assembly, module).
2501         (AttributeSection.Emit): New method.
2502
2503         * class.cs: Implemented Attributable abstract methods.
2504         (MethodCore.LabelParameters): Moved to Parameter class.
2505         (Accessor): Is back simple class.
2506         (PropertyMethod): Implemented Attributable abstract class.
2507         (DelegateMethod): Implemented Attributable abstract class.
2508         (Event): New constructor for disctintion between normal Event
2509         and Event with accessors.
2510
2511         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
2512
2513         * codegen.cs, const.cs, decl.cs, delegate.cs:
2514         (CommonAssemblyModulClass): Implemented Attributable abstract class
2515         and simplified.
2516
2517         * enum.cs: Implement IAttributeSupport interface.
2518         (EnumMember): New class for emum members. Implemented Attributable
2519         abstract class
2520
2521         * parameter.cs:
2522         (ParameterBase): Is abstract.
2523         (ReturnParameter): New class for easier [return:] attribute handling.
2524
2525         * typemanager.cs: Removed builder_to_attr.
2526
2527 2004-05-11  Raja R Harinath  <rharinath@novell.com>
2528
2529         Fix bug #57151.
2530         * attribute.cs (Attribute.GetPositionalValue): New function.
2531         * class.cs (TypeContainer.VerifyMembers): New function.
2532         (TypeContainer.Emit): Use it.
2533         (ClassOrStruct): New base class for Class and Struct.
2534         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
2535         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
2536         class.
2537         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
2538         then each non-static field should have a FieldOffset attribute.
2539         Otherwise, none of the fields should have a FieldOffset attribute.
2540         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
2541         and FieldOffset attributes.
2542         * typemanager.cs (TypeManager.struct_layout_attribute_type)
2543         (TypeManager.field_offset_attribute_type): New core types.
2544         (TypeManager.InitCoreTypes): Initialize them.
2545
2546 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
2547
2548         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
2549         Return correct type.
2550         From bug #58270.
2551
2552 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
2553
2554         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
2555         be implicitly converted to ulong.
2556         
2557         * expression.cs: The logic for allowing operator &, | and ^ worked
2558         was wrong, it worked before because we did not report an error in
2559         an else branch.  Fixes 57895.
2560
2561         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
2562         allow volatile fields to be reference types.
2563
2564 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
2565
2566         * driver.cs: Add support for /debug-
2567
2568 2004-05-07  Raja R Harinath  <rharinath@novell.com>
2569
2570         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
2571         Add a 'complain' parameter to silence errors.
2572         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
2573         silently overlooked type-resolutions.
2574         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
2575         to reflect changes.
2576         (Attributes.Search): New function.
2577         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
2578         (Attributes.GetAttributeFullName): Remove hack.
2579         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
2580         Update to reflect changes.
2581         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
2582         Use Attributes.Search instead of nested loops.
2583
2584 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
2585
2586         * decl.cs:
2587         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
2588         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
2589         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
2590
2591         * report.cs: (Report.Warning): Renamed to Warning_T because of
2592         parameter collision.
2593
2594 2004-05-05  Raja R Harinath  <rharinath@novell.com>
2595
2596         * expression.cs (MemberAccess.ResolveMemberAccess):
2597         Exit with non-zero status after Report.Error.
2598         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
2599         Likewise.
2600         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
2601
2602 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2603
2604         * support.cs: Don't hang when the file is empty.
2605
2606 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2607
2608         * support.cs: In SeekableStreamReader, compute the preamble size of the
2609           underlying stream. Position changes should take into account that initial
2610           count of bytes.
2611
2612 2004-05-03  Todd Berman  <tberman@sevenl.net>
2613
2614         * driver.cs: remove unused GetSysVersion function.
2615
2616 2004-05-03  Todd Berman  <tberman@sevenl.net>
2617
2618         * driver.cs: Remove the hack from saturday, as well as the hack
2619         from jackson (LoadAssemblyFromGac), also adds the CWD to the
2620         link_paths to get that bit proper.
2621
2622 2004-05-01  Todd Berman  <tberman@sevenl.net>
2623
2624         * driver.cs: Try a LoadFrom before a Load, this checks the current
2625         path. This is currently a bug in mono that is be fixed, however, this
2626         provides a workaround for now. This will be removed when the bug
2627         is fixed.
2628
2629 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
2630
2631         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2632         incomplete key pairs (#57941).
2633
2634 2004-05-01  Todd Berman  <tberman@sevenl.net>
2635
2636         * driver.cs: Remove '.' from path_chars, now System.* loads properly
2637         from the GAC
2638
2639 2004-04-30  Jackson Harper  <jackson@ximian.com>
2640
2641         * codegen.cs: Open keys readonly.
2642         
2643 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2644
2645         * typemanager.cs: don't report cyclic struct layout when a struct
2646         contains 2 or more fields of the same type. Failed for Pango.AttrShape
2647         which has 2 Pango.Rectangle fields.
2648
2649 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2650
2651         * expression.cs: Handle IntPtr comparisons with IL code
2652         rather than a method call.
2653
2654 2004-04-29  Martin Baulig  <martin@ximian.com>
2655
2656         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
2657         the list of PropertyInfo's in class hierarchy and find the
2658         accessor.  Fixes #56013.
2659
2660 2004-04-29  Martin Baulig  <martin@ximian.com>
2661
2662         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2663
2664 2004-04-29  Martin Baulig  <martin@ximian.com>
2665
2666         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2667
2668         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2669
2670 2004-04-29  Martin Baulig  <martin@ximian.com>
2671
2672         * class.cs (ConstructorInitializer.Resolve): Check whether the
2673         parent .ctor is accessible.  Fixes #52146.
2674
2675 2004-04-29  Martin Baulig  <martin@ximian.com>
2676
2677         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2678
2679         * statement.cs (Using.EmitLocalVariableDecls): Use
2680         TypeManager.idisposable_type, not typeof (IDisposable).
2681         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2682
2683 2004-04-29  Martin Baulig  <martin@ximian.com>
2684
2685         * class.cs (Event.Define): Don't emit the field and don't set
2686         RTSpecialName and SpecialName for events on interfaces.  Fixes
2687         #57703. 
2688
2689 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2690
2691         Refactor Attribute.ApplyAttributes.
2692         * attribute.cs (Attributable): New base class for objects that can
2693         have Attributes applied on them.
2694         (Attribute): Make AttributeUsage fields public.
2695         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2696         (Attribute.IsInternalCall): New property.
2697         (Attribute.UsageAttr): Convert to a public read-only property.
2698         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2699         (Attribute.ResolveType, Attribute.Resolve)
2700         (Attribute.ScanForIndexerName): Update to reflect changes.
2701         (Attribute.CheckAttributeTarget): Re-format.
2702         (Attribute.ApplyAttributes): Refactor, to various
2703         Attributable.ApplyAttributeBuilder methods.
2704         * decl.cs (MemberCore): Make Attributable.
2705         * class.cs (Accessor): Make Attributable.
2706         (MethodData.ApplyAttributes): Use proper attribute types, not
2707         attribute names.
2708         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2709         (TypeContainer.ApplyAttributeBuilder)
2710         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2711         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2712         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2713         (Operator.ApplyAttributeBuilder): New factored-out methods.
2714         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2715         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2716         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2717         * parameter.cs (ParameterBase): New Attributable base class
2718         that can also represent Return types.
2719         (Parameter): Update to the changes.
2720
2721 2004-04-29  Jackson Harper  <jackson@ximian.com>
2722
2723         * driver.cs: Prefer the corlib system version when looking for
2724         assemblies in the GAC. This is still a hack, but its a better hack
2725         now.
2726         
2727 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2728
2729         * decl.cs, enum.cs: Improved error 3005 reporting.
2730   
2731         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2732         (related_symbols): New private member for list of symbols
2733         related to reported error/warning.
2734         
2735         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2736
2737 2004-04-29  Martin Baulig  <martin@ximian.com>
2738
2739         * ecore.cs (Expression.Constantify): If we're an enum and
2740         TypeManager.TypeToCoreType() doesn't give us another type, use
2741         t.UnderlyingSystemType.  Fixes #56178.  
2742
2743 2004-04-29  Martin Baulig  <martin@ximian.com>
2744
2745         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2746         interfaces and for each interface, only add members directly
2747         declared in that interface.  Fixes #53255.
2748
2749 2004-04-28  Martin Baulig  <martin@ximian.com>
2750
2751         * expression.cs (ConditionalLogicalOperator): Use a temporary
2752         variable for `left' to avoid that we evaluate it more than once;
2753         bug #52588.
2754
2755 2004-04-28  Martin Baulig  <martin@ximian.com>
2756
2757         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2758         `void[]' (CS1547).
2759
2760 2004-04-28  Martin Baulig  <martin@ximian.com>
2761
2762         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2763         void (CS1547).
2764
2765         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2766         whether the type is not void (CS1547).
2767
2768 2004-04-28  Martin Baulig  <martin@ximian.com>
2769
2770         * expression.cs (Unary.DoResolveLValue): Override this and report
2771         CS0131 for anything but Operator.Indirection.
2772
2773 2004-04-28  Martin Baulig  <martin@ximian.com>
2774
2775         Committing a patch from Ben Maurer; see bug #50820.
2776
2777         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2778         check for classes.
2779
2780         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2781         classes.        
2782
2783 2004-04-28  Martin Baulig  <martin@ximian.com>
2784
2785         Committing a patch from Ben Maurer; see bug #50820.
2786
2787         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2788         check for classes.
2789
2790         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2791         classes.        
2792
2793 2004-04-28  Martin Baulig  <martin@ximian.com>
2794
2795         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2796         (Block.AddLabel): Call DoLookupLabel() to only search in the
2797         current block.
2798
2799 2004-04-28  Martin Baulig  <martin@ximian.com>
2800
2801         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2802         comparing StringConstants and NullLiterals in Equality and Inequality.
2803
2804 2004-04-28  Jackson Harper  <jackson@ximian.com>
2805
2806         * driver.cs: Attempt to load referenced assemblies from the
2807         GAC. This is the quick and dirty version of this method that
2808         doesnt take into account versions and just takes the first
2809         canidate found. Will be good enough for now as we will not have more
2810         then one version installed into the GAC until I update this method.
2811
2812 2004-04-28  Martin Baulig  <martin@ximian.com>
2813
2814         * typemanager.cs (TypeManager.CheckStructCycles): New public
2815         static method to check for cycles in the struct layout.
2816
2817         * rootcontext.cs (RootContext.PopulateTypes): Call
2818         TypeManager.CheckStructCycles() for each TypeContainer.
2819         [Note: We only need to visit each type once.]
2820
2821 2004-04-28  Martin Baulig  <martin@ximian.com>
2822
2823         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2824
2825         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2826         success and added `out object value'.  Use a `bool resolved' field
2827         to check whether we've already been called rather than
2828         `ConstantValue != null' since this breaks for NullLiterals.
2829
2830 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2831
2832         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2833         setting of this flag, since the 'set' method may be non-public.
2834
2835 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2836
2837         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2838         check on current_vector.Block.
2839
2840 2004-04-27  Martin Baulig  <martin@ximian.com>
2841
2842         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2843         a field initializer.  Fixes #56459.
2844
2845 2004-04-27  Martin Baulig  <martin@ximian.com>
2846
2847         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2848         we're not attempting to use an indexer.  Fixes #52154.
2849
2850 2004-04-27  Martin Baulig  <martin@ximian.com>
2851
2852         * statement.cs (Return): Don't create a return label if we don't
2853         need it; reverts my change from January 20th.  Thanks to Ben
2854         Maurer for this.
2855
2856 2004-04-27  Martin Baulig  <martin@ximian.com>
2857
2858         According to the spec, `goto' can only leave a nested scope, but
2859         never enter it.
2860
2861         * statement.cs (Block.LookupLabel): Only lookup in the current
2862         block, don't recurse into parent or child blocks.
2863         (Block.AddLabel): Check in parent and child blocks, report
2864         CS0140/CS0158 if we find a duplicate.
2865         (Block): Removed this indexer for label lookups.
2866         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2867         this already does the error reporting for us.
2868
2869         * flowanalysis.cs
2870         (FlowBranching.UsageVector.Block): New public variable; may be null.
2871         (FlowBranching.CreateSibling): Added `Block' argument.
2872         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2873         label for the target of a `goto' and check whether we're not
2874         leaving a `finally'.
2875
2876 2004-04-27  Martin Baulig  <martin@ximian.com>
2877
2878         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2879         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2880         just for returns).
2881
2882 2004-04-27  Martin Baulig  <martin@ximian.com>
2883
2884         * statement.cs (Block.AddLabel): Also check for implicit blocks
2885         and added a CS0158 check.
2886
2887 2004-04-27  Martin Baulig  <martin@ximian.com>
2888
2889         * flowanalysis.cs (FlowBranchingLoop): New class.
2890         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2891         UsageVector's instead of an ArrayList.
2892         (FlowBranching.Label): Likewise.
2893         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2894         (FlowBranching.AddBreakVector): New method.
2895
2896 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2897
2898         * attribute.cs: Small regression fix: only convert the type if we
2899         the type is different, fixes System.Drawing build.
2900
2901 2004-04-27  Martin Baulig  <martin@ximian.com>
2902
2903         * attribute.cs (Attribute.Resolve): If we have a constant value
2904         for a named field or property, implicity convert it to the correct
2905         type.
2906
2907 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2908
2909         * statement.cs (Block.Block): Implicit blocks share
2910         'child_variable_names' fields with parent blocks.
2911         (Block.AddChildVariableNames): Remove.
2912         (Block.AddVariable): Mark variable as "used by a child block" in
2913         every surrounding block.
2914         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2915         been used in a child block, complain about violation of "Invariant
2916         meaning in blocks" rule.
2917         * cs-parser.jay (declare_local_variables): Don't use
2918         AddChildVariableNames.
2919         (foreach_statement): Don't create an implicit block: 'foreach'
2920         introduces a scope.
2921
2922 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2923
2924         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2925         converting from 0L to ulong.  Fixes 57522.
2926
2927 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2928
2929         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2930         derived class hides via 'new' keyword field from base class (test-242.cs).
2931         TODO: Handle this in the more general way.
2932         
2933         * class.cs (CheckBase): Ditto.
2934
2935 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2936
2937         * decl.cs (caching_flags): New member for storing cached values
2938         as bit flags.
2939         (MemberCore.Flags): New enum where bit flags for caching_flags
2940         are defined.
2941         (MemberCore.cls_compliance): Moved to caching_flags.
2942         (DeclSpace.Created): Moved to caching_flags.
2943
2944         * class.cs: Use caching_flags instead of DeclSpace.Created
2945         
2946 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2947
2948         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2949         if we are only a derived class, not a nested class.
2950
2951         * typemanager.cs: Same as above, but do this at the MemberLookup
2952         level (used by field and methods, properties are handled in
2953         PropertyExpr).   Allow for the qualified access if we are a nested
2954         method. 
2955
2956 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2957
2958         * class.cs: Refactoring.
2959         (IMethodData): New inteface; Holds links to parent members
2960         to avoid member duplication (reduced memory allocation).
2961         (Method): Implemented IMethodData interface.
2962         (PropertyBase): New inner classes for get/set methods.
2963         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2964         (Event): New inner classes for add/remove methods.
2965         (Event.DelegateMethod): Implemented IMethodData interface.
2966
2967         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2968         EmitContext (related to class.cs refactoring).
2969
2970 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2971
2972         * delegate.cs (Delegate.VerifyApplicability): If the number of
2973         arguments are the same as the number of parameters, first try to
2974         verify applicability ignoring  any 'params' modifier on the last
2975         parameter.
2976         Fixes #56442.
2977
2978 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2979
2980         * class.cs (TypeContainer.AddIndexer): Use
2981         'ExplicitInterfaceName' to determine if interface name was
2982         explicitly specified.  'InterfaceType' is not initialized at this time.
2983         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2984         Indexers array is already in the required order.  Initialize
2985         'IndexerName' only if there are normal indexers.
2986         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2987         (TypeContainer.Emit): Emit DefaultMember attribute only if
2988         IndexerName is initialized.
2989         Fixes #56300.
2990
2991 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2992
2993         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2994         Fixes #57007
2995
2996 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2997
2998         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2999         attributes.
3000         Fix for #56456.
3001
3002         * attribute.cs (Attribute.Resolve): Check for duplicate named
3003         attributes.
3004         Fix for #56463.
3005
3006 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3007
3008         * iterators.cs (MarkYield): track whether we are in an exception,
3009         and generate code accordingly.  Use a temporary value to store the
3010         result for our state.
3011
3012         I had ignored a bit the interaction of try/catch with iterators
3013         since their behavior was not entirely obvious, but now it is
3014         possible to verify that our behavior is the same as MS .NET 2.0
3015
3016         Fixes 54814
3017
3018 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3019
3020         * iterators.cs: Avoid creating temporaries if there is no work to
3021         do. 
3022
3023         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3024         Enumerations, use TypeManager.EnumToUnderlying and call
3025         recursively. 
3026
3027         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3028         bug #57013
3029
3030         (This.Emit): Use EmitContext.EmitThis to emit our
3031         instance variable.
3032
3033         (This.EmitAssign): Ditto.
3034
3035         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3036         codepaths, we will move all the functionality into
3037         Mono.CSharp.This 
3038
3039         (FieldExpr.EmitAssign): Ditto.
3040
3041         This fixes several hidden bugs that I uncovered while doing a code
3042         review of this today.
3043
3044         * codegen.cs (EmitThis): reworked so the semantics are more clear
3045         and also support value types "this" instances.
3046
3047         * iterators.cs: Changed so that for iterators in value types, we
3048         do not pass the value type as a parameter.  
3049
3050         Initialization of the enumerator helpers is now done in the caller
3051         instead of passing the parameters to the constructors and having
3052         the constructor set the fields.
3053
3054         The fields have now `assembly' visibility instead of private.
3055
3056 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3057
3058         * expression.cs (Argument.Resolve): Check if fields passed as ref
3059         or out are contained in a MarshalByRefObject.
3060
3061         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3062         another compiler type.
3063
3064 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3065
3066         * class.cs (Indexer.Define): use the new name checking method.
3067         Also, return false on an error.
3068         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3069         (is_identifier_[start/part]_character): make static.
3070
3071 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3072
3073         * expression.cs (Binary.ResolveOperator): Do no append strings
3074         twice: since we can be invoked more than once (array evaluation)
3075         on the same concatenation, take care of this here.  Based on a fix
3076         from Ben (bug #56454)
3077
3078 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3079
3080         * codegen.cs: Fix another case where CS1548 must be reported (when 
3081         delay-sign isn't specified and no private is available #56564). Fix
3082         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3083         error when MCS is used on the MS runtime and we need to delay-sign 
3084         (which seems unsupported by AssemblyBuilder - see #56621).
3085
3086 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3087
3088         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3089         (TypeManager.ComputeNamespaces): Faster implementation for
3090         Microsoft runtime.
3091
3092         * compiler.csproj: Updated AssemblyName to mcs.
3093
3094 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3095
3096         * rootcontext.cs: Add new types to the boot resolution.
3097
3098         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3099         MulticastDelegate is not allowed.
3100
3101         * typemanager.cs: Add new types to lookup: System.TypedReference
3102         and ArgIterator.
3103
3104         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3105         check for TypedReference or ArgIterator, they are not allowed. 
3106
3107         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3108         makes us properly catch 1510 in some conditions (see bug 56016 for
3109         details). 
3110
3111 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3112
3113         * CryptoConvert.cs: update from corlib version
3114         with endian fixes.
3115
3116 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3117
3118         * class.cs (Indexer.Define): Check indexername declaration
3119
3120 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3121
3122         * attribute.cs (IsClsCompliant): Fixed problem with handling
3123         all three states (compliant, not-compliant, undetected).
3124
3125 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3126
3127         * attribute.cs (Attribute): Location is now public.
3128         (Resolve): Store resolved arguments (pos_values) in attribute class.
3129         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3130         (GetClsCompliantAttributeValue): New method that gets
3131         CLSCompliantAttribute value.
3132         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3133         if exists else null.
3134         (AttributeTester): New class for CLS-Compliant verification routines.
3135
3136         * class.cs (Emit): Add CLS-Compliant verification.
3137         (Method.GetSignatureForError): Implemented.
3138         (Constructor.GetSignatureForError): Implemented
3139         (Constructor.HasCompliantArgs): Returns if constructor has
3140         CLS-Compliant arguments.
3141         (Constructor.Emit): Override.
3142         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3143         is needed to test only parameters.
3144         (FieldBase.GetSignatureForError): Implemented.
3145         (TypeContainer): New member for storing base interfaces.
3146         (TypeContainer.FindMembers): Search in base interfaces too.
3147
3148         * codegen.cs (GetClsComplianceAttribute): New method that gets
3149         assembly or module CLSCompliantAttribute value.
3150         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3151         for assembly.
3152         (ModuleClass.Emit): Add error 3012 test.
3153
3154         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3155
3156         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3157         state for all decl types.
3158         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3159         if CLS-Compliant tests are required.
3160         (IsClsCompliaceRequired): New method. Analyze whether code
3161         must be CLS-Compliant.
3162         (IsExposedFromAssembly): New method. Returns true when MemberCore
3163         is exposed from assembly.
3164         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3165         value or gets cached value.
3166         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3167         is explicitly marked with CLSCompliantAttribute.
3168         (IsIdentifierClsCompliant): New abstract method. This method is
3169         used to testing error 3005.
3170         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3171         for identifier and parameters CLS-Compliant testing.
3172         (VerifyClsCompliance): New method. The main virtual method for
3173         CLS-Compliant verifications.
3174         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3175         null. I don't know why is null (too many public members !).
3176         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3177         and get value of first CLSCompliantAttribute that found.
3178
3179         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3180         (VerifyClsCompliance): Override and add extra tests.
3181
3182         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3183         clscheck- disable CLS-Compliant verification event if assembly is has
3184         CLSCompliantAttribute(true).
3185
3186         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3187         ApllyAttribute is now called in emit section as in the other cases.
3188         Possible future Emit integration.
3189         (IsIdentifierClsCompliant): New override.
3190         (VerifyClsCompliance): New override.
3191         (GetEnumeratorName): Returns full enum name.
3192
3193         * parameter.cs (GetSignatureForError): Implemented.
3194
3195         * report.cs (WarningData): New struct for Warning message information.
3196         (LocationOfPreviousError): New method.
3197         (Warning): New method. Reports warning based on the warning table.
3198         (Error_T): New method. Reports error based on the error table.
3199
3200         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3201         verifications are done here.
3202
3203         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3204
3205         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3206         CLSCompliantAttribute.
3207         (all_imported_types): New member holds all imported types from other
3208         assemblies.
3209         (LoadAllImportedTypes): New method fills static table with exported types
3210         from all referenced assemblies.
3211         (Modules): New property returns all assembly modules.
3212
3213 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3214
3215         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3216         throwing a parser error.
3217
3218         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3219         which removes the hardcoded get_/set_ prefixes for properties, as
3220         IL allows for the properties to be named something else.  
3221
3222         Bug #56013
3223
3224         * expression.cs: Do not override operand before we know if it is
3225         non-null.  Fix 56207
3226
3227 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3228
3229         * typemanager.cs: support for pinned variables.
3230
3231 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3232
3233         * decl.cs, typemanager.cs: Avoid using an arraylist
3234         as a buffer if there is only one result set.
3235
3236 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3237
3238         * expression.cs: Make sure you cant call a static method
3239         with an instance expression, bug #56174.
3240
3241 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3242
3243         * class.cs (IsDuplicateImplementation): Improve error reporting to
3244         flag 663 (method only differs in parameter modifier).
3245
3246         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3247         in preprocessor directives.
3248
3249         * location.cs (LookupFile): Allow for the empty path.
3250
3251         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3252         better approach for some of that patch, but its failing with the
3253         CharSet enumeration.  For now try/catch will do.
3254
3255         * typemanager.cs: Do not crash if a struct does not have fields.
3256         Fixes 56150.
3257
3258 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3259
3260         * expression.cs: cs0213, cant fix a fixed expression.
3261         fixes 50231.
3262
3263 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3264
3265         * cs-parser.jay: detect invalid embeded statements gracefully.
3266         bug #51113.
3267
3268 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3269
3270         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3271         As a regex:
3272         s/
3273         the invocation type may not be a subclass of the tye of the item/
3274         The type of the item must be a subclass of the invocation item.
3275         /g
3276
3277         Fixes bug #50820.
3278
3279 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3280
3281         * attribute.cs: Added methods to get a string and a bool from an
3282         attribute. Required to information from AssemblyKeyFileAttribute,
3283         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3284         * codegen.cs: Modified AssemblyName creation to include support for
3285         strongnames. Catch additional exceptions to report them as CS1548.
3286         * compiler.csproj: Updated include CryptoConvert.cs.
3287         * compiler.csproj.user: Removed file - user specific configuration.
3288         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3289         Mono.Security assembly. The original class is maintained and tested in
3290         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3291         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3292         like CSC 8.0 (C# v2) supports.
3293         * Makefile: Added CryptoConvert.cs to mcs sources.
3294         * rootcontext.cs: Added new options for strongnames.
3295
3296 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3297
3298         * driver.cs: For --expect-error, report error code `2'
3299         if the program compiled with no errors, error code `1' if
3300         it compiled with an error other than the one expected.
3301
3302 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3303
3304         * compiler.csproj: Updated for Visual Studio .NET 2003.
3305         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3306         * compiler.sln: Updated for Visual Studio .NET 2003.
3307
3308 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3309
3310         * expression.cs: Fix bug #47234. We basically need to apply the
3311         rule that we prefer the conversion of null to a reference type
3312         when faced with a conversion to 'object' (csc behaviour).
3313
3314 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3315
3316         * statement.cs: Shorter form for foreach, eliminates
3317         a local variable. r=Martin.
3318
3319 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3320
3321         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3322         checks if we can use brtrue/brfalse to test for 0.
3323         * expression.cs: use the above in the test for using brtrue/brfalse.
3324         cleanup code a bit.
3325
3326 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3327
3328         * expression.cs: Rewrite string concat stuff. Benefits:
3329
3330         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3331         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3332         rather than a concat chain.
3333
3334         * typemanager.cs: Add lookups for more concat overloads.
3335
3336 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3337
3338         * expression.cs: Emit shorter il code for array init.
3339
3340         newarr
3341         dup
3342         // set 1
3343
3344         // set 2
3345
3346         newarr
3347         stloc.x
3348
3349         ldloc.x
3350         // set 1
3351
3352         ldloc.x
3353         // set 2
3354
3355 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3356
3357         * statement.cs: Before, two switch blocks would be merged if the
3358         total size of the blocks (end_item - begin_item + 1) was less than
3359         two times the combined sizes of the blocks.
3360
3361         Now, it will only merge if after the merge at least half of the
3362         slots are filled.
3363
3364         fixes 55885.
3365
3366 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3367
3368         * class.cs : csc build fix for GetMethods(). See bug #52503.
3369
3370 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3371
3372         * expression.cs: Make sure fp comparisons work with NaN.
3373         This fixes bug #54303. Mig approved this patch a long
3374         time ago, but we were not able to test b/c the runtime
3375         had a related bug.
3376
3377 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3378
3379         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3380
3381 2004-03-19  Martin Baulig  <martin@ximian.com>
3382
3383         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3384         error here and not in our caller.
3385
3386 2004-03-19  Martin Baulig  <martin@ximian.com>
3387
3388         * interface.cs: Completely killed this file.
3389         (Interface): We're now a TypeContainer and live in class.cs.
3390
3391         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3392         argument; we're now also called for interfaces.
3393         (TypeContainer.DefineMembers): Allow this method being called
3394         multiple times.
3395         (TypeContainer.GetMethods): New public method; formerly known as
3396         Interface.GetMethod().  This is used by PendingImplementation.
3397         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3398         it's now private and non-static.
3399         (Interface): Moved this here; it's now implemented similar to
3400         Class and Struct.
3401         (Method, Property, Event, Indexer): Added `bool is_interface'
3402         argument to their .ctor's.
3403         (MemberBase.IsInterface): New public field.
3404
3405         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3406         instances instead of InterfaceMethod, InterfaceProperty, etc.
3407         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3408         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3409
3410 2004-03-19  Martin Baulig  <martin@ximian.com>
3411
3412         * class.cs (MethodCore.IsDuplicateImplementation): New private
3413         method which does the CS0111 checking.
3414         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3415         Use IsDuplicateImplementation().
3416
3417 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3418
3419         * decl.cs (FindMemberToOverride): New method to find the correct
3420         method or property to override in the base class.
3421         * class.cs
3422             - Make Method/Property use the above method to find the
3423               version in the base class.
3424             - Remove the InheritableMemberSignatureCompare as it is now
3425               dead code.
3426
3427         This patch makes large code bases much faster to compile, as it is
3428         O(n) rather than O(n^2) to do this validation.
3429
3430         Also, it fixes bug 52458 which is that nested classes are not
3431         taken into account when finding the base class member.
3432
3433         Reviewed/Approved by Martin.
3434
3435 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3436
3437         * interface.cs: In all interface classes removed redundant
3438         member initialization.
3439
3440 2004-03-16  Martin Baulig  <martin@ximian.com>
3441
3442         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3443
3444 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3445
3446         * decl.cs (DefineTypeAndParents): New helper method to define a
3447         type's containers before the type itself is defined;  This is a
3448         bug exposed by the recent changes to Windows.Forms when an
3449         implemented interface was defined inside a class that had not been
3450         built yet.   
3451
3452         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3453
3454         (Check): Loop correctly to report errors modifiers
3455         (UNSAFE was not in the loop, since it was the same as TOP).
3456
3457         * interface.cs: Every interface member now takes a ModFlags,
3458         instead of a "is_new" bool, which we set on the base MemberCore. 
3459
3460         Every place where we called "UnsafeOk" in the interface, now we
3461         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3462         the unsafe settings from the member declaration instead of the
3463         container interface. 
3464
3465         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3466
3467         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3468         `set_indexer_name' to the pending bits (one per type).
3469
3470         We fixed a bug today that was picking the wrong method to
3471         override, since for properties the existing InterfaceMethod code
3472         basically ignored the method name.  Now we make sure that the
3473         method name is one of the valid indexer names.
3474
3475 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
3476  
3477         * support.cs (SeekableStreamReader): Keep track of stream byte
3478         positions and don't mix them with character offsets to the buffer.
3479
3480         Patch from Gustavo Giráldez
3481
3482 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
3483
3484         * interface.cs (InterfaceSetGetBase): Removed double member
3485         initialization, base class does it as well.
3486
3487 2004-03-13  Martin Baulig  <martin@ximian.com>
3488
3489         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3490         when compiling corlib.
3491
3492 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3493
3494         * convert.cs (ExplicitConversion): We were reporting an error on
3495         certain conversions (object_type source to a value type, when the
3496         expression was `null') before we had a chance to pass it through
3497         the user defined conversions.
3498
3499         * driver.cs: Replace / and \ in resource specifications to dots.
3500         Fixes 50752
3501
3502         * class.cs: Add check for duplicate operators.  Fixes 52477
3503
3504 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3505
3506         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3507         that are in the middle of the statements, not only at the end.
3508         Fixes #54987
3509
3510         * class.cs (TypeContainer.AddField): No longer set the
3511         `HaveStaticConstructor' flag, now we call it
3512         `UserDefineStaticConstructor' to diferentiate the slightly
3513         semantic difference.
3514
3515         The situation is that we were not adding BeforeFieldInit (from
3516         Modifiers.TypeAttr) to classes that could have it.
3517         BeforeFieldInit should be set to classes that have no static
3518         constructor. 
3519
3520         See:
3521
3522         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3523
3524         And most importantly Zoltan's comment:
3525
3526         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3527
3528         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3529          before its static fields are used', i.e. initialization does not need
3530          to be triggered by the first access to the type. Setting this flag
3531          helps the JIT to compile better code, since it can run the static
3532          constructor at JIT time, and does not need to generate code to call it
3533          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3534          this flag for lots of classes like String. 
3535          
3536          csc sets this flag if the type does not have an explicit static 
3537          constructor. The reasoning seems to be that if there are only static
3538          initalizers for a type, and no static constructor, then the programmer
3539          does not care when this initialization happens, so beforefieldinit
3540          can be used.
3541          
3542          This bug prevents the AOT compiler from being usable, since it 
3543          generates so many calls to mono_runtime_class_init that the AOT code
3544          is much slower than the JITted code. The JITted code is faster, 
3545          because it does not generate these calls if the vtable is type is
3546          already initialized, which is true in the majority of cases. But the
3547          AOT compiler can't do this."
3548
3549 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3550
3551         * class.cs (MethodData.Emit): Refactor the code so symbolic
3552         information is generated for destructors;  For some reasons we
3553         were taking a code path that did not generate symbolic information
3554         before. 
3555
3556 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3557
3558         * class.cs: Create a Constructor.CheckBase method that
3559         takes care of all validation type code. The method
3560         contains some code that was moved from Define.
3561
3562         It also includes new code that checks for duplicate ctors.
3563         This fixes bug #55148.
3564
3565 2004-03-09  Joshua Tauberer <tauberer@for.net>
3566
3567         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3568         a { ... }-style array creation invokes EmitStaticInitializers
3569         which is not good for reference-type arrays.  String, decimal
3570         and now null constants (NullCast) are not counted toward
3571         static initializers.
3572
3573 2004-03-05  Martin Baulig  <martin@ximian.com>
3574
3575         * location.cs (SourceFile.HasLineDirective): New public field;
3576         specifies whether the file contains or is referenced by a "#line"
3577         directive.
3578         (Location.DefineSymbolDocuments): Ignore source files which
3579         either contain or are referenced by a "#line" directive.        
3580
3581 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3582
3583         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3584         direct access to our parent, so check the method inline there.
3585
3586 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3587
3588         * expression.cs (Invocation.EmitCall): Miguel's last commit
3589         caused a regression. If you had:
3590
3591             T t = null;
3592             t.Foo ();
3593
3594         In Foo the implict this would be null.
3595
3596 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3597
3598         * expression.cs (Invocation.EmitCall): If the method is not
3599         virtual, do not emit a CallVirt to it, use Call.
3600
3601         * typemanager.cs (GetFullNameSignature): Improve the method to
3602         cope with ".ctor" and replace it with the type name.
3603
3604         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3605         as an argument the ConstructorBuilder where it is being defined,
3606         to catch the recursive constructor invocations.
3607
3608 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3609
3610         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3611         routines to check if a type is an enumerable/enumerator allow
3612         classes that implement the IEnumerable or IEnumerator interfaces.
3613
3614         * class.cs (Property, Operator): Implement IIteratorContainer, and
3615         implement SetYields.
3616
3617         (Property.Define): Do the block swapping for get_methods in the
3618         context of iterators.   We need to check if Properties also
3619         include indexers or not.
3620
3621         (Operator): Assign the Block before invoking the
3622         OperatorMethod.Define, so we can trigger the Iterator code
3623         replacement. 
3624
3625         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3626         Property and Operator classes are not created when we parse the
3627         declarator but until we have the block completed, so we use a
3628         singleton SimpleIteratorContainer.Simple to flag whether the
3629         SetYields has been invoked.
3630
3631         We propagate this setting then to the Property or the Operator to
3632         allow the `yield' to function.
3633
3634 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3635
3636         * codegen.cs: Implemented attribute support for modules.
3637         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3638         Assembly/Module functionality.
3639
3640         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3641         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3642         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3643
3644 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3645
3646         * interface.cs (FindMembers): The operation is performed on all base
3647         interfaces and not only on the first. It is required for future CLS Compliance patch.
3648
3649 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3650
3651         * statement.cs, codegen.cs:
3652         This patch deals with patterns such as:
3653
3654         public class List : IEnumerable {
3655
3656                 public MyEnumerator GetEnumerator () {
3657                         return new MyEnumerator(this);
3658                 }
3659
3660                 IEnumerator IEnumerable.GetEnumerator () {
3661                         ...
3662                 }
3663                 
3664                 public struct MyEnumerator : IEnumerator {
3665                         ...
3666                 }
3667         }
3668
3669         Before, there were a few things we did wrong:
3670         1) we would emit callvirt on a struct, which is illegal
3671         2) we emited ldarg when we needed to emit ldarga
3672         3) we would mistakenly call the interface methods on an enumerator
3673         type that derived from IEnumerator and was in another assembly. For example:
3674
3675         public class MyEnumerator : IEnumerator
3676
3677         Would have the interface methods called, even if there were public impls of the
3678         method. In a struct, this lead to invalid IL code.
3679
3680 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3681
3682         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3683           renamed to Emit.
3684
3685         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3686
3687 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3688
3689         * cs-parser.jay: Fix small regression: we were not testing V2
3690         compiler features correctly.
3691
3692         * interface.cs: If the emit context is null, then create one
3693
3694 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3695
3696         * decl.cs (GetSignatureForError): New virtual method to get full name
3697           for error messages.
3698
3699         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3700           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3701
3702         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3703           Duplicated members and code in these classes has been removed.
3704           Better encapsulation in these classes.
3705
3706 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3707
3708         * assign.cs (Assign.DoResolve): When dealing with compound
3709         assignments, there is a new rule in ECMA C# 2.4 (might have been
3710         there before, but it is documented here) that states that in:
3711
3712         a op= b;
3713
3714         If b is of type int, and the `op' is a shift-operator, then the
3715         above is evaluated as:
3716
3717         a = (int) a op b 
3718
3719         * expression.cs (Binary.ResolveOperator): Instead of testing for
3720         int/uint/long/ulong, try to implicitly convert to any of those
3721         types and use that in pointer arithmetic.
3722
3723         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3724         method to print information for from the type, not from the
3725         null-method we were given.
3726
3727 2004-02-01  Duncan Mak  <duncan@ximian.com>
3728
3729         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3730         parsing for cmd, fixes bug #53694.
3731
3732 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3733
3734         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3735         in the member name duplication tests. Property and operator name duplication
3736         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3737
3738 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3739
3740         * interface.cs (PopulateMethod): Fixed crash when interface method
3741         returns not existing type (error test cs0246-3.cs).
3742
3743 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3744
3745         * cs-parser.jay (interface_accessors): Re-write actions to also
3746         store attributes attached to get and set methods. Fix spelling
3747         while at it.
3748
3749         (inteface_property_declaration): Modify accordingly.
3750
3751         (InterfaceAccessorInfo): New helper class to store information to pass
3752         around between rules that use interface_accessors.
3753
3754         * interface.cs (Emit): Apply attributes on the get and set
3755         accessors of properties and indexers too.
3756
3757         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3758         right MethodBuilder when applying attributes to the get and set accessors.
3759
3760 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3761
3762         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3763
3764 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3765
3766         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3767
3768 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3769
3770         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3771         changes that treat `yield' specially when present before `break'
3772         or `return' tokens.
3773
3774         * cs-tokenizer.cs: yield is no longer a keyword.
3775
3776 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3777
3778         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3779         setting for default constructors.
3780         For default constructors are almost every time set wrong Modifier. The
3781         generated IL code has been alright. But inside mcs this values was
3782         wrong and this was reason why several of my CLS Compliance tests
3783         failed.
3784
3785 2004-01-22  Martin Baulig  <martin@ximian.com>
3786
3787         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3788         not a QualifiedIdentifier.  This is what `type_name_expression'
3789         was previously doing.
3790         (type_name_expression): Removed; the code is now in
3791         `namespace_or_type_name'.
3792         (qualified_identifier): Removed, use `namespace_or_type_name'
3793         instead.
3794         (QualifiedIdentifier): Removed this class.      
3795
3796 2004-01-22  Martin Baulig  <martin@ximian.com>
3797
3798         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3799         not a string as alias name.
3800
3801 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3802
3803         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3804         #52730 bug, and instead compute correctly the need to use a
3805         temporary variable when requesting an address based on the
3806         static/instace modified of the field and the constructor.
3807  
3808 2004-01-21  Martin Baulig  <martin@ximian.com>
3809
3810         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3811         class and namespace before looking up aliases.  Fixes #52517.
3812
3813 2004-01-21  Martin Baulig  <martin@ximian.com>
3814
3815         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3816         assinged in a 'try'; fixes exception4.cs.
3817
3818 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3819         * class.cs : Implemented parameter-less constructor for TypeContainer
3820
3821         * decl.cs: Attributes are now stored here. New property OptAttributes
3822
3823         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3824
3825         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3826
3827 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3828
3829         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3830           (CSharpSignature): New method for indexer and property signature.
3831
3832 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3833
3834         * pending.cs (IsVirtualFilter): Faster implementation.
3835
3836 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3837
3838         * typemanager.cs: Avoid inclusion of same assembly more than once.
3839
3840 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3841
3842         * cs-parser.jay: Fixed problem where the last assembly attribute
3843           has been applied also to following declaration (class, struct, etc.)
3844           
3845 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3846
3847         * class.cs: Added error CS0538, CS0539 reporting.
3848         Fixed crash on Microsoft runtime when field type is void.
3849
3850         * cs-parser.jay: Added error CS0537 reporting.
3851
3852         * pending.cs: Added error CS0535 reporting.
3853         Improved error report for errors CS0536, CS0534.
3854
3855 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3856
3857         Merge a few bits from the Anonymous Method MCS tree.
3858
3859         * statement.cs (ToplevelBlock): New class for toplevel methods,
3860         will hold anonymous methods, lifted variables.
3861
3862         * cs-parser.jay: Create toplevel blocks for delegates and for
3863         regular blocks of code. 
3864
3865 2004-01-20  Martin Baulig  <martin@ximian.com>
3866
3867         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3868         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3869         and `NeedExplicitReturn'; added `IsLastStatement'.
3870         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3871         have a `ReturnLabel' or we're not unreachable.
3872
3873         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3874         child's reachability; don't just override ours with it.  Fixes
3875         #58058 (lluis's example).
3876         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3877         InFinally(), InLoop(), InSwitch() and
3878         BreakCrossesTryCatchBoundary() methods.
3879
3880         * statement.cs (Return): Do all error checking in Resolve().
3881         Unless we are the last statement in a top-level block, always
3882         create a return label and jump to it.
3883         (Break, Continue): Do all error checking in Resolve(); also make
3884         sure we aren't leaving a `finally'.
3885         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3886         statement in a top-level block.
3887         (Block.Flags): Added `IsDestructor'.
3888         (Block.IsDestructor): New public property.
3889
3890 2004-01-20  Martin Baulig  <martin@ximian.com>
3891
3892         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3893
3894 2004-01-20  Martin Baulig  <martin@ximian.com>
3895
3896         * statement.cs (Statement.ResolveUnreachable): New public method.
3897         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3898         (Block.Resolve): Resolve unreachable statements.
3899
3900 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3901
3902         * expression.cs: We need to fix the case where we do
3903         not have a temp variable here.
3904
3905         * assign.cs: Only expression compound assignments need
3906         temporary variables.
3907
3908 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3909
3910         * flowanalysis.cs: Reduce memory allocation in a few ways:
3911           - A block with no variables should not allocate a bit
3912             vector for itself.
3913           - A method with no out parameters does not need any tracking
3914             for assignment of the parameters, so we need not allocate
3915             any data for it.
3916           - The arrays:
3917                 public readonly Type[] VariableTypes;
3918                 public readonly string[] VariableNames;
3919             Are redundant. The data is already stored in the variable
3920             map, so we need not allocate another array for it.
3921           - We need to add alot of checks for if (params | locals) == null
3922             due to the first two changes.
3923
3924 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3925
3926         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3927         implement IMemoryLocation, we store a copy on a local variable and
3928         take the address of it.  Patch from Benjamin Jemlich
3929
3930         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3931         to use a special "type_name_expression" rule which reduces the
3932         number of "QualifiedIdentifier" classes created, and instead
3933         directly creates MemberAccess expressions.
3934
3935 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3936
3937         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3938         that fixes #52853.  Null literal assignment to ValueType
3939
3940         * class.cs (MethodData.Emit): Instead of checking the name of the
3941         method to determine if its a destructor, create a new derived
3942         class from Method called Destructor, and test for that.  
3943
3944         * cs-parser.jay: Create a Destructor object instead of a Method.  
3945
3946         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3947
3948         Fixes: 52933
3949
3950 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3951
3952         * expression.cs (Binary.ResolveOperator): Perform an implicit
3953         conversion from MethodGroups to their delegate types on the
3954         Addition operation.
3955
3956         * delegate.cs: Introduce a new class DelegateCreation that is the
3957         base class for `NewDelegate' and `ImplicitDelegateCreation',
3958         factor some code in here.
3959
3960         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3961         conversion from MethodGroups to compatible delegate types. 
3962
3963         * ecore.cs (Expression.Resolve): Do not flag error 654
3964         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3965         we allow conversions from MethodGroups to delegate types now.
3966
3967         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3968         assignments in v2 either.
3969
3970 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3971
3972         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3973         static read-only fields in ctors.
3974
3975         Applied patch from Benjamin Jemlich 
3976
3977         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3978
3979 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3980
3981         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3982         here to return true, as they can be used like this:
3983
3984                 (XXX) int.MEMBER ()
3985
3986         Fixed 49836 and all the other dups
3987
3988 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3989
3990         * driver.cs: Implement /win32res and /win32icon.
3991
3992 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
3993
3994         * cs-parser.jay: Add a rule to improve error handling for the
3995         common mistake of placing modifiers after the type.
3996
3997 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
3998
3999         * cs-parser.jay (interface_event_declaration): Catch
4000         initialization of events on interfaces, and report cs0068
4001
4002         * cs-parser.jay (interface_event_declaration): Catch
4003         initialization of events. 
4004
4005         * ecore.cs: Better report missing constructors.
4006
4007         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4008         the error reporting done in the wrong place.  Fix.
4009
4010         * expression.cs (Binary.ResolveOperator): Catch the 
4011         operator + (E x, E y) error earlier, and later allow for implicit
4012         conversions in operator +/- (E e, U x) from U to the underlying
4013         type of E.
4014
4015         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4016         52596, if the container class is abstract, the default constructor
4017         is protected otherwise its public (before, we were always public).
4018
4019         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4020         fixed statement.
4021
4022         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4023         Jemlich that fixes bug #52597, MCS was generating invalid code for
4024         idisposable structs.   Thanks to Ben for following up with this
4025         bug as well.
4026
4027 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4028
4029         * driver.cs: Allow assemblies without code to be generated, fixes
4030         52230.
4031
4032 2004-01-07  Nick Drochak <ndrochak@gol.com>
4033
4034         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4035
4036 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4037
4038         * cs-parser.jay: Add rules to improve error reporting if fields or
4039         methods are declared at the namespace level (error 116)
4040
4041         * Add rules to catch event add/remove
4042
4043 2004-01-04  David Sheldon <dave-mono@earth.li>
4044
4045   * expression.cs: Added matching ")" to error message for 
4046   CS0077
4047
4048 2004-01-03 Todd Berman <tberman@gentoo.org>
4049
4050         * ecore.cs, attribute.cs:
4051         Applying fix from #52429.
4052
4053 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4054
4055         * ecore.cs, expression.cs, statement.cs:
4056         Total rewrite of how we handle branching. We
4057         now handle complex boolean expressions with fewer
4058         jumps. As well if (x == 0) no longer emits a ceq.
4059
4060         if (x is Foo) is much faster now, because we generate
4061         better code.
4062
4063         Overall, we get a pretty big improvement on our benchmark
4064         tests. The code we generate is smaller and more readable.
4065
4066         I did a full two-stage bootstrap. The patch was reviewed
4067         by Martin and Miguel.
4068
4069 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4070
4071         * cs-parser.jay: Make primary_expression not take a QI.
4072         we dont need this because the member_access rule covers
4073         us here. So we replace the rule with just IDENTIFIER.
4074
4075         This has two good effects. First, we remove a s/r conflict.
4076         Second, we allocate many fewer QualifiedIdentifier objects.
4077
4078 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4079
4080         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4081         set the correct information via SRE. This prevents
4082         hanging on the MS runtime. Fixes #29374.
4083
4084 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4085
4086         * convert.cs: correctly handle conversions to value types
4087         from Enum and ValueType as unboxing conversions.
4088
4089         Fixes bug #52569. Patch by Benjamin Jemlich.
4090
4091 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4092
4093         * expression.cs (BetterConversion): Prefer int -> uint
4094         over int -> ulong (csc's behaviour). This fixed bug #52046.
4095
4096 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4097
4098         * decl.cs (MemberCache.FindMembers): now returns a
4099         MemberInfo [].
4100
4101         * typemanager.cs: In general, go with with ^^.
4102         (CopyNewMethods): take an IList.
4103         (RealMemberLookup): Only allocate an arraylist
4104         if we copy from two sets of methods.
4105
4106         This change basically does two things:
4107         1) Fewer array lists allocated due to CopyNewMethods.
4108         2) the explicit cast in MemberList costed ALOT.
4109
4110 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4111
4112         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4113         a hashtable to avoid needless string allocations when an identifier is
4114         used more than once (the common case).
4115
4116 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4117
4118         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4119         is broken, it will not return anything. So, we
4120         have to use the information we have in mcs to
4121         do the task.
4122
4123         * typemanager.cs: Add a cache for GetInterfaces,
4124         since this will now be used more often (due to ^^)
4125
4126         (GetExplicitInterfaces) New method that gets the
4127         declared, not effective, interfaces on a type
4128         builder (eg, if you have interface IFoo, interface
4129         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4130         { IBar }.
4131
4132         This patch makes MCS able to bootstrap itself on
4133         Windows again.
4134
4135 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4136
4137         * expression.cs: Remove the Nop's that Miguel put
4138         in by mistake.
4139
4140 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4141
4142         * report.cs, codegen.cs: Give the real stack trace to
4143         the error when an exception is thrown.
4144
4145 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4146
4147         * decl.cs: only allocate hashtables for ifaces if 
4148         it is an iface!
4149
4150 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4151
4152         * expression.cs: fix the error from cs0121-2.cs
4153         (a parent interface has two child interfaces that
4154         have a function with the same name and 0 params
4155         and the function is called through the parent).
4156
4157 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4158
4159         * class.cs, rootcontext.cs, typmanager.cs: do not
4160         leak pointers.
4161
4162 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4163
4164         * codegen.cs: remove stack for the ec flow branching.
4165         It is already a linked list, so no need.
4166
4167 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4168
4169         * Makefile: Allow custom profiler here.
4170
4171 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4172
4173         * typemanager.cs (LookupType):
4174           - Use a static char [], because split takes
4175             a param array for args, so it was allocating
4176             every time.
4177           - Do not store true in a hashtable, it boxes.
4178
4179 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4180
4181         * flowanalysis.cs: bytify common enums.
4182
4183 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4184
4185         * modifiers.cs: Add a new set of flags for the
4186         flags allowed on explicit interface impls.
4187         * cs-parser.jay: catch the use of modifiers in
4188         interfaces correctly.
4189         * class.cs: catch private void IFoo.Blah ().
4190
4191         All related to bug #50572.
4192
4193 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4194
4195         * decl.cs: Rewrite the consistant accessability checking.
4196         Accessability is not linear, it must be implemented in
4197         a tableish way. Fixes #49704.
4198
4199 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4200
4201         * expression.cs: Handle negation in a checked context.
4202         We must use subtraction from zero. Fixes #38674.
4203
4204 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4205
4206         * class.cs: Ignore static void main in DLLs.
4207         * rootcontext.cs: Handle the target type here,
4208         since we are have to access it from class.cs
4209         * driver.cs: account for the above.
4210
4211 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4212
4213         * report.cs: Give line numbers and files if available.
4214
4215 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4216
4217         * driver.cs: Implement /addmodule.
4218
4219         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4220         ModuleBuilders.
4221
4222 2003-12-20  Martin Baulig  <martin@ximian.com>
4223
4224         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4225         (FieldBase.IsAssigned): Removed this field.
4226         (FieldBase.SetAssigned): New public method.
4227         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4228
4229 2003-12-20  Martin Baulig  <martin@ximian.com>
4230
4231         * expression.cs (LocalVariableReference.DoResolve): Don't set
4232         `vi.Used' if we're called from DoResolveLValue().
4233
4234         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4235         returns the usage vector it just merged into the current one -
4236         pass this one to UsageWarning().
4237         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4238         of the `EmitContext', don't call this recursively on our children.
4239
4240 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4241
4242         * driver.cs: Implement /target:module.
4243
4244 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4245
4246         * support.cs (CharArrayHashtable): New helper class.
4247
4248         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4249         char arrays, not strings, so we can avoid creating a string in
4250         consume_identifier if the identifier is a keyword.
4251
4252 2003-12-16  Martin Baulig  <martin@ximian.com>
4253
4254         * statement.cs (LocalInfo.Assigned): Removed this property.
4255         (LocalInfo.Flags): Removed `Assigned'.
4256         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4257         and uses flow analysis.
4258         (Block.UsageWarning): Made this method private.
4259         (Block.Resolve): Call UsageWarning() if appropriate.
4260
4261         * expression.cs (LocalVariableReference.DoResolve): Always set
4262         LocalInfo.Used here.
4263
4264 2003-12-13  Martin Baulig  <martin@ximian.com>
4265
4266         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4267         any value here; we're now using flow analysis to figure out
4268         whether a statement/block returns a value.
4269
4270 2003-12-13  Martin Baulig  <martin@ximian.com>
4271
4272         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4273         working again.
4274         (FlowBranching.MergeFinally): Don't call
4275         `branching.CheckOutParameters()' here, this is called in
4276         MergeTopBlock().
4277         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4278         when adding the `finally' vector.       
4279
4280 2003-12-13  Martin Baulig  <martin@ximian.com>
4281
4282         * flowanalysis.cs
4283         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4284         actually work and also fix #48962.
4285
4286 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4287
4288         * decl.cs: Do not check System.Object for nested types,
4289         since we know it does not have any. Big bang for buck:
4290
4291         BEFORE:
4292            Run 1:   8.35 seconds
4293            Run 2:   8.32 seconds
4294            corlib:  17.99 seconds
4295         AFTER:
4296            Run 1:   8.17 seconds
4297            Run 2:   8.17 seconds
4298            corlib:  17.39 seconds
4299
4300 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4301
4302         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4303         time we are returning 0 members, so we save alot here.
4304
4305 2003-12-11  Martin Baulig  <martin@ximian.com>
4306
4307         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4308         `MergeChild()', also just take the `FlowBranching' as argument;
4309         call Merge() on it and return the result.
4310         (FlowBranching.Merge): We don't need to do anything if we just
4311         have one sibling.
4312
4313 2003-12-11  Martin Baulig  <martin@ximian.com>
4314
4315         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4316         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4317         Maurer for this idea.
4318
4319 2003-12-11  Martin Baulig  <martin@ximian.com>
4320
4321         * flowanalysis.cs (MergeResult): This class is now gone; we now
4322         use the `UsageVector' for this.  The reason for this is that if a
4323         branching just has one sibling, we don't need to "merge" them at
4324         all - that's the next step to do.
4325         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4326         `MergeResult'.
4327
4328 2003-12-11  Martin Baulig  <martin@ximian.com>
4329
4330         Reworked flow analyis and made it more precise and bug-free.  The
4331         most important change is that we're now using a special `Reachability'
4332         class instead of having "magic" meanings of `FlowReturns'.  I'll
4333         do some more cleanups and optimizations and also add some more
4334         documentation this week.
4335
4336         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4337         largely reworked this class.
4338         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4339         the new `Reachability' class instead of having "magic" values here.
4340         (FlowBranching): We're now using an instance of `Reachability'
4341         instead of having separate `Returns', `Breaks' etc. fields.
4342
4343         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4344         based on flow analysis; ignore the return value of block.Emit ().
4345
4346 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4347
4348         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4349         if they are private.
4350
4351 2003-12-09  Martin Baulig  <martin@ximian.com>
4352
4353         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4354         call them directly on the UsageVector.
4355
4356 2003-12-09  Martin Baulig  <martin@ximian.com>
4357
4358         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4359         Changed return type from `FlowReturns' to `Reachability'.
4360
4361 2003-12-09  Martin Baulig  <martin@ximian.com>
4362
4363         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4364         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4365         `Reachable' fields with a single `Reachability' one.
4366
4367 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4368
4369         * class.cs (FindMembers): Remove foreach's.
4370
4371         Bootstrap times:
4372
4373         BEFORE
4374                 Run 1:   8.74 seconds
4375                 Run 2:   8.71 seconds
4376
4377         AFTER
4378                 Run 1:   8.64 seconds
4379                 Run 2:   8.58 seconds
4380
4381
4382 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4383
4384         * cs-parser.jay:
4385         * gen-treedump.cs:
4386         * statement.cs:
4387         This patch does a few things:
4388                 1. EmptyStatement is now a singleton, so it is never reallocated.
4389                 2. All blah is EmptyStatement constructs have been changed to
4390                    blah == EmptyStatement.Value, which is much faster and valid
4391                    now that EmptyStatement is a singleton.
4392                 3. When resolving a block, rather than allocating a new array for
4393                    the non-empty statements, empty statements are replaced with
4394                    EmptyStatement.Value
4395                 4. Some recursive functions have been made non-recursive.
4396         Mainly the performance impact is from (3), however (1) and (2) are needed for
4397         this to work. (4) does not make a big difference in normal situations, however
4398         it makes the profile look saner.
4399
4400         Bootstrap times:
4401
4402         BEFORE
4403         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4404         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4405         Total memory allocated: 56397 KB
4406
4407         AFTER
4408         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4409         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4410         Total memory allocated: 55666 KB
4411
4412 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4413
4414         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4415         than the hashtable in a hashtable version
4416
4417         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4418         we always end up concating a string. This results in a huge perf
4419         loss, because many strings have to be tracked by the GC. In this
4420         patch, we first use a hashtable that works with two keys, so that
4421         the strings do not need to be concat'ed.
4422
4423         Bootstrap times:
4424         BEFORE
4425                 Run 1:   8.74 seconds
4426                 Run 2:   8.71 seconds
4427
4428         AFTER
4429                 Run 1:   8.65 seconds
4430                 Run 2:   8.56 seconds
4431
4432 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4433
4434         * Makefile: Add a new target `do-time' that does a quick and simple
4435         profile, leaving easy to parse output.
4436
4437 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4438
4439         * codegen.cs (Init): Create the dynamic assembly with 
4440         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4441
4442 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4443
4444         * support.cs: Make the PtrHashtable use only one
4445         instance of its comparer.
4446
4447 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4448
4449         * typemanager.cs: Fix lookup of GetNamespaces.
4450
4451 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4452
4453         * expression.cs: Removed redundant line.
4454
4455         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4456         ArrayLists, use for loops with bounds.  
4457
4458         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4459         arraylist.
4460
4461         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4462         arraylists, use for loop with bounds.
4463
4464         The above three changes give us a 0.071 second performance
4465         improvement out of 3.294 seconds down to 3.223.  On my machine
4466         the above changes reduced the memory usage by 1,387 KB during
4467         compiler bootstrap.
4468
4469         * cs-parser.jay (QualifiedIdentifier): New class used to represent
4470         QualifiedIdentifiers.  Before we created a new string through
4471         concatenation, and mostly later on, the result would be
4472         manipulated by DecomposeQI through string manipulation.
4473
4474         This reduced the compiler memory usage for bootstrapping from
4475         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
4476         compile times in 0.05 seconds.
4477
4478 2003-11-28  Dick Porter  <dick@ximian.com>
4479
4480         * support.cs: Do string compares with the Invariant culture.
4481
4482         * rootcontext.cs: 
4483         * gen-treedump.cs: 
4484         * expression.cs: 
4485         * driver.cs: 
4486         * decl.cs: 
4487         * codegen.cs: 
4488         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4489         the comparison is done with the Invariant culture.
4490
4491 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4492
4493         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4494         GetEnumerator method.
4495
4496         (ProbeCollectionType): Iterate starting at the most specific type
4497         upwards looking for a GetEnumerator
4498
4499         * expression.cs: Shift count can be up to 31 for int/uint and 63
4500         for long/ulong.
4501
4502 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4503
4504         * statement.cs (Block.LookupLabel): Also look for the label on the
4505         children blocks.  Use a hash table to keep track of visited
4506         nodes. 
4507
4508         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4509         we actually did transform the other operand, otherwise fall back
4510         to the common codepath that casts to long.
4511
4512         * cs-tokenizer.cs: Use the same code pattern as the int case.
4513         Maybe I should do the parsing myself, and avoid depending on the
4514         Parse routines to get this done.
4515
4516 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4517
4518         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4519         which fixes bug 51347.  This time test it.
4520
4521         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4522         attributes for example can not tell the difference between these.
4523         The difference was only a syntax feature of the language. 
4524
4525         * attribute.cs: Apply attributes to delegates.
4526
4527         * delegate.cs: Call the apply attributes method.
4528
4529 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4530
4531         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4532         comparing 0 vs Byte.MinValue, not the value
4533
4534         (ImplicitConversionRequired): When reporting a conversion error,
4535         use error 31 to print out the constant error instead of the
4536         simpler 29.
4537
4538         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4539         which fixes bug 51347.
4540
4541 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4542
4543         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4544         which fixes the -warnaserror command line option.
4545
4546 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4547
4548         * cfold.cs (DoNumericPromotions): During constant folding of
4549         additions on UIntConstant, special case intconstants with
4550         IntConstants like we do on the expression binary operator. 
4551
4552 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4553
4554         * convert.cs (ImplicitReferenceConversion): We were missing a case
4555         (System.Enum are not value types or class types, so we need to
4556         classify them separatedly).
4557
4558         * driver.cs: We do not support error 2007.
4559
4560 2003-11-12 Jackson Harper <jackson@ximian.com>
4561
4562         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4563         system directory. Also use the full file name so users can
4564         libraries names mscorlib-o-tron.dll in a non system dir.
4565
4566 2003-11-10  Martin Baulig  <martin@ximian.com>
4567
4568         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4569         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4570         calling `ResolveType()' on them, directly assign their `Type'.
4571
4572 2003-11-08  Martin Baulig  <martin@ximian.com>
4573
4574         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4575         return value and the `out parent' parameter.
4576         (TypeContainer.DefineType): Moved the CS0644 check into
4577         GetClassBases().  Don't pass the interface types to the
4578         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4579         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4580
4581         * ecore.cs (TypeExpr.IsAttribute): New property.
4582         (TypeExpr.GetInterfaces): New method.
4583
4584         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4585         TypeExpr instead of a Type.
4586         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4587         (Interface.DefineType): Don't pass the interface types to the
4588         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4589         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4590
4591         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4592         instead of a `Type[]'.
4593         (TypeManager.RegisterBuilder): Likewise.
4594         (TypeManager.AddUserInterface): Likewise.
4595         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4596         `Type[]' and also return a `TypeExpr[]'.
4597         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4598
4599 2003-11-08  Martin Baulig  <martin@ximian.com>
4600
4601         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4602         Expression.     
4603
4604 2003-11-08  Martin Baulig  <martin@ximian.com>
4605
4606         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4607         TypeManager.ResolveExpressionTypes().
4608
4609         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4610         instead of an Expression.
4611         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4612         (TypeExpression): New public class; formerly known as `TypeExpr'.
4613
4614         * expression.cs (ComposedCast): Derive from TypeExpr.
4615
4616         * typemanager.cs (TypeManager.system_*_expr): These are now
4617         TypExpr's instead of Expression's.
4618         (TypeManager.ResolveExpressionTypes): New public static function;
4619         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4620         of them.        
4621
4622 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4623
4624         * expression.cs (New.DoResolve): Do not dereference value that
4625         might be a null return.
4626
4627         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4628         sure that the constant value has the right type.  Fixes an
4629         unreported bug, similar to 50425.
4630
4631         * const.cs (Const.LookupConstantValue): Call
4632         ImplicitStandardConversionExists before doing a conversion to
4633         avoid havng the TypeManager.ChangeType do conversions.
4634
4635         Reduced the number of casts used
4636
4637         (Const.ChangeType): New routine to enable reuse of the constant
4638         type changing code from statement.
4639
4640         * typemanager.cs (ChangeType): Move common initialization to
4641         static global variables.
4642
4643         Fixes #50425.
4644
4645         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4646         every value type to go through, even if it was void.  Fix that. 
4647
4648         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4649         character of the define, and the is_identifier_part_character for
4650         the rest of the string.
4651
4652 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4653
4654         * expression.cs (UnaryMutator.EmitCode): When I updated
4655         LocalVariableReference.DoResolve, I overdid it, and dropped an
4656         optimization done on local variable references.
4657
4658 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4659
4660         * ecore.cs: Convert the return from Ldlen into an int.
4661
4662 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4663
4664         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4665         the accessibility, this is a special case for toplevel non-public
4666         classes (internal for instance).
4667
4668 2003-10-20  Nick Drochak <ndrochak@gol.com>
4669
4670         * ecore.cs: Fix typo and build.  Needed another right paren.
4671
4672 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4673
4674         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4675         `internal' case regular and protected, but not allowing protected
4676         to be evaluated later.  Bug 49840
4677
4678 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4679
4680         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4681         to kb.Nlast, and not the kb.nFirst to isolate the switch
4682         statement.
4683
4684         Extract the underlying type, so enumerations of long/ulong are
4685         treated like long/ulong.
4686
4687 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4688
4689         * expression.cs (New): Overload the meaning of RequestedType to
4690         track the possible creation of the NewDelegate type, since
4691         DoResolve is invoked more than once for new constructors on field
4692         initialization.
4693
4694         See bugs: #48800 and #37014
4695
4696         * cs-parser.jay (declare_local_constants): Take an arraylist
4697         instead of a single constant.
4698
4699         (local_constant_declaration): It should take a
4700         constant_declarators, not a constant_declarator.  Fixes 49487
4701
4702         * convert.cs: Fix error report.
4703
4704 2003-10-13 Jackson Harper <jackson@ximian.com>
4705
4706         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4707         bug #49611
4708
4709 2003-10-09  Martin Baulig  <martin@ximian.com>
4710
4711         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4712         to the .ctor.
4713         (MethodCore.DoDefineParameters): Removed the TypeContainer
4714         argument; use the DeclSpace which was passed to the .ctor instead.
4715         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4716         TypeContainer; we only need a DeclSpace here.
4717
4718 2003-10-09  Martin Baulig  <martin@ximian.com>
4719
4720         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4721         to the .ctor.
4722         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4723         EmitContext's .ctor.    
4724
4725 2003-10-09  Martin Baulig  <martin@ximian.com>
4726
4727         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4728         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4729         AsAccessible(), moved them as well.
4730
4731         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4732
4733 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
4734
4735         * cs-parser.jay : Renamed yyName to yyNames related to jay.
4736
4737 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4738
4739         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4740         generation for >=, as spotted by Paolo, bug 48679.  
4741         Patch from David Waite.
4742
4743         * cs-tokenizer.cs: Add handling for #pragma.
4744
4745         * cs-parser.jay: Allow for both yield and yield return in the
4746         syntax.  The anti-cobolization of C# fight will go on!
4747
4748         * class.cs (TypeBuilder.DefineType): Catch error condition here
4749         (Parent.DefineType erroring out and returning null).
4750
4751         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4752         coping with enumerations variables, we were mistakenly processing
4753         them as a regular value type instead of built-in types.  Fixes the
4754         bug #48063
4755
4756         * typemanager.cs (IsBuiltinOrEnum): New method.
4757
4758 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
4759
4760         * cs-parser.jay: Upgrade: yield now needs the return clause.
4761
4762 2003-09-19  Martin Baulig  <martin@ximian.com>
4763
4764         * decl.cs (MemberCache.SetupCacheForInterface): Take a
4765         `MemberCache parent' argument.  Normally, an interface doesn't
4766         have a parent type except System.Object, but we use this in gmcs
4767         for generic type parameters.
4768
4769 2003-09-18  Martin Baulig  <martin@ximian.com>
4770
4771         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
4772         on `type.IsInterface'; don't check whether the type has a parent
4773         to determine whether it's an interface.
4774
4775 2003-09-15  Martin Baulig  <martin@ximian.com>
4776
4777         * class.cs (TypeContainer.DefineType): Added an error flag to
4778         avoid reporting duplicate CS0146's ("class definition is
4779         circular.").
4780
4781         * driver.cs (Driver.MainDriver): Abort if
4782         RootContext.ResolveTree() reported any errors.
4783
4784 2003-09-07  Martin Baulig  <martin@ximian.com>
4785
4786         * report.cs (Error, Warning): Added overloaded versions which take
4787         a `params object[] args' and call String.Format().
4788
4789 2003-09-07  Martin Baulig  <martin@ximian.com>
4790
4791         * decl.cs (DeclSpace..ctor): Don't call
4792         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
4793         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
4794         (DeclSpace.RecordDecl): New method.
4795
4796         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
4797
4798 2003-09-02  Ravi Pratap  <ravi@ximian.com>
4799
4800         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
4801         value attributes to be applied to ParameterBuilders.
4802
4803         * class.cs (MethodCore.LabelParameters): Make static and more
4804         generic so that it can be used from other places - like interface
4805         methods, for instance.
4806
4807         * interface.cs (Interface.Emit): Call LabelParameters before
4808         emitting attributes on the InterfaceMethod.
4809
4810 2003-08-26  Martin Baulig  <martin@ximian.com>
4811
4812         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
4813         resolving aliases; fixes #47927.
4814
4815 2003-08-26  Martin Baulig  <martin@ximian.com>
4816
4817         * statement.cs (Using.DoResolve): This is internally emitting a
4818         try/finally clause, so we need to set ec.NeedExplicitReturn if we
4819         do not always return.  Fixes #47681.
4820
4821 2003-08-26  Martin Baulig  <martin@ximian.com>
4822
4823         * decl.cs (MemberCore): Moved WarningNotHiding(),
4824         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
4825         into MemberBase.
4826         (AdditionResult): Make this nested in DeclSpace.
4827         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
4828         argument; call NamespaceEntry.Define() unless we're nested in a
4829         class or struct.
4830
4831         * namespace.cs (Namespace.DefineName): New public function.  This
4832         is called from DeclSpace's .ctor to add 
4833         (Namespace.Lookup): Include DeclSpaces in the lookup.
4834
4835         * class.cs (Operator): Derive from MemberBase, not MemberCore.
4836
4837         * const.cs (Const): Derive from MemberBase, not MemberCore.     
4838
4839 2003-08-25  Martin Baulig  <martin@ximian.com>
4840
4841         * convert.cs (Convert.ExplicitReferenceConversion): When
4842         converting from an interface type to a class, unbox if the target
4843         type is a struct type.  Fixes #47822.
4844
4845 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4846
4847         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
4848         #47854.
4849
4850 2003-08-22  Martin Baulig  <martin@ximian.com>
4851
4852         * class.cs (TypeManager.DefineType): When defining a nested type,
4853         call DefineType() on our parent; fixes #47801.
4854
4855 2003-08-22  Martin Baulig  <martin@ximian.com>
4856
4857         * class.cs (MethodData.Define): While checking if a method is an
4858         interface implementation, improve the test a bit more to fix #47654.
4859
4860 2003-08-22  Martin Baulig  <martin@ximian.com>
4861
4862         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
4863         correctly; fixes #47722.
4864
4865 2003-08-22  Martin Baulig  <martin@ximian.com>
4866
4867         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
4868         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
4869
4870         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
4871
4872 2003-08-22  Martin Baulig  <martin@ximian.com>
4873
4874         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
4875         can only be assigned in static constructors.  Fixes #47161.
4876
4877 2003-08-22  Martin Baulig  <martin@ximian.com>
4878
4879         Rewrote and improved the flow analysis code.
4880
4881         * flowbranching.cs (FlowBranching): Make this class abstract.
4882         (FlowBranching.CreateBranching): New static function to create a
4883         new flow branching.
4884         (FlowBranchingBlock, FlowBranchingException): New classes.
4885         (FlowBranching.UsageVector.Type): New public readonly field.
4886         (FlowBranching.UsageVector.Breaks): Removed the setter.
4887         (FlowBranching.UsageVector.Returns): Removed the setter.
4888         (FlowBranching.UsageVector): Added Break(), Return(),
4889         NeverReachable() and Throw() methods to modify the reachability.
4890         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
4891         done by FlowBranching.Merge().
4892         (FlowBranching.UsageVector.MergeChild): New method; merges the
4893         merge result into the current vector.
4894         (FlowBranching.Merge): New abstract method to merge a branching.
4895
4896 2003-08-12  Martin Baulig  <martin@ximian.com>
4897
4898         * expression.cs (Indirection.CacheTemporaries): Create the
4899         LocalTemporary with the pointer type, not its element type.
4900
4901 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
4902
4903         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
4904         token was a keyword or not.
4905
4906         Add `error' options where an IDENTIFIER was expected;  Provide
4907         CheckToken and CheckIdentifierToken convenience error reporting
4908         functions. 
4909
4910         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
4911
4912         * decl.cs: Rename `NamespaceEntry Namespace' public field into
4913         NameSpaceEntry NameSpaceEntry.
4914
4915         (LookupInterfaceOrClass): Avoid creating a full qualified name
4916         from namespace and name: avoid doing lookups when we know the
4917         namespace is non-existant.   Use new Tree.LookupByNamespace which
4918         looks up DeclSpaces based on their namespace, name pair.
4919
4920         * driver.cs: Provide a new `parser verbose' to display the
4921         exception thrown during parsing.  This is turned off by default
4922         now, so the output of a failure from mcs is more graceful.
4923
4924         * namespace.cs: Track all the namespaces defined in a hashtable
4925         for quick lookup.
4926
4927         (IsNamespace): New method
4928
4929 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
4930
4931         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
4932         we know that we need to concatenate (full typename can never be
4933         null). 
4934
4935         * class.cs: ditto.
4936
4937         * statement.cs: Use a bitfield;  Do not initialize to null things
4938         which are done by the constructor by default.
4939
4940         * cs-parser.jay: bug fix, parameter was 4, not 3.
4941
4942         * expression.cs: Just use the property;
4943
4944         * statement.cs: No need for GetVariableInfo method.
4945
4946 2003-08-08  Martin Baulig  <martin@ximian.com>
4947
4948         * flowanalysis.cs (FlowReturns): This is now nested in the
4949         `FlowBranching' class.
4950         (MyBitVector): Moved this here from statement.cs.
4951         (FlowBranching.SiblingType): New enum type.
4952         (FlowBranching.CreateSibling): Added `SiblingType' argument.
4953
4954 2003-08-07  Martin Baulig  <martin@ximian.com>
4955
4956         * flowanalysis.cs (FlowBranchingType): This is now nested in the
4957         `FlowBranching' class and called `BranchingType'.
4958
4959 2003-08-07  Martin Baulig  <martin@ximian.com>
4960
4961         * flowanalysis.cs: Moved all the control flow analysis code into
4962         its own file.
4963
4964 2003-08-07  Martin Baulig  <martin@ximian.com>
4965
4966         * assign.cs (Assign.DoResolve): `target' must either be an
4967         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
4968         #37319.
4969
4970 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
4971
4972         * expression.cs (BinaryMethod): This kind of expression is created by the
4973         Binary class if it determines that the operator has to be handled
4974         by a method.
4975
4976         (BinaryDelegate): This kind of expression is created if we are
4977         dealing with a + or - operator on delegates.
4978
4979         (Binary): remove method, argumetns, and DelegateOperator: when
4980         dealing with methods, 
4981
4982         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
4983
4984         * statement.cs (Block): use bitfields for the three extra booleans
4985         we had in use.   Remove unused topblock parameter.
4986
4987         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
4988
4989         * assign.cs: Drop extra unneeded tests.
4990
4991 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
4992
4993         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
4994
4995         * statement.cs (Foreach): Use VariableStorage instead of
4996         LocalBuilders.   
4997
4998         * codegen.cs (VariableStorage): New class used by clients that
4999         require a variable stored: locals or fields for variables that
5000         need to live across yield.
5001
5002         Maybe provide a convenience api for EmitThis+EmitLoad?
5003
5004         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5005         these bad boys.
5006
5007 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5008
5009         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5010         RemapParameterLValue): New methods that are used to turn a
5011         precomputed FieldInfo into an expression like this:
5012
5013                 instance.FieldInfo
5014
5015         The idea is to use this instead of making LocalVariableReference
5016         have more than one meaning.
5017
5018         * cs-parser.jay: Add error production to BASE.
5019
5020         * ecore.cs: Deal with TypeManager.GetField returning null, which
5021         is now a valid return value.
5022
5023         (FieldExprNoAddress): New expression for Fields whose address can
5024         not be taken.
5025
5026         * expression.cs (LocalVariableReference): During the resolve
5027         phases, create new expressions if we are in a remapping context.
5028         Remove code that dealt with remapping here.
5029
5030         (ParameterReference): same.
5031
5032         (ProxyInstance): New expression, like the `This' expression, but
5033         it is born fully resolved.  We know what we are doing, so remove
5034         the errors that are targeted to user-provided uses of `this'.
5035
5036         * statement.cs (Foreach): our variable is now stored as an
5037         Expression;  During resolution, follow the protocol, dont just
5038         assume it will return this.
5039
5040 2003-08-06  Martin Baulig  <martin@ximian.com>
5041
5042         * support.cs (SeekableStreamReader.cs): New public class.
5043
5044         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5045         SeekableStreamReader instead of the normal StreamReader.
5046
5047 2003-08-04  Martin Baulig  <martin@ximian.com>
5048
5049         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5050         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5051         deambiguate casts and delegate invocations.
5052         (parenthesized_expression): Use the new tokens to ensure this is
5053         not a cast of method invocation.
5054
5055         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5056         when reading a `)' and Deambiguate_CloseParens () was previously
5057         called.
5058
5059         * expression.cs (ParenthesizedExpression): New class.  This is
5060         just used for the CS0075 test.
5061         (Binary.DoResolve): Check for CS0075.   
5062
5063 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5064
5065         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5066         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5067         reference comparison.
5068
5069         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5070         examine the ReturnType for equality - this is necessary in the
5071         cases of implicit and explicit operators whose signature also
5072         includes the return type.
5073
5074 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5075
5076         * namespace.cs: Cache the result of the namespace computation,
5077         instead of computing it every time.
5078
5079 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5080
5081         * decl.cs: Use a global arraylist that we reuse over invocations
5082         to avoid excesive memory consumption.  Reduces memory usage on an
5083         mcs compile by one meg (45 average).
5084
5085         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5086         private, work around that.
5087
5088 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5089
5090         * literal.cs (IntLiteral): Define Zero and One static literals. 
5091
5092         * cs-parser.jay (integer_literal): use static literals to reduce
5093         memory usage for the most used literals (0, 1 and -1).  211kb
5094         reduced in memory usage.
5095
5096         Replace all calls to `new ArrayList' with `new
5097         ArrayList(4)' which is a good average number for most allocations,
5098         and also requires only 16 bytes of memory for its buffer by
5099         default. 
5100
5101         This reduced MCS memory usage in seven megabytes for the RSS after
5102         bootstrapping.
5103
5104 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5105
5106         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5107         handle params methods the correct way by forming only one
5108         applicable set with params and normal methods in them. Earlier we
5109         were looking at params methods only if we found no normal methods
5110         which was not the correct thing to do.
5111
5112         (Invocation.BetterFunction): Take separate arguments indicating
5113         when candidate and the best method are params methods in their
5114         expanded form.
5115
5116         This fixes bugs #43367 and #46199.
5117
5118         * attribute.cs: Documentation updates.
5119
5120         (CheckAttribute): Rename to CheckAttributeTarget.
5121         (GetValidPlaces): Rename to GetValidTargets.
5122
5123         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5124         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5125
5126         Fixes bug #44468.
5127
5128 2003-07-28  Martin Baulig  <martin@ximian.com>
5129
5130         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5131         name when looking up the base class of a nested class.  Fixes #46977.
5132
5133 2003-07-26  Martin Baulig  <martin@ximian.com>
5134
5135         * expression.cs (Indexers.Indexer): New nested struct; contains
5136         getter, setter and the indexer's type.
5137         (Indexers.Properties): This is now an ArrayList of
5138         Indexers.Indexer's.
5139         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5140         indexer doesn't have any getters.
5141
5142         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5143         for embedded property and indexer assignments.
5144
5145 2003-07-26  Martin Baulig  <martin@ximian.com>
5146
5147         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5148         preprocessor directive is not the first non-whitespace character
5149         on a line.
5150
5151 2003-07-26  Martin Baulig  <martin@ximian.com>
5152
5153         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5154         namespace parsing, follow the spec more closely.
5155
5156         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5157         NamespaceEntry.Lookup().
5158
5159 2003-07-25  Martin Baulig  <martin@ximian.com>
5160
5161         * MethodCore.cs (OverridesSomething): New public field; it's set
5162         from TypeContainer.DefineMembers if this method overrides
5163         something (which doesn't need to be a method).  Fix #39462.
5164
5165 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5166
5167         * typemanager.cs (GetMembers): Ensure that the list of members is
5168         reversed. This keeps things in sync.
5169
5170         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5171         find an AttributeUsage attribute.
5172
5173         * expression.cs (Invocation.OverloadResolve): Perform the check
5174         which disallows Invoke to be directly called on a Delegate.
5175
5176         (Error_InvokeOnDelegate): Report error cs1533.
5177
5178 2003-07-25  Martin Baulig  <martin@ximian.com>
5179
5180         * expression.cs (Indexers.GetIndexersForType): Only look in the
5181         interface hierarchy if the requested type is already an
5182         interface.  Fixes #46788 while keeping #46502 fixed.
5183
5184 2003-07-25  Martin Baulig  <martin@ximian.com>
5185
5186         * class.cs (TypeContainer.DefineMembers): Check whether all
5187         readonly fields have been assigned and report warning CS0649 if
5188         not.
5189
5190         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5191         a valuetype.
5192
5193 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5194
5195         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5196         returned from GetMethods to make things consistent with the
5197         assumptions MCS makes about ordering of methods.
5198
5199         This should comprehensively fix bug #45127 and it does :-)
5200
5201         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5202         ordering is actually reverse.
5203
5204         * Clean up some debug messages I left lying around.
5205
5206         * interface.cs (Populate*): Get rid of code which emits attributes
5207         since the stage in which we emit attributes is the 'Emit' stage,
5208         not the define stage.
5209
5210         (Emit): Move attribute emission for interface members here.
5211
5212 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5213
5214         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5215         closely: we eliminate methods in base types when we have an
5216         applicable method in a top-level type.
5217
5218         Please see section 14.5.5.1 for an exact description of what goes
5219         on. 
5220
5221         This fixes bug #45127 and a host of other related to corlib compilation.
5222
5223         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5224         array is the method corresponding to the top-level type (this is
5225         because of the changes made to icall.c) so we change this
5226         accordingly.
5227
5228         (MethodGroupExpr.Name): This too.
5229
5230         * typemanager.cs (GetElementType): New method which does the right
5231         thing when compiling corlib. 
5232
5233         * everywhere: Make use of the above in the relevant places.
5234
5235 2003-07-22  Martin Baulig  <martin@ximian.com>
5236
5237         * cs-parser.jay (invocation_expression): Moved
5238         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5239         `cast_expression', but create a InvocationOrCast which later
5240         resolves to either an Invocation or a Cast.
5241
5242         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5243         method; call this before EmitStatement() to make sure that this
5244         expression can be used as a statement.
5245
5246         * expression.cs (InvocationOrCast): New class; resolves to either
5247         an Invocation or a Cast.
5248
5249         * statement.cs (StatementExpression): Call ResolveStatement() on
5250         the ExpressionStatement before emitting it.
5251
5252 2003-07-21  Martin Baulig  <martin@ximian.com>
5253
5254         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5255         `ref' and `out' attributes match; fixes #46220.
5256         (MemberAccess.ResolveMemberAccess): You can't reference a type
5257         through an expression; fixes #33180.
5258         (Indexers.GetIndexersForType): Don't return the indexers from
5259         interfaces the class implements; fixes #46502.
5260
5261 2003-07-21  Martin Baulig  <martin@ximian.com>
5262
5263         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5264         CS0661 checks; fixes bug #30442.
5265
5266 2003-07-21  Martin Baulig  <martin@ximian.com>
5267
5268         * decl.cs (AdditionResult): Added `Error'.
5269
5270         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5271
5272         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5273         makes cs0031.cs actually work.
5274
5275 2003-07-20  Martin Baulig  <martin@ximian.com>
5276
5277         * namespace.cs: Fixed that bug which caused a crash when compiling
5278         the debugger's GUI.
5279
5280 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5281
5282         * typemanager.cs (LookupTypeReflection): Never expose types which
5283         are NotPublic, NestedPrivate, NestedAssembly, or
5284         NestedFamANDAssem.  We used to return these, and later do a check
5285         that would report a meaningful error, but the problem is that we
5286         would not get the real match, if there was a name override.
5287
5288 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5289
5290         * namespace.cs (Namespace, Name): Do not compute the namespace
5291         name dynamically, compute it in the constructor.  This reduced
5292         memory usage by 1697 KB.
5293
5294         * driver.cs: Use --pause to pause at the end.
5295
5296 2003-07-17  Peter Williams  <peter@newton.cx>
5297
5298         * Makefile: Change the name of the test target so that it doesn't
5299         conflict with the recursive test target.
5300
5301 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5302
5303         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5304         AddressOf): Do not use EmitThis, that was wrong, use the actual
5305         this pointer.
5306
5307 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5308
5309         * class.cs (MethodData.Define): While checking if a method is an
5310         interface implementation, improve the test: If we are not public
5311         (use new test here: use the computed MethodAttributes directly,
5312         instead of the parsed modifier flags) check if the `implementing'
5313         method comes from an interface or not.
5314
5315         * pending.cs (VerifyPendingMethods): Slightly better error
5316         message.
5317
5318         * makefile: add test target that does the mcs bootstrap.
5319
5320 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5321
5322         * interface.cs (Define): Do nothing here since there are no
5323         members to populate etc. Move the attribute emission out of here
5324         since this was just totally the wrong place to put it. Attribute
5325         application happens during the 'Emit' phase, not in the 'Define'
5326         phase.
5327
5328         (Emit): Add this method and move the attribute emission here
5329
5330         * rootcontext.cs (EmitCode): Call the Emit method on interface
5331         types too.
5332
5333 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5334
5335         * expression.cs (OverloadResolve): Report error only if Location
5336         is not 'Null' which means that there was a probe going on.
5337
5338 2003-07-14  Martin Baulig  <martin@ximian.com>
5339
5340         * expression.cs (ConditionalLogicalOperator): New public class to
5341         implement user defined conditional logical operators.
5342         This is section 14.11.2 in the spec and bug #40505.
5343
5344 2003-07-14  Martin Baulig  <martin@ximian.com>
5345
5346         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5347
5348 2003-07-14  Martin Baulig  <martin@ximian.com>
5349
5350         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5351
5352         * ecore.cs (IVariable.VerifyFixed): New interface method.
5353
5354         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5355         operator, check whether the variable is actually fixed.  Fixes bug
5356         #36055.  Set a variable definitely assigned when taking its
5357         address as required by the spec.
5358
5359         * statement.cs (LocalInfo.IsFixed): New field.
5360         (LocalInfo.MakePinned): Set `IsFixed' to true.
5361
5362 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5363
5364         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5365         for .ctors, ensure that we only ask for members declared in the
5366         attribute type (BindingFlags.DeclaredOnly).
5367
5368         Fixes bug #43632.
5369
5370         * expression.cs (Error_WrongNumArguments): Report error 1501
5371         correctly the way CSC does.
5372
5373 2003-07-13  Martin Baulig  <martin@ximian.com>
5374
5375         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5376         lookup on the fully qualified name, to make things like "X.X" work
5377         where "X.X" is a fully qualified type name, but we also have a
5378         namespace "X" in the using list.  Fixes #41975.
5379
5380 2003-07-13  Martin Baulig  <martin@ximian.com>
5381
5382         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5383         function. If we're a CompoundAssign, we need to create an embedded
5384         CompoundAssign, not an embedded Assign.
5385         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5386         Fixes #45854.
5387
5388 2003-07-13  Martin Baulig  <martin@ximian.com>
5389
5390         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5391         work to fix bug #46088.
5392
5393 2003-07-13  Ravi Pratap <ravi@ximian.com>
5394
5395         * class.cs (Operator.Emit): Do not emit attributes here - it is
5396         taken care of by the Method class that we delegate too. This takes
5397         care of bug #45876.
5398
5399 2003-07-10  Martin Baulig  <martin@ximian.com>
5400
5401         * expression.cs (TypeOfVoid): New class.
5402         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5403
5404 2003-07-10  Martin Baulig  <martin@ximian.com>
5405
5406         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5407         bug #35957.
5408
5409 2003-07-10  Martin Baulig  <martin@ximian.com>
5410
5411         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5412         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5413
5414         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5415
5416         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5417
5418 2003-07-10  Martin Baulig  <martin@ximian.com>
5419
5420         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5421         of decimal.  Fixes #42850.
5422
5423         NOTE: I also fixed the created byte blob, but this doesn't work on
5424         the MS runtime and csc never produces any byte blobs for decimal
5425         arrays.
5426
5427 2003-07-10  Martin Baulig  <martin@ximian.com>
5428
5429         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5430         structs; fixes #32068.
5431         (Block.AddChildVariableNames): Fixed #44302.
5432
5433 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5434
5435         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5436
5437 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5438
5439         * attribute.cs: And this test is onger needed.
5440
5441 2003-07-08  Martin Baulig  <martin@ximian.com>
5442
5443         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5444         inaccessible types.  Fixes #36313.
5445
5446         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5447
5448         * namespace.cs (NamespaceEntry): Create implicit entries for all
5449         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5450         implicit entries for N1.N2 and N1.
5451
5452 2003-07-08  Martin Baulig  <martin@ximian.com>
5453
5454         Rewrote the handling of namespaces to fix a lot of the issues
5455         wrt. `using' aliases etc.
5456
5457         * namespace.cs (Namespace): Splitted this class into a
5458         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5459
5460         * typemanager.cs (TypeManager.IsNamespace): Removed.
5461         (TypeManager.ComputeNamespaces): Only compute namespaces from
5462         loaded assemblies here, not the namespaces from the assembly we're
5463         currently compiling.
5464
5465 2003-07-08  Martin Baulig  <martin@ximian.com>
5466
5467         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
5468
5469 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5470
5471         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
5472         already fixed it.  
5473
5474         I thought about the memory savings here, but LookupTypeReflection
5475         is used under already very constrained scenarios.  Compiling
5476         corlib or mcs only exposes one hit, so it would not really reduce
5477         any memory consumption.
5478
5479 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5480
5481         * typemanager.cs: fixes bug #45889 by only adding public types from
5482         other assemblies to the list of known types.
5483
5484 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5485
5486         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
5487         on the type we resolved.
5488
5489 2003-07-05  Martin Baulig  <martin@ximian.com>
5490
5491         * pending.cs (PendingImplementation.ParentImplements): Don't
5492         create the proxy if the parent is abstract.
5493
5494         * class.cs (TypeContainer.DefineIndexers): Process explicit
5495         interface implementations first.  Fixes #37714.
5496
5497 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5498
5499         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5500         defined recursively;  but since we modify the input parameters
5501         (left is set to `this' temporarily), we reset this value if the
5502         left_is_explicit is false, which gives the original semantics to
5503         the code.  
5504
5505         * literal.cs (NullPointer): new class used to represent a null
5506         literal in a pointer context.
5507
5508         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5509         type is a pointer, use a NullPointer object instead of a
5510         NullLiteral.   Closes 43687
5511
5512         (ExplicitConversion): Convert pointer values using
5513         the conv opcode to the proper type.
5514
5515         * ecore.cs (New): change ValueTypeVariable property into a method,
5516         that returns whether the valuetype is suitable for being used.
5517
5518         * expression.cs (Binary.DoNumericPromotions): Only return if we
5519         the int constant was a valid uint, and we can return both left and
5520         right as uints.  If not, we continue processing, to trigger the
5521         type conversion.  This fixes 39018.
5522
5523         * statement.cs (Block.EmitMeta): During constant resolution, set
5524         the CurrentBlock property on the emitcontext, so that we resolve
5525         constants propertly.
5526
5527 2003-07-02  Martin Baulig  <martin@ximian.com>
5528
5529         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5530         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5531
5532         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5533         than emitting it here.
5534
5535         * statement.cs: Fixed some more flow analysis bugs.
5536
5537 2003-07-02  Martin Baulig  <martin@ximian.com>
5538
5539         * class.cs (MethodData.Define): When implementing interface
5540         methods, set Final unless we're Virtual.
5541
5542         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5543         check work for interface methods.
5544
5545 2003-07-01  Martin Baulig  <martin@ximian.com>
5546
5547         * ecore.cs (EmitContext.This): Replaced this property with a
5548         GetThis() method which takes a Location argument.  This ensures
5549         that we get the correct error location for a CS0188.
5550
5551 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5552
5553         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5554         ImplicitStandardConversion.
5555
5556         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5557
5558 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5559
5560         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5561         optimization.
5562
5563 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5564
5565         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5566         constructors.
5567
5568         (MethodData.Define): Turn off initlocals for unsafe methods.
5569
5570 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5571
5572         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5573         complete;  Fixes #37521.
5574
5575         * delegate.cs: Use Modifiers.TypeAttr to compute the
5576         TypeAttributes, instead of rolling our own.  This makes the flags
5577         correct for the delegates.
5578
5579 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5580
5581         * class.cs (Constructor.Define): Set the private flag for static
5582         constructors as well.
5583
5584         * cs-parser.jay (statement_expression): Set the return value to
5585         null, to avoid a crash when we catch an error.
5586
5587 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5588
5589         * cs-parser.jay: Applied patch from Jackson that adds support for
5590         extern and unsafe modifiers to destructor declarations.
5591
5592         * expression.cs: Report error 21 if the user is trying to index a
5593         System.Array.
5594
5595         * driver.cs: Add an error message, suggested by the bug report.
5596
5597         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5598         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5599
5600 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5601
5602         * namespace.cs: Add some information to reduce FAQs.
5603
5604 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5605
5606         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5607         underlying enumeration types.  Fixes #43915.
5608
5609         * expression.cs: Treat ushort/short as legal values to be used in
5610         bitwise operations.
5611
5612 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5613
5614         * delegate.cs: transfer custom attributes for paramenters from
5615         the delegate declaration to Invoke and BeginInvoke.
5616
5617 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5618
5619         * attribute.cs: handle custom marshalers and emit marshal info
5620         for fields, too.
5621
5622 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5623
5624         * makefile.gnu: Added anonymous.cs to the compiler sources.
5625
5626 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
5627
5628         * iterators.cs: Change the name of the proxy class to include two
5629         underscores.
5630
5631         * cs-parser.jay: Update grammar to include anonymous methods.
5632
5633         * anonymous.cs: new file.
5634
5635 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
5636
5637         * class.cs (Field.Define): Add missing test for pointers and
5638         safety. 
5639
5640 2003-05-27  Ravi Pratap  <ravi@ximian.com>
5641
5642         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
5643         we use the stobj opcode.
5644
5645         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
5646         since it wasn't the correct fix. 
5647
5648         It still is puzzling that we are required to use stobj for IntPtr
5649         which seems to be a ValueType.
5650
5651 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
5652
5653         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
5654         during regular simple name resolution.   Now, the trick is that
5655         instead of returning for processing the simplename, we do a
5656         TypeManager.LookupType (ie, a rooted lookup as opposed to a
5657         contextual lookup type).   If a match is found, return that, if
5658         not, return for further composition.
5659
5660         This fixes long-standing 30485.
5661
5662         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5663         using the address to initialize an object, do an Stobj instead of
5664         using the regular Stelem.
5665
5666         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
5667         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
5668         Because if we are a BaseIndexerAccess that value will be true.
5669         Fixes 43643.
5670
5671         * statement.cs (GotoCase.Resolve): Return after reporting an
5672         error, do not attempt to continue. 
5673
5674         * expression.cs (PointerArithmetic.Emit): If our operand is a
5675         long, convert our constants to match the operand before
5676         multiplying.  Convert to I type before adding.   Fixes 43670.
5677
5678 2003-05-14  Ravi Pratap  <ravi@ximian.com>
5679
5680         * enum.cs (ImplicitConversionExists) : Rename to
5681         ImplicitEnumConversionExists to remove ambiguity. 
5682
5683         * ecore.cs (NullCast): New type of cast expression class which
5684         basically is very similar to EmptyCast with the difference being
5685         it still is a constant since it is used only to cast a null to
5686         something else
5687         (eg. (string) null)
5688
5689         * convert.cs (ImplicitReferenceConversion): When casting a null
5690         literal, we return a NullCast.
5691
5692         * literal.cs (NullLiteralTyped): Remove - I don't see why this
5693         should be around anymore.
5694
5695         The renaming (reported was slightly wrong). Corrections:
5696
5697         ConvertImplicitStandard -> ImplicitConversionStandard
5698         ConvertExplicitStandard -> ExplicitConversionStandard
5699
5700         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
5701         before passing them in !
5702
5703         * convert.cs (ImplicitConversionStandard): When comparing for
5704         equal expr and target types, ensure that expr is not a
5705         NullLiteral.
5706
5707         In general, we must not be checking (expr_type ==
5708         target_type) in the top level conversion methods
5709         (ImplicitConversion, ExplicitConversion etc). This checking is
5710         done in the methods that they delegate to.
5711
5712 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
5713
5714         * convert.cs: Move Error_CannotConvertType,
5715         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
5716         ImplicitNumericConversion, ImplicitConversionExists,
5717         ImplicitUserConversionExists, StandardConversionExists,
5718         FindMostEncompassedType, FindMostSpecificSource,
5719         FindMostSpecificTarget, ImplicitUserConversion,
5720         ExplicitUserConversion, GetConversionOperators,
5721         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
5722         TryImplicitIntConversion, Error_CannotConvertImplicit,
5723         ConvertImplicitRequired, ConvertNumericExplicit,
5724         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
5725         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
5726         its own file.
5727
5728         Perform the following renames:
5729
5730         StandardConversionExists -> ImplicitStandardConversionExists
5731         ConvertImplicit -> ImplicitConversion
5732         ConvertImplicitStandard -> ImplicitStandardConversion
5733         TryImplicitIntConversion -> ImplicitIntConversion
5734         ConvertImplicitRequired -> ImplicitConversionRequired
5735         ConvertNumericExplicit -> ExplicitNumericConversion
5736         ConvertReferenceExplicit -> ExplicitReferenceConversion
5737         ConvertExplicit -> ExplicitConversion
5738         ConvertExplicitStandard -> ExplicitStandardConversion
5739
5740 2003-05-19  Martin Baulig  <martin@ximian.com>
5741
5742         * statement.cs (TypeInfo.StructInfo): Made this type protected.
5743         (TypeInfo): Added support for structs having structs as fields.
5744
5745         * ecore.cs (FieldExpr): Implement IVariable.
5746         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
5747         VariableInfo for the field.
5748
5749 2003-05-18  Martin Baulig  <martin@ximian.com>
5750
5751         * expression.cs (This.DoResolve): Report a CS0027 if we're
5752         emitting a field initializer.
5753
5754 2003-05-18  Martin Baulig  <martin@ximian.com>
5755
5756         * expression.cs (This.ResolveBase): New public function.
5757         (This.DoResolve): Check for CS0188.
5758
5759         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
5760         This.Resolve().
5761
5762         * ecore.cs (MethodGroupExpr.DoResolve): Set the
5763         `instance_expression' to null if we don't have any non-static
5764         methods.
5765
5766 2003-05-18  Martin Baulig  <martin@ximian.com>
5767
5768         Reworked the way how local variables and parameters are handled by
5769         the flow analysis code.
5770
5771         * statement.cs (TypeInfo, VariableMap): New public classes.
5772         (VariableInfo): New public class.  This is now responsible for
5773         checking whether a variable has been assigned.  It is used for
5774         parameters and local variables.
5775         (Block.EmitMeta): Take the InternalParameters as argument; compute
5776         the layout of the flow vectors here.
5777         (Block.LocalMap, Block.ParameterMap): New public properties.
5778         (FlowBranching): The .ctor doesn't get the InternalParameters
5779         anymore since Block.EmitMeta() now computes the layout of the flow
5780         vector.
5781         (MyStructInfo): This class is now known as `StructInfo' and nested
5782         in `TypeInfo'; we don't access this directly anymore.
5783
5784         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
5785         property and removed IsAssigned(), IsFieldAssigned(),
5786         SetAssigned() and SetFieldAssigned(); we now call them on the
5787         VariableInfo so we don't need to duplicate this code everywhere.
5788
5789         * expression.cs (ParameterReference): Added `Block block' argument
5790         to the .ctor.
5791         (LocalVariableReference, ParameterReference, This): The new
5792         VariableInfo class is now responsible for all the definite
5793         assignment stuff.
5794
5795         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
5796         IsParameterAssigned, SetParameterAssigned): Removed.
5797
5798 2003-05-18  Martin Baulig  <martin@ximian.com>
5799
5800         * typemanager.cs (InitCoreTypes): Try calling
5801         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
5802         the 3-args-version.  Corlib now also needs our `void_type'.
5803         (GetMethod): Added overloaded version which takes an optional
5804         `bool report_errors' to allow lookups of optional methods.
5805
5806 2003-05-12  Martin Baulig  <martin@ximian.com>
5807
5808         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
5809         only used for locals and not for parameters.
5810
5811 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
5812
5813         * support.cs (InternalParameters.ParameterType): Return the
5814         ExternalType of the parameter.
5815
5816         * parameter.cs (Parameter.ExternalType): drop the two arguments,
5817         they were unused.
5818
5819 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
5820
5821         * class.cs (MethodData.Define): Do not set the `newslot' on
5822         interface members, if they are also flagged as "override".
5823
5824         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
5825         better code for ++i and i++.  This only works for static fields
5826         and local variables.
5827
5828         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
5829         want to pull the DeclSpace out of the builder_to_declspace instead
5830         of the TypeBuilder (like in TypeContainer.FindMembers).
5831
5832         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
5833         instead of LookupTypeContainer.  Fixes the crash on .NET for
5834         looking up interface members.
5835
5836         * const.cs: Create our own emit context during the Definition
5837         stage, so that constants are evaluated in the proper context, when
5838         a recursive definition happens.
5839
5840 2003-05-11  Martin Baulig  <martin@ximian.com>
5841
5842         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
5843         new block for a switch section.
5844         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
5845         the adding/lookup in the switch block.  Fixes #39828.
5846
5847 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
5848
5849         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
5850         functionality: I needed to convert the data after I had performed
5851         the add/sub operation into the operands type size.
5852
5853         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
5854         pass the type for the box operation, otherwise the resulting
5855         object would have been of type object.
5856
5857         (BoxedCast): Add constructor to specify the type to box as.
5858
5859 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
5860
5861         * iterators.cs: I was reusing the `count' variable inadvertently,
5862         take steps to not allow this to happen.
5863
5864 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
5865
5866         * attribute.cs (Attribute.Resolve): Params attributes are encoded
5867         by creating an array at the point where the params starts and
5868         putting all those arguments there, then adjusting the size of the
5869         array.
5870
5871 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
5872
5873         * expression.cs (New.AddressOf): Implement interface
5874         IMemoryLocation.  This is used when the `new' operator is used in
5875         the context of an invocation to a method on a value type.
5876
5877         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
5878         example. 
5879
5880         * namespace.cs: Also check the using aliases here.
5881
5882         * driver.cs: Move the test for using validity after the types have
5883         been entered, so we do a single pass that also includes the using
5884         aliases. 
5885
5886         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
5887         in the regular case.   CreateSiblingForFinally is doing extra
5888         error checking.
5889
5890         * attribute.cs (GetAttributeArgumentExpression): Store the result
5891         on an out value, and use the return value to indicate failure
5892         instead of using null (which is a valid return for Constant.GetValue).
5893
5894         * statement.cs: Perform the analysis flow for the increment
5895         portion after the statement, because this will be the real flow of
5896         execution.  Fixes #42385
5897
5898         * codegen.cs (EmitContext.EmitArgument,
5899         EmitContext.EmitStoreArgument): New helper functions when the
5900         RemapToProxy flag is set.
5901
5902         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
5903         function.
5904
5905         Add support for remapping parameters. 
5906
5907         * iterators.cs: Propagate parameter values;  Store parameter
5908         values in the proxy classes.
5909
5910 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
5911
5912         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
5913         need a proxy reference;  I do not know what I was thinking
5914
5915         * cs-parser.jay (constructor_initializer): catch another error,
5916         and display nice message.
5917
5918         (field_declaration): catch void field declaration
5919         to flag a better error. 
5920
5921         * class.cs (MemberBase.CheckBase): Report an error instead of a
5922         warning if a new protected member is declared in a struct. 
5923         (Field.Define): catch the error of readonly/volatile.
5924
5925         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
5926
5927         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
5928         volatile variable is taken
5929
5930 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
5931
5932         * statement.cs (Fixed.Resolve): Report an error if we are not in
5933         an unsafe context.
5934
5935 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
5936
5937         * typemanager.cs: reuse the code that handles type clashes for
5938         delegates and enumerations.
5939
5940         * class.cs (Report28): Always report.
5941
5942         * expression.cs (EncodeAsAttribute): Allow nulls here.
5943
5944 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
5945
5946         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
5947         the functionality for testing whether an expression is valid for
5948         an attribute here.  Also handle the case of arrays of elements
5949         being stored. 
5950
5951         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
5952         encoding a linear array into an array of objects that are suitable
5953         to be passed to an CustomAttributeBuilder.
5954
5955         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
5956
5957         * ecore.cs: (FieldExpr): Handle field remapping here.
5958
5959         * iteratators.cs: Pass the instance variable (if the method is an
5960         instance method) to the constructors, so we can access the field
5961         variables on the class.
5962
5963         TODO: Test this with structs.  I think the THIS variable on
5964         structs might have to be a pointer, and not a refenrece
5965
5966 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
5967
5968         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
5969         local variables to fields in a proxy class.
5970
5971         * iterators.cs (PopulateProxy): Rename our internal fields to
5972         <XXX>.  
5973         Create a <THIS> field if we are an instance method, so we can
5974         reference our parent container variables.
5975         (MapVariable): Called back from the EmitContext code to enter a
5976         new variable to field mapping into the proxy class (we just create
5977         a FieldBuilder).
5978
5979         * expression.cs
5980         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
5981         for using the remapped locals to fields.
5982
5983         I placed the code here, because that gives the same semantics to
5984         local variables, and only changes the Emit code.
5985
5986         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
5987         statements inside iterators.
5988         (VariableInfo): Add a FieldBuilder for the cases when we are
5989         remapping local variables to fields in a proxy class
5990
5991         * ecore.cs (SimpleNameResolve): Avoid testing two times for
5992         current_block != null.
5993
5994         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
5995         not cope with strings, as it has been moved to the
5996         TableSwitchEmit.  Fixed bug in switch generation.
5997
5998         * expression.cs (New.DoResolve): Provide more context for the user
5999         when reporting an error.
6000
6001         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6002         pointers. 
6003
6004         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6005         check the permissions for it.  Note than in a type-resolution
6006         context the check was already present in DeclSpace.ResolveType,
6007         but was missing from the MemberAccess.
6008
6009         (ArrayCreation.CheckIndices): warn if the user has
6010         more nested levels of expressions, but there are no more
6011         dimensions specified.  Avoids crash on bug 41906.
6012
6013 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6014
6015         * statement.cs (Block): replace Implicit bool, for a generic
6016         flags.   
6017         New flag: `Unchecked'.  This is used during the EmitMeta phase
6018         (which is out-of-line with the regular Resolve/Emit process for a
6019         statement, as this is done ahead of time, but still gets a chance
6020         to call constant resolve).
6021
6022         (Block.Flags): new enum for adding a new flag.
6023
6024         (Block.EmitMeta): track the state of unchecked.
6025
6026         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6027         to enable constant resolution to work there as well.
6028
6029 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6030
6031         * typemanager.cs (ienumerable_type): Also look up
6032         System.Collections.IEnumerable. 
6033
6034 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6035
6036         TODO: Test more than one conditional per method.
6037
6038         * class.cs (Indexer.Define): Report the location where the user is
6039         referencing the unsupported feature.
6040
6041         (MethodData): Overload the use of `conditionals' to
6042         minimize the creation of needless ArrayLists.   This saves roughly
6043         212kb on my machine.
6044
6045         (Method): Implement the new IIteratorContainer interface.
6046         (Method.SetYields): Implement the method by setting the ModFlags
6047         to contain METHOD_YIELDS.
6048
6049         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6050         which just got set to null.
6051
6052         * iterators.cs: New file.
6053
6054         (Yield, YieldBreak): New statements.
6055
6056         * statement.cs (Return.Resolve): Flag an error if we are used in
6057         an iterator method.
6058
6059         * codegen.cs (InIterator): New flag set if the code is being
6060         compiled in an iterator method.
6061
6062         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6063         internal modifier, and we just use it to avoid adding extra
6064         fields, as this is seldom used.  
6065
6066         * cs-parser.jay: Add yield_statement (yield and yield break).
6067
6068         * driver.cs: New flag -v2 to turn on version 2 features. 
6069
6070         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6071         hashtable when v2 is enabled.
6072
6073 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6074
6075         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6076         there is already a namespace defined with this name.
6077
6078         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6079         people upgraded their corlibs.
6080
6081         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6082         always use fully qualified types, no need to use the compiler
6083         front end.
6084
6085         (TypeManager.IsNamespace): Use binarysearch.
6086
6087         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6088         AddDelegate): I did not quite use the new IsValid API properly: I
6089         have to pass the short-name and the fullname.  I was passing only
6090         the basename instead of the fullname sometimes. 
6091
6092         (TypeContainer.DefineType): call NamespaceClash.
6093
6094         * interface.cs (Interface.DefineType): use NamespaceClash before
6095         defining the type.
6096
6097         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6098         defining the type.
6099
6100         * enum.cs: (Enum.DefineType): use NamespaceClash before
6101         defining the type.
6102
6103         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6104         speed increase.  First, use the negative_hits cache when we get a
6105         negative.  Second, add the type with its full original name
6106         instead of the new . and + encoded name (reflection uses + to
6107         separate type from a nested type).  Use LookupTypeReflection
6108         directly which bypasses the type->name hashtable (that we already
6109         know does not contain the type.
6110
6111         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6112         location/container type. 
6113
6114         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6115
6116 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6117
6118         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6119
6120         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6121         method is being referenced in the method group from a static
6122         context, and report error 120 if so.
6123
6124         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6125         Error118. 
6126
6127         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6128         is created, we create the A namespace).
6129
6130         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6131         Fixes #41591
6132
6133 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6134
6135         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6136         invocation to ModuleBuilder.GetType with the same values will
6137         return a new type instance, so we need to cache its return
6138         values. 
6139
6140         * expression.cs (Binary.ResolveOperator): Only allow the compare
6141         operators on enums if they are of the same type.
6142
6143         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6144         types of ValueType on their own case.  Before we were giving them
6145         the same treatment as objects.
6146
6147         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6148         fullname.  Short name is used to compare against container name.
6149         Fullname is used to check against defined namespace names.
6150
6151         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6152         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6153
6154         (Method.CheckBase): Call parent.
6155         (MemberBase.CheckBase): Check for protected members on sealed
6156         classes.
6157         (PropertyBase.CheckBase): Call parent.
6158         (Field.Define): Call parent.
6159
6160         * report.cs: Negative error codes are now mapped to 8000 - code,
6161         so that the display is render more nicely.
6162
6163         * typemanager.cs: Do not use try/catch, instead report a regular
6164         error. 
6165
6166         (GetPointerType, GetReferenceType): These methods provide
6167         mechanisms to obtain the T* and T& from a T.  We had the code
6168         previously scattered around the code base, and it also used
6169         TypeManager.LookupType that would go through plenty of caches.
6170         This one goes directly to the type source.
6171
6172         In some places we did the Type.GetType followed by
6173         ModuleBuilder.GetType, but not in others, so this unifies the
6174         processing as well.
6175
6176         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6177         statements now that we have namespace information.
6178
6179         * typemanager.cs (IsNamespace): New method, returns whether the
6180         string presented is a namespace or not.
6181
6182         (ComputeNamespaces): New public entry point, computes the list of
6183         available namespaces, using the GetNamespaces API call in Mono, or
6184         the slower version in MS.NET.   
6185
6186         Now before we start the semantic analysis phase, we have a
6187         complete list of namespaces including everything that the user has
6188         provided.
6189
6190         Deleted old code to cache namespaces in .nsc files.
6191
6192 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6193
6194         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6195         class/struct location definition Location for the implicit
6196         constructor location.
6197
6198         (Operator.Define): Use the location of the operator for the
6199         implicit Method definition.
6200
6201         (Constructor.Emit): use the constructor location for the implicit
6202         base initializer constructor.
6203
6204         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6205         and the Expression class now contains two new methods:
6206
6207         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6208         isolate type lookup from the rest of the resolution process.
6209
6210         Since we use Expressions to hold type definitions due to the way
6211         we parse the input we have historically overloaded Resolve to
6212         perform the Type lookups if a special flag is passed.  Now this is
6213         eliminated and two methods take their place. 
6214
6215         The differences in the two methods between xStep and xTerminal is
6216         that xStep is involved in our current lookup system that uses
6217         SimpleNames to compose a name, while xTerminal is used just to
6218         catch the case where the simplename lookup failed.
6219
6220 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6221
6222         * expression.cs (ResolveMemberAccess): Remove redundant code.
6223         TypeExpr expressions are always born fully resolved.
6224
6225         * interface.cs (PopulateMethod): Do not lookup the types twice.
6226         We were doing it once during SemanticAnalysis and once during
6227         PopulateMethod.
6228
6229         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6230         in local variable type definitions, were being returned as a
6231         SimpleName (we decomposed everything into a string), that is
6232         because primary_expression was being used instead of a type in the
6233         grammar (reduce/reduce conflicts).
6234
6235         The part that was wrong is that we converted the expression into a
6236         string (an oversimplification in one hand, compounded with primary
6237         expressions doing string concatenation).
6238
6239         So things like:
6240
6241         A.B.C [] x;
6242
6243         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6244         using clauses from working on this particular context.  And a type
6245         was being matched directly against "A.B.C[]".
6246
6247         We now use the correct approach, and allow for ComposedCast to be
6248         part of the unary expression.  So the "A.B.C []" become a composed
6249         cast of "A.B.C" (as a nested group of MemberAccess with a
6250         SimpleName at the end) plus the rank composition "[]". 
6251
6252         Also fixes 35567
6253
6254 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6255
6256         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6257         for the access level checking.
6258
6259         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6260         `TypeContainer container', because I kept getting confused when I
6261         was debugging this code.
6262
6263         * expression.cs (Indexers): Instead of tracking getters/setters,
6264         we now track them in parallel.  We create one arraylist less, but
6265         most importantly it is possible now for the LValue code to find a
6266         matching get for a set.
6267
6268         (IndexerAccess.DoResolveLValue): Update the code.
6269         GetIndexersForType has been modified already to extract all the
6270         indexers from a type.  The code assumed it did not.
6271
6272         Also make the code set the correct return type for the indexer.
6273         This was fixed a long time ago for properties, but was missing for
6274         indexers.  It used to be void_type.
6275
6276         (Binary.Emit): Test first for doubles instead of
6277         floats, as they are more common.
6278
6279         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6280         when dealing with floats and the <=, >= operators.  This fixes bug
6281         #39314 
6282
6283         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6284         to load the array value by emitting a load on the foreach variable
6285         type.  This was incorrect.  
6286
6287         We now emit the code to load an element using the the array
6288         variable type, and then we emit the conversion operator.
6289
6290         Fixed #40176
6291
6292 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6293
6294         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6295
6296 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6297
6298         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6299         test for protection before we test for signatures. 
6300
6301         (MethodSignature.ToString): implement.
6302
6303         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6304         to the case where we reduced into a LongConstant.
6305
6306         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6307         depend on whether the information is acurrate, because the
6308         Microsoft runtime will always claim that the array type is public,
6309         regardless of the real state.
6310
6311         If the type is a pointer, another problem happens: the type is
6312         reported as non-public in Microsoft.  
6313
6314         In both cases we have to call CheckAccessLevel recursively with
6315         the underlying type as the argument to be tested.
6316
6317 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6318
6319         * assign.cs (Assign.Emit): If we are dealing with a compound
6320         assignment expression, we should use the code path that stores the
6321         intermediate result in a temporary value.  This fixes #40903.
6322
6323         *expression.cs (Indirection.ToString): Provide ToString method for
6324         debugging. 
6325
6326 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6327
6328         * class.cs: Null out fields holding references to Block objects so
6329         they can be garbage collected.
6330
6331         * expression.cs (OverloadResolve): Remove unused local.
6332
6333 2003-04-07  Martin Baulig  <martin@ximian.com>
6334
6335         * codegen.cs (EmitContext.CurrentFile): New public field.
6336         (EmitContext.Mark): Use the CurrentFile to check whether the
6337         location is in the correct file.
6338         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6339
6340 2003-04-07  Martin Baulig  <martin@ximian.com>
6341
6342         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6343
6344         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6345         location.  [FIXME: The location argument which gets passed to this
6346         method is sometimes wrong!]
6347
6348 2003-04-07  Nick Drochak <ndrochak@gol.com>
6349
6350         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6351
6352 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6353
6354         * expression.cs (Indirection.EmitAssign): We were using the
6355         temporary, but returning immediately instead of continuing the
6356         EmitAssing flow.
6357
6358 2003-04-06  Martin Baulig  <martin@ximian.com>
6359
6360         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6361         if it's a nested child, but also deriving from the outer class.
6362         See test 190.cs.
6363
6364         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6365         nested child, but also deriving from the outer class.  See
6366         test-190.cs.
6367         (FilterWithClosure): We may access private members of the outer
6368         class if we're a nested child and deriving from the outer class.
6369         (RealMemberLookup): Only set `closure_private_ok' if the
6370         `original_bf' contained BindingFlags.NonPublic.
6371
6372 2003-04-05  Martin Baulig  <martin@ximian.com>
6373
6374         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
6375
6376 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6377
6378         * class.cs (Event.Define): Do not allow abstract events to have
6379         initializers. 
6380
6381 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6382
6383         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6384         block in event declarations.
6385
6386         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6387         value type, get its address.
6388
6389         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6390         leaving a class on the stack instead of a boolean value (int
6391         0/1).  Change the code so we compare against null, and then the
6392         result against zero.
6393
6394         * class.cs (TypeContainer.GetClassBases): We were checking for the
6395         parent class being sealed too late.
6396
6397         * expression.cs (Binary.Emit): For <= and >= when dealing with
6398         floating point values, use cgt.un and clt.un instead of cgt and
6399         clt alone.
6400
6401 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6402
6403         * statement.cs: Apply the same optimization as MS: skip the 
6404         GetEnumerator returning an IEnumerator, and use the one returning a 
6405         CharEnumerator instead. This allows us to avoid the try-finally block 
6406         and the boxing.
6407
6408 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6409
6410         * cs-parser.jay: Attributes cannot be applied to
6411                          namespaces. Fixes #40473
6412
6413 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6414
6415         * class.cs:
6416         (Add*): check if the name is valid using the full name for constants,
6417         fields, properties and events.
6418
6419 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6420
6421         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6422         char constants to be part of the enumeration.
6423
6424         * expression.cs (Conditional.DoResolve): Add support for operator
6425         true. Implements the missing functionality from 14.12
6426
6427         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6428         operator true/false as required by the spec.
6429
6430         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6431         implicit conversion to boolean.
6432
6433         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6434         also one where the type implements `operator true'. 
6435
6436         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6437         get an expression that will invoke operator true based on an
6438         expression.  
6439
6440         (GetConversionOperators): Removed the hack that called op_True
6441         here.  
6442
6443         (Expression.ResolveBoolean): Move this from Statement.
6444
6445 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6446
6447         * ecore.cs (FieldExpr): do not allow initialization of initonly
6448         fields on derived classes
6449
6450 2003-03-13  Martin Baulig  <martin@ximian.com>
6451
6452         * statement.cs (Block.Emit): Call ig.BeginScope() and
6453         ig.EndScope() when compiling with debugging info; call
6454         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6455
6456 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6457
6458         * expression.cs (Indexers): Do not construct immediately, allow
6459         for new members to be appended as we go.  Fixes 38143
6460
6461 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6462
6463         * expression.cs: save/restore context when resolving an unchecked
6464         expression.
6465
6466 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6467
6468         * cfold.cs: Catch division by zero in modulus operator during
6469         constant folding.
6470
6471 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
6472
6473         * interface.cs (Interface.DefineMembers): Avoid defining members
6474         twice. 
6475
6476 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
6477
6478         * driver.cs: handle the +/- options for -noconfig
6479
6480         * statement.cs (Unckeched.Resolve): Also track the state of
6481         unchecked in the Resolve phase.
6482
6483 2003-02-27  Martin Baulig  <martin@ximian.com>
6484
6485         * ecore.cs (Expression.MemberLookup): Don't create a
6486         MethodGroupExpr for something which is not a method.  Fixes #38291.
6487
6488 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6489
6490         * class.cs (MemberBase.CheckParameters): Also check that the type
6491         is unmanaged if it is a pointer.
6492
6493         * expression.cs (SizeOf.Resolve): Add location information.
6494
6495         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6496         a managed type is declared.
6497
6498         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6499         parameter modifiers as well.  Fixes bug 38606
6500
6501         * class.cs: Very sad.  Am backing out the speed up changes
6502         introduced by the ArrayList -> Array in the TypeContainer, as they
6503         were not actually that much faster, and introduced a bug (no error
6504         reports on duplicated methods).
6505
6506         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6507         source first, this will guarantee that we have a valid expression
6508         before calling in lower levels functions that will require a
6509         resolved object.  Then use this original_source in the
6510         target.ResolveLValue instead of the original source that was
6511         passed to us.
6512
6513         Another change.  Use target.Resolve instead of LValueResolve.
6514         Although we are resolving for LValues, we will let the Assign code
6515         take care of that (it will be called again from Resolve).  This
6516         basically allows code like this:
6517
6518         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6519         class Y { void A (X x) { x [0] += o; }
6520
6521         The problem was that the indexer was trying to resolve for
6522         set_Item (idx, object o) and never finding one.  The real set_Item
6523         was set_Item (idx, X).  By delaying the process we get the right
6524         semantics. 
6525
6526         Fixes bug 36505
6527
6528 2003-02-23  Martin Baulig  <martin@ximian.com>
6529
6530         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6531         while calling DoEmit ().
6532
6533         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6534         source files; if you use the #line directive inside a method, the
6535         compiler stops emitting line numbers for the debugger until it
6536         reaches the end of the method or another #line directive which
6537         restores the original file.
6538
6539 2003-02-23  Martin Baulig  <martin@ximian.com>
6540
6541         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6542
6543 2003-02-23  Martin Baulig  <martin@ximian.com>
6544
6545         * statement.cs (Block.AddChildVariableNames): We need to call this
6546         recursively, not just for our immediate children.
6547
6548 2003-02-23  Martin Baulig  <martin@ximian.com>
6549
6550         * class.cs (Event.Define): Always make the field private, like csc does.
6551
6552         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6553         actually work, fixes bug #37521.
6554
6555 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6556
6557         * delegate.cs: When creating the various temporary "Parameters"
6558         classes, make sure that we call the ComputeAndDefineParameterTypes
6559         on those new parameters (just like we do with the formal ones), to
6560         allow them to be resolved in the context of the DeclSpace.
6561
6562         This fixes the bug that Dick observed in Bugzilla #38530.
6563
6564 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6565
6566         * expression.cs (ResolveMemberAccess): When resolving a constant,
6567         do not attempt to pull a constant if the value was not able to
6568         generate a valid constant.
6569
6570         * const.cs (LookupConstantValue): Do not report more errors than required.
6571
6572 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6573
6574         * expression.cs: fixes bug #38328.
6575
6576 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6577
6578         * class.cs: Changed all the various members that can be part of a
6579         class from being an ArrayList to be an Array of the right type.
6580         During the DefineType type_list, interface_list, delegate_list and
6581         enum_list are turned into types, interfaces, delegates and enums
6582         arrays.  
6583
6584         And during the member population, indexer_list, event_list,
6585         constant_list, field_list, instance_constructor_list, method_list,
6586         operator_list and property_list are turned into their real arrays.
6587
6588         Although we could probably perform this operation earlier, for
6589         good error reporting we need to keep the lists and remove the
6590         lists for longer than required.
6591
6592         This optimization was triggered by Paolo profiling the compiler
6593         speed on the output of `gen-sample-program.pl' perl script. 
6594
6595         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6596         not crash in methods like MemberLookupFailed that use this field.  
6597
6598         This problem arises when the compiler fails to resolve a type
6599         during interface type definition for example.
6600
6601 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6602
6603         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
6604         inherit from System.Object, so we have to stop at null, not only
6605         when reaching System.Object.
6606
6607 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
6608
6609         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
6610         DeclaredOnly because the parent indexer might have had a different
6611         name, but did not loop until the top of the hierarchy was reached.
6612
6613         The problem this one fixes is 35492: when a class implemented an
6614         indexer from an interface, we were getting the interface method
6615         (which was abstract) and we were flagging an error (can not invoke
6616         abstract method).
6617
6618         This also keeps bug 33089 functioning, and test-148 functioning.
6619
6620         * typemanager.cs (IsSpecialMethod): The correct way of figuring
6621         out if a method is special is to see if it is declared in a
6622         property or event, or whether it is one of the predefined operator
6623         names.   This should fix correctly #36804.
6624
6625 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
6626
6627         The goal here is to remove the dependency on EmptyCast.Peel ().
6628         Killing it completely.
6629
6630         The problem is that currently in a number of places where
6631         constants are expected, we have to "probe" for an EmptyCast, and
6632         Peel, which is not the correct thing to do, as this will be
6633         repetitive and will likely lead to errors. 
6634
6635         The idea is to remove any EmptyCasts that are used in casts that
6636         can be reduced to constants, so we only have to cope with
6637         constants. 
6638
6639         This bug hunt was triggered by Bug 37363 and the desire to remove
6640         the duplicate pattern where we were "peeling" emptycasts to check
6641         whether they were constants.  Now constants will always be
6642         constants.
6643
6644         * ecore.cs: Use an enumconstant here instead of wrapping with
6645         EmptyCast.  
6646
6647         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
6648         throwing me off.  By handling this we can get rid of a few hacks.
6649
6650         * statement.cs (Switch): Removed Peel() code.
6651
6652 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
6653
6654         * class.cs: Location information for error 508
6655
6656         * expression.cs (New.DoResolve): Add a guard against double
6657         resolution of an expression.  
6658
6659         The New DoResolve might be called twice when initializing field
6660         expressions (see EmitFieldInitializers, the call to
6661         GetInitializerExpression will perform a resolve on the expression,
6662         and later the assign will trigger another resolution
6663
6664         This leads to bugs (#37014)
6665
6666         * delegate.cs: The signature for EndInvoke should contain any ref
6667         or out parameters as well.  We were not doing this in the past. 
6668
6669         * class.cs (Field.Define): Do not overwrite the type definition
6670         inside the `volatile' group.  Turns out that volatile enumerations
6671         were changing the type here to perform a validity test, which
6672         broke conversions. 
6673
6674 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
6675
6676         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
6677         and structs, we do not want to load the instance variable
6678
6679         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
6680         enum_type has to be handled like an object reference (implicit
6681         conversions exists from this to object), but the regular IsClass
6682         and IsValueType tests will never return true for this one.
6683
6684         Also we use TypeManager.IsValueType instead of type.IsValueType,
6685         just for consistency with the rest of the code (this is only
6686         needed if we ever use the construct exposed by test-180.cs inside
6687         corlib, which we dont today).
6688
6689 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
6690
6691         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
6692         just InternalCall.
6693
6694 2003-02-09  Martin Baulig  <martin@ximian.com>
6695
6696         * namespace.cs (Namespace..ctor): Added SourceFile argument.
6697         (Namespace.DefineNamespaces): New static public method; this is
6698         called when we're compiling with debugging to add all namespaces
6699         to the symbol file.
6700
6701         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
6702         pass it to the Namespace's .ctor.
6703
6704         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
6705         and MethodBase arguments; pass the namespace ID to the symwriter;
6706         pass the MethodBase instead of the token to the symwriter.
6707         (SymbolWriter.DefineNamespace): New method to add a namespace to
6708         the symbol file.
6709
6710 2003-02-09  Martin Baulig  <martin@ximian.com>
6711
6712         * symbolwriter.cs: New file.  This is a wrapper around
6713         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
6714         methods here in near future.
6715
6716 2003-02-09  Martin Baulig  <martin@ximian.com>
6717
6718         * codegen.cs (EmitContext.Mark): Just pass the arguments to
6719         ILGenerator.MarkSequencePoint() which are actually used by the
6720         symbol writer.
6721
6722 2003-02-09  Martin Baulig  <martin@ximian.com>
6723
6724         * location.cs (SourceFile): New public sealed class.  This
6725         contains the name and an index which is used in the location's token.
6726         (Location): Reserve an appropriate number of bits in the token for
6727         the source file instead of walking over that list, this gives us a
6728         really huge performance improvement when compiling with debugging.
6729
6730         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
6731         `SourceFile' argument instead of a string.
6732         (Driver.ProcessFile): Add all the files via Location.AddFile(),
6733         but don't parse/tokenize here, we need to generate the list of all
6734         source files before we do that.
6735         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
6736         the files.
6737
6738         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
6739         instead of a string.
6740
6741         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
6742         of a string.
6743
6744 2003-02-09  Martin Baulig  <martin@ximian.com>
6745
6746         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
6747         filename on `#line default'.
6748
6749 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
6750
6751         * statement.cs: don't clear the pinned var when the fixed statement
6752         returns from the method (fixes bug#37752).
6753
6754 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
6755
6756         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
6757         to IsValueType.
6758
6759 2003-02-07  Martin Baulig  <martin@ximian.com>
6760
6761         * driver.cs: Removed the `--debug-args' command line argument.
6762
6763         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
6764         automatically by the AsssemblyBuilder.
6765         (CodeGen.InitializeSymbolWriter): We don't need to call any
6766         initialization function on the symbol writer anymore.  This method
6767         doesn't take any arguments.
6768
6769 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
6770
6771         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
6772         from referenced assemblies as well.
6773
6774 2003-02-02  Martin Baulig  <martin@ximian.com>
6775
6776         * class.cs (MethodData.Emit): Generate debugging info for external methods.
6777
6778 2003-02-02  Martin Baulig  <martin@ximian.com>
6779
6780         * class.cs (Constructor.Emit): Open the symbol writer before
6781         emitting the constructor initializer.
6782         (ConstructorInitializer.Emit): Call ec.Mark() to allow
6783         single-stepping through constructor initializers.
6784
6785 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
6786
6787         * class.cs: Handle error 549: do not allow virtual methods in
6788         sealed classes. 
6789
6790 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
6791
6792         * decl.cs: Check access levels when resolving types
6793
6794 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
6795
6796         * statement.cs: Add parameters and locals set in catch blocks that might 
6797         return to set vector
6798
6799 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
6800
6801         * class.cs (Operator): Set the SpecialName flags for operators.
6802
6803         * expression.cs (Invocation.DoResolve): Only block calls to
6804         accessors and operators on SpecialName methods.
6805
6806         (Cast.TryReduce): Handle conversions from char constants.
6807
6808
6809 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
6810
6811         * statement.cs: small memory and time optimization in FlowBranching.
6812
6813 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
6814
6815         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
6816         problem that the last fix but in the other sid (Set).
6817
6818         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
6819         access when there is no indexer in the hierarchy.
6820
6821 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
6822
6823         * class.cs: Combine some if statements.
6824
6825 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6826
6827         * driver.cs: fixed bug #37187.
6828
6829 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
6830
6831         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
6832         any indexer, it's needed to build a list with all the indexers in the
6833         hierarchy (AllGetters), else we have problems. Fixes #35653.
6834
6835 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
6836
6837         * class.cs (MethodData.Define): It is wrong for an interface
6838         implementation to be static in both cases: explicit and implicit.
6839         We were only handling this in one case.
6840
6841         Improve the if situation there to not have negations.
6842
6843         * class.cs (Field.Define): Turns out that we do not need to check
6844         the unsafe bit on field definition, only on usage.  Remove the test.
6845
6846 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6847
6848         * driver.cs: use assembly.Location instead of Codebase (the latest
6849         patch made mcs fail when using MS assemblies).
6850
6851 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
6852
6853         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
6854         get the path to *corlib.dll.
6855
6856 2003-01-21  Nick Drochak <ndrochak@gol.com>
6857
6858         * cs-tokenizer.cs:
6859         * pending.cs:
6860         * typemanager.cs: Remove compiler warnings
6861
6862 2003-01-20  Duncan Mak  <duncan@ximian.com>
6863
6864         * AssemblyInfo.cs: Bump the version number to 0.19.
6865
6866 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6867
6868         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
6869
6870 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
6871
6872         * class.cs (Constructor::Emit): Emit debugging info for constructors.
6873
6874 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
6875
6876         * cs-parser.jay: Small fix: we were not comparing the constructor
6877         name correctly.   Thanks to Zoltan for the initial pointer.
6878
6879 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
6880
6881         * cs-tokenizer.cs: Set file name when specified with #line
6882
6883 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
6884
6885         * cs-parser.jay: Only perform the constructor checks here if we
6886         are named like the class;  This will help provider a better
6887         error.  The constructor path is taken when a type definition is
6888         not found, but most likely the user forgot to add the type, so
6889         report that rather than the constructor error.
6890
6891 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
6892
6893         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
6894         allocations.
6895
6896 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6897
6898         * cs-parser.jay: Add cleanup call.
6899
6900 2003-01-13  Duncan Mak  <duncan@ximian.com>
6901
6902         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
6903         consistent with other methods.
6904
6905 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6906
6907         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
6908
6909 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
6910
6911         * attribute.cs: only set GuidAttr to true when we have a
6912         GuidAttribute.
6913
6914 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6915
6916         * ecore.cs:
6917         * expression.cs:
6918         * typemanager.cs: fixes to allow mcs compile corlib with the new
6919         Type.IsSubclassOf fix.
6920
6921 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
6922
6923         * expression.cs (LocalVariableReference.DoResolve): Classify a
6924         constant as a value, not as a variable.   Also, set the type for
6925         the variable.
6926
6927         * cs-parser.jay (fixed_statement): take a type instead of a
6928         pointer_type, so we can produce a better error message later.
6929
6930         * statement.cs (Fixed.Resolve): Flag types that are not pointers
6931         as an error.  
6932
6933         (For.DoEmit): Make inifinite loops have a
6934         non-conditional branch back.
6935
6936         (Fixed.DoEmit): First populate the pinned variables, then emit the
6937         statement, then clear the variables.  Before I was emitting the
6938         code once for each fixed piece.
6939
6940
6941 2003-01-08  Martin Baulig  <martin@ximian.com>
6942
6943         * statement.cs (FlowBranching.MergeChild): A break in a
6944         SWITCH_SECTION does not leave a loop.  Fixes #36155.
6945
6946 2003-01-08  Martin Baulig  <martin@ximian.com>
6947
6948         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
6949         lives in the same number space than `param_map'.  Fixes #36154.
6950
6951 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
6952
6953         * cs-parser.jay (constructor_declaration): Set the
6954         Constructor.ModFlags before probing for it.  This makes the
6955         compiler report 514, 515 and 132 (the code was there, but got
6956         broken). 
6957
6958         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
6959         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
6960         (GotoCase.Resolve): Set `Returns' to ALWAYS.
6961
6962 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
6963
6964         * enum.cs: create the enum static fields using the enum type.
6965
6966 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
6967
6968         * class.cs: don't try to create the ParamBuilder for the return
6969         type if it's not needed (and handle it breaking for the ms runtime
6970         anyway).
6971
6972 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
6973
6974         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
6975
6976 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
6977
6978         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
6979         the command.   This showed up while compiling the JANET source
6980         code, which used \r as its only newline separator.
6981
6982 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
6983
6984         * class.cs (Method.Define): If we are an operator (because it
6985         reuses our code), then set the SpecialName and HideBySig.  #36128
6986
6987 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
6988
6989         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
6990         exception, report error 120 `object reference required'.
6991
6992         * driver.cs: Add --pause option, used during to measure the size
6993         of the process as it goes with --timestamp.
6994
6995         * expression.cs (Invocation.DoResolve): Do not allow methods with
6996         SpecialName to be invoked.
6997
6998 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
6999
7000         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7001         number before adding it.
7002
7003 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7004
7005         * ecore.cs (StandardImplicitConversion): When in an unsafe
7006         context, we allow conversion between void * to any other pointer
7007         type. This fixes bug #35973.
7008
7009 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7010
7011         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7012         is not thrown when extensionless outputs are used 
7013
7014 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7015
7016         * rootcontext.cs: fixed compilation of corlib.
7017
7018 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7019
7020         * attribute.cs (Attributes.Contains): Add new method.
7021
7022         * class.cs (MethodCore.LabelParameters): if the parameter is an
7023         `out' parameter, check that no attribute `[In]' has been passed.
7024
7025         * enum.cs: Handle the `value__' name in an enumeration.
7026
7027 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7028
7029         * decl.cs: Added special case to allow overrides on "protected
7030         internal" methods
7031
7032 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7033
7034         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7035         since it makes much more sense.
7036
7037         (Attributes.ctor): Don't require a Location parameter.
7038
7039         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7040
7041         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7042         since we already have that information per attribute.
7043
7044         * everywhere : make appropriate changes.
7045
7046         * class.cs (LabelParameters): Write the code which actually
7047         applies attributes to the return type. We can't do this on the MS
7048         .NET runtime so we flag a warning in the case an exception is
7049         thrown.
7050
7051 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7052
7053         * const.cs: Handle implicit null conversions here too.
7054
7055 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7056
7057         * class.cs (MethodCore.LabelParameters): Remove the extra
7058         Type [] parameter since it is completely unnecessary. Instead
7059         pass in the method's attributes so that we can extract
7060         the "return" attribute.
7061
7062 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7063
7064         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7065         of ignoring it and letting the compile continue.
7066
7067         * typemanager.cs (ChangeType): use an extra argument to return an
7068         error condition instead of throwing an exception.
7069
7070 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7071
7072         * expression.cs (Unary.TryReduce): mimic the code for the regular
7073         code path.  Perform an implicit cast in the cases where we can
7074         implicitly convert to one of the integral types, and then reduce
7075         based on that constant.   This fixes bug #35483.
7076
7077 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7078
7079         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7080
7081 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7082
7083         * namespace.cs: fixed bug #35489.
7084
7085 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7086
7087         * class.cs: Remove some dead code.
7088
7089         * cs-parser.jay: Estimate the number of methods needed
7090         (RootContext.MethodCount);
7091
7092         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7093         numbers instead of StringBuilders.
7094
7095         * support.cs (PtrHashtable): Add constructor with initial size;
7096         We can now reduce reallocations of the method table.
7097
7098 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7099
7100         * attribute.cs (ApplyAttributes): Keep track of the emitted
7101         attributes on a per-target basis. This fixes bug #35413.
7102
7103 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7104
7105         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7106         default to the Windows 1252 encoding.
7107
7108         (UnixParseOption): Support version, thanks to Alp for the missing
7109         pointer. 
7110
7111         * AssemblyInfo.cs: Add nice assembly information.
7112
7113         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7114         (bug 35169).
7115
7116         * cs-parser.jay: Allow a trailing comma before the close bracked
7117         in the attribute_section production.
7118
7119         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7120         address of the instance was being taken, I will take this out,
7121         because we take the address of the object immediately here.
7122
7123 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7124
7125         * typemanager.cs (AreMultipleAllowed): Take care of the most
7126         obvious case where attribute type is not in the current assembly -
7127         stupid me ;-)
7128
7129 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7130
7131         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7132         definitions, instead of doing that afterwards.  
7133
7134         Also we use a nice little hack, depending on the constructor, we
7135         know if we are a "composed" name or a simple name.  Hence, we
7136         avoid the IndexOf test, and we avoid 
7137
7138         * codegen.cs: Add code to assist in a bug reporter to track down
7139         the source of a compiler crash. 
7140
7141 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7142
7143         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7144         types have been emitted for a given element and flag an error
7145         if something which does not have AllowMultiple set is used more
7146         than once.
7147
7148         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7149         attribute types and their corresponding AllowMultiple properties
7150
7151         (AreMultipleAllowed): Check the property for a given type.
7152
7153         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7154         property in the case we have a TypeContainer.
7155
7156         (Attributes.AddAttribute): Detect duplicates and just skip on
7157         adding them. This trivial fix catches a pretty gross error in our
7158         attribute emission - global attributes were being emitted twice!
7159
7160         Bugzilla bug #33187 is now fixed.
7161
7162 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7163
7164         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7165         instead of pp_and).
7166
7167         * expression.cs (Binary.ResolveOperator): I can only use the
7168         Concat (string, string, string) and Concat (string, string,
7169         string, string) if the child is actually a concatenation of
7170         strings. 
7171
7172 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7173
7174         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7175         context where we need a 2-character lookahead.
7176
7177         * pending.cs (PendingImplementation): Rework so we can keep track
7178         of interface types all the time, and flag those which were
7179         implemented by parents as optional.
7180
7181 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7182
7183         * expression.cs (Binary.ResolveOperator): Use
7184         String.Concat(string,string,string) or
7185         String.Concat(string,string,string,string) when possible. 
7186
7187         * typemanager: More helper methods.
7188
7189
7190 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7191
7192         * pending.cs: remove the bogus return from GetMissingInterfaces()
7193         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7194
7195 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7196
7197         * namespace.cs: avoid duplicated 'using xxx' being added to
7198         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7199         when we get more than one 'using' statement for the same namespace.
7200         Report a CS0105 warning for it.
7201
7202 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7203
7204         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7205         of calling getChar/putback, uses internal knowledge of it.    
7206
7207         (xtoken): Reorder tokenizer so most common patterns are checked
7208         first.  This reduces the compilation time in another 5% (from 8.11s
7209         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7210
7211         The parsing time is 22% of the compilation in mcs, and from that
7212         64% is spent on the tokenization process.  
7213
7214         I tried using a binary search for keywords, but this is slower
7215         than the hashtable.  Another option would be to do a couple of
7216         things:
7217
7218                 * Not use a StringBuilder, instead use an array of chars,
7219                   with a set value.  Notice that this way we could catch
7220                   the 645 error without having to do it *afterwards*.
7221
7222                 * We could write a hand-parser to avoid the hashtable
7223                   compares altogether.
7224
7225         The identifier consumption process takes 37% of the tokenization
7226         time.  Another 15% is spent on is_number.  56% of the time spent
7227         on is_number is spent on Int64.Parse:
7228
7229                 * We could probably choose based on the string length to
7230                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7231                   computations. 
7232
7233         Another 3% is spend on wrapping `xtoken' in the `token' function.
7234
7235         Handle 0xa0 as whitespace (#34752)
7236
7237 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7238
7239         * typemanager.cs (IsCLRType): New routine to tell whether a type
7240         is one of the builtin types.  
7241
7242         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7243         typecode in more places instead of doing pointer comparissions.
7244         We could leverage some knowledge about the way the typecodes are
7245         laid out.
7246
7247         New code to cache namespaces in assemblies, it is currently not
7248         invoked, to be used soon.
7249
7250         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7251
7252         * expression.cs (Binary.ResolveOperator): specially handle
7253         strings, and do not perform user-defined operator overloading for
7254         built-in types.
7255
7256 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7257
7258         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7259         internalcall as it is a pretty simple operation;  Avoid whenever
7260         possible to call Char.IsLetter.
7261
7262         (consume_identifier): Cut by half the number of
7263         hashtable calls by merging the is_keyword and GetKeyword behavior.
7264
7265         Do not short-circuit, because if we do, we
7266         report errors (ie, #if false && true would produce an invalid
7267         directive error);
7268
7269
7270 2002-11-24  Martin Baulig  <martin@ximian.com>
7271
7272         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7273         check constant ranges and report a CS0221.  Fixes #33186.
7274
7275 2002-11-24  Martin Baulig  <martin@ximian.com>
7276
7277         * cs-parser.jay: Make this work for uninitialized variable
7278         declarations in the `for' initializer.  Fixes #32416.
7279
7280 2002-11-24  Martin Baulig  <martin@ximian.com>
7281
7282         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7283         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7284
7285 2002-11-24  Martin Baulig  <martin@ximian.com>
7286
7287         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7288         argument; if true, we also check for user-defined conversions.
7289         This is only needed if both arguments are of a user-defined type.
7290         Fixes #30443, added test-175.cs.
7291         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7292
7293         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7294
7295 2002-11-24  Martin Baulig  <martin@ximian.com>
7296
7297         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7298         function to get the store opcode.
7299         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7300         only emit the Ldelema if the store opcode is Stobj.  You must run
7301         both test-34 and test-167 to test this.  Fixes #34529.
7302
7303 2002-11-23  Martin Baulig  <martin@ximian.com>
7304
7305         * ecore.cs (Expression.MemberLookup): Added additional
7306         `qualifier_type' argument which is used when we're being called
7307         from MemberAccess.DoResolve() and null if we're called from a
7308         SimpleName lookup.
7309         (Expression.MemberLookupFailed): New method to report errors; this
7310         does the CS1540 check and reports the correct error message.
7311
7312         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7313         argument for the CS1540 check and redone the way how we're dealing
7314         with private members.  See the comment in the source code for details.
7315         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7316         `closure_start_type' to `closure_qualifier_type' and check whether
7317         it's not null.  It was not this filter being broken, it was just
7318         being called with the wrong arguments.
7319
7320         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7321         and pass it the correct `qualifier_type'; this also does the error
7322         handling for us.
7323
7324 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7325
7326         * expression.cs (Invocation.EmitParams): If the we are dealing
7327         with a non-built-in value type, load its address as well.
7328
7329         (ArrayCreation): Use a a pretty constant instead
7330         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7331         static initializers.  
7332
7333         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7334         because they are not really value types, just glorified integers. 
7335
7336         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7337
7338         * ecore.cs: Remove redundant code for enumerations, make them use
7339         the same code path as everything else, fixes the casting issue
7340         with enumerations in Windows.Forms.
7341
7342         * attribute.cs: Do only cast to string if it is a string, the
7343         validation happens later.
7344
7345         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7346         people upgrade their corlibs.
7347
7348         * ecore.cs: Oops, enumerations were not following the entire code path
7349
7350 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7351
7352         * typemanager.cs (FilterWithClosure): Commented out the test for
7353         1540 in typemanager.cs, as it has problems when accessing
7354         protected methods from a parent class (see test-174.cs). 
7355
7356         * attribute.cs (Attribute.ValidateGuid): new method.
7357         (Attribute.Resolve): Use above.
7358
7359 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7360
7361         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7362
7363         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7364         handling for enumerations, as we only needed the TypeContainer
7365         functionality to begin with (this is required for the fix below to
7366         work for enums that reference constants in a container class for
7367         example). 
7368
7369         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7370
7371         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7372         a valid TypeBuilder to perform lookups on.o
7373
7374         * class.cs (InheritableMemberSignatureCompare): Use true in the
7375         call to GetGetMethod and GetSetMethod, because we are comparing
7376         the signature, and we need to get the methods *even* if they are
7377         private. 
7378
7379         (PropertyBase.CheckBase): ditto.
7380
7381         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7382         GotoCase.Resolve): Use Peel on EmpytCasts.
7383
7384         * ecore.cs (EmptyCast): drop child, add Peel method.
7385
7386 2002-11-17  Martin Baulig  <martin@ximian.com>
7387
7388         * ecore.cs (EmptyCast.Child): New public property.
7389
7390         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7391         label resolved to an EmptyCast.  Fixes #34162.
7392         (GotoCase.Resolve): Likewise.
7393         (Block.EmitMeta): Likewise.
7394
7395 2002-11-17  Martin Baulig  <martin@ximian.com>
7396
7397         * expression.cs (Invocation.BetterConversion): Prefer int over
7398         uint; short over ushort; long over ulong for integer literals.
7399         Use ImplicitConversionExists instead of StandardConversionExists
7400         since we also need to check for user-defined implicit conversions.
7401         Fixes #34165.  Added test-173.cs.
7402
7403 2002-11-16  Martin Baulig  <martin@ximian.com>
7404
7405         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7406         with the `true' and `false' literals.  Fixes #33151.
7407
7408 2002-11-16  Martin Baulig  <martin@ximian.com>
7409
7410         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7411         October 22nd; don't do the cs1540 check for static members.
7412
7413         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7414         now using our own filter here and doing the cs1540 check again.
7415
7416 2002-11-16  Martin Baulig  <martin@ximian.com>
7417
7418         * support.cs (InternalParameters): Don't crash if we don't have
7419         any fixed parameters.  Fixes #33532.
7420
7421 2002-11-16  Martin Baulig  <martin@ximian.com>
7422
7423         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7424         when looking up static methods to make this work on Windows.
7425         Fixes #33773.
7426
7427 2002-11-16  Martin Baulig  <martin@ximian.com>
7428
7429         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7430         a setter rather than using PropertyInfo.CanWrite.
7431
7432 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7433
7434         * class.cs: Allow acces to block member by subclasses. Fixes build
7435         breaker.
7436
7437 2002-11-14  Martin Baulig  <martin@ximian.com>
7438
7439         * class.cs (Constructor.Emit): Added the extern/block check.
7440         Fixes bug #33678.
7441
7442 2002-11-14  Martin Baulig  <martin@ximian.com>
7443
7444         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7445         iteration while looking for indexers, this is needed because the
7446         indexer may have a different name in our base classes.  Fixed the
7447         error reporting (no indexers at all, not get accessor, no
7448         overloaded match).  Fixes bug #33089.
7449         (IndexerAccess.DoResolveLValue): Likewise.
7450
7451 2002-11-14  Martin Baulig  <martin@ximian.com>
7452
7453         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7454         indexers.  Fixes the first part of bug #33089.
7455         (MethodSignature.InheritableMemberSignatureCompare): Added support
7456         for properties.
7457
7458 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7459
7460         * attribute.cs (Attribute.Resolve): Catch the
7461         NullReferenceException and report it since it isn't supposed to
7462         happen. 
7463
7464 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7465
7466         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7467         LogicalOr and LogicalAnd that can benefit from recursively
7468         handling EmitBranchable.  The code now should be nice for Paolo.
7469
7470 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
7471
7472         * typemanager.cs (LookupType): Added a negative-hit hashtable for
7473         the Type lookups, as we perform quite a number of lookups on
7474         non-Types.  This can be removed once we can deterministically tell
7475         whether we have a type or a namespace in advance.
7476
7477         But this might require special hacks from our corlib.
7478
7479         * TODO: updated.
7480
7481         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
7482         and double which avoids a conversion from an integer to a double.
7483
7484         * expression.cs: tiny optimization, avoid calling IsConstant,
7485         because it effectively performs the lookup twice.
7486
7487 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
7488
7489         But a bogus return here to keep the semantics of the old code
7490         until the Mono runtime is fixed.
7491
7492         * pending.cs (GetMissingInterfaces): New method used to remove all
7493         the interfaces that are already implemented by our parent
7494         classes from the list of pending methods. 
7495
7496         * interface.cs: Add checks for calls after ResolveTypeExpr.
7497
7498 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7499
7500         * class.cs (Class.Emit): Report warning 67: event not used if the
7501         warning level is beyond 3.
7502
7503         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7504         being a NullLiteral.
7505
7506         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7507         specifiers. 
7508
7509         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7510         path that might fail if a type can not be resolved.
7511
7512         * expression.cs (Binary.Emit): Emit unsigned versions of the
7513         operators. 
7514
7515         * driver.cs: use error 5.
7516
7517 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7518
7519         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7520
7521 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7522
7523         * cs-parser.jay (switch_section): A beautiful patch from Martin
7524         Baulig that fixed 33094.
7525
7526 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7527
7528         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7529         Check whether the base is abstract and report an error if so.
7530
7531         * expression.cs (IndexerAccess.DoResolveLValue,
7532         IndexerAccess.DoResolve): ditto. 
7533
7534         (Invocation.DoResolve): ditto.
7535
7536         (Invocation.FullMethodDesc): Improve the report string.
7537
7538         * statement.cs (Block): Eliminate IsVariableDefined as it is
7539         basically just a wrapper for GetVariableInfo.
7540
7541         * ecore.cs (SimpleName): Use new 
7542
7543         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7544         type, as we return the actual parameter ref/unref state on a
7545         different call.
7546
7547 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7548
7549         * support.cs: Return proper flags REF/OUT fixing the previous
7550         commit.  
7551
7552         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7553         not used to mean `ref' but `ref or out' in ParameterReference
7554
7555         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7556         full type signature instead of calling TypeManger.CSharpName
7557         ourselves. 
7558
7559         * support.cs (InternalParameters.ParameterDesc): Do not compare
7560         directly to the modflags, because REF/OUT will actually be bitsets
7561         if set. 
7562
7563         * delegate.cs (VerifyMethod): Check also the modifiers.
7564
7565         * cs-tokenizer.cs: Fix bug where floating point values with an
7566         exponent where a sign was missing was ignored.
7567
7568         * driver.cs: Allow multiple assemblies to be specified in a single
7569         /r: argument
7570
7571 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7572
7573         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7574         because identifiers after a parenthesis would end up in this kind
7575         of production, and we needed to desamiguate it for having casts
7576         like:
7577
7578                 (UserDefinedType *) xxx
7579
7580 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7581
7582         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7583         we should set on the Bindingflags.NonPublic, but not turn on
7584         private_ok.  private_ok controls whether a Private member is
7585         returned (this is chekced on the filter routine), while the
7586         BindingFlags.NonPublic just controls whether private/protected
7587         will be allowed.   This fixes the problem part of the problem of
7588         private properties being allowed to be used in derived classes.
7589
7590         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7591         so we can call the children DoResolveLValue method (this will
7592         properly signal errors on lvalue assignments to base properties)
7593
7594         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7595         getter are null, and we have a property info, we know that this
7596         happened because the lookup failed, so we report an error 122 for
7597         protection level violation.
7598
7599         We also silently return if setter and getter are null in the
7600         resolve functions, this condition only happens if we have flagged
7601         the error before.  This is the other half of the problem. 
7602
7603         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
7604         not have accessibility information, that is why we were returning
7605         true in the filter function in typemanager.cs.
7606
7607         To properly report 122 (property is inaccessible because of its
7608         protection level) correctly, we report this error in ResolveAccess
7609         by failing if both the setter and the getter are lacking (ie, the
7610         lookup failed). 
7611
7612         DoResolve and DoLResolve have been modified to check for both
7613         setter/getter being null and returning silently, the reason being
7614         that I did not want to put the knowledge about this error in upper
7615         layers, like:
7616
7617         int old = Report.Errors;
7618         x = new PropertyExpr (...);
7619         if (old != Report.Errors)
7620                 return null;
7621         else
7622                 return x;
7623
7624         So the property expr is returned, but it is invalid, so the error
7625         will be flagged during the resolve process. 
7626
7627         * class.cs: Remove InheritablePropertySignatureCompare from the
7628         class, as we no longer depend on the property signature to compute
7629         whether it is possible to implement a method or not.
7630
7631         The reason is that calling PropertyInfo.GetGetMethod will return
7632         null (in .NET, in Mono it works, and we should change this), in
7633         cases where the Get Method does not exist in that particular
7634         class.
7635
7636         So this code:
7637
7638         class X { public virtual int A { get { return 1; } } }
7639         class Y : X { }
7640         class Z : Y { public override int A { get { return 2; } } }
7641
7642         Would fail in Z because the parent (Y) would not have the property
7643         defined.  So we avoid this completely now (because the alternative
7644         fix was ugly and slow), and we now depend exclusively on the
7645         method names.
7646
7647         (PropertyBase.CheckBase): Use a method-base mechanism to find our
7648         reference method, instead of using the property.
7649
7650         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
7651         routines are gone now.
7652
7653         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
7654         names, they were incorrectly named.
7655
7656         * cs-tokenizer.cs: Return are more gentle token on failure. 
7657
7658         * pending.cs (PendingImplementation.InterfaceMethod): This routine
7659         had an out-of-sync index variable, which caused it to remove from
7660         the list of pending methods the wrong method sometimes.
7661
7662 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
7663
7664         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
7665         CanWrite, because those refer to this particular instance of the
7666         property, and do not take into account the fact that we can
7667         override single members of a property.
7668
7669         Constructor requires an EmitContext.  The resolution process does
7670         not happen here, but we need to compute the accessors before,
7671         because the resolution does not always happen for properties.
7672
7673         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
7674         subclass, before we did not update this flag, but we did update
7675         bindingflags. 
7676
7677         (GetAccessors): Drop this routine, as it did not work in the
7678         presence of partially overwritten set/get methods. 
7679
7680         Notice that this broke the cs1540 detection, but that will require
7681         more thinking. 
7682
7683 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7684
7685         * class.cs:
7686         * codegen.cs:
7687         * driver.cs: issue a warning instead of an error if we don't support
7688         debugging for the platform. Also ignore a couple of errors that may
7689         arise when trying to write the symbols. Undo my previous patch.
7690
7691 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7692
7693         * driver.cs: ignore /debug switch except for Unix platforms.
7694
7695 2002-10-23  Nick Drochak  <ndrochak@gol.com>
7696
7697         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
7698
7699 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
7700
7701         * driver.cs: Do not make mcs-debug conditional, so we do not break
7702         builds that use it.
7703
7704         * statement.cs (UsageVector.MergeChildren): I would like Martin to
7705         review this patch.  But basically after all the children variables
7706         have been merged, the value of "Breaks" was not being set to
7707         new_breaks for Switch blocks.  I think that it should be set after
7708         it has executed.  Currently I set this to the value of new_breaks,
7709         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
7710         conservative, but I do not understand this code very well.
7711
7712         I did not break anything in the build, so that is good ;-)
7713
7714         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
7715
7716 2002-10-20  Mark Crichton  <crichton@gimp.org>
7717
7718         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
7719
7720 2002-10-20  Nick Drochak  <ndrochak@gol.com>
7721
7722         * cfold.cs: Fixed compile blocker.
7723
7724 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
7725
7726         * driver.cs: I was chekcing the key, not the file.
7727
7728 2002-10-19  Ravi Pratap  <ravi@ximian.com>
7729
7730         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
7731         message that we were generating - we just need to silently return
7732         a null.
7733
7734 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
7735
7736         * class.cs (Event.Define): Change my previous commit, as this
7737         breaks the debugger.  This is a temporary hack, as it seems like
7738         the compiler is generating events incorrectly to begin with.
7739
7740         * expression.cs (Binary.ResolveOperator): Added support for 
7741         "U operator - (E x, E y)"
7742
7743         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
7744         y)".
7745
7746         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
7747         init-only variables, but this path did not take into account that
7748         there might be also instance readonly variables.  Correct this
7749         problem. 
7750
7751         This fixes bug 32253
7752
7753         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
7754         delegates as well.
7755
7756         * driver.cs: Change the extension for modules to `netmodule'
7757
7758         * cs-parser.jay: Improved slightly the location tracking for
7759         the debugger symbols.
7760
7761         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
7762         modifiers that were specified instead of the hardcoded value
7763         (FamAndAssem).  This was basically ignoring the static modifier,
7764         and others.  Fixes 32429.
7765
7766         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
7767         fixed a bug in the process (32476)
7768
7769         * expression.cs (ArrayAccess.EmitAssign): Patch from
7770         hwang_rob@yahoo.ca that fixes bug 31834.3
7771
7772 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
7773
7774         * driver.cs: Make the module extension .netmodule.
7775
7776 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
7777
7778         * driver.cs: Report an error if the resource file is not found
7779         instead of crashing.
7780
7781         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
7782         false, like Emit does.
7783
7784 2002-10-16  Nick Drochak  <ndrochak@gol.com>
7785
7786         * typemanager.cs: Remove unused private member.  Also reported mcs
7787         bug to report this as a warning like csc.
7788
7789 2002-10-15  Martin Baulig  <martin@gnome.org>
7790
7791         * statement.cs (Statement.Emit): Made this a virtual method; emits
7792         the line number info and calls DoEmit().
7793         (Statement.DoEmit): New protected abstract method, formerly knows
7794         as Statement.Emit().
7795
7796         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
7797
7798 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
7799
7800         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
7801         have fixed a remaining problem: not every AddXXXX was adding a
7802         fully qualified name.  
7803
7804         Now everyone registers a fully qualified name in the DeclSpace as
7805         being defined instead of the partial name.  
7806
7807         Downsides: we are slower than we need to be due to the excess
7808         copies and the names being registered this way.  
7809
7810         The reason for this is that we currently depend (on the corlib
7811         bootstrap for instance) that types are fully qualified, because
7812         we dump all the types in the namespace, and we should really have
7813         types inserted into the proper namespace, so we can only store the
7814         basenames in the defined_names array.
7815
7816 2002-10-10  Martin Baulig  <martin@gnome.org>
7817
7818         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
7819         from bug #31834, see the bug report for a testcase which is
7820         miscompiled.
7821
7822 2002-10-10  Martin Baulig  <martin@gnome.org>
7823
7824         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
7825         flow analysis code for this.
7826
7827         * statement.cs (Do, While, For): Tell the flow analysis code about
7828         infinite loops.
7829         (FlowBranching.UsageVector): Added support for infinite loops.
7830         (Block.Resolve): Moved the dead code elimination here and use flow
7831         analysis to do it.
7832
7833 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
7834
7835         * class.cs (Field.Define): Catch cycles on struct type
7836         definitions. 
7837
7838         * typemanager.cs (IsUnmanagedtype): Do not recursively check
7839         fields if the fields are static.  We only need to check instance
7840         fields. 
7841
7842         * expression.cs (As.DoResolve): Test for reference type.
7843
7844         * statement.cs (Using.ResolveExpression): Use
7845         ConvertImplicitRequired, not ConvertImplicit which reports an
7846         error on failture
7847         (Using.ResolveLocalVariableDecls): ditto.
7848
7849         * expression.cs (Binary.ResolveOperator): Report errors in a few
7850         places where we had to.
7851
7852         * typemanager.cs (IsUnmanagedtype): Finish implementation.
7853
7854 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
7855
7856         * expression.cs: Use StoreFromPtr instead of extracting the type
7857         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
7858
7859         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
7860         an enumeration value to a System.Enum, but System.Enum is not a
7861         value type, but an class type, so we need to box.
7862
7863         (Expression.ConvertExplicit): One codepath could return
7864         errors but not flag them.  Fix this.  Fixes #31853
7865
7866         * parameter.cs (Resolve): Do not allow void as a parameter type.
7867
7868 2002-10-06  Martin Baulig  <martin@gnome.org>
7869
7870         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
7871         if it's a class type and not a struct.  Fixes #31815.
7872
7873 2002-10-06  Martin Baulig  <martin@gnome.org>
7874
7875         * statement.cs: Reworked the flow analysis code a bit to make it
7876         usable for dead code elimination.
7877
7878 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7879
7880         * cs-parser.jay: allow empty source files. Fixes bug #31781.
7881
7882 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7883
7884         * expression.cs (ComposedCast.DoResolveType): A quick workaround
7885         to fix the test 165, will investigate deeper.
7886
7887 2002-10-04  Martin Baulig  <martin@gnome.org>
7888
7889         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
7890         finally blocks actually work.
7891         (Try.Resolve): We don't need to create a sibling for `finally' if
7892         there is no finally block.
7893
7894 2002-10-04  Martin Baulig  <martin@gnome.org>
7895
7896         * class.cs (Constructor.Define): The default accessibility for a
7897         non-default constructor is private, not public.
7898
7899 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7900
7901         * class.cs (Constructor): Make AllowedModifiers public, add
7902         EXTERN.
7903
7904         * cs-parser.jay: Perform the modifiers test here, as the
7905         constructor for the Constructor class usually receives a zero
7906         because of the way we create it (first we create, later we
7907         customize, and we were never checking the modifiers).
7908
7909         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
7910         is a version of LookupTypeReflection that includes the type-name
7911         cache.  This can be used as a fast path for functions that know
7912         the fully qualified name and are only calling into *.GetType() to
7913         obtain a composed type.
7914
7915         This is also used by TypeManager.LookupType during its type
7916         composition.
7917
7918         (LookupType): We now also track the real type name, as sometimes
7919         we can get a quey for the real type name from things like
7920         ComposedCast.  This fixes bug 31422.
7921
7922         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
7923         complete type fullname, it does not have to go through the type
7924         resolution system to obtain the composed version of the type (for
7925         obtaining arrays or pointers).
7926
7927         (Conditional.Emit): Use the EmitBoolExpression to
7928         generate nicer code, as requested by Paolo.
7929
7930         (ArrayCreation.CheckIndices): Use the patch from
7931         hwang_rob@yahoo.ca to validate the array initializers. 
7932
7933 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
7934
7935         * class.cs (ConstructorInitializer.Emit): simplify code by using
7936         Invocation.EmitCall, and at the same time, fix the bugs in calling
7937         parent constructors that took variable arguments. 
7938
7939         * ecore.cs (Expression.ConvertNumericExplicit,
7940         Expression.ImplicitNumericConversion): Remove the code that
7941         manually wrapped decimal (InternalTypeConstructor call is now gone
7942         as well).
7943
7944         * expression.cs (Cast.TryReduce): Also handle decimal types when
7945         trying to perform a constant fold on the type.
7946
7947         * typemanager.cs (IsUnmanagedtype): Partially implemented.
7948
7949         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
7950         that only turned off an error report, and did nothing else. 
7951
7952 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
7953
7954         * driver.cs: Handle and ignore /fullpaths
7955
7956 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
7957
7958         * expression.cs (Binary.ResolveOperator): Catch the case where
7959         DoNumericPromotions returns true, 
7960
7961         (Binary.DoNumericPromotions): Simplify the code, and the tests.
7962
7963 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
7964
7965         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
7966         report error 70.
7967
7968 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
7969
7970         * ecore.cs (ConvertNumericExplicit): It is not enough that the
7971         conversion exists, but it is also required that the conversion be
7972         performed.  This manifested in "(Type64Enum) 2".  
7973
7974         * class.cs (TypeManager.AddMethod): The fix is not to change
7975         AddEnum, because that one was using a fully qualified name (every
7976         DeclSpace derivative does), but to change the AddMethod routine
7977         that was using an un-namespaced name.  This now correctly reports
7978         the duplicated name.
7979
7980         Revert patch until I can properly fix it.  The issue
7981         is that we have a shared Type space across all namespaces
7982         currently, which is wrong.
7983
7984         Options include making the Namespace a DeclSpace, and merge
7985         current_namespace/current_container in the parser.
7986
7987 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
7988
7989         * cs-parser.jay: Improve error reporting when we get a different
7990         kind of expression in local_variable_type and
7991         local_variable_pointer_type. 
7992
7993         Propagate this to avoid missleading errors being reported.
7994
7995         * ecore.cs (ImplicitReferenceConversion): treat
7996         TypeManager.value_type as a target just like object_type.   As
7997         code like this:
7998
7999         ValueType v = 1;
8000
8001         Is valid, and needs to result in the int 1 being boxed before it
8002         is assigned to the value type v.
8003
8004         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8005         to validate the enumeration name.
8006
8007         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8008         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8009         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8010
8011         * ecore.cs (TryImplicitIntConversion): When doing an
8012         implicit-enumeration-conversion, check if the type is 64-bits and
8013         perform a conversion before passing to EnumConstant.
8014
8015 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8016
8017         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8018         report ambiguous type references.  Unlike the MS version, we
8019         report what the ambiguity is.   Innovation at work ;-)
8020
8021         (DeclSpace.FindType): Require a location argument to
8022         display when we display an ambiguous error.
8023
8024         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8025
8026         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8027
8028         * expression.cs (EmitDynamicInitializers): Apply patch from
8029         hwang_rob@yahoo.ca that fixes the order in which we emit our
8030         initializers. 
8031
8032 2002-09-21  Martin Baulig  <martin@gnome.org>
8033
8034         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8035         delegate takes no arguments.
8036
8037 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8038
8039         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8040         from integers.
8041
8042         * expression.cs: Extract the underlying type.
8043
8044         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8045
8046         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8047
8048 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8049
8050         * class.cs (TypeContainer.DefineType): We can not use the nice
8051         PackingSize with the size set to 1 DefineType method, because it
8052         will not allow us to define the interfaces that the struct
8053         implements.
8054
8055         This completes the fixing of bug 27287
8056
8057         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8058         means also structs.  This fixes part of the problem. 
8059         (Expresion.ImplicitReferenceConversionExists): ditto.
8060
8061         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8062         error if there were no errors reported during the type lookup
8063         process, to avoid duplicates or redundant errors.  Without this
8064         you would get an ambiguous errors plus a type not found.  We have
8065         beaten the user enough with the first error.  
8066
8067         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8068         reference. 
8069
8070         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8071         during the resolution process, stop the lookup, this avoids
8072         repeated error reports (same error twice).
8073
8074         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8075
8076         * typemanager.cs (LookupType): Redo the type lookup code to match
8077         the needs of System.Reflection.  
8078
8079         The issue is that System.Reflection requires references to nested
8080         types to begin with a "+" sign instead of a dot.  So toplevel
8081         types look like: "NameSpace.TopLevelClass", and nested ones look
8082         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8083         levels. 
8084
8085 2002-09-19  Martin Baulig  <martin@gnome.org>
8086
8087         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8088         says that a method always returns or always throws an exception,
8089         don't report the CS0161.
8090
8091         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8092         set `Returns = new_returns'.
8093
8094 2002-09-19  Martin Baulig  <martin@gnome.org>
8095
8096         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8097         to an enum constant, check for a CS0176.
8098
8099 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8100
8101         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8102         for operators that must be in pairs and report errors.
8103
8104         * ecore.cs (SimpleName.DoResolveType): During the initial type
8105         resolution process, when we define types recursively, we must
8106         check first for types in our current scope before we perform
8107         lookups in the enclosing scopes.
8108
8109         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8110
8111         (Invocation.VerifyArgumentsCompat): Call
8112         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8113         I thought we were supposed to always call this, but there are a
8114         few places in the code where we dont do it.
8115
8116 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8117
8118         * driver.cs: Add support in -linkres and -resource to specify the
8119         name of the identifier.
8120
8121 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8122
8123         * ecore.cs (StandardConversionExists): Sync with the conversion
8124         code: allow anything-* to void* conversions.
8125
8126         (FindMostSpecificSource): Use an Expression argument
8127         instead of a Type, because we might be handed over a Literal which
8128         gets a few more implicit conversions that plain types do not.  So
8129         this information was being lost.
8130
8131         Also, we drop the temporary type-holder expression when not
8132         required.
8133
8134 2002-09-17  Martin Baulig  <martin@gnome.org>
8135
8136         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8137         this is an explicit interface implementation.
8138
8139 2002-09-17  Martin Baulig  <martin@gnome.org>
8140
8141         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8142         different `IndexerName' attributes.
8143
8144         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8145         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8146         virtual CommonResolve().
8147
8148 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8149
8150         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8151         and convert that to the UnderlyingType.
8152
8153         * statement.cs (Foreach.Resolve): Indexers are just like variables
8154         or PropertyAccesses.
8155
8156         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8157         inside quoted strings, we were not doing this before.
8158
8159 2002-09-16  Martin Baulig  <martin@gnome.org>
8160
8161         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8162         resolve it.  This is needed for the definite assignment check of the
8163         instance expression, fixes bug #29846.
8164         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8165
8166 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8167
8168         * parameter.cs: Fix compile error.  Cannot reference static member
8169         from an instance object.  Is this an mcs bug?
8170
8171 2002-09-14  Martin Baulig  <martin@gnome.org>
8172
8173         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8174         multiple times.  Fixes bug #30295, added test-166.cs.
8175
8176 2002-09-14  Martin Baulig  <martin@gnome.org>
8177
8178         * statement.cs (Block.Emit): Don't emit unreachable code.
8179         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8180         `break' statements.
8181         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8182
8183 2002-09-14  Martin Baulig  <martin@gnome.org>
8184
8185         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8186         is set.
8187
8188 2002-09-14  Martin Baulig  <martin@gnome.org>
8189
8190         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8191         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8192         be false on the ms runtime.
8193
8194 2002-09-13  Martin Baulig  <martin@gnome.org>
8195
8196         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8197         the CS0038 error message.
8198
8199 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8200
8201         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8202         constant inside, return it.
8203
8204 2002-09-12  Martin Baulig  <martin@gnome.org>
8205
8206         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8207         implicit conversion can be done between enum types.
8208
8209         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8210         check whether an implicit conversion to the current enum's UnderlyingType
8211         exists and report an error if not.
8212
8213         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8214         without debugging support.
8215
8216         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8217         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8218
8219 2002-09-12  Martin Baulig  <martin@gnome.org>
8220
8221         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8222
8223         * ecore.cs (IMemberExpr.DeclaringType): New property.
8224         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8225         nonstatic member of an outer type (CS0038).
8226
8227 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8228
8229         * driver.cs: Activate the using-error detector at warning level
8230         4 (at least for MS-compatible APIs).
8231
8232         * namespace.cs (VerifyUsing): Small buglett fix.
8233
8234         * pending.cs (PendingImplementation): pass the container pointer. 
8235
8236         * interface.cs (GetMethods): Allow for recursive definition.  Long
8237         term, I would like to move every type to support recursive
8238         definitions, not the current ordering mechanism that we have right
8239         now.
8240
8241         The situation is this: Attributes are handled before interfaces,
8242         so we can apply attributes to interfaces.  But some attributes
8243         implement interfaces, we will now handle the simple cases
8244         (recursive definitions will just get an error).  
8245
8246         * parameter.cs: Only invalidate types at the end if we fail to
8247         lookup all types.  
8248
8249 2002-09-09  Martin Baulig  <martin@gnome.org>
8250
8251         * ecore.cs (PropertyExpr.Emit): Also check for
8252         TypeManager.system_int_array_get_length so this'll also work when
8253         compiling corlib.  Fixes #30003.
8254
8255 2002-09-09  Martin Baulig  <martin@gnome.org>
8256
8257         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8258         and throw an exception if we can't get the type's size.  Fixed #30040,
8259         added test-165.cs.
8260
8261 2002-09-09  Martin Baulig  <martin@gnome.org>
8262
8263         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8264
8265         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8266         context.  Fixes bug #30027.
8267
8268         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8269         virtual functions.  Fixes bug #30043, added test-164.cs.
8270
8271 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8272
8273         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8274
8275 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8276
8277         * driver.cs: Use an object to get the windows codepage since it's not a
8278         static property.
8279
8280 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8281
8282         * statement.cs (For.Emit): for infinite loops (test == null)
8283         return whether there is a break inside, not always "true".
8284
8285         * namespace.cs (UsingEntry): New struct to hold the name of the
8286         using definition, the location where it is defined, and whether it
8287         has been used in a successful type lookup.
8288
8289         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8290         strings.
8291
8292         * decl.cs: ditto.
8293
8294 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8295
8296         * attribute.cs : Fix incorrect code which relied on catching
8297         a NullReferenceException to detect a null being passed in
8298         where an object was expected.
8299
8300 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8301
8302         * statement.cs (Try): flag the catch variable as assigned
8303
8304         * expression.cs (Cast): Simplified by using ResolveType instead of
8305         manually resolving.
8306
8307         * statement.cs (Catch): Fix bug by using ResolveType.
8308
8309 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8310
8311         * expression.cs (BetterConversion): Special case for when we have
8312         a NullLiteral as the argument and we have to choose between string
8313         and object types - we choose string the way csc does.
8314
8315         * attribute.cs (Attribute.Resolve): Catch the
8316         NullReferenceException and report error #182 since the Mono
8317         runtime no more has the bug and having this exception raised means
8318         we tried to select a constructor which takes an object and is
8319         passed a null.
8320
8321 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8322
8323         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8324         message (1502, 1503) when we can't locate a method after overload
8325         resolution. This is much more informative and closes the bug
8326         Miguel reported.
8327
8328         * interface.cs (PopulateMethod): Return if there are no argument
8329         types. Fixes a NullReferenceException bug.
8330
8331         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8332         expressions too. Previously we were checking only in one place for
8333         positional arguments leaving out named arguments.
8334
8335         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8336         type to the enum type is not allowed. Remove code corresponding to
8337         that.
8338
8339         (ConvertNumericExplicit): Allow explicit conversions from
8340         the underlying type to enum type. This precisely follows the spec
8341         and closes a bug filed by Gonzalo.
8342
8343 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8344
8345         * compiler.csproj:
8346         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8347
8348 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8349
8350         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8351         it was important that we stored the right value after the
8352         reduction in `converted'.
8353
8354 2002-09-04  Martin Baulig  <martin@gnome.org>
8355
8356         * location.cs (Location.SymbolDocument): Use full pathnames for the
8357         source files.
8358
8359 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8360
8361         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8362         of the expression resolve mechanism, because that will catch the
8363         SimpleName error failures.
8364
8365         (Conditional): If we can not resolve the
8366         expression, return, do not crash.
8367
8368 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8369
8370         * cs-tokenizer.cs:
8371         (location): display token name instead of its number.
8372
8373 2002-08-28  Martin Baulig  <martin@gnome.org>
8374
8375         * expression.cs (Binary.ResolveOperator): Don't silently return
8376         but return an error if an operator cannot be applied between two
8377         enum types.
8378
8379 2002-08-28  Martin Baulig  <martin@gnome.org>
8380
8381         * class.cs (Constructor.Define): Set the permission attributes
8382         correctly instead of making all constructors public.
8383
8384 2002-08-28  Martin Baulig  <martin@gnome.org>
8385
8386         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8387         for private members before reporting a CS0103; if we find anything,
8388         it's a CS0122.
8389
8390 2002-08-28  Martin Baulig  <martin@gnome.org>
8391
8392         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8393         to check whether `closure_start_type == closure_invocation_type',
8394         we also need to check whether `m.DeclaringType == closure_invocation_type'
8395         before bypassing the permission checks.  We might be accessing
8396         protected/private members from the base class.
8397         (TypeManager.RealMemberLookup): Only set private_ok if private
8398         members were requested via BindingFlags.NonPublic.
8399
8400         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8401
8402         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8403         MethodGroupExpr.IsExplicitImpl if appropriate.
8404         (Invocation.DoResolve): Don't report the CS0120 for explicit
8405         interface implementations.
8406
8407 2002-08-27  Martin Baulig  <martin@gnome.org>
8408
8409         * expression.cs (Invocation.DoResolve): If this is a static
8410         method and we don't have an InstanceExpression, we must report
8411         a CS0120.
8412
8413 2002-08-25  Martin Baulig  <martin@gnome.org>
8414
8415         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8416         `==' between a valuetype and an object.
8417
8418 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8419
8420         * ecore.cs (TypeExpr): Provide a ToString method.
8421
8422 2002-08-24  Martin Baulig  <martin@gnome.org>
8423
8424         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8425         now called proggie.dbg and it's a binary file.
8426
8427 2002-08-23  Martin Baulig  <martin@gnome.org>
8428
8429         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8430
8431 2002-08-23  Martin Baulig  <martin@gnome.org>
8432
8433         * struct.cs (MyStructInfo.ctor): Make this work with empty
8434         structs; it's not allowed to use foreach() on null.
8435
8436 2002-08-23  Martin Baulig  <martin@gnome.org>
8437
8438         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8439         writer the full pathname of the generated assembly.
8440
8441 2002-08-23  Martin Baulig  <martin@gnome.org>
8442
8443         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8444         A `finally' block never returns or breaks; improved handling of
8445         unreachable code.
8446
8447 2002-08-23  Martin Baulig  <martin@gnome.org>
8448
8449         * statement.cs (Throw.Resolve): Allow `throw null'.
8450
8451 2002-08-23  Martin Baulig  <martin@gnome.org>
8452
8453         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8454         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8455         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8456         MemberLookup would return a wrong event if this is an explicit
8457         interface implementation and the class has an event with the same
8458         name.
8459
8460 2002-08-23  Martin Baulig  <martin@gnome.org>
8461
8462         * statement.cs (Block.AddChildVariableNames): New public method.
8463         (Block.AddChildVariableName): Likewise.
8464         (Block.IsVariableNameUsedInChildBlock): Likewise.
8465         (Block.AddVariable): Check whether a variable name has already
8466         been used in a child block.
8467
8468         * cs-parser.jay (declare_local_variables): Mark all variable names
8469         from the current block as being used in a child block in the
8470         implicit block.
8471
8472 2002-08-23  Martin Baulig  <martin@gnome.org>
8473
8474         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
8475         find the symbol writer.
8476
8477         * driver.cs: csc also allows the arguments to /define being
8478         separated by commas, not only by semicolons.
8479
8480 2002-08-23  Martin Baulig  <martin@gnome.org>
8481
8482         * interface.cs (Interface.GetMembers): Added static check for events.
8483
8484 2002-08-15  Martin Baulig  <martin@gnome.org>
8485
8486         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
8487         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
8488
8489         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8490         why the MethodData.EmitDestructor() change was necessary.
8491
8492 2002-08-20  Martin Baulig  <martin@gnome.org>
8493
8494         * class.cs (TypeContainer.FindMembers): Added static check for events.
8495
8496         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8497
8498         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8499         use Type.GetEvents(), not Type.FindMembers().
8500
8501 2002-08-20  Martin Baulig  <martin@gnome.org>
8502
8503         * decl.cs (MemberCache): Added a special method cache which will
8504         be used for method-only searched.  This ensures that a method
8505         search will return a MethodInfo with the correct ReflectedType for
8506         inherited methods.      
8507
8508 2002-08-20  Martin Baulig  <martin@gnome.org>
8509
8510         * decl.cs (DeclSpace.FindMembers): Made this public.
8511
8512 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8513
8514         * delegate.cs: fixed build on windows.
8515         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8516
8517 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8518
8519         * ecore.cs (StandardConversionExists): Return a false
8520         if we are trying to convert the void type to anything else
8521         since that is not allowed.
8522
8523         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8524         we flag error 70 in the event an event is trying to be accessed
8525         directly from outside the declaring type.
8526
8527 2002-08-20  Martin Baulig  <martin@gnome.org>
8528
8529         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8530         MemberCache from typemanager.cs to decl.cs.
8531
8532 2002-08-19  Martin Baulig  <martin@gnome.org>
8533
8534         * class.cs (TypeContainer): Implement IMemberContainer.
8535         (TypeContainer.DefineMembers): Create the MemberCache.
8536         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8537         return public members if BindingFlags.Public was given, check
8538         whether members are static.
8539
8540 2002-08-16  Martin Baulig  <martin@gnome.org>
8541
8542         * decl.cs (DeclSpace.Define): Splitted this in Define and
8543         DefineMembers.  DefineMembers is called first and initializes the
8544         MemberCache.
8545
8546         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8547         DefineMembers() on all our DeclSpaces.
8548
8549         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8550         but call DefineMembers() on all nested interfaces.  We call their
8551         Define() in our new Define() function.
8552
8553         * interface.cs (Interface): Implement IMemberContainer.
8554         (Interface.Define): Moved all code except the attribute stuf to
8555         DefineMembers().
8556         (Interface.DefineMembers): Initialize the member cache.
8557
8558         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8559         need this anymore since we can use MemberCache.FindMembers directly.
8560
8561 2002-08-19  Martin Baulig  <martin@gnome.org>
8562
8563         * typemanager.cs (MemberCache): When creating the cache for an
8564         interface type, add all inherited members.
8565         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8566         to `out bool used_cache' and documented it.
8567         (TypeManager.MemberLookup): If we already used the cache in the first
8568         iteration, we don't need to do the interfaces check.
8569
8570 2002-08-19  Martin Baulig  <martin@gnome.org>
8571
8572         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8573         here from IMemberFinder and don't implement this interface anymore.
8574         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8575
8576         * typemanager.cs (IMemberFinder): This interface is now only used by
8577         classes which actually support the member cache.
8578         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8579         since we only put DeclSpaces into this Hashtable.
8580         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8581         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8582
8583 2002-08-16  Martin Baulig  <martin@gnome.org>
8584
8585         * typemanager.cs (ICachingMemberFinder): Removed.
8586         (IMemberFinder.MemberCache): New property.
8587         (TypeManager.FindMembers): Merged this with RealFindMembers().
8588         This function will never be called from TypeManager.MemberLookup()
8589         so we can't use the cache here, just the IMemberFinder.
8590         (TypeManager.MemberLookup_FindMembers): Check whether the
8591         IMemberFinder has a MemberCache and call the cache's FindMembers
8592         function.
8593         (MemberCache): Rewrote larger parts of this yet another time and
8594         cleaned it up a bit.
8595
8596 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8597
8598         * driver.cs (LoadArgs): Support quoting.
8599
8600         (Usage): Show the CSC-like command line arguments.
8601
8602         Improved a few error messages.
8603
8604 2002-08-15  Martin Baulig  <martin@gnome.org>
8605
8606         * typemanager.cs (IMemberContainer.Type): New property.
8607         (IMemberContainer.IsInterface): New property.
8608
8609         The following changes are conditional to BROKEN_RUNTIME, which is
8610         defined at the top of the file.
8611
8612         * typemanager.cs (MemberCache.MemberCache): Don't add the base
8613         class'es members, but add all members from TypeHandle.ObjectType
8614         if we're an interface.
8615         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
8616         is the current type.
8617         (MemberCache.CacheEntry.Container): Removed this field.
8618         (TypeHandle.GetMembers): Include inherited members.
8619
8620 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8621
8622         * typemanager.cs: fixed compilation and added a comment on a field that
8623         is never used.
8624
8625 2002-08-15  Martin Baulig  <martin@gnome.org>
8626
8627         * class.cs (ConstructorInitializer.Resolve): In the
8628         Expression.MemberLookup call, use the queried_type as
8629         invocation_type.
8630
8631         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
8632         declared' attribute, it's always true.
8633         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
8634         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
8635         temporary wrapper for FindMembers which tells MemberLookup whether
8636         members from the base classes are included in the return value.
8637         This will go away soon.
8638         (TypeManager.MemberLookup): Use this temporary hack here; once the
8639         new MemberCache is completed, we don't need to do the DeclaredOnly
8640         looping here anymore since the MemberCache will take care of this.
8641         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
8642         (MemberCache): When creating the MemberCache for a class, get
8643         members from the current class and all its base classes.
8644         (MemberCache.CacheEntry.Container): New field.  This is a
8645         temporary hack until the Mono runtime is fixed to distinguish
8646         between ReflectedType and DeclaringType.  It allows us to use MCS
8647         with both the MS runtime and the unfixed Mono runtime without
8648         problems and without accecting performance.
8649         (MemberCache.SearchMembers): The DeclaredOnly looping from
8650         TypeManager.MemberLookup is now done here.      
8651
8652 2002-08-14  Martin Baulig  <martin@gnome.org>
8653
8654         * statement.cs (MyStructInfo.MyStructInfo): Don't call
8655         Type.GetFields on dynamic types but get the fields from the
8656         corresponding TypeContainer.
8657         (MyStructInfo.GetStructInfo): Added check for enum types.
8658
8659         * typemanager.cs (MemberList.IsSynchronized): Implemented.
8660         (MemberList.SyncRoot): Implemented.
8661         (TypeManager.FilterWithClosure): No need to check permissions if
8662         closure_start_type == closure_invocation_type, don't crash if
8663         closure_invocation_type is null.
8664
8665 2002-08-13  Martin Baulig  <martin@gnome.org>
8666
8667         Rewrote TypeContainer.FindMembers to use a member cache.  This
8668         gives us a speed increase of about 35% for the self-hosting MCS
8669         build and of about 15-20% for the class libs (both on GNU/Linux).
8670
8671         * report.cs (Timer): New class to get enhanced profiling.  This
8672         whole class is "TIMER" conditional since it remarkably slows down
8673         compilation speed.
8674
8675         * class.cs (MemberList): New class.  This is an IList wrapper
8676         which we're now using instead of passing MemberInfo[]'s around to
8677         avoid copying this array unnecessarily.
8678         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
8679         (ICachingMemberFinder, IMemberContainer): New interface.
8680         (TypeManager.FilterWithClosure): If `criteria' is null, the name
8681         has already been checked, otherwise use it for the name comparision.
8682         (TypeManager.FindMembers): Renamed to RealMemberFinder and
8683         provided wrapper which tries to use ICachingMemberFinder.FindMembers
8684         if possible.  Returns a MemberList, not a MemberInfo [].
8685         (TypeHandle): New class, implements IMemberContainer.  We create
8686         one instance of this class per type, it contains a MemberCache
8687         which is used to do the member lookups.
8688         (MemberCache): New class.  Each instance of this class contains
8689         all members of a type and a name-based hash table.
8690         (MemberCache.FindMembers): This is our new member lookup
8691         function.  First, it looks up all members of the requested name in
8692         the hash table.  Then, it walks this list and sorts out all
8693         applicable members and returns them.
8694
8695 2002-08-13  Martin Baulig  <martin@gnome.org>
8696
8697         In addition to a nice code cleanup, this gives us a performance
8698         increase of about 1.4% on GNU/Linux - not much, but it's already
8699         half a second for the self-hosting MCS compilation.
8700
8701         * typemanager.cs (IMemberFinder): New interface.  It is used by
8702         TypeManager.FindMembers to call FindMembers on a TypeContainer,
8703         Enum, Delegate or Interface.
8704         (TypeManager.finder_to_member_finder): New PtrHashtable.
8705         (TypeManager.finder_to_container): Removed.
8706         (TypeManager.finder_to_delegate): Removed.
8707         (TypeManager.finder_to_interface): Removed.
8708         (TypeManager.finder_to_enum): Removed.
8709
8710         * interface.cs (Interface): Implement IMemberFinder.
8711
8712         * delegate.cs (Delegate): Implement IMemberFinder.
8713
8714         * enum.cs (Enum): Implement IMemberFinder.
8715
8716         * class.cs (TypeContainer): Implement IMemberFinder.
8717
8718 2002-08-12  Martin Baulig  <martin@gnome.org>
8719
8720         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
8721
8722 2002-08-12  Martin Baulig  <martin@gnome.org>
8723
8724         * ecore.cs (ITypeExpression): New interface for expressions which
8725         resolve to a type.
8726         (TypeExpression): Renamed to TypeLookupExpression.
8727         (Expression.DoResolve): If we're doing a types-only lookup, the
8728         expression must implement the ITypeExpression interface and we
8729         call DoResolveType() on it.
8730         (SimpleName): Implement the new ITypeExpression interface.
8731         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
8732         hack, the situation that we're only looking up types can't happen
8733         anymore when this method is called.  Moved the type lookup code to
8734         DoResolveType() and call it.
8735         (SimpleName.DoResolveType): This ITypeExpression interface method
8736         is now doing the types-only lookup.
8737         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
8738         (ResolveFlags): Added MaskExprClass.
8739
8740         * expression.cs (MemberAccess): Implement the ITypeExpression
8741         interface.
8742         (MemberAccess.DoResolve): Added support for a types-only lookup
8743         when we're called via ITypeExpression.DoResolveType().
8744         (ComposedCast): Implement the ITypeExpression interface.
8745
8746         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
8747         Expression.Resolve() with ResolveFlags.Type instead.
8748
8749 2002-08-12  Martin Baulig  <martin@gnome.org>
8750
8751         * interface.cs (Interface.Define): Apply attributes.
8752
8753         * attribute.cs (Attribute.ApplyAttributes): Added support for
8754         interface attributes.
8755
8756 2002-08-11  Martin Baulig  <martin@gnome.org>
8757
8758         * statement.cs (Block.Emit): Only check the "this" variable if we
8759         do not always throw an exception.
8760
8761         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
8762         whether the property has a set accessor.
8763
8764 2002-08-11  Martin Baulig  <martin@gnome.org>
8765
8766         Added control flow analysis support for structs.
8767
8768         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
8769         with control flow analysis turned off.
8770         (IVariable): New interface.
8771         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
8772         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
8773         (FieldExpr.DoResolve): Resolve the instance expression with flow
8774         analysis turned off and do the definite assignment check after the
8775         resolving when we know what the expression will resolve to.
8776
8777         * expression.cs (LocalVariableReference, ParameterReference):
8778         Implement the new IVariable interface, only call the flow analysis
8779         code if ec.DoFlowAnalysis is true.
8780         (This): Added constructor which takes a Block argument.  Implement
8781         the new IVariable interface.
8782         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
8783         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
8784         This does the definite assignment checks for struct members.
8785
8786         * class.cs (Constructor.Emit): If this is a non-static `struct'
8787         constructor which doesn't have any initializer, call
8788         Block.AddThisVariable() to tell the flow analysis code that all
8789         struct elements must be initialized before control returns from
8790         the constructor.
8791
8792         * statement.cs (MyStructInfo): New public class.
8793         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
8794         argument to this indexer.  If non-zero, check an individual struct
8795         member, not the whole struct.
8796         (FlowBranching.CheckOutParameters): Check struct members.
8797         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
8798         overloaded versions of these methods which take an additional
8799         `int field_idx' argument to check struct members.
8800         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
8801         overloaded versions of these methods which take an additional
8802         `string field_name' argument to check struct member.s
8803         (VariableInfo): Implement the IVariable interface.
8804         (VariableInfo.StructInfo): New public property.  Returns the
8805         MyStructInfo instance of the variable if it's a struct or null.
8806         (Block.AddThisVariable): New public method.  This is called from
8807         Constructor.Emit() for non-static `struct' constructor which do
8808         not have any initializer.  It creates a special variable for the
8809         "this" instance variable which will be checked by the flow
8810         analysis code to ensure that all of the struct's fields are
8811         initialized before control returns from the constructor.
8812         (UsageVector): Added support for struct members.  If a
8813         variable/parameter is a struct with N members, we reserve a slot
8814         in the usage vector for each member.  A struct is considered fully
8815         initialized if either the struct itself (slot 0) or all its
8816         members are initialized.
8817
8818 2002-08-08  Martin Baulig  <martin@gnome.org>
8819
8820         * driver.cs (Driver.MainDriver): Only report an error CS5001
8821         if there were no compilation errors.
8822
8823         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
8824         `UnsafeContext' property to determine whether the parent is in
8825         unsafe context rather than checking the parent's ModFlags:
8826         classes nested in an unsafe class are unsafe as well.
8827
8828 2002-08-08  Martin Baulig  <martin@gnome.org>
8829
8830         * statement.cs (UsageVector.MergeChildren): Distinguish between
8831         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
8832         we return.  Added test17() and test18() to test-154.cs.
8833
8834 2002-08-08  Martin Baulig  <martin@gnome.org>
8835
8836         * typemanager.cs (TypeManager.FilterWithClosure): If we have
8837         Family access, make sure the invoking type isn't a subclass of the
8838         queried type (that'd be a CS1540).
8839
8840         * ecore.cs (Expression.MemberLookup): Added overloaded version of
8841         this method which takes an additional `Type invocation_type'.
8842
8843         * expression.cs (BaseAccess.DoResolve): Use the base type as
8844         invocation and query type.
8845         (MemberAccess.DoResolve): If the lookup failed and we're about to
8846         report a CS0122, try a lookup with the ec.ContainerType - if this
8847         succeeds, we must report a CS1540.
8848
8849 2002-08-08  Martin Baulig  <martin@gnome.org>
8850
8851         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
8852         (MethodGroupExpr): Implement the IMemberExpr interface.
8853
8854         * expression (MemberAccess.ResolveMemberAccess): No need to have
8855         any special code for MethodGroupExprs anymore, they're now
8856         IMemberExprs.   
8857
8858 2002-08-08  Martin Baulig  <martin@gnome.org>
8859
8860         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
8861         Family, FamANDAssem and FamORAssem permissions.
8862         (TypeManager.IsSubclassOrNestedChildOf): New public method.
8863
8864 2002-08-08  Martin Baulig  <martin@gnome.org>
8865
8866         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
8867         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
8868         or loop block.
8869
8870 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
8871
8872         * driver.cs: implemented /resource option to embed managed resources.
8873
8874 2002-08-07  Martin Baulig  <martin@gnome.org>
8875
8876         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
8877         (FieldBase.HasFieldInitializer): New public property.
8878         (FieldBase.GetInitializerExpression): New public method.  Resolves and
8879         returns the field initializer and makes sure it is only resolved once.
8880         (TypeContainer.EmitFieldInitializers): Call
8881         FieldBase.GetInitializerExpression to get the initializer, this ensures
8882         that it isn't resolved multiple times.
8883
8884         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
8885         the resolving process (SimpleName/MemberLookup) that we're currently
8886         emitting a field initializer (which must not access any instance members,
8887         this is an error CS0236).
8888
8889         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
8890         argument, if the `IsFieldInitializer' flag is set, we must report and
8891         error CS0236 and not an error CS0120.   
8892
8893 2002-08-07  Martin Baulig  <martin@gnome.org>
8894
8895         * ecore.cs (IMemberExpr): New public interface.
8896         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
8897         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
8898         if the expression is an IMemberExpr.
8899
8900         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
8901         to be null, implicitly default to `this' if we're non-static in
8902         this case.  Simplified the code a lot by using the new IMemberExpr
8903         interface.  Also fixed bug #28176 here.
8904
8905 2002-08-06  Martin Baulig  <martin@gnome.org>
8906
8907         * cs-parser.jay (SimpleLookup): Removed.  We need to create
8908         ParameterReferences during semantic analysis so that we can do a
8909         type-only search when resolving Cast, TypeOf and SizeOf.
8910         (block): Pass the `current_local_parameters' to the Block's
8911         constructor.
8912
8913         * class.cs (ConstructorInitializer): Added `Parameters parameters'
8914         argument to the constructor.
8915         (ConstructorInitializer.Resolve): Create a temporary implicit
8916         block with the parameters.
8917
8918         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
8919         references here if we aren't doing a type-only search.
8920
8921         * statement.cs (Block): Added constructor which takes a
8922         `Parameters parameters' argument.
8923         (Block.Parameters): New public property.
8924
8925         * support.cs (InternalParameters.Parameters): Renamed `parameters'
8926         to `Parameters' and made it public readonly.
8927
8928 2002-08-06  Martin Baulig  <martin@gnome.org>
8929
8930         * ecore.cs (Expression.Warning): Made this public as well.
8931
8932         * report.cs (Report.Debug): Print the contents of collections.
8933
8934 2002-08-06  Martin Baulig  <martin@gnome.org>
8935
8936         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
8937         used to tell Resolve() which kinds of expressions it may return.
8938         (Expression.Resolve): Added overloaded version of this method which
8939         takes a `ResolveFlags flags' argument.  This can be used to tell
8940         Resolve() which kinds of expressions it may return.  Reports a
8941         CS0118 on error.
8942         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
8943         ResolveFlags.SimpleName.
8944         (Expression.Error118): Added overloaded version of this method which
8945         takes a `ResolveFlags flags' argument.  It uses the flags to determine
8946         which kinds of expressions are allowed.
8947
8948         * expression.cs (Argument.ResolveMethodGroup): New public method.
8949         Resolves an argument, but allows a MethodGroup to be returned.
8950         This is used when invoking a delegate.
8951
8952         * TODO: Updated a bit.
8953
8954 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8955
8956         Fixed compilation with csc.
8957
8958         * ecore.cs: Expression.Error made public. Is this correct? Should
8959         Warning be made public too?
8960
8961         * expression.cs: use ea.Location instead of ea.loc.
8962         [FIXME:  Filed as bug #28607: MCS must report these errors.]
8963
8964 2002-08-06  Martin Baulig  <martin@gnome.org>
8965
8966         * ecore.cs (Expression.loc): Moved the location here instead of
8967         duplicating it in all derived classes.
8968         (Expression.Location): New public property.
8969         (Expression.Error, Expression.Warning): Made them non-static and
8970         removed the location argument.
8971         (Expression.Warning): Added overloaded version which takes an
8972         `int level' argument.
8973         (Expression.Error118): Make this non-static and removed the
8974         expression and location arguments.
8975         (TypeExpr): Added location argument to the constructor.
8976
8977         * expression.cs (StaticCallExpr): Added location argument to
8978         the constructor.
8979         (Indirection, PointerArithmetic): Likewise.
8980         (CheckedExpr, UnCheckedExpr): Likewise.
8981         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
8982         (StringPtr): Likewise.
8983
8984
8985 2002-08-05  Martin Baulig  <martin@gnome.org>
8986
8987         * expression.cs (BaseAccess.DoResolve): Actually report errors.
8988
8989         * assign.cs (Assign.DoResolve): Check whether the source
8990         expression is a value or variable.
8991
8992         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
8993         while resolving the corresponding blocks.
8994
8995         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
8996         an error, don't silently return null.
8997
8998         * statement.cs (Block.AddVariable): Do the error reporting here
8999         and distinguish between CS0128 and CS0136.
9000         (Block.DoResolve): Report all unused labels (warning CS0164).
9001         (LabeledStatement): Pass the location to the constructor.
9002         (LabeledStatement.HasBeenReferenced): New property.
9003         (LabeledStatement.Resolve): Set it to true here.
9004
9005         * statement.cs (Return.Emit): Return success even after reporting
9006         a type mismatch error (CS0126 or CS0127), this is what csc does and
9007         it avoids confusing the users with any consecutive errors.
9008
9009 2002-08-05  Martin Baulig  <martin@gnome.org>
9010
9011         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9012
9013         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9014
9015         * expression.cs (MemberAccess.DoResolve): Silently return if an
9016         error has already been reported.
9017
9018         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9019         error has already been reported.
9020
9021 2002-08-05  Martin Baulig  <martin@gnome.org>
9022
9023         * statement.cs (UsageVector): Only initialize the `parameters'
9024         vector if we actually have any "out" parameters.
9025
9026 2002-08-05  Martin Baulig  <martin@gnome.org>
9027
9028         * expression.cs (Binary.ResolveOperator): When combining delegates,
9029         they must have the same type.
9030
9031 2002-08-05  Martin Baulig  <martin@gnome.org>
9032
9033         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9034         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9035         work with the ms runtime and we also don't need it: if we're a
9036         PropertyBuilder and not in the `indexer_arguments' hash, then we
9037         are a property and not an indexer.
9038
9039         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9040         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9041         since the latter one doesn't work with the ms runtime.
9042
9043 2002-08-03  Martin Baulig  <martin@gnome.org>
9044
9045         Fixed bugs #27998 and #22735.
9046
9047         * class.cs (Method.IsOperator): New public field.
9048         (Method.CheckBase): Report CS0111 if there's already a method
9049         with the same parameters in the current class.  Report CS0508 when
9050         attempting to change the return type of an inherited method.
9051         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9052         and it's not marked abstract or extern.
9053         (PropertyBase): New abstract base class for Property and Indexer.
9054         (PropertyBase.CheckBase): Moved here from Property and made it work
9055         for indexers.
9056         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9057         the same so we can reuse it there.
9058         (Property, Indexer): Derive from PropertyBase.
9059         (MethodSignature.inheritable_property_signature_filter): New delegate
9060         to find properties and indexers.
9061
9062         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9063         argument and improved error reporting.
9064
9065         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9066         EmptyReadOnlyParameters and made it a property.
9067
9068         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9069         version of this method which takes a `PropertyInfo indexer'.
9070         (TypeManager.RegisterIndexer): New method.
9071
9072         * class.cs: Added myself as author of this file :-)
9073
9074 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9075
9076         * class.cs: fixed compilation on windoze.
9077
9078 2002-08-03  Martin Baulig  <martin@gnome.org>
9079
9080         * interface.cs (Interface.GetInterfaceBases): Check whether all
9081         base interfaces are at least as accessible than the current one.
9082
9083         * class.cs (TypeContainer.GetClassBases): Check whether base types
9084         are at least as accessible than the current type.
9085         (TypeContainer.AsAccessible): Implemented and made non-static.
9086         (MemberBase.CheckParameters): Report errors if the accessibility
9087         checks fail.
9088
9089         * delegate.cs (Delegate.Delegate): The default visibility is
9090         internal for top-level types and private for nested types.
9091         (Delegate.Define): Report errors if the accessibility checks fail.
9092
9093         * enum.cs (Enum.Enum): The default visibility is internal for
9094         top-level types and private for nested types.
9095         (Enum.DefineType): Compute the correct visibility.
9096
9097         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9098         function which takes a `bool is_toplevel' instead of a TypeContainer.
9099
9100         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9101         builtin type.
9102
9103 2002-08-02  Martin Baulig  <martin@gnome.org>
9104
9105         * expression.cs (LocalVariableReferenc): Added constructor which
9106         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9107         (LocalVariableReference.IsReadOnly): New property.
9108         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9109         variable is readonly, use our own readonly flag to do this; you can
9110         use the new constructor to get a writable reference to a read-only
9111         variable.
9112
9113         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9114         reference to the local variable.
9115
9116 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9117
9118         * rootcontext.cs (ResolveCore): Also include System.Exception
9119
9120         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9121         we reach an EmptyStatement.
9122
9123         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9124         is also fine.
9125
9126         * expression.cs (Binary.ResolveOperator): Check error result in
9127         two places.
9128
9129         use brtrue/brfalse directly and avoid compares to null.
9130
9131 2002-08-02  Martin Baulig  <martin@gnome.org>
9132
9133         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9134         Fixes bug #28407, added test-155.cs.
9135
9136 2002-08-01  Martin Baulig  <martin@gnome.org>
9137
9138         * class.cs (Event.EmitDefaultMethod): Make this work with static
9139         events.  Fixes #28311, added verify-3.cs.
9140
9141 2002-08-01  Martin Baulig  <martin@gnome.org>
9142
9143         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9144         `is_disposable' fields.
9145         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9146         `hm.is_disposable' if we're using the collection pattern.
9147         (Foreach.EmitCollectionForeach): Use the correct type for the
9148         enumerator's local variable, only emit the try/finally block if
9149         necessary (fixes #27713).
9150
9151 2002-08-01  Martin Baulig  <martin@gnome.org>
9152
9153         * ecore.cs (Expression.report118): Renamed to Error118 and made
9154         it public static.
9155
9156         * statement.cs (Throw.Resolve): Check whether the expression is of
9157         the correct type (CS0118) and whether the type derives from
9158         System.Exception (CS0155).
9159         (Catch.Resolve): New method.  Do the type lookup here and check
9160         whether it derives from System.Exception (CS0155).
9161         (Catch.CatchType, Catch.IsGeneral): New public properties.
9162
9163         * typemanager.cs (TypeManager.exception_type): Added.
9164
9165 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9166
9167         * driver.cs: Updated About function.
9168
9169 2002-07-31  Martin Baulig  <martin@gnome.org>
9170
9171         Implemented Control Flow Analysis.
9172
9173         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9174         (EmitContext.CurrentBranching): Added.
9175         (EmitContext.StartFlowBranching): Added.
9176         (EmitContext.EndFlowBranching): Added.
9177         (EmitContext.KillFlowBranching): Added.
9178         (EmitContext.IsVariableAssigned): Added.
9179         (EmitContext.SetVariableAssigned): Added.
9180         (EmitContext.IsParameterAssigned): Added.
9181         (EmitContext.SetParameterAssigned): Added.
9182         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9183         Added control flow analysis stuff here.
9184
9185         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9186         resolve the expression as lvalue.
9187         (LocalVariableReference.DoResolve): Check whether the variable has
9188         already been assigned.
9189         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9190         the parameter as assigned here.
9191         (ParameterReference.DoResolve): Check whether the parameter has already
9192         been assigned.
9193         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9194         expression as lvalue.
9195
9196         * statement.cs (FlowBranching): New class for the flow analysis code.
9197         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9198         (LabeledStatement.IsDefined): New public property.
9199         (LabeledStatement.AddUsageVector): New public method to tell flow
9200         analyis that the label may be reached via a forward jump.
9201         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9202         flow analysis.
9203         (VariableInfo.Number): New public field.  This is used by flow analysis
9204         to number all locals of a block.
9205         (Block.CountVariables): New public property.  This is the number of
9206         local variables in this block (including the locals from all parent
9207         blocks).
9208         (Block.EmitMeta): Number all the variables.
9209
9210         * statement.cs: Added flow analysis support to all classes.
9211
9212 2002-07-31  Martin Baulig  <martin@gnome.org>
9213
9214         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9215         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9216         then use this argument.
9217
9218         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9219
9220         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9221         use this to specify /define options.
9222
9223 2002-07-29  Martin Baulig  <martin@gnome.org>
9224
9225         * statement.cs (Fixed): Moved all code that does variable lookups
9226         and resolvings from Emit to Resolve.
9227
9228         * statement.cs (For): Moved all code that does variable lookups
9229         and resolvings from Emit to Resolve.
9230
9231         * statement.cs (Using): Moved all code that does variable lookups
9232         and resolvings from Emit to Resolve.
9233
9234 2002-07-29  Martin Baulig  <martin@gnome.org>
9235
9236         * attribute.cs (Attribute.Resolve): Explicitly catch a
9237         System.NullReferenceException when creating the
9238         CustromAttributeBuilder and report a different warning message.
9239
9240 2002-07-29  Martin Baulig  <martin@gnome.org>
9241
9242         * support.cs (ParameterData.ParameterName): Added method to
9243         get the name of a parameter.
9244
9245         * typemanager.cs (TypeManager.IsValueType): New public method.
9246
9247 2002-07-29  Martin Baulig  <martin@gnome.org>
9248
9249         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9250         is a flag which specifies that it's either ref or out.
9251         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9252         the out parameter to `out Parameter.Modifier mod', also set the
9253         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9254
9255         * support.cs (InternalParameters.ParameterModifier): Distinguish
9256         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9257         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9258
9259         * expression.cs (Argument.GetParameterModifier): Distinguish
9260         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9261         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9262
9263 2002-07-29  Martin Baulig  <martin@gnome.org>
9264
9265         * expression.cs (ParameterReference.ParameterReference): Added
9266         `Location loc' argument to the constructor.
9267
9268         * cs-parser.jay: Pass location to ParameterReference.
9269
9270 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9271
9272         * statement.cs (Try): Initialize the location.
9273
9274         * cs-parser.jay: pass location to Try.
9275
9276         * expression.cs (Unary.Reduce): Change the prototype to return
9277         whether a constant fold could be performed or not.  The result is
9278         returned in an out parameters.  In the case of Indirection and
9279         AddressOf, we want to perform the full tests.
9280
9281 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9282
9283         * statement.cs (Statement.Emit): Flag dead code.
9284
9285 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9286
9287         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9288
9289 2002-07-27  Martin Baulig  <martin@gnome.org>
9290
9291         * class.cs (MethodData.Define): Put back call to
9292         TypeManager.AddMethod(), accidentally commented this out.
9293
9294         * report.cs (Debug): New public method to print debugging information,
9295         this is `[Conditional ("DEBUG")]'.
9296
9297 2002-07-26  Martin Baulig  <martin@gnome.org>
9298
9299         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9300         (switch_statement): Push the current_block to the switch_stack and
9301         pop it again when we're done with the switch.
9302         (switch_section): The new block is a child of the current_block.
9303         Fixes bug #24007, added test-152.cs.
9304
9305 2002-07-27  Martin Baulig  <martin@gnome.org>
9306
9307         * expression.cs (Invocation.EmitArguments): When calling a varargs
9308         function with only its fixed arguments, we need to pass an empty
9309         array.
9310
9311 2002-07-27  Martin Baulig  <martin@gnome.org>
9312
9313         Mono 0.13 has been released.
9314
9315 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9316
9317         * driver.cs: Rename --resource to --linkres, because that is what
9318         we do currently, we dont support --resource yet.
9319
9320         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9321
9322 2002-07-25  Martin Baulig  <martin@gnome.org>
9323
9324         * class.cs (MethodData): New public class.  This is a `method builder'
9325         class for a method or one accessor of a Property/Indexer/Event.
9326         (MethodData.GetMethodFlags): Moved here from MemberBase.
9327         (MethodData.ApplyAttributes): Likewise.
9328         (MethodData.ApplyObsoleteAttribute): Likewise.
9329         (MethodData.ApplyConditionalAttribute): Likewise.
9330         (MethodData.ApplyDllImportAttribute): Likewise.
9331         (MethodData.CheckAbstractAndExternal): Likewise.
9332         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9333         (MethodData.Emit): Formerly known as Method.Emit().
9334         (MemberBase): Moved everything which was specific to a single
9335         accessor/method to MethodData.
9336         (Method): Create a new MethodData and call Define() and Emit() on it.
9337         (Property, Indexer, Event): Create a new MethodData objects for each
9338         accessor and call Define() and Emit() on them.
9339
9340 2002-07-25  Martin Baulig  <martin@gnome.org>
9341
9342         Made MethodCore derive from MemberBase to reuse the code from there.
9343         MemberBase now also checks for attributes.
9344
9345         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9346         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9347         as virtual.
9348         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9349         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9350         (MemberBase.ApplyAttributes): New virtual method; applies the
9351         attributes to a method or accessor.
9352         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9353         (MemberBase.ApplyConditionalAttribute): Likewise.
9354         (MemberBase.ApplyDllImportAttribute): Likewise.
9355         (MemberBase.CheckAbstractAndExternal): Likewise.
9356         (MethodCore.ParameterTypes): This is now a property instead of a
9357         method, it's initialized from DoDefineParameters().
9358         (MethodCore.ParameterInfo): Removed the set accessor.
9359         (MethodCore.DoDefineParameters): New protected virtual method to
9360         initialize ParameterTypes and ParameterInfo.
9361         (Method.GetReturnType): We can now simply return the MemberType.
9362         (Method.GetMethodFlags): Override the MemberBase version and add
9363         the conditional flags.
9364         (Method.CheckBase): Moved some code from Define() here, call
9365         DoDefineParameters() here.
9366         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9367         here to avoid some larger code duplication.
9368         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9369         ensure that abstract and external accessors don't declare a body.
9370
9371         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9372         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9373         lookup in the attribute's parent classes, so we need to abort as soon
9374         as we found the first match.
9375         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9376         the attribute has no arguments.
9377
9378         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9379         of a Method.
9380
9381 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9382
9383         * cs-parser.jay: reverted previous patch.
9384
9385 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9386
9387         * cs-parser.jay: fixed bug #22119.
9388
9389 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9390
9391         * attribute.cs: fixed compilation. The error was:
9392         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9393         be assigned to before control leaves the current method."
9394         [FIXME:  Filed as bug #28186: MCS must report this error.]
9395
9396 2002-07-25  Martin Baulig  <martin@gnome.org>
9397
9398         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9399         method to pull the condition name ouf of a Conditional attribute.
9400         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9401         the obsolete message and error flag out of an Obsolete attribute.
9402
9403         * class.cs (Method.GetMethodFlags): New public method to get the
9404         TypeManager.MethodFlags for this method.
9405         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9406         private methods.
9407         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9408         if we're overriding a virtual function, set the new private variable
9409         `parent_method'; call the new TypeManager.AddMethod().
9410
9411         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9412         the MethodBuilder and the Method in a PtrHashtable.
9413         (TypeManager.builder_to_method): Added for this purpose.
9414         (TypeManager.MethodFlags): Added IsObsoleteError.
9415         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9416         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9417         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9418         the message from the attribute.
9419
9420 2002-07-24  Martin Baulig  <martin@gnome.org>
9421
9422         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9423         preprocessor directives, ensure that the argument to #define/#undef is
9424         exactly one identifier and that it's actually an identifier.
9425
9426         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9427         did not work ....
9428
9429 2002-07-24  Martin Baulig  <martin@gnome.org>
9430
9431         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9432         initialize it to TypeManager.object_type in the constructor.
9433         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9434         of the `hm.get_current' method if we're using the collection pattern.
9435         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9436         for the explicit conversion to make it work when we're using the collection
9437         pattern and the `Current' property has a different return type than `object'.
9438         Fixes #27713.
9439
9440 2002-07-24  Martin Baulig  <martin@gnome.org>
9441
9442         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9443         does not match, but don't report any errors.  This method is called in
9444         order for all methods in a MethodGroupExpr until a matching method is
9445         found, so we don't want to bail out if the first method doesn't match.
9446         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9447         matches, report the 123.  Fixes #28070.
9448
9449 2002-07-24  Martin Baulig  <martin@gnome.org>
9450
9451         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9452         TypeManager.TypeToCoreType() to the top of the method so the
9453         following equality checks will work.  Fixes #28107.
9454
9455 2002-07-24  Martin Baulig  <martin@gnome.org>
9456
9457         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9458         operand is of type uint, and the other operand is of type sbyte,
9459         short or int, the operands are converted to type long." -
9460         Actually do what this comment already told us.  Fixes bug #28106,
9461         added test-150.cs.
9462
9463 2002-07-24  Martin Baulig  <martin@gnome.org>
9464
9465         * class.cs (MethodBase): New abstract class.  This is now a base
9466         class for Property, Indexer and Event to avoid some code duplication
9467         in their Define() and DefineMethods() methods.
9468         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
9469         generic methods for Define() and DefineMethods().
9470         (FieldBase): Derive from MemberBase, not MemberCore.
9471         (Property): Derive from MemberBase, not MemberCore.
9472         (Property.DefineMethod): Moved all the code from this method to the
9473         new MethodBase.DefineAccessor(), just call it with appropriate
9474         argumetnts.
9475         (Property.Define): Call the new Property.DoDefine(), this does some
9476         sanity checks and we don't need to duplicate the code everywhere.
9477         (Event): Derive from MemberBase, not MemberCore.
9478         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
9479         accessors, this will also make them work with interface events.
9480         (Indexer): Derive from MemberBase, not MemberCore.
9481         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
9482         (Indexer.Define): Use the new MethodBase functions.
9483
9484         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
9485         argument to the constructor.
9486         (Interface.FindMembers): Added support for interface events.
9487         (Interface.PopluateEvent): Implemented.
9488
9489         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9490
9491 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9492
9493         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9494         but this is required to check for a method name being the same as
9495         the containing class.  
9496
9497         Handle this now.
9498
9499 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9500
9501         * interface.cs: initialize variable.
9502
9503 2002-07-23  Martin Baulig  <martin@gnome.org>
9504
9505         Implemented the IndexerName attribute in interfaces.
9506
9507         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9508         name if this is an explicit interface implementation.
9509         (Indexer.InterfaceIndexerName): New public variable.  If we're
9510         implementing an interface indexer, this is the IndexerName in that
9511         interface.  Otherwise, it's the IndexerName.
9512         (Indexer.DefineMethod): If we're implementing interface indexer,
9513         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9514         and Pending.ImplementIndexer methods.
9515         (Indexer.Define): Also define the PropertyBuilder if we're
9516         implementing an interface indexer and this is neither an explicit
9517         interface implementation nor do the IndexerName match the one in
9518         the interface.
9519
9520         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9521         If a method is defined here, then we always need to create a proxy
9522         for it.  This is used when implementing interface indexers.
9523         (Pending.IsInterfaceIndexer): New public method.
9524         (Pending.ImplementIndexer): New public method.
9525         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9526         This is used when implementing interface indexers to define a proxy
9527         if necessary.
9528         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9529         define a proxy if necessary.
9530
9531         * interface.cs (Interface.IndexerName): New public variable.
9532         (Interface.PopulateIndexer): Set the IndexerName.
9533         (Interface.DefineIndexers): New private method.  Populate all the
9534         indexers and make sure their IndexerNames match.
9535
9536         * typemanager.cs (IndexerPropertyName): Added support for interface
9537         indexers.
9538
9539 2002-07-22  Martin Baulig  <martin@gnome.org>
9540
9541         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9542         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9543         ret if HasReturnLabel.
9544         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9545         variables.
9546
9547         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9548         and set the ec.LoopBeginTryCatchLevel.
9549         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9550         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9551         the current ec.TryCatchLevel, the branch goes out of an exception
9552         block.  In this case, we need to use Leave and not Br.
9553
9554 2002-07-22  Martin Baulig  <martin@gnome.org>
9555
9556         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9557         block unless the block does not always return or it is contained in
9558         another try { ... } catch { ... } block.  Fixes bug #26506.
9559         Added verify-1.cs to the test suite.
9560
9561 2002-07-22  Martin Baulig  <martin@gnome.org>
9562
9563         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9564         then we do not always return.  Fixes bug #24985.
9565
9566 2002-07-22  Martin Baulig  <martin@gnome.org>
9567
9568         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9569         lookup on a per-class level; ie. walk up the class hierarchy until we
9570         found at least one applicable method, then choose the best among them.
9571         Fixes bug #24463 and test-29.cs.
9572
9573 2002-07-22  Martin Baulig  <martin@gnome.org>
9574
9575         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9576         return types of the methods.  The return type is not part of the
9577         signature and we must not check it to make the `new' modifier work.
9578         Fixes bug #27999, also added test-147.cs.
9579         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9580
9581         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9582         on the method's return type.
9583
9584 2002-07-21  Martin Baulig  <martin@gnome.org>
9585
9586         * assign.cs: Make this work if the rightmost source is a constant and
9587         we need to do an implicit type conversion.  Also adding a few more tests
9588         to test-38.cs which should have caught this.
9589
9590         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9591         target in the makefile for this.  The makefile.gnu is primarily intended
9592         for end-users who don't want to debug the compiler.
9593
9594 2002-07-21  Martin Baulig  <martin@gnome.org>
9595
9596         * assign.cs: Improved the Assign class so it can now handle embedded
9597         assignments (X = Y = Z = something).  As a side-effect this'll now also
9598         consume less local variables.  test-38.cs now passes with MCS, added
9599         a few new test cases to that test.
9600
9601 2002-07-20  Martin Baulig  <martin@gnome.org>
9602
9603         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
9604         instructions.  Fixes bug #27977, also added test-146.cs.
9605
9606 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9607
9608         * cs-tokenizer.cs: fixed getHex ().
9609
9610 2002-07-19  Martin Baulig  <martin@gnome.org>
9611
9612         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
9613         not Type.GetType() to lookup the array type.  This is needed when
9614         we're constructing an array of a user-defined type.
9615         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
9616         single-dimensional arrays, but also for single-dimensial arrays of
9617         type decimal.
9618
9619 2002-07-19  Martin Baulig  <martin@gnome.org>
9620
9621         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
9622         this function is called, it's not allowed to share LocalBuilders
9623         among ILGenerators.
9624
9625 2002-07-19  Martin Baulig  <martin@gnome.org>
9626
9627         * expression.cs (Argument.Resolve): Report an error 118 when trying
9628         to pass a type as argument.
9629
9630 2002-07-18  Martin Baulig  <martin@gnome.org>
9631
9632         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
9633         Conv_R_Un for the signed `long' type.
9634
9635 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
9636
9637         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
9638         `expr' for the temporary result, as that will fail if we do
9639         multiple resolves on the same expression.
9640
9641 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
9642
9643         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
9644         ec.TypeContainer for looking up aliases. 
9645
9646         * class.cs (TypeContainer): Remove LookupAlias from here.
9647
9648         * decl.cs (DeclSpace); Move here.
9649
9650 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
9651
9652         * class.cs (FindMembers): Only call filter if the constructor
9653         bulider is not null.
9654
9655         Also handle delegates in `NestedTypes' now.  Now we will perform
9656         type lookups using the standard resolution process.  This also
9657         fixes a bug.
9658
9659         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
9660         This uses Expressions (the limited kind that can be parsed by the
9661         tree) instead of strings.
9662
9663         * expression.cs (ComposedCast.ToString): Implement, used to flag
9664         errors since now we have to render expressions.
9665
9666         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
9667         FormArrayType. 
9668
9669         * ecore.cs (SimpleName.ToString): ditto.
9670
9671         * cs-parser.jay: Instead of using strings to assemble types, use
9672         Expressions to assemble the type (using SimpleName, ComposedCast,
9673         MemberAccess).  This should fix the type lookups in declarations,
9674         because we were using a different code path for this.
9675
9676         * statement.cs (Block.Resolve): Continue processing statements
9677         even when there is an error.
9678
9679 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
9680
9681         * class.cs (Event.Define): Also remove the `remove' method from
9682         the list of pending items.
9683
9684         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
9685         generate more compact code. 
9686
9687 2002-07-17  Martin Baulig  <martin@gnome.org>
9688
9689         * const.cs (Const.LookupConstantValue): Add support for constant
9690         `unchecked' and `checked' expressions.
9691         Also adding test case test-140.cs for this.
9692
9693 2002-07-17  Martin Baulig  <martin@gnome.org>
9694
9695         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
9696         check whether mi.ReturnType implements the IEnumerator interface; the
9697         `==' and the IsAssignableFrom() will fail in this situation.
9698
9699 2002-07-16  Ravi Pratap  <ravi@ximian.com>
9700
9701         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
9702         here too.
9703
9704 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9705
9706         * expression.cs: fixed bug #27811.
9707
9708 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
9709
9710         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
9711         Molaro: when we are a ref, the value already contains a pointer
9712         value, do not take the address of it.
9713
9714 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
9715         * removed mb-parser.jay and mb-tokenizer.cs
9716
9717 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9718
9719         * expression.cs: check against the building corlib void type.
9720
9721 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
9722
9723         * ecore.cs: fix for valuetype static readonly fields: when 
9724         initializing them, we need their address, not the address of a copy.
9725
9726 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
9727
9728         * typemanager.cs: register also enum_type in corlib.
9729
9730 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9731
9732         * class.cs: allow calling this (but not base) initializers in structs.
9733
9734 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
9735
9736         * ecore.cs: make sure we compare against the building base types
9737         in GetTypeSize ().
9738
9739 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
9740
9741         * typemanager.cs: fix TypeToCoreType() to handle void and object
9742         (corlib gets no more typerefs after this change).
9743
9744 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
9745
9746         * expression.cs (ArrayCreation.EmitArrayArguments): use
9747         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
9748
9749         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
9750         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
9751         array indexes, the runtime actually forbids them.
9752
9753         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
9754         for array arguments here.
9755
9756         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
9757         instead of the default for ValueTypes.
9758
9759         (New.DoEmit): Use IsValueType instead of
9760         IsSubclassOf (value_type)
9761         (New.DoResolve): ditto.
9762         (Invocation.EmitCall): ditto.
9763
9764         * assign.cs (Assign): ditto.
9765
9766         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
9767         Statements *are* currently doing part of their resolution during
9768         Emit.  
9769
9770         Expressions do always resolve during resolve, but statements are
9771         only required to propagate resolution to their children.
9772
9773 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
9774
9775         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
9776
9777         (LoadAssembly): Do not add the dll if it is already specified
9778
9779         (MainDriver): Add the System directory to the link path at the end,
9780         after all the other -L arguments. 
9781
9782         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
9783         wrong opcode for loading bytes and bools (ldelem.i1 instead of
9784         ldelem.u1) and using the opposite for sbytes.
9785
9786         This fixes Digger, and we can finally run it.
9787
9788         * driver.cs (UnixParseOption): Move the option parsing here.  
9789         (CSCParseOption): Implement CSC-like parsing of options.
9790
9791         We now support both modes of operation, the old Unix way, and the
9792         new CSC-like way.  This should help those who wanted to make cross
9793         platform makefiles.
9794
9795         The only thing broken is that /r:, /reference: and /lib: are not
9796         implemented, because I want to make those have the same semantics
9797         as the CSC compiler has, and kill once and for all the confussion
9798         around this.   Will be doing this tomorrow.
9799
9800         * statement.cs (Unsafe.Resolve): The state is checked during
9801         resolve, not emit, so we have to set the flags for IsUnsfe here.
9802
9803 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9804
9805         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
9806         not catch the Error_ObjectRefRequired in SimpleName (as it is
9807         possible to have a class/instance variable name that later gets
9808         deambiguated), we have to check this here.      
9809
9810 2002-07-10  Ravi Pratap  <ravi@ximian.com>
9811
9812         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
9813         make static and put into Expression.
9814
9815         (Event.Define): Register the private field of the event with the 
9816         TypeManager so that GetFieldFromEvent can get at it.
9817
9818         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
9819         keep track of the private field associated with an event which
9820         has no accessors.
9821
9822         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
9823         private field.
9824
9825         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
9826
9827 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9828
9829         * expression.cs (Binary.EmitBranchable): this routine emits the
9830         Binary expression in a branchable context.  This basically means:
9831         we need to branch somewhere, not just get the value on the stack.
9832
9833         This works together with Statement.EmitBoolExpression.
9834
9835         * statement.cs (Statement.EmitBoolExpression): Use
9836         EmitBranchable. 
9837
9838 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
9839
9840         * statement.cs (For): Reduce the number of jumps in loops.
9841
9842         (For): Implement loop inversion for the For statement.
9843
9844         (Break): We can be breaking out of a Try/Catch controlled section
9845         (foreach might have an implicit try/catch clause), so we need to
9846         use Leave instead of Br.
9847
9848         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
9849         now).  If the instace expression supports IMemoryLocation, we use
9850         the AddressOf method from the IMemoryLocation to extract the
9851         address instead of emitting the instance.
9852
9853         This showed up with `This', as we were emitting the instance
9854         always (Emit) instead of the Address of This.  Particularly
9855         interesting when This is a value type, as we dont want the Emit
9856         effect (which was to load the object).
9857
9858 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
9859
9860         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
9861
9862         * statement.cs (Checked): Set the CheckedState during the resolve
9863         process too, as the ConvCast operations track the checked state on
9864         the resolve process, and not emit.
9865
9866         * cs-parser.jay (namespace_member_declaration): Flag that we have
9867         found a declaration when we do.  This is used to flag error 1529
9868
9869         * driver.cs: Report ok when we display the help only.
9870
9871 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
9872
9873         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
9874
9875 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
9876
9877         * cs-tokenizer.cs (define): We also have to track locally the
9878         defines.  AllDefines is just used for the Conditional Attribute,
9879         but we also need the local defines for the current source code. 
9880
9881 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
9882
9883         * statement.cs (While, For, Do): These loops can exit through a
9884         Break statement, use this information to tell whether the
9885         statement is the last piece of code.
9886
9887         (Break): Flag that we break.
9888
9889         * codegen.cs (EmitContexts): New `Breaks' state variable.
9890
9891 2002-07-03  Martin Baulig  <martin@gnome.org>
9892
9893         * class.cs (TypeContainer.MethodModifiersValid): Allow override
9894         modifiers in method declarations in structs.  Otherwise, you won't
9895         be able to override things like Object.Equals().
9896
9897 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9898
9899         * class.cs (Method, Property, Indexer): Do not allow the public
9900         modifier to be used in explicit interface implementations.
9901
9902         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
9903         override modifiers in method declarations in structs
9904
9905 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
9906
9907         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
9908         integer or real overflow, report an error
9909
9910 2002-07-02  Martin Baulig  <martin@gnome.org>
9911
9912         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
9913         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
9914         to tell the runtime about our newly created System.Object and
9915         System.ValueType types.
9916
9917 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9918
9919         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
9920         struct instead of Ldarg/Starg.
9921
9922 2002-07-02  Martin Baulig  <martin@gnome.org>
9923
9924         * expression.cs (Indirection.Indirection): Call
9925         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
9926
9927 2002-07-02  Martin Baulig  <martin@gnome.org>
9928
9929         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
9930         ValueType, call TypeManager.TypeToCoreType() on it.
9931         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
9932         the OpCodes.Newarr argument.
9933
9934 2002-07-02  Martin Baulig  <martin@gnome.org>
9935
9936         * expression.cs (Invocation.EmitCall): When compiling corlib,
9937         replace all calls to the system's System.Array type to calls to
9938         the newly created one.
9939
9940         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
9941         System.Array methods.
9942         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
9943         from the system's System.Array type which must be replaced.
9944
9945 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
9946
9947         * typemanager.cs: load unverifiable_code_ctor so we can build
9948         corlib using the correct type. Avoid using GetTypeCode() with
9949         TypeBuilders.
9950         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
9951         TypeManager.object_type to allow building corlib.
9952
9953 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
9954
9955         * ecore.cs: handle System.Enum separately in LoadFromPtr().
9956
9957 2002-07-01  Martin Baulig  <martin@gnome.org>
9958
9959         * class.cs: Make the last change actually work, we need to check
9960         whether `ifaces != null' to avoid a crash.
9961
9962 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9963
9964         * class.cs: when we build structs without fields that implement
9965         interfaces, we need to add the interfaces separately, since there is
9966         no API to both set the size and add the interfaces at type creation
9967         time.
9968
9969 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9970
9971         * expression.cs: the dimension arguments to the array constructors
9972         need to be converted if they are a long.
9973
9974 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
9975
9976         * class.cs: don't emit ldarg.0 if there is no parent constructor
9977         (fixes showstopper for corlib).
9978
9979 2002-06-29  Martin Baulig  <martin@gnome.org>
9980
9981         MCS now compiles corlib on GNU/Linux :-)
9982
9983         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
9984         ie. check for MethodImplOptions.InternalCall.
9985
9986         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
9987         and TypeManager.attribute_type are null, so we must explicitly check
9988         whether parent is not null to find out whether it's an attribute type.
9989         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
9990         and SetBuilder, not only if the property is neither abstract nor external.
9991         This is necessary to set the MethodImplOptions on the accessor methods.
9992         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
9993         SetBuilder, see Property.Emit().
9994
9995         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
9996         populate "System.Object", "System.ValueType" and "System.Attribute" since
9997         they've already been populated from BootCorlib_PopulateCoreTypes().
9998
9999 2002-06-29  Martin Baulig  <martin@gnome.org>
10000
10001         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10002         is the NullLiteral, we also need to make sure that target_type is not
10003         an enum type.   
10004
10005 2002-06-29  Martin Baulig  <martin@gnome.org>
10006
10007         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10008         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10009         before calling BootstrapCorlib_ResolveDelegate ().
10010
10011 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10012
10013         * statement.cs: fixed build-breaker. All tests passed ok.
10014
10015 2002-06-27  Martin Baulig  <martin@gnome.org>
10016
10017         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10018         for System.Decimal when compiling corlib.
10019
10020 2002-06-27  Martin Baulig  <martin@gnome.org>
10021
10022         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10023         switch blocks which contain nothing but a default clause.
10024
10025 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10026
10027        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10028
10029 2002-06-27  Martin Baulig  <martin@gnome.org>
10030
10031         * ecore.cs (PropertyExpr.PropertyExpr): Call
10032         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10033
10034         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10035         is already a TypeBuilder.
10036
10037 2002-06-27  Martin Baulig  <martin@gnome.org>
10038
10039         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10040         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10041         the "from an array-type to System.Array" case.  This makes it work
10042         when compiling corlib.
10043
10044 2002-06-27  Martin Baulig  <martin@gnome.org>
10045
10046         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10047         non-static PropertyExpr, set its InstanceExpression.  This makes
10048         the `ICollection.Count' property work in System/Array.cs.
10049
10050 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10051
10052         * driver.cs: Made error handling more consistent.  Errors now
10053         tracked by Report class, so many methods which used to return int
10054         now return void.  Main() now prints success/failure and 
10055         errors/warnings message.
10056
10057         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10058         the magic number return values (123 and 124).  Now, if the
10059         expected error occurs, the compiler exits with success (exit value
10060         0).  If the compilation completes without seeing that particular
10061         error, the compiler exits with failure (exit value 1).  The
10062         makefile in mcs/errors has been changed to handle the new behaviour.
10063
10064         * report.cs: Made 'expected error' number a property and renamed
10065         it from 'Probe' to 'ExpectedError'.
10066
10067         * genericparser.cs: Removed error handling support, since it is
10068         now all done by Report class.
10069
10070         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10071         class, so parse() no longer returns an int.
10072
10073         * namespace.cs: Use Report.Error instead of GenericParser.error
10074
10075 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10076
10077         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10078         TypeContainer.AddOperator): At the front of the list put the
10079         explicit implementations, so they get resolved/defined first. 
10080
10081 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10082
10083         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10084         interface type is implemented by this TypeContainer.  Used during
10085         explicit interface implementation.
10086
10087         (Property.Define, Indexer.Define, Method.Define): Validate that
10088         the given interface in the explicit implementation is one of the
10089         base classes for the containing type.
10090
10091         Also if we are explicitly implementing an interface, but there is
10092         no match in the pending implementation table, report an error.
10093
10094         (Property.Define): Only define the property if we are
10095         not explicitly implementing a property from an interface.  Use the
10096         correct name also for those properties (the same CSC uses,
10097         although that is really not needed).
10098
10099         (Property.Emit): Do not emit attributes for explicitly implemented
10100         properties, as there is no TypeBuilder.
10101
10102         (Indexer.Emit): ditto.
10103
10104         Hiding then means that we do not really *implement* a pending
10105         implementation, which makes code fail.
10106
10107 2002-06-22  Martin Baulig  <martin@gnome.org>
10108
10109         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10110         the return value of Object.GetType().  [FIXME: we need to do this whenever
10111         we get a type back from the reflection library].
10112
10113 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10114
10115         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10116
10117 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10118
10119         * attribute.cs: Return null if we can not look up the type.
10120
10121         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10122         the interface types found.
10123
10124         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10125         interface types found.
10126
10127         * typemanager.cs (GetInterfaces): Make this routine returns alll
10128         the interfaces and work around the lame differences between
10129         System.Type and System.Reflection.Emit.TypeBuilder in the results
10130         result for GetInterfaces.
10131
10132         (ExpandInterfaces): Given an array of interface types, expand and
10133         eliminate repeated ocurrences of an interface.  This expands in
10134         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10135         be IA, IB, IC.
10136
10137 2002-06-21  Martin Baulig  <martin@gnome.org>
10138
10139         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10140         on System.Enum.
10141
10142 2002-06-21  Martin Baulig  <martin@gnome.org>
10143
10144         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10145         and called with one of the core types, return the corresponding typebuilder for
10146         that type.
10147
10148         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10149         element type.
10150
10151 2002-06-21  Martin Baulig  <martin@gnome.org>
10152
10153         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10154         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10155         (Expression.ConvertReferenceExplicit): Likewise.
10156
10157         * expression.cs (ElementAccess.DoResolve): Likewise.
10158         (ElementAccess.DoResolveLValue): Likewise.
10159
10160 2002-06-10  Martin Baulig  <martin@gnome.org>
10161
10162         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10163         add the "value" parameter to the parameter list.
10164
10165         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10166         to our caller.
10167
10168 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10169
10170         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10171         the argument to an int, uint, long or ulong, per the spec.  Also
10172         catch negative constants in array creation.
10173
10174 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10175
10176         * class.cs: do not allow the same interface to appear twice in
10177         the definition list.
10178
10179 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10180
10181         * ecore.cs: don't use ldlen with System.Array.
10182
10183 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10184
10185         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10186
10187 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10188
10189         * modifiers.cs: produce correct field attributes for protected
10190         internal. Easy fix so miguel can work on ther harder stuff:-)
10191
10192 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10193
10194         * pending.cs: New file.  Move the code from class.cs here.
10195         Support clearning the pending flag for all methods (when not doing
10196         explicit interface implementation).
10197
10198 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10199
10200         * rootcontext.cs: added a couple more types needed to bootstrap.
10201
10202 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10203
10204         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10205         constructor in the type, instead of any constructor in the type
10206         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10207         a bug in the Mono runtime when applying the params attribute). 
10208
10209 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10210         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10211
10212 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10213
10214         * expression.cs (Unary.ResolveOperator): Use TypeManager
10215         to resolve the type.
10216
10217 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10218
10219         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10220         attached.
10221
10222         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10223         with each member too.
10224
10225         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10226         field builders too - this takes care of the enum member case.
10227
10228 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10229
10230         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10231         address-of operator on both value types and pointers.
10232
10233 2002-06-10  Martin Baulig  <martin@gnome.org>
10234
10235         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10236         PropertyBuilder to the `property_builders' list.
10237
10238         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10239         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10240         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10241         find any indexers which are inherited from an interface.
10242
10243 2002-06-09  Martin Baulig  <martin@gnome.org>
10244
10245         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10246         the same type as the constant if necessary.  There's also a test-130.cs
10247         for this.
10248
10249         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10250
10251         * typemanager.cs (TypeManager.ChangeType): Previously known as
10252         Enum.ChangeEnumType().
10253
10254 2002-06-09  Martin Baulig  <martin@gnome.org>
10255
10256         * expression.cs (Cast.TryReduce): Added support for consts.
10257
10258 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10259
10260         * class.cs (Accessor): Hold attributes information so we can pass
10261         it along.
10262
10263         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10264         Modify to pass in attributes attached to the methods.
10265
10266         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10267
10268         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10269         to handle the Accessor kind :-)
10270
10271         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10272
10273 2002-06-08  Martin Baulig  <martin@gnome.org>
10274
10275         * expression.cs (Unary.TryReduceNegative): Added support for
10276         ULongConstants.
10277
10278 2002-06-08  Martin Baulig  <martin@gnome.org>
10279
10280         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10281         name can't be found in the `defined_names' - the caller will do a
10282         MemberLookup in this case and thus find methods in System.Enum
10283         such as Enum.IsDefined().
10284
10285 2002-06-08  Martin Baulig  <martin@gnome.org>
10286
10287         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10288         Convert.ChangeType() which works with TypeBuilder created types.
10289         (Enum.LookupEnumValue, Enum.Define): Use it here.
10290
10291         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10292         `TypeBuilder.BaseType != null' check.
10293         (TypeContainer.FindMembers): Only lookup parent members if we
10294         actually have a parent.
10295         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10296         (ConstructorInitializer.Resolve): Likewise.
10297
10298         * interface.cs (Interface.FindMembers): Added
10299         `TypeBuilder.BaseType != null' check.
10300
10301         * rootcontext.cs (RootContext.ResolveCore): Added
10302         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10303         classes_second_stage.
10304
10305         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10306         debug_type and trace_type when compiling with --nostdlib.       
10307
10308 2002-06-07  Martin Baulig  <martin@gnome.org>
10309
10310         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10311         (AddField): Set it to true when adding a non-static field.
10312         (DefineType): Use `have_nonstatic_fields' to find out whether we
10313         have non-static fields, not `Fields != null'.
10314
10315 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10316
10317         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10318         dereferencing a null on the static-field code path)
10319
10320 2002-05-30  Martin Baulig  <martin@gnome.org>
10321
10322         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10323         to take command line arguments.  Use reflection to call the new
10324         custom `Initialize' function on the symbol writer and pass it the
10325         command line arguments.
10326
10327         * driver.cs (--debug-args): New command line argument to pass command
10328         line arguments to the symbol writer.
10329
10330 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10331
10332         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10333         the target type for indexers and properties.  Thanks to Joe for
10334         catching this.
10335
10336 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10337
10338         * typemanager.cs (MethodFlags): returns the method flags
10339         (Obsolete/ShouldIgnore) that control warning emission and whether
10340         the invocation should be made, or ignored. 
10341
10342         * expression.cs (Invocation.Emit): Remove previous hack, we should
10343         not do this on matching a base type, we should do this based on an attribute
10344
10345         Only emit calls to System.Diagnostics.Debug and
10346         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10347         on the command line.
10348
10349         * rootcontext.cs: Global settings for tracing and debugging.
10350
10351         * cs-tokenizer.cs (define): New utility function to track
10352         defines.   Set the global settings for TRACE and DEBUG if found.
10353
10354 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10355
10356         * interface.cs (Populate*): Pass in the TypeContainer as well as
10357         the DeclSpace as parameters so that we can create EmitContexts and
10358         then use that to apply attributes etc.
10359
10360         (PopulateMethod, PopulateEvent, PopulateProperty)
10361         (PopulateIndexer): Apply attributes everywhere.
10362
10363         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10364         etc.
10365
10366         (ApplyAttributes): Update accordingly.
10367
10368         We now apply interface attributes for all members too.
10369
10370 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10371
10372         * class.cs (Indexer.Define); Correctly check if we are explicit
10373         implementation (instead of checking the Name for a ".", we
10374         directly look up if the InterfaceType was specified).
10375
10376         Delay the creation of the PropertyBuilder.
10377
10378         Only create the PropertyBuilder if we are not an explicit
10379         interface implementation.   This means that explicit interface
10380         implementation members do not participate in regular function
10381         lookups, and hence fixes another major ambiguity problem in
10382         overload resolution (that was the visible effect).
10383
10384         (DefineMethod): Return whether we are doing an interface
10385         implementation. 
10386
10387         * typemanager.cs: Temporary hack until we get attributes in
10388         interfaces (Ravi is working on that) and we get IndexerName
10389         support in interfaces.
10390
10391         * interface.cs: Register the indexers as properties.
10392
10393         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10394         warning, I have verified that this is a bug in the .NET runtime
10395         (JavaScript suffers of the same problem).
10396
10397         * typemanager.cs (MemberLookup): When looking up members for
10398         interfaces, the parent of an interface is the implicit
10399         System.Object (so we succeed in searches of Object methods in an
10400         interface method invocation.  Example:  IEnumerable x;  x.ToString
10401         ()) 
10402
10403 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10404
10405         * class.cs (Event): Events should also register if they do
10406         implement the methods that an interface requires.
10407
10408         * typemanager.cs (MemberLookup); use the new GetInterfaces
10409         method. 
10410
10411         (GetInterfaces): The code used to lookup interfaces for a type is
10412         used in more than one place, factor it here. 
10413
10414         * driver.cs: Track the errors at the bottom of the file, we kept
10415         on going.
10416
10417         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10418         instance if the method we are calling is static!
10419
10420 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10421
10422         * attribute.cs (ApplyAttributes): Make this function filter out
10423         the IndexerName attribute (as that attribute in reality is never
10424         applied) and return the string constant for the IndexerName
10425         attribute. 
10426
10427         * class.cs (TypeContainer.Emit): Validate that all the indexers
10428         have the same IndexerName attribute, and if so, set the
10429         DefaultName attribute on the class. 
10430
10431         * typemanager.cs: The return value might contain other stuff (not
10432         only methods).  For instance, consider a method with an "Item"
10433         property and an Item method.
10434
10435         * class.cs: If there is a problem with the parameter types,
10436         return. 
10437
10438 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10439
10440         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10441         looks at user defined conversion after making a call to 
10442         StandardConversionExists - we need this for overload resolution.
10443
10444         * expression.cs : Update accordingly the various method calls.
10445
10446         This fixes 2 bugs filed against implicit user defined conversions 
10447
10448 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10449
10450         * statement.cs: Track the result of the assignment.
10451
10452 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10453
10454         * expression.cs (MemberAccess): Improved error reporting for
10455         inaccessible members.
10456
10457 2002-05-22  Martin Baulig  <martin@gnome.org>
10458
10459         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10460         itself with debugging support.
10461
10462 2002-05-22  Martin Baulig  <martin@gnome.org>
10463
10464         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10465         Removed, this isn't needed anymore.
10466
10467 2002-05-20  Martin Baulig  <martin@gnome.org>
10468
10469         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
10470         be underlying type for an enum.
10471
10472 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
10473
10474         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
10475         that splits out the loading of just the core types.
10476
10477         * rootcontext.cs (ResolveCore): Split the struct resolution in
10478         two, so we can load the enumeration underlying types before any
10479         enums are used.
10480
10481         * expression.cs (Is): Bandaid until we fix properly Switch (see
10482         bug #24985 for details).
10483
10484         * typemanager.cs (ImplementsInterface): The hashtable will contain
10485         a null if there are no interfaces implemented.
10486
10487 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
10488
10489         * cs-parser.jay (indexer_declarator): It is fine to have array
10490         parameters
10491
10492 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10493
10494         * typemanager.cs: (RegisterBuilder): New function used to register
10495         TypeBuilders that implement interfaces.  Since
10496         TypeBuilder.GetInterfaces (as usual) does not work with lame
10497         Reflection.Emit. 
10498         (AddUserType): register interfaces.
10499
10500         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10501         dealing with TypeBuilder.  Also, arrays are showing up as
10502         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10503         methods can not be invoked on them!
10504
10505         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10506         (ImplicitReferenceConversionExists): Split out from
10507         StandardConversionExists. 
10508
10509         * expression.cs (As): We were only implementing one of the three
10510         cases for the as operator.  We now implement them all.
10511         (Is): Implement the various other cases for Is as well.
10512
10513         * typemanager.cs (CACHE): New define used to control if we want or
10514         not the FindMembers cache.  Seems to have a negative impact on
10515         performance currently
10516
10517         (MemberLookup): Nested types have full acess to
10518         enclosing type members
10519
10520         Remove code that coped with instance/static returns for events, we
10521         now catch this in RealFindMembers.
10522
10523         (RealFindMembers): only perform static lookup if the instance
10524         lookup did not return a type or an event.  
10525
10526 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10527
10528         * assign.cs (CompoundAssign): We pass more semantic information
10529         now to Compound Assignments than we did before: now we have all
10530         the information at hand, and now we resolve the target *before* we
10531         do the expression expansion, which allows the "CacheValue" method
10532         to have the effect we intended (before, a [x] += 1 would generate
10533         two differen ArrayAccess expressions from the ElementAccess,
10534         during the resolution process).
10535
10536         (CompoundAssign.DoResolve): Resolve target and original_source here.
10537
10538 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10539
10540         * expression.cs (ArrayAccess): dropped debugging information. 
10541
10542         * typemanager.cs: Small bug fix: I was always returning i_members,
10543         instead of one of i_members or s_members (depending on which had
10544         the content).
10545
10546         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10547         method is invoked before any code generation takes place, and it
10548         is a mechanism to inform that the expression will be invoked more
10549         than once, and that the method should use temporary values to
10550         avoid having side effects
10551
10552         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10553
10554         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10555         implementation.
10556
10557         * expression.cs (Indirection, ArrayAccess): Add support for
10558         CacheTemporaries in these two bad boys. 
10559
10560         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10561         ldobj or ldind_ref.  
10562         (StoreFromPtr): Handle stobj as well.
10563
10564         * expression.cs (UnaryMutator): Share more code.
10565
10566         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10567         down: I was not tracking the Filter function as well, which
10568         was affecting the results of the cache.
10569
10570 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10571
10572         * attribute.cs: Remove the hack to handle the CharSet property on
10573         StructLayouts. 
10574
10575 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10576
10577         * attribute.cs (DoResolve): More uglyness, we now only try to
10578         resolve the attribute partially, to extract the CharSet
10579         information (only if we are a StructLayout attribute).  Otherwise 
10580
10581         (GetExtraTypeInfo): Add some code to conditionally kill in the
10582         future this.   I am more and more convinced that the .NET
10583         framework has special code to handle the attribute setting on
10584         certain elements.
10585
10586         * expression.cs (IsParamsMethodApplicable): Revert my previous
10587         foreach change here, it was wrong.
10588
10589 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10590
10591         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10592         (pp_expr): do not abort on unknown input, just return.
10593         (eval): abort if there are pending chars.
10594
10595         * attribute.cs (Attribute.Resolve): Positional parameters are
10596         optional.  Deal with that case.
10597
10598         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10599         the Ansi/Unicode/Auto information for the type.
10600
10601         (TypeContainer.DefineType): instantiate the EmitContext here, as
10602         we will be using it during the type definition (to resolve
10603         attributes) and during the emit phase.
10604
10605         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
10606         to pull type information out of the attributes
10607
10608         (Attribute.Resolve): track the constructor builder, and allow for
10609         multiple invocations (structs and classes will use this).
10610
10611         * ecore.cs (MemberLookupFinal): new version with all the
10612         parameters customizable.
10613
10614         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
10615         constructors.  Return if the result value is null (as the error
10616         would have been flagged already by MemberLookupFinal)
10617
10618         Do not allow instances of abstract classes or interfaces to be
10619         created.
10620
10621         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
10622         We have to compare the assembly property here when dealing with
10623         FamANDAssem and Assembly access modifiers, because we might be
10624         creating an assembly from *modules* (that means that we are not
10625         getting TypeBuilders for types defined in other modules that are
10626         part of this assembly).
10627
10628         (Method.Emit): If the method is marked abstract and has a body,
10629         emit an error. 
10630
10631         (TypeContainer.DefineMembers): If both the defined member and the
10632         parent name match are methods, then do not emit any warnings: let
10633         the Method.Define routine take care of flagging warnings.  But if
10634         there is a mismatch (method overrides something else, or method is
10635         overriwritten by something, then emit warning).
10636
10637         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
10638         set to null, this means `do not check for the return type on the
10639         signature'. 
10640
10641         (Method.Define): set the return type for the method signature to
10642         null, so that we get methods with the same name and parameters and
10643         different return types.  This is used to flag warning 114 (you are
10644         hiding a method, and you probably want to use the new/override
10645         keywords instead).
10646
10647         * typemanager.cs (MemberLookup): Implemented proper access
10648         control, closing a long standing set of bug reports.  The problem
10649         was that the Framework only has two bits: Public and NonPublic,
10650         and NonPublic includes private and protected methods, but we need
10651         to enforce the FamANDAssem, FamOrAssem and Family. 
10652
10653 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
10654
10655         * statement.cs (GotoCase): Return true: Ammounts to giving up
10656         knowledge on whether we return or not, and letting the other case
10657         be responsible for it.
10658
10659 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
10660
10661         * driver.cs: Do not load directories for each file processed, only
10662         do it if there is a pattern.
10663
10664         * ecore.cs: Report readonly assigns here as well, as we might have
10665         been resolved only by MemberAccess.
10666
10667         (SimpleName.SimpleNameResolve): Also be useful for LValue
10668         resolution.   We need this to propagate assign to local readonly variables
10669
10670         * typemanager.cs: Use a ptrhashtable for the criteria, because we
10671         do not want to reuse potential criteria memory.
10672
10673         * class.cs (MyEventBuilder): Set reflected_type;
10674
10675         * ecore.cs (Constantify): Added support for constifying bools.
10676
10677         (RootContext.LookupType): Added a cache for values looked up in
10678         the declaration space.
10679
10680         * typemanager.cs (FindMembers): Now is a front-end to
10681         RealFindMembers, and provides a two-level hashtable-based cache to
10682         the request.  
10683
10684         15% performance improvement: from 22.5 to 19.2 seconds.
10685
10686         * expression.cs (IsParamsMethodApplicable): use foreach.
10687         (Invocation.DoResolve): ditto.
10688         (New.DoResolve): ditto.
10689         (ArrayCreation.DoResolve): ditto.
10690
10691         * ecore.cs (FindMostEncompassingType): use foreach.
10692
10693         * delegate.cs (NewDelegate.DoResolve): Use foreach
10694
10695         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
10696         (RemoveMethods): use foreach.
10697
10698         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
10699         nested foreach statements instead of for, and also break out of
10700         the inner loop once a match is found.
10701
10702         (Invocation.OverloadResolve): Use foreach, simplify the code. 
10703
10704 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
10705
10706         * cfold.cs (BinaryFold): During an enumeration evaluation context,
10707         we actually unwrap the expression to allow for extra information
10708         to be extracted. 
10709
10710         * expression.cs: Use Shr_Un on unsigned operations. 
10711
10712 2002-05-08  Ravi Pratap  <ravi@ximian.com>
10713
10714         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
10715         applicable operators was not being considered correctly. This closes
10716         the bug Miguel reported.
10717
10718 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
10719
10720         * attribute.cs: check that the type derives from System.Attribute
10721         and report the correct error in that case (moved the duplicate code to
10722         its own method, too).
10723
10724 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
10725
10726         * attribute.cs: lookup attribute type name as the spec says: first the
10727         bare attribute name and then name + "Attribute" (nant compiles with
10728         mcs after this fix).
10729
10730 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
10731
10732         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
10733         Because of the way we parse things, we should try to see if a
10734         UIntConstant can fit in an integer.
10735
10736 2002-05-07  Ravi Pratap  <ravi@ximian.com>
10737
10738         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
10739         when we are in an explicit context.
10740
10741         (ConvertReferenceExplicit): When converting from Iface type S to Class
10742         T make sure the rules are implemented as an OR.
10743
10744         * parameter.cs (ParameterType): Make it a property for now although the
10745         purpose really isn't anything immediate.
10746
10747         * expression.cs (Is*Applicable): Do better checking on the parameter type
10748         of a ref/out parameter. The ones from the system assemblies are already 
10749         marked with the correct type so we don't need to do any correction.
10750
10751         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
10752         the object type is standard too so include that.
10753
10754 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10755
10756         * ecore.cs (StandardConversionExists): Augment with missing code:
10757         deal with IntConstant, LongConstants and Enumerations.
10758
10759         * assign.cs: Report the error, instead of failing silently
10760
10761         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
10762         typecontainer that they are declared, because the
10763         typecontainer/namespace will have the list of using clauses that
10764         need to be applied.
10765
10766         Assembly Attributes were escaping the normal registration
10767         mechanism. 
10768
10769         (EmitCode): Apply attributes within an EmitContext that represents
10770         the container they were declared on.
10771
10772         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
10773
10774 2002-05-06  Ravi Pratap  <ravi@ximian.com>
10775
10776         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
10777         Revamp completely - make much cleaner as we now operate only
10778         on a set of Types.
10779
10780         (FindMostSpecificSource, FindMostSpecificTarget): New methods
10781         to implement the logic detailed in the spec more correctly.
10782
10783         (UserDefinedConversion): Update accordingly.
10784
10785 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10786
10787         * statement.cs: Return flow analysis information up.
10788
10789         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
10790         and the default.
10791
10792         (token): Do not consume an extra character before calling
10793         decimal_digits.
10794
10795 2002-05-06  Piers Haken <piersh@friskit.com>
10796
10797         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
10798
10799 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10800
10801         * class.cs (Constructor.Emit): Set the IsStatic flag in the
10802         EmitContext during the instance constructor initializer
10803         resolution, to stop access to instance variables.
10804
10805         This is mandated by the spec, last paragraph of the `constructor
10806         initializers' section. 
10807
10808 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
10809
10810         * cs-parser.jay, class.cs (Accessor): new class used to represent
10811         an accessor (get or set).  In the past we used `null' to represent
10812         a missing accessor.  But this is ambiguous because there was no
10813         way to tell in abstract indexers/properties if one of them was
10814         specified.
10815
10816         Now there is a way of addressing that.
10817
10818         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
10819         instead of FindMembers.
10820
10821         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
10822         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
10823
10824         * attribute.cs: Treat indexers and properties as the same in terms
10825         of applying attributes
10826
10827         * ecore.cs (FindMostEncompassedType): Use statically initialized
10828         EmptyExpressions()s like we do elsewhere to avoid creating useless
10829         objects (and we take this out of the tight loop).
10830
10831         (GetConversionOperators): Move the code to extract the actual
10832         operators to a separate routine to clean things up.
10833
10834 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
10835
10836         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
10837         events are always registered FieldBuilders.
10838
10839         * class.cs (FieldBase): New class shared by Fields 
10840
10841         * delegate.cs: If we are a toplevel delegate, use our full name.
10842         If we are a nested delegate, then only use our tail name.
10843
10844 2002-05-02  Ravi Pratap  <ravi@ximian.com>
10845
10846         * expression.cs (IsApplicable): Ensure that we add the "&" to
10847         ref/out types before comparing it with the type of the argument.
10848
10849         (IsParamsMethodApplicable): Ditto.
10850
10851         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
10852         silly me ;-)
10853
10854         * delegate.cs : Handle the case when we have more than one applicable
10855         method. Flag an error only when we finish checking all.
10856
10857 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
10858
10859         * expression.cs: Add support for boolean static initializers.
10860
10861 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
10862
10863         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
10864
10865         * parameter.cs (ComputeParameterTypes,
10866         ComputeAndDefineParameterTypes): Better error handling: now we
10867         clear the `types' cache if we fail during any of the type lookups.
10868         We also return the status code correctly to our caller
10869
10870         * delegate.cs: If we fail to define a delegate, abort the extra
10871         steps. 
10872
10873         * expression.cs (Binary.ResolveOperator): for
10874         operator==(object,object) and operator !=(object, object) we also
10875         have to verify that there is an implicit conversion from one to
10876         the other.
10877
10878         (ArrayAccess.DoResolve): Array Access can operate on
10879         non-variables. 
10880
10881 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
10882
10883         * assign.cs (CompoundAssign): A new class used as a "flag" that
10884         the assignment actually is happening as part of a compound
10885         assignment operator.
10886
10887         During compound assignment, a few new rules exist to enable things
10888         like:
10889
10890         byte b |= 1 + 2
10891
10892         From the spec:
10893
10894         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
10895         to the type of x) if y is implicitly convertible to the type of x,
10896         and the operator is a builtin operator and the return type of the
10897         operator is explicitly convertible to the type of x. 
10898
10899         * rootcontext.cs: Reset warning level to 2.  4 catches various
10900         "interesting" features in mcs, we must clean this up at some
10901         point, but currently am trying to kill other bugs ;-)
10902
10903         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
10904         in container classes as well.  
10905
10906         * expression.cs (Binary.ResolveOperator): Handle string case
10907         before anything else (as operator overloading does emit an error
10908         before doing anything else).
10909
10910         This code could go away when we move to a table driven model, but
10911         i could not come up with a good plan last night.
10912
10913 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
10914
10915         * typemanager.cs (CSharpName): reimplementation using regex.
10916         * class.cs: added null check for fields in Emit
10917         * rootcontext.cs: set warninglevel to 4
10918
10919 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
10920
10921         * typemanager.cs (CSharpName): reimplemented with Lupus
10922         suggestion.
10923
10924 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
10925
10926         * statement.cs (If): correclty implement Resolve, because we were
10927         not catching sem errors in there.  The same process is needed
10928         everywhere else. 
10929         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
10930
10931
10932         (Statement.Warning_DeadCodeFound): Factorize code.
10933         (While): Report dead code here too.
10934
10935         (Statement): Added Resolve virtual method to allow
10936         for resolution split from the emit code.
10937
10938 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10939
10940         * statement.cs (EmitBoolExpression): No longer try to resolve the
10941         expression here.    
10942         (MakeBoolean): New utility function that resolve, implicitly
10943         converts to boolean and tags the expression. 
10944
10945
10946         (If, Do): Implement dead code elimination.
10947         (While): Implement loop inversion
10948
10949         (Do, While, For, If): Resolve the expression prior to calling our
10950         code generation.
10951
10952 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
10953
10954         * class.cs:
10955           - added method Report28 (warning: program has more than one entry point)
10956           - added method IsEntryPoint, implements paragraph 10.1 of the spec
10957           - modified method Method.Define, the part at the end of the method
10958
10959         * rootcontext.cs: added static public Location EntryPointLocation;
10960           
10961         * ../errors/cs0028.cs : Add test case for the above warning.              
10962
10963         * typemanager.cs:
10964           - modified method CSharpName to allow arrays of primitive type to
10965             be printed nicely (e.g. instead of System.Int32[][] it now prints
10966             int[][])
10967           - added method CSharpSignature: returns the signature of a method
10968             in string format to be used in reporting errors, warnings, etc.
10969
10970         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
10971         with String.Empty.
10972
10973 2002-04-26  Ravi Pratap  <ravi@ximian.com>
10974
10975         * delegate.cs (Define): Fix extremely silly bug where I was
10976         setting the type of the 'object' parameter of the BeginInvoke
10977         method to System.IAsyncResult instead of System.Object ;-)
10978
10979 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10980
10981         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
10982         here. 
10983
10984         (Constructor.Emit): return if we fail to initialize the
10985         constructor.  Another door closed!  
10986
10987         * expression.cs (New.DoResolve): Improve error message (from -6 to
10988         1501).  Use DeclaredOnly lookup to find the exact constructor.
10989
10990         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
10991         loop.  This is useful.
10992
10993         * cs-parser.jay: Adjust the default parameters so that destructors
10994         have the proper signature.
10995
10996 2002-04-26  Martin Baulig  <martin@gnome.org>
10997
10998         * driver.cs (LoadAssembly): If `assembly' contains any characters
10999         which are only valid in path names and not in assembly names
11000         (currently slash, backslash and point), use Assembly.LoadFrom ()
11001         instead of Assembly.Load () on the `assembly' (before iteration
11002         over the link_paths).
11003
11004 2002-04-26  Martin Baulig  <martin@gnome.org>
11005
11006         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11007
11008 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11009
11010         * class.cs (Property): use the new typemanager.MemberLookup
11011
11012         (TypeContainer.MemberLookup): Implement using the
11013         TypeManager.MemberLookup now. 
11014
11015         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11016         and return MemberInfos, so that these can be used without an
11017         EmitContext (what we had before).
11018
11019 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11020
11021         * expression.cs: Fix the case where the argument to params if the
11022         type of the params.  I omitted handling this before.   Fixed
11023
11024 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11025
11026         * driver.cs: Call BootCorlib_PopulateCoreType
11027
11028         * class.cs (Property.CheckBase): Check for properties only, not
11029         for all members. 
11030
11031         * interface.cs: Temporary hack: try/catch around the
11032         CustomAttributeBuilder, because I am getting an exception that I
11033         do not understand.
11034
11035         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11036         types whose definitions are required to be there (attributes are
11037         defined before standard types).
11038
11039         Compute definitions as we boot the various types, as they are used
11040         immediately (value_type class will need object_type, but if we do
11041         not initialize object_type, we will pass a null, which will let
11042         the runtime pick the System.Object from the existing corlib, which
11043         is not what we want).
11044
11045 2002-04-22  Patrik Torstensson <totte@labs2.com>
11046
11047         * cs-tokenizer.cs: fixed a number of trim() issues.
11048
11049 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11050
11051         * expression.cs (Argument.Type): Ensure that we return the correct
11052         type when we have out or ref parameters [in which case we 
11053         append a "&"].
11054
11055 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11056
11057         * class.cs (Property, Indexer): Allow extern modifier in there. 
11058
11059         * typemanager.cs (InitBaseTypes): Initializes object_type and
11060         value_type, since those will be used early on during the bootstrap
11061         process to compile corlib.
11062
11063         (InitCoreTypes): Move code from here to InitBaseTypes.
11064
11065 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11066
11067         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11068         single-dimension arrays as using the ldlen opcode.  
11069
11070         Daniel Lewis discovered this optimization.  
11071
11072         * typemanager.cs: Add signature for System.Array::get_Length
11073
11074 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11075
11076         * statement.cs: report the error when the foreach does not apply to an
11077         array nor a collection.
11078
11079 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11080
11081         * expression.cs: Add implicit conversions to the operator ~.
11082
11083         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11084
11085         * typemanager.cs: Locate the decimal constructor.
11086
11087 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11088
11089         * attribute.cs: use the new property of TypeOf.
11090         * expression.cs: added 'get' property around typearg.
11091
11092         These changes fix a build breaker reported by NickD. Is this the
11093         correct way to fix?  If not, please, revert my changes and make it
11094         work :-).
11095
11096 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11097
11098         * attribute.cs: Add support for typeof in attribute invocations.
11099         I am not sure that this is right though.
11100
11101 2002-04-14  Duncan Mak  <duncan@ximian.com>
11102
11103         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11104         Binary.Operator.Division case.
11105
11106 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11107
11108         * class.cs (DefineType): Ensure that we do a proper check on
11109         attribute types and also register it with the TypeManager.
11110
11111         (TypeContainer.Targets): The default for attribute types is
11112         AttributeTargets.All.
11113
11114         * attribute.cs (ApplyAttributes): Registering the attribute type
11115         is done elsewhere, not when we discover we have a Usage attribute.
11116
11117 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11118
11119         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11120         and get rid of is_delegate parameter.
11121
11122         * everywhere : update.
11123
11124 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11125
11126         * cs-parser.jay (compilation_unit): Revamp completely to use
11127         some new ideas that I got from Rhys' grammar to solve the problems
11128         with assembly level attributes.
11129
11130         (outer_declaration): New grammar production.
11131
11132         (attribute_sections): Add.
11133
11134         (opt_attributes): Base on attribute_sections
11135
11136         (namespace_declaration): Allow opt_attributes to tackle the case
11137         when we have assembly level attributes - we are clever in this
11138         regard now ;-)
11139
11140         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11141         attributes in the non-global context.
11142
11143         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11144         instead of SetGlobalAttributes.
11145
11146         * class.cs, rootcontext.cs : Ensure we define and generate 
11147         attribute types before anything else.
11148
11149         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11150         and flag the new error -20 for the case when the attribute type
11151         does not have valid targets specified. csc does not catch this.
11152
11153         * ../errors/errors.txt : update for error # -20
11154
11155 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11156
11157         * support.cs (InternalParameters.ParameterModifier): Do some null
11158         checking and return sane values.
11159
11160         * class.cs (Method.Define): If we are a PInvoke method, ensure
11161         that we are static and extern. Report error # 601
11162
11163         * ../errors/cs0601.cs : Add test case for the above error.
11164
11165 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11166
11167         * rootcontext.cs (attribute_types): We need to keep type of
11168         all attribute types separately and emit code for them first.
11169
11170         (RegisterAttribute) : Implement.
11171
11172         * class.cs (DefineType): Check if the current Type is a custom
11173         attribute type and register it accordingly.
11174
11175         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11176         adding the first attribute twice and rename to
11177
11178         (SetGlobalAttributes): this.
11179
11180         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11181         lookups.
11182
11183         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11184         if we are processing global arguments. Hmm, I am unsure of this.
11185
11186 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11187
11188         * expression.cs: added static array of strings to avoid calling
11189         Enum.ToString () for Operator in Binary. Significant recover of
11190         performance.
11191
11192 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11193
11194         * class.cs (FindMembers): Allow the Builders of the various
11195         members to be null.  If they are skip them.  This only happens
11196         during the PInvoke declaration.
11197
11198 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11199
11200         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11201         failure, so we do not keep going afterwards.
11202
11203         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11204         wanted to pass `false' as the `is_delegate' argument.  If this is
11205         the case, why not use delegate_type == null to mean `is_delegate =
11206         false' and anything else as is_delegate = true.
11207
11208 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11209
11210         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11211         code for the section, not the beginning of the tests.
11212
11213 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11214
11215         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11216
11217         * expression.cs (Binary): same.  Warn about errors where we have
11218         Enum/Enum in operator + as well.
11219
11220 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11221
11222         * statement.cs:
11223                 - added support for switch(bool)
11224                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11225                 - add TableSwitchEmit() to handle table-based switch statements
11226
11227 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11228
11229         * expression.cs (Invocation.OverloadResolve): Factor out code which
11230         does parameter compatibility checking with arguments so that we can 
11231         re-use the code even from Delegate.VerifyApplicability
11232
11233         (VerifyArgumentsCompat): Move above code here.
11234
11235         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11236         and instead make a call to the above method.
11237
11238 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11239
11240         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11241         We use it to keep track of classes which are attribute types.
11242
11243 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11244
11245         * delegate.cs (Delegate.Define): Correctly define the types in the
11246         presence of fixed and array parameters.
11247
11248         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11249         doing FindMembers.
11250
11251         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11252         include NonPublic after the first iteration.
11253
11254         * class.cs (Indexer.CheckBase): Only check if both parents are
11255         non-null. 
11256
11257         * cs-parser.jay (accessor_body): If empty, set to null.
11258
11259         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11260         same code path here to resolve constants names that we did have in
11261         MemberAccess.DoResolve.  There is too much code duplicated here.
11262
11263 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11264
11265         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11266
11267         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11268         to MakeUnionSet.
11269
11270         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11271         tokens, numbers and strings.
11272
11273         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11274         parenthesis.
11275
11276         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11277         asyncronous parameters and the regular parameters.  
11278
11279         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11280         specify the target directory.
11281
11282         * expression.cs: (This.DoResolve): Simplify
11283         (As.Emit): Optimize, do not generate IsInst if the expression is
11284         always of the given type.
11285
11286         (Is.DoResolve): Bug fix, we were reporting both always/never for
11287         the is expression.
11288
11289         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11290         creating too many unnecessary arrays.
11291
11292 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11293
11294         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11295         fields instead of rolling our own initializer.   Takes care of all
11296         implicit conversions, and drops unnecessary static checks/argument.
11297
11298 2002-03-31  Dick Porter  <dick@ximian.com>
11299
11300         * driver.cs: use the GetDirectories() return values properly, and
11301         use "/" as path separator.
11302
11303 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11304
11305         * expression.cs (Unary): Optimize - - expr into expr.
11306         (Binary): Optimize a + (-b) into a -b.
11307
11308         * codegen.cs (CodeGen): Made all methods static.
11309
11310 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11311
11312         * rootcontext.cs: 
11313
11314         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11315         TypeBuilder property.
11316
11317         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11318         instead. 
11319
11320         * tree.cs: Removed the various RecordXXXX, and replaced with a
11321         single RecordDecl.  Removed all the accessor methods, and just
11322         left a single access point Type 
11323
11324         * enum.cs: Rename DefineEnum to DefineType.
11325
11326         * decl.cs: New abstract method `DefineType' used to unify the
11327         Defines for Enumerations, Interfaces, TypeContainers and
11328         Delegates.
11329
11330         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11331         LookupBaseClasses method that used to live in class.cs and
11332         interface.cs here, and renamed to FindType.
11333
11334         * delegate.cs: Implement DefineType.  Take advantage of the
11335         refactored pattern for locating the parent builder without taking
11336         the parent_builder argument (which we know does not work if we are
11337         nested, and triggering a toplevel definition).
11338
11339 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11340
11341         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11342         accessibility of a member has changed during override and report
11343         an error if so.
11344
11345         * class.cs (Method.Define, Property.Define): Only complain on
11346         overrides if the method is private, any other accessibility is
11347         fine (and since we just checked the permission is the same, we are
11348         good to go).
11349
11350         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11351         and elif are processed always.  The other pre-processing
11352         directives are only processed if we are "taking" the path
11353
11354 2002-03-29  Martin Baulig  <martin@gnome.org>
11355
11356         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11357         current location is not Null.
11358
11359         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11360         a separate method so we can profile it.
11361
11362         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11363         `span.Seconds' are just seconds, but no minutes or hours.
11364         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11365
11366 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11367
11368         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11369         Remove the gratuitous set of Final:
11370
11371                                 // If an interface implementation, then we can set Final.
11372                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11373                                     implementing.DeclaringType.IsInterface)
11374                                         flags |= MethodAttributes.Final;
11375
11376         I do not know what I was smoking when I used that.
11377
11378
11379         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11380         step into fixing the name resolution issues for delegates and
11381         unifying the toplevel name resolution.
11382
11383 2002-03-28  Martin Baulig  <martin@gnome.org>
11384
11385         * class.cs (Method.Emit): If we have a symbol writer, call its
11386         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11387         tell it about the current method.
11388
11389         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11390         writer that we're going to emit the first byte of IL code for a new
11391         statement (a new source line).
11392         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11393         EmitContext.Mark() before emitting any code.
11394
11395         * location.cs (SymbolDocument): Return null when we're Null.
11396
11397         * statement.cs (Statement): Moved the `Location loc' variable here.
11398         (Statement.EmitBoolExpression): If we have a symbol writer, call
11399         ec.Mark() before emitting any code to tell it that we're at the
11400         beginning of a new statement.
11401         (StatementExpression): Added `Location' argument to the constructor.
11402         (Block): Added public readonly variable `StartLocation' and public
11403         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11404         (Block): Added constructor which takes a start and end location.
11405         (Block.SetEndLocation): New method. This sets the end location.
11406         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11407         local variables we create.
11408         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11409         each statement and do also mark the begin and end of the block.
11410
11411         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11412         tell it the current lexer.Location, use Location.Null for the end of the
11413         block.
11414         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11415         current block, set its end location using SetEndLocation().
11416         (statement_expression): StatementExpression constructor now takes the
11417         lexer.Location as additional argument.
11418         (for_statement, declare_local_variables): Likewise.
11419         (declare_local_variables): When creating a new implicit block, use the
11420         new Block constructor and pass it the lexer.Location.
11421
11422 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11423
11424         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11425         members also on the parent interfaces recursively.
11426
11427 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11428
11429         * report.cs: Use new formats, since Gonzalo finished the missing
11430         bits. 
11431
11432         * expression.cs (Binary.ResolveOperator): added missing operator|
11433         operator& and operator^ for bool/bool.
11434
11435         * cs-parser.jay: CheckDef now takes a Location argument that is
11436         used to report errors more precisly (instead of reporting the end
11437         of a definition, we try to track something which is a lot closer
11438         to the source of the problem).
11439
11440         * cs-tokenizer.cs: Track global token use, so we can properly flag
11441         the use of #define/#undef after the first token has been seen.
11442
11443         Also, rename the reportXXXX to Error_DescriptiveName
11444
11445         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11446         TypeContainer, so that Enum and Interface can use this too.
11447
11448         * class.cs (TypeContainer.LookupInterfaceOrClass,
11449         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11450         `builder' argument.  Typically this was used to pass the parent
11451         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11452         the definition).  
11453
11454         The problem is that a nested class could trigger the definition of
11455         a toplevel class, and the builder would be obviously wrong in that
11456         case. 
11457
11458         So we drop this argument, and we compute dynamically the
11459         TypeBuilder/ModuleBuilder (the correct information was available
11460         to us anyways from DeclSpace.Parent)
11461
11462         * interface.cs (Interface.DefineInterface): Drop builder
11463         parameter cleanup like class.cs
11464
11465         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11466         like class.cs
11467
11468         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
11469         values. 
11470
11471         (Try.Emit): Propagate the returns value from the statement.
11472
11473         (Return.Emit): Even if we are leavning 
11474
11475         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
11476
11477         * modifiers.cs: Fix the computation of MethodAttributes flags.
11478
11479 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
11480
11481         * driver.cs: allow compilation of files that start with '/'.
11482         Add a default case when checking the argument of --target.
11483
11484 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
11485
11486         * interface.cs: Implement the same search algorithm for types in
11487         the interface code.
11488
11489         * delegate.cs: Do not allow multiple definition.
11490
11491         * Recovered ChangeLog that got accidentally amputated
11492
11493         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11494
11495         * rootcontext.cs: Load manually enum to allow core classes to
11496         contain enumerations.
11497
11498         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11499         Update to new static methods in TypeManager.
11500
11501         * typemanager.cs (GetMethod, GetConstructor): Use our
11502         implementation of FindMembers to find the members, since during
11503         corlib compilation, the types are TypeBuilders and GetMethod and
11504         GetConstructor do not work.
11505
11506         Make all methods in TypeManager static.
11507
11508         (InitCodeHelpers): Split the functionality from
11509         the InitCodeTypes function.
11510
11511         * driver.cs: Call InitCodeHelpers after we have populated the
11512         types. 
11513
11514         * cs-parser.jay (delegate_declaration): we did not used to compute
11515         the delegate name correctly for void delegates.
11516
11517 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11518
11519         * rootcontext.cs (RootContext): Init the interface_resolve_order
11520         and type_container_resolve_order always.
11521
11522         (ResolveCore, BootstrapCorlib_ResolveClass,
11523         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11524         compiler when compiling with --nostdlib
11525
11526         * class.cs (TypeContainer.DefineType): Check that our parent is
11527         not null.  This test is most important when we are bootstraping
11528         the core types.
11529
11530         * codegen.cs: Split out the symbol writing code.
11531
11532 2002-03-25  Martin Baulig  <martin@gnome.org>
11533
11534         * driver.cs (-g): Made -g an alias for --debug.
11535
11536 2002-03-24  Martin Baulig  <martin@gnome.org>
11537
11538         * codegen.cs (SymbolWriter): New public variable. Returns the
11539         current symbol writer.
11540         (CodeGen): Added `bool want_debugging_support' argument to the
11541          constructor. If true, tell the ModuleBuild that we want debugging
11542         support and ask it for the ISymbolWriter.
11543         (Save): If we have a symbol writer, call it's Close() method after
11544         saving the assembly.
11545
11546         * driver.c (--debug): New command line argument to create a
11547         debugger information file.
11548
11549         * location.cs (SymbolDocument): New public property. Returns an
11550         ISymbolDocumentWriter object for the current source file or null
11551         if we don't have a symbol writer.
11552
11553 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11554
11555         * driver.cs (LoadAssembly): Correctly return when all the paths
11556         have been tried and not before.
11557
11558         * statement.cs (Switch.Emit): return the actual coverage for this
11559         statement (returns/not-returns)
11560
11561         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11562         switch of the statement if we are the last switch section.  That
11563         kills two problems: try/catch problems (we used to emit an empty
11564         nop at the end) and switch statements where all branches would
11565         return. 
11566
11567 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11568
11569         * driver.cs: Add default assemblies (the equivalent to the
11570         Microsoft CSC.RSP file)
11571
11572         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11573         also update tokens_seen and set it to false.
11574
11575         * driver.cs: Implement --recurse for Mike.
11576
11577         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11578         correctly splitting out the paths.
11579
11580 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11581
11582         * interface.cs (Interface.PopulateProperty): Instead of using
11583         `parent' as the declaration space for the set parameters, use
11584         `this' 
11585
11586         * support.cs (InternalParameters): InternalParameters constructor
11587         takes a DeclSpace instead of a TypeContainer.
11588
11589         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11590         types are being initialized, load the address of it before calling
11591         the function.  
11592
11593         (New): Provide a mechanism to disable the generation of local
11594         value type temporaries when the caller will be providing us with
11595         an address to store it.
11596
11597         (ArrayCreation.EmitDynamicInitializers): Use it.
11598
11599 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11600
11601         * expression.cs (Invocation.EmitArguments): Only probe for array
11602         property if there is more than one argument.  Sorry about that.
11603
11604         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
11605         empty param arrays.
11606
11607         * class.cs (Method.LabelParameters): Fix incorrect code path that
11608         prevented the `ParamArrayAttribute' from being applied to the
11609         params attribute.
11610
11611 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
11612
11613         * support.cs (ReflectionParameters): Correctly compute whether the
11614         last argument is a params array.  Fixes the problem with
11615         string.Split ('a')
11616
11617         * typemanager.cs: Make the assemblies array always be non-null
11618         (empty, but non-null)
11619
11620         * tree.cs (RecordDecl): New function that abstracts the recording
11621         of names.  This reports error 101, and provides a pointer to the
11622         previous declaration.  Fixes a crash in the compiler.
11623
11624         * cs-parser.jay (constructor_declaration): Update to new grammar,
11625         and provide a constructor_body that can be empty.
11626
11627 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
11628
11629         * driver.cs: Add support for --resources.
11630
11631         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
11632         Make all types for the various array helper methods be integer.
11633
11634         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
11635         CheckState to ConvCast.
11636
11637         (ConvCast): Now it takes a `checked' state argument, to avoid
11638         depending on the emit context for the conversion, and just using
11639         the resolve time setting.
11640
11641         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
11642         instead of Invocation.EmitArguments.  We do not emit the original
11643         arguments, instead we emit those which have been converted to
11644         unsigned int expressions.
11645
11646         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
11647
11648         * codegen.cs: ditto.
11649
11650         * expression.cs (LocalVariableReference): Drop the use of the
11651         Store function that depended on the variable index.
11652
11653         * statement.cs (VariableInfo): Drop the `Idx' property from this
11654         class, as this is not taking into account the indexes for
11655         temporaries tat we generate during the execution, getting the
11656         indexes wrong.
11657
11658         * class.cs: First emit class initializers, then call the parent
11659         constructor. 
11660
11661         * expression.cs (Binary): Fix opcode emision.
11662         (UnaryMutator.EmitCode): Support checked code generation
11663
11664         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
11665         matches for events for both the Static and Instance scans,
11666         pointing to the same element.   Fix that.
11667
11668 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
11669
11670         * rootcontext.cs (ResolveTree): Always set the
11671         interface_resolve_order, because nested interfaces will be calling
11672         into us.
11673
11674         * class.cs (GetInterfaceOrClass): Track the same resolution
11675         process used by TypeManager.LookupType.  This fixes the nested
11676         type lookups in class declarations (separate path from
11677         LookupType). 
11678
11679         (TypeContainer.DefineType): Also define nested interfaces.
11680         (TypeContainer.RegisterOrder): New public function used to
11681         register the order in which child interfaces need to be closed.
11682
11683         Nested interfaces need to be closed after their parents have been
11684         created. 
11685
11686         * interface.cs (InterfaceAttr): Put all the logic for computing
11687         the interface attribute here. 
11688
11689         (DefineInterface): Register our interface order with the
11690         RootContext or with the TypeContainer depending on the case.
11691
11692 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11693
11694         * cs-parser.jay: rework foreach statement to work with the new
11695         changes to the policy on SimpleNames.
11696
11697         * report.cs: support Stacktrace on warnings as well.
11698
11699         * makefile: drop --unsafe and /unsafe from the compile.
11700
11701 2002-03-13  Ravi Pratap  <ravi@ximian.com>
11702
11703         * ecore.cs (StandardConversionExists): Modify to take an Expression
11704         as the first parameter. Ensure we do null -> reference type conversion
11705         checking.
11706
11707         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
11708         temporary Expression objects.
11709
11710 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
11711
11712         * interface.cs: workaround bug in method overloading resolution
11713         (there is already a bugzilla bug for it).
11714
11715 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11716
11717         We could also solve this problem by having a separate path for
11718         performing type lookups, instead of DoResolve, we could have a
11719         ResolveType entry point, and only participating pieces of the
11720         production (simplename, deref, array) would implement this. 
11721
11722         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
11723         signal SimpleName to only resolve type names and not attempt to
11724         resolve anything else.
11725
11726         * expression.cs (Cast): Set the flag.
11727
11728         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
11729
11730         * class.cs: Only report 108 if there is no `new' modifier.
11731
11732         * cs-parser.jay: rework foreach statement to work with the new
11733         changes to the policy on SimpleNames.
11734
11735         * report.cs: support Stacktrace on warnings as well.
11736
11737         * makefile: drop --unsafe and /unsafe from the compile.
11738
11739 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
11740
11741         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11742         lookups here, instead of doing that at parse time.  This means
11743         that our grammar will not introduce `LocalVariableReferences' as
11744         expressions at this point.  That solves the problem of code like
11745         this:
11746
11747         class X {
11748            static void Main ()
11749            { int X = 1;
11750             { X x = null }}}
11751
11752         This is only half the fix.  The full fix requires parameters to
11753         also be handled in this way.
11754
11755         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
11756         makes the use more obvious of the DeclSpace.  The
11757         ec.TypeContainer.TypeBuilder is now only used to pull the
11758         TypeBuilder for it.
11759
11760         My theory is that I can get rid of the TypeBuilder completely from
11761         the EmitContext, and have typecasts where it is used (from
11762         DeclSpace to where it matters).  
11763
11764         The only pending problem is that the code that implements Aliases
11765         is on TypeContainer, and probably should go in DeclSpace.
11766
11767         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11768         lookups here, instead of doing that at parse time.  This means
11769         that our grammar will not introduce `LocalVariableReferences' as
11770         expressions at this point.  That solves the problem of code like
11771         this:
11772
11773         class X {
11774            static void Main ()
11775            { int X = 1;
11776             { X x = null }}}
11777
11778         This is only half the fix.  The full fix requires parameters to
11779         also be handled in this way.
11780
11781         * class.cs (Property.DefineMethod): When implementing an interface
11782         method, set newslot, when implementing an abstract method, do not
11783         set the flag (before we tried never setting it, or always setting
11784         it, which is the difference).
11785         (Indexer.DefineMethod): same.
11786         (Method.DefineMethod): same.
11787
11788         * ecore.cs: Only set the status used flag if we get back a Field.
11789
11790         * attribute.cs: Temporary hack, so Paolo can keep working.
11791
11792 2002-03-08  Ravi Pratap  <ravi@ximian.com>
11793
11794         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
11795         the unmanaged type in the case we have a MarshalAs attribute.
11796
11797         (Resolve): Handle the case when we are parsing the special MarshalAs
11798         attribute [we need to store the unmanaged type to use later]
11799
11800         * typemanager.cs (marshal_as_attr_type): Built in type for the 
11801         MarshalAs Attribute.
11802
11803         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
11804         on parameters and accordingly set the marshalling info.
11805
11806 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
11807
11808         * class.cs: Optimizing slightly by removing redundant code after
11809         we switched to the `NoTypes' return value.
11810         (Property.DefineMethod): use NoTypes here too.
11811
11812         This fixes the bug I introduced in my last batch of changes.
11813
11814 2002-03-05  Ravi Pratap  <ravi@ximian.com>
11815
11816         * tree.cs (RecordEnum): Add. We now keep track of enums too.
11817
11818         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
11819         Enums since those are types too. 
11820
11821         * cs-parser.jay (enum_declaration): Record enums as we parse them.
11822
11823         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
11824         thanks to a call during the lookup process.
11825
11826 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
11827
11828         * statement.cs (Foreach): Lots of work to accomodate a particular
11829         kind of foreach statement that I had not kept in mind.  It is
11830         possible to have foreachs on classes that provide a GetEnumerator
11831         method that return objects that implement the "pattern" for using
11832         a foreach, there is no need to support GetEnumerator
11833         specifically. 
11834
11835         This is needed to compile nant.
11836
11837         * decl.cs: Only report 114 if the member is not `Finalize' and if
11838         the warning level is at least 2.
11839
11840         * class.cs: Moved the compare function from Method to
11841         MethodSignature. 
11842
11843         (MethodSignature.InheritableMemberSignatureCompare): Add new
11844         filter function that is used to extract inheritable methods from a
11845         class. 
11846
11847         (Method.Define): Use the new `inheritable_method_signature_filter'
11848         delegate
11849
11850         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
11851         command. 
11852
11853 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
11854
11855         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
11856
11857         * cs-parser.jay: Add opt_semicolon to the interface declaration.
11858
11859         * expression.cs: Pass location information to
11860         ConvertImplicitStandard. 
11861
11862         * class.cs: Added debugging code to track return values from
11863         interfaces. 
11864
11865 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
11866
11867         * expression.cs (Is.DoResolve): If either side of the `is' is an
11868         interface, do not flag the warning.
11869
11870         * ecore.cs (ImplicitReferenceConversion): We need a separate test
11871         for interfaces
11872
11873         * report.cs: Allow for --fatal to be used with --probe.
11874
11875         * typemanager.cs (NoTypes): Move the definition for the empty Type
11876         array here. 
11877
11878         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
11879         properties. 
11880         (TypeContainer.DefineProxy): New function used to proxy to parent
11881         implementations when implementing interfaces.
11882         (TypeContainer.ParentImplements): used to lookup if our parent
11883         implements a public function that is required by an interface.
11884         (TypeContainer.VerifyPendingMethods): Hook this up.
11885
11886         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
11887         `modules' and `assemblies' arraylists into arrays.  We only grow
11888         these are the very early start up of the program, so this improves
11889         the speedof LookupType (nicely measured).
11890
11891         * expression.cs (MakeByteBlob): Replaced unsafe code with
11892         BitConverter, as suggested by Paolo.
11893
11894         * cfold.cs (ConstantFold.Binary): Special case: perform constant
11895         folding of string concatenation, but if either side is a string,
11896         and the other is not, then return null, and let the runtime use
11897         the concatenation on the string plus the object (using
11898         `Object.ToString'). 
11899
11900 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
11901
11902         Constant Folding has been implemented now.
11903
11904         * expression.cs (Unary.Reduce): Do not throw an exception, catch
11905         the error instead on types that are not supported in one's
11906         complement. 
11907
11908         * constant.cs (Constant and all children): New set of functions to
11909         perform implict and explicit conversions.
11910
11911         * ecore.cs (EnumConstant): Implement the new functions to perform
11912         conversion by proxying to the child expression.
11913
11914         * codegen.cs: (ConstantCheckState): Constant evaluation has its
11915         own separate setting that can not be turned off from the command
11916         line using --unchecked or --checked and is only controlled using
11917         the checked/unchecked statements and expressions.  This setting is
11918         used by the constant folder to flag errors.
11919
11920         * expression.cs (CheckedExpr, UncheckedExpr): Set the
11921         ConstantCheckState as well.   
11922
11923         During Resolve, they also have to flag the state, because the
11924         constant folder runs completely in the Resolve phase.
11925
11926         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
11927         well.
11928
11929 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11930
11931         * cfold.cs: New file, this file contains the constant folder.
11932
11933         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
11934         argument to track whether we are using the resulting address to
11935         load or store a value and provide better error messages. 
11936
11937         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
11938         new AddressOf arguments.
11939
11940         * statement.cs (Foreach.EmitCollectionForeach): Update
11941
11942         * expression.cs (Argument.Emit): Call AddressOf with proper
11943         arguments to track usage.
11944
11945         (New.DoEmit): Call AddressOf with new arguments.
11946
11947         (Unary.Emit): Adjust AddressOf call.
11948
11949 2002-03-01  Ravi Pratap  <ravi@ximian.com>
11950
11951         * cs-parser.jay (member_access): Change the case for pre-defined types
11952         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
11953         this suggestion.
11954
11955         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
11956         a method body.
11957
11958         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
11959         essentially like methods and apply attributes like MethodImplOptions to them too.
11960
11961         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
11962         not being null.
11963
11964         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
11965         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
11966         is the DeclSpace.
11967
11968         * Update code everywhere accordingly.
11969
11970         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
11971
11972         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
11973
11974 2002-02-28  Ravi Pratap  <ravi@ximian.com>
11975
11976         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
11977         try performing lookups against those instead of jumping straight into using
11978         the 'using' clauses.
11979
11980         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
11981
11982         (LookupType): Perform lookups in implicit parents too.
11983
11984         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
11985         sequence as RootContext.LookupType. 
11986
11987         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
11988         the various cases of namespace lookups into this method.
11989
11990 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11991
11992         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
11993         in positional arguments)
11994
11995         * class.cs (Operator): Update the AllowedModifiers to contain
11996         extern. 
11997
11998         * cs-parser.jay: Update operator declaration to allow for the
11999         operator body to be empty.
12000
12001         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12002         values. 
12003
12004 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12005
12006         * class.cs (Method.Emit): Label parameters.
12007
12008         * driver.cs: Return 1 or 0 as the program exit code.
12009
12010 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12011
12012         * expression.cs: Special case the `null' object when trying to
12013         auto-compute the type, as anything can be explicitly converted to
12014         that. 
12015
12016         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12017         spotting this Paolo.
12018
12019         (Expression.ImplicitNumericConversion): Perform comparissions of
12020         the type using the underlying type in the case of an enumeration
12021         rather than using the enumeration type for the compare.
12022
12023         Cope with the underlying == type case, which is not possible to
12024         catch before. 
12025
12026         (Expression.ConvertNumericExplicit): Perform comparissions of
12027         the type using the underlying type in the case of an enumeration
12028         rather than using the enumeration type for the compare.
12029
12030         * driver.cs: If the user does not supply an extension, assume .exe
12031
12032         * cs-parser.jay (if_statement): Rewrote so that we can track the
12033         location for the if statement.
12034
12035         * expression.cs (Binary.ConstantFold): Only concat strings when
12036         the operation is "+", not everything ;-)
12037
12038         * statement.cs (Statement.EmitBoolExpression): Take a location
12039         argument. 
12040         (If, While, Do): Track location.
12041
12042         * expression.cs (Binary.ResolveOperator): In the object + string
12043         case, I was missing a call to ConvertImplicit
12044
12045 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12046
12047         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12048         Location arguments. Ensure we use RootContext.LookupType to do our work
12049         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12050
12051         * interface.cs (PopulateMethod): Handle the type of the parameter being
12052         null gracefully.
12053
12054         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12055         have a params method with no fixed arguments and a call is made with no
12056         arguments.
12057
12058 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12059
12060         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12061         the verbatim-string-literal
12062
12063         * support.cs (InternalParameters.ParameterModifier): handle null
12064         fixed parameters.
12065         (InternalParameters.ParameterType): ditto.
12066
12067         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12068         duplicating the name of the variable parameter.
12069         (GetParameterByName): Fix bug where we were not looking up array
12070         paramters if they were the only present (thanks Paolo!).
12071         (GetParameterInfo): We only have an empty set of types if both
12072         fixed and array are set to null.
12073         (GetParameterInfo-idx): Handle FixedParameter == null
12074
12075         * cs-parser.jay: Handle the case where there is no catch
12076         statements (missing null test).
12077
12078 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12079
12080         * driver.cs (MainDriver): Be conservative on our command line
12081         handling.
12082
12083         Catch DirectoryNotFoundException when calling GetFiles.
12084
12085         (SplitPathAndPattern): Used to split the input specification into
12086         a path and a pattern that we can feed to Directory.GetFiles.
12087
12088 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12089
12090         * statement.cs (Fixed): Implement the last case of the Fixed
12091         statement (string handling).
12092
12093         * expression.cs (StringPtr): New class used to return a char * to
12094         a string;  Used by the Fixed statement.
12095
12096         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12097
12098         * expression.cs (Binary.ResolveOperator): Remove redundant
12099         MemberLookup pn parent type.
12100         Optimize union call, we do not need a union if the types are the same.
12101         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12102         type.
12103
12104         Specialize the use of MemberLookup everywhere, instead of using
12105         the default settings. 
12106
12107         (StackAlloc): Implement stackalloc keyword.
12108
12109         * cs-parser.jay: Add rule to parse stackalloc.
12110
12111         * driver.cs: Handle /h, /help, /?
12112
12113         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12114         before we supported unsafe code.
12115
12116         * makefile: add --unsafe to the self compilation of mcs.
12117
12118 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12119
12120         * expression.cs (PointerArithmetic): New class that is used to
12121         perform pointer arithmetic.
12122         (Binary.Resolve): Handle pointer arithmetic
12123         Handle pointer comparission.
12124         (ArrayPtr): Utility expression class that is used to take the
12125         address of an array.
12126
12127         (ElementAccess): Implement array access for pointers
12128
12129         * statement.cs (Fixed): Implement fixed statement for arrays, we
12130         are missing one more case before we are done.
12131
12132         * expression.cs (Indirection): Implement EmitAssign and set the
12133         ExprClass to Variable.  This allows pointer dereferences to be
12134         treated as variables, and to have values assigned to them.
12135
12136         * ecore.cs (Expression.StoreFromPtr): New utility function to
12137         store values dereferencing.
12138
12139 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12140
12141         * expression.cs (Binary.ResolveOperator): Ensure that we are
12142         not trying to operate on a void type - this fixes the reported
12143         bug.
12144
12145         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12146         the parent implementation is sealed.
12147
12148         * ../errors/cs0239.cs : Add.
12149
12150         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12151
12152         * typemanager.cs (unverifiable_code_type): Corresponds to 
12153         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12154         which have unsafe code in them.
12155
12156         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12157         unsafe context.
12158
12159 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12160
12161         * cs-tokenizer.cs: Add support for @"litreal strings"
12162
12163         Make tokenizer accept pre-processor directives
12164         on any column (remove the old C-like limitation). 
12165
12166         * rootcontext.cs (EmitCode): Emit any global attributes.
12167         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12168
12169         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12170
12171         * cs-parser.jay: Add support for global attributes.  
12172
12173 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12174
12175         * expression.cs (Indirection): New helper class.  Unary will
12176         create Indirection classes to be able to implement the
12177         IMemoryLocation interface on it.
12178
12179 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12180
12181         * cs-parser.jay (fixed_statement): reference the right statement.
12182
12183         * statement.cs (Fixed.Emit): Finish implementing the fixed
12184         statement for the &x case.
12185
12186 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12187
12188         * class.cs (Property.Define, Method.Define): Remove newslot when
12189         `implementing'.  
12190
12191         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12192         wrong.  NewSlot should only be used if the `new' keyword is present.
12193
12194         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12195         locating our system dir.  Sorry about this.
12196
12197 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12198
12199         * driver.cs (GetSystemDir): Compute correctly the location of our
12200         system assemblies.  I was using the compiler directory instead of
12201         the library directory.
12202
12203 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12204
12205         * expression.cs (BetterFunction): Put back in what Miguel commented out
12206         since it is the correct fix. The problem is elsewhere ;-)
12207
12208         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12209         parameters of the parms method are themselves compatible or not !
12210
12211         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12212         to check that a class implements an interface before saying that an implicit
12213         conversion was allowed. Use ImplementsInterface to do the checking.
12214
12215 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12216
12217         * class.cs (Method.Define): Track whether we are an explicit
12218         implementation or not.  And only call DefineMethodOverride if we
12219         are an explicit implementation.
12220
12221         (Property.DefineMethod): Ditto.
12222
12223 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12224
12225         * expression.cs (BetterFunction): Catch hideous bug which was
12226          preventing us from detecting ambiguous calls due to implicit casts i.e
12227         cs0121.
12228
12229 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12230
12231         * support.cs (Pair): Remove un-needed method.  I figured why I was
12232         getting the error in cs-parser.jay, the variable in a foreach loop
12233         is readonly, and the compiler does not really treat this as a variable.
12234
12235         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12236         instead of EQUALS in grammar.  
12237
12238         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12239
12240         * expression.cs (Unary.DoResolve): Check whether the argument is
12241         managed or not.
12242
12243 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12244
12245         * support.cs: Api for Pair to set a value.  Despite the fact that
12246         the variables are public the MS C# compiler refuses to compile
12247         code that accesses the field if the variable is part of a foreach
12248         statement. 
12249
12250         * statement.cs (Fixed): Begin implementation of the fixed
12251         statement.
12252
12253         (Block.AddVariable): Return the VariableInfo on success and null
12254         on failure instead of true/false. 
12255
12256         * cs-parser.jay (foreach): Catch errors on variables already
12257         defined (we were ignoring this value before) and properly unwind
12258         the block hierarchy
12259
12260         (fixed_statement): grammar for the fixed statement.
12261
12262 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12263
12264         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12265         pointer types to be incretemented.
12266
12267         (SizeOf): Implement.
12268
12269         * cs-parser.jay (pointer_member_access): Implement
12270         expr->IDENTIFIER production.
12271
12272         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12273         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12274         on safe contexts.
12275
12276         (Unary): Implement indirection.
12277
12278         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12279         use in non-unsafe context).
12280
12281         (SimpleName.DoResolve): Check for pointers in field access on safe
12282         contexts. 
12283
12284         (Expression.LoadFromPtr): Factor the load-indirect code in this
12285         function.  This was duplicated in UnboxCast and ParameterReference
12286
12287 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12288
12289         * expression.cs (ComposedCast): report an error if a pointer cast
12290         is used in a safe region.
12291
12292         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12293         pointer type casts in unsafe context.
12294
12295         * codegen.cs (EmitContext): Set up IsUnsafe.
12296
12297         * cs-parser.jay (non_expression_type): Add productions for pointer
12298         casts. 
12299
12300         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12301         code.  We should not use force into static mode if the method is
12302         not virtual.  Fixes bug in MIS
12303
12304         * statement.cs (Do.Emit, While.Emit, For.Emit,
12305         Statement.EmitBoolExpression): Add support to Do and While to
12306         propagate infinite loop as `I do return' semantics.
12307
12308         Improve the For case to also test for boolean constants.
12309
12310         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12311         to the list of attributes we can add.
12312
12313         Remove `EmitContext' argument.
12314
12315         * class.cs (Method.Define): Apply parameter attributes.
12316         (Constructor.Define): Apply parameter attributes.
12317         (MethodCore.LabelParameters): Move here the core of labeling
12318         parameters. 
12319
12320         * support.cs (ReflectionParameters.ParameterModifier,
12321         InternalParameters.ParameterModifier): Use IsByRef on the type and
12322         only return the OUT bit for these parameters instead of in/out/ref
12323         flags.
12324
12325         This is because I miss-understood things.  The ParameterInfo.IsIn
12326         and IsOut represent whether the parameter has the [In] and [Out]
12327         attributes set.  
12328
12329 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12330
12331         * ecore.cs (FieldExpr.Emit): Release temporaries.
12332
12333         * assign.cs (LocalTemporary.Release): new function.
12334
12335         * codegen.cs (EmitContext.GetTemporaryStorage,
12336         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12337         temporary storage.  Now we can "put back" localbuilders when we
12338         are done with them
12339
12340 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12341
12342         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12343         need to make a copy of the variable to generate verifiable code.
12344
12345 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12346
12347         * driver.cs: Compute dynamically the system directory.
12348
12349         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12350         Slower, but more generally useful.  Used by the abstract
12351         registering implementation. 
12352
12353         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12354         the rules for the special rule on Type/instances.  First check if
12355         we have the same name, and if so, try that special static path
12356         rather than the instance path.
12357
12358 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12359
12360         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12361         for, while and if.
12362
12363         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12364         Enum, ValueType, Delegate or Array for non-corlib compiles.
12365
12366         * cs-tokenizer.cs: Catch long identifiers (645)
12367
12368         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12369         piece of code.
12370
12371         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12372         fix, we were returning too early, so we were not registering
12373         pending methods from abstract classes.
12374
12375         Do not register pending methods if the class is abstract.
12376
12377         * expression.cs (Conditional.DoResolve): Report circular implicit
12378         conversions when we neecd to compute it for conditional
12379         expressions. 
12380
12381         (Is.DoResolve): If the expression is always of the provided type,
12382         flag warning 183.  If the expression can not ever be of the
12383         provided type flag warning 184.
12384
12385         * class.cs: Catch 169 as well.
12386
12387         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12388         read. 
12389
12390 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12391
12392         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12393
12394 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12395
12396         * interface.cs: (PopulateMethod): Check for pointers being defined
12397         only if the unsafe context is active.
12398         (PopulateProperty): ditto.
12399         (PopulateIndexer): ditto.
12400
12401         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12402         specified.  If pointers are present, make sure that they are
12403         present in an unsafe context.
12404         (Constructor, Constructor.Define): ditto.
12405         (Field, Field.Define): ditto.
12406         (Property, Property.Define): ditto.
12407         (Event, Event.Define): ditto.
12408
12409         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12410         hashtable if there are classes or structs defined.
12411
12412         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12413         code, as the constant resolution moved.
12414
12415         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12416         the metadata, so we can flag error 133. 
12417
12418         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12419         pointer is being declared in an unsafe context.
12420
12421 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12422
12423         * modifiers.cs (Modifiers.Check): Require a Location argument.
12424         Report error 227 for Unsafe use.
12425
12426         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12427
12428         * statement.cs (For.Emit): If the test is null, then report that
12429         we do `return', as we wont reach anything afterwards.
12430
12431         (Switch.SwitchGoverningType): Track the expression that matched
12432         the conversion.
12433
12434         * driver.cs: Allow negative numbers as an error code to flag.
12435
12436         * cs-parser.jay: Handle 1551.
12437
12438         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12439
12440 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12441
12442         * cs-parser.jay: Report 1518 (type declaration can only contain
12443         class, struct, interface, enum or delegate)
12444
12445         (switch_label): Report 1523 (keywords `case' or `default' must
12446         preced code)
12447
12448         (opt_switch_sections): Report 1522 (empty switch)
12449
12450         * driver.cs: Report 1515 (response file specified multiple times)
12451         Report 1516 (Source file specified multiple times).
12452
12453         * expression.cs (Argument.Resolve): Signal 1510
12454
12455         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12456         access not allowed in static code)
12457
12458 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12459
12460         * typemanager.cs (IsPointerType): Utility method which we are going
12461         to need a lot.
12462
12463         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12464         the object type, so we take care of that.
12465
12466         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12467
12468         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
12469         added to non-params parameters :-)
12470
12471         * typemanager.cs (CSharpName): Include 'void' type too. 
12472
12473         (void_ptr_type): Include in the set of core types.
12474
12475         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
12476         duplicating code.
12477
12478         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
12479         an unsafe context.
12480
12481         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
12482         completely forgotten about it.
12483
12484 2002-01-10  Ravi Pratap  <ravi@ximian.com>
12485
12486         * cs-parser.jay (pointer_type): Add. This begins our implementation
12487         of parsing rules for unsafe code.
12488
12489         (unsafe_statement): Implement.
12490
12491         (embedded_statement): Modify to include the above.
12492
12493         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12494
12495         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12496         if the current context is an unsafe one.
12497
12498         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12499         are handled differently, we need separate rules for them.
12500
12501         (local_variable_declaration): Update to use local_variable_pointer_type
12502         to allow variable declarations of unmanaged pointer types.
12503
12504         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12505         in unsafe contexts.
12506
12507         * ../errors/cs0214.cs : Add.
12508
12509 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12510
12511         * makefile: remove 'response' file when cleaning.
12512
12513 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12514
12515         * cs-parser.jay: Report 1524.
12516
12517 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12518
12519         * typemanager.cs (RegisterMethod): drop checking if we have
12520         registered this from here
12521
12522 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12523
12524         * class.cs (Method.EmitDestructor): Implement calling our base
12525         destructor. 
12526
12527         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12528         value of InFinally.
12529
12530         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12531         this routine and will wrap the call in a try/catch block.  Deal
12532         with the case.
12533
12534 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12535
12536         * ecore.cs (Expression.MemberLookup): instead of taking a
12537         parameter `same_type' that was used to tell whether we could
12538         access private members we compute our containing type from the
12539         EmitContext.
12540
12541         (FieldExpr): Added partial support for volatile fields.  This does
12542         not work for volatile fields exposed from assemblies, as I can not
12543         figure out how to extract the modreq from it.
12544
12545         Updated all the source files to use this.
12546
12547         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12548         because it is referenced by MemberLookup very often. 
12549
12550 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12551
12552         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12553         TypeBuilder.GetCustomAttributes to retrieve what we need.
12554
12555         Get rid of redundant default_member_attr_type as this is the same as
12556         default_member_type which already exists.
12557
12558         * interface.cs, attribute.cs : Update accordingly.
12559
12560 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12561
12562         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12563         work for TYpeBuilders though.  Ravi, can you please fix this?
12564
12565         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12566
12567         * expression.cs (Argument.Emit): Handle the case of ref objects
12568         being passed to ref functions;  
12569
12570         (ParameterReference.EmitLoad): Loads the content of the pointer
12571         without dereferencing.
12572
12573 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12574
12575         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12576
12577 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12578
12579         * class.cs (Indexer.DefineMethod): Incorporate the interface
12580         type in the name of the method if we are doing explicit interface
12581         implementation.
12582
12583         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12584
12585         (BetterConversion): Fix extremely trivial bug where we were referring to
12586         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12587         again !
12588
12589         * ../errors/bug16.cs : Add although we have fixed it.
12590
12591 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12592
12593         * expression.cs (BaseIndexer): Begin implementation.
12594
12595         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12596
12597         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12598         production directly to remove a shift/reduce, and implement
12599         explicit interface implementation.
12600
12601         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
12602         after a floating point suffix.
12603
12604         * expression.cs (DoNumericPromotions): Improved the conversion for
12605         uint/uint.  If we have a constant, we avoid doing a typecast to a
12606         larger type.
12607
12608         * class.cs (Indexer): Implement explicit interface implementation
12609         for indexers.
12610
12611 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
12612
12613         * class.cs: make the default instance constructor public and hidebysig.
12614
12615 2001-01-03  Ravi Pratap  <ravi@ximian.com>
12616
12617         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
12618         so we can call it from elsewhere.
12619
12620         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
12621         we emit it internally if the class has a defined indexer; otherwise the user
12622         emits it by decorating the class definition with the DefaultMemberAttribute.
12623
12624         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
12625         attribute is not used on a type which defines an indexer.
12626
12627         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
12628         character when we skip whitespace.
12629
12630         * ../errors/cs0646.cs : Add.
12631
12632 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
12633
12634         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
12635         again. 
12636
12637         * makefile: Add practical target `mcs3.exe' which builds the third
12638         generation compiler. 
12639
12640         * expression.cs (New): Fix structures constructor calling.
12641
12642         * class.cs (Property, Method, Indexer): Emit Final flag on the
12643         method if we are an interface implementation and we are not
12644         abstract. 
12645
12646         * ecore.cs (PropertyExpr): New public field `IsBase', tells
12647         whether this property is referencing a `base' method.
12648
12649         * expression.cs (Invocation.EmitCall): take an extra argument:
12650         is_base, this is used to determine whether the `call' or
12651         `callvirt' opcode should be used.
12652
12653
12654         * delegate.cs: update EmitCall.
12655
12656         * class.cs (Method.Define): Set NewSlot for the cases where we are
12657         not implementing an interface method.
12658
12659         (Property.Define): ditto.
12660
12661 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
12662
12663         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
12664         'r'.  Allows mcs to parse itself fully.
12665
12666 2002-01-02  Ravi Pratap  <ravi@ximian.com>
12667
12668         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
12669         of the number of initializers that require the InitializeArray method.
12670
12671         (CheckIndices): Store the Expression in all cases - not the plain value. Also
12672         update the above field where necessary.
12673
12674         (MakeByteBlob): Update accordingly.
12675
12676         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
12677         greater than 2.
12678
12679         (EmitDynamicInitializers): Update in accordance with the new optimization.
12680
12681         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
12682         same OpCode applies.
12683
12684         * cs-parser.jay : Fix some glaring errors I introduced.
12685
12686 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
12687
12688         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
12689         so that we can check for name clashes there too.
12690
12691         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
12692         for interface indexers.
12693
12694         * interfaces.cs (Define): Emit the default member attribute.
12695
12696         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
12697         variable was being referred to while setting the value ;-)
12698
12699 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
12700
12701         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
12702         byte-by-byte information when we know the data is zero.
12703
12704         Make the block always a multiple of 4, because
12705         DefineInitializedData has a bug.
12706
12707         * assign.cs: Fix, we should assign from the temporary, not from
12708         the source. 
12709
12710         * expression.cs (MakeByteBlob): Fix my incorrect code.
12711
12712 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
12713
12714         * typemanager.cs (EnumToUnderlying): This function is used to get
12715         the underlying type from an enumeration, because it does not
12716         always work. 
12717
12718         * constant.cs: Use the I4_S form for values between -128 and 127.
12719
12720         * statement.cs (Block.LookupLabel): Looks up a label.
12721         (Block): Drop support for labeled blocks.
12722
12723         (LabeledStatement): New kind of statement that represents a label
12724         only.
12725
12726         (Goto): Finally implement this bad boy.
12727
12728         * cs-parser.jay: Update to reflect new mechanism to implement
12729         labels.
12730
12731 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
12732
12733         * codegen.cs (EmitContext.This): a codegen property that keeps the
12734         a single instance of this instead of creating many different this
12735         instances. 
12736
12737         * delegate.cs (Delegate.DoResolve): Update to use the property;
12738
12739         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
12740
12741         * expression.cs (BaseAccess.DoResolve): Ditto.
12742
12743 2001-12-29  Ravi Pratap  <ravi@ximian.com>
12744
12745         * typemanager.cs (methodimpl_attr_type): Add to hold the type
12746         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
12747
12748         (InitCoreTypes): Update accordingly.
12749
12750         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
12751         so we can quickly store the state.
12752
12753         (ApplyAttributes): Set the correct implementation flags
12754         for InternalCall methods.
12755
12756 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
12757
12758         * expression.cs (EmitCall): if a method is not virtual, then do
12759         not use callvirt on it.
12760
12761         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
12762         user defined stuff) requires the use of stobj, which takes an
12763         address on the stack instead of an array and an index.  So emit
12764         the Ldelema operation for it.
12765
12766         (EmitStoreOpcode): Use stobj for valuetypes.
12767
12768         (UnaryMutator.EmitCode): Use the right 1 value depending on
12769         whether we are dealing with int64/uint64, float or doubles.
12770
12771         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
12772         constructors that I implemented last night.
12773
12774         (Constructor.IsDefault): Fix to work properly for static
12775         constructors.
12776
12777         * cs-parser.jay (CheckDef): report method signature errors.
12778         Update error number 103 to be 132.
12779
12780         * decl.cs: New AdditionResult enumeration value: MethodExists.
12781         Although we do this check for methods later on in the semantic
12782         analysis, catching repeated default constructors is so easy that
12783         we catch these here. 
12784
12785         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
12786         promotions code.
12787
12788         (ParameterReference.EmitAssign, Emit): handle
12789         bools as bytes.
12790
12791         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
12792         (ArrayAccess.EmitStoreOpcode): ditto.
12793
12794         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
12795
12796         * expression.cs (MakeByteBlob): Complete all the missing types
12797         (uint, short, ushort, byte, sbyte)
12798
12799         * class.cs: Only init instance field initializers on instance
12800         constructors. 
12801
12802         Rename `constructors' to instance_constructors. 
12803
12804         (TypeContainer.AddConstructor): Only add constructors to the list
12805         if it is not static.
12806
12807         Make sure that we handle default_static_constructor independently
12808         everywhere where we handle instance_constructors
12809
12810 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
12811
12812         * class.cs: Do not lookup or create a base initializer for a
12813         static constructor.
12814
12815         (ConstructorInitializer.Resolve): use the proper type to lookup
12816         for constructors.
12817
12818         * cs-parser.jay: Report error 1585 (modifiers between type and name).
12819
12820         * enum.cs, interface.cs: Remove CloseType, this is taken care by
12821         in DeclSpace. 
12822
12823         * decl.cs: CloseType is now an virtual method, the default
12824         implementation just closes this type.
12825
12826 2001-12-28  Ravi Pratap  <ravi@ximian.com>
12827
12828         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
12829         to PreserveSig by default. Also emit HideBySig on such methods.
12830
12831         Basically, set the defaults to standard values.
12832
12833         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
12834         argument, if candidate is better, it can't be worse than the best !
12835
12836         (Invocation): Re-write bits to differentiate between methods being
12837         applicable in their expanded form and their normal form - for params
12838         methods of course.
12839
12840         Get rid of use_standard everywhere as only standard conversions are allowed
12841         in overload resolution. 
12842
12843         More spec conformance.
12844
12845 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12846
12847         * driver.cs: Add --timestamp, to see where the compiler spends
12848         most of its time.
12849
12850         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
12851         `this' in static code.
12852
12853         (SimpleName.DoResolve): Implement in terms of a helper function
12854         that allows static-references to be passed upstream to
12855         MemberAccess.
12856
12857         (Expression.ResolveWithSimpleName): Resolve specially simple
12858         names when called by MemberAccess to implement the special
12859         semantics. 
12860
12861         (Expression.ImplicitReferenceConversion): Handle conversions from
12862         Null to reference types before others, as Null's type is
12863         System.Object. 
12864
12865         * expression.cs (Invocation.EmitCall): Handle the special case of
12866         calling methods declared on a reference type from a ValueType
12867         (Base classes System.Object and System.Enum)
12868
12869         (MemberAccess.Resolve): Only perform lookups on Enumerations if
12870         the left hand side is a TypeExpr, not on every enumeration. 
12871
12872         (Binary.Resolve): If types are reference types, then do a cast to
12873         object on operators != and == of both arguments.
12874
12875         * typemanager.cs (FindMembers): Extract instance and static
12876         members if requested.
12877
12878         * interface.cs (PopulateProperty): Use void_type instead of null
12879         as the return type for the setter method.
12880
12881         (PopulateIndexer): ditto.
12882
12883 2001-12-27  Ravi Pratap  <ravi@ximian.com>
12884
12885         * support.cs (ReflectionParameters): Fix minor bug where we
12886         were examining the wrong parameter for the ParamArray attribute.
12887
12888         Cope with requests for the type of the parameter at position
12889         greater than the params parameter's. We now return the element
12890         type of the params array as that makes more sense.
12891
12892         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
12893         accordingly as we no longer have to extract the element type
12894         ourselves.
12895
12896         (Invocation.OverloadResolve): Update.
12897
12898 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12899
12900         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
12901         against IEnumerator, test whether the return value is a descendant
12902         of the IEnumerator interface.
12903
12904         * class.cs (Indexer.Define): Use an auxiliary method to implement
12905         the other bits of the method definition.  Begin support for
12906         explicit interface implementation.
12907
12908         (Property.DefineMethod): Use TypeManager.void_type instead of null
12909         for an empty return value.
12910
12911 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
12912
12913         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
12914         dealing with a FieldExpr which is composed of a FieldBuilder, in
12915         the code path we did extract the constant, but we should have
12916         obtained the underlying value to be able to cast it (otherwise we
12917         end up in an infinite loop, this is what Ravi was running into).
12918
12919         (ArrayCreation.UpdateIndices): Arrays might be empty.
12920
12921         (MemberAccess.ResolveMemberAccess): Add support for section
12922         14.5.4.1 that deals with the special case of E.I when E is a type
12923         and something else, that I can be a reference to a static member.
12924
12925         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
12926         handle a particular array type to create byte blobs, it is just
12927         something we dont generate byteblobs for.
12928
12929         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
12930         arguments. 
12931
12932         * location.cs (Push): remove the key from the hashtable that we
12933         are about to add.   This happens for empty files.
12934
12935         * driver.cs: Dispose files after we have parsed them.
12936
12937         (tokenize): new function that only runs the tokenizer on its
12938         input, for speed testing.
12939
12940 2001-12-26  Ravi Pratap  <ravi@ximian.com>
12941
12942         * class.cs (Event.Define): Define the private field only if there
12943         are no accessors defined.
12944
12945         * expression.cs (ResolveMemberAccess): If there is no associated
12946         field with the event, that means we have an event defined with its
12947         own accessors and we should flag error cs0070 since transforming
12948         ourselves into a field is not valid in that case.
12949
12950         * ecore.cs (SimpleName.DoResolve): Same as above.
12951
12952         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
12953         and charset to sane values.
12954
12955 2001-12-25  Ravi Pratap  <ravi@ximian.com>
12956
12957         * assign.cs (DoResolve): Perform check on events only if they 
12958         are being accessed outside the declaring type.
12959
12960         * cs-parser.jay (event_declarations): Update rules to correctly
12961         set the type of the implicit parameter etc.
12962
12963         (add_accessor, remove_accessor): Set current local parameters.
12964
12965         * expression.cs (Binary): For delegate addition and subtraction,
12966         cast the return value from the method into the appropriate delegate
12967         type.
12968
12969 2001-12-24  Ravi Pratap  <ravi@ximian.com>
12970
12971         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
12972         of these as the workaround is unnecessary.
12973
12974         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
12975         delegate data - none of that is needed at all.
12976
12977         Re-write bits to extract the instance expression and the delegate method
12978         correctly.
12979
12980         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
12981         on delegates too.
12982
12983         * attribute.cs (ApplyAttributes): New method to take care of common tasks
12984         of attaching attributes instead of duplicating code everywhere.
12985
12986         * everywhere : Update code to do attribute emission using the above method.
12987
12988 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12989
12990         * expression.cs (IsParamsMethodApplicable): if there are not
12991         parameters, return immediately.
12992
12993         * ecore.cs: The 0 literal can be implicity converted to an enum
12994         type. 
12995
12996         (SimpleName.DoResolve): First lookup the type, then lookup the
12997         members. 
12998
12999         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13000         want to get its address.  If the InstanceExpression is not
13001         addressable, store the result in a temporary variable, then get
13002         the address of it.
13003
13004         * codegen.cs: Only display 219 errors on warning level or above. 
13005
13006         * expression.cs (ArrayAccess): Make it implement the
13007         IMemoryLocation interface.
13008
13009         (Binary.DoResolve): handle the operator == (object a, object b)
13010         and operator != (object a, object b) without incurring into a
13011         BoxedCast (because 5 != o should never be performed).
13012
13013         Handle binary enumerator operators.
13014
13015         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13016         value type, otherwise use Ldelem_ref.
13017
13018         Use precomputed names;
13019
13020         (AddressOf): Implement address of
13021
13022         * cs-parser.jay (labeled_statement): Fix recursive block
13023         addition by reworking the production.
13024
13025         * expression.cs (New.DoEmit): New has a special case:
13026                 
13027                  If we are dealing with a ValueType, we have a few
13028                  situations to deal with:
13029                 
13030                     * The target of New is a ValueType variable, that is
13031                       easy, we just pass this as the variable reference
13032                 
13033                     * The target of New is being passed as an argument,
13034                       to a boxing operation or a function that takes a
13035                       ValueType.
13036                 
13037                       In this case, we need to create a temporary variable
13038                       that is the argument of New.
13039
13040
13041 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13042
13043         * rootcontext.cs (LookupType): Check that current_type is not null before
13044         going about looking at nested types.
13045
13046         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13047         not implement the IAssignMethod interface any more.
13048
13049         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13050         where we tranform them into FieldExprs if they are being resolved from within
13051         the declaring type.
13052
13053         * ecore.cs (SimpleName.DoResolve): Do the same here.
13054
13055         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13056
13057         * ../errors/bug10.cs : Add.
13058
13059         * ../errors/cs0070.cs : Add.
13060
13061         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13062
13063         * assign.cs : Get rid of EventIsLocal everywhere.
13064
13065 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13066
13067         * ecore.cs (ConvertIntLiteral): finished the implementation.
13068
13069         * statement.cs (SwitchLabel): Convert the value we are using as a
13070         key before looking up the table.
13071
13072 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13073
13074         * codegen.cs (EmitTopBlock): Require a Location argument now.
13075
13076         * cs-parser.jay (constructor_declarator): We need to setup
13077         current_local_parameters before we parse the
13078         opt_constructor_initializer, to allow the variables to be bound
13079         to the constructor arguments.
13080
13081         * rootcontext.cs (LookupType): First lookup nested classes in our
13082         class and our parents before we go looking outside our class.
13083
13084         * expression.cs (ConstantFold): Extract/debox the values at the
13085         beginnning. 
13086
13087         * rootcontext.cs (EmitCode): Resolve the constants first before we
13088         resolve the types.  This is not really needed, but it helps debugging.
13089
13090         * statement.cs: report location.
13091
13092         * cs-parser.jay: pass location to throw statement.
13093
13094         * driver.cs: Small bug fix.
13095
13096         * report.cs: Updated format to be 4-zero filled digits.
13097
13098 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13099
13100         * expression.cs (CheckIndices): Fix minor bug where the wrong
13101         variable was being referred to ;-)
13102
13103         (DoEmit): Do not call EmitStaticInitializers when the 
13104         underlying type is System.Object.
13105
13106 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13107
13108         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13109         and do the usual workaround for SRE.
13110
13111         * class.cs (MyEventBuilder.EventType): New member to get at the type
13112         of the event, quickly.
13113
13114         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13115
13116         * assign.cs (Assign.DoResolve): Handle the case when the target
13117         is an EventExpr and perform the necessary checks.
13118
13119         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13120         interface.
13121
13122         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13123
13124         (EventExpr): Set the type in the constructor itself since we 
13125         are meant to be born fully resolved.
13126
13127         (EventExpr.Define): Revert code I wrote earlier.
13128                 
13129         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13130         instance expression is null. The instance expression is a This in that case
13131         or a null, depending on whether it is a static method or not.
13132
13133         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13134         refers to more than one method.
13135
13136         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13137         and accordingly flag errors.
13138
13139 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13140
13141         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13142
13143 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13144
13145         * location.cs (ToString): Provide useful rutine.
13146
13147 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13148
13149         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13150         objects, return the actual integral boxed.
13151
13152         * statement.cs (SwitchLabel): define an ILLabel for each
13153         SwitchLabel. 
13154
13155         (Switch.CheckSwitch): If the value is a Literal, extract
13156         the underlying literal.
13157
13158         Also in the unused hashtable we had, add the SwitchLabel so we can
13159         quickly look this value up.
13160
13161         * constant.cs: Implement a bunch of new constants.  Rewrite
13162         Literal based on this.  Made changes everywhere to adapt to this.
13163
13164         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13165         dereferencing array only once, and also copes with enumrations.
13166
13167         bytes are two bytes wide, not one.
13168
13169         (Cast): Perform constant conversions.
13170
13171         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13172         wrappers to the literals here.
13173
13174         * expression.cs (DoNumericPromotions): long literals can converted
13175         to ulong implicity (this is taken care of elsewhere, but I was
13176         missing this spot).
13177
13178         * ecore.cs (Expression.Literalize): Make the return type Literal,
13179         to improve type checking.
13180
13181         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13182
13183 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13184
13185         * literal.cs: Revert code from ravi that checked the bounds.  The
13186         bounds are sane by the definition of the type itself. 
13187
13188         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13189         need to actually look up in our parent hierarchy for interfaces
13190         implemented. 
13191
13192         * const.cs: Use the underlying type for enumerations
13193
13194         * delegate.cs: Compute the basename for the delegate creation,
13195         that should fix the delegate test case, and restore the correct
13196         Type Lookup semantics in rootcontext
13197
13198         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13199         referencing a nested type with the Reflection API is using the "+"
13200         sign. 
13201
13202         * cs-parser.jay: Do not require EOF token at the end.
13203
13204 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13205
13206         * rootcontext.cs (LookupType): Concatenate type names with
13207         a '.' instead of a '+' The test suite passes again.
13208
13209         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13210         field of the enumeration.
13211
13212         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13213         the case when the member is an EventExpr.
13214
13215         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13216         static has an associated instance expression.
13217
13218         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13219
13220         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13221
13222         * class.cs (Event.Define): Register event and perform appropriate checks
13223         for error #111.
13224
13225         We define the Add and Remove methods even if the use provides none because
13226         in that case, we provide default implementations ourselves.
13227
13228         Define a private field of the type of the event. This is done by the CSC compiler
13229         and we should be doing it too ;-)
13230
13231         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13232         More methods we use in code we generate.
13233
13234         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13235         is important.
13236
13237         (InitCoreTypes): Update accordingly for the above.
13238
13239         * class.cs (Event.Emit): Generate code for default accessors that we provide
13240
13241         (EmitDefaultMethod): Do the job in the above.
13242
13243         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13244         appropriate place.
13245
13246 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13247
13248         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13249         builders even if we were missing one.
13250
13251         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13252         pass the Basename as our class name instead of the Name.  The
13253         basename will be correctly composed for us.
13254
13255         * parameter.cs (Paramters): Now takes a Location argument.
13256
13257         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13258         make all the code call directly LookupType in RootContext and take
13259         this chance to pass the Location information everywhere.
13260
13261         * Everywhere: pass Location information.
13262
13263 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13264
13265         * class.cs (Constructor.Define): Updated way of detecting the
13266         length of the parameters.
13267
13268         (TypeContainer.DefineType): Use basename as the type name for
13269         nested types.
13270
13271         (TypeContainer.Define): Do not recursively define types here, as
13272         definition is taken care in order by the RootContext.
13273
13274         * tree.cs: Keep track of namespaces in a per-file basis.
13275
13276         * parameter.cs (Parameter.ComputeSignature): Update to use
13277         DeclSpace. 
13278
13279         (Parameters.GetSignature): ditto.
13280
13281         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13282         instead of a TypeContainer.
13283
13284         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13285         resolve names.  Because we need to be resolve in our context, not
13286         our parents.
13287
13288         * driver.cs: Implement response files.
13289
13290         * class.cs (TypeContainer.DefineType): If we are defined, do not
13291         redefine ourselves.
13292
13293         (Event.Emit): Emit the code for add/remove handlers.
13294         (Event.Define): Save the MethodBuilders for add/remove.
13295
13296         * typemanager.cs: Use pair here too.
13297
13298         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13299         DictionaryEntry requires the first argument to be non-null.  
13300
13301         (enum_declaration): Compute full name for registering the
13302         enumeration.
13303
13304         (delegate_declaration): Instead of using
13305         formal_parameter_list, use opt_formal_parameter_list as the list
13306         can be empty.
13307
13308         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13309         (EventParsing): New property that controls whether `add' and
13310         `remove' are returned as tokens or identifiers (for events);
13311
13312 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13313
13314         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13315         use MyEventBuilder only and let it wrap the real builder for us.
13316
13317         (MyEventBuilder): Revamp constructor etc.
13318
13319         Implement all operations that we perform on EventBuilder in precisely the same
13320         way here too.
13321
13322         (FindMembers): Update to use the EventBuilder member.
13323
13324         (Event.Emit): Update accordingly.
13325
13326 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13327
13328         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13329         by calling the appropriate methods.
13330
13331         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13332         useful.
13333
13334         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13335
13336 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13337
13338         * delegate.cs (Delegate.Populate): Check that the return type
13339         and various parameters types are indeed accessible.
13340
13341         * class.cs (Constructor.Define): Same here.
13342
13343         (Field.Define): Ditto.
13344
13345         (Event.Define): Ditto.
13346
13347         (Operator.Define): Check that the underlying Method defined itself
13348         correctly - so it's MethodBuilder should not be null.
13349
13350         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13351         expression happens to be null.
13352
13353         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13354         members but as of now we don't seem to be able to do anything really useful with it.
13355
13356         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13357         not the EventBuilder.
13358
13359 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13360
13361         * cs-tokenizer.cs: Add support for defines.
13362         Add support for #if, #elif, #else, #endif
13363
13364         (eval_var): evaluates a variable.
13365         (eval): stubbed for evaluating functions.
13366
13367         * cs-parser.jay: Pass the defines information
13368
13369         * driver.cs: Add --define command line option.
13370
13371         * decl.cs: Move MemberCore here.
13372
13373         Make it the base class for DeclSpace.  This allows us to catch and
13374         report 108 and 109 for everything now.
13375
13376         * class.cs (TypeContainer.Define): Extract all the members
13377         before populating and emit the warning 108 (new keyword required
13378         to override) instead of having each member implement this.
13379
13380         (MemberCore.Define): New abstract method, we will be using this in
13381         the warning reporting engine in Populate.
13382
13383         (Operator.Define): Adjust to new MemberCore protocol. 
13384
13385         * const.cs (Const): This does not derive from Expression, it is a
13386         temporary object we use to create fields, it is a MemberCore. 
13387
13388         * class.cs (Method.Define): Allow the entry point to be in a
13389         specific class.
13390
13391         * driver.cs: Rewrite the argument handler to clean it up a bit.
13392
13393         * rootcontext.cs: Made it just an auxiliary namespace feature by
13394         making everything static.
13395
13396         * driver.cs: Adapt code to use RootContext type name instead of
13397         instance variable.
13398
13399         * delegate.cs: Remove RootContext argument.
13400
13401         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13402         argument. 
13403
13404         * class.cs (Event.Define): The lookup can fail.
13405
13406         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13407
13408         * expression.cs: Resolve the this instance before invoking the code.
13409
13410 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13411
13412         * cs-parser.jay: Add a production in element_access that allows
13413         the thing to become a "type" reference.  This way we can parse
13414         things like "(string [])" as a type.
13415
13416         Note that this still does not handle the more complex rules of
13417         casts. 
13418
13419
13420         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13421
13422         * ecore.cs: (CopyNewMethods): new utility function used to
13423         assemble the list of methods from running FindMembers.
13424
13425         (MemberLookup): Rework FindMembers so that 
13426
13427 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13428
13429         * class.cs (TypeContainer): Remove Delegates who fail to be
13430         defined.
13431
13432         * delegate.cs (Populate): Verify that we dont get null return
13433         values.   TODO: Check for AsAccessible.
13434
13435         * cs-parser.jay: Use basename to emit error 574 (destructor should
13436         have the same name as container class), not the full name.
13437
13438         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13439         possible representation.  
13440
13441         Also implements integer type suffixes U and L.
13442
13443 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13444
13445         * expression.cs (ArrayCreation.DoResolve): We need to do the
13446         argument resolution *always*.
13447
13448         * decl.cs: Make this hold the namespace.  Hold the root context as
13449         well.
13450         (LookupType): Move here.
13451
13452         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13453
13454         * location.cs (Row, Name): Fixed the code, it was always returning
13455         references to the first file.
13456
13457         * interface.cs: Register properties defined through interfaces.
13458
13459         * driver.cs: Add support for globbing on the command line
13460
13461         * class.cs (Field): Make it derive from MemberCore as well.
13462         (Event): ditto.
13463
13464 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13465
13466         * class.cs (Event::Define): Check that the type of the event is a delegate
13467         type else flag error #66.
13468
13469         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
13470         same.
13471
13472         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
13473         values of EntryPoint, CharSet etc etc.
13474
13475         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
13476
13477         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
13478         be null and we should ignore this. I am not sure if this is really clean. Apparently,
13479         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
13480         which needs this to do its work.
13481
13482         * ../errors/cs0066.cs : Add.
13483
13484 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
13485
13486         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
13487         helper functions.
13488
13489         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13490         clears out the parameters field.
13491         (MemberSignatureCompare): Cleanup
13492
13493         (MemberCore): New base class used to share code between MethodCore
13494         and Property.
13495
13496         (RegisterRequiredImplementations) BindingFlags.Public requires
13497         either BindingFlags.Instace or Static.  Use instance here.
13498
13499         (Property): Refactored code to cope better with the full spec.
13500
13501         * parameter.cs (GetParameterInfo): Return an empty array instead
13502         of null on error.
13503
13504         * class.cs (Property): Abstract or extern properties have no bodies.
13505
13506         * parameter.cs (GetParameterInfo): return a zero-sized array.
13507
13508         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13509         method modifier validation to the typecontainer so we can reuse
13510         this on properties.
13511
13512         (MethodCore.ParameterTypes): return an empty sized array of types.
13513
13514         (Property.Define): Test property modifier validity.
13515
13516         Add tests for sealed/override too.
13517
13518         (Method.Emit): abstract or extern methods have no bodies.
13519
13520 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13521
13522         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13523         thing.
13524
13525         (Method::Define, ::Emit): Modify accordingly.
13526
13527         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13528
13529         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13530
13531         * makefile: Pass in /unsafe.
13532
13533 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13534
13535         * class.cs (MakeKey): Kill routine.
13536
13537         * class.cs (TypeContainer.Define): Correctly define explicit
13538         method implementations (they require the full interface name plus
13539         the method name).
13540
13541         * typemanager.cs: Deply the PtrHashtable here and stop using the
13542         lame keys.  Things work so much better.
13543
13544         This of course broke everyone who depended on `RegisterMethod' to
13545         do the `test for existance' test.  This has to be done elsewhere.
13546
13547         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13548         the object stupid Equals method (because, that like fails all over
13549         the place).  We still do not use it.
13550
13551         * class.cs (TypeContainer.SetRequiredInterface,
13552         TypeContainer.RequireMethods): Killed these two routines and moved
13553         all the functionality to RegisterRequiredImplementations.
13554
13555         (TypeContainer.RegisterRequiredImplementations): This routine now
13556         registers all the implementations required in an array for the
13557         interfaces and abstract methods.  We use an array of structures
13558         which can be computed ahead of time to reduce memory usage and we
13559         also assume that lookups are cheap as most classes will not
13560         implement too many interfaces.
13561
13562         We also avoid creating too many MethodSignatures.
13563
13564         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13565         clear the "pending" bit if we find that there are problems with
13566         the declaration.
13567
13568         (TypeContainer.VerifyPendingMethods): Update to report errors of
13569         methods that look like implementations but are not.
13570
13571         (TypeContainer.Define): Add support for explicit interface method
13572         implementation. 
13573
13574 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13575
13576         * typemanager.cs: Keep track of the parameters here instead of
13577         being a feature of the TypeContainer.
13578
13579         * class.cs: Drop the registration of parameters here, as
13580         InterfaceMethods are also interface declarations.
13581
13582         * delegate.cs: Register methods with the TypeManager not only with
13583         the TypeContainer.  This code was buggy.
13584
13585         * interface.cs: Full registation here.
13586
13587 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13588
13589         * expression.cs: Remove reducer for binary expressions, it can not
13590         be done this way.
13591
13592         * const.cs: Put here the code that used to go into constant.cs
13593
13594         * constant.cs: Put here the code for constants, this is a new base
13595         class for Literals.
13596
13597         * literal.cs: Make Literal derive from Constant.
13598
13599 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13600
13601         * statement.cs (Return.Emit): Report error 157 if the user
13602         attempts to return from a finally block.
13603
13604         (Return.Emit): Instead of emitting a return, jump to the end of
13605         the function.
13606
13607         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
13608         LocalBuilder to store the result of the function.  ReturnLabel is
13609         the target where we jump.
13610
13611
13612 2001-12-09  Radek Doulik  <rodo@ximian.com>
13613
13614         * cs-parser.jay: remember alias in current namespace
13615
13616         * ecore.cs (SimpleName::DoResolve): use aliases for types or
13617         namespaces
13618
13619         * class.cs (LookupAlias): lookup alias in my_namespace
13620
13621         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
13622         aliases hashtable
13623         (LookupAlias): lookup alias in this and if needed in parent
13624         namespaces
13625
13626 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
13627
13628         * support.cs: 
13629
13630         * rootcontext.cs: (ModuleBuilder) Made static, first step into
13631         making things static.  I need this to avoid passing the
13632         TypeContainer when calling ParameterType.
13633
13634         * support.cs (InternalParameters.ParameterType): Remove ugly hack
13635         that did string manipulation to compute the type and then call
13636         GetType.  Use Parameter.ParameterType instead.
13637
13638         * cs-tokenizer.cs: Consume the suffix for floating values.
13639
13640         * expression.cs (ParameterReference): figure out whether this is a
13641         reference parameter or not.  Kill an extra variable by computing
13642         the arg_idx during emission.
13643
13644         * parameter.cs (Parameters.GetParameterInfo): New overloaded
13645         function that returns whether a parameter is an out/ref value or not.
13646
13647         (Parameter.ParameterType): The type of the parameter (base,
13648         without ref/out applied).
13649
13650         (Parameter.Resolve): Perform resolution here.
13651         (Parameter.ExternalType): The full type (with ref/out applied).
13652
13653         * statement.cs (Using.Emit, Using.EmitExpression): Implement
13654         support for expressions on the using statement.
13655
13656 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
13657
13658         * statement.cs (Using.EmitLocalVariableDecls): Split the
13659         localvariable handling of the using statement.
13660
13661         (Block.EmitMeta): Keep track of variable count across blocks.  We
13662         were reusing slots on separate branches of blocks.
13663
13664         (Try.Emit): Emit the general code block, we were not emitting it. 
13665
13666         Check the type of the declaration to be an IDisposable or
13667         something that can be implicity converted to it. 
13668
13669         Emit conversions if required.
13670
13671         * ecore.cs (EmptyExpression): New utility class.
13672         (Expression.ImplicitConversionExists): New utility function.
13673
13674 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
13675
13676         * statement.cs (Using): Implement.
13677
13678         * expression.cs (LocalVariableReference): Support read only variables.
13679
13680         * statement.cs: Remove the explicit emit for the Leave opcode.
13681         (VariableInfo): Add a readonly field.
13682
13683 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
13684
13685         * ecore.cs (ConvCast): new class used to encapsulate the various
13686         explicit integer conversions that works in both checked and
13687         unchecked contexts.
13688
13689         (Expression.ConvertNumericExplicit): Use new ConvCast class to
13690         properly generate the overflow opcodes.
13691
13692 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13693
13694         * statement.cs: The correct type for the EmptyExpression is the
13695         element_type, not the variable type.  Ravi pointed this out.
13696
13697 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13698
13699         * class.cs (Method::Define): Handle PInvoke methods specially
13700         by using DefinePInvokeMethod instead of the usual one.
13701
13702         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
13703         above to do the task of extracting information and defining the method.
13704
13705 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13706
13707         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
13708         of the condition for string type.
13709
13710         (Emit): Move that here. 
13711
13712         (ArrayCreation::CheckIndices): Keep string literals in their expression
13713         form.
13714
13715         (EmitDynamicInitializers): Handle strings appropriately.
13716
13717 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13718
13719         * codegen.cs (EmitContext): Replace multiple variables with a
13720         single pointer to the current Switch statement.
13721
13722         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
13723         EmitContext.
13724
13725 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13726
13727         * statement.cs 
13728
13729         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
13730         default'.
13731
13732         (Foreach.Emit): Foreach on arrays was not setting
13733         up the loop variables (for break/continue).
13734
13735         (GotoCase): Semi-implented.
13736
13737 2001-12-03  Ravi Pratap  <ravi@ximian.com>
13738
13739         * attribute.cs (CheckAttribute): Handle system attributes by using
13740         Attribute.GetAttributes to examine information we need.
13741
13742         (GetValidPlaces): Same here.
13743
13744         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
13745
13746         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
13747
13748         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
13749
13750         (Method::Define): Set appropriate flags if we have a DllImport attribute.
13751
13752         (Method::Emit): Handle the case when we are a PInvoke method.
13753
13754 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13755
13756         * expression.cs: Use ResolveWithSimpleName on compound names.
13757
13758 2001-12-02  Ravi Pratap  <ravi@ximian.com>
13759
13760         * constant.cs (EmitConstant): Make sure we resolve the associated expression
13761         before trying to reduce it.
13762
13763         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
13764
13765         * constant.cs (LookupConstantValue): Implement.
13766
13767         (EmitConstant): Use the above in emitting the constant.
13768
13769         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
13770         that are user-defined by doing a LookupConstantValue on them.
13771
13772         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
13773         too, like above.
13774
13775 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
13776
13777         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
13778
13779         (BaseAccess.DoResolve): Implement.
13780
13781         (MemberAccess.DoResolve): Split this routine into a
13782         ResolveMemberAccess routine that can be used independently
13783
13784 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
13785
13786         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
13787         As that share bits of the implementation.  Is returns a boolean,
13788         while As returns the Type that is being probed.
13789
13790 2001-12-01  Ravi Pratap  <ravi@ximian.com>
13791
13792         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
13793         instead of a Literal - much easier.
13794
13795         (EnumInTransit): Remove - utterly useless :-)
13796
13797         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
13798
13799         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
13800
13801         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
13802         chain when we have no associated expression.
13803
13804 2001-11-30  Ravi Pratap  <ravi@ximian.com>
13805
13806         * constant.cs (Define): Use Location while reporting the errror.
13807
13808         Also emit a warning when 'new' is used and there is no inherited
13809         member to hide.
13810
13811         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
13812         populated.
13813
13814         (LookupEnumValue): Implement to lookup an enum member's value and define it
13815         if necessary.
13816
13817         (Populate): Re-write accordingly to use the above routine.
13818
13819 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
13820
13821         * expression.cs (This): Fix prototype for DoResolveLValue to
13822         override the base class DoResolveLValue.
13823
13824         * cs-parser.cs: Report errors cs574 and cs575 (destructor
13825         declarations) 
13826
13827         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
13828         (we need to load the address of the field here).  This fixes
13829         test-22. 
13830
13831         (FieldExpr.DoResolveLValue): Call the DoResolve
13832         function to initialize the Instance expression.
13833
13834         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
13835         correctly the GetEnumerator operation on a value type.
13836
13837         * cs-parser.jay: Add more simple parsing error catches.
13838
13839         * statement.cs (Switch): Add support for string switches.
13840         Handle null specially.
13841
13842         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
13843
13844 2001-11-28  Ravi Pratap  <ravi@ximian.com>
13845
13846         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
13847
13848         (declare_local_constant): New helper function.
13849
13850         * statement.cs (AddConstant): Keep a separate record of constants
13851
13852         (IsConstant): Implement to determine if a variable is a constant.
13853
13854         (GetConstantExpression): Implement.
13855
13856         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
13857
13858         * statement.cs (IsVariableDefined): Re-write.
13859
13860 2001-11-27  Ravi Pratap  <ravi@ximian.com>
13861
13862         * class.cs (TypeContainer::FindMembers): Look for constants
13863         in the case when we are looking for MemberTypes.Field
13864
13865         * expression.cs (MemberAccess::DoResolve): Check that in the
13866         case we are a FieldExpr and a Literal, we are not being accessed
13867         by an instance reference.
13868
13869         * cs-parser.jay (local_constant_declaration): Implement.
13870
13871         (declaration_statement): Implement for constant declarations.
13872
13873 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
13874
13875         * statement.cs (Switch): Catch double defaults.
13876
13877         (Switch): More work on the switch() statement
13878         implementation.  It works for integral values now, need to finish
13879         string support.
13880
13881
13882 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13883
13884         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
13885         integer literals into other integer literals.  To be used by
13886         switch. 
13887
13888 2001-11-24  Ravi Pratap  <ravi@ximian.com>
13889
13890         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
13891         some memory.
13892
13893         (EmitDynamicInitializers): Cope with the above since we extract data
13894         directly from ArrayData now.
13895
13896         (ExpectInitializers): Keep track of whether initializers are mandatory
13897         or not.
13898
13899         (Bounds): Make it a hashtable to prevent the same dimension being 
13900         recorded for every element in that dimension.
13901
13902         (EmitDynamicInitializers): Fix bug which prevented the Set array method
13903         from being found.
13904
13905         Also fix bug which was causing the indices to be emitted in the reverse
13906         order.
13907
13908 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13909
13910         * expression.cs (ArrayCreation): Implement the bits that Ravi left
13911         unfinished.  They do not work, because the underlying code is
13912         sloppy.
13913
13914 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13915
13916         * cs-parser.jay: Remove bogus fixme.
13917
13918         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
13919         on Switch statement.
13920
13921 2001-11-23  Ravi Pratap  <ravi@ximian.com>
13922
13923         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
13924         the same. 
13925
13926         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
13927         parameter. Apparently, any expression is allowed. 
13928
13929         (ValidateInitializers): Update accordingly.
13930
13931         (CheckIndices): Fix some tricky bugs thanks to recursion.
13932
13933         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
13934         I was being completely brain-dead.
13935
13936         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
13937         and re-write acordingly.
13938
13939         (DelegateInvocation): Re-write accordingly.
13940
13941         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
13942
13943         (MakeByteBlob): Handle types more correctly.
13944
13945         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
13946         initialization from expressions but it is incomplete because I am a complete
13947         Dodo :-|
13948
13949 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13950
13951         * statement.cs (If.Emit): Fix a bug that generated incorrect code
13952         on If.  Basically, we have to return `true' (ie, we do return to
13953         our caller) only if both branches of the if return.
13954
13955         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
13956         short-circuit operators, handle them as short circuit operators. 
13957
13958         (Cast.DoResolve): Resolve type.
13959         (Cast.Cast): Take an expression as the target type.
13960
13961         * cs-parser.jay (cast_expression): Remove old hack that only
13962         allowed a limited set of types to be handled.  Now we take a
13963         unary_expression and we resolve to a type during semantic
13964         analysis.
13965
13966         Use the grammar productions from Rhys to handle casts (this is
13967         not complete like Rhys syntax yet, we fail to handle that corner
13968         case that C# has regarding (-x), but we will get there.
13969
13970 2001-11-22  Ravi Pratap  <ravi@ximian.com>
13971
13972         * class.cs (EmitFieldInitializer): Take care of the case when we have a
13973         field which is an array type.
13974
13975         * cs-parser.jay (declare_local_variables): Support array initialization too.
13976
13977         * typemanager.cs (MakeKey): Implement.
13978
13979         (everywhere): Use the above appropriately.
13980
13981         * cs-parser.jay (for_statement): Update for array initialization while
13982         declaring variables.
13983
13984         * ecore.cs : The error message was correct, it's the variable's names that
13985         were misleading ;-) Make the code more readable.
13986
13987         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
13988         the correct type etc.
13989
13990         (ConvertExplicit): Handle Enum types by examining the underlying type.
13991
13992 2001-11-21  Ravi Pratap  <ravi@ximian.com>
13993
13994         * parameter.cs (GetCallingConvention): Always return
13995         CallingConventions.Standard for now.
13996
13997 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13998
13999         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14000         and `r' after calling DoNumericPromotions.
14001
14002         * ecore.cs: Fix error message (the types were in the wrong order).
14003
14004         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14005         BindingFlags.Instance as well 
14006
14007         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14008         implicit int literal conversion in an empty cast so that we
14009         propagate the right type upstream.
14010
14011         (UnboxCast): new class used to unbox value types.
14012         (Expression.ConvertExplicit): Add explicit type conversions done
14013         by unboxing.
14014
14015         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14016         the target type before applying the implicit LongLiterals to ULong
14017         literal cast.
14018
14019 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14020
14021         * cs-parser.jay (for_statement): Reworked the way For works: now
14022         we declare manually any variables that are introduced in
14023         for_initializer to solve the problem of having out-of-band code
14024         emition (that is what got for broken).
14025
14026         (declaration_statement): Perform the actual variable declaration
14027         that used to be done in local_variable_declaration here.
14028
14029         (local_variable_declaration): Do not declare anything, just pass
14030         the information on a DictionaryEntry
14031
14032 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14033
14034         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14035         re-write of the logic to now make it recursive.
14036
14037         (UpdateIndices): Re-write accordingly.
14038
14039         Store element data in a separate ArrayData list in the above methods.
14040
14041         (MakeByteBlob): Implement to dump the array data into a byte array.
14042
14043 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14044
14045         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14046         into CheckIndices.
14047
14048         * constant.cs (Define): Implement.
14049
14050         (EmitConstant): Re-write fully.
14051
14052         Pass in location info.
14053
14054         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14055         respectively.
14056
14057         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14058         DictionaryEntry since we need location info too.
14059
14060         (constant_declaration): Update accordingly.
14061
14062         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14063         code into another method : UpdateIndices.
14064
14065 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14066
14067         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14068         some type checking etc.
14069
14070 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14071
14072         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14073         bits to provide dimension info if the user skips doing that.
14074
14075         Update second constructor to store the rank correctly.
14076
14077 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14078
14079         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14080         and try to implement.
14081
14082         * ../errors/cs0150.cs : Add.
14083
14084         * ../errors/cs0178.cs : Add.
14085
14086 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14087
14088         * statement.cs: Implement foreach on multi-dimensional arrays. 
14089
14090         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14091         name of the params argument.
14092
14093         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14094         initializing the array.
14095
14096         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14097         we can use this elsewhere.
14098
14099         * statement.cs: Finish implementation of foreach for single
14100         dimension arrays.
14101
14102         * cs-parser.jay: Use an out-of-band stack to pass information
14103         around, I wonder why I need this.
14104
14105         foreach_block: Make the new foreach_block the current_block.
14106
14107         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14108         function used to return a static Parameters structure.  Used for
14109         empty parameters, as those are created very frequently.
14110
14111         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14112
14113 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14114
14115         * interface.cs : Default modifier is private, not public. The
14116         make verify test passes again.
14117
14118 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14119
14120         * support.cs (ReflectionParameters): Fix logic to determine
14121         whether the last parameter is a params one. Test 9 passes again.
14122
14123         * delegate.cs (Populate): Register the builders we define with
14124         RegisterParameterForBuilder. Test 19 passes again.
14125
14126         * cs-parser.jay (property_declaration): Reference $6 instead
14127         of $$ to get at the location.
14128
14129         (indexer_declaration): Similar stuff.
14130
14131         (attribute): Ditto.
14132
14133         * class.cs (Property): Register parameters for the Get and Set methods
14134         if they exist. Test 23 passes again.
14135
14136         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14137         call to EmitArguments as we are sure there aren't any params arguments. 
14138         Test 32 passes again.
14139
14140         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14141         IndexOutOfRangeException. 
14142
14143         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14144         Test 33 now passes again.
14145
14146 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14147
14148         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14149         broke a bunch of things.  Will have to come up with a better way
14150         of tracking locations.
14151
14152         * statement.cs: Implemented foreach for single dimension arrays.
14153
14154 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14155
14156         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14157         an error.  This removes the lookup from the critical path.
14158
14159         * cs-parser.jay: Removed use of temporary_loc, which is completely
14160         broken. 
14161
14162 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14163
14164         * support.cs (ReflectionParameters.ParameterModifier): Report
14165         whether the argument is a PARAMS argument or not.
14166
14167         * class.cs: Set the attribute `ParamArrayAttribute' on the
14168         parameter argument.
14169
14170         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14171         and cons_param_array_attribute (ConstructorInfo for
14172         ParamArrayAttribute)., 
14173
14174         * codegen.cs: Emit the return using the `Return' statement, that
14175         way we can report the error correctly for missing return values. 
14176
14177         * class.cs (Method.Emit): Clean up.
14178
14179         * expression.cs (Argument.Resolve): Take another argument: the
14180         location where this argument is used.  Notice that this is not
14181         part of the "Argument" class as to reduce the size of the
14182         structure (we know the approximate location anyways).
14183
14184         Test if the argument is a variable-reference, if not, then
14185         complain with a 206.
14186
14187         (Argument.Emit): Emit addresses of variables.
14188
14189         (Argument.FullDesc): Simplify.
14190
14191         (Invocation.DoResolve): Update for Argument.Resolve.
14192
14193         (ElementAccess.DoResolve): ditto.
14194
14195         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14196         method should be virtual, as this method is always virtual.
14197
14198         (NewDelegate.DoResolve): Update for Argument.Resolve.
14199
14200         * class.cs (ConstructorInitializer.DoResolve): ditto.
14201
14202         * attribute.cs (Attribute.Resolve): ditto.
14203
14204 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14205
14206         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14207
14208         * expression.cs (ParameterReference): Drop IStackStorage and implement
14209         IAssignMethod instead. 
14210
14211         (LocalVariableReference): ditto.
14212
14213         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14214         IAssignMethod instead. 
14215
14216 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14217
14218         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14219         enumerations that are used in heavily used structures derive from
14220         byte in a laughable and pathetic attempt to reduce memory usage.
14221         This is the kind of pre-optimzations that you should not do at
14222         home without adult supervision.
14223
14224         * expression.cs (UnaryMutator): New class, used to handle ++ and
14225         -- separatedly from the other unary operators.  Cleans up the
14226         code, and kills the ExpressionStatement dependency in Unary.
14227
14228         (Unary): Removed `method' and `Arguments' from this class, making
14229         it smaller, and moving it all to SimpleCall, so I can reuse this
14230         code in other locations and avoid creating a lot of transient data
14231         strucutres when not required.
14232
14233         * cs-parser.jay: Adjust for new changes.
14234
14235 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14236
14237         * enum.cs (Enum.Populate): If there is a failure during
14238         definition, return
14239
14240         * cs-parser.jay (opt_enum_base): we used to catch type errors
14241         here, but this is really incorrect.  The type error should be
14242         catched during semantic analysis.
14243
14244 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14245
14246         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14247         current_local_parameters as expected since I, in my stupidity, had forgotten
14248         to do this :-)
14249
14250         * attribute.cs (GetValidPlaces): Fix stupid bug.
14251
14252         * class.cs (Method::Emit): Perform check on applicability of attributes.
14253
14254         (Constructor::Emit): Ditto.
14255
14256         (Field::Emit): Ditto.
14257
14258         (Field.Location): Store location information.
14259
14260         (Property, Event, Indexer, Operator): Ditto.
14261
14262         * cs-parser.jay (field_declaration): Pass in location for each field.
14263
14264         * ../errors/cs0592.cs : Add.
14265
14266 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14267
14268         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14269
14270         (InitCoreTypes): Update accordingly.
14271
14272         (RegisterAttrType, LookupAttr): Implement.
14273
14274         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14275         info about the same.
14276
14277         (Resolve): Update to populate the above as necessary.
14278
14279         (Error592): Helper.
14280
14281         (GetValidPlaces): Helper to the above.
14282
14283         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14284
14285         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14286
14287 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14288
14289         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14290
14291         * ../errors/cs0617.cs : Add.
14292
14293 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14294
14295         * enum.cs (Emit): Rename to Populate to be more consistent with what
14296         we expect it to do and when exactly it is called.
14297
14298         * class.cs, rootcontext.cs : Update accordingly.
14299
14300         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14301         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14302
14303         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14304
14305         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14306         of a fieldinfo using the above, when dealing with a FieldBuilder.
14307
14308 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14309
14310         * ../errors/cs0031.cs : Add.
14311
14312         * ../errors/cs1008.cs : Add.
14313
14314         * ../errrors/cs0543.cs : Add.
14315
14316         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14317         enum type.
14318
14319         (FindMembers): Implement.
14320
14321         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14322         enums and delegates too.
14323
14324         (enum_types): Rename to builder_to_enum.
14325
14326         (delegate_types): Rename to builder_to_delegate.
14327
14328         * delegate.cs (FindMembers): Implement.
14329
14330 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14331
14332         * typemanager.cs (IsEnumType): Implement.
14333
14334         * enum.cs (Emit): Re-write parts to account for the underlying type
14335         better and perform checking etc.
14336
14337         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14338         of the underlying type.
14339
14340         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14341         value
14342
14343         * enum.cs (error31): Helper to report error #31.
14344
14345         * cs-parser.jay (enum_declaration): Store location of each member too.
14346
14347         * enum.cs (member_to_location): New hashtable. 
14348
14349         (AddEnumMember): Update location hashtable.
14350
14351         (Emit): Use the location of each member while reporting errors.
14352
14353 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14354
14355         * cs-parser.jay: A for_initializer if is a
14356         local_variable_declaration really ammount to have an implicit
14357         block with the variable declaration and no initializer for for.
14358
14359         * statement.cs (For.Emit): Cope with null initializers.
14360
14361         This fixes the infinite loop on for initializers.
14362
14363 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14364
14365         * enum.cs: More cleanup.
14366
14367         * ecore.cs: Remove dead code.
14368
14369         * class.cs (Property.Emit): More simplification.
14370         (Event.Emit): ditto.
14371
14372         Reworked to have less levels of indentation.
14373
14374 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14375
14376         * class.cs (Property): Emit attributes.
14377
14378         (Field): Ditto.
14379
14380         (Event): Ditto.
14381
14382         (Indexer): Ditto.
14383
14384         (Operator): Ditto.
14385
14386         * enum.cs (Emit): Ditto.
14387
14388         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14389         Enums too.
14390
14391         * class.cs (Field, Event, etc.): Move attribute generation into the
14392         Emit method everywhere.
14393
14394         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14395         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14396         as we had no way of defining nested enums !
14397
14398         * rootcontext.cs : Adjust code accordingly.
14399
14400         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14401
14402 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14403
14404         * expression.cs (EvalConstantExpression): Move into ecore.cs
14405
14406         * enum.cs (Enum): Rename some members and make them public and readonly
14407         according to our convention.
14408
14409         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14410         nothing else.
14411
14412         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14413
14414         (Enum::Emit): Write a simple version for now which doesn't try to compute
14415         expressions. I shall modify this to be more robust in just a while.
14416
14417         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14418
14419         (TypeContainer::CloseType): Create the Enum types too.
14420
14421         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14422
14423         * expression.cs (EvalConstantExpression): Get rid of completely.
14424
14425         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14426         user-defined values and other cases.
14427
14428         (IsValidEnumLiteral): Helper function.
14429
14430         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14431         out there in the case we had a literal FieldExpr.
14432
14433         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14434
14435         (Literalize): Revamp a bit to take two arguments.
14436
14437         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14438
14439 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14440
14441         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14442
14443         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14444
14445         (Resolve): Use the above to ensure we have proper initializers.
14446
14447 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14448
14449         * expression.cs (Expression::EvalConstantExpression): New method to 
14450         evaluate constant expressions.
14451
14452         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14453
14454 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14455
14456         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14457         in an array.
14458
14459         (Binary.ResolveOperator): Handle operator != (object a, object b)
14460         and operator == (object a, object b);
14461
14462         (Binary.DoNumericPromotions): Indicate whether the numeric
14463         promotion was possible.
14464
14465         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14466         Implement.  
14467
14468         Made the ArrayAccess implement interface IAssignMethod instead of
14469         IStackStore as the order in which arguments are passed reflects
14470         this.
14471
14472         * assign.cs: Instead of using expr.ExprClass to select the way of
14473         assinging, probe for the IStackStore/IAssignMethod interfaces.
14474
14475         * typemanager.cs: Load InitializeArray definition.
14476
14477         * rootcontext.cs (RootContext.MakeStaticData): Used to define
14478         static data that can be used to initialize arrays. 
14479
14480 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
14481
14482         * expression.cs: Handle operator== and operator!= for booleans.
14483
14484         (Conditioal.Reduce): Implement reducer for the ?: operator.
14485
14486         (Conditional.Resolve): Implement dead code elimination.
14487
14488         (Binary.Resolve): Catch string literals and return a new
14489         concatenated string.
14490
14491         (Unary.Reduce): Implement reduction of unary expressions.
14492
14493         * ecore.cs: Split out the expression core handling here.
14494
14495         (Expression.Reduce): New method used to perform constant folding
14496         and CSE.  This is needed to support constant-expressions. 
14497
14498         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14499         targets, and optimize for !x.
14500
14501 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14502
14503         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14504         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14505         set custom atttributes.
14506
14507         * literal.cs (Literal::GetValue): New abstract method to return the actual
14508         value of the literal, cast as an object.
14509
14510         (*Literal): Implement GetValue method.
14511
14512         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14513         expressions to the arraylist but objects of type Argument.
14514
14515         * class.cs (TypeContainer::Emit): Emit our attributes too.
14516
14517         (Method::Emit, Constructor::Emit): Ditto.
14518
14519         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14520         to be ignoring earlier.
14521
14522 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14523
14524         * attribute.cs (AttributeSection::Define): Implement to do the business
14525         of constructing a CustomAttributeBuilder.
14526
14527         (Attribute): New trivial class. Increases readability of code.  
14528
14529         * cs-parser.jay : Update accordingly.
14530
14531         (positional_argument_list, named_argument_list, named_argument): New rules
14532
14533         (attribute_arguments): Use the above so that we are more correct.
14534
14535 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14536
14537         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14538         to perform all checks for a method with a params parameter.
14539
14540         (Invocation::OverloadResolve): Update to use the above method and therefore
14541         cope correctly with params method invocations.
14542
14543         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14544         params too.
14545
14546         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14547         constructors in our parent too because we can't afford to miss out on 
14548         protected ones ;-)
14549
14550         * attribute.cs (AttributeSection): New name for the class Attribute
14551
14552         Other trivial changes to improve readability.
14553
14554         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14555         use the new class names.
14556
14557 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14558
14559         * class.cs (Method::Define): Complete definition for params types too
14560
14561         (Indexer::Define): Ditto.
14562
14563         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14564         Cope everywhere with a request for info about the array parameter.
14565
14566 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14567
14568         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14569
14570         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14571         local_variable_type to extract the string corresponding to the type.
14572
14573         (local_variable_type): Fixup the action to use the new helper method.
14574
14575         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14576         go.
14577
14578         * expression.cs : Clean out code which uses the above.
14579
14580 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14581
14582         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14583         and bale out if necessary by returning a false.
14584
14585         (RegisterProperty): Ditto.
14586
14587         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14588         and print out appropriate error messages.
14589
14590         * interface.cs (everywhere): Ditto.
14591
14592         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14593         location to constructor.
14594
14595         * class.cs (Property, Event, Indexer): Update accordingly.
14596
14597         * ../errors/cs111.cs : Added.
14598
14599         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14600         of a method, as laid down by the spec.
14601
14602         (Invocation::OverloadResolve): Use the above method.
14603
14604 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14605
14606         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
14607         now take a TypeContainer and a Parameters object.
14608
14609         (ParameterData): Modify return type of ParameterModifier method to be 
14610         Parameter.Modifier and not a string.
14611
14612         (ReflectionParameters, InternalParameters): Update accordingly.
14613
14614         * expression.cs (Argument::GetParameterModifier): Same here.
14615
14616         * support.cs (InternalParameters::ParameterType): Find a better way of determining
14617         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
14618         symbol in it at all so maybe this is only for now.
14619
14620 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14621
14622         * support.cs (InternalParameters): Constructor now takes an extra argument 
14623         which is the actual Parameters class.
14624
14625         (ParameterDesc): Update to provide info on ref/out modifiers.
14626
14627         * class.cs (everywhere): Update call to InternalParameters to pass in
14628         the second argument too.
14629
14630         * support.cs (ParameterData): Add ParameterModifier, which is a method 
14631         to return the modifier info [ref/out etc]
14632
14633         (InternalParameters, ReflectionParameters): Implement the above.
14634
14635         * expression.cs (Argument::ParameterModifier): Similar function to return
14636         info about the argument's modifiers.
14637
14638         (Invocation::OverloadResolve): Update to take into account matching modifiers 
14639         too.
14640
14641         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
14642         a new SetFormalParameters object which we pass to InternalParameters.
14643
14644 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14645
14646         * expression.cs (NewArray): Merge into the ArrayCreation class.
14647
14648 2001-10-29  Ravi Pratap  <ravi@ximian.com>
14649
14650         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
14651         NewUserdefinedArray into one as there wasn't much of a use in having
14652         two separate ones.
14653
14654         * expression.cs (Argument): Change field's name to ArgType from Type.
14655
14656         (Type): New readonly property which returns the proper type, taking into 
14657         account ref/out modifiers.
14658
14659         (everywhere): Adjust code accordingly for the above.
14660
14661         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
14662         whether we are emitting for a ref or out parameter.
14663
14664         * expression.cs (Argument::Emit): Use the above field to set the state.
14665
14666         (LocalVariableReference::Emit): Update to honour the flag and emit the
14667         right stuff.
14668
14669         * parameter.cs (Attributes): Set the correct flags for ref parameters.
14670
14671         * expression.cs (Argument::FullDesc): New function to provide a full desc.
14672
14673         * support.cs (ParameterData): Add method ParameterDesc to the interface.
14674
14675         (ReflectionParameters, InternalParameters): Implement the above method.
14676
14677         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
14678         reporting errors.
14679
14680         (Invocation::FullMethodDesc): Ditto. 
14681
14682 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
14683
14684         * cs-parser.jay: Add extra production for the second form of array
14685         creation. 
14686
14687         * expression.cs (ArrayCreation): Update to reflect the above
14688         change. 
14689
14690         * Small changes to prepare for Array initialization.
14691
14692 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
14693
14694         * typemanager.cs (ImplementsInterface): interface might be null;
14695         Deal with this problem;
14696
14697         Also, we do store negative hits on the cache (null values), so use
14698         this instead of calling t.GetInterfaces on the type everytime.
14699
14700 2001-10-28  Ravi Pratap  <ravi@ximian.com>
14701
14702         * typemanager.cs (IsBuiltinType): New method to help determine the same.
14703
14704         * expression.cs (New::DoResolve): Get rid of array creation code and instead
14705         split functionality out into different classes.
14706
14707         (New::FormArrayType): Move into NewBuiltinArray.
14708
14709         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
14710         quite useless.
14711
14712         (NewBuiltinArray): New class to handle creation of built-in arrays.
14713
14714         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
14715         account creation of one-dimensional arrays.
14716
14717         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
14718
14719         (NewUserdefinedArray::DoResolve): Implement.
14720
14721         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
14722
14723         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
14724         we maintain inside the TypeManager. This is necessary to perform lookups on the
14725         module builder.
14726
14727         (LookupType): Update to perform GetType on the module builders too.     
14728
14729         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
14730
14731         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
14732
14733 2001-10-23  Ravi Pratap  <ravi@ximian.com>
14734
14735         * expression.cs (New::DoResolve): Implement guts of array creation.
14736
14737         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
14738
14739 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
14740
14741         * expression.cs: Fix bug I introduced lsat night that broke
14742         Delegates. 
14743
14744         (Expression.Resolve): Report a 246 error (can not resolve name)
14745         if we find a SimpleName in the stream.
14746
14747         (Expression.ResolveLValue): Ditto.
14748
14749         (Expression.ResolveWithSimpleName): This function is a variant of
14750         ResolveName, this one allows SimpleNames to be returned without a
14751         warning.  The only consumer of SimpleNames is MemberAccess
14752
14753 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
14754
14755         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
14756         might arrive here.  I have my doubts that this is correct.
14757
14758         * statement.cs (Lock): Implement lock statement.
14759
14760         * cs-parser.jay: Small fixes to support `lock' and `using'
14761
14762         * cs-tokenizer.cs: Remove extra space
14763
14764         * driver.cs: New flag --checked, allows to turn on integer math
14765         checking. 
14766
14767         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
14768         Threading.Monitor.Exit 
14769
14770 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
14771
14772         * expression.cs (IndexerAccess::DoResolveLValue): Set the
14773         Expression Class to be IndexerAccess.
14774
14775         Notice that Indexer::DoResolve sets the eclass to Value.
14776
14777 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
14778
14779         * class.cs (TypeContainer::Emit): Emit code for indexers.
14780
14781         * assign.cs (IAssignMethod): New interface implemented by Indexers
14782         and Properties for handling assignment.
14783
14784         (Assign::Emit): Simplify and reuse code. 
14785
14786         * expression.cs (IndexerAccess, PropertyExpr): Implement
14787         IAssignMethod, clean up old code. 
14788
14789 2001-10-22  Ravi Pratap  <ravi@ximian.com>
14790
14791         * typemanager.cs (ImplementsInterface): New method to determine if a type
14792         implements a given interface. Provides a nice cache too.
14793
14794         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
14795         method.
14796
14797         (ConvertReferenceExplicit): Ditto.
14798
14799         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
14800         various methods, with correct names etc.
14801
14802         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
14803         Operator.UnaryNegation.
14804
14805         * cs-parser.jay (operator_declarator): Be a little clever in the case where
14806         we have a unary plus or minus operator.
14807
14808         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
14809         UnaryMinus.
14810
14811         * everywhere : update accordingly.
14812
14813         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
14814         respectively.
14815
14816         * class.cs (Method::Define): For the case where we are implementing a method
14817         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
14818         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
14819
14820 2001-10-21  Ravi Pratap  <ravi@ximian.com>
14821
14822         * interface.cs (FindMembers): Implement to work around S.R.E
14823         lameness.
14824
14825         * typemanager.cs (IsInterfaceType): Implement.
14826
14827         (FindMembers): Update to handle interface types too.
14828
14829         * expression.cs (ImplicitReferenceConversion): Re-write bits which
14830         use IsAssignableFrom as that is not correct - it doesn't work.
14831
14832         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
14833         and accordingly override EmitStatement.
14834
14835         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
14836         using the correct logic :-)
14837
14838 2001-10-19  Ravi Pratap  <ravi@ximian.com>
14839
14840         * ../errors/cs-11.cs : Add to demonstrate error -11 
14841
14842 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
14843
14844         * assign.cs (Assign::Resolve): Resolve right hand side first, and
14845         then pass this as a hint to ResolveLValue.
14846
14847         * expression.cs (FieldExpr): Add Location information
14848
14849         (FieldExpr::LValueResolve): Report assignment to readonly
14850         variable. 
14851
14852         (Expression::ExprClassFromMemberInfo): Pass location information.
14853
14854         (Expression::ResolveLValue): Add new method that resolves an
14855         LValue. 
14856
14857         (Expression::DoResolveLValue): Default invocation calls
14858         DoResolve. 
14859
14860         (Indexers): New class used to keep track of indexers in a given
14861         Type. 
14862
14863         (IStackStore): Renamed from LValue, as it did not really describe
14864         what this did.  Also ResolveLValue is gone from this interface and
14865         now is part of Expression.
14866
14867         (ElementAccess): Depending on the element access type
14868
14869         * typemanager.cs: Add `indexer_name_type' as a Core type
14870         (System.Runtime.CompilerServices.IndexerNameAttribute)
14871
14872         * statement.cs (Goto): Take a location.
14873
14874 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14875
14876         * delegate.cs (Delegate::VerifyDelegate): New method to verify
14877         if two delegates are compatible.
14878
14879         (NewDelegate::DoResolve): Update to take care of the case when
14880         we instantiate a delegate from another delegate.
14881
14882         * typemanager.cs (FindMembers): Don't even try to look up members
14883         of Delegate types for now.
14884
14885 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14886
14887         * delegate.cs (NewDelegate): New class to take care of delegate
14888         instantiation.
14889
14890         * expression.cs (New): Split the delegate related code out into 
14891         the NewDelegate class.
14892
14893         * delegate.cs (DelegateInvocation): New class to handle delegate 
14894         invocation.
14895
14896         * expression.cs (Invocation): Split out delegate related code into
14897         the DelegateInvocation class.
14898
14899 2001-10-17  Ravi Pratap  <ravi@ximian.com>
14900
14901         * expression.cs (New::DoResolve): Implement delegate creation fully
14902         and according to the spec.
14903
14904         (New::DoEmit): Update to handle delegates differently.
14905
14906         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
14907         because of which we were printing out arguments in reverse order !
14908
14909         * delegate.cs (VerifyMethod): Implement to check if the given method
14910         matches the delegate.
14911
14912         (FullDelegateDesc): Implement.
14913
14914         (VerifyApplicability): Implement.
14915
14916         * expression.cs (Invocation::DoResolve): Update to accordingly handle
14917         delegate invocations too.
14918
14919         (Invocation::Emit): Ditto.
14920
14921         * ../errors/cs1593.cs : Added.
14922
14923         * ../errors/cs1594.cs : Added.
14924
14925         * delegate.cs (InstanceExpression, TargetMethod): New properties.
14926
14927 2001-10-16  Ravi Pratap  <ravi@ximian.com>
14928
14929         * typemanager.cs (intptr_type): Core type for System.IntPtr
14930
14931         (InitCoreTypes): Update for the same.
14932
14933         (iasyncresult_type, asynccallback_type): Ditto.
14934
14935         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
14936         correct.
14937
14938         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
14939         too.
14940
14941         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
14942         the builders for the 4 members of a delegate type :-)
14943
14944         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
14945         type.
14946
14947         * expression.cs (New::DoResolve): Implement guts for delegate creation.
14948
14949         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
14950
14951 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
14952
14953         * statement.cs (Break::Emit): Implement.   
14954         (Continue::Emit): Implement.
14955
14956         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14957         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14958         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14959         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
14960         end loop
14961
14962         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
14963         properties that track the label for the current loop (begin of the
14964         loop and end of the loop).
14965
14966 2001-10-15  Ravi Pratap  <ravi@ximian.com>
14967
14968         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
14969         use of emitting anything at all.
14970
14971         * class.cs, rootcontext.cs : Get rid of calls to the same.
14972
14973         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
14974
14975         (Populate): Define the constructor correctly and set the implementation
14976         attributes.
14977
14978         * typemanager.cs (delegate_types): New hashtable to hold delegates that
14979         have been defined.
14980
14981         (AddDelegateType): Implement.
14982
14983         (IsDelegateType): Implement helper method.
14984
14985         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
14986
14987         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
14988         and accordingly handle it.
14989
14990         * delegate.cs (Populate): Take TypeContainer argument.
14991         Implement bits to define the Invoke method. However, I still haven't figured out
14992         how to take care of the native int bit :-(
14993
14994         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
14995         Qualify the name of the delegate, not its return type !
14996
14997         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
14998         conversion.
14999
15000         (StandardConversionExists): Checking for array types turns out to be recursive.
15001
15002         (ConvertReferenceExplicit): Implement array conversion.
15003
15004         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15005
15006 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15007
15008         * cs-parser.jay (delegate_declaration): Store the fully qualified
15009         name as it is a type declaration.
15010
15011         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15012         readonly.
15013
15014         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15015         as TypeContainer::DefineType.
15016
15017         (Populate): Method in which all the definition of the various methods (Invoke)
15018         etc is done.
15019
15020         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15021         see.
15022
15023         (CloseDelegate): Finally creates the delegate.
15024
15025         * class.cs (TypeContainer::DefineType): Update to define delegates.
15026         (Populate, Emit and CloseType): Do the same thing here too.
15027
15028         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15029         delegates in all these operations.
15030
15031 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15032
15033         * expression.cs: LocalTemporary: a new expression used to
15034         reference a temporary that has been created.
15035
15036         * assign.cs: Handle PropertyAccess back here, so that we can
15037         provide the proper semantic access to properties.
15038
15039         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15040         a few more explicit conversions. 
15041
15042         * modifiers.cs: `NEW' modifier maps to HideBySig.
15043
15044         * expression.cs (PropertyExpr): Make this into an
15045         ExpressionStatement, and support the EmitStatement code path. 
15046
15047         Perform get/set error checking, clean up the interface.
15048
15049         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15050         them into toplevel access objects.
15051
15052 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15053
15054         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15055         SRE.
15056
15057         * typemanager.cs: Keep track here of our PropertyBuilders again to
15058         work around lameness in SRE.
15059
15060 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15061
15062         * expression.cs (LValue::LValueResolve): New method in the
15063         interface, used to perform a second resolution pass for LValues. 
15064
15065         (This::DoResolve): Catch the use of this in static methods.
15066
15067         (This::LValueResolve): Implement.
15068
15069         (This::Store): Remove warning, assigning to `this' in structures
15070         is 
15071
15072         (Invocation::Emit): Deal with invocation of
15073         methods on value types.  We need to pass the address to structure
15074         methods rather than the object itself.  (The equivalent code to
15075         emit "this" for structures leaves the entire structure on the
15076         stack instead of a pointer to it). 
15077
15078         (ParameterReference::DoResolve): Compute the real index for the
15079         argument based on whether the method takes or not a `this' pointer
15080         (ie, the method is static).
15081
15082         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15083         value types returned from functions when we need to invoke a
15084         method on the sturcture.
15085
15086
15087 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15088
15089         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15090         defining the type in the Modulebuilder or Typebuilder. This is to take
15091         care of nested types which need to be defined on the TypeBuilder using
15092         DefineNestedMethod.
15093
15094         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15095         methods in RootContext, only ported to be part of TypeContainer.
15096
15097         (TypeContainer::GetInterfaceOrClass): Ditto.
15098
15099         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15100
15101         * interface.cs (Interface::DefineInterface): New method. Does exactly
15102         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15103         too.
15104
15105         (Interface::GetInterfaces): Move from RootContext here and port.
15106
15107         (Interface::GetInterfaceByName): Same here.
15108
15109         * rootcontext.cs (ResolveTree): Re-write.
15110
15111         (PopulateTypes): Re-write.
15112
15113         * class.cs (TypeContainer::Populate): Populate nested types too.
15114         (TypeContainer::Emit): Emit nested members too.
15115
15116         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15117         instead just use the name argument passed in as it is already fully
15118         qualified.
15119
15120         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15121         to TypeContainer mapping to see if a type is user-defined.
15122
15123         * class.cs (TypeContainer::CloseType): Implement. 
15124
15125         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15126         the default constructor.
15127
15128         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15129         twice.
15130
15131         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15132
15133         * interface.cs (CloseType): Create the type here.
15134
15135         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15136         the hierarchy.
15137
15138         Remove all the methods which are now in TypeContainer.
15139
15140 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15141
15142         * delegate.cs (Define): Re-write bits to define the delegate
15143         correctly.
15144
15145 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15146
15147         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15148
15149         * expression.cs (ImplicitReferenceConversion): handle null as well
15150         as a source to convert to any reference type.
15151
15152         * statement.cs (Return): Perform any implicit conversions to
15153         expected return type.  
15154
15155         Validate use of return statement.  
15156
15157         * codegen.cs (EmitContext): Pass the expected return type here.
15158
15159         * class.cs (Method, Constructor, Property): Pass expected return
15160         type to EmitContext.
15161
15162 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15163
15164         * expression.cs: Make DoResolve take an EmitContext instead of a
15165         TypeContainer.
15166
15167         Replaced `l' and `location' for `loc', for consistency.
15168
15169         (Error, Warning): Remove unneeded Tc argument.
15170
15171         * assign.cs, literal.cs, constant.cs: Update to new calling
15172         convention. 
15173
15174         * codegen.cs: EmitContext now contains a flag indicating whether
15175         code is being generated in a static method or not.
15176
15177         * cs-parser.jay: DecomposeQI, new function that replaces the old
15178         QualifiedIdentifier.  Now we always decompose the assembled
15179         strings from qualified_identifier productions into a group of
15180         memberaccesses.
15181
15182 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15183
15184         * rootcontext.cs: Deal with field-less struct types correctly now
15185         by passing the size option to Define Type.
15186
15187         * class.cs: Removed hack that created one static field. 
15188
15189 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15190
15191         * statement.cs: Moved most of the code generation here. 
15192
15193 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15194
15195         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15196         seem very right.
15197
15198         (ElementAccess): Remove useless bits for now - keep checks as the spec
15199         says.
15200
15201 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15202
15203         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15204         and start performing checks according to the spec.
15205
15206 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15207
15208         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15209         rank_specifiers instead.
15210
15211         (rank_specifiers): Change the order in which the rank specifiers are stored
15212
15213         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15214
15215         * expression.cs (ElementAccess): Implement the LValue interface too.
15216
15217 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15218
15219         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15220         except that user defined conversions are not included.
15221
15222         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15223         perform the conversion of the return type, if necessary.
15224
15225         (New::DoResolve): Check whether we are creating an array or an object
15226         and accordingly do the needful.
15227
15228         (New::Emit): Same here.
15229
15230         (New::DoResolve): Implement guts of array creation.
15231
15232         (New::FormLookupType): Helper function.
15233
15234 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15235
15236         * codegen.cs: Removed most of the code generation here, and move the
15237         corresponding code generation bits to the statement classes. 
15238
15239         Added support for try/catch/finalize and throw.
15240
15241         * cs-parser.jay: Added support for try/catch/finalize.
15242
15243         * class.cs: Catch static methods having the flags override,
15244         virtual or abstract.
15245
15246         * expression.cs (UserCast): This user cast was not really doing
15247         what it was supposed to do.  Which is to be born in fully resolved
15248         state.  Parts of the resolution were being performed at Emit time! 
15249
15250         Fixed this code.
15251
15252 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15253
15254         * expression.cs: Implicity convert the result from UserCast.
15255
15256 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15257
15258         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15259         prevented it from working correctly. 
15260
15261         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15262         merely ConvertImplicit.
15263
15264 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15265
15266         * typemanager.cs: Make the LookupTypeContainer function static,
15267         and not per-instance.  
15268
15269         * class.cs: Make static FindMembers (the one that takes a Type
15270         argument). 
15271
15272         * codegen.cs: Add EmitForeach here.
15273
15274         * cs-parser.jay: Make foreach a toplevel object instead of the
15275         inline expansion, as we need to perform semantic analysis on it. 
15276
15277 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15278
15279         * expression.cs (Expression::ImplicitUserConversion): Rename to
15280         UserDefinedConversion.
15281
15282         (Expression::UserDefinedConversion): Take an extra argument specifying 
15283         whether we look for explicit user conversions too.
15284
15285         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15286
15287         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15288
15289         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15290         with the appropriate arguments.
15291
15292         * cs-parser.jay (cast_expression): Record location too.
15293
15294         * expression.cs (Cast): Record location info.
15295
15296         (Expression::ConvertExplicit): Take location argument.
15297
15298         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15299         to determine if we are doing explicit conversions.
15300
15301         (UserCast::Emit): Update accordingly.
15302
15303         (Expression::ConvertExplicit): Report an error if everything fails.
15304
15305         * ../errors/cs0030.cs : Add.
15306
15307 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15308
15309         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15310         virtual and newslot bits. 
15311
15312         * class.cs (TypeContainer::RegisterRequiredImplementations):
15313         Record methods we need.
15314
15315         (TypeContainer::MakeKey): Helper function to make keys for
15316         MethodBases, since the Methodbase key is useless.
15317
15318         (TypeContainer::Populate): Call RegisterRequiredImplementations
15319         before defining the methods.   
15320
15321         Create a mapping for method_builders_to_methods ahead of time
15322         instead of inside a tight loop.
15323
15324         (::RequireMethods):  Accept an object as the data to set into the
15325         hashtable so we can report interface vs abstract method mismatch.
15326
15327 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15328
15329         * report.cs: Make all of it static.
15330
15331         * rootcontext.cs: Drop object_type and value_type computations, as
15332         we have those in the TypeManager anyways.
15333
15334         Drop report instance variable too, now it is a global.
15335
15336         * driver.cs: Use try/catch on command line handling.
15337
15338         Add --probe option to debug the error reporting system with a test
15339         suite. 
15340
15341         * report.cs: Add support for exiting program when a probe
15342         condition is reached.
15343
15344 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15345
15346         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15347         we do a forcible conversion regardless of type, to check if 
15348         ForceConversion returns a null.
15349
15350         (Binary::error19): Use location to report error.
15351
15352         (Unary::error23): Use location here too.
15353
15354         * ../errors/cs0019.cs : Check in.
15355
15356         * ../errors/cs0023.cs : Check in.
15357
15358         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15359         case of a non-null MethodInfo object with a length of 0 !
15360
15361         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15362         an applicable member - according to the spec :-)
15363         Also fix logic to find members in base types.
15364
15365         (Unary::ResolveOperator): Same here.
15366
15367         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15368         as I was getting thoroughly confused between this and error19 :-)
15369
15370         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15371         (::FindMostEncompassedType): Implement.
15372         (::FindMostEncompassingType): Implement.
15373         (::StandardConversionExists): Implement.
15374
15375         (UserImplicitCast): Re-vamp. We now need info about most specific
15376         source and target types so that we can do the necessary conversions.
15377
15378         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15379         mathematical union with no duplicates.
15380
15381 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15382
15383         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15384         in order from base classes to child classes, so that we can in
15385         child classes look up in our parent for method names and
15386         attributes (required for handling abstract, virtual, new, override
15387         constructs: we need to instrospect our base class, and if we dont
15388         populate the classes in order, the introspection might be
15389         incorrect.  For example, a method could query its parent before
15390         the parent has any methods and would determine that the parent has
15391         no abstract methods (while it could have had them)).
15392
15393         (RootContext::CreateType): Record the order in which we define the
15394         classes.
15395
15396 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15397
15398         * class.cs (TypeContainer::Populate): Also method definitions can
15399         fail now, keep track of this.
15400
15401         (TypeContainer::FindMembers): Implement support for
15402         DeclaredOnly/noDeclaredOnly flag.
15403
15404         (Constructor::Emit) Return the ConstructorBuilder.
15405
15406         (Method::Emit) Return the MethodBuilder. 
15407         Check for abstract or virtual methods to be public.
15408
15409         * rootcontext.cs (RootContext::CreateType): Register all the
15410         abstract methods required for the class to be complete and the
15411         interface methods that must be implemented. 
15412
15413         * cs-parser.jay: Report error 501 (method requires body if it is
15414         not marked abstract or extern).
15415
15416         * expression.cs (TypeOf::Emit): Implement.
15417
15418         * typemanager.cs: runtime_handle_type, new global type.
15419
15420         * class.cs (Property::Emit): Generate code for properties.
15421
15422 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15423
15424         * expression.cs (Unary::ResolveOperator): Find operators on base type
15425         too - we now conform exactly to the spec.
15426
15427         (Binary::ResolveOperator): Same here.
15428
15429         * class.cs (Operator::Define): Fix minor quirk in the tests.
15430
15431         * ../errors/cs0215.cs : Added.
15432
15433         * ../errors/cs0556.cs : Added.
15434
15435         * ../errors/cs0555.cs : Added.
15436
15437 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15438
15439         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15440         single integer which is really efficient
15441
15442 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15443
15444         *  expression.cs (Expression::ImplicitUserConversion): Use location
15445         even in the case when we are examining True operators.
15446  
15447         * class.cs (Operator::Define): Perform extensive checks to conform
15448         with the rules for operator overloading in the spec.
15449
15450         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15451         some of the other conversions mentioned in the spec.
15452
15453         * typemanager.cs (array_type): New static member for the System.Array built-in
15454         type.
15455
15456         (cloneable_interface): For System.ICloneable interface.
15457
15458         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15459         we start resolving the tree and populating types.
15460
15461         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15462  
15463 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15464
15465         * expression.cs (Expression::ExprClassFromMemberInfo,
15466         Expression::Literalize): Create literal expressions from
15467         FieldInfos which are literals.
15468
15469         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
15470         type casts, because they were wrong.  The test suite in tests
15471         caught these ones.
15472
15473         (ImplicitNumericConversion): ushort to ulong requires a widening
15474         cast. 
15475
15476         Int32 constant to long requires widening cast as well.
15477
15478         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
15479         for integers because the type on the stack is not i4.
15480
15481 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
15482
15483         * expression.cs (report118): require location argument. 
15484
15485         * parameter.cs: Do not dereference potential null value.
15486
15487         * class.cs: Catch methods that lack the `new' keyword when
15488         overriding a name.  Report warnings when `new' is used without
15489         anything being there to override.
15490
15491         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15492
15493         * class.cs: Only add constructor to hashtable if it is non-null
15494         (as now constructors can fail on define).
15495
15496         (TypeManager, Class, Struct): Take location arguments.
15497
15498         Catch field instance initialization in structs as errors.
15499
15500         accepting_filter: a new filter for FindMembers that is static so
15501         that we dont create an instance per invocation.
15502
15503         (Constructor::Define): Catch errors where a struct constructor is
15504         parameterless 
15505
15506         * cs-parser.jay: Pass location information for various new
15507         constructs. 
15508
15509         * delegate.cs (Delegate): take a location argument.
15510
15511         * driver.cs: Do not call EmitCode if there were problesm in the
15512         Definition of the types, as many Builders wont be there. 
15513
15514         * decl.cs (Decl::Decl): Require a location argument.
15515
15516         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15517         into integers, and find the most appropiate integer for it.
15518
15519         * literal.cs: Implement ULongLiteral.
15520
15521         * rootcontext.cs: Provide better information about the location of
15522         failure when CreateType fails.
15523
15524 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15525
15526         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15527         as well.
15528
15529         * expression.cs (Binary::CheckShiftArguments): Add missing type
15530         computation.
15531         (Binary::ResolveOperator): Add type to the logical and and logical
15532         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15533         before.
15534
15535         (Binary::DoNumericPromotions): In the case where either argument
15536         is ulong (and most signed types combined with ulong cause an
15537         error) perform implicit integer constant conversions as well.
15538
15539 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15540
15541         * expression.cs (UserImplicitCast): Method should always be
15542         non-null. 
15543         (Invocation::BetterConversion): Simplified test for IntLiteral.
15544
15545         (Expression::ImplicitNumericConversion): Split this routine out.
15546         Put the code that performs implicit constant integer conversions
15547         here. 
15548
15549         (Expression::Resolve): Become a wrapper around DoResolve so we can
15550         check eclass and type being set after resolve.
15551
15552         (Invocation::Badness): Remove this dead function
15553
15554         (Binary::ResolveOperator): Do not compute the expensive argumnets
15555         unless we have a union for it.
15556
15557         (Probe::Emit): Is needs to do an isinst and then
15558         compare against null.
15559
15560         (::CanConvert): Added Location argument.  If the Location argument
15561         is null (Location.Null), then we do not report errors.  This is
15562         used by the `probe' mechanism of the Explicit conversion.  We do
15563         not want to generate an error for something that the user
15564         explicitly requested to be casted.  But the pipeline for an
15565         explicit cast first tests for potential implicit casts.
15566
15567         So for now, if the Location is null, it means `Probe only' to
15568         avoid adding another argument.   Might have to revise this
15569         strategy later.
15570
15571         (ClassCast): New class used to type cast objects into arbitrary
15572         classes (used in Explicit Reference Conversions).
15573
15574         Implement `as' as well.
15575
15576         Reverted all the patches from Ravi below: they were broken:
15577
15578                 * The use of `level' as a mechanism to stop recursive
15579                   invocations is wrong.  That was there just to catch the
15580                   bug with a strack trace but not as a way of addressing
15581                   the problem.
15582
15583                   To fix the problem we have to *understand* what is going
15584                   on and the interactions and come up with a plan, not
15585                   just get things going.
15586
15587                 * The use of the type conversion cache that I proposed
15588                   last night had an open topic: How does this work across
15589                   protection domains.  A user defined conversion might not
15590                   be public in the location where we are applying the
15591                   conversion, a different conversion might be selected
15592                   (ie, private A->B (better) but public B->A (worse),
15593                   inside A, A->B applies, but outside it, B->A will
15594                   apply).
15595
15596                 * On top of that (ie, even if the above is solved),
15597                   conversions in a cache need to be abstract.  Ie, `To
15598                   convert from an Int to a Short use an OpcodeCast', not
15599                   `To convert from an Int to a Short use the OpcodeCast on
15600                   the variable 5' (which is what this patch was doing).
15601
15602 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15603
15604         * expression.cs (Invocation::ConversionExists): Re-write to use
15605         the conversion cache
15606
15607         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
15608         cache all conversions done, not just user-defined ones.
15609
15610         (Invocation::BetterConversion): The real culprit. Use ConversionExists
15611         to determine if a conversion exists instead of acutually trying to 
15612         perform the conversion. It's faster too.
15613
15614         (Expression::ConvertExplicit): Modify to use ConversionExists to check
15615         and only then attempt the implicit conversion.
15616
15617 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15618
15619         * expression.cs (ConvertImplicit): Use a cache for conversions
15620         already found. Check level of recursion and bail out if necessary.
15621
15622 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15623
15624         * typemanager.cs (string_concat_string_string, string_concat_object_object):
15625         Export standard methods that we expect for string operations.
15626
15627         * statement.cs (Block::UsageWarning): Track usage of variables and
15628         report the errors for not used variables.
15629
15630         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
15631         operator. 
15632
15633 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15634
15635         * codegen.cs: remove unnneded code 
15636
15637         * expression.cs: Removed BuiltinTypeAccess class
15638
15639         Fix the order in which implicit conversions are
15640         done.  
15641
15642         The previous fixed dropped support for boxed conversions (adding a
15643         test to the test suite now)
15644
15645         (UserImplicitCast::CanConvert): Remove test for source being null,
15646         that code is broken.  We should not feed a null to begin with, if
15647         we do, then we should track the bug where the problem originates
15648         and not try to cover it up here.
15649
15650         Return a resolved expression of type UserImplicitCast on success
15651         rather than true/false.  Ravi: this is what I was talking about,
15652         the pattern is to use a static method as a "constructor" for
15653         objects. 
15654
15655         Also, do not create arguments until the very last minute,
15656         otherwise we always create the arguments even for lookups that
15657         will never be performed. 
15658
15659         (UserImplicitCast::Resolve): Eliminate, objects of type
15660         UserImplicitCast are born in a fully resolved state. 
15661
15662         * typemanager.cs (InitCoreTypes): Init also value_type
15663         (System.ValueType). 
15664
15665         * expression.cs (Cast::Resolve): First resolve the child expression.
15666
15667         (LValue): Add new method AddressOf to be used by
15668         the `&' operator.  
15669
15670         Change the argument of Store to take an EmitContext instead of an
15671         ILGenerator, because things like FieldExpr need to be able to call
15672         their children expression to generate the instance code. 
15673
15674         (Expression::Error, Expression::Warning): Sugar functions for
15675         reporting errors.
15676
15677         (Expression::MemberLookup): Accept a TypeContainer instead of a
15678         Report as the first argument.
15679
15680         (Expression::ResolvePrimary): Killed.  I still want to improve
15681         this as currently the code is just not right.
15682
15683         (Expression::ResolveMemberAccess): Simplify, but it is still
15684         wrong. 
15685
15686         (Unary::Resolve): Catch errors in AddressOf operators.
15687
15688         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
15689         index to a byte for the short-version, or the compiler will choose
15690         the wrong Emit call, which generates the wrong data.
15691
15692         (ParameterReference::Emit, ::Store): same.
15693
15694         (FieldExpr::AddressOf): Implement.
15695
15696         * typemanager.cs: TypeManager: made public variable instead of
15697         property.
15698
15699         * driver.cs: document --fatal.
15700
15701         * report.cs (ErrorMessage, WarningMessage): new names for the old
15702         Error and Warning classes.
15703
15704         * cs-parser.jay (member_access): Turn built-in access to types
15705         into a normal simplename
15706
15707 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15708
15709         * expression.cs (Invocation::BetterConversion): Fix to cope
15710         with q being null, since this was introducing a bug.
15711
15712         * expression.cs (ConvertImplicit): Do built-in conversions first.
15713
15714 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15715
15716         * expression.cs (UserImplicitCast::Resolve): Fix bug.
15717
15718 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15719
15720         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
15721         I had introduced long ago (what's new ?).
15722
15723         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
15724         the work of all the checking. 
15725         (ConvertImplicit): Call CanConvert and only then create object if necessary.
15726         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
15727
15728         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
15729         that is the right way. 
15730
15731         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
15732         overloading resolution. Use everywhere instead of cutting and pasting code.
15733
15734         (Binary::ResolveOperator): Use MakeUnionSet.
15735
15736         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
15737         we have to convert to bool types. Not complete yet.
15738
15739 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15740
15741         * typemanager.cs (TypeManager::CSharpName): support ushort.
15742
15743         * expression.cs (Expression::TryImplicitIntConversion): Attempts
15744         to provide an expression that performsn an implicit constant int
15745         conversion (section 6.1.6).
15746         (Expression::ConvertImplicitRequired): Reworked to include
15747         implicit constant expression conversions.
15748
15749         (Expression::ConvertNumericExplicit): Finished.
15750
15751         (Invocation::Emit): If InstanceExpression is null, then it means
15752         that we perform a call on this.
15753
15754 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15755
15756         * expression.cs (Unary::Emit): Remove some dead code.
15757         (Probe): Implement Resolve and Emit for `is'.
15758         (Expression::ConvertImplicitRequired): Attempt to do constant
15759         expression conversions here.  Maybe should be moved to
15760         ConvertImplicit, but I am not sure.
15761         (Expression::ImplicitLongConstantConversionPossible,
15762         Expression::ImplicitIntConstantConversionPossible): New functions
15763         that tell whether is it possible to apply an implicit constant
15764         expression conversion.
15765
15766         (ConvertNumericExplicit): Started work on explicit numeric
15767         conversions.
15768
15769         * cs-parser.jay: Update operator constants.
15770
15771         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
15772         (Parameters::GetSignature): Hook up VerifyArgs here.
15773         (Parameters::VerifyArgs): Verifies that no two arguments have the
15774         same name. 
15775
15776         * class.cs (Operator): Update the operator names to reflect the
15777         ones that the spec expects (as we are just stringizing the
15778         operator names).
15779
15780         * expression.cs (Unary::ResolveOperator): Fix bug: Use
15781         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
15782         previous usage did only work for our methods.
15783         (Expression::ConvertImplicit): Handle decimal implicit numeric
15784         conversions as well.
15785         (Expression::InternalTypeConstructor): Used to invoke constructors
15786         on internal types for default promotions.
15787
15788         (Unary::Emit): Implement special handling for the pre/post
15789         increment/decrement for overloaded operators, as they need to have
15790         the same semantics as the other operators.
15791
15792         (Binary::ResolveOperator): ditto.
15793         (Invocation::ConversionExists): ditto.
15794         (UserImplicitCast::Resolve): ditto.
15795
15796 2001-09-26  Ravi Pratap  <ravi@ximian.com>
15797
15798         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
15799         operator, return after emitting body. Regression tests pass again !
15800
15801         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
15802         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
15803         (Invocation::OverloadResolve): Ditto.
15804         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
15805
15806         * everywhere : update calls to the above methods accordingly.
15807
15808 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15809
15810         * assign.cs (Assign): Make it inherit from ExpressionStatement.
15811
15812         * expression.cs (ExpressionStatement): New base class used for
15813         expressions that can appear in statements, so that we can provide
15814         an alternate path to generate expression that do not leave a value
15815         on the stack.
15816
15817         (Expression::Emit, and all the derivatives): We no longer return
15818         whether a value is left on the stack or not.  Every expression
15819         after being emitted leaves a single value on the stack.
15820
15821         * codegen.cs (EmitContext::EmitStatementExpression): Use the
15822         facilties of ExpressionStatement if possible.
15823
15824         * cs-parser.jay: Update statement_expression.
15825
15826 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
15827
15828         * driver.cs: Change the wording of message
15829
15830 2001-09-25  Ravi Pratap  <ravi@ximian.com>
15831
15832         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
15833         the type of the expression to the return type of the method if
15834         we have an overloaded operator match ! The regression tests pass again !
15835         (Unary::ResolveOperator): Ditto.
15836
15837         * expression.cs (Invocation::ConversionExists): Correct the member lookup
15838         to find "op_Implicit", not "implicit" ;-)
15839         (UserImplicitCast): New class to take care of user-defined implicit conversions.
15840         (ConvertImplicit, ForceConversion): Take TypeContainer argument
15841
15842         * everywhere : Correct calls to the above accordingly.
15843
15844         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
15845         (ConvertImplicit): Do user-defined conversion if it exists.
15846
15847 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
15848
15849         * assign.cs: track location.
15850         (Resolve): Use implicit conversions on assignment.
15851
15852         * literal.cs: Oops.  Not good, Emit of short access values should
15853         pass (Bytes) or the wrong argument will be selected.
15854
15855         * expression.cs (Unary::Emit): Emit code for -expr.
15856
15857         (Unary::ResolveOperator): Handle `Substract' for non-constants
15858         (substract from zero from the non-constants).
15859         Deal with Doubles as well. 
15860
15861         (Expression::ConvertImplicitRequired): New routine that reports an
15862         error if no implicit conversion exists. 
15863
15864         (Invocation::OverloadResolve): Store the converted implicit
15865         expressions if we make them
15866
15867 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15868
15869         * class.cs (ConstructorInitializer): Take a Location argument.
15870         (ConstructorBaseInitializer): Same here.
15871         (ConstructorThisInitializer): Same here.
15872
15873         * cs-parser.jay : Update all calls accordingly.
15874
15875         * expression.cs (Unary, Binary, New): Take location argument.
15876         Update accordingly everywhere.
15877
15878         * cs-parser.jay : Update all calls to the above to take a location
15879         argument.
15880
15881         * class.cs : Ditto.
15882
15883 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15884
15885         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
15886         (Invocation::BetterConversion): Same here
15887         (Invocation::ConversionExists): Ditto.
15888
15889         (Invocation::ConversionExists): Implement.
15890
15891 2001-09-22  Ravi Pratap  <ravi@ximian.com>
15892
15893         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
15894         Also take an additional TypeContainer argument.
15895
15896         * All over : Pass in TypeContainer as argument to OverloadResolve.
15897
15898         * typemanager.cs (CSharpName): Update to check for the string type and return
15899         that too.
15900
15901         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
15902         a given method.
15903
15904 2001-09-21  Ravi Pratap  <ravi@ximian.com>
15905
15906         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
15907         (Invocation::BetterFunction): Implement.
15908         (Invocation::BetterConversion): Implement.
15909         (Invocation::ConversionExists): Skeleton, no implementation yet.
15910
15911         Okay, things work fine !
15912
15913 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
15914
15915         * typemanager.cs: declare and load enum_type, delegate_type and
15916         void_type. 
15917
15918         * expression.cs (Expression::Emit): Now emit returns a value that
15919         tells whether a value is left on the stack or not.  This strategy
15920         might be reveted tomorrow with a mechanism that would address
15921         multiple assignments.
15922         (Expression::report118): Utility routine to report mismatches on
15923         the ExprClass.
15924
15925         (Unary::Report23): Report impossible type/operator combination
15926         utility function.
15927
15928         (Unary::IsIncrementableNumber): Whether the type can be
15929         incremented or decremented with add.
15930         (Unary::ResolveOperator): Also allow enumerations to be bitwise
15931         complemented. 
15932         (Unary::ResolveOperator): Implement ++, !, ~,
15933
15934         (Invocation::Emit): Deal with new Emit convetion.
15935
15936         * All Expression derivatives: Updated their Emit method to return
15937         whether they leave values on the stack or not.
15938
15939         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
15940         stack for expressions that are statements. 
15941
15942 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15943
15944         * expression.cs (LValue): New interface.  Must be implemented by
15945         LValue objects.
15946         (LocalVariableReference, ParameterReference, FieldExpr): Implement
15947         LValue interface.
15948
15949         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
15950         interface for generating code, simplifies the code.
15951
15952 2001-09-20  Ravi Pratap  <ravi@ximian.com>
15953
15954         * expression.cs (everywhere): Comment out return statements in ::Resolve
15955         methods to avoid the warnings.
15956
15957 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15958
15959         * driver.cs (parse): Report error 2001 if we can not open the
15960         source file.
15961
15962         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
15963         not resolve it.
15964
15965         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
15966         object. 
15967
15968         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
15969         otherwise nested blocks end up with the same index.
15970
15971         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
15972
15973         * expression.cs:  Instead of having FIXMEs in the Resolve
15974         functions, throw exceptions so it is obvious that we are facing a
15975         bug. 
15976
15977         * cs-parser.jay (invocation_expression): Pass Location information.
15978
15979         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
15980         Use a basename for those routines because .NET does not like paths
15981         on them. 
15982
15983         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
15984         already defined.
15985
15986 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
15987
15988         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
15989         are loading the correct data types (throws an exception if not).
15990         (TypeManager::InitCoreTypes): Use CoreLookupType
15991
15992         * expression.cs (Unary::ResolveOperator): return the child
15993         expression for expressions which are just +expr.
15994         (Unary::ResolveOperator): Return negative literals for -LITERAL
15995         expressions (otherwise they are Unary {Literal}).
15996         (Invocation::Badness): Take into account `Implicit constant
15997         expression conversions'.
15998
15999         * literal.cs (LongLiteral): Implement long literal class.
16000         (IntLiteral): export the `Value' of the intliteral. 
16001
16002 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16003
16004         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16005
16006         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16007         instead of 'Operator'
16008
16009         * expression.cs (Binary::ResolveOperator): Update accordingly.
16010         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16011         and 'Minus'
16012
16013         * cs-parser.jay (unary_expression): Update to use the new names.
16014
16015         * gen-treedump.cs (GetUnary): Same here.
16016
16017         * expression.cs (Unary::Resolve): Implement.
16018         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16019         operators are found instead of making noise ;-)
16020         (Unary::ResolveOperator): New method to do precisely the same thing which
16021         Binary::ResolveOperator does for Binary expressions.
16022         (Unary.method, .Arguments): Add.
16023         (Unary::OperName): Implement.   
16024         (Unary::ForceConversion): Copy and Paste !
16025
16026         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16027         a unary operator.
16028
16029         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16030         for the inbuilt operators. Only overloading works for now ;-)
16031
16032 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16033
16034         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16035         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16036
16037         * expression.cs (This::Emit): Implement. 
16038         (This::Resolve): Implement.
16039         (TypeOf:Resolve): Implement.
16040         (Expression::ResolveSimpleName): Add an implicit this to instance
16041         field references. 
16042         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16043         Bind instance variable to Field expressions.
16044         (FieldExpr::Instance): New field used to track the expression that
16045         represents the object instance.
16046         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16047         binding 
16048         (FieldExpr::Emit): Implement.
16049
16050         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16051         the last instruction contains a return opcode to avoid generating
16052         the last `ret' instruction (this generates correct code, and it is
16053         nice to pass the peverify output).
16054
16055         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16056         initializer for static and instance variables.
16057         (Constructor::Emit): Allow initializer to be null in the case of
16058         static constructors.  Only emit initializer for instance
16059         constructors. 
16060
16061         (TypeContainer::FindMembers): Return a null array if there are no
16062         matches.
16063
16064         Also fix the code for the MemberTypes.Method branch, as it was not
16065         scanning that for operators (or tried to access null variables before).
16066
16067         * assign.cs (Assign::Emit): Handle instance and static fields. 
16068
16069         * TODO: Updated.
16070
16071         * driver.cs: Stop compilation if there are parse errors.
16072
16073         * cs-parser.jay (constructor_declaration): Provide default base
16074         initializer for non-static constructors.
16075         (constructor_declarator): Do not provide a default base
16076         initializers if none was specified.
16077         Catch the fact that constructors should not have parameters.
16078
16079         * class.cs: Do not emit parent class initializers for static
16080         constructors, that should be flagged as an error.
16081
16082 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16083
16084         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16085         Move back code into TypeContainer::Populate.
16086
16087 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16088
16089         * class.cs (TypeContainer::AddConstructor): Fix the check to
16090         compare against Name, not Basename. 
16091         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16092
16093         * cs-parser.jay : Update accordingly.
16094
16095         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16096         for methods, don't forget to look into the operators too.
16097         (RegisterMethodBuilder): Helper method to take care of this for
16098         methods, constructors and operators.
16099         (Operator::Define): Completely revamp.
16100         (Operator.OperatorMethod, MethodName): New fields.
16101         (TypeContainer::Populate): Move the registering of builders into
16102         RegisterMethodBuilder.
16103         (Operator::Emit): Re-write.
16104
16105         * expression.cs (Binary::Emit): Comment out code path to emit method
16106         invocation stuff for the case when we have a user defined operator. I am
16107         just not able to get it right !
16108
16109 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16110
16111         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16112         argument. 
16113
16114         (Expression::MemberLookup): Provide a version that allows to
16115         specify the MemberTypes and BindingFlags. 
16116
16117         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16118         so it was not fetching variable information from outer blocks.
16119
16120         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16121         Beforefieldinit as it was buggy.
16122
16123         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16124         that Ravi put here.  
16125
16126         * class.cs (Constructor::Emit): Only emit if block is not null.
16127         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16128         deal with this by semantically definining it as if the user had
16129         done it.
16130
16131         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16132         constructors as we now "emit" them at a higher level.
16133
16134         (TypeContainer::DefineDefaultConstructor): Used to define the
16135         default constructors if none was provided.
16136
16137         (ConstructorInitializer): Add methods Resolve and Emit. 
16138
16139         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16140
16141 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16142
16143         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16144         the default constructor builder with our hashtable for methodbuilders
16145         to methodcores.
16146
16147         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16148         and argument_count is 0 in which case we have a match.
16149         (Binary::ResolveOperator): More null checking and miscellaneous coding
16150         style cleanup.
16151
16152 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16153
16154         * rootcontext.cs (IsNameSpace): Compare against null.
16155
16156         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16157
16158         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16159         and Unary::Operator.
16160
16161         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16162         accordingly.
16163
16164         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16165         we have overloaded operators.
16166         (Binary::ResolveOperator): Implement the part which does the operator overload
16167         resolution.
16168
16169         * class.cs (Operator::Emit): Implement.
16170         (TypeContainer::Emit): Emit the operators we have too.
16171
16172         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16173         the case when we have a user-defined operator.
16174
16175 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16176
16177         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16178
16179 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16180
16181         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16182         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16183         (Constructor::Emit): Implement.
16184         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16185         if we have no work to do. 
16186         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16187         Emit method.
16188
16189         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16190         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16191
16192         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16193         of parent.parent.
16194
16195 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16196
16197         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16198         in the source.
16199         (Tree::RecordNamespace): Method to do what the name says ;-)
16200         (Tree::Namespaces): Property to get at the namespaces hashtable.
16201
16202         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16203         keep track.
16204
16205         * rootcontext.cs (IsNamespace): Fixed it :-)
16206
16207 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16208
16209         * class.cs (TypeContainer::FindMembers): Add support for
16210         constructors. 
16211         (MethodCore): New class that encapsulates both the shared aspects
16212         of a Constructor and a Method.  
16213         (Method, Constructor): Factored pieces into MethodCore.
16214
16215         * driver.cs: Added --fatal which makes errors throw exceptions.
16216         Load System assembly as well as part of the standard library.
16217
16218         * report.cs: Allow throwing exceptions on errors for debugging.
16219
16220         * modifiers.cs: Do not use `parent', instead use the real type
16221         container to evaluate permission settings.
16222
16223         * class.cs: Put Ravi's patch back in.  He is right, and we will
16224         have to cope with the
16225
16226 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16227
16228         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16229         FamORAssem, not FamANDAssem.
16230
16231 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16232
16233         * driver.cs: Added --parse option that only parses its input files
16234         and terminates.
16235
16236         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16237         incorrect.  IsTopLevel is not used to tell whether an object is
16238         root_types or not (that can be achieved by testing this ==
16239         root_types).  But to see if this is a top-level *class* (not
16240         necessarly our "toplevel" container). 
16241
16242 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16243
16244         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16245         parent instead of a direct call to GetType.
16246
16247 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16248
16249         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16250         Modifiers.TypeAttr. This should just be a call to that method.
16251
16252         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16253         object so that we can determine if we are top-level or not.
16254
16255         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16256         TypeContainer too.
16257
16258         * enum.cs (Enum::Define): Ditto.
16259
16260         * modifiers.cs (FieldAttr): Re-write.
16261
16262         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16263         (TypeContainer::HaveStaticConstructor): New property to provide access
16264         to precisely that info.
16265
16266         * modifiers.cs (MethodAttr): Re-write.
16267         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16268
16269         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16270         of top-level types as claimed.
16271
16272 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16273
16274         * expression.cs (MemberLookup): Fruitless attempt to lookup
16275         constructors.  Maybe I need to emit default constructors?  That
16276         might be it (currently .NET emits this for me automatically).
16277         (Invocation::OverloadResolve): Cope with Arguments == null.
16278         (Invocation::EmitArguments): new function, shared by the new
16279         constructor and us.
16280         (Invocation::Emit): Handle static and instance methods.  Emit
16281         proper call instruction for virtual or non-virtual invocations.
16282         (New::Emit): Implement.
16283         (New::Resolve): Implement.
16284         (MemberAccess:Resolve): Implement.
16285         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16286         to track instances.
16287         (FieldExpr::Resolve): Set type.
16288
16289         * support.cs: Handle empty arguments.
16290                 
16291         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16292         SimpleLookup): Auxiliary routines to help parse a qualifier
16293         identifier.  
16294
16295         Update qualifier_identifier rule.
16296
16297         * codegen.cs: Removed debugging messages.
16298
16299         * class.cs: Make this a global thing, this acts just as a "key" to
16300         objects that we might have around.
16301
16302         (Populate): Only initialize method_builders_to_methods once.
16303
16304         * expression.cs (PropertyExpr): Initialize type from the
16305         PropertyType. 
16306
16307         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16308         Resolve pattern.  Attempt to implicitly convert value to boolean.
16309         Emit code.
16310
16311         * expression.cs: Set the type for the int32/int32 argument case.
16312         (Binary::ResolveOperator): Set the return type to boolean for
16313         comparission operators
16314
16315         * typemanager.cs: Remove debugging print code.
16316
16317         (Invocation::Resolve): resolve type.
16318
16319         * class.cs: Allocate a MemberInfo of the correct size, as the code
16320         elsewhere depends on the test to reflect the correct contents.
16321
16322         (Method::) Keep track of parameters, due to System.Reflection holes
16323
16324         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16325         mapping here.
16326
16327         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16328         of the exact size and return that.
16329
16330         (Class::LookupMethodByBuilder): New function that maps
16331         MethodBuilders to its methods.  Required to locate the information
16332         on methods because System.Reflection bit us again.
16333
16334         * support.cs: New file, contains an interface ParameterData and
16335         two implementations: ReflectionParameters and InternalParameters
16336         used to access Parameter information.  We will need to grow this
16337         as required.
16338
16339         * expression.cs (Invocation::GetParameterData): implement a cache
16340         and a wrapper around the ParameterData creation for methods. 
16341         (Invocation::OverloadResolve): Use new code.
16342
16343 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16344
16345         * class.cs (TypeContainer::EmitField): Remove and move into 
16346         (Field::Define): here and modify accordingly.
16347         (Field.FieldBuilder): New member.
16348         (TypeContainer::Populate): Update accordingly.
16349         (TypeContainer::FindMembers): Implement.
16350
16351 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16352
16353         * statement.cs: (VariableInfo::VariableType): New field to be
16354         initialized with the full type once it is resolved. 
16355
16356 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16357
16358         * parameter.cs (GetParameterInfo): Use a type cache to compute
16359         things only once, and to reuse this information
16360
16361         * expression.cs (LocalVariableReference::Emit): Implement.
16362         (OpcodeCast::Emit): fix.
16363
16364         (ParameterReference::Resolve): Implement.
16365         (ParameterReference::Emit): Implement.
16366
16367         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16368         that are expressions need to stay as Expressions.
16369
16370         * typemanager.cs (CSharpName): Returns the C# name of a type if
16371         possible. 
16372
16373         * expression.cs (Expression::ConvertImplicit): New function that
16374         implements implicit type conversions.
16375
16376         (Expression::ImplicitReferenceConversion): Implements implicit
16377         reference conversions.
16378
16379         (EmptyCast): New type for transparent casts.
16380
16381         (OpcodeCast): New type for casts of types that are performed with
16382         a sequence of bytecodes.
16383
16384         (BoxedCast): New type used for casting value types into reference
16385         types.  Emits a box opcode.
16386
16387         (Binary::DoNumericPromotions): Implements numeric promotions of
16388         and computation of the Binary::Type.
16389
16390         (Binary::EmitBranchable): Optimization.
16391
16392         (Binary::Emit): Implement code emission for expressions.
16393
16394         * typemanager.cs (TypeManager): Added two new core types: sbyte
16395         and byte.
16396
16397 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16398
16399         * class.cs (TypeContainer::FindMembers): Method which does exactly
16400         what Type.FindMembers does, only we don't have to use reflection. No
16401         implementation yet.
16402
16403         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16404         typecontainer objects as we need to get at them.
16405         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16406
16407         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16408         typecontainer object.
16409
16410         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16411         of just a Report object.
16412
16413 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16414
16415         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16416         "remove_"
16417         (TypeContainer::Populate): Now define the delegates of the type too.
16418         (TypeContainer.Delegates): Property to access the list of delegates defined
16419         in the type.
16420
16421         * delegates.cs (Delegate::Define): Implement partially.
16422
16423         * modifiers.cs (TypeAttr): Handle more flags.
16424
16425 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16426
16427         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16428         and not <=
16429         (Operator::Define): Re-write logic to get types by using the LookupType method
16430         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16431         (Indexer::Define): Ditto.
16432         (Event::Define): Ditto.
16433         (Property::Define): Ditto.
16434
16435 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16436
16437         * class.cs (TypeContainer::Populate): Now define operators too. 
16438         (TypeContainer.Operators): New property to access the list of operators
16439         in a type.
16440         (Operator.OperatorMethodBuilder): New member to hold the method builder
16441         for the operator we are defining.
16442         (Operator::Define): Implement.
16443
16444 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16445
16446         * class.cs (Event::Define): Make the prefixes of the accessor methods
16447         addOn_ and removeOn_ 
16448
16449         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16450         of the location being passed in too. Ideally, this should go later since all
16451         error reporting should be done through the Report object.
16452
16453         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16454         (Populate): Iterate thru the indexers we have and define them too.
16455         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16456         for the get and set accessors.
16457         (Indexer::Define): Implement.
16458
16459 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16460
16461         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16462         my previous implementation, did not work.
16463
16464         * typemanager.cs: Add a couple of missing types (the longs).
16465
16466         * literal.cs: Use TypeManager.bool_type instead of getting it.
16467
16468         * expression.cs (EventExpr): New kind of expressions.
16469         (Expressio::ExprClassFromMemberInfo): finish
16470
16471 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
16472
16473         * assign.cs: Emit stores to static fields differently.
16474
16475 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16476
16477         * Merge in changes and adjust code to tackle conflicts. Backed out my
16478         code in Assign::Resolve ;-) 
16479
16480 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16481
16482         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
16483         instead Report.Error and also pass in the location.
16484         (CSharpParser::Lexer): New readonly property to return the reference
16485         to the Tokenizer object.
16486         (declare_local_variables): Use Report.Error with location instead of plain 
16487         old error.
16488         (CheckDef): Ditto.
16489
16490         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16491         (Operator.CheckBinaryOperator): Ditto.
16492
16493         * cs-parser.jay (operator_declarator): Update accordingly.
16494
16495         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16496         (CheckBinaryOperator): Same here.
16497
16498         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16499         on the name without any prefixes of namespace names etc. This is because we
16500         already might have something already fully qualified like 
16501         'System.Console.WriteLine'
16502
16503         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16504
16505 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16506
16507         * cs-tokenizer.cs (location): Return a string which also contains
16508         the file name.
16509
16510         * expression.cs (ElementAccess): New class for expressions of the
16511         type 'element access.'
16512         (BaseAccess): New class for expressions of the type 'base access.'
16513         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16514         respectively.
16515
16516         * cs-parser.jay (element_access): Implement action.
16517         (base_access): Implement actions.
16518         (checked_expression, unchecked_expression): Implement.
16519
16520         * cs-parser.jay (local_variable_type): Correct and implement.
16521         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16522
16523         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16524
16525         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16526         name and the specifiers.
16527
16528         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16529
16530         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16531         making them all public ;-)
16532
16533         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16534         class anyways.
16535
16536 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16537
16538         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16539         PropertyExprs.
16540         (FieldExpr, PropertyExprs): New resolved expressions.
16541         (SimpleName::MemberStaticCheck): Perform static checks for access
16542         to non-static fields on static methods. Maybe this should be
16543         generalized for MemberAccesses. 
16544         (SimpleName::ResolveSimpleName): More work on simple name
16545         resolution. 
16546
16547         * cs-parser.jay (primary_expression/qualified_identifier): track
16548         the parameter index.
16549
16550         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16551         (EmitContext::EmitBoolExpression): Chain to expression generation
16552         instead of temporary hack.
16553         (::EmitStatementExpression): Put generic expression code generation.
16554
16555         * assign.cs (Assign::Emit): Implement variable assignments to
16556         local variables, parameters and fields.
16557
16558 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16559
16560         * statement.cs (Block::GetVariableInfo): New method, returns the
16561         VariableInfo for a variable name in a block.
16562         (Block::GetVariableType): Implement in terms of GetVariableInfo
16563
16564         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16565         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16566
16567 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16568
16569         * cs-parser.jay (operator_declaration): Continue on my quest : update
16570         to take attributes argument.
16571         (event_declaration): Ditto.
16572         (enum_declaration): Ditto.
16573         (indexer_declaration): Ditto.
16574
16575         * class.cs (Operator::Operator): Update constructor accordingly.
16576         (Event::Event): Ditto.
16577
16578         * delegate.cs (Delegate::Delegate): Same here.
16579
16580         * enum.cs (Enum::Enum): Same here.
16581
16582 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16583
16584         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16585
16586         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16587
16588         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16589         being passed around as an arraylist.
16590         (Attributes::AddAttribute): Method to add attribute sections.
16591
16592         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16593         (struct_declaration): Update accordingly.
16594         (constant_declaration): Update.
16595         (field_declaration): Update.
16596         (method_header): Update.
16597         (fixed_parameter): Update.
16598         (parameter_array): Ditto.
16599         (property_declaration): Ditto.
16600         (destructor_declaration): Ditto.
16601
16602         * class.cs (Struct::Struct): Update constructors accordingly.
16603         (Class::Class): Ditto.
16604         (Field::Field): Ditto.
16605         (Method::Method): Ditto.
16606         (Property::Property): Ditto.
16607         (TypeContainer::OptAttribute): update property's return type.
16608
16609         * interface.cs (Interface.opt_attributes): New member.
16610         (Interface::Interface): Update to take the extra Attributes argument.
16611
16612         * parameter.cs (Parameter::Parameter): Ditto.
16613
16614         * constant.cs (Constant::Constant): Ditto.
16615
16616         * interface.cs (InterfaceMemberBase): New OptAttributes field.
16617         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
16618         the attributes as a parameter.
16619         (InterfaceProperty): Update constructor call.
16620         (InterfaceEvent): Ditto.
16621         (InterfaceMethod): Ditto.
16622         (InterfaceIndexer): Ditto.
16623
16624         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
16625         pass the attributes too.
16626         (interface_event_declaration): Ditto.
16627         (interface_property_declaration): Ditto.
16628         (interface_method_declaration): Ditto.
16629         (interface_declaration): Ditto.
16630
16631 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
16632
16633         * class.cs (Method::Define): Track the "static Main" definition to
16634         create an entry point. 
16635
16636         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
16637         EntryPoint if we find it. 
16638
16639         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
16640         (EmitContext::ig): Make this variable public.
16641
16642         * driver.cs: Make the default output file be the first file name
16643         with the .exe extension.  
16644
16645         Detect empty compilations
16646
16647         Handle various kinds of output targets.  Handle --target and
16648         rename -t to --dumper.
16649
16650         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
16651         methods inherited from Expression return now an Expression.  This
16652         will is used during the tree rewriting as we resolve them during
16653         semantic analysis.
16654
16655         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
16656         the spec.  Missing entirely is the information about
16657         accessability of elements of it.
16658
16659         (Expression::ExprClassFromMemberInfo): New constructor for
16660         Expressions that creates a fully initialized Expression based on
16661         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
16662         a Type.
16663
16664         (Invocation::Resolve): Begin implementing resolution of invocations.
16665
16666         * literal.cs (StringLiteral):  Implement Emit.
16667
16668 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16669
16670         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
16671         member.
16672
16673 2001-09-04  Ravi Pratap  <ravi@ximian.com>
16674
16675         * cs-parser.jay (attribute_arguments): Implement actions.
16676         (attribute): Fix bug in production. Implement action.
16677         (attribute_list): Implement.
16678         (attribute_target): Implement.
16679         (attribute_target_specifier, opt_target_specifier): Implement
16680         (CheckAttributeTarget): New method to check if the attribute target
16681         is valid.
16682         (attribute_section): Implement.
16683         (opt_attributes): Implement.
16684
16685         * attribute.cs : New file to handle attributes.
16686         (Attribute): Class to hold attribute info.
16687
16688         * cs-parser.jay (opt_attribute_target_specifier): Remove production
16689         (attribute_section): Modify production to use 2 different rules to 
16690         achieve the same thing. 1 s/r conflict down !
16691         Clean out commented, useless, non-reducing dimension_separator rules.
16692
16693         * class.cs (TypeContainer.attributes): New member to hold list
16694         of attributes for a type.
16695         (Struct::Struct): Modify to take one more argument, the attribute list.
16696         (Class::Class): Ditto.
16697         (Field::Field): Ditto.
16698         (Method::Method): Ditto.
16699         (Property::Property): Ditto.
16700
16701         * cs-parser.jay (struct_declaration): Update constructor call to
16702         pass in the attributes too.
16703         (class_declaration): Ditto.
16704         (constant_declaration): Ditto.
16705         (field_declaration): Ditto.
16706         (method_header): Ditto.
16707         (fixed_parameter): Ditto.
16708         (parameter_array): Ditto.
16709         (property_declaration): Ditto.
16710
16711         * constant.cs (Constant::Constant): Update constructor similarly.
16712         Use System.Collections.
16713
16714         * parameter.cs (Parameter::Parameter): Update as above.
16715
16716 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16717
16718         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
16719         (TypeContainer.delegates): New member to hold list of delegates.
16720
16721         * cs-parser.jay (delegate_declaration): Implement the action correctly 
16722         this time as I seem to be on crack ;-)
16723
16724 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
16725
16726         * rootcontext.cs (RootContext::IsNamespace): new function, used to
16727         tell whether an identifier represents a namespace.
16728
16729         * expression.cs (NamespaceExpr): A namespace expression, used only
16730         temporarly during expression resolution.
16731         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
16732         utility functions to resolve names on expressions.
16733
16734 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
16735
16736         * codegen.cs: Add hook for StatementExpressions. 
16737
16738         * class.cs: Fix inverted test for static flag in methods.
16739
16740 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16741
16742         * class.cs (Operator::CheckUnaryOperator): Correct error number used
16743         to make it coincide with MS' number.
16744         (Operator::CheckBinaryOperator): Ditto.
16745
16746         * ../errors/errors.txt : Remove error numbers added earlier.
16747
16748         * ../errors/cs1019.cs : Test case for error # 1019
16749
16750         * ../errros/cs1020.cs : Test case for error # 1020
16751
16752         * cs-parser.jay : Clean out commented cruft.
16753         (dimension_separators, dimension_separator): Comment out. Ostensibly not
16754         used anywhere - non-reducing rule.
16755         (namespace_declarations): Non-reducing rule - comment out.
16756
16757         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
16758         with TypeContainer::AddEnum.
16759
16760         * delegate.cs : New file for delegate handling classes.
16761         (Delegate): Class for declaring delegates.
16762
16763         * makefile : Update.
16764
16765         * cs-parser.jay (delegate_declaration): Implement.
16766
16767 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
16768
16769         * class.cs (Event::Define): Implement.
16770         (Event.EventBuilder): New member.
16771
16772         * class.cs (TypeContainer::Populate): Update to define all enums and events
16773         we have.
16774         (Events): New property for the events arraylist we hold. Shouldn't we move to using
16775         readonly fields for all these cases ?
16776
16777 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16778
16779         * class.cs (Property): Revamp to use the convention of making fields readonly.
16780         Accordingly modify code elsewhere.
16781
16782         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
16783         the Define method of the Property class.
16784
16785         * class.cs : Clean up applied patch and update references to variables etc. Fix 
16786         trivial bug.
16787         (TypeContainer::Populate): Update to define all the properties we have. Also
16788         define all enumerations.
16789
16790         * enum.cs (Define): Implement.
16791
16792 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16793
16794         * cs-parser.jay (overloadable_operator): The semantic value is an
16795         enum of the Operator class.
16796         (operator_declarator): Implement actions.
16797         (operator_declaration): Implement.
16798
16799         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
16800         validity of definitions.
16801         (Operator::CheckBinaryOperator): Static method to check for binary operators
16802         (TypeContainer::AddOperator): New method to add an operator to a type.
16803
16804         * cs-parser.jay (indexer_declaration): Added line to actually call the
16805         AddIndexer method so it gets added ;-)
16806
16807         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
16808         already taken care of by the MS compiler ?  
16809
16810 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16811
16812         * class.cs (Operator): New class for operator declarations.
16813         (Operator::OpType): Enum for the various operators.
16814
16815 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16816
16817         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
16818         ostensibly handle this in semantic analysis.
16819
16820         * cs-parser.jay (general_catch_clause): Comment out
16821         (specific_catch_clauses, specific_catch_clause): Ditto.
16822         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
16823         (catch_args, opt_catch_args): New productions.
16824         (catch_clause): Rewrite to use the new productions above
16825         (catch_clauses): Modify accordingly.
16826         (opt_catch_clauses): New production to use in try_statement
16827         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
16828         and re-write the code in the actions to extract the specific and
16829         general catch clauses by being a little smart ;-)
16830
16831         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
16832         Hooray, try and catch statements parse fine !
16833
16834 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16835
16836         * statement.cs (Block::GetVariableType): Fix logic to extract the type
16837         string from the hashtable of variables.
16838
16839         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
16840         I end up making that mistake ;-)
16841         (catch_clauses): Fixed gross error which made Key and Value of the 
16842         DictionaryEntry the same : $1 !!
16843
16844 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16845
16846         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
16847
16848         * cs-parser.jay (event_declaration): Correct to remove the semicolon
16849         when the add and remove accessors are specified. 
16850
16851 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16852
16853         * cs-parser.jay (IndexerDeclaration): New helper class to hold
16854         information about indexer_declarator.
16855         (indexer_declarator): Implement actions.
16856         (parsing_indexer): New local boolean used to keep track of whether
16857         we are parsing indexers or properties. This is necessary because 
16858         implicit_parameters come into picture even for the get accessor in the 
16859         case of an indexer.
16860         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
16861
16862         * class.cs (Indexer): New class for indexer declarations.
16863         (TypeContainer::AddIndexer): New method to add an indexer to a type.
16864         (TypeContainer::indexers): New member to hold list of indexers for the
16865         type.
16866
16867 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16868
16869         * cs-parser.jay (add_accessor_declaration): Implement action.
16870         (remove_accessor_declaration): Implement action.
16871         (event_accessors_declaration): Implement
16872         (variable_declarators): swap statements for first rule - trivial.
16873
16874         * class.cs (Event): New class to hold information about event
16875         declarations.
16876         (TypeContainer::AddEvent): New method to add an event to a type
16877         (TypeContainer::events): New member to hold list of events.
16878
16879         * cs-parser.jay (event_declaration): Implement actions.
16880
16881 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16882
16883         * cs-parser.jay (dim_separators): Implement. Make it a string
16884         concatenating all the commas together, just as they appear.
16885         (opt_dim_separators): Modify accordingly
16886         (rank_specifiers): Update accordingly. Basically do the same
16887         thing - instead, collect the brackets here.
16888         (opt_rank_sepcifiers): Modify accordingly.
16889         (array_type): Modify to actually return the complete type string
16890         instead of ignoring the rank_specifiers.
16891         (expression_list): Implement to collect the expressions
16892         (variable_initializer): Implement. We make it a list of expressions
16893         essentially so that we can handle the array_initializer case neatly too.
16894         (variable_initializer_list): Implement.
16895         (array_initializer): Make it a list of variable_initializers
16896         (opt_array_initializer): Modify accordingly.
16897
16898         * expression.cs (New::NType): Add enumeration to help us
16899         keep track of whether we have an object/delegate creation
16900         or an array creation.
16901         (New:NewType, New::Rank, New::Indices, New::Initializers): New
16902         members to hold data about array creation.
16903         (New:New): Modify to update NewType
16904         (New:New): New Overloaded contructor for the array creation
16905         case.
16906
16907         * cs-parser.jay (array_creation_expression): Implement to call
16908         the overloaded New constructor.
16909
16910 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
16911
16912         * class.cs (TypeContainer::Constructors): Return member
16913         constructors instead of returning null.
16914
16915 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
16916
16917         * typemanager.cs (InitCoreTypes): Initialize the various core
16918         types after we have populated the type manager with the user
16919         defined types (this distinction will be important later while
16920         compiling corlib.dll)
16921
16922         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
16923         on Expression Classification.  Now all expressions have a method
16924         `Resolve' and a method `Emit'.
16925
16926         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
16927         generation from working.     Also add some temporary debugging
16928         code. 
16929
16930 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
16931
16932         * codegen.cs: Lots of code generation pieces.  This is only the
16933         beginning, will continue tomorrow with more touches of polish.  We
16934         handle the fundamentals of if, while, do, for, return.  Others are
16935         trickier and I need to start working on invocations soon.
16936
16937         * gen-treedump.cs: Bug fix, use s.Increment here instead of
16938         s.InitStatement. 
16939
16940         * codegen.cs (EmitContext): New struct, used during code
16941         emission to keep a context.   Most of the code generation will be
16942         here. 
16943
16944         * cs-parser.jay: Add embedded blocks to the list of statements of
16945         this block.  So code generation proceeds in a top down fashion.
16946
16947 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
16948
16949         * statement.cs: Add support for multiple child blocks.
16950
16951 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
16952
16953         * codegen.cs (EmitCode): New function, will emit the code for a
16954         Block of code given a TypeContainer and its ILGenerator. 
16955
16956         * statement.cs (Block): Standard public readonly optimization.
16957         (Block::Block constructors): Link children. 
16958         (Block::Child): Child Linker.
16959         (Block::EmitVariables): Emits IL variable declarations.
16960
16961         * class.cs: Drop support for MethodGroups here, delay until
16962         Semantic Analysis.
16963         (Method::): Applied the same simplification that I did before, and
16964         move from Properties to public readonly fields.
16965         (Method::ParameterTypes): Returns the parameter types for the
16966         function, and implements a cache that will be useful later when I
16967         do error checking and the semantic analysis on the methods is
16968         performed.
16969         (Constructor::GetCallingConvention): Renamed from CallingConvetion
16970         and made a method, optional argument tells whether this is a class
16971         or a structure to apply the `has-this' bit.
16972         (Method::GetCallingConvention): Implement, returns the calling
16973         convention. 
16974         (Method::Define): Defines the type, a second pass is performed
16975         later to populate the methods.
16976
16977         (Constructor::ParameterTypes): implement a cache similar to the
16978         one on Method::ParameterTypes, useful later when we do semantic
16979         analysis. 
16980
16981         (TypeContainer::EmitMethod):  New method.  Emits methods.
16982
16983         * expression.cs: Removed MethodGroup class from here.
16984
16985         * parameter.cs (Parameters::GetCallingConvention): new method.
16986
16987 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
16988
16989         * class.cs (TypeContainer::Populate): Drop RootContext from the
16990         argument. 
16991
16992         (Constructor::CallingConvention): Returns the calling convention.
16993         (Constructor::ParameterTypes): Returns the constructor parameter
16994         types. 
16995
16996         (TypeContainer::AddConstructor): Keep track of default constructor
16997         and the default static constructor.
16998
16999         (Constructor::) Another class that starts using `public readonly'
17000         instead of properties. 
17001
17002         (Constructor::IsDefault): Whether this is a default constructor. 
17003
17004         (Field::) use readonly public fields instead of properties also.
17005
17006         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17007         track of static constructors;  If none is used, turn on
17008         BeforeFieldInit in the TypeAttributes. 
17009
17010         * cs-parser.jay (opt_argument_list): now the return can be null
17011         for the cases where there are no arguments. 
17012
17013         (constructor_declarator): If there is no implicit `base' or
17014         `this', then invoke the default parent constructor. 
17015
17016         * modifiers.cs (MethodAttr): New static function maps a set of
17017         modifiers flags into a MethodAttributes enum
17018         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17019         MethodAttr, TypeAttr to represent the various mappings where the
17020         modifiers are used.
17021         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17022
17023 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17024
17025         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17026         method arguments.
17027
17028         * interface.cs (PopulateIndexer): Implemented the code generator
17029         for interface indexers.
17030
17031 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17032
17033         * interface.cs (InterfaceMemberBase): Now we track the new status
17034         here.  
17035
17036         (PopulateProperty): Implement property population.  Woohoo!  Got
17037         Methods and Properties going today. 
17038
17039         Removed all the properties for interfaces, and replaced them with
17040         `public readonly' fields. 
17041
17042 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17043
17044         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17045         initialize their hashtables/arraylists only when they are needed
17046         instead of doing this always.
17047
17048         * parameter.cs: Handle refs and out parameters.
17049
17050         * cs-parser.jay: Use an ArrayList to construct the arguments
17051         instead of the ParameterCollection, and then cast that to a
17052         Parameter[] array.
17053
17054         * parameter.cs: Drop the use of ParameterCollection and use
17055         instead arrays of Parameters.
17056
17057         (GetParameterInfo): Use the Type, not the Name when resolving
17058         types. 
17059
17060 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17061
17062         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17063         and instead use public readonly fields.
17064
17065         * class.cs: Put back walking code for type containers.
17066
17067 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17068
17069         * class.cs (MakeConstant): Code to define constants.
17070
17071         * rootcontext.cs (LookupType): New function.  Used to locate types 
17072
17073
17074 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17075
17076         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17077         this System.Reflection code is.  Kudos to Microsoft
17078
17079         * typemanager.cs: Implement a type cache and avoid loading all
17080         types at boot time.  Wrap in LookupType the internals.  This made
17081         the compiler so much faster.  Wow.  I rule!
17082
17083         * driver.cs: Make sure we always load mscorlib first (for
17084         debugging purposes, nothing really important).
17085
17086         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17087         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17088
17089         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17090         on namespaces that have been imported using the `using' keyword.
17091
17092         * class.cs (TypeContainer::TypeAttr): Virtualize.
17093         (Class::TypeAttr): Return attributes suitable for this bad boy.
17094         (Struct::TypeAttr): ditto.
17095         Handle nested classes.
17096         (TypeContainer::) Remove all the type visiting code, it is now
17097         replaced with the rootcontext.cs code
17098
17099         * rootcontext.cs (GetClassBases): Added support for structs. 
17100
17101 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17102
17103         * interface.cs, statement.cs, class.cs, parameter.cs,
17104         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17105         Drop use of TypeRefs, and use strings instead.
17106
17107 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17108
17109         * rootcontext.cs: 
17110
17111         * class.cs (Struct::Struct): set the SEALED flags after
17112         checking the modifiers.
17113         (TypeContainer::TypeAttr): new property, returns the
17114         TypeAttributes for a class.  
17115
17116         * cs-parser.jay (type_list): Oops, list production was creating a
17117         new list of base types.
17118
17119         * rootcontext.cs (StdLib): New property.
17120         (GetInterfaceTypeByName): returns an interface by type name, and
17121         encapsulates error handling here.
17122         (GetInterfaces): simplified.
17123         (ResolveTree): Encapsulated all the tree resolution here.
17124         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17125         types. 
17126
17127         * driver.cs: Add support for --nostdlib, to avoid loading the
17128         default assemblies.
17129         (Main): Do not put tree resolution here. 
17130
17131         * rootcontext.cs: Beginning of the class resolution.
17132
17133 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17134
17135         * rootcontext.cs: Provide better error reporting. 
17136
17137         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17138
17139         * rootcontext.cs (CreateInterface): Handle the case where there
17140         are no parent interfaces.
17141
17142         (CloseTypes): Routine to flush types at the end.
17143         (CreateInterface): Track types.
17144         (GetInterfaces): Returns an array of Types from the list of
17145         defined interfaces.
17146
17147         * typemanager.c (AddUserType): Mechanism to track user types (puts
17148         the type on the global type hash, and allows us to close it at the
17149         end). 
17150
17151 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17152
17153         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17154         RecordInterface instead.
17155
17156         * cs-parser.jay: Updated to reflect changes above.
17157
17158         * decl.cs (Definition): Keep track of the TypeBuilder type that
17159         represents this type here.  Not sure we will use it in the long
17160         run, but wont hurt for now.
17161
17162         * driver.cs: Smaller changes to accomodate the new code.
17163
17164         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17165         when done. 
17166
17167         * rootcontext.cs (CreateInterface):  New method, used to create
17168         the System.TypeBuilder type for interfaces.
17169         (ResolveInterfaces): new entry point to resolve the interface
17170         hierarchy. 
17171         (CodeGen): Property, used to keep track of the code generator.
17172
17173 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17174
17175         * cs-parser.jay: Add a second production for delegate_declaration
17176         with `VOID'.
17177
17178         (enum_body): Put an opt_comma here instead of putting it on
17179         enum_body or enum_member_declarations so we can handle trailing
17180         commas on enumeration members.  Gets rid of a shift/reduce.
17181
17182         (type_list): Need a COMMA in the middle.
17183
17184         (indexer_declaration): Tell tokenizer to recognize get/set
17185
17186         * Remove old targets.
17187
17188         * Re-add the parser target.
17189
17190 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17191
17192         * cs-parser.jay: Add precendence rules for a number of operators
17193         ot reduce the number of shift/reduce conflicts in the grammar.
17194
17195 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17196
17197         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17198         and put it here.
17199
17200         Get rid of old crufty code.
17201
17202         * rootcontext.cs: Use this to keep track of the parsed
17203         representation and the defined types available to the program. 
17204
17205         * gen-treedump.cs: adjust for new convention.
17206
17207         * type.cs: Split out the type manager, and the assembly builder
17208         from here. 
17209
17210         * typemanager.cs: the type manager will live here now.
17211
17212         * cil-codegen.cs: And the code generator here. 
17213
17214 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17215
17216         * makefile: Fixed up for easy making.
17217
17218 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17219
17220         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17221         the 
17222
17223         (unary_expression): Expand pre_increment_expression and
17224         post_decrement_expression to reduce a shift/reduce.
17225
17226 2001-07-11  Simon Cozens
17227
17228         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17229
17230         Improve allow_keyword_as_indent name.
17231
17232 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17233
17234         * Adjustments for Beta2. 
17235
17236 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17237
17238         * decl.cs: Added `Define' abstract method.
17239         (InTransit): new property, used to catch recursive definitions. 
17240
17241         * interface.cs: Implement `Define'. 
17242
17243         * modifiers.cs: Map Modifiers.constants to
17244         System.Reflection.TypeAttribute flags.
17245
17246         * class.cs: Keep track of types and user-defined types.
17247         (BuilderInit): New method for creating an assembly
17248         (ResolveType): New function to launch the resolution process, only
17249         used by interfaces for now.
17250
17251         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17252         that are inserted into the name space. 
17253
17254 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17255
17256         * ARGH.  I have screwed up my tree so many times due to the use of
17257         rsync rather than using CVS.  Going to fix this at once. 
17258
17259         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17260         load types.
17261
17262 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17263
17264         * Experiment successful: Use System.Type rather that our own
17265         version of Type.  
17266
17267 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17268
17269         * cs-parser.jay: Removed nsAliases from here.
17270
17271         Use new namespaces, handle `using XXX;' 
17272
17273         * namespace.cs: Reimplemented namespace handling, use a recursive
17274         definition of the class.  Now we can keep track of using clauses
17275         and catch invalid using clauses.
17276
17277 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17278
17279         * gen-treedump.cs: Adapted for all the renaming.
17280
17281         * expression.cs (Expression): this class now has a Type property
17282         which returns an expression Type.
17283
17284         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17285         `Type', as this has a different meaning now in the base
17286
17287 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17288
17289         * interface.cs, class.cs: Removed from all the sources the
17290         references to signature computation, as we can not do method
17291         signature computation during the parsing time, as we are not
17292         trying to solve at that point distinguishing:
17293
17294         class X {
17295                 void a (Blah x) {}
17296                 void a (NS.Blah x) {}
17297         }
17298
17299         Which depending on the context might be valid or not, as we do not
17300         know if Blah is the same thing as NS.Blah at that point.
17301
17302         * Redid everything so the code uses TypeRefs now instead of
17303         Types.  TypeRefs are just temporary type placeholders, that need
17304         to be resolved.  They initially have a pointer to a string and the
17305         current scope in which they are used.  This is used later by the
17306         compiler to resolve the reference to an actual Type. 
17307
17308         * DeclSpace is no longer a CIR.Type, and neither are
17309         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17310         are all DeclSpaces, but no Types. 
17311
17312         * type.cs (TypeRefManager): This implements the TypeRef manager,
17313         which keeps track of all the types that need to be resolved after
17314         the parsing has finished. 
17315
17316 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17317
17318         * ARGH.  We are going to have to store `foreach' as a class rather
17319         than resolving it, as we need to verify error 1579 after name
17320         resolution.   *OR* we could keep a flag that says `This request to
17321         IEnumerator comes from a foreach statement' which we can then use
17322         to generate the error.
17323
17324 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17325
17326         * class.cs (TypeContainer.AddMethod): we now add methods to the
17327         MethodGroup instead of the method hashtable.  
17328
17329         * expression.cs: Add MethodGroup abstraction, which gets us one
17330         step closer to the specification in the way we handle method
17331         declarations.  
17332
17333         * cs-parser.jay (primary_expression): qualified_identifier now
17334         tried to match up an identifier to a local variable reference or
17335         to a parameter reference.
17336
17337         current_local_parameters is now a parser global variable that
17338         points to the current parameters for the block, used during name
17339         lookup.
17340
17341         (property_declaration): Now creates an implicit `value' argument to
17342         the set accessor.
17343
17344 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17345
17346         * parameter.cs: Do not use `param' arguments as part of the
17347         signature, per the spec.
17348
17349 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17350
17351         * decl.cs: Base class for classes, structs and interfaces.  This
17352         is the "Declaration Space" 
17353
17354         * cs-parser.jay: Use CheckDef for checking declaration errors
17355         instead of having one on each function.
17356
17357         * class.cs: Factor out some code for handling error handling in
17358         accordance to the "Declarations" section in the "Basic Concepts"
17359         chapter in the ECMA C# spec.
17360
17361         * interface.cs: Make all interface member classes derive from
17362         InterfaceMemberBase.
17363
17364 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17365
17366         * Many things: all interfaces are parsed and generated in
17367         gen-treedump.  Support for member variables, constructors,
17368         destructors, properties, constants is there.
17369
17370         Beginning of the IL backend, but very little done, just there for
17371         testing purposes. 
17372
17373 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17374
17375         * cs-parser.jay: Fix labeled statement.
17376
17377         * cs-tokenizer.cs (escape): Escape " and ' always.
17378         ref_line, ref_name: keep track of the line/filename as instructed
17379         by #line by the compiler.
17380         Parse #line.
17381
17382 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17383
17384         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17385         to match the values in System.CodeDOM.
17386
17387         Divid renamed to Divide.
17388
17389         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17390         statements. 
17391         (Statements.set): remove.
17392
17393         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17394         statements. 
17395
17396         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17397         falseStatements always have valid values. 
17398
17399         * cs-parser.jay: Use System.CodeDOM now.
17400