2004-10-31 Marek Safar <marek.safar@seznam.cz>
[mono.git] / mcs / mcs / ChangeLog
1 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
2
3         * cs-parser.jay: Add error 1001 report.
4
5 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
6
7         Fix #68850
8         * attribute.cs (GetMarshal): Add method argument for
9         caller identification.
10
11         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
12         agument for GetMarshal and RuntimeMissingSupport.
13
14 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
15
16         * attribute.cs (ExtractSecurityPermissionSet): Removed
17         TypeManager.code_access_permission_type.
18
19         * typemanager.cs: Removed TypeManager.code_access_permission_type.
20
21 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
22
23         * expression.cs (LocalVariableReference.DoResolveLValue): Check
24         for obsolete use of a variable here.   Fixes regression on errors
25         cs0619-25 and cs0619-26.
26
27 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
28
29         Fix #62358, implemented security attribute encoding.
30
31         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
32         Tests permitted SecurityAction for assembly or other types.
33         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
34         data from SecurityPermissionAttribute to PermisionSet class.
35
36         * class.cs (ApplyAttributeBuilder): Added special handling
37         for System.Security.Permissions.SecurityAttribute based types.
38
39         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
40         special handling for System.Security.Permissions.SecurityAttribute
41         based types.
42
43         * enum.cs (ApplyAttributeBuilder): Added special handling
44         for System.Security.Permissions.SecurityAttribute based types.
45
46         * parameter.cs (ApplyAttributeBuilder): Added special handling
47         for System.Security.Permissions.SecurityAttribute based types.
48
49         * rootcontext.cs: Next 2 core types.
50
51         * typemanager.cs (TypeManager.security_permission_attr_type):
52         Built in type for the SecurityPermission Attribute.
53         (code_access_permission_type): Build in type.
54
55 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
56
57         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
58         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
59         all of this information into
60         EmitContext.EmitCapturedVariableInstance.
61         
62         * codegen.cs (EmitCapturedVariableInstance): move here the
63         funcionality of emitting an ldarg.0 in the presence of a
64         remapping.   This centralizes the instance emit code.
65
66         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
67         then emit a load of this: it means that we have reached the
68         topmost ScopeInfo: the one that contains the pointer to the
69         instance of the class hosting the anonymous method.
70
71         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
72         captures to the topmost CaptureContext.
73
74 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
75
76         * expression.cs (LocalVariableReference): Move the knowledge about
77         the iterators into codegen's EmitCapturedVariableInstance.
78
79 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
80
81         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
82         all code paths return a value from an anonymous method (it is the
83         same as the 161 error, but for anonymous methods).
84
85 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
86
87         The introduction of anonymous methods in the compiler changed
88         various ways of doing things in the compiler.  The most
89         significant one is the hard split between the resolution phase
90         and the emission phases of the compiler.
91
92         For instance, routines that referenced local variables no
93         longer can safely create temporary variables during the
94         resolution phase: they must do so from the emission phase,
95         since the variable might have been "captured", hence access to
96         it can not be done with the local-variable operations from the runtime.
97         
98         * statement.cs 
99
100         (Block.Flags): New flag `IsTopLevel' to indicate that this block
101         is a toplevel block.
102
103         (ToplevelBlock): A new kind of Block, these are the blocks that
104         are created by the parser for all toplevel method bodies.  These
105         include methods, accessors and anonymous methods.
106
107         These contain some extra information not found in regular blocks:
108         A pointer to an optional CaptureContext (for tracking captured
109         local variables and parameters).  A pointer to the parent
110         ToplevelBlock.
111         
112         (Return.Resolve): Catch missmatches when returning a value from an
113         anonymous method (error 1662).
114         Invoke NeedReturnLabel from the Resolve phase instead of the emit
115         phase.
116
117         (Break.Resolve): ditto.
118
119         (SwitchLabel): instead of defining the labels during the
120         resolution phase, we now turned the public ILLabel and ILLabelCode
121         labels into methods called GetILLabelCode() and GetILLabel() that
122         only define the label during the Emit phase.
123
124         (GotoCase): Track the SwitchLabel instead of the computed label
125         (its contained therein).  Emit the code by using
126         SwitchLabel.GetILLabelCode ().
127
128         (LocalInfo.Flags.Captured): A new flag has been introduce to track
129         whether the Local has been captured or not.
130
131         (LocalInfo.IsCaptured): New property, used to tell whether the
132         local has been captured.
133         
134         * anonymous.cs: Vastly updated to contain the anonymous method
135         support.
136
137         The main classes here are: CaptureContext which tracks any
138         captured information for a toplevel block and ScopeInfo used to
139         track the activation frames for various local variables.   
140
141         Each toplevel block has an optional capture context associated
142         with it.  When a method contains an anonymous method both the
143         toplevel method and the anonymous method will create a capture
144         context.   When variables or parameters are captured, they are
145         recorded on the CaptureContext that owns them, for example:
146
147         void Demo () {
148              int a;
149              MyDelegate d = delegate {
150                  a = 1;
151              }
152         }
153
154         Here `a' will be recorded as captured on the toplevel
155         CapturedContext, the inner captured context will not have anything
156         (it will only have data if local variables or parameters from it
157         are captured in a nested anonymous method.
158
159         The ScopeInfo is used to track the activation frames for local
160         variables, for example:
161
162         for (int i = 0; i < 10; i++)
163                 for (int j = 0; j < 10; j++){
164                    MyDelegate d = delegate {
165                         call (i, j);
166                    }
167                 }
168
169         At runtime this captures a single captured variable `i', but it
170         captures 10 different versions of the variable `j'.  The variable
171         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
172         recorded on a child.  
173
174         The toplevel ScopeInfo will also track information like the `this'
175         pointer if instance variables were referenced (this is necessary
176         as the anonymous method lives inside a nested class in the host
177         type of the method). 
178
179         (AnonymousMethod): Expanded to track the Toplevel, implement
180         `AnonymousMethod.Compatible' to tell whether an anonymous method
181         can be converted to a target delegate type. 
182
183         The routine now also produces the anonymous method content
184
185         (AnonymousDelegate): A helper class that derives from
186         DelegateCreation, this is used to generate the code necessary to
187         produce the delegate for the anonymous method that was created. 
188
189         * assign.cs: API adjustments for new changes in
190         Convert.ImplicitStandardConversionExists.
191
192         * class.cs: Adjustments to cope with the fact that now toplevel
193         blocks are of type `ToplevelBlock'. 
194
195         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
196         insteda of standard blocks.
197
198         Flag errors if params arguments are passed to anonymous methods.
199
200         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
201         `CurrentAnonymousMethod' which points to the current Anonymous
202         Method.  The variable points to the AnonymousMethod class that
203         holds the code being compiled.  It is set in the new EmitContext
204         created for the anonymous method.
205
206         (EmitContext.Phase): Introduce a variable and an enumeration to
207         assist in enforcing some rules about when and where we are allowed
208         to invoke certain methods (EmitContext.NeedsReturnLabel is the
209         only one that enfonces this right now).
210
211         (EmitContext.HaveCaptureInfo): new helper method that returns
212         whether we have a CapturedContext initialized.
213
214         (EmitContext.CaptureVariable): New method used to register that a
215         LocalInfo must be flagged for capturing. 
216
217         (EmitContext.CapturedParameter): New method used to register that a
218         parameters must be flagged for capturing. 
219         
220         (EmitContext.CapturedField): New method used to register that a
221         field must be flagged for capturing. 
222
223         (EmitContext.HaveCapturedVariables,
224         EmitContext.HaveCapturedFields): Return whether there are captured
225         variables or fields. 
226
227         (EmitContext.EmitMethodHostInstance): This is used to emit the
228         instance for the anonymous method.  The instance might be null
229         (static methods), this (for anonymous methods that capture nothing
230         and happen to live side-by-side with the current method body) or a
231         more complicated expression if the method has a CaptureContext.
232
233         (EmitContext.EmitTopBlock): Routine that drives the emission of
234         code: it will first resolve the top block, then emit any metadata
235         and then emit the code.  The split is done so that we can extract
236         any anonymous methods and flag any captured variables/parameters.
237         
238         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
239         during this phase, the ILGenerator should not be used as labels
240         and local variables declared here might not be accessible to any
241         code that is part of an anonymous method.  
242
243         Exceptions to this include the temporary variables that are
244         created by some statements internally for holding temporary
245         variables. 
246         
247         (EmitContext.EmitMeta): New routine, in charge of emitting all the
248         metadata for a cb
249
250         (EmitContext.TemporaryReturn): This method is typically called
251         from the Emit phase, and its the only place where we allow the
252         ReturnLabel to be defined other than the EmitMeta.  The reason is
253         that otherwise we would have to duplicate a lot of logic in the
254         Resolve phases of various methods that today is on the Emit
255         phase. 
256
257         (EmitContext.NeedReturnLabel): This no longer creates the label,
258         as the ILGenerator is not valid during the resolve phase.
259
260         (EmitContext.EmitThis): Extended the knowledge in this class to
261         work in anonymous methods in addition to iterators. 
262
263         (EmitContext.EmitCapturedVariableInstance): This emits whatever
264         code is necessary on the stack to access the instance to a local
265         variable (the variable will be accessed as a field).
266
267         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
268         EmitContext.EmitAddressOfParameter): Routines to support
269         parameters (not completed at this point). 
270         
271         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
272         will also remove the parameters.
273
274         * convert.cs (Convert): Define a `ConstantEC' which points to a
275         null.  This is just to prefity some code that uses
276         ImplicitStandardConversion code and do not have an EmitContext
277         handy.
278
279         The idea is to flag explicitly that at that point in time, it is
280         known that the conversion will not trigger the delegate checking
281         code in implicit conversions (which requires a valid
282         EmitContext). 
283
284         Everywhere: pass new EmitContext parameter since
285         ImplicitStandardConversionExists now requires it to check for
286         anonymous method conversions. 
287
288         (Convert.ImplicitStandardConversionExists): If the type of an
289         expression is the anonymous_method_type, and the type is a
290         delegate, we invoke the AnonymousMethod.Compatible method to check
291         whether an implicit conversion is possible. 
292
293         (Convert.ImplicitConversionStandard): Only do implicit method
294         group conversions if the language level is not ISO_1.
295
296         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
297         MethodInfo for the Invoke method.  used by Delegate and
298         AnonymousDelegate.
299
300         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
301         method conversions if the target type is a delegate.
302
303         Removed extra debugging nops.
304
305         (LocalVariableReference): Turn the `local_info' into a public
306         field. 
307
308         Add `prepared' field, the same hack used for FieldExprs to cope
309         with composed assignments, as Local variables do not necessarily
310         operate purely on the stack as they used to: they can be captured
311         fields. 
312
313         Add `temp' for a temporary result, like fields.
314
315         Refactor DoResolve and DoResolveLValue into DoResolveBase.
316
317         It now copes with Local variables that are captured and emits the
318         proper instance variable to load it from a field in the captured
319         case. 
320
321         (ParameterReference.DoResolveBase): During the resolve phase,
322         capture parameters if we are in an anonymous method.
323
324         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
325         anonymous method, use the EmitContext helper routines to emit the
326         parameter reference.
327
328         * iterators.cs: Set RemapToProxy to true/false during the
329         EmitDispose class.
330
331         * parameters.cs (GetParameterByName): New helper method. 
332
333         * typemanager.cs (anonymous_method_type) a new type that
334         represents an anonyous method.  This is always an internal type,
335         used as a fencepost to test against the anonymous-methodness of an
336         expression. 
337         
338 2004-10-24  Marek Safar  <marek.safar@seznam.cz>
339
340         Fixed bugs #63705, #67130
341         * decl.cs (MemberCache.MemberCache): Add parameter to distinguish
342         imported and defined interfaces.
343         (CacheEntry, EntryType): Changed to protected internal.
344
345         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
346         interfaces too.
347
348         * typemanager.cs (LookupInterfaceContainer): New method.
349         Fills member container from base interfaces.
350
351 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
352
353         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
354         561 report.
355         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
356
357 2004-10-18  Martin Baulig  <martin@ximian.com>
358
359         Merged latest changes into gmcs.  Please keep this comment in
360         here, it makes it easier for me to see what changed in MCS since
361         the last time I merged.
362
363 2004-10-18  Martin Baulig  <martin@ximian.com>
364
365         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
366         `Type' directly, but call ResolveType() on it.
367         (Catch.Resolve): Likewise.
368         (Foreach.Resolve): Likewise.
369
370 2004-10-18  Martin Baulig  <martin@ximian.com>
371
372         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
373         `Type' directly, but call ResolveType() on it.
374         (Probe.DoResolve): Likewise.
375         (ArrayCreation.LookupType): Likewise.
376         (TypeOf.DoResolve): Likewise.
377         (SizeOf.DoResolve): Likewise.
378
379 2004-10-18  Martin Baulig  <martin@ximian.com>
380
381         * expression.cs (Invocation.BetterFunction): Put back
382         TypeManager.TypeToCoreType().
383
384 2004-10-18  Raja R Harinath  <rharinath@novell.com>
385
386         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
387         the ResolveType.
388
389 2004-10-18  Martin Baulig  <martin@ximian.com>
390
391         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
392         `Type' directly, but call ResolveType() on it.
393
394 2004-10-18  Martin Baulig  <martin@ximian.com>
395
396         * class.cs (FieldMember.Define): Don't access the TypeExpr's
397         `Type' directly, but call ResolveType() on it.
398         (MemberBase.DoDefine): Likewise.
399
400         * expression.cs (New.DoResolve): Don't access the TypeExpr's
401         `Type' directly, but call ResolveType() on it.
402         (ComposedCast.DoResolveAsTypeStep): Likewise.
403
404         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
405         `Type' directly, but call ResolveType() on it.
406
407 2004-10-17  John Luke  <john.luke@gmail.com>
408
409         * class.cs (Operator.GetSignatureForError): use CSharpName
410
411         * parameter.cs (Parameter.GetSignatureForError): Returns
412         correct name even if was not defined.
413
414 2004-10-13  Raja R Harinath  <rharinath@novell.com>
415
416         Fix #65816.
417         * class.cs (TypeContainer.EmitContext): New property.
418         (DefineNestedTypes): Create an emitcontext for each part.
419         (MethodCore.DoDefineParameters): Use container's emitcontext.
420         Pass type array to InternalParameters.
421         (MemberBase.DoDefine): Use container's emitcontext.
422         (FieldMember.Define): Likewise.
423         (Event.Define): Likewise.
424         (SetMethod.GetParameterInfo): Change argument to EmitContext.
425         Pass type array to InternalParameters.
426         (SetIndexerMethod.GetParameterInfo): Likewise.
427         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
428         * delegate.cs (Define): Pass emitcontext to
429         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
430         array to InternalParameters.
431         * expression.cs (ParameterReference.DoResolveBase): Pass
432         emitcontext to GetParameterInfo.
433         (ComposedCast.DoResolveAsTypeStep): Remove check on
434         ec.ResolvingTypeTree.
435         * parameter.cs (Parameter.Resolve): Change argument to
436         EmitContext.  Use ResolveAsTypeTerminal.
437         (Parameter.GetSignature): Change argument to EmitContext.
438         (Parameters.ComputeSignature): Likewise.
439         (Parameters.ComputeParameterTypes): Likewise.
440         (Parameters.GetParameterInfo): Likewise.
441         (Parameters.ComputeAndDefineParameterTypes): Likewise.
442         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
443         * support.cs (InternalParameters..ctor): Remove variant that takes
444         a DeclSpace.
445         * typemanager.cs (system_intptr_expr): New.
446         (InitExpressionTypes): Initialize it.
447
448 2004-10-12  Chris Toshok  <toshok@ximian.com>
449
450         * cs-parser.jay: fix location for try_statement and catch_clause.
451
452 2004-10-11  Martin Baulig  <martin@ximian.com>
453
454         * report.cs: Don't make --fatal abort on warnings, we have
455         -warnaserror for that.
456
457 2004-10-07  Raja R Harinath  <rharinath@novell.com>
458
459         More DeclSpace.ResolveType avoidance.
460         * decl.cs (MemberCore.InUnsafe): New property.
461         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
462         with newly created EmitContext.
463         (FieldMember.Define): Likewise.
464         * delegate.cs (Delegate.Define): Likewise.
465         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
466         only if normal name-lookup fails.
467         (TypeExpr.DoResolve): Enable error-checking.
468         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
469         (SizeOf.DoResolve): Likewise.
470         (ComposedCast.DoResolveAsTypeStep): Likewise.
471         (StackAlloc.DoResolve): Likewise.
472         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
473         (Block.Unsafe): New property.
474         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
475         (Unsafe): Set 'unsafe' flag of contained block.
476         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
477         (Fixed.Resolve): Likewise.
478         (Catch.Resolve): Likewise.
479         (Using.ResolveLocalVariableDecls): Likewise.
480         (Foreach.Resolve): Likewise.
481
482 2004-10-05  John Luke <john.luke@gmail.com>
483
484         * cs-parser.jay: add location to error CS0175
485
486 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
487
488         * ecore.cs (Expression.Constantity): Add support for turning null
489         into a constant.
490
491         * const.cs (Const.Define): Allow constants to be reference types
492         as long as the value is Null.
493
494 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
495
496         * namespace.cs (NamespaceEntry.Using): No matter which warning
497         level is set, check if this namespace name has already been added.
498
499 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
500
501         * expression.cs: reftype [!=]= null should always use br[true,false].
502         # 67410
503
504 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
505
506         Fix #67108
507         * attribute.cs: Enum conversion moved to 
508         GetAttributeArgumentExpression to be applied to the all
509         expressions.
510
511 2004-10-01  Raja R Harinath  <rharinath@novell.com>
512
513         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
514         * class.c (TypeContainer.DefineType): Flag error if
515         base types aren't accessible due to access permissions.
516         * decl.cs (DeclSpace.ResolveType): Move logic to
517         Expression.ResolveAsTypeTerminal.
518         (DeclSpace.ResolveTypeExpr): Thin layer over
519         Expression.ResolveAsTypeTerminal.
520         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
521         Refactor code into NestedAccess.  Use it.
522         (DeclSpace.NestedAccess): New.
523         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
524         argument to silence errors.  Check access permissions.
525         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
526         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
527         (Cast.DoResolve): Likewise.
528         (New.DoResolve): Likewise.
529         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
530         (TypeOf.DoResolve): Likewise.
531
532         * expression.cs (Invocation.BetterConversion): Return the Type of
533         the better conversion.  Implement section 14.4.2.3 more faithfully.
534         (Invocation.BetterFunction): Make boolean.  Make correspondence to
535         section 14.4.2.2 explicit.
536         (Invocation.OverloadResolve): Update.
537         (Invocation): Remove is_base field.
538         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
539         (Invocation.Emit): Likewise.
540
541 2004-09-27  Raja R Harinath  <rharinath@novell.com>
542
543         * README: Update to changes.
544
545 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
546
547         * cs-parser.jay: Reverted 642 warning fix.
548
549 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
550
551         Fix bug #66615
552         * decl.cs (FindMemberWithSameName): Indexer can have more than
553         1 argument.
554
555 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
556
557         * expression.cs (LocalVariableReference.DoResolveLValue):
558         Do not report warning 219 for out values.
559         (EmptyExpression.Null): New member to avoid extra allocations.
560
561 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
562
563         * cs-parser.jay: Fix wrong warning 642 report.
564
565         * cs-tokenizer.cs (CheckNextToken): New helper;
566         Inspect next character if is same as expected.
567
568 2004-09-23  Martin Baulig  <martin@ximian.com>
569
570         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
571         (Convert.ImplicitReferenceConversionExists): Likewise.
572
573 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
574
575         * class.cs (Operator.Define): Add error 448 and 559 report.
576
577 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
578
579         * class.cs (MemberBase.IsTypePermitted): New protected
580         method for checking error CS0610.
581
582 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
583
584         * class.cs (TypeContainer.HasExplicitLayout): New property
585         Returns whether container has StructLayout attribute set Explicit.
586         (FieldMember): New abstract class for consts and fields.
587         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
588         (Field): Reuse FieldMember.
589
590         * const.cs (Const): Reuse FieldMember.
591
592         * rootcontext.cs: EmitConstants call moved to class.
593
594 2004-09-22  Martin Baulig  <martin@ximian.com>
595
596         Thanks to Peter Sestoft for this bug report.
597
598         * expression.cs (Conditional): If both the `trueExpr' and the
599         `falseExpr' is a NullLiteral, return a NullLiteral.
600
601 2004-09-22  Martin Baulig  <martin@ximian.com>
602
603         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
604         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
605         for the "get_Current" call.
606
607 2004-09-22  Martin Baulig  <martin@ximian.com>
608
609         Marek and me just fixed one of our oldest bugs: #28562 :-)
610
611         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
612
613         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
614         we're an EnumConstant, just return that.
615         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
616         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
617         to get the value which'll actually be written into the attribute.
618         However, we have to use GetValue() to access the attribute's value
619         in the compiler.        
620
621 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
622
623         * constant.cs (Constant.IsNegative): New abstract property
624         IsNegative.
625
626         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
627         (StackAlloc.DoResolve): Reused IsNegative.
628
629 2004-09-21  Martin Baulig  <martin@ximian.com>
630
631         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
632         if we're used in an iterator, we may be called from different
633         methods.
634
635         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
636         we actually have an exception block.
637
638 2004-09-20  John Luke <jluke@cfl.rr.com>
639
640         * class.cs, cs-parser.jay: Improve the error report for 1520:
641         report the actual line where the error happens, not where the
642         class was declared.
643
644         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
645         Pass location information that was available elsewhere.
646
647 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
648
649         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
650         runtime to delay sign assemblies.
651
652 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
653
654         * cs-parser.jay: Do not report the stack trace, this is barely
655         used nowadays.
656
657 2004-08-22  John Luke  <john.luke@gmail.com>
658  
659         * driver.cs : check that a resource id is not already used
660         before adding it, report CS1508 if it is, bug #63637
661
662 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
663
664         * ecore.cs: Removed dead code.
665
666 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
667
668         * class.cs: Do not report warning CS0067 on the interfaces.
669
670 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
671
672         * cs-parser.jay: Add error 504 report.
673
674 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
675
676         * rootcontext.cs: WarningLevel is 4 by default now.
677
678         * statement.cs (Fixed.Resolve): Do not null
679         VariableInfo.
680
681 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
682
683         Fixed bug #55780
684         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
685         deep search when property is not virtual.
686         (PropertyExpr.ResolveAccessors): Make one call for both
687         accessors.
688
689 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
690
691         Fixed bug #65766
692         * statement.cs: Error 152 report constains also location.
693
694 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
695
696         Fixed bug #65766
697         * const.cs: Explicitly set constant as static.
698
699 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
700
701         Fixed bug #64226
702         * cs-parser.jay: Add error 1017 report.
703
704 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
705
706         Fixed bug #59980, #64224
707         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
708
709         * typemanager.cs (IsSpecialMethod): Simplified
710
711 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
712
713         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
714         condition with better params.
715
716 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
717
718         Fixed bug #65238
719         * attribute.cs (Resolve): Property has to have both
720         accessors.
721
722 2004-09-14  Martin Baulig  <martin@ximian.com>
723
724         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
725
726 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
727
728         Fixed bug #61902
729         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
730         called and is obsolete then this member suppress message
731         when call is inside next [Obsolete] method or type.
732
733         * expression.cs: Use TestObsoleteMethodUsage member.
734
735 2004-09-14  Martin Baulig  <martin@ximian.com>
736
737         * cs-parser.jay: Sync a bit with the GMCS version.
738
739 2004-09-14  Martin Baulig  <martin@ximian.com>
740
741         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
742         (CSharpParser.yacc_verbose_flag): New public field.
743
744         * genericparser.cs: Removed.
745
746 2004-09-14  Raja R Harinath  <rharinath@novell.com>
747
748         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
749
750 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
751
752         * class.cs (MethodCore.CheckBase): Fix bug #65757.
753
754 2004-09-10  Martin Baulig  <martin@ximian.com>
755
756         Backported my MemberName changes from GMCS into MCS.
757
758         - we are now using a special `MemberName' class instead of using
759         strings; in GMCS, the `MemberName' also contains the type
760         arguments.
761
762         - changed the grammar rules a bit:
763           * the old `member_name' is now a `namespace_or_type_name':
764             The rule is that we use `namespace_or_type_name' everywhere
765             where we expect either a "member name" (GetEnumerator) or a
766             "member name" with an explicit interface name
767             (IEnumerable.GetEnumerator).
768             In GMCS, the explicit interface name may include type arguments
769             (IEnumerable<T>.GetEnumerator).
770           * we use `member_name' instead of just `IDENTIFIER' for
771             "member names":
772             The rule is that we use `member_name' wherever a member may
773             have type parameters in GMCS.       
774
775         * decl.cs (MemberName): New public class.
776         (MemberCore.MemberName): New public readonly field.
777         (MemberCore.ctor): Take a `MemberName' argument, not a string.
778         (DeclSpace): Likewise.
779
780         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
781         * enum.cs (Enum.ctor): Likewise.
782
783         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
784         MemberName.     
785         (AliasEntry.ctor): Take a MemberName, not an Expression.
786         (AliasEntry.UsingAlias): Likewise.
787
788         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
789         (IMethodData.MemberName): Changed type from string to MemberName.
790         (MemberBase.ExplicitInterfaceName): Likewise.
791         (AbstractPropertyEventMethod.SetupName): Make this private.
792         (AbstractPropertyEventMethod.ctor): Added `string prefix'
793         argument; compute the member name here.
794         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
795         on the `member.MemberName' and the `prefix'.
796
797         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
798         not `type_name'.
799         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
800         thus, we get a `MemberName' instead of a `string'.  These
801         declarations may have type parameters in GMCS.
802         (interface_method_declaration, delegate_declaration): Likewise.
803         (class_declaration, interface_declaration): Likewise.
804         (method_header): Use `namespace_or_type_name' instead of
805         `member_name'.  We may be an explicit interface implementation.
806         (property_declaration, event_declaration): Likewise.
807         (member_name): This is now just an `IDENTIFIER', not a
808         `namespace_or_type_name'.
809         (type_name, interface_type): Removed.
810         (namespace_or_type_name): Return a MemberName, not an Expression.
811         (primary_expression): Use `member_name' instead of `IDENTIFIER';
812         call GetTypeExpression() on the MemberName to get an expression.
813         (IndexerDeclaration.interface_type): Changed type from string to
814         MemberName.
815         (MakeName): Operate on MemberName's instead of string's.
816
817 2004-09-13  Raja R Harinath  <rharinath@novell.com>
818
819         Fix bug #55770.
820         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
821         (NamespaceEntry.Lookup): Add new argument to flag if we want the
822         lookup to avoid symbols introduced by 'using'.
823         * rootcontext.cs (NamespaceLookup): Update.
824
825 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
826
827         * class.cs (TypeContainer.DoDefineMembers): Do not call
828         DefineDefaultConstructor for static classes.
829
830 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
831
832         * attribute.cs (Attribute.Resolve): Add error 653 report.
833
834         * class.cs (Class.ApplyAttributeBuilder): Add error 641
835         report.
836         (Method.ApplyAttributeBuilder): Add error 685 report.
837         (Operator.Define): Add error 564 report.
838
839         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
840
841         * expression.cs (Invocation.DoResolve): Add error
842         245 and 250 report.
843
844         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
845         error 674 report.
846
847 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
848
849         * class.cs (ConstructorInitializer.Resolve):
850         Wrong error number (515->516).
851
852 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
853
854         * class.cs (Indexer.Define): Add error 631 report.
855
856 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
857
858         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
859
860 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
861
862         * expression.cs (Probe.DoResolve): Add error CS0241 report.
863
864 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
865
866         * cs-parser.jay: Added error CS0241 report.
867
868 2004-09-10  Raja R Harinath  <rharinath@novell.com>
869
870         * cs-parser.jay (fixed_statement): Introduce a scope for the
871         declaration in the 'fixed' statement.
872
873 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
874
875         * cs-parser.jay: Added CS0230 error report.
876
877 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
878
879         * cs-parser.jay: Added errors CS0231 and CS0257 report.
880
881 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
882
883         * expression.cs (Argument.Resolve): Added error CS0192 and
884         CS0199 report.
885
886 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
887
888         C# 2.0 #pragma warning feature
889
890         * cs-tokenizer.cs (PreProcessPragma): New method; 
891         Handles #pragma directive.
892
893         * report.cs (WarningRegions): New class; Support
894         class for #pragma warning directive. It tests whether
895         warning is enabled for a given line.
896
897 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
898
899         * const.cs: Add more descriptive error report, tahnks to
900         Sebastien. 
901
902 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
903
904         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
905
906 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
907
908         * expression.cs: Apply patch from Ben: Remove dead code from
909         ArrayCreation, and remove the TurnintoConstant call in const.cs,
910         as that code just threw an exception anwyays.
911
912         * const.cs: Remove the call to the turnintoconstant, for details
913         see bug: #63144
914         
915         * literal.cs: The type of the null-literal is the null type;  So
916         we use a placeholder type (literal.cs:System.Null, defined here)
917         for it.
918
919         * expression.cs (Conditional.DoResolve): Remove some old code that
920         is no longer needed, conversions have been fixed.
921
922         (ArrayCreationExpression.DoResolve): Return false if we fail to
923         resolve the inner expression.
924
925 2004-09-07  Raja R Harinath  <rharinath@novell.com>
926
927         Fix test-290.cs.
928         * cs-parser.jay (delegate_declaration): Record a delegate
929         declaration as a type declaration.
930         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
931
932 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
933
934         * parameter.cs: Do not crash if the type can not be resolved. 
935
936         * expression.cs: Report errors with unsafe pointers, fixes #64896
937
938 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
939
940         * expression.cs: Pointer arith always needs to do a conv.i
941         if the operand is a long. fix 65320
942
943 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
944
945         Fixed cs0619-37.cs, cs0619-38.cs
946
947         * enum.cs (GetObsoleteAttribute): Removed.
948
949         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
950         on Enum member is double staged. The first is tested member
951         and then enum.
952
953 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
954
955         Fixed #56986, #63631, #65231
956
957         * class.cs: (TypeContainer.AddToMemberContainer): New method,
958         adds member to name container.
959         (TypeContainer.AddToTypeContainer): New method, adds type to
960         name container.
961         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
962         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
963         AddOperator): Simplified by reusing AddToMemberContainer.
964         (TypeContainer.UserDefinedStaticConstructor): Changed to property
965         instead of field.
966         (Method.CheckForDuplications): Fixed implementation to test all
967         possibilities.
968         (MemberBase): Detection whether member is explicit interface
969         implementation is now in constructor.
970         (MemberBase.UpdateMemberName): Handles IndexerName.
971         (Accessor): Changed to keep also location information.
972         (AbstractPropertyEventMethod): Is derived from MemberCore.
973         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
974         will be emited or not.
975         (PropertyBase.AreAccessorsDuplicateImplementation):
976         Tests whether accessors are not in collision with some method.
977         (Operator): Is derived from MethodCore to simplify common
978         operations.
979
980         * decl.cs (Flags.TestMethodDuplication): Test for duplication
981         must be performed.
982         (DeclSpace.AddToContainer): Adds the member to defined_names
983         table. It tests for duplications and enclosing name conflicts.
984
985         * enum.cs (EnumMember): Clean up to reuse the base structures
986
987 2004-09-03  Martin Baulig  <martin@ximian.com>
988
989         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
990         into TypeContainer, to make partial classes work again.
991
992 2004-09-03  Martin Baulig  <martin@ximian.com>
993
994         * rootcontext.cs (RootContext.V2): Removed.
995
996 2004-03-23  Martin Baulig  <martin@ximian.com>
997
998         * expression.cs (Invocation.OverloadResolve): Added `bool
999         may_fail' argument and use it instead of the Location.IsNull() hack.
1000
1001 2004-09-03  Martin Baulig  <martin@ximian.com>
1002
1003         Merged latest changes into gmcs.  Please keep this comment in
1004         here, it makes it easier for me to see what changed in MCS since
1005         the last time I merged.
1006
1007 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1008
1009         Fix #61128.
1010         * expression.cs (BetterConversion): Don't allow either conversion 
1011         to be null.  Remove redundant implicit conversion test when 'q ==
1012         null' -- when this function is invoked, we already know that the
1013         implicit conversion exists.
1014         (BetterFunction): Assume that 'best' is non-null.  Remove
1015         redundant reimplementation of IsApplicable when 'best' is null.
1016         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1017         number of arguments.
1018         (IsAncestralType): Extract from OverloadResolve.
1019         (OverloadResolve): Make robust to the MethodGroupExpr being
1020         unsorted.  Implement all the logic of Section 14.5.5.1, and
1021         support overloading of methods from multiple applicable types.
1022         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1023
1024         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1025         (RealError, Warning): Append type of report to related symbol.
1026
1027 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1028
1029         * enum.cs: Fixed CLS-Compliance checks for enum members.
1030         Error tests cs3008-8.cs, cs3014-8.cs
1031
1032 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1033
1034         Fixed bug #62342, #63102
1035         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1036         like ImplementMethod.
1037
1038 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1039
1040         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1041         Fixed bug #65170.
1042
1043 2004-09-02  Martin Baulig  <martin@ximian.com>
1044
1045         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1046         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1047         on the MethodBase.
1048
1049 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1050
1051         C# 2.0 Static classes implemented
1052
1053         * class.cs (TypeContainer): instance_constructors,
1054         initialized_fields, initialized_static_fields,
1055         default_constructor, base_inteface_types are protected to be
1056         accessible from StaticClass.
1057         (TypeContainer.DefineDefaultConstructor): New virtual method
1058         for custom default constructor generating
1059         (StaticClass): New class to handle "Static classes" feature.
1060
1061         * cs-parser.jay: Handle static keyword on class like instance
1062         of StaticClass.
1063
1064         * driver.cs: Added "/langversion" command line switch with two
1065         options (iso-1, default).
1066
1067 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1068
1069         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1070
1071 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1072
1073         * delegate.cs: Style.
1074
1075 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1076
1077         * delegate.cs: Add seperate instance expr field for miguel.
1078
1079 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1080
1081         * PointerArithmetic (Resolve): make sure we are not doing
1082         pointer arith on void*. Also, make sure we are resolved
1083         by not setting eclass until resolve.
1084
1085         All callers: Make sure that PointerArithmetic gets resolved.
1086
1087 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1088
1089         * ArrayCreation (LookupType): If the type does not resolve 
1090         to an array, give an error.
1091
1092 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1093
1094         * statement.cs (Try.Resolve): Fixed bug #64222
1095
1096 2004-08-27  Martin Baulig  <martin@ximian.com>
1097
1098         * class.cs
1099         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1100         crash here.     
1101
1102 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1103
1104         * ecore.cs (Constantify): Get underlying type via
1105         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1106         Windows in special cases.
1107
1108 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1109
1110         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1111         for obtaining also private methods.
1112         (GetRemoveMethod): Used GetRemoveMethod (true)
1113         for obtaining also private methods.
1114
1115 2004-08-24  Martin Baulig  <martin@ximian.com>
1116
1117         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1118         MethodAttributes.HideBySig for operators.
1119
1120 2004-08-23  Martin Baulig  <martin@ximian.com>
1121
1122         Back to the old error reporting system :-)
1123
1124         * report.cs (Message): Removed.
1125         (Report.MessageData, ErrorData, WarningData): Removed.
1126         (Report.Error, Warning): Back to the old system.
1127
1128 2004-08-23  Martin Baulig  <martin@ximian.com>
1129
1130         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1131
1132         * class.cs (TypeContainer.ParentContainer): New public virtual
1133         method; replaces the explicit interface implementation.
1134         (ClassPart.ParentContainer): Override.
1135
1136 2004-08-23  Martin Baulig  <martin@ximian.com>
1137
1138         * statement.cs (Switch): Added support for constant switches; see
1139         #59428 or test-285.cs.
1140
1141 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1142
1143         Fixed bug #62740.
1144         * statement.cs (GetEnumeratorFilter): Removed useless
1145         logic because C# specs is strict. GetEnumerator must be
1146         public.
1147
1148 2004-08-22  Martin Baulig  <martin@ximian.com>
1149
1150         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1151         a switch and may break, reset the barrier.  Fixes #59867.
1152
1153 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1154
1155         CLS-Compliance speed up (~5% for corlib)
1156
1157         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1158         New method. Tests container for CLS-Compliant names
1159
1160         * class.cs (TypeContainer.VerifyClsName): New method.
1161         Checks whether container name is CLS Compliant.
1162         (Constructor): Implements IMethodData.
1163
1164         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1165         low-case table for CLS Compliance test.
1166         (MemberCache.VerifyClsParameterConflict): New method.
1167         Checks method parameters for CS3006 error.
1168
1169         * enum.cs (EnumMember): Is derived from MemberCore.
1170         (Enum.VerifyClsName): Optimized for better performance.
1171
1172 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1173
1174         * report.cs: Renamed Error_T to Error and changed all
1175         references.
1176
1177 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1178
1179         * class.cs (TypeContainer.IndexerArrayList): New inner class
1180         container for indexers.
1181         (TypeContainer.DefaultIndexerName): New constant for default
1182         indexer name. Replaced all "Item" with this constant.
1183         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1184
1185         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1186         DefaultMemberAttribute constructor.
1187
1188 2004-08-05  Martin Baulig  <martin@ximian.com>
1189
1190         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1191         Fix bug #59429.
1192
1193 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1194
1195         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1196         multi platforms problem.
1197
1198         * compiler.csproj: Included shared files.
1199
1200 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1201
1202         Fix bug 60333, 55971 in the more general way
1203         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1204         Added arg_type argument for constant conversion.
1205         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1206
1207 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1208
1209         Fix bug #59760
1210         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1211         OperatorArrayList, MethodCoreArrayList for typecontainer
1212         containers. Changed class member types to these new types.
1213         (MethodArrayList.DefineMembers): Added test for CS0659.
1214
1215 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1216
1217         * cfold.cs: Synchronize the folding with the code in expression.cs
1218         Binary.DoNumericPromotions for uint operands.
1219
1220         * attribute.cs: Revert patch from Raja, it introduced a regression
1221         while building Blam-1.2.1 (hard to isolate a test case).
1222
1223 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1224
1225         Fix for #55382
1226         * class.cs:
1227         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1228         name collision.
1229         (MethodCore.parent_method): New member. The method we're overriding
1230         if this is an override method.
1231         (MethodCore.CheckBase): Moved from Method class and made common.
1232         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1233         private.
1234         (MethodCore.CheckForDuplications): New abstract method. For custom
1235         member duplication search in a container
1236         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1237         method and its return type.
1238         (Event.conflict_symbol): New member. Symbol with same name in the
1239         parent class.
1240
1241         * decl.cs:
1242         (MemberCache.FindMemberWithSameName): New method. The method
1243         is looking for conflict with inherited symbols.
1244
1245 2004-08-04  Martin Baulig  <martin@ximian.com>
1246
1247         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1248
1249         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1250
1251 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1252
1253         * report.cs (Message): New enum for better error, warning reference in
1254         the code.
1255         (MessageData): New inner abstract class. It generally handles printing of
1256         error and warning messages.
1257         Removed unused Error, Warning, Message methods.
1258
1259 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1260
1261         Fix for cs0592-8.cs test
1262         * attribute.cs
1263         (Attributable.ValidAttributeTargets): Made public.
1264         (Attribute.ExplicitTarget): New member for explicit target value.
1265         (Attribute.CheckTargets): Now we translate explicit attribute
1266         target to Target here.
1267
1268 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1269
1270         * ecore.cs (MethodGroupExpr): new IsBase property.
1271
1272         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1273
1274         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1275         rather than an instance expr.
1276
1277         (DelegateCreation.Emit): Use the method group rather than
1278         the instance expression. Also, if you have base.Foo as the
1279         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1280
1281         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1282
1283         (NewDelegate.DoResolve): Only check for the existance of Invoke
1284         if the method is going to be needed. Use MethodGroupExpr.
1285
1286         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1287
1288         * expression.cs: For pointer arith., make sure to use
1289         the size of the type, not the size of the pointer to
1290         the type.
1291
1292 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1293
1294         Fix for #60722
1295         * class.cs (Class): Added error CS0502 test.
1296
1297 2004-08-03  John Luke  <jluke@cfl.rr.com>
1298             Raja R Harinath  <rharinath@novell.com>
1299
1300         Fix for #60997.
1301         * attribute.cs (Attribute.complained_before): New flag.
1302         (Attribute.ResolveType, Attribute.Resolve),
1303         (Attribute.DefinePInvokeMethod): Set it.
1304         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1305         
1306 2004-08-03  Martin Baulig  <martin@ximian.com>
1307
1308         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1309         use a user-defined operator; we still need to do numeric
1310         promotions in case one argument is a builtin type and the other
1311         one has an implicit conversion to that type.  Fixes #62322.
1312
1313 2004-08-02  Martin Baulig  <martin@ximian.com>
1314
1315         * statement.cs (LocalInfo.Flags): Added `IsThis'.
1316         (LocalInfo.IsThis): New public property.
1317         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
1318
1319 2004-08-01  Martin Baulig  <martin@ximian.com>
1320
1321         * class.cs (TypeContainer.GetClassBases): Don't set the default
1322         here since we may get called from GetPartialBases().
1323         (TypeContainer.DefineType): If GetClassBases() didn't return a
1324         parent, use the default one.
1325
1326 2004-07-30  Duncan Mak  <duncan@ximian.com>
1327
1328         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
1329
1330 2004-07-30  Martin Baulig  <martin@ximian.com>
1331
1332         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
1333
1334         * class.cs (SourceMethod): New public class, derive from the
1335         symbol writer's ISourceMethod.
1336         (Method): Use the new symbol writer API.
1337
1338         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
1339         as argument and use the new symbol writer.
1340
1341         * location.cs
1342         (SourceFile): Implement the symbol writer's ISourceFile.
1343         (Location.SymbolDocument): Removed.
1344         (Location.SourceFile): New public property.
1345
1346         * symbolwriter.cs: Use the new symbol writer API.
1347
1348 2004-07-30  Raja R Harinath  <rharinath@novell.com>
1349
1350         * Makefile (install-local): Remove.  Functionality moved to
1351         executable.make.
1352
1353 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
1354
1355         * Makefile: Install mcs.exe.config file together with mcs.exe.
1356         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
1357         correct runtime version.
1358         
1359 2004-07-25  Martin Baulig  <martin@ximian.com>
1360
1361         * class.cs
1362         (TypeContainer.RegisterOrder): Removed, this was unused.
1363         (TypeContainer, interface_order): Removed.
1364         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
1365         TypeContainer as argument since we can also be called with a
1366         `PartialContainer' for a partial class/struct/interface.
1367         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
1368         of checking whether we're an `Interface' - we could be a
1369         `PartialContainer'.
1370         (PartialContainer.Register): Override; call
1371         AddClass()/AddStruct()/AddInterface() on our parent.
1372
1373         * cs-parser.jay (interface_member_declaration): Add things to the
1374         `current_container', not the `current_class'.
1375
1376         * rootcontext.cs (RegisterOrder): The overloaded version which
1377         takes an `Interface' was unused, removed.
1378
1379         * typemanager.cs (TypeManager.LookupInterface): Return a
1380         `TypeContainer', not an `Interface'.
1381         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
1382         contain a `PartialContainer' for an interface, so check it's
1383         `Kind' to figure out what it is.
1384
1385 2004-07-25  Martin Baulig  <martin@ximian.com>
1386
1387         * class.cs (Class.DefaultTypeAttributes): New public constant.
1388         (Struct.DefaultTypeAttributes): Likewise.
1389         (Interface.DefaultTypeAttributes): Likewise.
1390         (PartialContainer.TypeAttr): Override this and add the
1391         DefaultTypeAttributes.
1392
1393 2004-07-25  Martin Baulig  <martin@ximian.com>
1394
1395         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
1396         we can just use the `Parent' field instead.
1397
1398 2004-07-25  Martin Baulig  <martin@ximian.com>
1399
1400         * class.cs (TypeContainer.Emit): Renamed to EmitType().
1401
1402 2004-07-25  Martin Baulig  <martin@ximian.com>
1403
1404         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
1405         our parts before defining any methods.
1406         (TypeContainer.VerifyImplements): Make this virtual.
1407         (ClassPart.VerifyImplements): Override and call VerifyImplements()
1408         on our PartialContainer.
1409
1410 2004-07-25  Martin Baulig  <martin@ximian.com>
1411
1412         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1413
1414         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1415         argument, we can just use the `Parent' field instead.
1416
1417         * class.cs
1418         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1419         (MemberBase.DoDefine): Likewise.
1420
1421 2004-07-24  Martin Baulig  <martin@ximian.com>
1422
1423         * decl.cs (MemberCore.Parent): New public field.
1424         (DeclSpace.Parent): Moved to MemberCore.
1425
1426         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1427         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1428         parent's .ctor.
1429         (FieldBase, Field, Operator): Likewise.
1430         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1431         (EventField, Event): Likewise.
1432
1433 2004-07-23  Martin Baulig  <martin@ximian.com>
1434
1435         * class.cs (PartialContainer): New public class.
1436         (ClassPart): New public class.
1437         (TypeContainer): Added support for partial classes.
1438         (TypeContainer.GetClassBases): Splitted some of the functionality
1439         out into GetNormalBases() and GetPartialBases().
1440
1441         * cs-tokenizer.cs (Token.PARTIAL): New token.
1442         (Tokenizer.consume_identifier): Added some hacks to recognize
1443         `partial', but only if it's immediately followed by `class',
1444         `struct' or `interface'.
1445
1446         * cs-parser.jay: Added support for partial clases.
1447
1448 2004-07-23  Martin Baulig  <martin@ximian.com>
1449
1450         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1451         a `DeclSpace' and also made it readonly.
1452         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1453         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1454         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1455
1456         * cs-parser.jay: Pass the `current_class', not the
1457         `current_container' (at the moment, this is still the same thing)
1458         to a new Method, Property, Event, Indexer or Constructor.
1459
1460 2004-07-23  Martin Baulig  <martin@ximian.com>
1461
1462         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1463         and removed the `current_interface' one.
1464         (struct_declaration, class_declaration, interface_declaration):
1465         Set `current_class' to the newly created class/struct/interface;
1466         set their `Bases' and call Register() before parsing their body.
1467
1468 2004-07-23  Martin Baulig  <martin@ximian.com>
1469
1470         * class.cs (Kind): New public enum.
1471         (TypeContainer): Made this class abstract.
1472         (TypeContainer.Kind): New public readonly field.
1473         (TypeContainer.CheckDef): New public method; moved here from
1474         cs-parser.jay.
1475         (TypeContainer.Register): New public abstract method.
1476         (TypeContainer.GetPendingImplementations): New public abstract
1477         method.
1478         (TypeContainer.GetClassBases): Removed the `is_class' and
1479         `is_iface' parameters.
1480         (TypeContainer.DefineNestedTypes): Formerly known as
1481         DoDefineType().
1482         (ClassOrStruct): Made this class abstract.
1483
1484         * tree.cs (RootTypes): New public type. 
1485
1486 2004-07-20  Martin Baulig  <martin@ximian.com>
1487
1488         * tree.cs (Tree.RecordNamespace): Removed.
1489         (Tree.Namespaces): Removed.
1490
1491         * rootcontext.cs (RootContext.IsNamespace): Removed.
1492
1493         * cs-parser.jay (namespace_declaration): Just create a new
1494         NamespaceEntry here.
1495
1496 2004-07-20  Martin Baulig  <martin@ximian.com>
1497
1498         * statement.cs (ExceptionStatement): New abstract class.  This is
1499         now used as a base class for everyone who's using `finally'.
1500         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
1501         our local variables before using them.
1502
1503         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
1504         virtual method.  This is used by Yield.Resolve() to "steal" an
1505         outer block's `finally' clauses.
1506         (FlowBranchingException): The .ctor now takes an ExceptionStatement
1507         argument.
1508
1509         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
1510         version which takes an ExceptionStatement.  This version must be
1511         used to create exception branchings.
1512
1513         * iterator.cs
1514         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
1515         (Iterator.EmitMoveNext): Added exception support; protect the
1516         block with a `fault' clause, properly handle 'finally' clauses.
1517         (Iterator.EmitDispose): Run all the `finally' clauses here.
1518
1519 2004-07-20  Martin Baulig  <martin@ximian.com>
1520
1521         * iterator.cs: This is the first of a set of changes in the
1522         iterator code.  Match the spec more closely: if we're an
1523         IEnumerable, then GetEnumerator() must be called.  The first time
1524         GetEnumerator() is called, it returns the current instance; all
1525         subsequent invocations (if any) must create a copy.
1526
1527 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
1528
1529         * expression.cs: Resolve the constant expression before returning
1530         it. 
1531
1532 2004-07-19  Martin Baulig  <martin@ximian.com>
1533
1534         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
1535         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
1536         the return type of the new EmitContext.
1537
1538 2004-07-18  Martin Baulig  <martin@ximian.com>
1539
1540         * class.cs (Property.Define): Fix iterators.
1541
1542         * iterators.cs (Iterator.Define): Moved the
1543         `container.AddInterator (this)' call here from the .ctor; only do
1544         it if we resolved successfully.
1545
1546 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
1547
1548         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
1549         `true' for preprocessing directives that we parse.  The return
1550         value indicates whether we should return to regular tokenizing or
1551         not, not whether it was parsed successfully.
1552
1553         In the past if we were in: #if false ... #line #endif, we would
1554         resume parsing after `#line'.  See bug 61604.
1555
1556         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
1557         building: IsEnumType should return true only for enums, not for
1558         enums or System.Enum itself.  This fixes #61593.
1559
1560         Likely what happened is that corlib was wrong: mcs depended on
1561         this bug in some places.  The bug got fixed, we had to add the
1562         hack, which caused bug 61593.
1563
1564         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
1565         that was a workaround for the older conditions.
1566
1567 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
1568
1569         * assign.cs: IAssignMethod has a new interface, as documented
1570         inline. All assignment code now uses this new api.
1571
1572         * ecore.cs, expression.cs: All classes which implement
1573         IAssignMethod now use the new interface.
1574
1575         * expression.cs (Invocation): add a hack to EmitCall so that
1576         IndexerAccess can be the target of a compound assignment without
1577         evaluating its arguments twice.
1578
1579         * statement.cs: Handle changes in Invocation api.
1580
1581 2004-07-16  Martin Baulig  <martin@ximian.com>
1582
1583         * iterators.cs: Rewrote this.  We're now using one single Proxy
1584         class for both the IEnumerable and the IEnumerator interface and
1585         `Iterator' derives from Class so we can use the high-level API.
1586
1587         * class.cs (TypeContainer.AddIterator): New method.
1588         (TypeContainer.DoDefineType): New protected virtual method, which
1589         is called from DefineType().
1590         (TypeContainer.DoDefineMembers): Call DefineType() and
1591         DefineMembers() on all our iterators.
1592         (TypeContainer.Emit): Call Emit() on all our iterators.
1593         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1594
1595         * codegen.cs (EmitContext.CurrentIterator): New public field.
1596
1597 2004-07-15  Martin Baulig  <martin@ximian.com>
1598
1599         * typemanager.cs
1600         (TypeManager.not_supported_exception_type): New type.   
1601
1602 2004-07-14  Martin Baulig  <martin@ximian.com>
1603
1604         * iterators.cs: Use real error numbers.
1605
1606 2004-07-14  Martin Baulig  <martin@ximian.com>
1607
1608         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1609         requires this to be a System.Collection.IEnumerable and not a
1610         class implementing that interface.
1611         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1612
1613 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1614
1615         * class.cs: Fixed previous fix, it broke some error tests.
1616
1617 2004-07-12  Martin Baulig  <martin@ximian.com>
1618
1619         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1620         Fixes #61293.
1621
1622 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1623
1624         * assign.cs (LocalTemporary): Add new argument: is_address,If
1625         `is_address' is true, then the value that we store is the address
1626         to the real value, and not the value itself.
1627         
1628         * ecore.cs (PropertyExpr): use the new local temporary
1629         stuff to allow us to handle X.Y += z (where X is a struct)
1630
1631 2004-07-08  Martin Baulig  <martin@ximian.com>
1632
1633         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1634         not always return, just like we're doing in Using.Resolve().
1635
1636 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1637
1638         * cs-parser.jay (fixed_statement): flag this as Pinned.
1639
1640 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1641
1642         * typemanager.cs (TypeManager): Removed MakePinned method, this
1643         mechanism is replaced with the .NET 2.x compatible mechanism of
1644         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1645
1646         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1647         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1648         `IsFixed' property which has a different meaning.
1649
1650 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1651
1652         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1653         visible from inside a nested class, not just the names of the
1654         immediately enclosing class.
1655         Fix for bug #60730.
1656
1657 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1658
1659         * expression.cs (BetterConversion): Remove buggy special-case
1660         handling of "implicit constant expression conversions".  At this
1661         point, we already know that the conversion is possible -- we're
1662         only checking to see which is better.
1663
1664 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1665
1666         * cs-parser.jay: Added error CS0210 test.
1667
1668 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1669
1670         * cs-parser.jay: Added error CS0134 test.
1671
1672 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1673
1674         Fix bug #52507
1675         * cs-parser.jay: Added error CS0145 test.
1676
1677 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1678
1679         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1680
1681 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1682         
1683         * expression.cs (StackAlloc.Resolve): The argument may not
1684         be a constant; deal with this case.
1685         
1686 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1687
1688         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1689         GetIndexerAttributeValue.
1690         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1691
1692         * class.cs (Indexer.Define): Added error tests for CS0415,
1693         CS0609.
1694
1695 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1696
1697         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1698         property code.
1699
1700 2004-06-23  Martin Baulig  <martin@ximian.com>
1701
1702         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1703         neither return nor throw, reset the barrier as well.  Fixes #60457.
1704
1705 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1706
1707         * class.cs : EventAttributes is now set to None by default.
1708           This fixes bug #60459.
1709
1710 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1711
1712         Fix bug #60219
1713         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1714         Don't throw exception but return null (it's sufficient now).
1715
1716 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1717
1718         * typemanager.cs (GetArgumentTypes): Faster implementation.
1719
1720 2004-06-18  Martin Baulig  <martin@ximian.com>
1721
1722         * attribute.cs (Attribute.Resolve): Check whether we're an
1723         EmptyCast which a Constant child.  Fixes #60333.
1724
1725 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1726
1727         * statement.cs (EmitCollectionForeach): Account for the fact that
1728         not all valuetypes are in areas which we can take the address of.
1729         For these variables, we store to a temporary variable. Also, make
1730         sure that we dont emit a `callvirt' on a valuetype method.
1731
1732 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1733
1734         * expression.cs (StackAlloc.DoReSolve): Added test for
1735         negative parameter (CS0247).
1736
1737 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1738
1739         Fix bug #59792
1740         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1741
1742 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1743
1744         Fix bug #59781
1745         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1746         ulong.
1747
1748 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1749
1750         Fix bug #58254 & cs1555.cs, cs1556.cs
1751         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1752
1753 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1754
1755         * cs-parser.jay: Added error CS1669 test for indexers.
1756
1757 2004-06-11  Martin Baulig  <martin@ximian.com>
1758
1759         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1760         call this twice: for params and varargs methods.
1761
1762 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1763
1764         * class.cs:
1765         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1766
1767 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1768
1769         * attribute.cs (Attribute.GetValidTargets): Made public.
1770
1771         * class.cs: 
1772         (AbstractPropertyEventMethod): New class for better code sharing.
1773         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1774         CS1667 report.
1775         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1776
1777 2004-06-11  Raja R Harinath  <rharinath@novell.com>
1778
1779         Fix bug #59477.
1780         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
1781         that the call to Resolve is part of a MemberAccess.
1782         (Expression.Resolve): Use it for SimpleName resolution.
1783         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
1784         Add 'intermediate' boolean argument.
1785         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
1786         error message when the SimpleName can be resolved ambiguously
1787         between an expression and a type.
1788         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
1789         public.
1790         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
1791         call on the left-side.
1792
1793 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1794
1795         * class.cs:
1796         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
1797
1798 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1799
1800         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
1801
1802 2004-06-11  Martin Baulig  <martin@ximian.com>
1803
1804         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
1805         varargs methods if applicable.
1806
1807 2004-06-11  Martin Baulig  <martin@ximian.com>
1808
1809         * expression.cs (Invocation.EmitCall): Don't use
1810         `method.CallingConvention == CallingConventions.VarArgs' since the
1811         method could also have `CallingConventions.HasThis'.
1812
1813 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1814
1815         * class.cs (Event.GetSignatureForError): Implemented.
1816         Fixed crash in error test cs3010.cs
1817
1818 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
1819
1820         * cs-tokenizer.cs: Change the way we track __arglist to be
1821         consistent with the other keywords.
1822
1823 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
1824
1825         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
1826         tomorrow.
1827
1828 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
1829
1830         * codegen.cs: Check that all referenced assemblies have a strongname
1831         before strongnaming the compiled assembly. If not report error CS1577.
1832         Fix bug #56563. Patch by Jackson Harper.
1833         * typemanager.cs: Added a method to return all referenced assemblies.
1834         Fix bug #56563. Patch by Jackson Harper.
1835
1836 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1837
1838         * class.cs:
1839         (Method.ApplyAttributeBuilder): Moved and added conditional
1840         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
1841
1842         * delegate.cs:
1843         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
1844
1845 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1846
1847         Fixed #59640
1848         * class.cs: (EventField.attribute_targets): Changed default target.
1849
1850 2004-06-08  Martin Baulig  <martin@ximian.com>
1851
1852         * expression.cs (Invocation.EmitCall): Enable varargs methods.
1853
1854 2004-06-08  Martin Baulig  <martin@ximian.com>
1855
1856         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
1857
1858 2004-06-07  Martin Baulig  <martin@ximian.com>
1859
1860         Added support for varargs methods.
1861
1862         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
1863         keyword.
1864
1865         * cs-parser.jay: Added support for `__arglist'.
1866
1867         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
1868
1869         * expression.cs (Argument.AType): Added `ArgList'.
1870         (Invocation): Added support for varargs methods.
1871         (ArglistAccess): New public class.
1872         (Arglist): New public class.
1873
1874         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
1875
1876         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
1877         a method's top-level block if the method has varargs.
1878
1879         * support.cs (ReflectionParameters, InternalParameters): Added
1880         support for varargs methods.    
1881
1882 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
1883
1884         * class.cs: Provide location in indexer error report.
1885
1886         * driver.cs: Use standard names.
1887
1888         * namespace.cs: Catch the use of using after a namespace has been
1889         declared also on using aliases.
1890
1891 2004-06-03  Raja R Harinath  <rharinath@novell.com>
1892
1893         Bug #50820.
1894         * typemanager.cs (closure_private_ok, closure_invocation_type)
1895         (closure_qualifier_type, closure_invocation_assembly)
1896         (FilterWithClosure): Move to ...
1897         (Closure): New internal nested class.
1898         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
1899         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
1900         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
1901         (MemberLookup, MemberLookupFailed): Use it.
1902         * expression.cs (New.DoResolve): Treat the lookup for the
1903         constructor as being qualified by the 'new'ed type.
1904         (Indexers.GetIndexersForTypeOrInterface): Update.
1905
1906 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
1907
1908         * attribute.cs
1909         (GetConditionalAttributeValue): New method. Returns
1910         condition of ConditionalAttribute.
1911         (SearchMulti): New method.  Returns all attributes of type 't'.
1912         Use it when attribute is AllowMultiple = true.
1913         (IsConditionalMethodExcluded): New method.
1914
1915         * class.cs
1916         (Method.IsExcluded): Implemented. Returns true if method has conditional
1917         attribute and the conditions is not defined (method is excluded).
1918         (IMethodData): Extended interface for ConditionalAttribute support.
1919         (PropertyMethod.IsExcluded): Implemented.
1920
1921         * decl.cs
1922         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
1923
1924         * expression.cs
1925         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
1926         on the method.
1927
1928 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
1929
1930         * expression.cs (ArrayCreationExpression): Make this just an
1931         `expression'. It can't be a statement, so the code here was
1932         dead.
1933
1934 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1935
1936         Fixed #59072
1937         * typemanager.cs (GetFullNameSignature): New method for
1938         MethodBase types.
1939
1940 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1941
1942         Fixed #56452
1943         * class.cs (MemberBase.GetSignatureForError): New virtual method.
1944         Use this method when MethodBuilder is null.
1945         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
1946         Added test for error CS0626 (MONO reports error for this situation).
1947         (IMethodData.GetSignatureForError): Extended interface.
1948
1949 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1950
1951         * attribute.cs
1952         (AttributeTester.GetObsoleteAttribute): Returns instance of
1953         ObsoleteAttribute when type is obsolete.
1954
1955         * class.cs
1956         (TypeContainer.VerifyObsoleteAttribute): Override.
1957         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1958         (MethodCode.VerifyObsoleteAttribute): Override.
1959         (MemberBase.VerifyObsoleteAttribute): Override.
1960
1961         * decl.cs
1962         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1963         and report proper error.
1964
1965         *delegate.cs
1966         Delegate.VerifyObsoleteAttribute): Override.
1967
1968         * ecore.cs
1969         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1970         and report proper error.
1971         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1972
1973         * enum.cs
1974         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1975         and enum member.
1976
1977         * expression.cs
1978         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1979         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1980         Added test for ObsoleteAttribute.
1981
1982         * statement.cs
1983         (Catch): Derived from Statement.
1984
1985 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1986  
1987         Fixed bug #59071 & cs0160.cs
1988  
1989         * statement.cs (Try.Resolve): Check here whether order of catch
1990         clauses matches their dependencies.
1991
1992 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
1993
1994         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
1995         caused a regression: #59343.  Referencing nested classes from an
1996         assembly stopped working.
1997
1998 2004-05-31  Martin Baulig  <martin@ximian.com>
1999
2000         MCS is now frozen for beta 2.
2001
2002 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2003
2004         * convert.cs: add a trivial cache for overload operator resolution.
2005
2006 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2007
2008         * decl.cs: If possible, use lookuptypedirect here. We can only do
2009         this if there is no `.' after the namespace. Avoids using
2010         LookupType, which does lots of slow processing.
2011         (FindNestedType) New method, does what it says :-).
2012         * namespace.cs: use LookupTypeDirect.
2013         * rootcontext.cs: use membercache, if possible.
2014         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2015
2016 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2017
2018         * expression.cs:
2019         According to the spec, 
2020
2021         In a member access of the form E.I, if E is a single identifier,
2022         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2023         field, property, localvariable, or parameter with the same type as
2024         the meaning of E as a type-name (§3.8), then both possible
2025         meanings of E are permitted.
2026
2027         We did not check that E as a simple-name had the same type as E as
2028         a type name.
2029
2030         This trivial check gives us 5-7% on bootstrap time.
2031
2032 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2033
2034         * expression.cs (Invocation.OverloadResolve): Avoid the
2035         use of hashtables and boxing here by allocating on demand.
2036
2037 2004-05-30  Martin Baulig  <martin@ximian.com>
2038
2039         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2040         we're doing a silent lookup.  Don't try to lookup nested types in
2041         TypeManager.object_type (thanks to Ben Maurer).
2042
2043 2004-05-30  Martin Baulig  <martin@ximian.com>
2044
2045         Committing a patch from Ben Maurer.
2046
2047         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2048
2049 2004-05-29  Martin Baulig  <martin@ximian.com>
2050
2051         * class.cs (IMethodData.ShouldIgnore): New method.
2052
2053         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2054         `Location' argument, we don't need it anywhere.  Use
2055         `IMethodData.ShouldIgnore ()' instead of
2056         `MethodData.GetMethodFlags ()'.
2057         (TypeManager.AddMethod): Removed.
2058         (TypeManager.AddMethod2): Renamed to AddMethod.
2059
2060 2004-05-29  Martin Baulig  <martin@ximian.com>
2061
2062         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2063
2064         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2065         converting from a class type S to an interface type and we already
2066         have an object on the stack, don't box it again.  Fixes #52578.
2067
2068 2004-05-29  Martin Baulig  <martin@ximian.com>
2069
2070         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2071         Added support for `params' parameters.  Fixes #59267.
2072
2073 2004-05-29  Martin Baulig  <martin@ximian.com>
2074
2075         * literal.cs (NullPointer): Provide a private .ctor which sets
2076         `type' to TypeManager.object_type.  Fixes #59048.
2077
2078 2004-05-29  Martin Baulig  <martin@ximian.com>
2079
2080         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2081         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2082
2083         * ecore.cs (EventExpr.instance_expr): Make the field private.
2084
2085 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2086
2087         Fixed bug #50080 & cs0214-2.cs
2088         * expression.cs (Cast.DoResolve): Check unsafe context here.
2089         
2090         * statement.cs (Resolve.DoResolve): Likewise.
2091
2092 2004-05-26  Martin Baulig  <martin@ximian.com>
2093
2094         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2095
2096         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2097         (RootContext.LookupType): Pass down the `silent' flag.
2098
2099 2004-05-25  Martin Baulig  <martin@ximian.com>
2100
2101         * expression.cs
2102         (MethodGroupExpr.IdenticalTypeName): New public property.
2103         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2104         expression actually refers to a type.
2105
2106 2004-05-25  Martin Baulig  <martin@ximian.com>
2107
2108         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2109         for #56176 and made it actually work.
2110
2111 2004-05-25  Martin Baulig  <martin@ximian.com>
2112
2113         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2114         (FieldExpr, PropertyExpr): Override and implement
2115         CacheTemporaries.  Fixes #52279.
2116
2117 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2118
2119         * location.cs: In the new compiler listing a file twice is a
2120         warning, not an error.
2121
2122 2004-05-24  Martin Baulig  <martin@ximian.com>
2123
2124         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2125         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2126
2127 2004-05-24  Martin Baulig  <martin@ximian.com>
2128
2129         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2130         walking the `using' list.  Fixes #53921.
2131
2132 2004-05-24  Martin Baulig  <martin@ximian.com>
2133
2134         * const.cs (Const.LookupConstantValue): Added support for
2135         EmptyCast's; fixes #55251.
2136
2137 2004-05-24  Martin Baulig  <martin@ximian.com>
2138
2139         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2140         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2141         which does the CS0135 check.  The reason is that we first need to
2142         check whether the variable actually exists.
2143
2144 2004-05-24  Martin Baulig  <martin@ximian.com>
2145
2146         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2147         than RootContext.LookupType() to find the explicit interface
2148         type.  Fixes #58584.
2149
2150 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2151
2152         * Makefile: Simplify.  Use executable.make.
2153         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2154
2155 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2156
2157         * decl.cs:
2158         * enum.cs:
2159         Use the invariant culture when doing String.Compare for CLS case
2160         sensitivity.
2161         
2162 2004-05-23  Martin Baulig  <martin@ximian.com>
2163
2164         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2165         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2166
2167         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2168         
2169 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2170
2171         * class.cs (MemberBase.Define): Reuse MemberType member for 
2172         resolved type. Other methods can use it too.
2173
2174 2004-05-23  Martin Baulig  <martin@ximian.com>
2175
2176         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2177         the variable also exists in the current block (otherwise, we need
2178         to report a CS0103).  Fixes #58670.
2179
2180 2004-05-23  Martin Baulig  <martin@ximian.com>
2181
2182         * flowanalysis.cs (Reachability.Reachable): Compute this
2183         on-the-fly rather than storing it as a field.
2184
2185 2004-05-23  Martin Baulig  <martin@ximian.com>
2186
2187         * flowanalysis.cs (Reachability.And): Manually compute the
2188         resulting `barrier' from the reachability.      
2189        
2190 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2191
2192         Fix bug #57835
2193         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2194         instance of ObsoleteAttribute when symbol is obsolete.
2195
2196         * class.cs
2197         (IMethodData): Extended interface for ObsoleteAttribute support.
2198
2199 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2200
2201         * attribute.cs: Fix bug #55970
2202
2203 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2204
2205         Fix bug #52705
2206         * attribute.cs
2207         (GetObsoleteAttribute): New method. Creates the instance of
2208         ObsoleteAttribute.
2209         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2210         ObsoleteAttribute when member is obsolete.
2211         (AttributeTester.Report_ObsoleteMessage): Common method for
2212         Obsolete error/warning reporting.
2213
2214         * class.cs
2215         (TypeContainer.base_classs_type): New member for storing parent type.
2216
2217         * decl.cs
2218         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2219         for this MemberCore.
2220
2221 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2222
2223         * attribute.cs, const.cs: Fix bug #58590
2224
2225 2004-05-21  Martin Baulig  <martin@ximian.com>
2226
2227         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2228         out parameters if the end of the method is unreachable.  Fixes
2229         #58098. 
2230
2231 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2232
2233         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2234         Hari was right, why extra method.
2235
2236 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2237
2238         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2239
2240 2004-05-20  Martin Baulig  <martin@ximian.com>
2241
2242         Merged this back from gmcs to keep the differences to a minumum.
2243
2244         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
2245         instead of a Declspace.
2246         (Attribute.ResolveType): Likewise.
2247         (Attributes.Search): Likewise.
2248         (Attributes.Contains): Likewise.
2249         (Attributes.GetClsCompliantAttribute): Likewise.
2250
2251         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
2252         argument.
2253         (MethodData.ApplyAttributes): Take an EmitContext instead of a
2254         DeclSpace.
2255
2256 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2257
2258         Fix bug #58688 (MCS does not report error when the same attribute
2259         is assigned twice)
2260
2261         * attribute.cs (Attribute.Emit): Distinction between null and default.
2262
2263 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2264
2265         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2266         of a top-level attribute without an attribute target.
2267         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2268         Make non-static.
2269         (Attribute.Conditional_GetConditionName), 
2270         (Attribute.Obsolete_GetObsoleteMessage): Update.
2271         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2272         part of ScanForIndexerName.
2273         (Attribute.CanIgnoreInvalidAttribute): New function.
2274         (Attribute.ScanForIndexerName): Move to ...
2275         (Attributes.ScanForIndexerName): ... here.
2276         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2277         (Attributes.Search): New internal variant that can choose not to
2278         complain if types aren't resolved.  The original signature now
2279         complains.
2280         (Attributes.GetClsCompliantAttribute): Use internal variant, with
2281         complaints suppressed.
2282         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2283         only if it not useful.
2284         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2285         top-level for attributes that are shared between the assembly
2286         and a top-level class.
2287         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2288         * class.cs: Update to reflect changes.
2289         (DefineIndexers): Fuse loops.
2290         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2291         a couple more variants of attribute names.
2292
2293 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2294
2295         Fix bug #52585 (Implemented explicit attribute declaration)
2296
2297         * attribute.cs:
2298         (Attributable.ValidAttributeTargets): New abstract method. It gets
2299         list of valid attribute targets for explicit target declaration.
2300         (Attribute.Target): It holds target itself.
2301         (AttributeSection): Removed.
2302         (Attribute.CheckTargets): New method. It checks whether attribute
2303         target is valid for the current element.
2304
2305         * class.cs:
2306         (EventProperty): New class. For events that are declared like
2307         property (with add and remove accessors).
2308         (EventField): New class. For events that are declared like field.
2309         class.cs
2310
2311         * cs-parser.jay: Implemented explicit attribute target declaration.
2312
2313         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2314         Override ValidAttributeTargets.
2315
2316         * parameter.cs:
2317         (ReturnParameter): Class for applying custom attributes on 
2318         the return type.
2319         (ParameterAtribute): New class. Class for applying custom
2320         attributes on the parameter type.
2321
2322 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
2323
2324         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
2325         definitions. 
2326
2327         (Method): Allow UNSAFE here.
2328
2329         * modifiers.cs: Support unsafe reporting.
2330
2331 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
2332
2333         * decl.cs: Fix bug #58478.
2334
2335 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2336
2337         * statement.cs: When checking for unreachable code on an EmptyStatement,
2338         set the location. Fixes bug #58488.
2339
2340 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
2341
2342         * driver.cs: Add -pkg handling.
2343
2344         From Gonzalo: UseShelLExecute=false
2345
2346 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
2347
2348         * attribute.cs:
2349         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
2350         for attribute.
2351         (Attribute.IsClsCompliaceRequired): Moved to base for better
2352         accesibility.
2353         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
2354         when attribute is AttributeUsageAttribute.
2355         (Attribute.GetValidTargets): Simplified.
2356         (Attribute.GetAttributeUsage): New method returns AttributeUsage
2357         attribute for this type.
2358         (Attribute.ApplyAttributes): Method renamed to Emit and make
2359         non-static.
2360         (GlobalAttributeSection): New class for special handling of global
2361         attributes (assembly, module).
2362         (AttributeSection.Emit): New method.
2363
2364         * class.cs: Implemented Attributable abstract methods.
2365         (MethodCore.LabelParameters): Moved to Parameter class.
2366         (Accessor): Is back simple class.
2367         (PropertyMethod): Implemented Attributable abstract class.
2368         (DelegateMethod): Implemented Attributable abstract class.
2369         (Event): New constructor for disctintion between normal Event
2370         and Event with accessors.
2371
2372         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
2373
2374         * codegen.cs, const.cs, decl.cs, delegate.cs:
2375         (CommonAssemblyModulClass): Implemented Attributable abstract class
2376         and simplified.
2377
2378         * enum.cs: Implement IAttributeSupport interface.
2379         (EnumMember): New class for emum members. Implemented Attributable
2380         abstract class
2381
2382         * parameter.cs:
2383         (ParameterBase): Is abstract.
2384         (ReturnParameter): New class for easier [return:] attribute handling.
2385
2386         * typemanager.cs: Removed builder_to_attr.
2387
2388 2004-05-11  Raja R Harinath  <rharinath@novell.com>
2389
2390         Fix bug #57151.
2391         * attribute.cs (Attribute.GetPositionalValue): New function.
2392         * class.cs (TypeContainer.VerifyMembers): New function.
2393         (TypeContainer.Emit): Use it.
2394         (ClassOrStruct): New base class for Class and Struct.
2395         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
2396         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
2397         class.
2398         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
2399         then each non-static field should have a FieldOffset attribute.
2400         Otherwise, none of the fields should have a FieldOffset attribute.
2401         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
2402         and FieldOffset attributes.
2403         * typemanager.cs (TypeManager.struct_layout_attribute_type)
2404         (TypeManager.field_offset_attribute_type): New core types.
2405         (TypeManager.InitCoreTypes): Initialize them.
2406
2407 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
2408
2409         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
2410         Return correct type.
2411         From bug #58270.
2412
2413 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
2414
2415         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
2416         be implicitly converted to ulong.
2417         
2418         * expression.cs: The logic for allowing operator &, | and ^ worked
2419         was wrong, it worked before because we did not report an error in
2420         an else branch.  Fixes 57895.
2421
2422         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
2423         allow volatile fields to be reference types.
2424
2425 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
2426
2427         * driver.cs: Add support for /debug-
2428
2429 2004-05-07  Raja R Harinath  <rharinath@novell.com>
2430
2431         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
2432         Add a 'complain' parameter to silence errors.
2433         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
2434         silently overlooked type-resolutions.
2435         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
2436         to reflect changes.
2437         (Attributes.Search): New function.
2438         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
2439         (Attributes.GetAttributeFullName): Remove hack.
2440         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
2441         Update to reflect changes.
2442         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
2443         Use Attributes.Search instead of nested loops.
2444
2445 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
2446
2447         * decl.cs:
2448         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
2449         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
2450         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
2451
2452         * report.cs: (Report.Warning): Renamed to Warning_T because of
2453         parameter collision.
2454
2455 2004-05-05  Raja R Harinath  <rharinath@novell.com>
2456
2457         * expression.cs (MemberAccess.ResolveMemberAccess):
2458         Exit with non-zero status after Report.Error.
2459         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
2460         Likewise.
2461         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
2462
2463 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2464
2465         * support.cs: Don't hang when the file is empty.
2466
2467 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2468
2469         * support.cs: In SeekableStreamReader, compute the preamble size of the
2470           underlying stream. Position changes should take into account that initial
2471           count of bytes.
2472
2473 2004-05-03  Todd Berman  <tberman@sevenl.net>
2474
2475         * driver.cs: remove unused GetSysVersion function.
2476
2477 2004-05-03  Todd Berman  <tberman@sevenl.net>
2478
2479         * driver.cs: Remove the hack from saturday, as well as the hack
2480         from jackson (LoadAssemblyFromGac), also adds the CWD to the
2481         link_paths to get that bit proper.
2482
2483 2004-05-01  Todd Berman  <tberman@sevenl.net>
2484
2485         * driver.cs: Try a LoadFrom before a Load, this checks the current
2486         path. This is currently a bug in mono that is be fixed, however, this
2487         provides a workaround for now. This will be removed when the bug
2488         is fixed.
2489
2490 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
2491
2492         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2493         incomplete key pairs (#57941).
2494
2495 2004-05-01  Todd Berman  <tberman@sevenl.net>
2496
2497         * driver.cs: Remove '.' from path_chars, now System.* loads properly
2498         from the GAC
2499
2500 2004-04-30  Jackson Harper  <jackson@ximian.com>
2501
2502         * codegen.cs: Open keys readonly.
2503         
2504 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2505
2506         * typemanager.cs: don't report cyclic struct layout when a struct
2507         contains 2 or more fields of the same type. Failed for Pango.AttrShape
2508         which has 2 Pango.Rectangle fields.
2509
2510 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2511
2512         * expression.cs: Handle IntPtr comparisons with IL code
2513         rather than a method call.
2514
2515 2004-04-29  Martin Baulig  <martin@ximian.com>
2516
2517         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
2518         the list of PropertyInfo's in class hierarchy and find the
2519         accessor.  Fixes #56013.
2520
2521 2004-04-29  Martin Baulig  <martin@ximian.com>
2522
2523         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2524
2525 2004-04-29  Martin Baulig  <martin@ximian.com>
2526
2527         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2528
2529         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2530
2531 2004-04-29  Martin Baulig  <martin@ximian.com>
2532
2533         * class.cs (ConstructorInitializer.Resolve): Check whether the
2534         parent .ctor is accessible.  Fixes #52146.
2535
2536 2004-04-29  Martin Baulig  <martin@ximian.com>
2537
2538         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2539
2540         * statement.cs (Using.EmitLocalVariableDecls): Use
2541         TypeManager.idisposable_type, not typeof (IDisposable).
2542         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2543
2544 2004-04-29  Martin Baulig  <martin@ximian.com>
2545
2546         * class.cs (Event.Define): Don't emit the field and don't set
2547         RTSpecialName and SpecialName for events on interfaces.  Fixes
2548         #57703. 
2549
2550 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2551
2552         Refactor Attribute.ApplyAttributes.
2553         * attribute.cs (Attributable): New base class for objects that can
2554         have Attributes applied on them.
2555         (Attribute): Make AttributeUsage fields public.
2556         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2557         (Attribute.IsInternalCall): New property.
2558         (Attribute.UsageAttr): Convert to a public read-only property.
2559         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2560         (Attribute.ResolveType, Attribute.Resolve)
2561         (Attribute.ScanForIndexerName): Update to reflect changes.
2562         (Attribute.CheckAttributeTarget): Re-format.
2563         (Attribute.ApplyAttributes): Refactor, to various
2564         Attributable.ApplyAttributeBuilder methods.
2565         * decl.cs (MemberCore): Make Attributable.
2566         * class.cs (Accessor): Make Attributable.
2567         (MethodData.ApplyAttributes): Use proper attribute types, not
2568         attribute names.
2569         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2570         (TypeContainer.ApplyAttributeBuilder)
2571         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2572         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2573         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2574         (Operator.ApplyAttributeBuilder): New factored-out methods.
2575         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2576         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2577         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2578         * parameter.cs (ParameterBase): New Attributable base class
2579         that can also represent Return types.
2580         (Parameter): Update to the changes.
2581
2582 2004-04-29  Jackson Harper  <jackson@ximian.com>
2583
2584         * driver.cs: Prefer the corlib system version when looking for
2585         assemblies in the GAC. This is still a hack, but its a better hack
2586         now.
2587         
2588 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2589
2590         * decl.cs, enum.cs: Improved error 3005 reporting.
2591   
2592         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2593         (related_symbols): New private member for list of symbols
2594         related to reported error/warning.
2595         
2596         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2597
2598 2004-04-29  Martin Baulig  <martin@ximian.com>
2599
2600         * ecore.cs (Expression.Constantify): If we're an enum and
2601         TypeManager.TypeToCoreType() doesn't give us another type, use
2602         t.UnderlyingSystemType.  Fixes #56178.  
2603
2604 2004-04-29  Martin Baulig  <martin@ximian.com>
2605
2606         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2607         interfaces and for each interface, only add members directly
2608         declared in that interface.  Fixes #53255.
2609
2610 2004-04-28  Martin Baulig  <martin@ximian.com>
2611
2612         * expression.cs (ConditionalLogicalOperator): Use a temporary
2613         variable for `left' to avoid that we evaluate it more than once;
2614         bug #52588.
2615
2616 2004-04-28  Martin Baulig  <martin@ximian.com>
2617
2618         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2619         `void[]' (CS1547).
2620
2621 2004-04-28  Martin Baulig  <martin@ximian.com>
2622
2623         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2624         void (CS1547).
2625
2626         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2627         whether the type is not void (CS1547).
2628
2629 2004-04-28  Martin Baulig  <martin@ximian.com>
2630
2631         * expression.cs (Unary.DoResolveLValue): Override this and report
2632         CS0131 for anything but Operator.Indirection.
2633
2634 2004-04-28  Martin Baulig  <martin@ximian.com>
2635
2636         Committing a patch from Ben Maurer; see bug #50820.
2637
2638         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2639         check for classes.
2640
2641         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2642         classes.        
2643
2644 2004-04-28  Martin Baulig  <martin@ximian.com>
2645
2646         Committing a patch from Ben Maurer; see bug #50820.
2647
2648         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2649         check for classes.
2650
2651         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2652         classes.        
2653
2654 2004-04-28  Martin Baulig  <martin@ximian.com>
2655
2656         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2657         (Block.AddLabel): Call DoLookupLabel() to only search in the
2658         current block.
2659
2660 2004-04-28  Martin Baulig  <martin@ximian.com>
2661
2662         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2663         comparing StringConstants and NullLiterals in Equality and Inequality.
2664
2665 2004-04-28  Jackson Harper  <jackson@ximian.com>
2666
2667         * driver.cs: Attempt to load referenced assemblies from the
2668         GAC. This is the quick and dirty version of this method that
2669         doesnt take into account versions and just takes the first
2670         canidate found. Will be good enough for now as we will not have more
2671         then one version installed into the GAC until I update this method.
2672
2673 2004-04-28  Martin Baulig  <martin@ximian.com>
2674
2675         * typemanager.cs (TypeManager.CheckStructCycles): New public
2676         static method to check for cycles in the struct layout.
2677
2678         * rootcontext.cs (RootContext.PopulateTypes): Call
2679         TypeManager.CheckStructCycles() for each TypeContainer.
2680         [Note: We only need to visit each type once.]
2681
2682 2004-04-28  Martin Baulig  <martin@ximian.com>
2683
2684         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2685
2686         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2687         success and added `out object value'.  Use a `bool resolved' field
2688         to check whether we've already been called rather than
2689         `ConstantValue != null' since this breaks for NullLiterals.
2690
2691 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2692
2693         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2694         setting of this flag, since the 'set' method may be non-public.
2695
2696 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2697
2698         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2699         check on current_vector.Block.
2700
2701 2004-04-27  Martin Baulig  <martin@ximian.com>
2702
2703         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2704         a field initializer.  Fixes #56459.
2705
2706 2004-04-27  Martin Baulig  <martin@ximian.com>
2707
2708         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2709         we're not attempting to use an indexer.  Fixes #52154.
2710
2711 2004-04-27  Martin Baulig  <martin@ximian.com>
2712
2713         * statement.cs (Return): Don't create a return label if we don't
2714         need it; reverts my change from January 20th.  Thanks to Ben
2715         Maurer for this.
2716
2717 2004-04-27  Martin Baulig  <martin@ximian.com>
2718
2719         According to the spec, `goto' can only leave a nested scope, but
2720         never enter it.
2721
2722         * statement.cs (Block.LookupLabel): Only lookup in the current
2723         block, don't recurse into parent or child blocks.
2724         (Block.AddLabel): Check in parent and child blocks, report
2725         CS0140/CS0158 if we find a duplicate.
2726         (Block): Removed this indexer for label lookups.
2727         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2728         this already does the error reporting for us.
2729
2730         * flowanalysis.cs
2731         (FlowBranching.UsageVector.Block): New public variable; may be null.
2732         (FlowBranching.CreateSibling): Added `Block' argument.
2733         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2734         label for the target of a `goto' and check whether we're not
2735         leaving a `finally'.
2736
2737 2004-04-27  Martin Baulig  <martin@ximian.com>
2738
2739         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2740         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2741         just for returns).
2742
2743 2004-04-27  Martin Baulig  <martin@ximian.com>
2744
2745         * statement.cs (Block.AddLabel): Also check for implicit blocks
2746         and added a CS0158 check.
2747
2748 2004-04-27  Martin Baulig  <martin@ximian.com>
2749
2750         * flowanalysis.cs (FlowBranchingLoop): New class.
2751         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2752         UsageVector's instead of an ArrayList.
2753         (FlowBranching.Label): Likewise.
2754         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2755         (FlowBranching.AddBreakVector): New method.
2756
2757 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2758
2759         * attribute.cs: Small regression fix: only convert the type if we
2760         the type is different, fixes System.Drawing build.
2761
2762 2004-04-27  Martin Baulig  <martin@ximian.com>
2763
2764         * attribute.cs (Attribute.Resolve): If we have a constant value
2765         for a named field or property, implicity convert it to the correct
2766         type.
2767
2768 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2769
2770         * statement.cs (Block.Block): Implicit blocks share
2771         'child_variable_names' fields with parent blocks.
2772         (Block.AddChildVariableNames): Remove.
2773         (Block.AddVariable): Mark variable as "used by a child block" in
2774         every surrounding block.
2775         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2776         been used in a child block, complain about violation of "Invariant
2777         meaning in blocks" rule.
2778         * cs-parser.jay (declare_local_variables): Don't use
2779         AddChildVariableNames.
2780         (foreach_statement): Don't create an implicit block: 'foreach'
2781         introduces a scope.
2782
2783 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2784
2785         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2786         converting from 0L to ulong.  Fixes 57522.
2787
2788 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2789
2790         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2791         derived class hides via 'new' keyword field from base class (test-242.cs).
2792         TODO: Handle this in the more general way.
2793         
2794         * class.cs (CheckBase): Ditto.
2795
2796 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2797
2798         * decl.cs (caching_flags): New member for storing cached values
2799         as bit flags.
2800         (MemberCore.Flags): New enum where bit flags for caching_flags
2801         are defined.
2802         (MemberCore.cls_compliance): Moved to caching_flags.
2803         (DeclSpace.Created): Moved to caching_flags.
2804
2805         * class.cs: Use caching_flags instead of DeclSpace.Created
2806         
2807 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2808
2809         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2810         if we are only a derived class, not a nested class.
2811
2812         * typemanager.cs: Same as above, but do this at the MemberLookup
2813         level (used by field and methods, properties are handled in
2814         PropertyExpr).   Allow for the qualified access if we are a nested
2815         method. 
2816
2817 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2818
2819         * class.cs: Refactoring.
2820         (IMethodData): New inteface; Holds links to parent members
2821         to avoid member duplication (reduced memory allocation).
2822         (Method): Implemented IMethodData interface.
2823         (PropertyBase): New inner classes for get/set methods.
2824         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2825         (Event): New inner classes for add/remove methods.
2826         (Event.DelegateMethod): Implemented IMethodData interface.
2827
2828         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2829         EmitContext (related to class.cs refactoring).
2830
2831 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2832
2833         * delegate.cs (Delegate.VerifyApplicability): If the number of
2834         arguments are the same as the number of parameters, first try to
2835         verify applicability ignoring  any 'params' modifier on the last
2836         parameter.
2837         Fixes #56442.
2838
2839 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2840
2841         * class.cs (TypeContainer.AddIndexer): Use
2842         'ExplicitInterfaceName' to determine if interface name was
2843         explicitly specified.  'InterfaceType' is not initialized at this time.
2844         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2845         Indexers array is already in the required order.  Initialize
2846         'IndexerName' only if there are normal indexers.
2847         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2848         (TypeContainer.Emit): Emit DefaultMember attribute only if
2849         IndexerName is initialized.
2850         Fixes #56300.
2851
2852 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2853
2854         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2855         Fixes #57007
2856
2857 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2858
2859         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2860         attributes.
2861         Fix for #56456.
2862
2863         * attribute.cs (Attribute.Resolve): Check for duplicate named
2864         attributes.
2865         Fix for #56463.
2866
2867 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2868
2869         * iterators.cs (MarkYield): track whether we are in an exception,
2870         and generate code accordingly.  Use a temporary value to store the
2871         result for our state.
2872
2873         I had ignored a bit the interaction of try/catch with iterators
2874         since their behavior was not entirely obvious, but now it is
2875         possible to verify that our behavior is the same as MS .NET 2.0
2876
2877         Fixes 54814
2878
2879 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2880
2881         * iterators.cs: Avoid creating temporaries if there is no work to
2882         do. 
2883
2884         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2885         Enumerations, use TypeManager.EnumToUnderlying and call
2886         recursively. 
2887
2888         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2889         bug #57013
2890
2891         (This.Emit): Use EmitContext.EmitThis to emit our
2892         instance variable.
2893
2894         (This.EmitAssign): Ditto.
2895
2896         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2897         codepaths, we will move all the functionality into
2898         Mono.CSharp.This 
2899
2900         (FieldExpr.EmitAssign): Ditto.
2901
2902         This fixes several hidden bugs that I uncovered while doing a code
2903         review of this today.
2904
2905         * codegen.cs (EmitThis): reworked so the semantics are more clear
2906         and also support value types "this" instances.
2907
2908         * iterators.cs: Changed so that for iterators in value types, we
2909         do not pass the value type as a parameter.  
2910
2911         Initialization of the enumerator helpers is now done in the caller
2912         instead of passing the parameters to the constructors and having
2913         the constructor set the fields.
2914
2915         The fields have now `assembly' visibility instead of private.
2916
2917 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2918
2919         * expression.cs (Argument.Resolve): Check if fields passed as ref
2920         or out are contained in a MarshalByRefObject.
2921
2922         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2923         another compiler type.
2924
2925 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2926
2927         * class.cs (Indexer.Define): use the new name checking method.
2928         Also, return false on an error.
2929         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2930         (is_identifier_[start/part]_character): make static.
2931
2932 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2933
2934         * expression.cs (Binary.ResolveOperator): Do no append strings
2935         twice: since we can be invoked more than once (array evaluation)
2936         on the same concatenation, take care of this here.  Based on a fix
2937         from Ben (bug #56454)
2938
2939 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2940
2941         * codegen.cs: Fix another case where CS1548 must be reported (when 
2942         delay-sign isn't specified and no private is available #56564). Fix
2943         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2944         error when MCS is used on the MS runtime and we need to delay-sign 
2945         (which seems unsupported by AssemblyBuilder - see #56621).
2946
2947 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2948
2949         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2950         (TypeManager.ComputeNamespaces): Faster implementation for
2951         Microsoft runtime.
2952
2953         * compiler.csproj: Updated AssemblyName to mcs.
2954
2955 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2956
2957         * rootcontext.cs: Add new types to the boot resolution.
2958
2959         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2960         MulticastDelegate is not allowed.
2961
2962         * typemanager.cs: Add new types to lookup: System.TypedReference
2963         and ArgIterator.
2964
2965         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2966         check for TypedReference or ArgIterator, they are not allowed. 
2967
2968         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2969         makes us properly catch 1510 in some conditions (see bug 56016 for
2970         details). 
2971
2972 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2973
2974         * CryptoConvert.cs: update from corlib version
2975         with endian fixes.
2976
2977 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2978
2979         * class.cs (Indexer.Define): Check indexername declaration
2980
2981 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2982
2983         * attribute.cs (IsClsCompliant): Fixed problem with handling
2984         all three states (compliant, not-compliant, undetected).
2985
2986 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2987
2988         * attribute.cs (Attribute): Location is now public.
2989         (Resolve): Store resolved arguments (pos_values) in attribute class.
2990         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2991         (GetClsCompliantAttributeValue): New method that gets
2992         CLSCompliantAttribute value.
2993         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2994         if exists else null.
2995         (AttributeTester): New class for CLS-Compliant verification routines.
2996
2997         * class.cs (Emit): Add CLS-Compliant verification.
2998         (Method.GetSignatureForError): Implemented.
2999         (Constructor.GetSignatureForError): Implemented
3000         (Constructor.HasCompliantArgs): Returns if constructor has
3001         CLS-Compliant arguments.
3002         (Constructor.Emit): Override.
3003         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3004         is needed to test only parameters.
3005         (FieldBase.GetSignatureForError): Implemented.
3006         (TypeContainer): New member for storing base interfaces.
3007         (TypeContainer.FindMembers): Search in base interfaces too.
3008
3009         * codegen.cs (GetClsComplianceAttribute): New method that gets
3010         assembly or module CLSCompliantAttribute value.
3011         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3012         for assembly.
3013         (ModuleClass.Emit): Add error 3012 test.
3014
3015         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3016
3017         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3018         state for all decl types.
3019         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3020         if CLS-Compliant tests are required.
3021         (IsClsCompliaceRequired): New method. Analyze whether code
3022         must be CLS-Compliant.
3023         (IsExposedFromAssembly): New method. Returns true when MemberCore
3024         is exposed from assembly.
3025         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3026         value or gets cached value.
3027         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3028         is explicitly marked with CLSCompliantAttribute.
3029         (IsIdentifierClsCompliant): New abstract method. This method is
3030         used to testing error 3005.
3031         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3032         for identifier and parameters CLS-Compliant testing.
3033         (VerifyClsCompliance): New method. The main virtual method for
3034         CLS-Compliant verifications.
3035         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3036         null. I don't know why is null (too many public members !).
3037         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3038         and get value of first CLSCompliantAttribute that found.
3039
3040         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3041         (VerifyClsCompliance): Override and add extra tests.
3042
3043         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3044         clscheck- disable CLS-Compliant verification event if assembly is has
3045         CLSCompliantAttribute(true).
3046
3047         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3048         ApllyAttribute is now called in emit section as in the other cases.
3049         Possible future Emit integration.
3050         (IsIdentifierClsCompliant): New override.
3051         (VerifyClsCompliance): New override.
3052         (GetEnumeratorName): Returns full enum name.
3053
3054         * parameter.cs (GetSignatureForError): Implemented.
3055
3056         * report.cs (WarningData): New struct for Warning message information.
3057         (LocationOfPreviousError): New method.
3058         (Warning): New method. Reports warning based on the warning table.
3059         (Error_T): New method. Reports error based on the error table.
3060
3061         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3062         verifications are done here.
3063
3064         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3065
3066         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3067         CLSCompliantAttribute.
3068         (all_imported_types): New member holds all imported types from other
3069         assemblies.
3070         (LoadAllImportedTypes): New method fills static table with exported types
3071         from all referenced assemblies.
3072         (Modules): New property returns all assembly modules.
3073
3074 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3075
3076         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3077         throwing a parser error.
3078
3079         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3080         which removes the hardcoded get_/set_ prefixes for properties, as
3081         IL allows for the properties to be named something else.  
3082
3083         Bug #56013
3084
3085         * expression.cs: Do not override operand before we know if it is
3086         non-null.  Fix 56207
3087
3088 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3089
3090         * typemanager.cs: support for pinned variables.
3091
3092 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3093
3094         * decl.cs, typemanager.cs: Avoid using an arraylist
3095         as a buffer if there is only one result set.
3096
3097 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3098
3099         * expression.cs: Make sure you cant call a static method
3100         with an instance expression, bug #56174.
3101
3102 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3103
3104         * class.cs (IsDuplicateImplementation): Improve error reporting to
3105         flag 663 (method only differs in parameter modifier).
3106
3107         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3108         in preprocessor directives.
3109
3110         * location.cs (LookupFile): Allow for the empty path.
3111
3112         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3113         better approach for some of that patch, but its failing with the
3114         CharSet enumeration.  For now try/catch will do.
3115
3116         * typemanager.cs: Do not crash if a struct does not have fields.
3117         Fixes 56150.
3118
3119 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3120
3121         * expression.cs: cs0213, cant fix a fixed expression.
3122         fixes 50231.
3123
3124 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3125
3126         * cs-parser.jay: detect invalid embeded statements gracefully.
3127         bug #51113.
3128
3129 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3130
3131         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3132         As a regex:
3133         s/
3134         the invocation type may not be a subclass of the tye of the item/
3135         The type of the item must be a subclass of the invocation item.
3136         /g
3137
3138         Fixes bug #50820.
3139
3140 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3141
3142         * attribute.cs: Added methods to get a string and a bool from an
3143         attribute. Required to information from AssemblyKeyFileAttribute,
3144         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3145         * codegen.cs: Modified AssemblyName creation to include support for
3146         strongnames. Catch additional exceptions to report them as CS1548.
3147         * compiler.csproj: Updated include CryptoConvert.cs.
3148         * compiler.csproj.user: Removed file - user specific configuration.
3149         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3150         Mono.Security assembly. The original class is maintained and tested in
3151         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3152         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3153         like CSC 8.0 (C# v2) supports.
3154         * Makefile: Added CryptoConvert.cs to mcs sources.
3155         * rootcontext.cs: Added new options for strongnames.
3156
3157 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3158
3159         * driver.cs: For --expect-error, report error code `2'
3160         if the program compiled with no errors, error code `1' if
3161         it compiled with an error other than the one expected.
3162
3163 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3164
3165         * compiler.csproj: Updated for Visual Studio .NET 2003.
3166         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3167         * compiler.sln: Updated for Visual Studio .NET 2003.
3168
3169 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3170
3171         * expression.cs: Fix bug #47234. We basically need to apply the
3172         rule that we prefer the conversion of null to a reference type
3173         when faced with a conversion to 'object' (csc behaviour).
3174
3175 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3176
3177         * statement.cs: Shorter form for foreach, eliminates
3178         a local variable. r=Martin.
3179
3180 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3181
3182         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3183         checks if we can use brtrue/brfalse to test for 0.
3184         * expression.cs: use the above in the test for using brtrue/brfalse.
3185         cleanup code a bit.
3186
3187 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3188
3189         * expression.cs: Rewrite string concat stuff. Benefits:
3190
3191         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3192         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3193         rather than a concat chain.
3194
3195         * typemanager.cs: Add lookups for more concat overloads.
3196
3197 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3198
3199         * expression.cs: Emit shorter il code for array init.
3200
3201         newarr
3202         dup
3203         // set 1
3204
3205         // set 2
3206
3207         newarr
3208         stloc.x
3209
3210         ldloc.x
3211         // set 1
3212
3213         ldloc.x
3214         // set 2
3215
3216 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3217
3218         * statement.cs: Before, two switch blocks would be merged if the
3219         total size of the blocks (end_item - begin_item + 1) was less than
3220         two times the combined sizes of the blocks.
3221
3222         Now, it will only merge if after the merge at least half of the
3223         slots are filled.
3224
3225         fixes 55885.
3226
3227 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3228
3229         * class.cs : csc build fix for GetMethods(). See bug #52503.
3230
3231 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3232
3233         * expression.cs: Make sure fp comparisons work with NaN.
3234         This fixes bug #54303. Mig approved this patch a long
3235         time ago, but we were not able to test b/c the runtime
3236         had a related bug.
3237
3238 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3239
3240         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3241
3242 2004-03-19  Martin Baulig  <martin@ximian.com>
3243
3244         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3245         error here and not in our caller.
3246
3247 2004-03-19  Martin Baulig  <martin@ximian.com>
3248
3249         * interface.cs: Completely killed this file.
3250         (Interface): We're now a TypeContainer and live in class.cs.
3251
3252         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3253         argument; we're now also called for interfaces.
3254         (TypeContainer.DefineMembers): Allow this method being called
3255         multiple times.
3256         (TypeContainer.GetMethods): New public method; formerly known as
3257         Interface.GetMethod().  This is used by PendingImplementation.
3258         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3259         it's now private and non-static.
3260         (Interface): Moved this here; it's now implemented similar to
3261         Class and Struct.
3262         (Method, Property, Event, Indexer): Added `bool is_interface'
3263         argument to their .ctor's.
3264         (MemberBase.IsInterface): New public field.
3265
3266         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3267         instances instead of InterfaceMethod, InterfaceProperty, etc.
3268         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3269         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3270
3271 2004-03-19  Martin Baulig  <martin@ximian.com>
3272
3273         * class.cs (MethodCore.IsDuplicateImplementation): New private
3274         method which does the CS0111 checking.
3275         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3276         Use IsDuplicateImplementation().
3277
3278 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3279
3280         * decl.cs (FindMemberToOverride): New method to find the correct
3281         method or property to override in the base class.
3282         * class.cs
3283             - Make Method/Property use the above method to find the
3284               version in the base class.
3285             - Remove the InheritableMemberSignatureCompare as it is now
3286               dead code.
3287
3288         This patch makes large code bases much faster to compile, as it is
3289         O(n) rather than O(n^2) to do this validation.
3290
3291         Also, it fixes bug 52458 which is that nested classes are not
3292         taken into account when finding the base class member.
3293
3294         Reviewed/Approved by Martin.
3295
3296 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3297
3298         * interface.cs: In all interface classes removed redundant
3299         member initialization.
3300
3301 2004-03-16  Martin Baulig  <martin@ximian.com>
3302
3303         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3304
3305 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3306
3307         * decl.cs (DefineTypeAndParents): New helper method to define a
3308         type's containers before the type itself is defined;  This is a
3309         bug exposed by the recent changes to Windows.Forms when an
3310         implemented interface was defined inside a class that had not been
3311         built yet.   
3312
3313         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3314
3315         (Check): Loop correctly to report errors modifiers
3316         (UNSAFE was not in the loop, since it was the same as TOP).
3317
3318         * interface.cs: Every interface member now takes a ModFlags,
3319         instead of a "is_new" bool, which we set on the base MemberCore. 
3320
3321         Every place where we called "UnsafeOk" in the interface, now we
3322         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3323         the unsafe settings from the member declaration instead of the
3324         container interface. 
3325
3326         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3327
3328         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3329         `set_indexer_name' to the pending bits (one per type).
3330
3331         We fixed a bug today that was picking the wrong method to
3332         override, since for properties the existing InterfaceMethod code
3333         basically ignored the method name.  Now we make sure that the
3334         method name is one of the valid indexer names.
3335
3336 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
3337  
3338         * support.cs (SeekableStreamReader): Keep track of stream byte
3339         positions and don't mix them with character offsets to the buffer.
3340
3341         Patch from Gustavo Giráldez
3342
3343 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
3344
3345         * interface.cs (InterfaceSetGetBase): Removed double member
3346         initialization, base class does it as well.
3347
3348 2004-03-13  Martin Baulig  <martin@ximian.com>
3349
3350         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3351         when compiling corlib.
3352
3353 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3354
3355         * convert.cs (ExplicitConversion): We were reporting an error on
3356         certain conversions (object_type source to a value type, when the
3357         expression was `null') before we had a chance to pass it through
3358         the user defined conversions.
3359
3360         * driver.cs: Replace / and \ in resource specifications to dots.
3361         Fixes 50752
3362
3363         * class.cs: Add check for duplicate operators.  Fixes 52477
3364
3365 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3366
3367         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3368         that are in the middle of the statements, not only at the end.
3369         Fixes #54987
3370
3371         * class.cs (TypeContainer.AddField): No longer set the
3372         `HaveStaticConstructor' flag, now we call it
3373         `UserDefineStaticConstructor' to diferentiate the slightly
3374         semantic difference.
3375
3376         The situation is that we were not adding BeforeFieldInit (from
3377         Modifiers.TypeAttr) to classes that could have it.
3378         BeforeFieldInit should be set to classes that have no static
3379         constructor. 
3380
3381         See:
3382
3383         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3384
3385         And most importantly Zoltan's comment:
3386
3387         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3388
3389         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3390          before its static fields are used', i.e. initialization does not need
3391          to be triggered by the first access to the type. Setting this flag
3392          helps the JIT to compile better code, since it can run the static
3393          constructor at JIT time, and does not need to generate code to call it
3394          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3395          this flag for lots of classes like String. 
3396          
3397          csc sets this flag if the type does not have an explicit static 
3398          constructor. The reasoning seems to be that if there are only static
3399          initalizers for a type, and no static constructor, then the programmer
3400          does not care when this initialization happens, so beforefieldinit
3401          can be used.
3402          
3403          This bug prevents the AOT compiler from being usable, since it 
3404          generates so many calls to mono_runtime_class_init that the AOT code
3405          is much slower than the JITted code. The JITted code is faster, 
3406          because it does not generate these calls if the vtable is type is
3407          already initialized, which is true in the majority of cases. But the
3408          AOT compiler can't do this."
3409
3410 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3411
3412         * class.cs (MethodData.Emit): Refactor the code so symbolic
3413         information is generated for destructors;  For some reasons we
3414         were taking a code path that did not generate symbolic information
3415         before. 
3416
3417 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3418
3419         * class.cs: Create a Constructor.CheckBase method that
3420         takes care of all validation type code. The method
3421         contains some code that was moved from Define.
3422
3423         It also includes new code that checks for duplicate ctors.
3424         This fixes bug #55148.
3425
3426 2004-03-09  Joshua Tauberer <tauberer@for.net>
3427
3428         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3429         a { ... }-style array creation invokes EmitStaticInitializers
3430         which is not good for reference-type arrays.  String, decimal
3431         and now null constants (NullCast) are not counted toward
3432         static initializers.
3433
3434 2004-03-05  Martin Baulig  <martin@ximian.com>
3435
3436         * location.cs (SourceFile.HasLineDirective): New public field;
3437         specifies whether the file contains or is referenced by a "#line"
3438         directive.
3439         (Location.DefineSymbolDocuments): Ignore source files which
3440         either contain or are referenced by a "#line" directive.        
3441
3442 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3443
3444         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3445         direct access to our parent, so check the method inline there.
3446
3447 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3448
3449         * expression.cs (Invocation.EmitCall): Miguel's last commit
3450         caused a regression. If you had:
3451
3452             T t = null;
3453             t.Foo ();
3454
3455         In Foo the implict this would be null.
3456
3457 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3458
3459         * expression.cs (Invocation.EmitCall): If the method is not
3460         virtual, do not emit a CallVirt to it, use Call.
3461
3462         * typemanager.cs (GetFullNameSignature): Improve the method to
3463         cope with ".ctor" and replace it with the type name.
3464
3465         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3466         as an argument the ConstructorBuilder where it is being defined,
3467         to catch the recursive constructor invocations.
3468
3469 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3470
3471         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3472         routines to check if a type is an enumerable/enumerator allow
3473         classes that implement the IEnumerable or IEnumerator interfaces.
3474
3475         * class.cs (Property, Operator): Implement IIteratorContainer, and
3476         implement SetYields.
3477
3478         (Property.Define): Do the block swapping for get_methods in the
3479         context of iterators.   We need to check if Properties also
3480         include indexers or not.
3481
3482         (Operator): Assign the Block before invoking the
3483         OperatorMethod.Define, so we can trigger the Iterator code
3484         replacement. 
3485
3486         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3487         Property and Operator classes are not created when we parse the
3488         declarator but until we have the block completed, so we use a
3489         singleton SimpleIteratorContainer.Simple to flag whether the
3490         SetYields has been invoked.
3491
3492         We propagate this setting then to the Property or the Operator to
3493         allow the `yield' to function.
3494
3495 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3496
3497         * codegen.cs: Implemented attribute support for modules.
3498         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3499         Assembly/Module functionality.
3500
3501         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3502         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3503         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3504
3505 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3506
3507         * interface.cs (FindMembers): The operation is performed on all base
3508         interfaces and not only on the first. It is required for future CLS Compliance patch.
3509
3510 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3511
3512         * statement.cs, codegen.cs:
3513         This patch deals with patterns such as:
3514
3515         public class List : IEnumerable {
3516
3517                 public MyEnumerator GetEnumerator () {
3518                         return new MyEnumerator(this);
3519                 }
3520
3521                 IEnumerator IEnumerable.GetEnumerator () {
3522                         ...
3523                 }
3524                 
3525                 public struct MyEnumerator : IEnumerator {
3526                         ...
3527                 }
3528         }
3529
3530         Before, there were a few things we did wrong:
3531         1) we would emit callvirt on a struct, which is illegal
3532         2) we emited ldarg when we needed to emit ldarga
3533         3) we would mistakenly call the interface methods on an enumerator
3534         type that derived from IEnumerator and was in another assembly. For example:
3535
3536         public class MyEnumerator : IEnumerator
3537
3538         Would have the interface methods called, even if there were public impls of the
3539         method. In a struct, this lead to invalid IL code.
3540
3541 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3542
3543         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3544           renamed to Emit.
3545
3546         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3547
3548 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3549
3550         * cs-parser.jay: Fix small regression: we were not testing V2
3551         compiler features correctly.
3552
3553         * interface.cs: If the emit context is null, then create one
3554
3555 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3556
3557         * decl.cs (GetSignatureForError): New virtual method to get full name
3558           for error messages.
3559
3560         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3561           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3562
3563         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3564           Duplicated members and code in these classes has been removed.
3565           Better encapsulation in these classes.
3566
3567 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3568
3569         * assign.cs (Assign.DoResolve): When dealing with compound
3570         assignments, there is a new rule in ECMA C# 2.4 (might have been
3571         there before, but it is documented here) that states that in:
3572
3573         a op= b;
3574
3575         If b is of type int, and the `op' is a shift-operator, then the
3576         above is evaluated as:
3577
3578         a = (int) a op b 
3579
3580         * expression.cs (Binary.ResolveOperator): Instead of testing for
3581         int/uint/long/ulong, try to implicitly convert to any of those
3582         types and use that in pointer arithmetic.
3583
3584         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3585         method to print information for from the type, not from the
3586         null-method we were given.
3587
3588 2004-02-01  Duncan Mak  <duncan@ximian.com>
3589
3590         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3591         parsing for cmd, fixes bug #53694.
3592
3593 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3594
3595         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3596         in the member name duplication tests. Property and operator name duplication
3597         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3598
3599 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3600
3601         * interface.cs (PopulateMethod): Fixed crash when interface method
3602         returns not existing type (error test cs0246-3.cs).
3603
3604 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3605
3606         * cs-parser.jay (interface_accessors): Re-write actions to also
3607         store attributes attached to get and set methods. Fix spelling
3608         while at it.
3609
3610         (inteface_property_declaration): Modify accordingly.
3611
3612         (InterfaceAccessorInfo): New helper class to store information to pass
3613         around between rules that use interface_accessors.
3614
3615         * interface.cs (Emit): Apply attributes on the get and set
3616         accessors of properties and indexers too.
3617
3618         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3619         right MethodBuilder when applying attributes to the get and set accessors.
3620
3621 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3622
3623         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3624
3625 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3626
3627         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3628
3629 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3630
3631         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3632         changes that treat `yield' specially when present before `break'
3633         or `return' tokens.
3634
3635         * cs-tokenizer.cs: yield is no longer a keyword.
3636
3637 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3638
3639         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3640         setting for default constructors.
3641         For default constructors are almost every time set wrong Modifier. The
3642         generated IL code has been alright. But inside mcs this values was
3643         wrong and this was reason why several of my CLS Compliance tests
3644         failed.
3645
3646 2004-01-22  Martin Baulig  <martin@ximian.com>
3647
3648         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3649         not a QualifiedIdentifier.  This is what `type_name_expression'
3650         was previously doing.
3651         (type_name_expression): Removed; the code is now in
3652         `namespace_or_type_name'.
3653         (qualified_identifier): Removed, use `namespace_or_type_name'
3654         instead.
3655         (QualifiedIdentifier): Removed this class.      
3656
3657 2004-01-22  Martin Baulig  <martin@ximian.com>
3658
3659         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3660         not a string as alias name.
3661
3662 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3663
3664         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3665         #52730 bug, and instead compute correctly the need to use a
3666         temporary variable when requesting an address based on the
3667         static/instace modified of the field and the constructor.
3668  
3669 2004-01-21  Martin Baulig  <martin@ximian.com>
3670
3671         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3672         class and namespace before looking up aliases.  Fixes #52517.
3673
3674 2004-01-21  Martin Baulig  <martin@ximian.com>
3675
3676         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3677         assinged in a 'try'; fixes exception4.cs.
3678
3679 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3680         * class.cs : Implemented parameter-less constructor for TypeContainer
3681
3682         * decl.cs: Attributes are now stored here. New property OptAttributes
3683
3684         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3685
3686         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3687
3688 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3689
3690         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3691           (CSharpSignature): New method for indexer and property signature.
3692
3693 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3694
3695         * pending.cs (IsVirtualFilter): Faster implementation.
3696
3697 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3698
3699         * typemanager.cs: Avoid inclusion of same assembly more than once.
3700
3701 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3702
3703         * cs-parser.jay: Fixed problem where the last assembly attribute
3704           has been applied also to following declaration (class, struct, etc.)
3705           
3706 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3707
3708         * class.cs: Added error CS0538, CS0539 reporting.
3709         Fixed crash on Microsoft runtime when field type is void.
3710
3711         * cs-parser.jay: Added error CS0537 reporting.
3712
3713         * pending.cs: Added error CS0535 reporting.
3714         Improved error report for errors CS0536, CS0534.
3715
3716 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3717
3718         Merge a few bits from the Anonymous Method MCS tree.
3719
3720         * statement.cs (ToplevelBlock): New class for toplevel methods,
3721         will hold anonymous methods, lifted variables.
3722
3723         * cs-parser.jay: Create toplevel blocks for delegates and for
3724         regular blocks of code. 
3725
3726 2004-01-20  Martin Baulig  <martin@ximian.com>
3727
3728         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3729         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3730         and `NeedExplicitReturn'; added `IsLastStatement'.
3731         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3732         have a `ReturnLabel' or we're not unreachable.
3733
3734         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3735         child's reachability; don't just override ours with it.  Fixes
3736         #58058 (lluis's example).
3737         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3738         InFinally(), InLoop(), InSwitch() and
3739         BreakCrossesTryCatchBoundary() methods.
3740
3741         * statement.cs (Return): Do all error checking in Resolve().
3742         Unless we are the last statement in a top-level block, always
3743         create a return label and jump to it.
3744         (Break, Continue): Do all error checking in Resolve(); also make
3745         sure we aren't leaving a `finally'.
3746         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3747         statement in a top-level block.
3748         (Block.Flags): Added `IsDestructor'.
3749         (Block.IsDestructor): New public property.
3750
3751 2004-01-20  Martin Baulig  <martin@ximian.com>
3752
3753         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3754
3755 2004-01-20  Martin Baulig  <martin@ximian.com>
3756
3757         * statement.cs (Statement.ResolveUnreachable): New public method.
3758         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3759         (Block.Resolve): Resolve unreachable statements.
3760
3761 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3762
3763         * expression.cs: We need to fix the case where we do
3764         not have a temp variable here.
3765
3766         * assign.cs: Only expression compound assignments need
3767         temporary variables.
3768
3769 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3770
3771         * flowanalysis.cs: Reduce memory allocation in a few ways:
3772           - A block with no variables should not allocate a bit
3773             vector for itself.
3774           - A method with no out parameters does not need any tracking
3775             for assignment of the parameters, so we need not allocate
3776             any data for it.
3777           - The arrays:
3778                 public readonly Type[] VariableTypes;
3779                 public readonly string[] VariableNames;
3780             Are redundant. The data is already stored in the variable
3781             map, so we need not allocate another array for it.
3782           - We need to add alot of checks for if (params | locals) == null
3783             due to the first two changes.
3784
3785 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3786
3787         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3788         implement IMemoryLocation, we store a copy on a local variable and
3789         take the address of it.  Patch from Benjamin Jemlich
3790
3791         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3792         to use a special "type_name_expression" rule which reduces the
3793         number of "QualifiedIdentifier" classes created, and instead
3794         directly creates MemberAccess expressions.
3795
3796 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3797
3798         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3799         that fixes #52853.  Null literal assignment to ValueType
3800
3801         * class.cs (MethodData.Emit): Instead of checking the name of the
3802         method to determine if its a destructor, create a new derived
3803         class from Method called Destructor, and test for that.  
3804
3805         * cs-parser.jay: Create a Destructor object instead of a Method.  
3806
3807         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3808
3809         Fixes: 52933
3810
3811 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3812
3813         * expression.cs (Binary.ResolveOperator): Perform an implicit
3814         conversion from MethodGroups to their delegate types on the
3815         Addition operation.
3816
3817         * delegate.cs: Introduce a new class DelegateCreation that is the
3818         base class for `NewDelegate' and `ImplicitDelegateCreation',
3819         factor some code in here.
3820
3821         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3822         conversion from MethodGroups to compatible delegate types. 
3823
3824         * ecore.cs (Expression.Resolve): Do not flag error 654
3825         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3826         we allow conversions from MethodGroups to delegate types now.
3827
3828         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3829         assignments in v2 either.
3830
3831 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3832
3833         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3834         static read-only fields in ctors.
3835
3836         Applied patch from Benjamin Jemlich 
3837
3838         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3839
3840 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3841
3842         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3843         here to return true, as they can be used like this:
3844
3845                 (XXX) int.MEMBER ()
3846
3847         Fixed 49836 and all the other dups
3848
3849 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3850
3851         * driver.cs: Implement /win32res and /win32icon.
3852
3853 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
3854
3855         * cs-parser.jay: Add a rule to improve error handling for the
3856         common mistake of placing modifiers after the type.
3857
3858 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
3859
3860         * cs-parser.jay (interface_event_declaration): Catch
3861         initialization of events on interfaces, and report cs0068
3862
3863         * cs-parser.jay (interface_event_declaration): Catch
3864         initialization of events. 
3865
3866         * ecore.cs: Better report missing constructors.
3867
3868         * expression.cs (Binary.ResolveOperator): My previous bug fix had
3869         the error reporting done in the wrong place.  Fix.
3870
3871         * expression.cs (Binary.ResolveOperator): Catch the 
3872         operator + (E x, E y) error earlier, and later allow for implicit
3873         conversions in operator +/- (E e, U x) from U to the underlying
3874         type of E.
3875
3876         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
3877         52596, if the container class is abstract, the default constructor
3878         is protected otherwise its public (before, we were always public).
3879
3880         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
3881         fixed statement.
3882
3883         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
3884         Jemlich that fixes bug #52597, MCS was generating invalid code for
3885         idisposable structs.   Thanks to Ben for following up with this
3886         bug as well.
3887
3888 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
3889
3890         * driver.cs: Allow assemblies without code to be generated, fixes
3891         52230.
3892
3893 2004-01-07  Nick Drochak <ndrochak@gol.com>
3894
3895         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
3896
3897 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
3898
3899         * cs-parser.jay: Add rules to improve error reporting if fields or
3900         methods are declared at the namespace level (error 116)
3901
3902         * Add rules to catch event add/remove
3903
3904 2004-01-04  David Sheldon <dave-mono@earth.li>
3905
3906   * expression.cs: Added matching ")" to error message for 
3907   CS0077
3908
3909 2004-01-03 Todd Berman <tberman@gentoo.org>
3910
3911         * ecore.cs, attribute.cs:
3912         Applying fix from #52429.
3913
3914 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3915
3916         * ecore.cs, expression.cs, statement.cs:
3917         Total rewrite of how we handle branching. We
3918         now handle complex boolean expressions with fewer
3919         jumps. As well if (x == 0) no longer emits a ceq.
3920
3921         if (x is Foo) is much faster now, because we generate
3922         better code.
3923
3924         Overall, we get a pretty big improvement on our benchmark
3925         tests. The code we generate is smaller and more readable.
3926
3927         I did a full two-stage bootstrap. The patch was reviewed
3928         by Martin and Miguel.
3929
3930 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3931
3932         * cs-parser.jay: Make primary_expression not take a QI.
3933         we dont need this because the member_access rule covers
3934         us here. So we replace the rule with just IDENTIFIER.
3935
3936         This has two good effects. First, we remove a s/r conflict.
3937         Second, we allocate many fewer QualifiedIdentifier objects.
3938
3939 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3940
3941         * attribute.cs: Handle MarshalAs attributes as pseudo, and
3942         set the correct information via SRE. This prevents
3943         hanging on the MS runtime. Fixes #29374.
3944
3945 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3946
3947         * convert.cs: correctly handle conversions to value types
3948         from Enum and ValueType as unboxing conversions.
3949
3950         Fixes bug #52569. Patch by Benjamin Jemlich.
3951
3952 2004-01-02  Ravi Pratap  <ravi@ximian.com>
3953
3954         * expression.cs (BetterConversion): Prefer int -> uint
3955         over int -> ulong (csc's behaviour). This fixed bug #52046.
3956
3957 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3958
3959         * decl.cs (MemberCache.FindMembers): now returns a
3960         MemberInfo [].
3961
3962         * typemanager.cs: In general, go with with ^^.
3963         (CopyNewMethods): take an IList.
3964         (RealMemberLookup): Only allocate an arraylist
3965         if we copy from two sets of methods.
3966
3967         This change basically does two things:
3968         1) Fewer array lists allocated due to CopyNewMethods.
3969         2) the explicit cast in MemberList costed ALOT.
3970
3971 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
3972
3973         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
3974         a hashtable to avoid needless string allocations when an identifier is
3975         used more than once (the common case).
3976
3977 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3978
3979         * pending.cs: MS's TypeBuilder.GetInterfaces ()
3980         is broken, it will not return anything. So, we
3981         have to use the information we have in mcs to
3982         do the task.
3983
3984         * typemanager.cs: Add a cache for GetInterfaces,
3985         since this will now be used more often (due to ^^)
3986
3987         (GetExplicitInterfaces) New method that gets the
3988         declared, not effective, interfaces on a type
3989         builder (eg, if you have interface IFoo, interface
3990         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
3991         { IBar }.
3992
3993         This patch makes MCS able to bootstrap itself on
3994         Windows again.
3995
3996 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3997
3998         * expression.cs: Remove the Nop's that Miguel put
3999         in by mistake.
4000
4001 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4002
4003         * report.cs, codegen.cs: Give the real stack trace to
4004         the error when an exception is thrown.
4005
4006 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4007
4008         * decl.cs: only allocate hashtables for ifaces if 
4009         it is an iface!
4010
4011 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4012
4013         * expression.cs: fix the error from cs0121-2.cs
4014         (a parent interface has two child interfaces that
4015         have a function with the same name and 0 params
4016         and the function is called through the parent).
4017
4018 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4019
4020         * class.cs, rootcontext.cs, typmanager.cs: do not
4021         leak pointers.
4022
4023 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4024
4025         * codegen.cs: remove stack for the ec flow branching.
4026         It is already a linked list, so no need.
4027
4028 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4029
4030         * Makefile: Allow custom profiler here.
4031
4032 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4033
4034         * typemanager.cs (LookupType):
4035           - Use a static char [], because split takes
4036             a param array for args, so it was allocating
4037             every time.
4038           - Do not store true in a hashtable, it boxes.
4039
4040 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4041
4042         * flowanalysis.cs: bytify common enums.
4043
4044 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4045
4046         * modifiers.cs: Add a new set of flags for the
4047         flags allowed on explicit interface impls.
4048         * cs-parser.jay: catch the use of modifiers in
4049         interfaces correctly.
4050         * class.cs: catch private void IFoo.Blah ().
4051
4052         All related to bug #50572.
4053
4054 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4055
4056         * decl.cs: Rewrite the consistant accessability checking.
4057         Accessability is not linear, it must be implemented in
4058         a tableish way. Fixes #49704.
4059
4060 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4061
4062         * expression.cs: Handle negation in a checked context.
4063         We must use subtraction from zero. Fixes #38674.
4064
4065 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4066
4067         * class.cs: Ignore static void main in DLLs.
4068         * rootcontext.cs: Handle the target type here,
4069         since we are have to access it from class.cs
4070         * driver.cs: account for the above.
4071
4072 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4073
4074         * report.cs: Give line numbers and files if available.
4075
4076 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4077
4078         * driver.cs: Implement /addmodule.
4079
4080         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4081         ModuleBuilders.
4082
4083 2003-12-20  Martin Baulig  <martin@ximian.com>
4084
4085         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4086         (FieldBase.IsAssigned): Removed this field.
4087         (FieldBase.SetAssigned): New public method.
4088         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4089
4090 2003-12-20  Martin Baulig  <martin@ximian.com>
4091
4092         * expression.cs (LocalVariableReference.DoResolve): Don't set
4093         `vi.Used' if we're called from DoResolveLValue().
4094
4095         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4096         returns the usage vector it just merged into the current one -
4097         pass this one to UsageWarning().
4098         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4099         of the `EmitContext', don't call this recursively on our children.
4100
4101 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4102
4103         * driver.cs: Implement /target:module.
4104
4105 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4106
4107         * support.cs (CharArrayHashtable): New helper class.
4108
4109         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4110         char arrays, not strings, so we can avoid creating a string in
4111         consume_identifier if the identifier is a keyword.
4112
4113 2003-12-16  Martin Baulig  <martin@ximian.com>
4114
4115         * statement.cs (LocalInfo.Assigned): Removed this property.
4116         (LocalInfo.Flags): Removed `Assigned'.
4117         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4118         and uses flow analysis.
4119         (Block.UsageWarning): Made this method private.
4120         (Block.Resolve): Call UsageWarning() if appropriate.
4121
4122         * expression.cs (LocalVariableReference.DoResolve): Always set
4123         LocalInfo.Used here.
4124
4125 2003-12-13  Martin Baulig  <martin@ximian.com>
4126
4127         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4128         any value here; we're now using flow analysis to figure out
4129         whether a statement/block returns a value.
4130
4131 2003-12-13  Martin Baulig  <martin@ximian.com>
4132
4133         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4134         working again.
4135         (FlowBranching.MergeFinally): Don't call
4136         `branching.CheckOutParameters()' here, this is called in
4137         MergeTopBlock().
4138         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4139         when adding the `finally' vector.       
4140
4141 2003-12-13  Martin Baulig  <martin@ximian.com>
4142
4143         * flowanalysis.cs
4144         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4145         actually work and also fix #48962.
4146
4147 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4148
4149         * decl.cs: Do not check System.Object for nested types,
4150         since we know it does not have any. Big bang for buck:
4151
4152         BEFORE:
4153            Run 1:   8.35 seconds
4154            Run 2:   8.32 seconds
4155            corlib:  17.99 seconds
4156         AFTER:
4157            Run 1:   8.17 seconds
4158            Run 2:   8.17 seconds
4159            corlib:  17.39 seconds
4160
4161 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4162
4163         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4164         time we are returning 0 members, so we save alot here.
4165
4166 2003-12-11  Martin Baulig  <martin@ximian.com>
4167
4168         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4169         `MergeChild()', also just take the `FlowBranching' as argument;
4170         call Merge() on it and return the result.
4171         (FlowBranching.Merge): We don't need to do anything if we just
4172         have one sibling.
4173
4174 2003-12-11  Martin Baulig  <martin@ximian.com>
4175
4176         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4177         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4178         Maurer for this idea.
4179
4180 2003-12-11  Martin Baulig  <martin@ximian.com>
4181
4182         * flowanalysis.cs (MergeResult): This class is now gone; we now
4183         use the `UsageVector' for this.  The reason for this is that if a
4184         branching just has one sibling, we don't need to "merge" them at
4185         all - that's the next step to do.
4186         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4187         `MergeResult'.
4188
4189 2003-12-11  Martin Baulig  <martin@ximian.com>
4190
4191         Reworked flow analyis and made it more precise and bug-free.  The
4192         most important change is that we're now using a special `Reachability'
4193         class instead of having "magic" meanings of `FlowReturns'.  I'll
4194         do some more cleanups and optimizations and also add some more
4195         documentation this week.
4196
4197         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4198         largely reworked this class.
4199         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4200         the new `Reachability' class instead of having "magic" values here.
4201         (FlowBranching): We're now using an instance of `Reachability'
4202         instead of having separate `Returns', `Breaks' etc. fields.
4203
4204         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4205         based on flow analysis; ignore the return value of block.Emit ().
4206
4207 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4208
4209         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4210         if they are private.
4211
4212 2003-12-09  Martin Baulig  <martin@ximian.com>
4213
4214         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4215         call them directly on the UsageVector.
4216
4217 2003-12-09  Martin Baulig  <martin@ximian.com>
4218
4219         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4220         Changed return type from `FlowReturns' to `Reachability'.
4221
4222 2003-12-09  Martin Baulig  <martin@ximian.com>
4223
4224         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4225         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4226         `Reachable' fields with a single `Reachability' one.
4227
4228 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4229
4230         * class.cs (FindMembers): Remove foreach's.
4231
4232         Bootstrap times:
4233
4234         BEFORE
4235                 Run 1:   8.74 seconds
4236                 Run 2:   8.71 seconds
4237
4238         AFTER
4239                 Run 1:   8.64 seconds
4240                 Run 2:   8.58 seconds
4241
4242
4243 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4244
4245         * cs-parser.jay:
4246         * gen-treedump.cs:
4247         * statement.cs:
4248         This patch does a few things:
4249                 1. EmptyStatement is now a singleton, so it is never reallocated.
4250                 2. All blah is EmptyStatement constructs have been changed to
4251                    blah == EmptyStatement.Value, which is much faster and valid
4252                    now that EmptyStatement is a singleton.
4253                 3. When resolving a block, rather than allocating a new array for
4254                    the non-empty statements, empty statements are replaced with
4255                    EmptyStatement.Value
4256                 4. Some recursive functions have been made non-recursive.
4257         Mainly the performance impact is from (3), however (1) and (2) are needed for
4258         this to work. (4) does not make a big difference in normal situations, however
4259         it makes the profile look saner.
4260
4261         Bootstrap times:
4262
4263         BEFORE
4264         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4265         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4266         Total memory allocated: 56397 KB
4267
4268         AFTER
4269         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4270         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4271         Total memory allocated: 55666 KB
4272
4273 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4274
4275         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4276         than the hashtable in a hashtable version
4277
4278         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4279         we always end up concating a string. This results in a huge perf
4280         loss, because many strings have to be tracked by the GC. In this
4281         patch, we first use a hashtable that works with two keys, so that
4282         the strings do not need to be concat'ed.
4283
4284         Bootstrap times:
4285         BEFORE
4286                 Run 1:   8.74 seconds
4287                 Run 2:   8.71 seconds
4288
4289         AFTER
4290                 Run 1:   8.65 seconds
4291                 Run 2:   8.56 seconds
4292
4293 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4294
4295         * Makefile: Add a new target `do-time' that does a quick and simple
4296         profile, leaving easy to parse output.
4297
4298 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4299
4300         * codegen.cs (Init): Create the dynamic assembly with 
4301         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4302
4303 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4304
4305         * support.cs: Make the PtrHashtable use only one
4306         instance of its comparer.
4307
4308 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4309
4310         * typemanager.cs: Fix lookup of GetNamespaces.
4311
4312 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4313
4314         * expression.cs: Removed redundant line.
4315
4316         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4317         ArrayLists, use for loops with bounds.  
4318
4319         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4320         arraylist.
4321
4322         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4323         arraylists, use for loop with bounds.
4324
4325         The above three changes give us a 0.071 second performance
4326         improvement out of 3.294 seconds down to 3.223.  On my machine
4327         the above changes reduced the memory usage by 1,387 KB during
4328         compiler bootstrap.
4329
4330         * cs-parser.jay (QualifiedIdentifier): New class used to represent
4331         QualifiedIdentifiers.  Before we created a new string through
4332         concatenation, and mostly later on, the result would be
4333         manipulated by DecomposeQI through string manipulation.
4334
4335         This reduced the compiler memory usage for bootstrapping from
4336         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
4337         compile times in 0.05 seconds.
4338
4339 2003-11-28  Dick Porter  <dick@ximian.com>
4340
4341         * support.cs: Do string compares with the Invariant culture.
4342
4343         * rootcontext.cs: 
4344         * gen-treedump.cs: 
4345         * expression.cs: 
4346         * driver.cs: 
4347         * decl.cs: 
4348         * codegen.cs: 
4349         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4350         the comparison is done with the Invariant culture.
4351
4352 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4353
4354         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4355         GetEnumerator method.
4356
4357         (ProbeCollectionType): Iterate starting at the most specific type
4358         upwards looking for a GetEnumerator
4359
4360         * expression.cs: Shift count can be up to 31 for int/uint and 63
4361         for long/ulong.
4362
4363 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4364
4365         * statement.cs (Block.LookupLabel): Also look for the label on the
4366         children blocks.  Use a hash table to keep track of visited
4367         nodes. 
4368
4369         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4370         we actually did transform the other operand, otherwise fall back
4371         to the common codepath that casts to long.
4372
4373         * cs-tokenizer.cs: Use the same code pattern as the int case.
4374         Maybe I should do the parsing myself, and avoid depending on the
4375         Parse routines to get this done.
4376
4377 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4378
4379         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4380         which fixes bug 51347.  This time test it.
4381
4382         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4383         attributes for example can not tell the difference between these.
4384         The difference was only a syntax feature of the language. 
4385
4386         * attribute.cs: Apply attributes to delegates.
4387
4388         * delegate.cs: Call the apply attributes method.
4389
4390 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4391
4392         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4393         comparing 0 vs Byte.MinValue, not the value
4394
4395         (ImplicitConversionRequired): When reporting a conversion error,
4396         use error 31 to print out the constant error instead of the
4397         simpler 29.
4398
4399         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4400         which fixes bug 51347.
4401
4402 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4403
4404         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4405         which fixes the -warnaserror command line option.
4406
4407 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4408
4409         * cfold.cs (DoNumericPromotions): During constant folding of
4410         additions on UIntConstant, special case intconstants with
4411         IntConstants like we do on the expression binary operator. 
4412
4413 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4414
4415         * convert.cs (ImplicitReferenceConversion): We were missing a case
4416         (System.Enum are not value types or class types, so we need to
4417         classify them separatedly).
4418
4419         * driver.cs: We do not support error 2007.
4420
4421 2003-11-12 Jackson Harper <jackson@ximian.com>
4422
4423         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4424         system directory. Also use the full file name so users can
4425         libraries names mscorlib-o-tron.dll in a non system dir.
4426
4427 2003-11-10  Martin Baulig  <martin@ximian.com>
4428
4429         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4430         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4431         calling `ResolveType()' on them, directly assign their `Type'.
4432
4433 2003-11-08  Martin Baulig  <martin@ximian.com>
4434
4435         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4436         return value and the `out parent' parameter.
4437         (TypeContainer.DefineType): Moved the CS0644 check into
4438         GetClassBases().  Don't pass the interface types to the
4439         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4440         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4441
4442         * ecore.cs (TypeExpr.IsAttribute): New property.
4443         (TypeExpr.GetInterfaces): New method.
4444
4445         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4446         TypeExpr instead of a Type.
4447         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4448         (Interface.DefineType): Don't pass the interface types to the
4449         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4450         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4451
4452         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4453         instead of a `Type[]'.
4454         (TypeManager.RegisterBuilder): Likewise.
4455         (TypeManager.AddUserInterface): Likewise.
4456         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4457         `Type[]' and also return a `TypeExpr[]'.
4458         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4459
4460 2003-11-08  Martin Baulig  <martin@ximian.com>
4461
4462         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4463         Expression.     
4464
4465 2003-11-08  Martin Baulig  <martin@ximian.com>
4466
4467         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4468         TypeManager.ResolveExpressionTypes().
4469
4470         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4471         instead of an Expression.
4472         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4473         (TypeExpression): New public class; formerly known as `TypeExpr'.
4474
4475         * expression.cs (ComposedCast): Derive from TypeExpr.
4476
4477         * typemanager.cs (TypeManager.system_*_expr): These are now
4478         TypExpr's instead of Expression's.
4479         (TypeManager.ResolveExpressionTypes): New public static function;
4480         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4481         of them.        
4482
4483 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4484
4485         * expression.cs (New.DoResolve): Do not dereference value that
4486         might be a null return.
4487
4488         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4489         sure that the constant value has the right type.  Fixes an
4490         unreported bug, similar to 50425.
4491
4492         * const.cs (Const.LookupConstantValue): Call
4493         ImplicitStandardConversionExists before doing a conversion to
4494         avoid havng the TypeManager.ChangeType do conversions.
4495
4496         Reduced the number of casts used
4497
4498         (Const.ChangeType): New routine to enable reuse of the constant
4499         type changing code from statement.
4500
4501         * typemanager.cs (ChangeType): Move common initialization to
4502         static global variables.
4503
4504         Fixes #50425.
4505
4506         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4507         every value type to go through, even if it was void.  Fix that. 
4508
4509         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4510         character of the define, and the is_identifier_part_character for
4511         the rest of the string.
4512
4513 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4514
4515         * expression.cs (UnaryMutator.EmitCode): When I updated
4516         LocalVariableReference.DoResolve, I overdid it, and dropped an
4517         optimization done on local variable references.
4518
4519 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4520
4521         * ecore.cs: Convert the return from Ldlen into an int.
4522
4523 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4524
4525         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4526         the accessibility, this is a special case for toplevel non-public
4527         classes (internal for instance).
4528
4529 2003-10-20  Nick Drochak <ndrochak@gol.com>
4530
4531         * ecore.cs: Fix typo and build.  Needed another right paren.
4532
4533 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4534
4535         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4536         `internal' case regular and protected, but not allowing protected
4537         to be evaluated later.  Bug 49840
4538
4539 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4540
4541         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4542         to kb.Nlast, and not the kb.nFirst to isolate the switch
4543         statement.
4544
4545         Extract the underlying type, so enumerations of long/ulong are
4546         treated like long/ulong.
4547
4548 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4549
4550         * expression.cs (New): Overload the meaning of RequestedType to
4551         track the possible creation of the NewDelegate type, since
4552         DoResolve is invoked more than once for new constructors on field
4553         initialization.
4554
4555         See bugs: #48800 and #37014
4556
4557         * cs-parser.jay (declare_local_constants): Take an arraylist
4558         instead of a single constant.
4559
4560         (local_constant_declaration): It should take a
4561         constant_declarators, not a constant_declarator.  Fixes 49487
4562
4563         * convert.cs: Fix error report.
4564
4565 2003-10-13 Jackson Harper <jackson@ximian.com>
4566
4567         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4568         bug #49611
4569
4570 2003-10-09  Martin Baulig  <martin@ximian.com>
4571
4572         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4573         to the .ctor.
4574         (MethodCore.DoDefineParameters): Removed the TypeContainer
4575         argument; use the DeclSpace which was passed to the .ctor instead.
4576         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4577         TypeContainer; we only need a DeclSpace here.
4578
4579 2003-10-09  Martin Baulig  <martin@ximian.com>
4580
4581         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4582         to the .ctor.
4583         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4584         EmitContext's .ctor.    
4585
4586 2003-10-09  Martin Baulig  <martin@ximian.com>
4587
4588         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4589         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4590         AsAccessible(), moved them as well.
4591
4592         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4593
4594 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
4595
4596         * cs-parser.jay : Renamed yyName to yyNames related to jay.
4597
4598 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4599
4600         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4601         generation for >=, as spotted by Paolo, bug 48679.  
4602         Patch from David Waite.
4603
4604         * cs-tokenizer.cs: Add handling for #pragma.
4605
4606         * cs-parser.jay: Allow for both yield and yield return in the
4607         syntax.  The anti-cobolization of C# fight will go on!
4608
4609         * class.cs (TypeBuilder.DefineType): Catch error condition here
4610         (Parent.DefineType erroring out and returning null).
4611
4612         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4613         coping with enumerations variables, we were mistakenly processing
4614         them as a regular value type instead of built-in types.  Fixes the
4615         bug #48063
4616
4617         * typemanager.cs (IsBuiltinOrEnum): New method.
4618
4619 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
4620
4621         * cs-parser.jay: Upgrade: yield now needs the return clause.
4622
4623 2003-09-19  Martin Baulig  <martin@ximian.com>
4624
4625         * decl.cs (MemberCache.SetupCacheForInterface): Take a
4626         `MemberCache parent' argument.  Normally, an interface doesn't
4627         have a parent type except System.Object, but we use this in gmcs
4628         for generic type parameters.
4629
4630 2003-09-18  Martin Baulig  <martin@ximian.com>
4631
4632         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
4633         on `type.IsInterface'; don't check whether the type has a parent
4634         to determine whether it's an interface.
4635
4636 2003-09-15  Martin Baulig  <martin@ximian.com>
4637
4638         * class.cs (TypeContainer.DefineType): Added an error flag to
4639         avoid reporting duplicate CS0146's ("class definition is
4640         circular.").
4641
4642         * driver.cs (Driver.MainDriver): Abort if
4643         RootContext.ResolveTree() reported any errors.
4644
4645 2003-09-07  Martin Baulig  <martin@ximian.com>
4646
4647         * report.cs (Error, Warning): Added overloaded versions which take
4648         a `params object[] args' and call String.Format().
4649
4650 2003-09-07  Martin Baulig  <martin@ximian.com>
4651
4652         * decl.cs (DeclSpace..ctor): Don't call
4653         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
4654         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
4655         (DeclSpace.RecordDecl): New method.
4656
4657         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
4658
4659 2003-09-02  Ravi Pratap  <ravi@ximian.com>
4660
4661         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
4662         value attributes to be applied to ParameterBuilders.
4663
4664         * class.cs (MethodCore.LabelParameters): Make static and more
4665         generic so that it can be used from other places - like interface
4666         methods, for instance.
4667
4668         * interface.cs (Interface.Emit): Call LabelParameters before
4669         emitting attributes on the InterfaceMethod.
4670
4671 2003-08-26  Martin Baulig  <martin@ximian.com>
4672
4673         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
4674         resolving aliases; fixes #47927.
4675
4676 2003-08-26  Martin Baulig  <martin@ximian.com>
4677
4678         * statement.cs (Using.DoResolve): This is internally emitting a
4679         try/finally clause, so we need to set ec.NeedExplicitReturn if we
4680         do not always return.  Fixes #47681.
4681
4682 2003-08-26  Martin Baulig  <martin@ximian.com>
4683
4684         * decl.cs (MemberCore): Moved WarningNotHiding(),
4685         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
4686         into MemberBase.
4687         (AdditionResult): Make this nested in DeclSpace.
4688         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
4689         argument; call NamespaceEntry.Define() unless we're nested in a
4690         class or struct.
4691
4692         * namespace.cs (Namespace.DefineName): New public function.  This
4693         is called from DeclSpace's .ctor to add 
4694         (Namespace.Lookup): Include DeclSpaces in the lookup.
4695
4696         * class.cs (Operator): Derive from MemberBase, not MemberCore.
4697
4698         * const.cs (Const): Derive from MemberBase, not MemberCore.     
4699
4700 2003-08-25  Martin Baulig  <martin@ximian.com>
4701
4702         * convert.cs (Convert.ExplicitReferenceConversion): When
4703         converting from an interface type to a class, unbox if the target
4704         type is a struct type.  Fixes #47822.
4705
4706 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4707
4708         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
4709         #47854.
4710
4711 2003-08-22  Martin Baulig  <martin@ximian.com>
4712
4713         * class.cs (TypeManager.DefineType): When defining a nested type,
4714         call DefineType() on our parent; fixes #47801.
4715
4716 2003-08-22  Martin Baulig  <martin@ximian.com>
4717
4718         * class.cs (MethodData.Define): While checking if a method is an
4719         interface implementation, improve the test a bit more to fix #47654.
4720
4721 2003-08-22  Martin Baulig  <martin@ximian.com>
4722
4723         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
4724         correctly; fixes #47722.
4725
4726 2003-08-22  Martin Baulig  <martin@ximian.com>
4727
4728         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
4729         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
4730
4731         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
4732
4733 2003-08-22  Martin Baulig  <martin@ximian.com>
4734
4735         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
4736         can only be assigned in static constructors.  Fixes #47161.
4737
4738 2003-08-22  Martin Baulig  <martin@ximian.com>
4739
4740         Rewrote and improved the flow analysis code.
4741
4742         * flowbranching.cs (FlowBranching): Make this class abstract.
4743         (FlowBranching.CreateBranching): New static function to create a
4744         new flow branching.
4745         (FlowBranchingBlock, FlowBranchingException): New classes.
4746         (FlowBranching.UsageVector.Type): New public readonly field.
4747         (FlowBranching.UsageVector.Breaks): Removed the setter.
4748         (FlowBranching.UsageVector.Returns): Removed the setter.
4749         (FlowBranching.UsageVector): Added Break(), Return(),
4750         NeverReachable() and Throw() methods to modify the reachability.
4751         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
4752         done by FlowBranching.Merge().
4753         (FlowBranching.UsageVector.MergeChild): New method; merges the
4754         merge result into the current vector.
4755         (FlowBranching.Merge): New abstract method to merge a branching.
4756
4757 2003-08-12  Martin Baulig  <martin@ximian.com>
4758
4759         * expression.cs (Indirection.CacheTemporaries): Create the
4760         LocalTemporary with the pointer type, not its element type.
4761
4762 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
4763
4764         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
4765         token was a keyword or not.
4766
4767         Add `error' options where an IDENTIFIER was expected;  Provide
4768         CheckToken and CheckIdentifierToken convenience error reporting
4769         functions. 
4770
4771         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
4772
4773         * decl.cs: Rename `NamespaceEntry Namespace' public field into
4774         NameSpaceEntry NameSpaceEntry.
4775
4776         (LookupInterfaceOrClass): Avoid creating a full qualified name
4777         from namespace and name: avoid doing lookups when we know the
4778         namespace is non-existant.   Use new Tree.LookupByNamespace which
4779         looks up DeclSpaces based on their namespace, name pair.
4780
4781         * driver.cs: Provide a new `parser verbose' to display the
4782         exception thrown during parsing.  This is turned off by default
4783         now, so the output of a failure from mcs is more graceful.
4784
4785         * namespace.cs: Track all the namespaces defined in a hashtable
4786         for quick lookup.
4787
4788         (IsNamespace): New method
4789
4790 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
4791
4792         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
4793         we know that we need to concatenate (full typename can never be
4794         null). 
4795
4796         * class.cs: ditto.
4797
4798         * statement.cs: Use a bitfield;  Do not initialize to null things
4799         which are done by the constructor by default.
4800
4801         * cs-parser.jay: bug fix, parameter was 4, not 3.
4802
4803         * expression.cs: Just use the property;
4804
4805         * statement.cs: No need for GetVariableInfo method.
4806
4807 2003-08-08  Martin Baulig  <martin@ximian.com>
4808
4809         * flowanalysis.cs (FlowReturns): This is now nested in the
4810         `FlowBranching' class.
4811         (MyBitVector): Moved this here from statement.cs.
4812         (FlowBranching.SiblingType): New enum type.
4813         (FlowBranching.CreateSibling): Added `SiblingType' argument.
4814
4815 2003-08-07  Martin Baulig  <martin@ximian.com>
4816
4817         * flowanalysis.cs (FlowBranchingType): This is now nested in the
4818         `FlowBranching' class and called `BranchingType'.
4819
4820 2003-08-07  Martin Baulig  <martin@ximian.com>
4821
4822         * flowanalysis.cs: Moved all the control flow analysis code into
4823         its own file.
4824
4825 2003-08-07  Martin Baulig  <martin@ximian.com>
4826
4827         * assign.cs (Assign.DoResolve): `target' must either be an
4828         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
4829         #37319.
4830
4831 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
4832
4833         * expression.cs (BinaryMethod): This kind of expression is created by the
4834         Binary class if it determines that the operator has to be handled
4835         by a method.
4836
4837         (BinaryDelegate): This kind of expression is created if we are
4838         dealing with a + or - operator on delegates.
4839
4840         (Binary): remove method, argumetns, and DelegateOperator: when
4841         dealing with methods, 
4842
4843         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
4844
4845         * statement.cs (Block): use bitfields for the three extra booleans
4846         we had in use.   Remove unused topblock parameter.
4847
4848         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
4849
4850         * assign.cs: Drop extra unneeded tests.
4851
4852 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
4853
4854         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
4855
4856         * statement.cs (Foreach): Use VariableStorage instead of
4857         LocalBuilders.   
4858
4859         * codegen.cs (VariableStorage): New class used by clients that
4860         require a variable stored: locals or fields for variables that
4861         need to live across yield.
4862
4863         Maybe provide a convenience api for EmitThis+EmitLoad?
4864
4865         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
4866         these bad boys.
4867
4868 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
4869
4870         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
4871         RemapParameterLValue): New methods that are used to turn a
4872         precomputed FieldInfo into an expression like this:
4873
4874                 instance.FieldInfo
4875
4876         The idea is to use this instead of making LocalVariableReference
4877         have more than one meaning.
4878
4879         * cs-parser.jay: Add error production to BASE.
4880
4881         * ecore.cs: Deal with TypeManager.GetField returning null, which
4882         is now a valid return value.
4883
4884         (FieldExprNoAddress): New expression for Fields whose address can
4885         not be taken.
4886
4887         * expression.cs (LocalVariableReference): During the resolve
4888         phases, create new expressions if we are in a remapping context.
4889         Remove code that dealt with remapping here.
4890
4891         (ParameterReference): same.
4892
4893         (ProxyInstance): New expression, like the `This' expression, but
4894         it is born fully resolved.  We know what we are doing, so remove
4895         the errors that are targeted to user-provided uses of `this'.
4896
4897         * statement.cs (Foreach): our variable is now stored as an
4898         Expression;  During resolution, follow the protocol, dont just
4899         assume it will return this.
4900
4901 2003-08-06  Martin Baulig  <martin@ximian.com>
4902
4903         * support.cs (SeekableStreamReader.cs): New public class.
4904
4905         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
4906         SeekableStreamReader instead of the normal StreamReader.
4907
4908 2003-08-04  Martin Baulig  <martin@ximian.com>
4909
4910         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
4911         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
4912         deambiguate casts and delegate invocations.
4913         (parenthesized_expression): Use the new tokens to ensure this is
4914         not a cast of method invocation.
4915
4916         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
4917         when reading a `)' and Deambiguate_CloseParens () was previously
4918         called.
4919
4920         * expression.cs (ParenthesizedExpression): New class.  This is
4921         just used for the CS0075 test.
4922         (Binary.DoResolve): Check for CS0075.   
4923
4924 2003-07-29  Ravi Pratap  <ravi@ximian.com>
4925
4926         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
4927         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
4928         reference comparison.
4929
4930         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
4931         examine the ReturnType for equality - this is necessary in the
4932         cases of implicit and explicit operators whose signature also
4933         includes the return type.
4934
4935 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
4936
4937         * namespace.cs: Cache the result of the namespace computation,
4938         instead of computing it every time.
4939
4940 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
4941
4942         * decl.cs: Use a global arraylist that we reuse over invocations
4943         to avoid excesive memory consumption.  Reduces memory usage on an
4944         mcs compile by one meg (45 average).
4945
4946         * typemanager.cs (LookupTypeReflection): In .NET pointers are
4947         private, work around that.
4948
4949 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
4950
4951         * literal.cs (IntLiteral): Define Zero and One static literals. 
4952
4953         * cs-parser.jay (integer_literal): use static literals to reduce
4954         memory usage for the most used literals (0, 1 and -1).  211kb
4955         reduced in memory usage.
4956
4957         Replace all calls to `new ArrayList' with `new
4958         ArrayList(4)' which is a good average number for most allocations,
4959         and also requires only 16 bytes of memory for its buffer by
4960         default. 
4961
4962         This reduced MCS memory usage in seven megabytes for the RSS after
4963         bootstrapping.
4964
4965 2003-07-28  Ravi Pratap  <ravi@ximian.com>
4966
4967         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
4968         handle params methods the correct way by forming only one
4969         applicable set with params and normal methods in them. Earlier we
4970         were looking at params methods only if we found no normal methods
4971         which was not the correct thing to do.
4972
4973         (Invocation.BetterFunction): Take separate arguments indicating
4974         when candidate and the best method are params methods in their
4975         expanded form.
4976
4977         This fixes bugs #43367 and #46199.
4978
4979         * attribute.cs: Documentation updates.
4980
4981         (CheckAttribute): Rename to CheckAttributeTarget.
4982         (GetValidPlaces): Rename to GetValidTargets.
4983
4984         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
4985         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
4986
4987         Fixes bug #44468.
4988
4989 2003-07-28  Martin Baulig  <martin@ximian.com>
4990
4991         * class.cs (TypeContainer.DefineMembers): Use the base type's full
4992         name when looking up the base class of a nested class.  Fixes #46977.
4993
4994 2003-07-26  Martin Baulig  <martin@ximian.com>
4995
4996         * expression.cs (Indexers.Indexer): New nested struct; contains
4997         getter, setter and the indexer's type.
4998         (Indexers.Properties): This is now an ArrayList of
4999         Indexers.Indexer's.
5000         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5001         indexer doesn't have any getters.
5002
5003         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5004         for embedded property and indexer assignments.
5005
5006 2003-07-26  Martin Baulig  <martin@ximian.com>
5007
5008         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5009         preprocessor directive is not the first non-whitespace character
5010         on a line.
5011
5012 2003-07-26  Martin Baulig  <martin@ximian.com>
5013
5014         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5015         namespace parsing, follow the spec more closely.
5016
5017         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5018         NamespaceEntry.Lookup().
5019
5020 2003-07-25  Martin Baulig  <martin@ximian.com>
5021
5022         * MethodCore.cs (OverridesSomething): New public field; it's set
5023         from TypeContainer.DefineMembers if this method overrides
5024         something (which doesn't need to be a method).  Fix #39462.
5025
5026 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5027
5028         * typemanager.cs (GetMembers): Ensure that the list of members is
5029         reversed. This keeps things in sync.
5030
5031         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5032         find an AttributeUsage attribute.
5033
5034         * expression.cs (Invocation.OverloadResolve): Perform the check
5035         which disallows Invoke to be directly called on a Delegate.
5036
5037         (Error_InvokeOnDelegate): Report error cs1533.
5038
5039 2003-07-25  Martin Baulig  <martin@ximian.com>
5040
5041         * expression.cs (Indexers.GetIndexersForType): Only look in the
5042         interface hierarchy if the requested type is already an
5043         interface.  Fixes #46788 while keeping #46502 fixed.
5044
5045 2003-07-25  Martin Baulig  <martin@ximian.com>
5046
5047         * class.cs (TypeContainer.DefineMembers): Check whether all
5048         readonly fields have been assigned and report warning CS0649 if
5049         not.
5050
5051         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5052         a valuetype.
5053
5054 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5055
5056         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5057         returned from GetMethods to make things consistent with the
5058         assumptions MCS makes about ordering of methods.
5059
5060         This should comprehensively fix bug #45127 and it does :-)
5061
5062         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5063         ordering is actually reverse.
5064
5065         * Clean up some debug messages I left lying around.
5066
5067         * interface.cs (Populate*): Get rid of code which emits attributes
5068         since the stage in which we emit attributes is the 'Emit' stage,
5069         not the define stage.
5070
5071         (Emit): Move attribute emission for interface members here.
5072
5073 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5074
5075         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5076         closely: we eliminate methods in base types when we have an
5077         applicable method in a top-level type.
5078
5079         Please see section 14.5.5.1 for an exact description of what goes
5080         on. 
5081
5082         This fixes bug #45127 and a host of other related to corlib compilation.
5083
5084         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5085         array is the method corresponding to the top-level type (this is
5086         because of the changes made to icall.c) so we change this
5087         accordingly.
5088
5089         (MethodGroupExpr.Name): This too.
5090
5091         * typemanager.cs (GetElementType): New method which does the right
5092         thing when compiling corlib. 
5093
5094         * everywhere: Make use of the above in the relevant places.
5095
5096 2003-07-22  Martin Baulig  <martin@ximian.com>
5097
5098         * cs-parser.jay (invocation_expression): Moved
5099         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5100         `cast_expression', but create a InvocationOrCast which later
5101         resolves to either an Invocation or a Cast.
5102
5103         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5104         method; call this before EmitStatement() to make sure that this
5105         expression can be used as a statement.
5106
5107         * expression.cs (InvocationOrCast): New class; resolves to either
5108         an Invocation or a Cast.
5109
5110         * statement.cs (StatementExpression): Call ResolveStatement() on
5111         the ExpressionStatement before emitting it.
5112
5113 2003-07-21  Martin Baulig  <martin@ximian.com>
5114
5115         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5116         `ref' and `out' attributes match; fixes #46220.
5117         (MemberAccess.ResolveMemberAccess): You can't reference a type
5118         through an expression; fixes #33180.
5119         (Indexers.GetIndexersForType): Don't return the indexers from
5120         interfaces the class implements; fixes #46502.
5121
5122 2003-07-21  Martin Baulig  <martin@ximian.com>
5123
5124         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5125         CS0661 checks; fixes bug #30442.
5126
5127 2003-07-21  Martin Baulig  <martin@ximian.com>
5128
5129         * decl.cs (AdditionResult): Added `Error'.
5130
5131         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5132
5133         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5134         makes cs0031.cs actually work.
5135
5136 2003-07-20  Martin Baulig  <martin@ximian.com>
5137
5138         * namespace.cs: Fixed that bug which caused a crash when compiling
5139         the debugger's GUI.
5140
5141 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5142
5143         * typemanager.cs (LookupTypeReflection): Never expose types which
5144         are NotPublic, NestedPrivate, NestedAssembly, or
5145         NestedFamANDAssem.  We used to return these, and later do a check
5146         that would report a meaningful error, but the problem is that we
5147         would not get the real match, if there was a name override.
5148
5149 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5150
5151         * namespace.cs (Namespace, Name): Do not compute the namespace
5152         name dynamically, compute it in the constructor.  This reduced
5153         memory usage by 1697 KB.
5154
5155         * driver.cs: Use --pause to pause at the end.
5156
5157 2003-07-17  Peter Williams  <peter@newton.cx>
5158
5159         * Makefile: Change the name of the test target so that it doesn't
5160         conflict with the recursive test target.
5161
5162 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5163
5164         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5165         AddressOf): Do not use EmitThis, that was wrong, use the actual
5166         this pointer.
5167
5168 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5169
5170         * class.cs (MethodData.Define): While checking if a method is an
5171         interface implementation, improve the test: If we are not public
5172         (use new test here: use the computed MethodAttributes directly,
5173         instead of the parsed modifier flags) check if the `implementing'
5174         method comes from an interface or not.
5175
5176         * pending.cs (VerifyPendingMethods): Slightly better error
5177         message.
5178
5179         * makefile: add test target that does the mcs bootstrap.
5180
5181 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5182
5183         * interface.cs (Define): Do nothing here since there are no
5184         members to populate etc. Move the attribute emission out of here
5185         since this was just totally the wrong place to put it. Attribute
5186         application happens during the 'Emit' phase, not in the 'Define'
5187         phase.
5188
5189         (Emit): Add this method and move the attribute emission here
5190
5191         * rootcontext.cs (EmitCode): Call the Emit method on interface
5192         types too.
5193
5194 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5195
5196         * expression.cs (OverloadResolve): Report error only if Location
5197         is not 'Null' which means that there was a probe going on.
5198
5199 2003-07-14  Martin Baulig  <martin@ximian.com>
5200
5201         * expression.cs (ConditionalLogicalOperator): New public class to
5202         implement user defined conditional logical operators.
5203         This is section 14.11.2 in the spec and bug #40505.
5204
5205 2003-07-14  Martin Baulig  <martin@ximian.com>
5206
5207         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5208
5209 2003-07-14  Martin Baulig  <martin@ximian.com>
5210
5211         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5212
5213         * ecore.cs (IVariable.VerifyFixed): New interface method.
5214
5215         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5216         operator, check whether the variable is actually fixed.  Fixes bug
5217         #36055.  Set a variable definitely assigned when taking its
5218         address as required by the spec.
5219
5220         * statement.cs (LocalInfo.IsFixed): New field.
5221         (LocalInfo.MakePinned): Set `IsFixed' to true.
5222
5223 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5224
5225         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5226         for .ctors, ensure that we only ask for members declared in the
5227         attribute type (BindingFlags.DeclaredOnly).
5228
5229         Fixes bug #43632.
5230
5231         * expression.cs (Error_WrongNumArguments): Report error 1501
5232         correctly the way CSC does.
5233
5234 2003-07-13  Martin Baulig  <martin@ximian.com>
5235
5236         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5237         lookup on the fully qualified name, to make things like "X.X" work
5238         where "X.X" is a fully qualified type name, but we also have a
5239         namespace "X" in the using list.  Fixes #41975.
5240
5241 2003-07-13  Martin Baulig  <martin@ximian.com>
5242
5243         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5244         function. If we're a CompoundAssign, we need to create an embedded
5245         CompoundAssign, not an embedded Assign.
5246         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5247         Fixes #45854.
5248
5249 2003-07-13  Martin Baulig  <martin@ximian.com>
5250
5251         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5252         work to fix bug #46088.
5253
5254 2003-07-13  Ravi Pratap <ravi@ximian.com>
5255
5256         * class.cs (Operator.Emit): Do not emit attributes here - it is
5257         taken care of by the Method class that we delegate too. This takes
5258         care of bug #45876.
5259
5260 2003-07-10  Martin Baulig  <martin@ximian.com>
5261
5262         * expression.cs (TypeOfVoid): New class.
5263         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5264
5265 2003-07-10  Martin Baulig  <martin@ximian.com>
5266
5267         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5268         bug #35957.
5269
5270 2003-07-10  Martin Baulig  <martin@ximian.com>
5271
5272         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5273         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5274
5275         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5276
5277         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5278
5279 2003-07-10  Martin Baulig  <martin@ximian.com>
5280
5281         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5282         of decimal.  Fixes #42850.
5283
5284         NOTE: I also fixed the created byte blob, but this doesn't work on
5285         the MS runtime and csc never produces any byte blobs for decimal
5286         arrays.
5287
5288 2003-07-10  Martin Baulig  <martin@ximian.com>
5289
5290         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5291         structs; fixes #32068.
5292         (Block.AddChildVariableNames): Fixed #44302.
5293
5294 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5295
5296         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5297
5298 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5299
5300         * attribute.cs: And this test is onger needed.
5301
5302 2003-07-08  Martin Baulig  <martin@ximian.com>
5303
5304         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5305         inaccessible types.  Fixes #36313.
5306
5307         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5308
5309         * namespace.cs (NamespaceEntry): Create implicit entries for all
5310         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5311         implicit entries for N1.N2 and N1.
5312
5313 2003-07-08  Martin Baulig  <martin@ximian.com>
5314
5315         Rewrote the handling of namespaces to fix a lot of the issues
5316         wrt. `using' aliases etc.
5317
5318         * namespace.cs (Namespace): Splitted this class into a
5319         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5320
5321         * typemanager.cs (TypeManager.IsNamespace): Removed.
5322         (TypeManager.ComputeNamespaces): Only compute namespaces from
5323         loaded assemblies here, not the namespaces from the assembly we're
5324         currently compiling.
5325
5326 2003-07-08  Martin Baulig  <martin@ximian.com>
5327
5328         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
5329
5330 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5331
5332         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
5333         already fixed it.  
5334
5335         I thought about the memory savings here, but LookupTypeReflection
5336         is used under already very constrained scenarios.  Compiling
5337         corlib or mcs only exposes one hit, so it would not really reduce
5338         any memory consumption.
5339
5340 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5341
5342         * typemanager.cs: fixes bug #45889 by only adding public types from
5343         other assemblies to the list of known types.
5344
5345 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5346
5347         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
5348         on the type we resolved.
5349
5350 2003-07-05  Martin Baulig  <martin@ximian.com>
5351
5352         * pending.cs (PendingImplementation.ParentImplements): Don't
5353         create the proxy if the parent is abstract.
5354
5355         * class.cs (TypeContainer.DefineIndexers): Process explicit
5356         interface implementations first.  Fixes #37714.
5357
5358 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5359
5360         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5361         defined recursively;  but since we modify the input parameters
5362         (left is set to `this' temporarily), we reset this value if the
5363         left_is_explicit is false, which gives the original semantics to
5364         the code.  
5365
5366         * literal.cs (NullPointer): new class used to represent a null
5367         literal in a pointer context.
5368
5369         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5370         type is a pointer, use a NullPointer object instead of a
5371         NullLiteral.   Closes 43687
5372
5373         (ExplicitConversion): Convert pointer values using
5374         the conv opcode to the proper type.
5375
5376         * ecore.cs (New): change ValueTypeVariable property into a method,
5377         that returns whether the valuetype is suitable for being used.
5378
5379         * expression.cs (Binary.DoNumericPromotions): Only return if we
5380         the int constant was a valid uint, and we can return both left and
5381         right as uints.  If not, we continue processing, to trigger the
5382         type conversion.  This fixes 39018.
5383
5384         * statement.cs (Block.EmitMeta): During constant resolution, set
5385         the CurrentBlock property on the emitcontext, so that we resolve
5386         constants propertly.
5387
5388 2003-07-02  Martin Baulig  <martin@ximian.com>
5389
5390         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5391         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5392
5393         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5394         than emitting it here.
5395
5396         * statement.cs: Fixed some more flow analysis bugs.
5397
5398 2003-07-02  Martin Baulig  <martin@ximian.com>
5399
5400         * class.cs (MethodData.Define): When implementing interface
5401         methods, set Final unless we're Virtual.
5402
5403         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5404         check work for interface methods.
5405
5406 2003-07-01  Martin Baulig  <martin@ximian.com>
5407
5408         * ecore.cs (EmitContext.This): Replaced this property with a
5409         GetThis() method which takes a Location argument.  This ensures
5410         that we get the correct error location for a CS0188.
5411
5412 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5413
5414         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5415         ImplicitStandardConversion.
5416
5417         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5418
5419 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5420
5421         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5422         optimization.
5423
5424 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5425
5426         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5427         constructors.
5428
5429         (MethodData.Define): Turn off initlocals for unsafe methods.
5430
5431 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5432
5433         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5434         complete;  Fixes #37521.
5435
5436         * delegate.cs: Use Modifiers.TypeAttr to compute the
5437         TypeAttributes, instead of rolling our own.  This makes the flags
5438         correct for the delegates.
5439
5440 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5441
5442         * class.cs (Constructor.Define): Set the private flag for static
5443         constructors as well.
5444
5445         * cs-parser.jay (statement_expression): Set the return value to
5446         null, to avoid a crash when we catch an error.
5447
5448 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5449
5450         * cs-parser.jay: Applied patch from Jackson that adds support for
5451         extern and unsafe modifiers to destructor declarations.
5452
5453         * expression.cs: Report error 21 if the user is trying to index a
5454         System.Array.
5455
5456         * driver.cs: Add an error message, suggested by the bug report.
5457
5458         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5459         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5460
5461 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5462
5463         * namespace.cs: Add some information to reduce FAQs.
5464
5465 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5466
5467         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5468         underlying enumeration types.  Fixes #43915.
5469
5470         * expression.cs: Treat ushort/short as legal values to be used in
5471         bitwise operations.
5472
5473 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5474
5475         * delegate.cs: transfer custom attributes for paramenters from
5476         the delegate declaration to Invoke and BeginInvoke.
5477
5478 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5479
5480         * attribute.cs: handle custom marshalers and emit marshal info
5481         for fields, too.
5482
5483 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5484
5485         * makefile.gnu: Added anonymous.cs to the compiler sources.
5486
5487 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
5488
5489         * iterators.cs: Change the name of the proxy class to include two
5490         underscores.
5491
5492         * cs-parser.jay: Update grammar to include anonymous methods.
5493
5494         * anonymous.cs: new file.
5495
5496 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
5497
5498         * class.cs (Field.Define): Add missing test for pointers and
5499         safety. 
5500
5501 2003-05-27  Ravi Pratap  <ravi@ximian.com>
5502
5503         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
5504         we use the stobj opcode.
5505
5506         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
5507         since it wasn't the correct fix. 
5508
5509         It still is puzzling that we are required to use stobj for IntPtr
5510         which seems to be a ValueType.
5511
5512 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
5513
5514         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
5515         during regular simple name resolution.   Now, the trick is that
5516         instead of returning for processing the simplename, we do a
5517         TypeManager.LookupType (ie, a rooted lookup as opposed to a
5518         contextual lookup type).   If a match is found, return that, if
5519         not, return for further composition.
5520
5521         This fixes long-standing 30485.
5522
5523         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5524         using the address to initialize an object, do an Stobj instead of
5525         using the regular Stelem.
5526
5527         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
5528         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
5529         Because if we are a BaseIndexerAccess that value will be true.
5530         Fixes 43643.
5531
5532         * statement.cs (GotoCase.Resolve): Return after reporting an
5533         error, do not attempt to continue. 
5534
5535         * expression.cs (PointerArithmetic.Emit): If our operand is a
5536         long, convert our constants to match the operand before
5537         multiplying.  Convert to I type before adding.   Fixes 43670.
5538
5539 2003-05-14  Ravi Pratap  <ravi@ximian.com>
5540
5541         * enum.cs (ImplicitConversionExists) : Rename to
5542         ImplicitEnumConversionExists to remove ambiguity. 
5543
5544         * ecore.cs (NullCast): New type of cast expression class which
5545         basically is very similar to EmptyCast with the difference being
5546         it still is a constant since it is used only to cast a null to
5547         something else
5548         (eg. (string) null)
5549
5550         * convert.cs (ImplicitReferenceConversion): When casting a null
5551         literal, we return a NullCast.
5552
5553         * literal.cs (NullLiteralTyped): Remove - I don't see why this
5554         should be around anymore.
5555
5556         The renaming (reported was slightly wrong). Corrections:
5557
5558         ConvertImplicitStandard -> ImplicitConversionStandard
5559         ConvertExplicitStandard -> ExplicitConversionStandard
5560
5561         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
5562         before passing them in !
5563
5564         * convert.cs (ImplicitConversionStandard): When comparing for
5565         equal expr and target types, ensure that expr is not a
5566         NullLiteral.
5567
5568         In general, we must not be checking (expr_type ==
5569         target_type) in the top level conversion methods
5570         (ImplicitConversion, ExplicitConversion etc). This checking is
5571         done in the methods that they delegate to.
5572
5573 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
5574
5575         * convert.cs: Move Error_CannotConvertType,
5576         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
5577         ImplicitNumericConversion, ImplicitConversionExists,
5578         ImplicitUserConversionExists, StandardConversionExists,
5579         FindMostEncompassedType, FindMostSpecificSource,
5580         FindMostSpecificTarget, ImplicitUserConversion,
5581         ExplicitUserConversion, GetConversionOperators,
5582         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
5583         TryImplicitIntConversion, Error_CannotConvertImplicit,
5584         ConvertImplicitRequired, ConvertNumericExplicit,
5585         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
5586         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
5587         its own file.
5588
5589         Perform the following renames:
5590
5591         StandardConversionExists -> ImplicitStandardConversionExists
5592         ConvertImplicit -> ImplicitConversion
5593         ConvertImplicitStandard -> ImplicitStandardConversion
5594         TryImplicitIntConversion -> ImplicitIntConversion
5595         ConvertImplicitRequired -> ImplicitConversionRequired
5596         ConvertNumericExplicit -> ExplicitNumericConversion
5597         ConvertReferenceExplicit -> ExplicitReferenceConversion
5598         ConvertExplicit -> ExplicitConversion
5599         ConvertExplicitStandard -> ExplicitStandardConversion
5600
5601 2003-05-19  Martin Baulig  <martin@ximian.com>
5602
5603         * statement.cs (TypeInfo.StructInfo): Made this type protected.
5604         (TypeInfo): Added support for structs having structs as fields.
5605
5606         * ecore.cs (FieldExpr): Implement IVariable.
5607         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
5608         VariableInfo for the field.
5609
5610 2003-05-18  Martin Baulig  <martin@ximian.com>
5611
5612         * expression.cs (This.DoResolve): Report a CS0027 if we're
5613         emitting a field initializer.
5614
5615 2003-05-18  Martin Baulig  <martin@ximian.com>
5616
5617         * expression.cs (This.ResolveBase): New public function.
5618         (This.DoResolve): Check for CS0188.
5619
5620         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
5621         This.Resolve().
5622
5623         * ecore.cs (MethodGroupExpr.DoResolve): Set the
5624         `instance_expression' to null if we don't have any non-static
5625         methods.
5626
5627 2003-05-18  Martin Baulig  <martin@ximian.com>
5628
5629         Reworked the way how local variables and parameters are handled by
5630         the flow analysis code.
5631
5632         * statement.cs (TypeInfo, VariableMap): New public classes.
5633         (VariableInfo): New public class.  This is now responsible for
5634         checking whether a variable has been assigned.  It is used for
5635         parameters and local variables.
5636         (Block.EmitMeta): Take the InternalParameters as argument; compute
5637         the layout of the flow vectors here.
5638         (Block.LocalMap, Block.ParameterMap): New public properties.
5639         (FlowBranching): The .ctor doesn't get the InternalParameters
5640         anymore since Block.EmitMeta() now computes the layout of the flow
5641         vector.
5642         (MyStructInfo): This class is now known as `StructInfo' and nested
5643         in `TypeInfo'; we don't access this directly anymore.
5644
5645         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
5646         property and removed IsAssigned(), IsFieldAssigned(),
5647         SetAssigned() and SetFieldAssigned(); we now call them on the
5648         VariableInfo so we don't need to duplicate this code everywhere.
5649
5650         * expression.cs (ParameterReference): Added `Block block' argument
5651         to the .ctor.
5652         (LocalVariableReference, ParameterReference, This): The new
5653         VariableInfo class is now responsible for all the definite
5654         assignment stuff.
5655
5656         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
5657         IsParameterAssigned, SetParameterAssigned): Removed.
5658
5659 2003-05-18  Martin Baulig  <martin@ximian.com>
5660
5661         * typemanager.cs (InitCoreTypes): Try calling
5662         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
5663         the 3-args-version.  Corlib now also needs our `void_type'.
5664         (GetMethod): Added overloaded version which takes an optional
5665         `bool report_errors' to allow lookups of optional methods.
5666
5667 2003-05-12  Martin Baulig  <martin@ximian.com>
5668
5669         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
5670         only used for locals and not for parameters.
5671
5672 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
5673
5674         * support.cs (InternalParameters.ParameterType): Return the
5675         ExternalType of the parameter.
5676
5677         * parameter.cs (Parameter.ExternalType): drop the two arguments,
5678         they were unused.
5679
5680 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
5681
5682         * class.cs (MethodData.Define): Do not set the `newslot' on
5683         interface members, if they are also flagged as "override".
5684
5685         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
5686         better code for ++i and i++.  This only works for static fields
5687         and local variables.
5688
5689         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
5690         want to pull the DeclSpace out of the builder_to_declspace instead
5691         of the TypeBuilder (like in TypeContainer.FindMembers).
5692
5693         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
5694         instead of LookupTypeContainer.  Fixes the crash on .NET for
5695         looking up interface members.
5696
5697         * const.cs: Create our own emit context during the Definition
5698         stage, so that constants are evaluated in the proper context, when
5699         a recursive definition happens.
5700
5701 2003-05-11  Martin Baulig  <martin@ximian.com>
5702
5703         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
5704         new block for a switch section.
5705         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
5706         the adding/lookup in the switch block.  Fixes #39828.
5707
5708 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
5709
5710         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
5711         functionality: I needed to convert the data after I had performed
5712         the add/sub operation into the operands type size.
5713
5714         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
5715         pass the type for the box operation, otherwise the resulting
5716         object would have been of type object.
5717
5718         (BoxedCast): Add constructor to specify the type to box as.
5719
5720 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
5721
5722         * iterators.cs: I was reusing the `count' variable inadvertently,
5723         take steps to not allow this to happen.
5724
5725 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
5726
5727         * attribute.cs (Attribute.Resolve): Params attributes are encoded
5728         by creating an array at the point where the params starts and
5729         putting all those arguments there, then adjusting the size of the
5730         array.
5731
5732 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
5733
5734         * expression.cs (New.AddressOf): Implement interface
5735         IMemoryLocation.  This is used when the `new' operator is used in
5736         the context of an invocation to a method on a value type.
5737
5738         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
5739         example. 
5740
5741         * namespace.cs: Also check the using aliases here.
5742
5743         * driver.cs: Move the test for using validity after the types have
5744         been entered, so we do a single pass that also includes the using
5745         aliases. 
5746
5747         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
5748         in the regular case.   CreateSiblingForFinally is doing extra
5749         error checking.
5750
5751         * attribute.cs (GetAttributeArgumentExpression): Store the result
5752         on an out value, and use the return value to indicate failure
5753         instead of using null (which is a valid return for Constant.GetValue).
5754
5755         * statement.cs: Perform the analysis flow for the increment
5756         portion after the statement, because this will be the real flow of
5757         execution.  Fixes #42385
5758
5759         * codegen.cs (EmitContext.EmitArgument,
5760         EmitContext.EmitStoreArgument): New helper functions when the
5761         RemapToProxy flag is set.
5762
5763         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
5764         function.
5765
5766         Add support for remapping parameters. 
5767
5768         * iterators.cs: Propagate parameter values;  Store parameter
5769         values in the proxy classes.
5770
5771 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
5772
5773         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
5774         need a proxy reference;  I do not know what I was thinking
5775
5776         * cs-parser.jay (constructor_initializer): catch another error,
5777         and display nice message.
5778
5779         (field_declaration): catch void field declaration
5780         to flag a better error. 
5781
5782         * class.cs (MemberBase.CheckBase): Report an error instead of a
5783         warning if a new protected member is declared in a struct. 
5784         (Field.Define): catch the error of readonly/volatile.
5785
5786         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
5787
5788         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
5789         volatile variable is taken
5790
5791 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
5792
5793         * statement.cs (Fixed.Resolve): Report an error if we are not in
5794         an unsafe context.
5795
5796 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
5797
5798         * typemanager.cs: reuse the code that handles type clashes for
5799         delegates and enumerations.
5800
5801         * class.cs (Report28): Always report.
5802
5803         * expression.cs (EncodeAsAttribute): Allow nulls here.
5804
5805 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
5806
5807         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
5808         the functionality for testing whether an expression is valid for
5809         an attribute here.  Also handle the case of arrays of elements
5810         being stored. 
5811
5812         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
5813         encoding a linear array into an array of objects that are suitable
5814         to be passed to an CustomAttributeBuilder.
5815
5816         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
5817
5818         * ecore.cs: (FieldExpr): Handle field remapping here.
5819
5820         * iteratators.cs: Pass the instance variable (if the method is an
5821         instance method) to the constructors, so we can access the field
5822         variables on the class.
5823
5824         TODO: Test this with structs.  I think the THIS variable on
5825         structs might have to be a pointer, and not a refenrece
5826
5827 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
5828
5829         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
5830         local variables to fields in a proxy class.
5831
5832         * iterators.cs (PopulateProxy): Rename our internal fields to
5833         <XXX>.  
5834         Create a <THIS> field if we are an instance method, so we can
5835         reference our parent container variables.
5836         (MapVariable): Called back from the EmitContext code to enter a
5837         new variable to field mapping into the proxy class (we just create
5838         a FieldBuilder).
5839
5840         * expression.cs
5841         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
5842         for using the remapped locals to fields.
5843
5844         I placed the code here, because that gives the same semantics to
5845         local variables, and only changes the Emit code.
5846
5847         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
5848         statements inside iterators.
5849         (VariableInfo): Add a FieldBuilder for the cases when we are
5850         remapping local variables to fields in a proxy class
5851
5852         * ecore.cs (SimpleNameResolve): Avoid testing two times for
5853         current_block != null.
5854
5855         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
5856         not cope with strings, as it has been moved to the
5857         TableSwitchEmit.  Fixed bug in switch generation.
5858
5859         * expression.cs (New.DoResolve): Provide more context for the user
5860         when reporting an error.
5861
5862         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
5863         pointers. 
5864
5865         * expression.cs (MemberAccess.DoResolve): When we get a type back,
5866         check the permissions for it.  Note than in a type-resolution
5867         context the check was already present in DeclSpace.ResolveType,
5868         but was missing from the MemberAccess.
5869
5870         (ArrayCreation.CheckIndices): warn if the user has
5871         more nested levels of expressions, but there are no more
5872         dimensions specified.  Avoids crash on bug 41906.
5873
5874 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
5875
5876         * statement.cs (Block): replace Implicit bool, for a generic
5877         flags.   
5878         New flag: `Unchecked'.  This is used during the EmitMeta phase
5879         (which is out-of-line with the regular Resolve/Emit process for a
5880         statement, as this is done ahead of time, but still gets a chance
5881         to call constant resolve).
5882
5883         (Block.Flags): new enum for adding a new flag.
5884
5885         (Block.EmitMeta): track the state of unchecked.
5886
5887         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
5888         to enable constant resolution to work there as well.
5889
5890 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
5891
5892         * typemanager.cs (ienumerable_type): Also look up
5893         System.Collections.IEnumerable. 
5894
5895 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
5896
5897         TODO: Test more than one conditional per method.
5898
5899         * class.cs (Indexer.Define): Report the location where the user is
5900         referencing the unsupported feature.
5901
5902         (MethodData): Overload the use of `conditionals' to
5903         minimize the creation of needless ArrayLists.   This saves roughly
5904         212kb on my machine.
5905
5906         (Method): Implement the new IIteratorContainer interface.
5907         (Method.SetYields): Implement the method by setting the ModFlags
5908         to contain METHOD_YIELDS.
5909
5910         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
5911         which just got set to null.
5912
5913         * iterators.cs: New file.
5914
5915         (Yield, YieldBreak): New statements.
5916
5917         * statement.cs (Return.Resolve): Flag an error if we are used in
5918         an iterator method.
5919
5920         * codegen.cs (InIterator): New flag set if the code is being
5921         compiled in an iterator method.
5922
5923         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
5924         internal modifier, and we just use it to avoid adding extra
5925         fields, as this is seldom used.  
5926
5927         * cs-parser.jay: Add yield_statement (yield and yield break).
5928
5929         * driver.cs: New flag -v2 to turn on version 2 features. 
5930
5931         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
5932         hashtable when v2 is enabled.
5933
5934 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
5935
5936         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
5937         there is already a namespace defined with this name.
5938
5939         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
5940         people upgraded their corlibs.
5941
5942         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
5943         always use fully qualified types, no need to use the compiler
5944         front end.
5945
5946         (TypeManager.IsNamespace): Use binarysearch.
5947
5948         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
5949         AddDelegate): I did not quite use the new IsValid API properly: I
5950         have to pass the short-name and the fullname.  I was passing only
5951         the basename instead of the fullname sometimes. 
5952
5953         (TypeContainer.DefineType): call NamespaceClash.
5954
5955         * interface.cs (Interface.DefineType): use NamespaceClash before
5956         defining the type.
5957
5958         * delegate.cs (Delegate.DefineType): use NamespaceClash before
5959         defining the type.
5960
5961         * enum.cs: (Enum.DefineType): use NamespaceClash before
5962         defining the type.
5963
5964         * typemanager.cs (: 3-line patch that gives us some tasty 11%
5965         speed increase.  First, use the negative_hits cache when we get a
5966         negative.  Second, add the type with its full original name
5967         instead of the new . and + encoded name (reflection uses + to
5968         separate type from a nested type).  Use LookupTypeReflection
5969         directly which bypasses the type->name hashtable (that we already
5970         know does not contain the type.
5971
5972         * decl.cs (DeclSpace.ResolveTypeExpr): track the
5973         location/container type. 
5974
5975         * driver.cs: When passing utf8, use directly the UTF8Encoding.
5976
5977 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
5978
5979         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
5980
5981         * delegate.cs (NewDelegate.Resolve): Test whether an instance
5982         method is being referenced in the method group from a static
5983         context, and report error 120 if so.
5984
5985         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
5986         Error118. 
5987
5988         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
5989         is created, we create the A namespace).
5990
5991         * cs-parser.jay: A namespace also introduces a DeclarationFound.
5992         Fixes #41591
5993
5994 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
5995
5996         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
5997         invocation to ModuleBuilder.GetType with the same values will
5998         return a new type instance, so we need to cache its return
5999         values. 
6000
6001         * expression.cs (Binary.ResolveOperator): Only allow the compare
6002         operators on enums if they are of the same type.
6003
6004         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6005         types of ValueType on their own case.  Before we were giving them
6006         the same treatment as objects.
6007
6008         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6009         fullname.  Short name is used to compare against container name.
6010         Fullname is used to check against defined namespace names.
6011
6012         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6013         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6014
6015         (Method.CheckBase): Call parent.
6016         (MemberBase.CheckBase): Check for protected members on sealed
6017         classes.
6018         (PropertyBase.CheckBase): Call parent.
6019         (Field.Define): Call parent.
6020
6021         * report.cs: Negative error codes are now mapped to 8000 - code,
6022         so that the display is render more nicely.
6023
6024         * typemanager.cs: Do not use try/catch, instead report a regular
6025         error. 
6026
6027         (GetPointerType, GetReferenceType): These methods provide
6028         mechanisms to obtain the T* and T& from a T.  We had the code
6029         previously scattered around the code base, and it also used
6030         TypeManager.LookupType that would go through plenty of caches.
6031         This one goes directly to the type source.
6032
6033         In some places we did the Type.GetType followed by
6034         ModuleBuilder.GetType, but not in others, so this unifies the
6035         processing as well.
6036
6037         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6038         statements now that we have namespace information.
6039
6040         * typemanager.cs (IsNamespace): New method, returns whether the
6041         string presented is a namespace or not.
6042
6043         (ComputeNamespaces): New public entry point, computes the list of
6044         available namespaces, using the GetNamespaces API call in Mono, or
6045         the slower version in MS.NET.   
6046
6047         Now before we start the semantic analysis phase, we have a
6048         complete list of namespaces including everything that the user has
6049         provided.
6050
6051         Deleted old code to cache namespaces in .nsc files.
6052
6053 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6054
6055         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6056         class/struct location definition Location for the implicit
6057         constructor location.
6058
6059         (Operator.Define): Use the location of the operator for the
6060         implicit Method definition.
6061
6062         (Constructor.Emit): use the constructor location for the implicit
6063         base initializer constructor.
6064
6065         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6066         and the Expression class now contains two new methods:
6067
6068         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6069         isolate type lookup from the rest of the resolution process.
6070
6071         Since we use Expressions to hold type definitions due to the way
6072         we parse the input we have historically overloaded Resolve to
6073         perform the Type lookups if a special flag is passed.  Now this is
6074         eliminated and two methods take their place. 
6075
6076         The differences in the two methods between xStep and xTerminal is
6077         that xStep is involved in our current lookup system that uses
6078         SimpleNames to compose a name, while xTerminal is used just to
6079         catch the case where the simplename lookup failed.
6080
6081 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6082
6083         * expression.cs (ResolveMemberAccess): Remove redundant code.
6084         TypeExpr expressions are always born fully resolved.
6085
6086         * interface.cs (PopulateMethod): Do not lookup the types twice.
6087         We were doing it once during SemanticAnalysis and once during
6088         PopulateMethod.
6089
6090         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6091         in local variable type definitions, were being returned as a
6092         SimpleName (we decomposed everything into a string), that is
6093         because primary_expression was being used instead of a type in the
6094         grammar (reduce/reduce conflicts).
6095
6096         The part that was wrong is that we converted the expression into a
6097         string (an oversimplification in one hand, compounded with primary
6098         expressions doing string concatenation).
6099
6100         So things like:
6101
6102         A.B.C [] x;
6103
6104         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6105         using clauses from working on this particular context.  And a type
6106         was being matched directly against "A.B.C[]".
6107
6108         We now use the correct approach, and allow for ComposedCast to be
6109         part of the unary expression.  So the "A.B.C []" become a composed
6110         cast of "A.B.C" (as a nested group of MemberAccess with a
6111         SimpleName at the end) plus the rank composition "[]". 
6112
6113         Also fixes 35567
6114
6115 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6116
6117         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6118         for the access level checking.
6119
6120         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6121         `TypeContainer container', because I kept getting confused when I
6122         was debugging this code.
6123
6124         * expression.cs (Indexers): Instead of tracking getters/setters,
6125         we now track them in parallel.  We create one arraylist less, but
6126         most importantly it is possible now for the LValue code to find a
6127         matching get for a set.
6128
6129         (IndexerAccess.DoResolveLValue): Update the code.
6130         GetIndexersForType has been modified already to extract all the
6131         indexers from a type.  The code assumed it did not.
6132
6133         Also make the code set the correct return type for the indexer.
6134         This was fixed a long time ago for properties, but was missing for
6135         indexers.  It used to be void_type.
6136
6137         (Binary.Emit): Test first for doubles instead of
6138         floats, as they are more common.
6139
6140         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6141         when dealing with floats and the <=, >= operators.  This fixes bug
6142         #39314 
6143
6144         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6145         to load the array value by emitting a load on the foreach variable
6146         type.  This was incorrect.  
6147
6148         We now emit the code to load an element using the the array
6149         variable type, and then we emit the conversion operator.
6150
6151         Fixed #40176
6152
6153 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6154
6155         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6156
6157 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6158
6159         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6160         test for protection before we test for signatures. 
6161
6162         (MethodSignature.ToString): implement.
6163
6164         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6165         to the case where we reduced into a LongConstant.
6166
6167         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6168         depend on whether the information is acurrate, because the
6169         Microsoft runtime will always claim that the array type is public,
6170         regardless of the real state.
6171
6172         If the type is a pointer, another problem happens: the type is
6173         reported as non-public in Microsoft.  
6174
6175         In both cases we have to call CheckAccessLevel recursively with
6176         the underlying type as the argument to be tested.
6177
6178 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6179
6180         * assign.cs (Assign.Emit): If we are dealing with a compound
6181         assignment expression, we should use the code path that stores the
6182         intermediate result in a temporary value.  This fixes #40903.
6183
6184         *expression.cs (Indirection.ToString): Provide ToString method for
6185         debugging. 
6186
6187 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6188
6189         * class.cs: Null out fields holding references to Block objects so
6190         they can be garbage collected.
6191
6192         * expression.cs (OverloadResolve): Remove unused local.
6193
6194 2003-04-07  Martin Baulig  <martin@ximian.com>
6195
6196         * codegen.cs (EmitContext.CurrentFile): New public field.
6197         (EmitContext.Mark): Use the CurrentFile to check whether the
6198         location is in the correct file.
6199         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6200
6201 2003-04-07  Martin Baulig  <martin@ximian.com>
6202
6203         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6204
6205         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6206         location.  [FIXME: The location argument which gets passed to this
6207         method is sometimes wrong!]
6208
6209 2003-04-07  Nick Drochak <ndrochak@gol.com>
6210
6211         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6212
6213 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6214
6215         * expression.cs (Indirection.EmitAssign): We were using the
6216         temporary, but returning immediately instead of continuing the
6217         EmitAssing flow.
6218
6219 2003-04-06  Martin Baulig  <martin@ximian.com>
6220
6221         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6222         if it's a nested child, but also deriving from the outer class.
6223         See test 190.cs.
6224
6225         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6226         nested child, but also deriving from the outer class.  See
6227         test-190.cs.
6228         (FilterWithClosure): We may access private members of the outer
6229         class if we're a nested child and deriving from the outer class.
6230         (RealMemberLookup): Only set `closure_private_ok' if the
6231         `original_bf' contained BindingFlags.NonPublic.
6232
6233 2003-04-05  Martin Baulig  <martin@ximian.com>
6234
6235         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
6236
6237 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6238
6239         * class.cs (Event.Define): Do not allow abstract events to have
6240         initializers. 
6241
6242 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6243
6244         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6245         block in event declarations.
6246
6247         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6248         value type, get its address.
6249
6250         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6251         leaving a class on the stack instead of a boolean value (int
6252         0/1).  Change the code so we compare against null, and then the
6253         result against zero.
6254
6255         * class.cs (TypeContainer.GetClassBases): We were checking for the
6256         parent class being sealed too late.
6257
6258         * expression.cs (Binary.Emit): For <= and >= when dealing with
6259         floating point values, use cgt.un and clt.un instead of cgt and
6260         clt alone.
6261
6262 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6263
6264         * statement.cs: Apply the same optimization as MS: skip the 
6265         GetEnumerator returning an IEnumerator, and use the one returning a 
6266         CharEnumerator instead. This allows us to avoid the try-finally block 
6267         and the boxing.
6268
6269 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6270
6271         * cs-parser.jay: Attributes cannot be applied to
6272                          namespaces. Fixes #40473
6273
6274 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6275
6276         * class.cs:
6277         (Add*): check if the name is valid using the full name for constants,
6278         fields, properties and events.
6279
6280 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6281
6282         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6283         char constants to be part of the enumeration.
6284
6285         * expression.cs (Conditional.DoResolve): Add support for operator
6286         true. Implements the missing functionality from 14.12
6287
6288         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6289         operator true/false as required by the spec.
6290
6291         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6292         implicit conversion to boolean.
6293
6294         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6295         also one where the type implements `operator true'. 
6296
6297         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6298         get an expression that will invoke operator true based on an
6299         expression.  
6300
6301         (GetConversionOperators): Removed the hack that called op_True
6302         here.  
6303
6304         (Expression.ResolveBoolean): Move this from Statement.
6305
6306 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6307
6308         * ecore.cs (FieldExpr): do not allow initialization of initonly
6309         fields on derived classes
6310
6311 2003-03-13  Martin Baulig  <martin@ximian.com>
6312
6313         * statement.cs (Block.Emit): Call ig.BeginScope() and
6314         ig.EndScope() when compiling with debugging info; call
6315         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6316
6317 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6318
6319         * expression.cs (Indexers): Do not construct immediately, allow
6320         for new members to be appended as we go.  Fixes 38143
6321
6322 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6323
6324         * expression.cs: save/restore context when resolving an unchecked
6325         expression.
6326
6327 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6328
6329         * cfold.cs: Catch division by zero in modulus operator during
6330         constant folding.
6331
6332 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
6333
6334         * interface.cs (Interface.DefineMembers): Avoid defining members
6335         twice. 
6336
6337 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
6338
6339         * driver.cs: handle the +/- options for -noconfig
6340
6341         * statement.cs (Unckeched.Resolve): Also track the state of
6342         unchecked in the Resolve phase.
6343
6344 2003-02-27  Martin Baulig  <martin@ximian.com>
6345
6346         * ecore.cs (Expression.MemberLookup): Don't create a
6347         MethodGroupExpr for something which is not a method.  Fixes #38291.
6348
6349 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6350
6351         * class.cs (MemberBase.CheckParameters): Also check that the type
6352         is unmanaged if it is a pointer.
6353
6354         * expression.cs (SizeOf.Resolve): Add location information.
6355
6356         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6357         a managed type is declared.
6358
6359         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6360         parameter modifiers as well.  Fixes bug 38606
6361
6362         * class.cs: Very sad.  Am backing out the speed up changes
6363         introduced by the ArrayList -> Array in the TypeContainer, as they
6364         were not actually that much faster, and introduced a bug (no error
6365         reports on duplicated methods).
6366
6367         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6368         source first, this will guarantee that we have a valid expression
6369         before calling in lower levels functions that will require a
6370         resolved object.  Then use this original_source in the
6371         target.ResolveLValue instead of the original source that was
6372         passed to us.
6373
6374         Another change.  Use target.Resolve instead of LValueResolve.
6375         Although we are resolving for LValues, we will let the Assign code
6376         take care of that (it will be called again from Resolve).  This
6377         basically allows code like this:
6378
6379         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6380         class Y { void A (X x) { x [0] += o; }
6381
6382         The problem was that the indexer was trying to resolve for
6383         set_Item (idx, object o) and never finding one.  The real set_Item
6384         was set_Item (idx, X).  By delaying the process we get the right
6385         semantics. 
6386
6387         Fixes bug 36505
6388
6389 2003-02-23  Martin Baulig  <martin@ximian.com>
6390
6391         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6392         while calling DoEmit ().
6393
6394         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6395         source files; if you use the #line directive inside a method, the
6396         compiler stops emitting line numbers for the debugger until it
6397         reaches the end of the method or another #line directive which
6398         restores the original file.
6399
6400 2003-02-23  Martin Baulig  <martin@ximian.com>
6401
6402         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6403
6404 2003-02-23  Martin Baulig  <martin@ximian.com>
6405
6406         * statement.cs (Block.AddChildVariableNames): We need to call this
6407         recursively, not just for our immediate children.
6408
6409 2003-02-23  Martin Baulig  <martin@ximian.com>
6410
6411         * class.cs (Event.Define): Always make the field private, like csc does.
6412
6413         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6414         actually work, fixes bug #37521.
6415
6416 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6417
6418         * delegate.cs: When creating the various temporary "Parameters"
6419         classes, make sure that we call the ComputeAndDefineParameterTypes
6420         on those new parameters (just like we do with the formal ones), to
6421         allow them to be resolved in the context of the DeclSpace.
6422
6423         This fixes the bug that Dick observed in Bugzilla #38530.
6424
6425 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6426
6427         * expression.cs (ResolveMemberAccess): When resolving a constant,
6428         do not attempt to pull a constant if the value was not able to
6429         generate a valid constant.
6430
6431         * const.cs (LookupConstantValue): Do not report more errors than required.
6432
6433 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6434
6435         * expression.cs: fixes bug #38328.
6436
6437 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6438
6439         * class.cs: Changed all the various members that can be part of a
6440         class from being an ArrayList to be an Array of the right type.
6441         During the DefineType type_list, interface_list, delegate_list and
6442         enum_list are turned into types, interfaces, delegates and enums
6443         arrays.  
6444
6445         And during the member population, indexer_list, event_list,
6446         constant_list, field_list, instance_constructor_list, method_list,
6447         operator_list and property_list are turned into their real arrays.
6448
6449         Although we could probably perform this operation earlier, for
6450         good error reporting we need to keep the lists and remove the
6451         lists for longer than required.
6452
6453         This optimization was triggered by Paolo profiling the compiler
6454         speed on the output of `gen-sample-program.pl' perl script. 
6455
6456         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6457         not crash in methods like MemberLookupFailed that use this field.  
6458
6459         This problem arises when the compiler fails to resolve a type
6460         during interface type definition for example.
6461
6462 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6463
6464         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
6465         inherit from System.Object, so we have to stop at null, not only
6466         when reaching System.Object.
6467
6468 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
6469
6470         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
6471         DeclaredOnly because the parent indexer might have had a different
6472         name, but did not loop until the top of the hierarchy was reached.
6473
6474         The problem this one fixes is 35492: when a class implemented an
6475         indexer from an interface, we were getting the interface method
6476         (which was abstract) and we were flagging an error (can not invoke
6477         abstract method).
6478
6479         This also keeps bug 33089 functioning, and test-148 functioning.
6480
6481         * typemanager.cs (IsSpecialMethod): The correct way of figuring
6482         out if a method is special is to see if it is declared in a
6483         property or event, or whether it is one of the predefined operator
6484         names.   This should fix correctly #36804.
6485
6486 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
6487
6488         The goal here is to remove the dependency on EmptyCast.Peel ().
6489         Killing it completely.
6490
6491         The problem is that currently in a number of places where
6492         constants are expected, we have to "probe" for an EmptyCast, and
6493         Peel, which is not the correct thing to do, as this will be
6494         repetitive and will likely lead to errors. 
6495
6496         The idea is to remove any EmptyCasts that are used in casts that
6497         can be reduced to constants, so we only have to cope with
6498         constants. 
6499
6500         This bug hunt was triggered by Bug 37363 and the desire to remove
6501         the duplicate pattern where we were "peeling" emptycasts to check
6502         whether they were constants.  Now constants will always be
6503         constants.
6504
6505         * ecore.cs: Use an enumconstant here instead of wrapping with
6506         EmptyCast.  
6507
6508         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
6509         throwing me off.  By handling this we can get rid of a few hacks.
6510
6511         * statement.cs (Switch): Removed Peel() code.
6512
6513 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
6514
6515         * class.cs: Location information for error 508
6516
6517         * expression.cs (New.DoResolve): Add a guard against double
6518         resolution of an expression.  
6519
6520         The New DoResolve might be called twice when initializing field
6521         expressions (see EmitFieldInitializers, the call to
6522         GetInitializerExpression will perform a resolve on the expression,
6523         and later the assign will trigger another resolution
6524
6525         This leads to bugs (#37014)
6526
6527         * delegate.cs: The signature for EndInvoke should contain any ref
6528         or out parameters as well.  We were not doing this in the past. 
6529
6530         * class.cs (Field.Define): Do not overwrite the type definition
6531         inside the `volatile' group.  Turns out that volatile enumerations
6532         were changing the type here to perform a validity test, which
6533         broke conversions. 
6534
6535 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
6536
6537         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
6538         and structs, we do not want to load the instance variable
6539
6540         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
6541         enum_type has to be handled like an object reference (implicit
6542         conversions exists from this to object), but the regular IsClass
6543         and IsValueType tests will never return true for this one.
6544
6545         Also we use TypeManager.IsValueType instead of type.IsValueType,
6546         just for consistency with the rest of the code (this is only
6547         needed if we ever use the construct exposed by test-180.cs inside
6548         corlib, which we dont today).
6549
6550 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
6551
6552         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
6553         just InternalCall.
6554
6555 2003-02-09  Martin Baulig  <martin@ximian.com>
6556
6557         * namespace.cs (Namespace..ctor): Added SourceFile argument.
6558         (Namespace.DefineNamespaces): New static public method; this is
6559         called when we're compiling with debugging to add all namespaces
6560         to the symbol file.
6561
6562         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
6563         pass it to the Namespace's .ctor.
6564
6565         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
6566         and MethodBase arguments; pass the namespace ID to the symwriter;
6567         pass the MethodBase instead of the token to the symwriter.
6568         (SymbolWriter.DefineNamespace): New method to add a namespace to
6569         the symbol file.
6570
6571 2003-02-09  Martin Baulig  <martin@ximian.com>
6572
6573         * symbolwriter.cs: New file.  This is a wrapper around
6574         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
6575         methods here in near future.
6576
6577 2003-02-09  Martin Baulig  <martin@ximian.com>
6578
6579         * codegen.cs (EmitContext.Mark): Just pass the arguments to
6580         ILGenerator.MarkSequencePoint() which are actually used by the
6581         symbol writer.
6582
6583 2003-02-09  Martin Baulig  <martin@ximian.com>
6584
6585         * location.cs (SourceFile): New public sealed class.  This
6586         contains the name and an index which is used in the location's token.
6587         (Location): Reserve an appropriate number of bits in the token for
6588         the source file instead of walking over that list, this gives us a
6589         really huge performance improvement when compiling with debugging.
6590
6591         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
6592         `SourceFile' argument instead of a string.
6593         (Driver.ProcessFile): Add all the files via Location.AddFile(),
6594         but don't parse/tokenize here, we need to generate the list of all
6595         source files before we do that.
6596         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
6597         the files.
6598
6599         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
6600         instead of a string.
6601
6602         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
6603         of a string.
6604
6605 2003-02-09  Martin Baulig  <martin@ximian.com>
6606
6607         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
6608         filename on `#line default'.
6609
6610 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
6611
6612         * statement.cs: don't clear the pinned var when the fixed statement
6613         returns from the method (fixes bug#37752).
6614
6615 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
6616
6617         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
6618         to IsValueType.
6619
6620 2003-02-07  Martin Baulig  <martin@ximian.com>
6621
6622         * driver.cs: Removed the `--debug-args' command line argument.
6623
6624         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
6625         automatically by the AsssemblyBuilder.
6626         (CodeGen.InitializeSymbolWriter): We don't need to call any
6627         initialization function on the symbol writer anymore.  This method
6628         doesn't take any arguments.
6629
6630 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
6631
6632         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
6633         from referenced assemblies as well.
6634
6635 2003-02-02  Martin Baulig  <martin@ximian.com>
6636
6637         * class.cs (MethodData.Emit): Generate debugging info for external methods.
6638
6639 2003-02-02  Martin Baulig  <martin@ximian.com>
6640
6641         * class.cs (Constructor.Emit): Open the symbol writer before
6642         emitting the constructor initializer.
6643         (ConstructorInitializer.Emit): Call ec.Mark() to allow
6644         single-stepping through constructor initializers.
6645
6646 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
6647
6648         * class.cs: Handle error 549: do not allow virtual methods in
6649         sealed classes. 
6650
6651 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
6652
6653         * decl.cs: Check access levels when resolving types
6654
6655 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
6656
6657         * statement.cs: Add parameters and locals set in catch blocks that might 
6658         return to set vector
6659
6660 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
6661
6662         * class.cs (Operator): Set the SpecialName flags for operators.
6663
6664         * expression.cs (Invocation.DoResolve): Only block calls to
6665         accessors and operators on SpecialName methods.
6666
6667         (Cast.TryReduce): Handle conversions from char constants.
6668
6669
6670 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
6671
6672         * statement.cs: small memory and time optimization in FlowBranching.
6673
6674 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
6675
6676         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
6677         problem that the last fix but in the other sid (Set).
6678
6679         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
6680         access when there is no indexer in the hierarchy.
6681
6682 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
6683
6684         * class.cs: Combine some if statements.
6685
6686 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6687
6688         * driver.cs: fixed bug #37187.
6689
6690 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
6691
6692         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
6693         any indexer, it's needed to build a list with all the indexers in the
6694         hierarchy (AllGetters), else we have problems. Fixes #35653.
6695
6696 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
6697
6698         * class.cs (MethodData.Define): It is wrong for an interface
6699         implementation to be static in both cases: explicit and implicit.
6700         We were only handling this in one case.
6701
6702         Improve the if situation there to not have negations.
6703
6704         * class.cs (Field.Define): Turns out that we do not need to check
6705         the unsafe bit on field definition, only on usage.  Remove the test.
6706
6707 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6708
6709         * driver.cs: use assembly.Location instead of Codebase (the latest
6710         patch made mcs fail when using MS assemblies).
6711
6712 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
6713
6714         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
6715         get the path to *corlib.dll.
6716
6717 2003-01-21  Nick Drochak <ndrochak@gol.com>
6718
6719         * cs-tokenizer.cs:
6720         * pending.cs:
6721         * typemanager.cs: Remove compiler warnings
6722
6723 2003-01-20  Duncan Mak  <duncan@ximian.com>
6724
6725         * AssemblyInfo.cs: Bump the version number to 0.19.
6726
6727 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6728
6729         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
6730
6731 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
6732
6733         * class.cs (Constructor::Emit): Emit debugging info for constructors.
6734
6735 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
6736
6737         * cs-parser.jay: Small fix: we were not comparing the constructor
6738         name correctly.   Thanks to Zoltan for the initial pointer.
6739
6740 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
6741
6742         * cs-tokenizer.cs: Set file name when specified with #line
6743
6744 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
6745
6746         * cs-parser.jay: Only perform the constructor checks here if we
6747         are named like the class;  This will help provider a better
6748         error.  The constructor path is taken when a type definition is
6749         not found, but most likely the user forgot to add the type, so
6750         report that rather than the constructor error.
6751
6752 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
6753
6754         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
6755         allocations.
6756
6757 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6758
6759         * cs-parser.jay: Add cleanup call.
6760
6761 2003-01-13  Duncan Mak  <duncan@ximian.com>
6762
6763         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
6764         consistent with other methods.
6765
6766 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6767
6768         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
6769
6770 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
6771
6772         * attribute.cs: only set GuidAttr to true when we have a
6773         GuidAttribute.
6774
6775 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6776
6777         * ecore.cs:
6778         * expression.cs:
6779         * typemanager.cs: fixes to allow mcs compile corlib with the new
6780         Type.IsSubclassOf fix.
6781
6782 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
6783
6784         * expression.cs (LocalVariableReference.DoResolve): Classify a
6785         constant as a value, not as a variable.   Also, set the type for
6786         the variable.
6787
6788         * cs-parser.jay (fixed_statement): take a type instead of a
6789         pointer_type, so we can produce a better error message later.
6790
6791         * statement.cs (Fixed.Resolve): Flag types that are not pointers
6792         as an error.  
6793
6794         (For.DoEmit): Make inifinite loops have a
6795         non-conditional branch back.
6796
6797         (Fixed.DoEmit): First populate the pinned variables, then emit the
6798         statement, then clear the variables.  Before I was emitting the
6799         code once for each fixed piece.
6800
6801
6802 2003-01-08  Martin Baulig  <martin@ximian.com>
6803
6804         * statement.cs (FlowBranching.MergeChild): A break in a
6805         SWITCH_SECTION does not leave a loop.  Fixes #36155.
6806
6807 2003-01-08  Martin Baulig  <martin@ximian.com>
6808
6809         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
6810         lives in the same number space than `param_map'.  Fixes #36154.
6811
6812 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
6813
6814         * cs-parser.jay (constructor_declaration): Set the
6815         Constructor.ModFlags before probing for it.  This makes the
6816         compiler report 514, 515 and 132 (the code was there, but got
6817         broken). 
6818
6819         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
6820         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
6821         (GotoCase.Resolve): Set `Returns' to ALWAYS.
6822
6823 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
6824
6825         * enum.cs: create the enum static fields using the enum type.
6826
6827 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
6828
6829         * class.cs: don't try to create the ParamBuilder for the return
6830         type if it's not needed (and handle it breaking for the ms runtime
6831         anyway).
6832
6833 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
6834
6835         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
6836
6837 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
6838
6839         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
6840         the command.   This showed up while compiling the JANET source
6841         code, which used \r as its only newline separator.
6842
6843 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
6844
6845         * class.cs (Method.Define): If we are an operator (because it
6846         reuses our code), then set the SpecialName and HideBySig.  #36128
6847
6848 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
6849
6850         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
6851         exception, report error 120 `object reference required'.
6852
6853         * driver.cs: Add --pause option, used during to measure the size
6854         of the process as it goes with --timestamp.
6855
6856         * expression.cs (Invocation.DoResolve): Do not allow methods with
6857         SpecialName to be invoked.
6858
6859 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
6860
6861         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
6862         number before adding it.
6863
6864 2002-12-21  Ravi Pratap  <ravi@ximian.com>
6865
6866         * ecore.cs (StandardImplicitConversion): When in an unsafe
6867         context, we allow conversion between void * to any other pointer
6868         type. This fixes bug #35973.
6869
6870 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
6871
6872         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
6873         is not thrown when extensionless outputs are used 
6874
6875 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6876
6877         * rootcontext.cs: fixed compilation of corlib.
6878
6879 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
6880
6881         * attribute.cs (Attributes.Contains): Add new method.
6882
6883         * class.cs (MethodCore.LabelParameters): if the parameter is an
6884         `out' parameter, check that no attribute `[In]' has been passed.
6885
6886         * enum.cs: Handle the `value__' name in an enumeration.
6887
6888 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
6889
6890         * decl.cs: Added special case to allow overrides on "protected
6891         internal" methods
6892
6893 2002-12-18  Ravi Pratap  <ravi@ximian.com>
6894
6895         * attribute.cs (Attributes.AddAttributeSection): Rename to this
6896         since it makes much more sense.
6897
6898         (Attributes.ctor): Don't require a Location parameter.
6899
6900         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
6901
6902         * attribute.cs (ApplyAttributes): Remove extra Location parameters
6903         since we already have that information per attribute.
6904
6905         * everywhere : make appropriate changes.
6906
6907         * class.cs (LabelParameters): Write the code which actually
6908         applies attributes to the return type. We can't do this on the MS
6909         .NET runtime so we flag a warning in the case an exception is
6910         thrown.
6911
6912 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
6913
6914         * const.cs: Handle implicit null conversions here too.
6915
6916 2002-12-17  Ravi Pratap  <ravi@ximian.com>
6917
6918         * class.cs (MethodCore.LabelParameters): Remove the extra
6919         Type [] parameter since it is completely unnecessary. Instead
6920         pass in the method's attributes so that we can extract
6921         the "return" attribute.
6922
6923 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
6924
6925         * cs-parser.jay (parse): Use Report.Error to flag errors instead
6926         of ignoring it and letting the compile continue.
6927
6928         * typemanager.cs (ChangeType): use an extra argument to return an
6929         error condition instead of throwing an exception.
6930
6931 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
6932
6933         * expression.cs (Unary.TryReduce): mimic the code for the regular
6934         code path.  Perform an implicit cast in the cases where we can
6935         implicitly convert to one of the integral types, and then reduce
6936         based on that constant.   This fixes bug #35483.
6937
6938 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6939
6940         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
6941
6942 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6943
6944         * namespace.cs: fixed bug #35489.
6945
6946 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
6947
6948         * class.cs: Remove some dead code.
6949
6950         * cs-parser.jay: Estimate the number of methods needed
6951         (RootContext.MethodCount);
6952
6953         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
6954         numbers instead of StringBuilders.
6955
6956         * support.cs (PtrHashtable): Add constructor with initial size;
6957         We can now reduce reallocations of the method table.
6958
6959 2002-12-10  Ravi Pratap  <ravi@ximian.com>
6960
6961         * attribute.cs (ApplyAttributes): Keep track of the emitted
6962         attributes on a per-target basis. This fixes bug #35413.
6963
6964 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
6965
6966         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
6967         default to the Windows 1252 encoding.
6968
6969         (UnixParseOption): Support version, thanks to Alp for the missing
6970         pointer. 
6971
6972         * AssemblyInfo.cs: Add nice assembly information.
6973
6974         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
6975         (bug 35169).
6976
6977         * cs-parser.jay: Allow a trailing comma before the close bracked
6978         in the attribute_section production.
6979
6980         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
6981         address of the instance was being taken, I will take this out,
6982         because we take the address of the object immediately here.
6983
6984 2002-12-09  Ravi Pratap  <ravi@ximian.com>
6985
6986         * typemanager.cs (AreMultipleAllowed): Take care of the most
6987         obvious case where attribute type is not in the current assembly -
6988         stupid me ;-)
6989
6990 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
6991
6992         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
6993         definitions, instead of doing that afterwards.  
6994
6995         Also we use a nice little hack, depending on the constructor, we
6996         know if we are a "composed" name or a simple name.  Hence, we
6997         avoid the IndexOf test, and we avoid 
6998
6999         * codegen.cs: Add code to assist in a bug reporter to track down
7000         the source of a compiler crash. 
7001
7002 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7003
7004         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7005         types have been emitted for a given element and flag an error
7006         if something which does not have AllowMultiple set is used more
7007         than once.
7008
7009         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7010         attribute types and their corresponding AllowMultiple properties
7011
7012         (AreMultipleAllowed): Check the property for a given type.
7013
7014         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7015         property in the case we have a TypeContainer.
7016
7017         (Attributes.AddAttribute): Detect duplicates and just skip on
7018         adding them. This trivial fix catches a pretty gross error in our
7019         attribute emission - global attributes were being emitted twice!
7020
7021         Bugzilla bug #33187 is now fixed.
7022
7023 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7024
7025         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7026         instead of pp_and).
7027
7028         * expression.cs (Binary.ResolveOperator): I can only use the
7029         Concat (string, string, string) and Concat (string, string,
7030         string, string) if the child is actually a concatenation of
7031         strings. 
7032
7033 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7034
7035         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7036         context where we need a 2-character lookahead.
7037
7038         * pending.cs (PendingImplementation): Rework so we can keep track
7039         of interface types all the time, and flag those which were
7040         implemented by parents as optional.
7041
7042 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7043
7044         * expression.cs (Binary.ResolveOperator): Use
7045         String.Concat(string,string,string) or
7046         String.Concat(string,string,string,string) when possible. 
7047
7048         * typemanager: More helper methods.
7049
7050
7051 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7052
7053         * pending.cs: remove the bogus return from GetMissingInterfaces()
7054         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7055
7056 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7057
7058         * namespace.cs: avoid duplicated 'using xxx' being added to
7059         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7060         when we get more than one 'using' statement for the same namespace.
7061         Report a CS0105 warning for it.
7062
7063 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7064
7065         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7066         of calling getChar/putback, uses internal knowledge of it.    
7067
7068         (xtoken): Reorder tokenizer so most common patterns are checked
7069         first.  This reduces the compilation time in another 5% (from 8.11s
7070         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7071
7072         The parsing time is 22% of the compilation in mcs, and from that
7073         64% is spent on the tokenization process.  
7074
7075         I tried using a binary search for keywords, but this is slower
7076         than the hashtable.  Another option would be to do a couple of
7077         things:
7078
7079                 * Not use a StringBuilder, instead use an array of chars,
7080                   with a set value.  Notice that this way we could catch
7081                   the 645 error without having to do it *afterwards*.
7082
7083                 * We could write a hand-parser to avoid the hashtable
7084                   compares altogether.
7085
7086         The identifier consumption process takes 37% of the tokenization
7087         time.  Another 15% is spent on is_number.  56% of the time spent
7088         on is_number is spent on Int64.Parse:
7089
7090                 * We could probably choose based on the string length to
7091                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7092                   computations. 
7093
7094         Another 3% is spend on wrapping `xtoken' in the `token' function.
7095
7096         Handle 0xa0 as whitespace (#34752)
7097
7098 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7099
7100         * typemanager.cs (IsCLRType): New routine to tell whether a type
7101         is one of the builtin types.  
7102
7103         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7104         typecode in more places instead of doing pointer comparissions.
7105         We could leverage some knowledge about the way the typecodes are
7106         laid out.
7107
7108         New code to cache namespaces in assemblies, it is currently not
7109         invoked, to be used soon.
7110
7111         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7112
7113         * expression.cs (Binary.ResolveOperator): specially handle
7114         strings, and do not perform user-defined operator overloading for
7115         built-in types.
7116
7117 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7118
7119         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7120         internalcall as it is a pretty simple operation;  Avoid whenever
7121         possible to call Char.IsLetter.
7122
7123         (consume_identifier): Cut by half the number of
7124         hashtable calls by merging the is_keyword and GetKeyword behavior.
7125
7126         Do not short-circuit, because if we do, we
7127         report errors (ie, #if false && true would produce an invalid
7128         directive error);
7129
7130
7131 2002-11-24  Martin Baulig  <martin@ximian.com>
7132
7133         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7134         check constant ranges and report a CS0221.  Fixes #33186.
7135
7136 2002-11-24  Martin Baulig  <martin@ximian.com>
7137
7138         * cs-parser.jay: Make this work for uninitialized variable
7139         declarations in the `for' initializer.  Fixes #32416.
7140
7141 2002-11-24  Martin Baulig  <martin@ximian.com>
7142
7143         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7144         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7145
7146 2002-11-24  Martin Baulig  <martin@ximian.com>
7147
7148         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7149         argument; if true, we also check for user-defined conversions.
7150         This is only needed if both arguments are of a user-defined type.
7151         Fixes #30443, added test-175.cs.
7152         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7153
7154         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7155
7156 2002-11-24  Martin Baulig  <martin@ximian.com>
7157
7158         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7159         function to get the store opcode.
7160         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7161         only emit the Ldelema if the store opcode is Stobj.  You must run
7162         both test-34 and test-167 to test this.  Fixes #34529.
7163
7164 2002-11-23  Martin Baulig  <martin@ximian.com>
7165
7166         * ecore.cs (Expression.MemberLookup): Added additional
7167         `qualifier_type' argument which is used when we're being called
7168         from MemberAccess.DoResolve() and null if we're called from a
7169         SimpleName lookup.
7170         (Expression.MemberLookupFailed): New method to report errors; this
7171         does the CS1540 check and reports the correct error message.
7172
7173         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7174         argument for the CS1540 check and redone the way how we're dealing
7175         with private members.  See the comment in the source code for details.
7176         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7177         `closure_start_type' to `closure_qualifier_type' and check whether
7178         it's not null.  It was not this filter being broken, it was just
7179         being called with the wrong arguments.
7180
7181         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7182         and pass it the correct `qualifier_type'; this also does the error
7183         handling for us.
7184
7185 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7186
7187         * expression.cs (Invocation.EmitParams): If the we are dealing
7188         with a non-built-in value type, load its address as well.
7189
7190         (ArrayCreation): Use a a pretty constant instead
7191         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7192         static initializers.  
7193
7194         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7195         because they are not really value types, just glorified integers. 
7196
7197         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7198
7199         * ecore.cs: Remove redundant code for enumerations, make them use
7200         the same code path as everything else, fixes the casting issue
7201         with enumerations in Windows.Forms.
7202
7203         * attribute.cs: Do only cast to string if it is a string, the
7204         validation happens later.
7205
7206         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7207         people upgrade their corlibs.
7208
7209         * ecore.cs: Oops, enumerations were not following the entire code path
7210
7211 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7212
7213         * typemanager.cs (FilterWithClosure): Commented out the test for
7214         1540 in typemanager.cs, as it has problems when accessing
7215         protected methods from a parent class (see test-174.cs). 
7216
7217         * attribute.cs (Attribute.ValidateGuid): new method.
7218         (Attribute.Resolve): Use above.
7219
7220 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7221
7222         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7223
7224         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7225         handling for enumerations, as we only needed the TypeContainer
7226         functionality to begin with (this is required for the fix below to
7227         work for enums that reference constants in a container class for
7228         example). 
7229
7230         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7231
7232         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7233         a valid TypeBuilder to perform lookups on.o
7234
7235         * class.cs (InheritableMemberSignatureCompare): Use true in the
7236         call to GetGetMethod and GetSetMethod, because we are comparing
7237         the signature, and we need to get the methods *even* if they are
7238         private. 
7239
7240         (PropertyBase.CheckBase): ditto.
7241
7242         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7243         GotoCase.Resolve): Use Peel on EmpytCasts.
7244
7245         * ecore.cs (EmptyCast): drop child, add Peel method.
7246
7247 2002-11-17  Martin Baulig  <martin@ximian.com>
7248
7249         * ecore.cs (EmptyCast.Child): New public property.
7250
7251         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7252         label resolved to an EmptyCast.  Fixes #34162.
7253         (GotoCase.Resolve): Likewise.
7254         (Block.EmitMeta): Likewise.
7255
7256 2002-11-17  Martin Baulig  <martin@ximian.com>
7257
7258         * expression.cs (Invocation.BetterConversion): Prefer int over
7259         uint; short over ushort; long over ulong for integer literals.
7260         Use ImplicitConversionExists instead of StandardConversionExists
7261         since we also need to check for user-defined implicit conversions.
7262         Fixes #34165.  Added test-173.cs.
7263
7264 2002-11-16  Martin Baulig  <martin@ximian.com>
7265
7266         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7267         with the `true' and `false' literals.  Fixes #33151.
7268
7269 2002-11-16  Martin Baulig  <martin@ximian.com>
7270
7271         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7272         October 22nd; don't do the cs1540 check for static members.
7273
7274         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7275         now using our own filter here and doing the cs1540 check again.
7276
7277 2002-11-16  Martin Baulig  <martin@ximian.com>
7278
7279         * support.cs (InternalParameters): Don't crash if we don't have
7280         any fixed parameters.  Fixes #33532.
7281
7282 2002-11-16  Martin Baulig  <martin@ximian.com>
7283
7284         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7285         when looking up static methods to make this work on Windows.
7286         Fixes #33773.
7287
7288 2002-11-16  Martin Baulig  <martin@ximian.com>
7289
7290         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7291         a setter rather than using PropertyInfo.CanWrite.
7292
7293 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7294
7295         * class.cs: Allow acces to block member by subclasses. Fixes build
7296         breaker.
7297
7298 2002-11-14  Martin Baulig  <martin@ximian.com>
7299
7300         * class.cs (Constructor.Emit): Added the extern/block check.
7301         Fixes bug #33678.
7302
7303 2002-11-14  Martin Baulig  <martin@ximian.com>
7304
7305         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7306         iteration while looking for indexers, this is needed because the
7307         indexer may have a different name in our base classes.  Fixed the
7308         error reporting (no indexers at all, not get accessor, no
7309         overloaded match).  Fixes bug #33089.
7310         (IndexerAccess.DoResolveLValue): Likewise.
7311
7312 2002-11-14  Martin Baulig  <martin@ximian.com>
7313
7314         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7315         indexers.  Fixes the first part of bug #33089.
7316         (MethodSignature.InheritableMemberSignatureCompare): Added support
7317         for properties.
7318
7319 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7320
7321         * attribute.cs (Attribute.Resolve): Catch the
7322         NullReferenceException and report it since it isn't supposed to
7323         happen. 
7324
7325 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7326
7327         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7328         LogicalOr and LogicalAnd that can benefit from recursively
7329         handling EmitBranchable.  The code now should be nice for Paolo.
7330
7331 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
7332
7333         * typemanager.cs (LookupType): Added a negative-hit hashtable for
7334         the Type lookups, as we perform quite a number of lookups on
7335         non-Types.  This can be removed once we can deterministically tell
7336         whether we have a type or a namespace in advance.
7337
7338         But this might require special hacks from our corlib.
7339
7340         * TODO: updated.
7341
7342         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
7343         and double which avoids a conversion from an integer to a double.
7344
7345         * expression.cs: tiny optimization, avoid calling IsConstant,
7346         because it effectively performs the lookup twice.
7347
7348 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
7349
7350         But a bogus return here to keep the semantics of the old code
7351         until the Mono runtime is fixed.
7352
7353         * pending.cs (GetMissingInterfaces): New method used to remove all
7354         the interfaces that are already implemented by our parent
7355         classes from the list of pending methods. 
7356
7357         * interface.cs: Add checks for calls after ResolveTypeExpr.
7358
7359 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7360
7361         * class.cs (Class.Emit): Report warning 67: event not used if the
7362         warning level is beyond 3.
7363
7364         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7365         being a NullLiteral.
7366
7367         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7368         specifiers. 
7369
7370         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7371         path that might fail if a type can not be resolved.
7372
7373         * expression.cs (Binary.Emit): Emit unsigned versions of the
7374         operators. 
7375
7376         * driver.cs: use error 5.
7377
7378 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7379
7380         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7381
7382 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7383
7384         * cs-parser.jay (switch_section): A beautiful patch from Martin
7385         Baulig that fixed 33094.
7386
7387 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7388
7389         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7390         Check whether the base is abstract and report an error if so.
7391
7392         * expression.cs (IndexerAccess.DoResolveLValue,
7393         IndexerAccess.DoResolve): ditto. 
7394
7395         (Invocation.DoResolve): ditto.
7396
7397         (Invocation.FullMethodDesc): Improve the report string.
7398
7399         * statement.cs (Block): Eliminate IsVariableDefined as it is
7400         basically just a wrapper for GetVariableInfo.
7401
7402         * ecore.cs (SimpleName): Use new 
7403
7404         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7405         type, as we return the actual parameter ref/unref state on a
7406         different call.
7407
7408 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7409
7410         * support.cs: Return proper flags REF/OUT fixing the previous
7411         commit.  
7412
7413         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7414         not used to mean `ref' but `ref or out' in ParameterReference
7415
7416         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7417         full type signature instead of calling TypeManger.CSharpName
7418         ourselves. 
7419
7420         * support.cs (InternalParameters.ParameterDesc): Do not compare
7421         directly to the modflags, because REF/OUT will actually be bitsets
7422         if set. 
7423
7424         * delegate.cs (VerifyMethod): Check also the modifiers.
7425
7426         * cs-tokenizer.cs: Fix bug where floating point values with an
7427         exponent where a sign was missing was ignored.
7428
7429         * driver.cs: Allow multiple assemblies to be specified in a single
7430         /r: argument
7431
7432 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7433
7434         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7435         because identifiers after a parenthesis would end up in this kind
7436         of production, and we needed to desamiguate it for having casts
7437         like:
7438
7439                 (UserDefinedType *) xxx
7440
7441 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7442
7443         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7444         we should set on the Bindingflags.NonPublic, but not turn on
7445         private_ok.  private_ok controls whether a Private member is
7446         returned (this is chekced on the filter routine), while the
7447         BindingFlags.NonPublic just controls whether private/protected
7448         will be allowed.   This fixes the problem part of the problem of
7449         private properties being allowed to be used in derived classes.
7450
7451         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7452         so we can call the children DoResolveLValue method (this will
7453         properly signal errors on lvalue assignments to base properties)
7454
7455         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7456         getter are null, and we have a property info, we know that this
7457         happened because the lookup failed, so we report an error 122 for
7458         protection level violation.
7459
7460         We also silently return if setter and getter are null in the
7461         resolve functions, this condition only happens if we have flagged
7462         the error before.  This is the other half of the problem. 
7463
7464         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
7465         not have accessibility information, that is why we were returning
7466         true in the filter function in typemanager.cs.
7467
7468         To properly report 122 (property is inaccessible because of its
7469         protection level) correctly, we report this error in ResolveAccess
7470         by failing if both the setter and the getter are lacking (ie, the
7471         lookup failed). 
7472
7473         DoResolve and DoLResolve have been modified to check for both
7474         setter/getter being null and returning silently, the reason being
7475         that I did not want to put the knowledge about this error in upper
7476         layers, like:
7477
7478         int old = Report.Errors;
7479         x = new PropertyExpr (...);
7480         if (old != Report.Errors)
7481                 return null;
7482         else
7483                 return x;
7484
7485         So the property expr is returned, but it is invalid, so the error
7486         will be flagged during the resolve process. 
7487
7488         * class.cs: Remove InheritablePropertySignatureCompare from the
7489         class, as we no longer depend on the property signature to compute
7490         whether it is possible to implement a method or not.
7491
7492         The reason is that calling PropertyInfo.GetGetMethod will return
7493         null (in .NET, in Mono it works, and we should change this), in
7494         cases where the Get Method does not exist in that particular
7495         class.
7496
7497         So this code:
7498
7499         class X { public virtual int A { get { return 1; } } }
7500         class Y : X { }
7501         class Z : Y { public override int A { get { return 2; } } }
7502
7503         Would fail in Z because the parent (Y) would not have the property
7504         defined.  So we avoid this completely now (because the alternative
7505         fix was ugly and slow), and we now depend exclusively on the
7506         method names.
7507
7508         (PropertyBase.CheckBase): Use a method-base mechanism to find our
7509         reference method, instead of using the property.
7510
7511         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
7512         routines are gone now.
7513
7514         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
7515         names, they were incorrectly named.
7516
7517         * cs-tokenizer.cs: Return are more gentle token on failure. 
7518
7519         * pending.cs (PendingImplementation.InterfaceMethod): This routine
7520         had an out-of-sync index variable, which caused it to remove from
7521         the list of pending methods the wrong method sometimes.
7522
7523 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
7524
7525         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
7526         CanWrite, because those refer to this particular instance of the
7527         property, and do not take into account the fact that we can
7528         override single members of a property.
7529
7530         Constructor requires an EmitContext.  The resolution process does
7531         not happen here, but we need to compute the accessors before,
7532         because the resolution does not always happen for properties.
7533
7534         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
7535         subclass, before we did not update this flag, but we did update
7536         bindingflags. 
7537
7538         (GetAccessors): Drop this routine, as it did not work in the
7539         presence of partially overwritten set/get methods. 
7540
7541         Notice that this broke the cs1540 detection, but that will require
7542         more thinking. 
7543
7544 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7545
7546         * class.cs:
7547         * codegen.cs:
7548         * driver.cs: issue a warning instead of an error if we don't support
7549         debugging for the platform. Also ignore a couple of errors that may
7550         arise when trying to write the symbols. Undo my previous patch.
7551
7552 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7553
7554         * driver.cs: ignore /debug switch except for Unix platforms.
7555
7556 2002-10-23  Nick Drochak  <ndrochak@gol.com>
7557
7558         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
7559
7560 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
7561
7562         * driver.cs: Do not make mcs-debug conditional, so we do not break
7563         builds that use it.
7564
7565         * statement.cs (UsageVector.MergeChildren): I would like Martin to
7566         review this patch.  But basically after all the children variables
7567         have been merged, the value of "Breaks" was not being set to
7568         new_breaks for Switch blocks.  I think that it should be set after
7569         it has executed.  Currently I set this to the value of new_breaks,
7570         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
7571         conservative, but I do not understand this code very well.
7572
7573         I did not break anything in the build, so that is good ;-)
7574
7575         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
7576
7577 2002-10-20  Mark Crichton  <crichton@gimp.org>
7578
7579         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
7580
7581 2002-10-20  Nick Drochak  <ndrochak@gol.com>
7582
7583         * cfold.cs: Fixed compile blocker.
7584
7585 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
7586
7587         * driver.cs: I was chekcing the key, not the file.
7588
7589 2002-10-19  Ravi Pratap  <ravi@ximian.com>
7590
7591         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
7592         message that we were generating - we just need to silently return
7593         a null.
7594
7595 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
7596
7597         * class.cs (Event.Define): Change my previous commit, as this
7598         breaks the debugger.  This is a temporary hack, as it seems like
7599         the compiler is generating events incorrectly to begin with.
7600
7601         * expression.cs (Binary.ResolveOperator): Added support for 
7602         "U operator - (E x, E y)"
7603
7604         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
7605         y)".
7606
7607         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
7608         init-only variables, but this path did not take into account that
7609         there might be also instance readonly variables.  Correct this
7610         problem. 
7611
7612         This fixes bug 32253
7613
7614         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
7615         delegates as well.
7616
7617         * driver.cs: Change the extension for modules to `netmodule'
7618
7619         * cs-parser.jay: Improved slightly the location tracking for
7620         the debugger symbols.
7621
7622         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
7623         modifiers that were specified instead of the hardcoded value
7624         (FamAndAssem).  This was basically ignoring the static modifier,
7625         and others.  Fixes 32429.
7626
7627         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
7628         fixed a bug in the process (32476)
7629
7630         * expression.cs (ArrayAccess.EmitAssign): Patch from
7631         hwang_rob@yahoo.ca that fixes bug 31834.3
7632
7633 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
7634
7635         * driver.cs: Make the module extension .netmodule.
7636
7637 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
7638
7639         * driver.cs: Report an error if the resource file is not found
7640         instead of crashing.
7641
7642         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
7643         false, like Emit does.
7644
7645 2002-10-16  Nick Drochak  <ndrochak@gol.com>
7646
7647         * typemanager.cs: Remove unused private member.  Also reported mcs
7648         bug to report this as a warning like csc.
7649
7650 2002-10-15  Martin Baulig  <martin@gnome.org>
7651
7652         * statement.cs (Statement.Emit): Made this a virtual method; emits
7653         the line number info and calls DoEmit().
7654         (Statement.DoEmit): New protected abstract method, formerly knows
7655         as Statement.Emit().
7656
7657         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
7658
7659 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
7660
7661         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
7662         have fixed a remaining problem: not every AddXXXX was adding a
7663         fully qualified name.  
7664
7665         Now everyone registers a fully qualified name in the DeclSpace as
7666         being defined instead of the partial name.  
7667
7668         Downsides: we are slower than we need to be due to the excess
7669         copies and the names being registered this way.  
7670
7671         The reason for this is that we currently depend (on the corlib
7672         bootstrap for instance) that types are fully qualified, because
7673         we dump all the types in the namespace, and we should really have
7674         types inserted into the proper namespace, so we can only store the
7675         basenames in the defined_names array.
7676
7677 2002-10-10  Martin Baulig  <martin@gnome.org>
7678
7679         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
7680         from bug #31834, see the bug report for a testcase which is
7681         miscompiled.
7682
7683 2002-10-10  Martin Baulig  <martin@gnome.org>
7684
7685         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
7686         flow analysis code for this.
7687
7688         * statement.cs (Do, While, For): Tell the flow analysis code about
7689         infinite loops.
7690         (FlowBranching.UsageVector): Added support for infinite loops.
7691         (Block.Resolve): Moved the dead code elimination here and use flow
7692         analysis to do it.
7693
7694 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
7695
7696         * class.cs (Field.Define): Catch cycles on struct type
7697         definitions. 
7698
7699         * typemanager.cs (IsUnmanagedtype): Do not recursively check
7700         fields if the fields are static.  We only need to check instance
7701         fields. 
7702
7703         * expression.cs (As.DoResolve): Test for reference type.
7704
7705         * statement.cs (Using.ResolveExpression): Use
7706         ConvertImplicitRequired, not ConvertImplicit which reports an
7707         error on failture
7708         (Using.ResolveLocalVariableDecls): ditto.
7709
7710         * expression.cs (Binary.ResolveOperator): Report errors in a few
7711         places where we had to.
7712
7713         * typemanager.cs (IsUnmanagedtype): Finish implementation.
7714
7715 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
7716
7717         * expression.cs: Use StoreFromPtr instead of extracting the type
7718         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
7719
7720         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
7721         an enumeration value to a System.Enum, but System.Enum is not a
7722         value type, but an class type, so we need to box.
7723
7724         (Expression.ConvertExplicit): One codepath could return
7725         errors but not flag them.  Fix this.  Fixes #31853
7726
7727         * parameter.cs (Resolve): Do not allow void as a parameter type.
7728
7729 2002-10-06  Martin Baulig  <martin@gnome.org>
7730
7731         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
7732         if it's a class type and not a struct.  Fixes #31815.
7733
7734 2002-10-06  Martin Baulig  <martin@gnome.org>
7735
7736         * statement.cs: Reworked the flow analysis code a bit to make it
7737         usable for dead code elimination.
7738
7739 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7740
7741         * cs-parser.jay: allow empty source files. Fixes bug #31781.
7742
7743 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7744
7745         * expression.cs (ComposedCast.DoResolveType): A quick workaround
7746         to fix the test 165, will investigate deeper.
7747
7748 2002-10-04  Martin Baulig  <martin@gnome.org>
7749
7750         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
7751         finally blocks actually work.
7752         (Try.Resolve): We don't need to create a sibling for `finally' if
7753         there is no finally block.
7754
7755 2002-10-04  Martin Baulig  <martin@gnome.org>
7756
7757         * class.cs (Constructor.Define): The default accessibility for a
7758         non-default constructor is private, not public.
7759
7760 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7761
7762         * class.cs (Constructor): Make AllowedModifiers public, add
7763         EXTERN.
7764
7765         * cs-parser.jay: Perform the modifiers test here, as the
7766         constructor for the Constructor class usually receives a zero
7767         because of the way we create it (first we create, later we
7768         customize, and we were never checking the modifiers).
7769
7770         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
7771         is a version of LookupTypeReflection that includes the type-name
7772         cache.  This can be used as a fast path for functions that know
7773         the fully qualified name and are only calling into *.GetType() to
7774         obtain a composed type.
7775
7776         This is also used by TypeManager.LookupType during its type
7777         composition.
7778
7779         (LookupType): We now also track the real type name, as sometimes
7780         we can get a quey for the real type name from things like
7781         ComposedCast.  This fixes bug 31422.
7782
7783         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
7784         complete type fullname, it does not have to go through the type
7785         resolution system to obtain the composed version of the type (for
7786         obtaining arrays or pointers).
7787
7788         (Conditional.Emit): Use the EmitBoolExpression to
7789         generate nicer code, as requested by Paolo.
7790
7791         (ArrayCreation.CheckIndices): Use the patch from
7792         hwang_rob@yahoo.ca to validate the array initializers. 
7793
7794 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
7795
7796         * class.cs (ConstructorInitializer.Emit): simplify code by using
7797         Invocation.EmitCall, and at the same time, fix the bugs in calling
7798         parent constructors that took variable arguments. 
7799
7800         * ecore.cs (Expression.ConvertNumericExplicit,
7801         Expression.ImplicitNumericConversion): Remove the code that
7802         manually wrapped decimal (InternalTypeConstructor call is now gone
7803         as well).
7804
7805         * expression.cs (Cast.TryReduce): Also handle decimal types when
7806         trying to perform a constant fold on the type.
7807
7808         * typemanager.cs (IsUnmanagedtype): Partially implemented.
7809
7810         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
7811         that only turned off an error report, and did nothing else. 
7812
7813 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
7814
7815         * driver.cs: Handle and ignore /fullpaths
7816
7817 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
7818
7819         * expression.cs (Binary.ResolveOperator): Catch the case where
7820         DoNumericPromotions returns true, 
7821
7822         (Binary.DoNumericPromotions): Simplify the code, and the tests.
7823
7824 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
7825
7826         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
7827         report error 70.
7828
7829 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
7830
7831         * ecore.cs (ConvertNumericExplicit): It is not enough that the
7832         conversion exists, but it is also required that the conversion be
7833         performed.  This manifested in "(Type64Enum) 2".  
7834
7835         * class.cs (TypeManager.AddMethod): The fix is not to change
7836         AddEnum, because that one was using a fully qualified name (every
7837         DeclSpace derivative does), but to change the AddMethod routine
7838         that was using an un-namespaced name.  This now correctly reports
7839         the duplicated name.
7840
7841         Revert patch until I can properly fix it.  The issue
7842         is that we have a shared Type space across all namespaces
7843         currently, which is wrong.
7844
7845         Options include making the Namespace a DeclSpace, and merge
7846         current_namespace/current_container in the parser.
7847
7848 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
7849
7850         * cs-parser.jay: Improve error reporting when we get a different
7851         kind of expression in local_variable_type and
7852         local_variable_pointer_type. 
7853
7854         Propagate this to avoid missleading errors being reported.
7855
7856         * ecore.cs (ImplicitReferenceConversion): treat
7857         TypeManager.value_type as a target just like object_type.   As
7858         code like this:
7859
7860         ValueType v = 1;
7861
7862         Is valid, and needs to result in the int 1 being boxed before it
7863         is assigned to the value type v.
7864
7865         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
7866         to validate the enumeration name.
7867
7868         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
7869         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
7870         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
7871
7872         * ecore.cs (TryImplicitIntConversion): When doing an
7873         implicit-enumeration-conversion, check if the type is 64-bits and
7874         perform a conversion before passing to EnumConstant.
7875
7876 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
7877
7878         * decl.cs (Error_AmbiguousTypeReference); New routine used to
7879         report ambiguous type references.  Unlike the MS version, we
7880         report what the ambiguity is.   Innovation at work ;-)
7881
7882         (DeclSpace.FindType): Require a location argument to
7883         display when we display an ambiguous error.
7884
7885         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
7886
7887         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
7888
7889         * expression.cs (EmitDynamicInitializers): Apply patch from
7890         hwang_rob@yahoo.ca that fixes the order in which we emit our
7891         initializers. 
7892
7893 2002-09-21  Martin Baulig  <martin@gnome.org>
7894
7895         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
7896         delegate takes no arguments.
7897
7898 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
7899
7900         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
7901         from integers.
7902
7903         * expression.cs: Extract the underlying type.
7904
7905         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
7906
7907         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
7908
7909 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
7910
7911         * class.cs (TypeContainer.DefineType): We can not use the nice
7912         PackingSize with the size set to 1 DefineType method, because it
7913         will not allow us to define the interfaces that the struct
7914         implements.
7915
7916         This completes the fixing of bug 27287
7917
7918         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
7919         means also structs.  This fixes part of the problem. 
7920         (Expresion.ImplicitReferenceConversionExists): ditto.
7921
7922         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
7923         error if there were no errors reported during the type lookup
7924         process, to avoid duplicates or redundant errors.  Without this
7925         you would get an ambiguous errors plus a type not found.  We have
7926         beaten the user enough with the first error.  
7927
7928         (DeclSparce.FindType): Emit a warning if we have an ambiguous
7929         reference. 
7930
7931         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
7932         during the resolution process, stop the lookup, this avoids
7933         repeated error reports (same error twice).
7934
7935         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
7936
7937         * typemanager.cs (LookupType): Redo the type lookup code to match
7938         the needs of System.Reflection.  
7939
7940         The issue is that System.Reflection requires references to nested
7941         types to begin with a "+" sign instead of a dot.  So toplevel
7942         types look like: "NameSpace.TopLevelClass", and nested ones look
7943         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
7944         levels. 
7945
7946 2002-09-19  Martin Baulig  <martin@gnome.org>
7947
7948         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
7949         says that a method always returns or always throws an exception,
7950         don't report the CS0161.
7951
7952         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
7953         set `Returns = new_returns'.
7954
7955 2002-09-19  Martin Baulig  <martin@gnome.org>
7956
7957         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
7958         to an enum constant, check for a CS0176.
7959
7960 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
7961
7962         * class.cs (TypeContainer.CheckPairedOperators): Now we check
7963         for operators that must be in pairs and report errors.
7964
7965         * ecore.cs (SimpleName.DoResolveType): During the initial type
7966         resolution process, when we define types recursively, we must
7967         check first for types in our current scope before we perform
7968         lookups in the enclosing scopes.
7969
7970         * expression.cs (MakeByteBlob): Handle Decimal blobs.
7971
7972         (Invocation.VerifyArgumentsCompat): Call
7973         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
7974         I thought we were supposed to always call this, but there are a
7975         few places in the code where we dont do it.
7976
7977 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
7978
7979         * driver.cs: Add support in -linkres and -resource to specify the
7980         name of the identifier.
7981
7982 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7983
7984         * ecore.cs (StandardConversionExists): Sync with the conversion
7985         code: allow anything-* to void* conversions.
7986
7987         (FindMostSpecificSource): Use an Expression argument
7988         instead of a Type, because we might be handed over a Literal which
7989         gets a few more implicit conversions that plain types do not.  So
7990         this information was being lost.
7991
7992         Also, we drop the temporary type-holder expression when not
7993         required.
7994
7995 2002-09-17  Martin Baulig  <martin@gnome.org>
7996
7997         * class.cs (PropertyBase.CheckBase): Don't check the base class if
7998         this is an explicit interface implementation.
7999
8000 2002-09-17  Martin Baulig  <martin@gnome.org>
8001
8002         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8003         different `IndexerName' attributes.
8004
8005         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8006         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8007         virtual CommonResolve().
8008
8009 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8010
8011         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8012         and convert that to the UnderlyingType.
8013
8014         * statement.cs (Foreach.Resolve): Indexers are just like variables
8015         or PropertyAccesses.
8016
8017         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8018         inside quoted strings, we were not doing this before.
8019
8020 2002-09-16  Martin Baulig  <martin@gnome.org>
8021
8022         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8023         resolve it.  This is needed for the definite assignment check of the
8024         instance expression, fixes bug #29846.
8025         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8026
8027 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8028
8029         * parameter.cs: Fix compile error.  Cannot reference static member
8030         from an instance object.  Is this an mcs bug?
8031
8032 2002-09-14  Martin Baulig  <martin@gnome.org>
8033
8034         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8035         multiple times.  Fixes bug #30295, added test-166.cs.
8036
8037 2002-09-14  Martin Baulig  <martin@gnome.org>
8038
8039         * statement.cs (Block.Emit): Don't emit unreachable code.
8040         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8041         `break' statements.
8042         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8043
8044 2002-09-14  Martin Baulig  <martin@gnome.org>
8045
8046         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8047         is set.
8048
8049 2002-09-14  Martin Baulig  <martin@gnome.org>
8050
8051         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8052         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8053         be false on the ms runtime.
8054
8055 2002-09-13  Martin Baulig  <martin@gnome.org>
8056
8057         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8058         the CS0038 error message.
8059
8060 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8061
8062         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8063         constant inside, return it.
8064
8065 2002-09-12  Martin Baulig  <martin@gnome.org>
8066
8067         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8068         implicit conversion can be done between enum types.
8069
8070         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8071         check whether an implicit conversion to the current enum's UnderlyingType
8072         exists and report an error if not.
8073
8074         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8075         without debugging support.
8076
8077         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8078         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8079
8080 2002-09-12  Martin Baulig  <martin@gnome.org>
8081
8082         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8083
8084         * ecore.cs (IMemberExpr.DeclaringType): New property.
8085         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8086         nonstatic member of an outer type (CS0038).
8087
8088 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8089
8090         * driver.cs: Activate the using-error detector at warning level
8091         4 (at least for MS-compatible APIs).
8092
8093         * namespace.cs (VerifyUsing): Small buglett fix.
8094
8095         * pending.cs (PendingImplementation): pass the container pointer. 
8096
8097         * interface.cs (GetMethods): Allow for recursive definition.  Long
8098         term, I would like to move every type to support recursive
8099         definitions, not the current ordering mechanism that we have right
8100         now.
8101
8102         The situation is this: Attributes are handled before interfaces,
8103         so we can apply attributes to interfaces.  But some attributes
8104         implement interfaces, we will now handle the simple cases
8105         (recursive definitions will just get an error).  
8106
8107         * parameter.cs: Only invalidate types at the end if we fail to
8108         lookup all types.  
8109
8110 2002-09-09  Martin Baulig  <martin@gnome.org>
8111
8112         * ecore.cs (PropertyExpr.Emit): Also check for
8113         TypeManager.system_int_array_get_length so this'll also work when
8114         compiling corlib.  Fixes #30003.
8115
8116 2002-09-09  Martin Baulig  <martin@gnome.org>
8117
8118         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8119         and throw an exception if we can't get the type's size.  Fixed #30040,
8120         added test-165.cs.
8121
8122 2002-09-09  Martin Baulig  <martin@gnome.org>
8123
8124         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8125
8126         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8127         context.  Fixes bug #30027.
8128
8129         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8130         virtual functions.  Fixes bug #30043, added test-164.cs.
8131
8132 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8133
8134         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8135
8136 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8137
8138         * driver.cs: Use an object to get the windows codepage since it's not a
8139         static property.
8140
8141 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8142
8143         * statement.cs (For.Emit): for infinite loops (test == null)
8144         return whether there is a break inside, not always "true".
8145
8146         * namespace.cs (UsingEntry): New struct to hold the name of the
8147         using definition, the location where it is defined, and whether it
8148         has been used in a successful type lookup.
8149
8150         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8151         strings.
8152
8153         * decl.cs: ditto.
8154
8155 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8156
8157         * attribute.cs : Fix incorrect code which relied on catching
8158         a NullReferenceException to detect a null being passed in
8159         where an object was expected.
8160
8161 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8162
8163         * statement.cs (Try): flag the catch variable as assigned
8164
8165         * expression.cs (Cast): Simplified by using ResolveType instead of
8166         manually resolving.
8167
8168         * statement.cs (Catch): Fix bug by using ResolveType.
8169
8170 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8171
8172         * expression.cs (BetterConversion): Special case for when we have
8173         a NullLiteral as the argument and we have to choose between string
8174         and object types - we choose string the way csc does.
8175
8176         * attribute.cs (Attribute.Resolve): Catch the
8177         NullReferenceException and report error #182 since the Mono
8178         runtime no more has the bug and having this exception raised means
8179         we tried to select a constructor which takes an object and is
8180         passed a null.
8181
8182 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8183
8184         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8185         message (1502, 1503) when we can't locate a method after overload
8186         resolution. This is much more informative and closes the bug
8187         Miguel reported.
8188
8189         * interface.cs (PopulateMethod): Return if there are no argument
8190         types. Fixes a NullReferenceException bug.
8191
8192         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8193         expressions too. Previously we were checking only in one place for
8194         positional arguments leaving out named arguments.
8195
8196         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8197         type to the enum type is not allowed. Remove code corresponding to
8198         that.
8199
8200         (ConvertNumericExplicit): Allow explicit conversions from
8201         the underlying type to enum type. This precisely follows the spec
8202         and closes a bug filed by Gonzalo.
8203
8204 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8205
8206         * compiler.csproj:
8207         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8208
8209 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8210
8211         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8212         it was important that we stored the right value after the
8213         reduction in `converted'.
8214
8215 2002-09-04  Martin Baulig  <martin@gnome.org>
8216
8217         * location.cs (Location.SymbolDocument): Use full pathnames for the
8218         source files.
8219
8220 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8221
8222         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8223         of the expression resolve mechanism, because that will catch the
8224         SimpleName error failures.
8225
8226         (Conditional): If we can not resolve the
8227         expression, return, do not crash.
8228
8229 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8230
8231         * cs-tokenizer.cs:
8232         (location): display token name instead of its number.
8233
8234 2002-08-28  Martin Baulig  <martin@gnome.org>
8235
8236         * expression.cs (Binary.ResolveOperator): Don't silently return
8237         but return an error if an operator cannot be applied between two
8238         enum types.
8239
8240 2002-08-28  Martin Baulig  <martin@gnome.org>
8241
8242         * class.cs (Constructor.Define): Set the permission attributes
8243         correctly instead of making all constructors public.
8244
8245 2002-08-28  Martin Baulig  <martin@gnome.org>
8246
8247         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8248         for private members before reporting a CS0103; if we find anything,
8249         it's a CS0122.
8250
8251 2002-08-28  Martin Baulig  <martin@gnome.org>
8252
8253         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8254         to check whether `closure_start_type == closure_invocation_type',
8255         we also need to check whether `m.DeclaringType == closure_invocation_type'
8256         before bypassing the permission checks.  We might be accessing
8257         protected/private members from the base class.
8258         (TypeManager.RealMemberLookup): Only set private_ok if private
8259         members were requested via BindingFlags.NonPublic.
8260
8261         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8262
8263         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8264         MethodGroupExpr.IsExplicitImpl if appropriate.
8265         (Invocation.DoResolve): Don't report the CS0120 for explicit
8266         interface implementations.
8267
8268 2002-08-27  Martin Baulig  <martin@gnome.org>
8269
8270         * expression.cs (Invocation.DoResolve): If this is a static
8271         method and we don't have an InstanceExpression, we must report
8272         a CS0120.
8273
8274 2002-08-25  Martin Baulig  <martin@gnome.org>
8275
8276         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8277         `==' between a valuetype and an object.
8278
8279 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8280
8281         * ecore.cs (TypeExpr): Provide a ToString method.
8282
8283 2002-08-24  Martin Baulig  <martin@gnome.org>
8284
8285         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8286         now called proggie.dbg and it's a binary file.
8287
8288 2002-08-23  Martin Baulig  <martin@gnome.org>
8289
8290         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8291
8292 2002-08-23  Martin Baulig  <martin@gnome.org>
8293
8294         * struct.cs (MyStructInfo.ctor): Make this work with empty
8295         structs; it's not allowed to use foreach() on null.
8296
8297 2002-08-23  Martin Baulig  <martin@gnome.org>
8298
8299         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8300         writer the full pathname of the generated assembly.
8301
8302 2002-08-23  Martin Baulig  <martin@gnome.org>
8303
8304         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8305         A `finally' block never returns or breaks; improved handling of
8306         unreachable code.
8307
8308 2002-08-23  Martin Baulig  <martin@gnome.org>
8309
8310         * statement.cs (Throw.Resolve): Allow `throw null'.
8311
8312 2002-08-23  Martin Baulig  <martin@gnome.org>
8313
8314         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8315         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8316         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8317         MemberLookup would return a wrong event if this is an explicit
8318         interface implementation and the class has an event with the same
8319         name.
8320
8321 2002-08-23  Martin Baulig  <martin@gnome.org>
8322
8323         * statement.cs (Block.AddChildVariableNames): New public method.
8324         (Block.AddChildVariableName): Likewise.
8325         (Block.IsVariableNameUsedInChildBlock): Likewise.
8326         (Block.AddVariable): Check whether a variable name has already
8327         been used in a child block.
8328
8329         * cs-parser.jay (declare_local_variables): Mark all variable names
8330         from the current block as being used in a child block in the
8331         implicit block.
8332
8333 2002-08-23  Martin Baulig  <martin@gnome.org>
8334
8335         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
8336         find the symbol writer.
8337
8338         * driver.cs: csc also allows the arguments to /define being
8339         separated by commas, not only by semicolons.
8340
8341 2002-08-23  Martin Baulig  <martin@gnome.org>
8342
8343         * interface.cs (Interface.GetMembers): Added static check for events.
8344
8345 2002-08-15  Martin Baulig  <martin@gnome.org>
8346
8347         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
8348         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
8349
8350         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8351         why the MethodData.EmitDestructor() change was necessary.
8352
8353 2002-08-20  Martin Baulig  <martin@gnome.org>
8354
8355         * class.cs (TypeContainer.FindMembers): Added static check for events.
8356
8357         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8358
8359         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8360         use Type.GetEvents(), not Type.FindMembers().
8361
8362 2002-08-20  Martin Baulig  <martin@gnome.org>
8363
8364         * decl.cs (MemberCache): Added a special method cache which will
8365         be used for method-only searched.  This ensures that a method
8366         search will return a MethodInfo with the correct ReflectedType for
8367         inherited methods.      
8368
8369 2002-08-20  Martin Baulig  <martin@gnome.org>
8370
8371         * decl.cs (DeclSpace.FindMembers): Made this public.
8372
8373 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8374
8375         * delegate.cs: fixed build on windows.
8376         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8377
8378 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8379
8380         * ecore.cs (StandardConversionExists): Return a false
8381         if we are trying to convert the void type to anything else
8382         since that is not allowed.
8383
8384         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8385         we flag error 70 in the event an event is trying to be accessed
8386         directly from outside the declaring type.
8387
8388 2002-08-20  Martin Baulig  <martin@gnome.org>
8389
8390         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8391         MemberCache from typemanager.cs to decl.cs.
8392
8393 2002-08-19  Martin Baulig  <martin@gnome.org>
8394
8395         * class.cs (TypeContainer): Implement IMemberContainer.
8396         (TypeContainer.DefineMembers): Create the MemberCache.
8397         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8398         return public members if BindingFlags.Public was given, check
8399         whether members are static.
8400
8401 2002-08-16  Martin Baulig  <martin@gnome.org>
8402
8403         * decl.cs (DeclSpace.Define): Splitted this in Define and
8404         DefineMembers.  DefineMembers is called first and initializes the
8405         MemberCache.
8406
8407         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8408         DefineMembers() on all our DeclSpaces.
8409
8410         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8411         but call DefineMembers() on all nested interfaces.  We call their
8412         Define() in our new Define() function.
8413
8414         * interface.cs (Interface): Implement IMemberContainer.
8415         (Interface.Define): Moved all code except the attribute stuf to
8416         DefineMembers().
8417         (Interface.DefineMembers): Initialize the member cache.
8418
8419         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8420         need this anymore since we can use MemberCache.FindMembers directly.
8421
8422 2002-08-19  Martin Baulig  <martin@gnome.org>
8423
8424         * typemanager.cs (MemberCache): When creating the cache for an
8425         interface type, add all inherited members.
8426         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8427         to `out bool used_cache' and documented it.
8428         (TypeManager.MemberLookup): If we already used the cache in the first
8429         iteration, we don't need to do the interfaces check.
8430
8431 2002-08-19  Martin Baulig  <martin@gnome.org>
8432
8433         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8434         here from IMemberFinder and don't implement this interface anymore.
8435         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8436
8437         * typemanager.cs (IMemberFinder): This interface is now only used by
8438         classes which actually support the member cache.
8439         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8440         since we only put DeclSpaces into this Hashtable.
8441         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8442         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8443
8444 2002-08-16  Martin Baulig  <martin@gnome.org>
8445
8446         * typemanager.cs (ICachingMemberFinder): Removed.
8447         (IMemberFinder.MemberCache): New property.
8448         (TypeManager.FindMembers): Merged this with RealFindMembers().
8449         This function will never be called from TypeManager.MemberLookup()
8450         so we can't use the cache here, just the IMemberFinder.
8451         (TypeManager.MemberLookup_FindMembers): Check whether the
8452         IMemberFinder has a MemberCache and call the cache's FindMembers
8453         function.
8454         (MemberCache): Rewrote larger parts of this yet another time and
8455         cleaned it up a bit.
8456
8457 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8458
8459         * driver.cs (LoadArgs): Support quoting.
8460
8461         (Usage): Show the CSC-like command line arguments.
8462
8463         Improved a few error messages.
8464
8465 2002-08-15  Martin Baulig  <martin@gnome.org>
8466
8467         * typemanager.cs (IMemberContainer.Type): New property.
8468         (IMemberContainer.IsInterface): New property.
8469
8470         The following changes are conditional to BROKEN_RUNTIME, which is
8471         defined at the top of the file.
8472
8473         * typemanager.cs (MemberCache.MemberCache): Don't add the base
8474         class'es members, but add all members from TypeHandle.ObjectType
8475         if we're an interface.
8476         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
8477         is the current type.
8478         (MemberCache.CacheEntry.Container): Removed this field.
8479         (TypeHandle.GetMembers): Include inherited members.
8480
8481 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8482
8483         * typemanager.cs: fixed compilation and added a comment on a field that
8484         is never used.
8485
8486 2002-08-15  Martin Baulig  <martin@gnome.org>
8487
8488         * class.cs (ConstructorInitializer.Resolve): In the
8489         Expression.MemberLookup call, use the queried_type as
8490         invocation_type.
8491
8492         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
8493         declared' attribute, it's always true.
8494         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
8495         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
8496         temporary wrapper for FindMembers which tells MemberLookup whether
8497         members from the base classes are included in the return value.
8498         This will go away soon.
8499         (TypeManager.MemberLookup): Use this temporary hack here; once the
8500         new MemberCache is completed, we don't need to do the DeclaredOnly
8501         looping here anymore since the MemberCache will take care of this.
8502         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
8503         (MemberCache): When creating the MemberCache for a class, get
8504         members from the current class and all its base classes.
8505         (MemberCache.CacheEntry.Container): New field.  This is a
8506         temporary hack until the Mono runtime is fixed to distinguish
8507         between ReflectedType and DeclaringType.  It allows us to use MCS
8508         with both the MS runtime and the unfixed Mono runtime without
8509         problems and without accecting performance.
8510         (MemberCache.SearchMembers): The DeclaredOnly looping from
8511         TypeManager.MemberLookup is now done here.      
8512
8513 2002-08-14  Martin Baulig  <martin@gnome.org>
8514
8515         * statement.cs (MyStructInfo.MyStructInfo): Don't call
8516         Type.GetFields on dynamic types but get the fields from the
8517         corresponding TypeContainer.
8518         (MyStructInfo.GetStructInfo): Added check for enum types.
8519
8520         * typemanager.cs (MemberList.IsSynchronized): Implemented.
8521         (MemberList.SyncRoot): Implemented.
8522         (TypeManager.FilterWithClosure): No need to check permissions if
8523         closure_start_type == closure_invocation_type, don't crash if
8524         closure_invocation_type is null.
8525
8526 2002-08-13  Martin Baulig  <martin@gnome.org>
8527
8528         Rewrote TypeContainer.FindMembers to use a member cache.  This
8529         gives us a speed increase of about 35% for the self-hosting MCS
8530         build and of about 15-20% for the class libs (both on GNU/Linux).
8531
8532         * report.cs (Timer): New class to get enhanced profiling.  This
8533         whole class is "TIMER" conditional since it remarkably slows down
8534         compilation speed.
8535
8536         * class.cs (MemberList): New class.  This is an IList wrapper
8537         which we're now using instead of passing MemberInfo[]'s around to
8538         avoid copying this array unnecessarily.
8539         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
8540         (ICachingMemberFinder, IMemberContainer): New interface.
8541         (TypeManager.FilterWithClosure): If `criteria' is null, the name
8542         has already been checked, otherwise use it for the name comparision.
8543         (TypeManager.FindMembers): Renamed to RealMemberFinder and
8544         provided wrapper which tries to use ICachingMemberFinder.FindMembers
8545         if possible.  Returns a MemberList, not a MemberInfo [].
8546         (TypeHandle): New class, implements IMemberContainer.  We create
8547         one instance of this class per type, it contains a MemberCache
8548         which is used to do the member lookups.
8549         (MemberCache): New class.  Each instance of this class contains
8550         all members of a type and a name-based hash table.
8551         (MemberCache.FindMembers): This is our new member lookup
8552         function.  First, it looks up all members of the requested name in
8553         the hash table.  Then, it walks this list and sorts out all
8554         applicable members and returns them.
8555
8556 2002-08-13  Martin Baulig  <martin@gnome.org>
8557
8558         In addition to a nice code cleanup, this gives us a performance
8559         increase of about 1.4% on GNU/Linux - not much, but it's already
8560         half a second for the self-hosting MCS compilation.
8561
8562         * typemanager.cs (IMemberFinder): New interface.  It is used by
8563         TypeManager.FindMembers to call FindMembers on a TypeContainer,
8564         Enum, Delegate or Interface.
8565         (TypeManager.finder_to_member_finder): New PtrHashtable.
8566         (TypeManager.finder_to_container): Removed.
8567         (TypeManager.finder_to_delegate): Removed.
8568         (TypeManager.finder_to_interface): Removed.
8569         (TypeManager.finder_to_enum): Removed.
8570
8571         * interface.cs (Interface): Implement IMemberFinder.
8572
8573         * delegate.cs (Delegate): Implement IMemberFinder.
8574
8575         * enum.cs (Enum): Implement IMemberFinder.
8576
8577         * class.cs (TypeContainer): Implement IMemberFinder.
8578
8579 2002-08-12  Martin Baulig  <martin@gnome.org>
8580
8581         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
8582
8583 2002-08-12  Martin Baulig  <martin@gnome.org>
8584
8585         * ecore.cs (ITypeExpression): New interface for expressions which
8586         resolve to a type.
8587         (TypeExpression): Renamed to TypeLookupExpression.
8588         (Expression.DoResolve): If we're doing a types-only lookup, the
8589         expression must implement the ITypeExpression interface and we
8590         call DoResolveType() on it.
8591         (SimpleName): Implement the new ITypeExpression interface.
8592         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
8593         hack, the situation that we're only looking up types can't happen
8594         anymore when this method is called.  Moved the type lookup code to
8595         DoResolveType() and call it.
8596         (SimpleName.DoResolveType): This ITypeExpression interface method
8597         is now doing the types-only lookup.
8598         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
8599         (ResolveFlags): Added MaskExprClass.
8600
8601         * expression.cs (MemberAccess): Implement the ITypeExpression
8602         interface.
8603         (MemberAccess.DoResolve): Added support for a types-only lookup
8604         when we're called via ITypeExpression.DoResolveType().
8605         (ComposedCast): Implement the ITypeExpression interface.
8606
8607         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
8608         Expression.Resolve() with ResolveFlags.Type instead.
8609
8610 2002-08-12  Martin Baulig  <martin@gnome.org>
8611
8612         * interface.cs (Interface.Define): Apply attributes.
8613
8614         * attribute.cs (Attribute.ApplyAttributes): Added support for
8615         interface attributes.
8616
8617 2002-08-11  Martin Baulig  <martin@gnome.org>
8618
8619         * statement.cs (Block.Emit): Only check the "this" variable if we
8620         do not always throw an exception.
8621
8622         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
8623         whether the property has a set accessor.
8624
8625 2002-08-11  Martin Baulig  <martin@gnome.org>
8626
8627         Added control flow analysis support for structs.
8628
8629         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
8630         with control flow analysis turned off.
8631         (IVariable): New interface.
8632         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
8633         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
8634         (FieldExpr.DoResolve): Resolve the instance expression with flow
8635         analysis turned off and do the definite assignment check after the
8636         resolving when we know what the expression will resolve to.
8637
8638         * expression.cs (LocalVariableReference, ParameterReference):
8639         Implement the new IVariable interface, only call the flow analysis
8640         code if ec.DoFlowAnalysis is true.
8641         (This): Added constructor which takes a Block argument.  Implement
8642         the new IVariable interface.
8643         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
8644         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
8645         This does the definite assignment checks for struct members.
8646
8647         * class.cs (Constructor.Emit): If this is a non-static `struct'
8648         constructor which doesn't have any initializer, call
8649         Block.AddThisVariable() to tell the flow analysis code that all
8650         struct elements must be initialized before control returns from
8651         the constructor.
8652
8653         * statement.cs (MyStructInfo): New public class.
8654         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
8655         argument to this indexer.  If non-zero, check an individual struct
8656         member, not the whole struct.
8657         (FlowBranching.CheckOutParameters): Check struct members.
8658         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
8659         overloaded versions of these methods which take an additional
8660         `int field_idx' argument to check struct members.
8661         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
8662         overloaded versions of these methods which take an additional
8663         `string field_name' argument to check struct member.s
8664         (VariableInfo): Implement the IVariable interface.
8665         (VariableInfo.StructInfo): New public property.  Returns the
8666         MyStructInfo instance of the variable if it's a struct or null.
8667         (Block.AddThisVariable): New public method.  This is called from
8668         Constructor.Emit() for non-static `struct' constructor which do
8669         not have any initializer.  It creates a special variable for the
8670         "this" instance variable which will be checked by the flow
8671         analysis code to ensure that all of the struct's fields are
8672         initialized before control returns from the constructor.
8673         (UsageVector): Added support for struct members.  If a
8674         variable/parameter is a struct with N members, we reserve a slot
8675         in the usage vector for each member.  A struct is considered fully
8676         initialized if either the struct itself (slot 0) or all its
8677         members are initialized.
8678
8679 2002-08-08  Martin Baulig  <martin@gnome.org>
8680
8681         * driver.cs (Driver.MainDriver): Only report an error CS5001
8682         if there were no compilation errors.
8683
8684         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
8685         `UnsafeContext' property to determine whether the parent is in
8686         unsafe context rather than checking the parent's ModFlags:
8687         classes nested in an unsafe class are unsafe as well.
8688
8689 2002-08-08  Martin Baulig  <martin@gnome.org>
8690
8691         * statement.cs (UsageVector.MergeChildren): Distinguish between
8692         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
8693         we return.  Added test17() and test18() to test-154.cs.
8694
8695 2002-08-08  Martin Baulig  <martin@gnome.org>
8696
8697         * typemanager.cs (TypeManager.FilterWithClosure): If we have
8698         Family access, make sure the invoking type isn't a subclass of the
8699         queried type (that'd be a CS1540).
8700
8701         * ecore.cs (Expression.MemberLookup): Added overloaded version of
8702         this method which takes an additional `Type invocation_type'.
8703
8704         * expression.cs (BaseAccess.DoResolve): Use the base type as
8705         invocation and query type.
8706         (MemberAccess.DoResolve): If the lookup failed and we're about to
8707         report a CS0122, try a lookup with the ec.ContainerType - if this
8708         succeeds, we must report a CS1540.
8709
8710 2002-08-08  Martin Baulig  <martin@gnome.org>
8711
8712         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
8713         (MethodGroupExpr): Implement the IMemberExpr interface.
8714
8715         * expression (MemberAccess.ResolveMemberAccess): No need to have
8716         any special code for MethodGroupExprs anymore, they're now
8717         IMemberExprs.   
8718
8719 2002-08-08  Martin Baulig  <martin@gnome.org>
8720
8721         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
8722         Family, FamANDAssem and FamORAssem permissions.
8723         (TypeManager.IsSubclassOrNestedChildOf): New public method.
8724
8725 2002-08-08  Martin Baulig  <martin@gnome.org>
8726
8727         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
8728         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
8729         or loop block.
8730
8731 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
8732
8733         * driver.cs: implemented /resource option to embed managed resources.
8734
8735 2002-08-07  Martin Baulig  <martin@gnome.org>
8736
8737         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
8738         (FieldBase.HasFieldInitializer): New public property.
8739         (FieldBase.GetInitializerExpression): New public method.  Resolves and
8740         returns the field initializer and makes sure it is only resolved once.
8741         (TypeContainer.EmitFieldInitializers): Call
8742         FieldBase.GetInitializerExpression to get the initializer, this ensures
8743         that it isn't resolved multiple times.
8744
8745         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
8746         the resolving process (SimpleName/MemberLookup) that we're currently
8747         emitting a field initializer (which must not access any instance members,
8748         this is an error CS0236).
8749
8750         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
8751         argument, if the `IsFieldInitializer' flag is set, we must report and
8752         error CS0236 and not an error CS0120.   
8753
8754 2002-08-07  Martin Baulig  <martin@gnome.org>
8755
8756         * ecore.cs (IMemberExpr): New public interface.
8757         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
8758         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
8759         if the expression is an IMemberExpr.
8760
8761         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
8762         to be null, implicitly default to `this' if we're non-static in
8763         this case.  Simplified the code a lot by using the new IMemberExpr
8764         interface.  Also fixed bug #28176 here.
8765
8766 2002-08-06  Martin Baulig  <martin@gnome.org>
8767
8768         * cs-parser.jay (SimpleLookup): Removed.  We need to create
8769         ParameterReferences during semantic analysis so that we can do a
8770         type-only search when resolving Cast, TypeOf and SizeOf.
8771         (block): Pass the `current_local_parameters' to the Block's
8772         constructor.
8773
8774         * class.cs (ConstructorInitializer): Added `Parameters parameters'
8775         argument to the constructor.
8776         (ConstructorInitializer.Resolve): Create a temporary implicit
8777         block with the parameters.
8778
8779         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
8780         references here if we aren't doing a type-only search.
8781
8782         * statement.cs (Block): Added constructor which takes a
8783         `Parameters parameters' argument.
8784         (Block.Parameters): New public property.
8785
8786         * support.cs (InternalParameters.Parameters): Renamed `parameters'
8787         to `Parameters' and made it public readonly.
8788
8789 2002-08-06  Martin Baulig  <martin@gnome.org>
8790
8791         * ecore.cs (Expression.Warning): Made this public as well.
8792
8793         * report.cs (Report.Debug): Print the contents of collections.
8794
8795 2002-08-06  Martin Baulig  <martin@gnome.org>
8796
8797         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
8798         used to tell Resolve() which kinds of expressions it may return.
8799         (Expression.Resolve): Added overloaded version of this method which
8800         takes a `ResolveFlags flags' argument.  This can be used to tell
8801         Resolve() which kinds of expressions it may return.  Reports a
8802         CS0118 on error.
8803         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
8804         ResolveFlags.SimpleName.
8805         (Expression.Error118): Added overloaded version of this method which
8806         takes a `ResolveFlags flags' argument.  It uses the flags to determine
8807         which kinds of expressions are allowed.
8808
8809         * expression.cs (Argument.ResolveMethodGroup): New public method.
8810         Resolves an argument, but allows a MethodGroup to be returned.
8811         This is used when invoking a delegate.
8812
8813         * TODO: Updated a bit.
8814
8815 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8816
8817         Fixed compilation with csc.
8818
8819         * ecore.cs: Expression.Error made public. Is this correct? Should
8820         Warning be made public too?
8821
8822         * expression.cs: use ea.Location instead of ea.loc.
8823         [FIXME:  Filed as bug #28607: MCS must report these errors.]
8824
8825 2002-08-06  Martin Baulig  <martin@gnome.org>
8826
8827         * ecore.cs (Expression.loc): Moved the location here instead of
8828         duplicating it in all derived classes.
8829         (Expression.Location): New public property.
8830         (Expression.Error, Expression.Warning): Made them non-static and
8831         removed the location argument.
8832         (Expression.Warning): Added overloaded version which takes an
8833         `int level' argument.
8834         (Expression.Error118): Make this non-static and removed the
8835         expression and location arguments.
8836         (TypeExpr): Added location argument to the constructor.
8837
8838         * expression.cs (StaticCallExpr): Added location argument to
8839         the constructor.
8840         (Indirection, PointerArithmetic): Likewise.
8841         (CheckedExpr, UnCheckedExpr): Likewise.
8842         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
8843         (StringPtr): Likewise.
8844
8845
8846 2002-08-05  Martin Baulig  <martin@gnome.org>
8847
8848         * expression.cs (BaseAccess.DoResolve): Actually report errors.
8849
8850         * assign.cs (Assign.DoResolve): Check whether the source
8851         expression is a value or variable.
8852
8853         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
8854         while resolving the corresponding blocks.
8855
8856         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
8857         an error, don't silently return null.
8858
8859         * statement.cs (Block.AddVariable): Do the error reporting here
8860         and distinguish between CS0128 and CS0136.
8861         (Block.DoResolve): Report all unused labels (warning CS0164).
8862         (LabeledStatement): Pass the location to the constructor.
8863         (LabeledStatement.HasBeenReferenced): New property.
8864         (LabeledStatement.Resolve): Set it to true here.
8865
8866         * statement.cs (Return.Emit): Return success even after reporting
8867         a type mismatch error (CS0126 or CS0127), this is what csc does and
8868         it avoids confusing the users with any consecutive errors.
8869
8870 2002-08-05  Martin Baulig  <martin@gnome.org>
8871
8872         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
8873
8874         * const.cs (Const.LookupConstantValue): Catch circular definitions.
8875
8876         * expression.cs (MemberAccess.DoResolve): Silently return if an
8877         error has already been reported.
8878
8879         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
8880         error has already been reported.
8881
8882 2002-08-05  Martin Baulig  <martin@gnome.org>
8883
8884         * statement.cs (UsageVector): Only initialize the `parameters'
8885         vector if we actually have any "out" parameters.
8886
8887 2002-08-05  Martin Baulig  <martin@gnome.org>
8888
8889         * expression.cs (Binary.ResolveOperator): When combining delegates,
8890         they must have the same type.
8891
8892 2002-08-05  Martin Baulig  <martin@gnome.org>
8893
8894         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
8895         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
8896         work with the ms runtime and we also don't need it: if we're a
8897         PropertyBuilder and not in the `indexer_arguments' hash, then we
8898         are a property and not an indexer.
8899
8900         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
8901         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
8902         since the latter one doesn't work with the ms runtime.
8903
8904 2002-08-03  Martin Baulig  <martin@gnome.org>
8905
8906         Fixed bugs #27998 and #22735.
8907
8908         * class.cs (Method.IsOperator): New public field.
8909         (Method.CheckBase): Report CS0111 if there's already a method
8910         with the same parameters in the current class.  Report CS0508 when
8911         attempting to change the return type of an inherited method.
8912         (MethodData.Emit): Report CS0179 if a method doesn't have a body
8913         and it's not marked abstract or extern.
8914         (PropertyBase): New abstract base class for Property and Indexer.
8915         (PropertyBase.CheckBase): Moved here from Property and made it work
8916         for indexers.
8917         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
8918         the same so we can reuse it there.
8919         (Property, Indexer): Derive from PropertyBase.
8920         (MethodSignature.inheritable_property_signature_filter): New delegate
8921         to find properties and indexers.
8922
8923         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
8924         argument and improved error reporting.
8925
8926         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
8927         EmptyReadOnlyParameters and made it a property.
8928
8929         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
8930         version of this method which takes a `PropertyInfo indexer'.
8931         (TypeManager.RegisterIndexer): New method.
8932
8933         * class.cs: Added myself as author of this file :-)
8934
8935 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8936
8937         * class.cs: fixed compilation on windoze.
8938
8939 2002-08-03  Martin Baulig  <martin@gnome.org>
8940
8941         * interface.cs (Interface.GetInterfaceBases): Check whether all
8942         base interfaces are at least as accessible than the current one.
8943
8944         * class.cs (TypeContainer.GetClassBases): Check whether base types
8945         are at least as accessible than the current type.
8946         (TypeContainer.AsAccessible): Implemented and made non-static.
8947         (MemberBase.CheckParameters): Report errors if the accessibility
8948         checks fail.
8949
8950         * delegate.cs (Delegate.Delegate): The default visibility is
8951         internal for top-level types and private for nested types.
8952         (Delegate.Define): Report errors if the accessibility checks fail.
8953
8954         * enum.cs (Enum.Enum): The default visibility is internal for
8955         top-level types and private for nested types.
8956         (Enum.DefineType): Compute the correct visibility.
8957
8958         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
8959         function which takes a `bool is_toplevel' instead of a TypeContainer.
8960
8961         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
8962         builtin type.
8963
8964 2002-08-02  Martin Baulig  <martin@gnome.org>
8965
8966         * expression.cs (LocalVariableReferenc): Added constructor which
8967         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
8968         (LocalVariableReference.IsReadOnly): New property.
8969         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
8970         variable is readonly, use our own readonly flag to do this; you can
8971         use the new constructor to get a writable reference to a read-only
8972         variable.
8973
8974         * cs-parser.jay (foreach_statement, using_statement): Get a writable
8975         reference to the local variable.
8976
8977 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
8978
8979         * rootcontext.cs (ResolveCore): Also include System.Exception
8980
8981         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
8982         we reach an EmptyStatement.
8983
8984         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
8985         is also fine.
8986
8987         * expression.cs (Binary.ResolveOperator): Check error result in
8988         two places.
8989
8990         use brtrue/brfalse directly and avoid compares to null.
8991
8992 2002-08-02  Martin Baulig  <martin@gnome.org>
8993
8994         * class.cs (TypeContainer.Define): Define all nested interfaces here.
8995         Fixes bug #28407, added test-155.cs.
8996
8997 2002-08-01  Martin Baulig  <martin@gnome.org>
8998
8999         * class.cs (Event.EmitDefaultMethod): Make this work with static
9000         events.  Fixes #28311, added verify-3.cs.
9001
9002 2002-08-01  Martin Baulig  <martin@gnome.org>
9003
9004         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9005         `is_disposable' fields.
9006         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9007         `hm.is_disposable' if we're using the collection pattern.
9008         (Foreach.EmitCollectionForeach): Use the correct type for the
9009         enumerator's local variable, only emit the try/finally block if
9010         necessary (fixes #27713).
9011
9012 2002-08-01  Martin Baulig  <martin@gnome.org>
9013
9014         * ecore.cs (Expression.report118): Renamed to Error118 and made
9015         it public static.
9016
9017         * statement.cs (Throw.Resolve): Check whether the expression is of
9018         the correct type (CS0118) and whether the type derives from
9019         System.Exception (CS0155).
9020         (Catch.Resolve): New method.  Do the type lookup here and check
9021         whether it derives from System.Exception (CS0155).
9022         (Catch.CatchType, Catch.IsGeneral): New public properties.
9023
9024         * typemanager.cs (TypeManager.exception_type): Added.
9025
9026 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9027
9028         * driver.cs: Updated About function.
9029
9030 2002-07-31  Martin Baulig  <martin@gnome.org>
9031
9032         Implemented Control Flow Analysis.
9033
9034         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9035         (EmitContext.CurrentBranching): Added.
9036         (EmitContext.StartFlowBranching): Added.
9037         (EmitContext.EndFlowBranching): Added.
9038         (EmitContext.KillFlowBranching): Added.
9039         (EmitContext.IsVariableAssigned): Added.
9040         (EmitContext.SetVariableAssigned): Added.
9041         (EmitContext.IsParameterAssigned): Added.
9042         (EmitContext.SetParameterAssigned): Added.
9043         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9044         Added control flow analysis stuff here.
9045
9046         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9047         resolve the expression as lvalue.
9048         (LocalVariableReference.DoResolve): Check whether the variable has
9049         already been assigned.
9050         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9051         the parameter as assigned here.
9052         (ParameterReference.DoResolve): Check whether the parameter has already
9053         been assigned.
9054         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9055         expression as lvalue.
9056
9057         * statement.cs (FlowBranching): New class for the flow analysis code.
9058         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9059         (LabeledStatement.IsDefined): New public property.
9060         (LabeledStatement.AddUsageVector): New public method to tell flow
9061         analyis that the label may be reached via a forward jump.
9062         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9063         flow analysis.
9064         (VariableInfo.Number): New public field.  This is used by flow analysis
9065         to number all locals of a block.
9066         (Block.CountVariables): New public property.  This is the number of
9067         local variables in this block (including the locals from all parent
9068         blocks).
9069         (Block.EmitMeta): Number all the variables.
9070
9071         * statement.cs: Added flow analysis support to all classes.
9072
9073 2002-07-31  Martin Baulig  <martin@gnome.org>
9074
9075         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9076         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9077         then use this argument.
9078
9079         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9080
9081         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9082         use this to specify /define options.
9083
9084 2002-07-29  Martin Baulig  <martin@gnome.org>
9085
9086         * statement.cs (Fixed): Moved all code that does variable lookups
9087         and resolvings from Emit to Resolve.
9088
9089         * statement.cs (For): Moved all code that does variable lookups
9090         and resolvings from Emit to Resolve.
9091
9092         * statement.cs (Using): Moved all code that does variable lookups
9093         and resolvings from Emit to Resolve.
9094
9095 2002-07-29  Martin Baulig  <martin@gnome.org>
9096
9097         * attribute.cs (Attribute.Resolve): Explicitly catch a
9098         System.NullReferenceException when creating the
9099         CustromAttributeBuilder and report a different warning message.
9100
9101 2002-07-29  Martin Baulig  <martin@gnome.org>
9102
9103         * support.cs (ParameterData.ParameterName): Added method to
9104         get the name of a parameter.
9105
9106         * typemanager.cs (TypeManager.IsValueType): New public method.
9107
9108 2002-07-29  Martin Baulig  <martin@gnome.org>
9109
9110         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9111         is a flag which specifies that it's either ref or out.
9112         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9113         the out parameter to `out Parameter.Modifier mod', also set the
9114         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9115
9116         * support.cs (InternalParameters.ParameterModifier): Distinguish
9117         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9118         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9119
9120         * expression.cs (Argument.GetParameterModifier): Distinguish
9121         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9122         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9123
9124 2002-07-29  Martin Baulig  <martin@gnome.org>
9125
9126         * expression.cs (ParameterReference.ParameterReference): Added
9127         `Location loc' argument to the constructor.
9128
9129         * cs-parser.jay: Pass location to ParameterReference.
9130
9131 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9132
9133         * statement.cs (Try): Initialize the location.
9134
9135         * cs-parser.jay: pass location to Try.
9136
9137         * expression.cs (Unary.Reduce): Change the prototype to return
9138         whether a constant fold could be performed or not.  The result is
9139         returned in an out parameters.  In the case of Indirection and
9140         AddressOf, we want to perform the full tests.
9141
9142 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9143
9144         * statement.cs (Statement.Emit): Flag dead code.
9145
9146 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9147
9148         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9149
9150 2002-07-27  Martin Baulig  <martin@gnome.org>
9151
9152         * class.cs (MethodData.Define): Put back call to
9153         TypeManager.AddMethod(), accidentally commented this out.
9154
9155         * report.cs (Debug): New public method to print debugging information,
9156         this is `[Conditional ("DEBUG")]'.
9157
9158 2002-07-26  Martin Baulig  <martin@gnome.org>
9159
9160         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9161         (switch_statement): Push the current_block to the switch_stack and
9162         pop it again when we're done with the switch.
9163         (switch_section): The new block is a child of the current_block.
9164         Fixes bug #24007, added test-152.cs.
9165
9166 2002-07-27  Martin Baulig  <martin@gnome.org>
9167
9168         * expression.cs (Invocation.EmitArguments): When calling a varargs
9169         function with only its fixed arguments, we need to pass an empty
9170         array.
9171
9172 2002-07-27  Martin Baulig  <martin@gnome.org>
9173
9174         Mono 0.13 has been released.
9175
9176 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9177
9178         * driver.cs: Rename --resource to --linkres, because that is what
9179         we do currently, we dont support --resource yet.
9180
9181         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9182
9183 2002-07-25  Martin Baulig  <martin@gnome.org>
9184
9185         * class.cs (MethodData): New public class.  This is a `method builder'
9186         class for a method or one accessor of a Property/Indexer/Event.
9187         (MethodData.GetMethodFlags): Moved here from MemberBase.
9188         (MethodData.ApplyAttributes): Likewise.
9189         (MethodData.ApplyObsoleteAttribute): Likewise.
9190         (MethodData.ApplyConditionalAttribute): Likewise.
9191         (MethodData.ApplyDllImportAttribute): Likewise.
9192         (MethodData.CheckAbstractAndExternal): Likewise.
9193         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9194         (MethodData.Emit): Formerly known as Method.Emit().
9195         (MemberBase): Moved everything which was specific to a single
9196         accessor/method to MethodData.
9197         (Method): Create a new MethodData and call Define() and Emit() on it.
9198         (Property, Indexer, Event): Create a new MethodData objects for each
9199         accessor and call Define() and Emit() on them.
9200
9201 2002-07-25  Martin Baulig  <martin@gnome.org>
9202
9203         Made MethodCore derive from MemberBase to reuse the code from there.
9204         MemberBase now also checks for attributes.
9205
9206         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9207         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9208         as virtual.
9209         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9210         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9211         (MemberBase.ApplyAttributes): New virtual method; applies the
9212         attributes to a method or accessor.
9213         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9214         (MemberBase.ApplyConditionalAttribute): Likewise.
9215         (MemberBase.ApplyDllImportAttribute): Likewise.
9216         (MemberBase.CheckAbstractAndExternal): Likewise.
9217         (MethodCore.ParameterTypes): This is now a property instead of a
9218         method, it's initialized from DoDefineParameters().
9219         (MethodCore.ParameterInfo): Removed the set accessor.
9220         (MethodCore.DoDefineParameters): New protected virtual method to
9221         initialize ParameterTypes and ParameterInfo.
9222         (Method.GetReturnType): We can now simply return the MemberType.
9223         (Method.GetMethodFlags): Override the MemberBase version and add
9224         the conditional flags.
9225         (Method.CheckBase): Moved some code from Define() here, call
9226         DoDefineParameters() here.
9227         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9228         here to avoid some larger code duplication.
9229         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9230         ensure that abstract and external accessors don't declare a body.
9231
9232         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9233         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9234         lookup in the attribute's parent classes, so we need to abort as soon
9235         as we found the first match.
9236         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9237         the attribute has no arguments.
9238
9239         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9240         of a Method.
9241
9242 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9243
9244         * cs-parser.jay: reverted previous patch.
9245
9246 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9247
9248         * cs-parser.jay: fixed bug #22119.
9249
9250 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9251
9252         * attribute.cs: fixed compilation. The error was:
9253         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9254         be assigned to before control leaves the current method."
9255         [FIXME:  Filed as bug #28186: MCS must report this error.]
9256
9257 2002-07-25  Martin Baulig  <martin@gnome.org>
9258
9259         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9260         method to pull the condition name ouf of a Conditional attribute.
9261         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9262         the obsolete message and error flag out of an Obsolete attribute.
9263
9264         * class.cs (Method.GetMethodFlags): New public method to get the
9265         TypeManager.MethodFlags for this method.
9266         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9267         private methods.
9268         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9269         if we're overriding a virtual function, set the new private variable
9270         `parent_method'; call the new TypeManager.AddMethod().
9271
9272         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9273         the MethodBuilder and the Method in a PtrHashtable.
9274         (TypeManager.builder_to_method): Added for this purpose.
9275         (TypeManager.MethodFlags): Added IsObsoleteError.
9276         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9277         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9278         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9279         the message from the attribute.
9280
9281 2002-07-24  Martin Baulig  <martin@gnome.org>
9282
9283         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9284         preprocessor directives, ensure that the argument to #define/#undef is
9285         exactly one identifier and that it's actually an identifier.
9286
9287         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9288         did not work ....
9289
9290 2002-07-24  Martin Baulig  <martin@gnome.org>
9291
9292         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9293         initialize it to TypeManager.object_type in the constructor.
9294         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9295         of the `hm.get_current' method if we're using the collection pattern.
9296         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9297         for the explicit conversion to make it work when we're using the collection
9298         pattern and the `Current' property has a different return type than `object'.
9299         Fixes #27713.
9300
9301 2002-07-24  Martin Baulig  <martin@gnome.org>
9302
9303         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9304         does not match, but don't report any errors.  This method is called in
9305         order for all methods in a MethodGroupExpr until a matching method is
9306         found, so we don't want to bail out if the first method doesn't match.
9307         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9308         matches, report the 123.  Fixes #28070.
9309
9310 2002-07-24  Martin Baulig  <martin@gnome.org>
9311
9312         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9313         TypeManager.TypeToCoreType() to the top of the method so the
9314         following equality checks will work.  Fixes #28107.
9315
9316 2002-07-24  Martin Baulig  <martin@gnome.org>
9317
9318         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9319         operand is of type uint, and the other operand is of type sbyte,
9320         short or int, the operands are converted to type long." -
9321         Actually do what this comment already told us.  Fixes bug #28106,
9322         added test-150.cs.
9323
9324 2002-07-24  Martin Baulig  <martin@gnome.org>
9325
9326         * class.cs (MethodBase): New abstract class.  This is now a base
9327         class for Property, Indexer and Event to avoid some code duplication
9328         in their Define() and DefineMethods() methods.
9329         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
9330         generic methods for Define() and DefineMethods().
9331         (FieldBase): Derive from MemberBase, not MemberCore.
9332         (Property): Derive from MemberBase, not MemberCore.
9333         (Property.DefineMethod): Moved all the code from this method to the
9334         new MethodBase.DefineAccessor(), just call it with appropriate
9335         argumetnts.
9336         (Property.Define): Call the new Property.DoDefine(), this does some
9337         sanity checks and we don't need to duplicate the code everywhere.
9338         (Event): Derive from MemberBase, not MemberCore.
9339         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
9340         accessors, this will also make them work with interface events.
9341         (Indexer): Derive from MemberBase, not MemberCore.
9342         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
9343         (Indexer.Define): Use the new MethodBase functions.
9344
9345         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
9346         argument to the constructor.
9347         (Interface.FindMembers): Added support for interface events.
9348         (Interface.PopluateEvent): Implemented.
9349
9350         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9351
9352 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9353
9354         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9355         but this is required to check for a method name being the same as
9356         the containing class.  
9357
9358         Handle this now.
9359
9360 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9361
9362         * interface.cs: initialize variable.
9363
9364 2002-07-23  Martin Baulig  <martin@gnome.org>
9365
9366         Implemented the IndexerName attribute in interfaces.
9367
9368         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9369         name if this is an explicit interface implementation.
9370         (Indexer.InterfaceIndexerName): New public variable.  If we're
9371         implementing an interface indexer, this is the IndexerName in that
9372         interface.  Otherwise, it's the IndexerName.
9373         (Indexer.DefineMethod): If we're implementing interface indexer,
9374         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9375         and Pending.ImplementIndexer methods.
9376         (Indexer.Define): Also define the PropertyBuilder if we're
9377         implementing an interface indexer and this is neither an explicit
9378         interface implementation nor do the IndexerName match the one in
9379         the interface.
9380
9381         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9382         If a method is defined here, then we always need to create a proxy
9383         for it.  This is used when implementing interface indexers.
9384         (Pending.IsInterfaceIndexer): New public method.
9385         (Pending.ImplementIndexer): New public method.
9386         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9387         This is used when implementing interface indexers to define a proxy
9388         if necessary.
9389         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9390         define a proxy if necessary.
9391
9392         * interface.cs (Interface.IndexerName): New public variable.
9393         (Interface.PopulateIndexer): Set the IndexerName.
9394         (Interface.DefineIndexers): New private method.  Populate all the
9395         indexers and make sure their IndexerNames match.
9396
9397         * typemanager.cs (IndexerPropertyName): Added support for interface
9398         indexers.
9399
9400 2002-07-22  Martin Baulig  <martin@gnome.org>
9401
9402         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9403         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9404         ret if HasReturnLabel.
9405         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9406         variables.
9407
9408         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9409         and set the ec.LoopBeginTryCatchLevel.
9410         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9411         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9412         the current ec.TryCatchLevel, the branch goes out of an exception
9413         block.  In this case, we need to use Leave and not Br.
9414
9415 2002-07-22  Martin Baulig  <martin@gnome.org>
9416
9417         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9418         block unless the block does not always return or it is contained in
9419         another try { ... } catch { ... } block.  Fixes bug #26506.
9420         Added verify-1.cs to the test suite.
9421
9422 2002-07-22  Martin Baulig  <martin@gnome.org>
9423
9424         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9425         then we do not always return.  Fixes bug #24985.
9426
9427 2002-07-22  Martin Baulig  <martin@gnome.org>
9428
9429         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9430         lookup on a per-class level; ie. walk up the class hierarchy until we
9431         found at least one applicable method, then choose the best among them.
9432         Fixes bug #24463 and test-29.cs.
9433
9434 2002-07-22  Martin Baulig  <martin@gnome.org>
9435
9436         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9437         return types of the methods.  The return type is not part of the
9438         signature and we must not check it to make the `new' modifier work.
9439         Fixes bug #27999, also added test-147.cs.
9440         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9441
9442         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9443         on the method's return type.
9444
9445 2002-07-21  Martin Baulig  <martin@gnome.org>
9446
9447         * assign.cs: Make this work if the rightmost source is a constant and
9448         we need to do an implicit type conversion.  Also adding a few more tests
9449         to test-38.cs which should have caught this.
9450
9451         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9452         target in the makefile for this.  The makefile.gnu is primarily intended
9453         for end-users who don't want to debug the compiler.
9454
9455 2002-07-21  Martin Baulig  <martin@gnome.org>
9456
9457         * assign.cs: Improved the Assign class so it can now handle embedded
9458         assignments (X = Y = Z = something).  As a side-effect this'll now also
9459         consume less local variables.  test-38.cs now passes with MCS, added
9460         a few new test cases to that test.
9461
9462 2002-07-20  Martin Baulig  <martin@gnome.org>
9463
9464         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
9465         instructions.  Fixes bug #27977, also added test-146.cs.
9466
9467 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9468
9469         * cs-tokenizer.cs: fixed getHex ().
9470
9471 2002-07-19  Martin Baulig  <martin@gnome.org>
9472
9473         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
9474         not Type.GetType() to lookup the array type.  This is needed when
9475         we're constructing an array of a user-defined type.
9476         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
9477         single-dimensional arrays, but also for single-dimensial arrays of
9478         type decimal.
9479
9480 2002-07-19  Martin Baulig  <martin@gnome.org>
9481
9482         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
9483         this function is called, it's not allowed to share LocalBuilders
9484         among ILGenerators.
9485
9486 2002-07-19  Martin Baulig  <martin@gnome.org>
9487
9488         * expression.cs (Argument.Resolve): Report an error 118 when trying
9489         to pass a type as argument.
9490
9491 2002-07-18  Martin Baulig  <martin@gnome.org>
9492
9493         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
9494         Conv_R_Un for the signed `long' type.
9495
9496 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
9497
9498         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
9499         `expr' for the temporary result, as that will fail if we do
9500         multiple resolves on the same expression.
9501
9502 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
9503
9504         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
9505         ec.TypeContainer for looking up aliases. 
9506
9507         * class.cs (TypeContainer): Remove LookupAlias from here.
9508
9509         * decl.cs (DeclSpace); Move here.
9510
9511 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
9512
9513         * class.cs (FindMembers): Only call filter if the constructor
9514         bulider is not null.
9515
9516         Also handle delegates in `NestedTypes' now.  Now we will perform
9517         type lookups using the standard resolution process.  This also
9518         fixes a bug.
9519
9520         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
9521         This uses Expressions (the limited kind that can be parsed by the
9522         tree) instead of strings.
9523
9524         * expression.cs (ComposedCast.ToString): Implement, used to flag
9525         errors since now we have to render expressions.
9526
9527         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
9528         FormArrayType. 
9529
9530         * ecore.cs (SimpleName.ToString): ditto.
9531
9532         * cs-parser.jay: Instead of using strings to assemble types, use
9533         Expressions to assemble the type (using SimpleName, ComposedCast,
9534         MemberAccess).  This should fix the type lookups in declarations,
9535         because we were using a different code path for this.
9536
9537         * statement.cs (Block.Resolve): Continue processing statements
9538         even when there is an error.
9539
9540 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
9541
9542         * class.cs (Event.Define): Also remove the `remove' method from
9543         the list of pending items.
9544
9545         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
9546         generate more compact code. 
9547
9548 2002-07-17  Martin Baulig  <martin@gnome.org>
9549
9550         * const.cs (Const.LookupConstantValue): Add support for constant
9551         `unchecked' and `checked' expressions.
9552         Also adding test case test-140.cs for this.
9553
9554 2002-07-17  Martin Baulig  <martin@gnome.org>
9555
9556         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
9557         check whether mi.ReturnType implements the IEnumerator interface; the
9558         `==' and the IsAssignableFrom() will fail in this situation.
9559
9560 2002-07-16  Ravi Pratap  <ravi@ximian.com>
9561
9562         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
9563         here too.
9564
9565 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9566
9567         * expression.cs: fixed bug #27811.
9568
9569 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
9570
9571         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
9572         Molaro: when we are a ref, the value already contains a pointer
9573         value, do not take the address of it.
9574
9575 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
9576         * removed mb-parser.jay and mb-tokenizer.cs
9577
9578 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9579
9580         * expression.cs: check against the building corlib void type.
9581
9582 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
9583
9584         * ecore.cs: fix for valuetype static readonly fields: when 
9585         initializing them, we need their address, not the address of a copy.
9586
9587 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
9588
9589         * typemanager.cs: register also enum_type in corlib.
9590
9591 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9592
9593         * class.cs: allow calling this (but not base) initializers in structs.
9594
9595 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
9596
9597         * ecore.cs: make sure we compare against the building base types
9598         in GetTypeSize ().
9599
9600 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
9601
9602         * typemanager.cs: fix TypeToCoreType() to handle void and object
9603         (corlib gets no more typerefs after this change).
9604
9605 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
9606
9607         * expression.cs (ArrayCreation.EmitArrayArguments): use
9608         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
9609
9610         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
9611         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
9612         array indexes, the runtime actually forbids them.
9613
9614         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
9615         for array arguments here.
9616
9617         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
9618         instead of the default for ValueTypes.
9619
9620         (New.DoEmit): Use IsValueType instead of
9621         IsSubclassOf (value_type)
9622         (New.DoResolve): ditto.
9623         (Invocation.EmitCall): ditto.
9624
9625         * assign.cs (Assign): ditto.
9626
9627         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
9628         Statements *are* currently doing part of their resolution during
9629         Emit.  
9630
9631         Expressions do always resolve during resolve, but statements are
9632         only required to propagate resolution to their children.
9633
9634 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
9635
9636         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
9637
9638         (LoadAssembly): Do not add the dll if it is already specified
9639
9640         (MainDriver): Add the System directory to the link path at the end,
9641         after all the other -L arguments. 
9642
9643         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
9644         wrong opcode for loading bytes and bools (ldelem.i1 instead of
9645         ldelem.u1) and using the opposite for sbytes.
9646
9647         This fixes Digger, and we can finally run it.
9648
9649         * driver.cs (UnixParseOption): Move the option parsing here.  
9650         (CSCParseOption): Implement CSC-like parsing of options.
9651
9652         We now support both modes of operation, the old Unix way, and the
9653         new CSC-like way.  This should help those who wanted to make cross
9654         platform makefiles.
9655
9656         The only thing broken is that /r:, /reference: and /lib: are not
9657         implemented, because I want to make those have the same semantics
9658         as the CSC compiler has, and kill once and for all the confussion
9659         around this.   Will be doing this tomorrow.
9660
9661         * statement.cs (Unsafe.Resolve): The state is checked during
9662         resolve, not emit, so we have to set the flags for IsUnsfe here.
9663
9664 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9665
9666         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
9667         not catch the Error_ObjectRefRequired in SimpleName (as it is
9668         possible to have a class/instance variable name that later gets
9669         deambiguated), we have to check this here.      
9670
9671 2002-07-10  Ravi Pratap  <ravi@ximian.com>
9672
9673         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
9674         make static and put into Expression.
9675
9676         (Event.Define): Register the private field of the event with the 
9677         TypeManager so that GetFieldFromEvent can get at it.
9678
9679         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
9680         keep track of the private field associated with an event which
9681         has no accessors.
9682
9683         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
9684         private field.
9685
9686         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
9687
9688 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9689
9690         * expression.cs (Binary.EmitBranchable): this routine emits the
9691         Binary expression in a branchable context.  This basically means:
9692         we need to branch somewhere, not just get the value on the stack.
9693
9694         This works together with Statement.EmitBoolExpression.
9695
9696         * statement.cs (Statement.EmitBoolExpression): Use
9697         EmitBranchable. 
9698
9699 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
9700
9701         * statement.cs (For): Reduce the number of jumps in loops.
9702
9703         (For): Implement loop inversion for the For statement.
9704
9705         (Break): We can be breaking out of a Try/Catch controlled section
9706         (foreach might have an implicit try/catch clause), so we need to
9707         use Leave instead of Br.
9708
9709         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
9710         now).  If the instace expression supports IMemoryLocation, we use
9711         the AddressOf method from the IMemoryLocation to extract the
9712         address instead of emitting the instance.
9713
9714         This showed up with `This', as we were emitting the instance
9715         always (Emit) instead of the Address of This.  Particularly
9716         interesting when This is a value type, as we dont want the Emit
9717         effect (which was to load the object).
9718
9719 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
9720
9721         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
9722
9723         * statement.cs (Checked): Set the CheckedState during the resolve
9724         process too, as the ConvCast operations track the checked state on
9725         the resolve process, and not emit.
9726
9727         * cs-parser.jay (namespace_member_declaration): Flag that we have
9728         found a declaration when we do.  This is used to flag error 1529
9729
9730         * driver.cs: Report ok when we display the help only.
9731
9732 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
9733
9734         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
9735
9736 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
9737
9738         * cs-tokenizer.cs (define): We also have to track locally the
9739         defines.  AllDefines is just used for the Conditional Attribute,
9740         but we also need the local defines for the current source code. 
9741
9742 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
9743
9744         * statement.cs (While, For, Do): These loops can exit through a
9745         Break statement, use this information to tell whether the
9746         statement is the last piece of code.
9747
9748         (Break): Flag that we break.
9749
9750         * codegen.cs (EmitContexts): New `Breaks' state variable.
9751
9752 2002-07-03  Martin Baulig  <martin@gnome.org>
9753
9754         * class.cs (TypeContainer.MethodModifiersValid): Allow override
9755         modifiers in method declarations in structs.  Otherwise, you won't
9756         be able to override things like Object.Equals().
9757
9758 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9759
9760         * class.cs (Method, Property, Indexer): Do not allow the public
9761         modifier to be used in explicit interface implementations.
9762
9763         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
9764         override modifiers in method declarations in structs
9765
9766 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
9767
9768         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
9769         integer or real overflow, report an error
9770
9771 2002-07-02  Martin Baulig  <martin@gnome.org>
9772
9773         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
9774         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
9775         to tell the runtime about our newly created System.Object and
9776         System.ValueType types.
9777
9778 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9779
9780         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
9781         struct instead of Ldarg/Starg.
9782
9783 2002-07-02  Martin Baulig  <martin@gnome.org>
9784
9785         * expression.cs (Indirection.Indirection): Call
9786         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
9787
9788 2002-07-02  Martin Baulig  <martin@gnome.org>
9789
9790         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
9791         ValueType, call TypeManager.TypeToCoreType() on it.
9792         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
9793         the OpCodes.Newarr argument.
9794
9795 2002-07-02  Martin Baulig  <martin@gnome.org>
9796
9797         * expression.cs (Invocation.EmitCall): When compiling corlib,
9798         replace all calls to the system's System.Array type to calls to
9799         the newly created one.
9800
9801         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
9802         System.Array methods.
9803         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
9804         from the system's System.Array type which must be replaced.
9805
9806 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
9807
9808         * typemanager.cs: load unverifiable_code_ctor so we can build
9809         corlib using the correct type. Avoid using GetTypeCode() with
9810         TypeBuilders.
9811         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
9812         TypeManager.object_type to allow building corlib.
9813
9814 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
9815
9816         * ecore.cs: handle System.Enum separately in LoadFromPtr().
9817
9818 2002-07-01  Martin Baulig  <martin@gnome.org>
9819
9820         * class.cs: Make the last change actually work, we need to check
9821         whether `ifaces != null' to avoid a crash.
9822
9823 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9824
9825         * class.cs: when we build structs without fields that implement
9826         interfaces, we need to add the interfaces separately, since there is
9827         no API to both set the size and add the interfaces at type creation
9828         time.
9829
9830 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9831
9832         * expression.cs: the dimension arguments to the array constructors
9833         need to be converted if they are a long.
9834
9835 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
9836
9837         * class.cs: don't emit ldarg.0 if there is no parent constructor
9838         (fixes showstopper for corlib).
9839
9840 2002-06-29  Martin Baulig  <martin@gnome.org>
9841
9842         MCS now compiles corlib on GNU/Linux :-)
9843
9844         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
9845         ie. check for MethodImplOptions.InternalCall.
9846
9847         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
9848         and TypeManager.attribute_type are null, so we must explicitly check
9849         whether parent is not null to find out whether it's an attribute type.
9850         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
9851         and SetBuilder, not only if the property is neither abstract nor external.
9852         This is necessary to set the MethodImplOptions on the accessor methods.
9853         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
9854         SetBuilder, see Property.Emit().
9855
9856         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
9857         populate "System.Object", "System.ValueType" and "System.Attribute" since
9858         they've already been populated from BootCorlib_PopulateCoreTypes().
9859
9860 2002-06-29  Martin Baulig  <martin@gnome.org>
9861
9862         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
9863         is the NullLiteral, we also need to make sure that target_type is not
9864         an enum type.   
9865
9866 2002-06-29  Martin Baulig  <martin@gnome.org>
9867
9868         * rootcontext.cs (RootContext.ResolveCore): We must initialize
9869         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
9870         before calling BootstrapCorlib_ResolveDelegate ().
9871
9872 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9873
9874         * statement.cs: fixed build-breaker. All tests passed ok.
9875
9876 2002-06-27  Martin Baulig  <martin@gnome.org>
9877
9878         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
9879         for System.Decimal when compiling corlib.
9880
9881 2002-06-27  Martin Baulig  <martin@gnome.org>
9882
9883         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
9884         switch blocks which contain nothing but a default clause.
9885
9886 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
9887
9888        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
9889
9890 2002-06-27  Martin Baulig  <martin@gnome.org>
9891
9892         * ecore.cs (PropertyExpr.PropertyExpr): Call
9893         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
9894
9895         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
9896         is already a TypeBuilder.
9897
9898 2002-06-27  Martin Baulig  <martin@gnome.org>
9899
9900         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
9901         `target_type == TypeManager.array_type', not IsAssignableFrom() in
9902         the "from an array-type to System.Array" case.  This makes it work
9903         when compiling corlib.
9904
9905 2002-06-27  Martin Baulig  <martin@gnome.org>
9906
9907         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
9908         non-static PropertyExpr, set its InstanceExpression.  This makes
9909         the `ICollection.Count' property work in System/Array.cs.
9910
9911 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
9912
9913         * driver.cs: Made error handling more consistent.  Errors now
9914         tracked by Report class, so many methods which used to return int
9915         now return void.  Main() now prints success/failure and 
9916         errors/warnings message.
9917
9918         Renamed '--probe' compiler argument to '--expect-error'.  Removed
9919         the magic number return values (123 and 124).  Now, if the
9920         expected error occurs, the compiler exits with success (exit value
9921         0).  If the compilation completes without seeing that particular
9922         error, the compiler exits with failure (exit value 1).  The
9923         makefile in mcs/errors has been changed to handle the new behaviour.
9924
9925         * report.cs: Made 'expected error' number a property and renamed
9926         it from 'Probe' to 'ExpectedError'.
9927
9928         * genericparser.cs: Removed error handling support, since it is
9929         now all done by Report class.
9930
9931         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
9932         class, so parse() no longer returns an int.
9933
9934         * namespace.cs: Use Report.Error instead of GenericParser.error
9935
9936 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
9937
9938         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
9939         TypeContainer.AddOperator): At the front of the list put the
9940         explicit implementations, so they get resolved/defined first. 
9941
9942 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
9943
9944         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
9945         interface type is implemented by this TypeContainer.  Used during
9946         explicit interface implementation.
9947
9948         (Property.Define, Indexer.Define, Method.Define): Validate that
9949         the given interface in the explicit implementation is one of the
9950         base classes for the containing type.
9951
9952         Also if we are explicitly implementing an interface, but there is
9953         no match in the pending implementation table, report an error.
9954
9955         (Property.Define): Only define the property if we are
9956         not explicitly implementing a property from an interface.  Use the
9957         correct name also for those properties (the same CSC uses,
9958         although that is really not needed).
9959
9960         (Property.Emit): Do not emit attributes for explicitly implemented
9961         properties, as there is no TypeBuilder.
9962
9963         (Indexer.Emit): ditto.
9964
9965         Hiding then means that we do not really *implement* a pending
9966         implementation, which makes code fail.
9967
9968 2002-06-22  Martin Baulig  <martin@gnome.org>
9969
9970         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
9971         the return value of Object.GetType().  [FIXME: we need to do this whenever
9972         we get a type back from the reflection library].
9973
9974 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
9975
9976         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
9977
9978 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
9979
9980         * attribute.cs: Return null if we can not look up the type.
9981
9982         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
9983         the interface types found.
9984
9985         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
9986         interface types found.
9987
9988         * typemanager.cs (GetInterfaces): Make this routine returns alll
9989         the interfaces and work around the lame differences between
9990         System.Type and System.Reflection.Emit.TypeBuilder in the results
9991         result for GetInterfaces.
9992
9993         (ExpandInterfaces): Given an array of interface types, expand and
9994         eliminate repeated ocurrences of an interface.  This expands in
9995         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
9996         be IA, IB, IC.
9997
9998 2002-06-21  Martin Baulig  <martin@gnome.org>
9999
10000         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10001         on System.Enum.
10002
10003 2002-06-21  Martin Baulig  <martin@gnome.org>
10004
10005         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10006         and called with one of the core types, return the corresponding typebuilder for
10007         that type.
10008
10009         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10010         element type.
10011
10012 2002-06-21  Martin Baulig  <martin@gnome.org>
10013
10014         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10015         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10016         (Expression.ConvertReferenceExplicit): Likewise.
10017
10018         * expression.cs (ElementAccess.DoResolve): Likewise.
10019         (ElementAccess.DoResolveLValue): Likewise.
10020
10021 2002-06-10  Martin Baulig  <martin@gnome.org>
10022
10023         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10024         add the "value" parameter to the parameter list.
10025
10026         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10027         to our caller.
10028
10029 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10030
10031         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10032         the argument to an int, uint, long or ulong, per the spec.  Also
10033         catch negative constants in array creation.
10034
10035 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10036
10037         * class.cs: do not allow the same interface to appear twice in
10038         the definition list.
10039
10040 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10041
10042         * ecore.cs: don't use ldlen with System.Array.
10043
10044 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10045
10046         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10047
10048 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10049
10050         * modifiers.cs: produce correct field attributes for protected
10051         internal. Easy fix so miguel can work on ther harder stuff:-)
10052
10053 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10054
10055         * pending.cs: New file.  Move the code from class.cs here.
10056         Support clearning the pending flag for all methods (when not doing
10057         explicit interface implementation).
10058
10059 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10060
10061         * rootcontext.cs: added a couple more types needed to bootstrap.
10062
10063 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10064
10065         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10066         constructor in the type, instead of any constructor in the type
10067         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10068         a bug in the Mono runtime when applying the params attribute). 
10069
10070 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10071         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10072
10073 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10074
10075         * expression.cs (Unary.ResolveOperator): Use TypeManager
10076         to resolve the type.
10077
10078 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10079
10080         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10081         attached.
10082
10083         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10084         with each member too.
10085
10086         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10087         field builders too - this takes care of the enum member case.
10088
10089 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10090
10091         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10092         address-of operator on both value types and pointers.
10093
10094 2002-06-10  Martin Baulig  <martin@gnome.org>
10095
10096         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10097         PropertyBuilder to the `property_builders' list.
10098
10099         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10100         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10101         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10102         find any indexers which are inherited from an interface.
10103
10104 2002-06-09  Martin Baulig  <martin@gnome.org>
10105
10106         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10107         the same type as the constant if necessary.  There's also a test-130.cs
10108         for this.
10109
10110         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10111
10112         * typemanager.cs (TypeManager.ChangeType): Previously known as
10113         Enum.ChangeEnumType().
10114
10115 2002-06-09  Martin Baulig  <martin@gnome.org>
10116
10117         * expression.cs (Cast.TryReduce): Added support for consts.
10118
10119 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10120
10121         * class.cs (Accessor): Hold attributes information so we can pass
10122         it along.
10123
10124         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10125         Modify to pass in attributes attached to the methods.
10126
10127         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10128
10129         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10130         to handle the Accessor kind :-)
10131
10132         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10133
10134 2002-06-08  Martin Baulig  <martin@gnome.org>
10135
10136         * expression.cs (Unary.TryReduceNegative): Added support for
10137         ULongConstants.
10138
10139 2002-06-08  Martin Baulig  <martin@gnome.org>
10140
10141         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10142         name can't be found in the `defined_names' - the caller will do a
10143         MemberLookup in this case and thus find methods in System.Enum
10144         such as Enum.IsDefined().
10145
10146 2002-06-08  Martin Baulig  <martin@gnome.org>
10147
10148         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10149         Convert.ChangeType() which works with TypeBuilder created types.
10150         (Enum.LookupEnumValue, Enum.Define): Use it here.
10151
10152         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10153         `TypeBuilder.BaseType != null' check.
10154         (TypeContainer.FindMembers): Only lookup parent members if we
10155         actually have a parent.
10156         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10157         (ConstructorInitializer.Resolve): Likewise.
10158
10159         * interface.cs (Interface.FindMembers): Added
10160         `TypeBuilder.BaseType != null' check.
10161
10162         * rootcontext.cs (RootContext.ResolveCore): Added
10163         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10164         classes_second_stage.
10165
10166         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10167         debug_type and trace_type when compiling with --nostdlib.       
10168
10169 2002-06-07  Martin Baulig  <martin@gnome.org>
10170
10171         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10172         (AddField): Set it to true when adding a non-static field.
10173         (DefineType): Use `have_nonstatic_fields' to find out whether we
10174         have non-static fields, not `Fields != null'.
10175
10176 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10177
10178         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10179         dereferencing a null on the static-field code path)
10180
10181 2002-05-30  Martin Baulig  <martin@gnome.org>
10182
10183         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10184         to take command line arguments.  Use reflection to call the new
10185         custom `Initialize' function on the symbol writer and pass it the
10186         command line arguments.
10187
10188         * driver.cs (--debug-args): New command line argument to pass command
10189         line arguments to the symbol writer.
10190
10191 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10192
10193         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10194         the target type for indexers and properties.  Thanks to Joe for
10195         catching this.
10196
10197 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10198
10199         * typemanager.cs (MethodFlags): returns the method flags
10200         (Obsolete/ShouldIgnore) that control warning emission and whether
10201         the invocation should be made, or ignored. 
10202
10203         * expression.cs (Invocation.Emit): Remove previous hack, we should
10204         not do this on matching a base type, we should do this based on an attribute
10205
10206         Only emit calls to System.Diagnostics.Debug and
10207         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10208         on the command line.
10209
10210         * rootcontext.cs: Global settings for tracing and debugging.
10211
10212         * cs-tokenizer.cs (define): New utility function to track
10213         defines.   Set the global settings for TRACE and DEBUG if found.
10214
10215 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10216
10217         * interface.cs (Populate*): Pass in the TypeContainer as well as
10218         the DeclSpace as parameters so that we can create EmitContexts and
10219         then use that to apply attributes etc.
10220
10221         (PopulateMethod, PopulateEvent, PopulateProperty)
10222         (PopulateIndexer): Apply attributes everywhere.
10223
10224         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10225         etc.
10226
10227         (ApplyAttributes): Update accordingly.
10228
10229         We now apply interface attributes for all members too.
10230
10231 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10232
10233         * class.cs (Indexer.Define); Correctly check if we are explicit
10234         implementation (instead of checking the Name for a ".", we
10235         directly look up if the InterfaceType was specified).
10236
10237         Delay the creation of the PropertyBuilder.
10238
10239         Only create the PropertyBuilder if we are not an explicit
10240         interface implementation.   This means that explicit interface
10241         implementation members do not participate in regular function
10242         lookups, and hence fixes another major ambiguity problem in
10243         overload resolution (that was the visible effect).
10244
10245         (DefineMethod): Return whether we are doing an interface
10246         implementation. 
10247
10248         * typemanager.cs: Temporary hack until we get attributes in
10249         interfaces (Ravi is working on that) and we get IndexerName
10250         support in interfaces.
10251
10252         * interface.cs: Register the indexers as properties.
10253
10254         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10255         warning, I have verified that this is a bug in the .NET runtime
10256         (JavaScript suffers of the same problem).
10257
10258         * typemanager.cs (MemberLookup): When looking up members for
10259         interfaces, the parent of an interface is the implicit
10260         System.Object (so we succeed in searches of Object methods in an
10261         interface method invocation.  Example:  IEnumerable x;  x.ToString
10262         ()) 
10263
10264 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10265
10266         * class.cs (Event): Events should also register if they do
10267         implement the methods that an interface requires.
10268
10269         * typemanager.cs (MemberLookup); use the new GetInterfaces
10270         method. 
10271
10272         (GetInterfaces): The code used to lookup interfaces for a type is
10273         used in more than one place, factor it here. 
10274
10275         * driver.cs: Track the errors at the bottom of the file, we kept
10276         on going.
10277
10278         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10279         instance if the method we are calling is static!
10280
10281 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10282
10283         * attribute.cs (ApplyAttributes): Make this function filter out
10284         the IndexerName attribute (as that attribute in reality is never
10285         applied) and return the string constant for the IndexerName
10286         attribute. 
10287
10288         * class.cs (TypeContainer.Emit): Validate that all the indexers
10289         have the same IndexerName attribute, and if so, set the
10290         DefaultName attribute on the class. 
10291
10292         * typemanager.cs: The return value might contain other stuff (not
10293         only methods).  For instance, consider a method with an "Item"
10294         property and an Item method.
10295
10296         * class.cs: If there is a problem with the parameter types,
10297         return. 
10298
10299 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10300
10301         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10302         looks at user defined conversion after making a call to 
10303         StandardConversionExists - we need this for overload resolution.
10304
10305         * expression.cs : Update accordingly the various method calls.
10306
10307         This fixes 2 bugs filed against implicit user defined conversions 
10308
10309 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10310
10311         * statement.cs: Track the result of the assignment.
10312
10313 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10314
10315         * expression.cs (MemberAccess): Improved error reporting for
10316         inaccessible members.
10317
10318 2002-05-22  Martin Baulig  <martin@gnome.org>
10319
10320         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10321         itself with debugging support.
10322
10323 2002-05-22  Martin Baulig  <martin@gnome.org>
10324
10325         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10326         Removed, this isn't needed anymore.
10327
10328 2002-05-20  Martin Baulig  <martin@gnome.org>
10329
10330         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
10331         be underlying type for an enum.
10332
10333 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
10334
10335         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
10336         that splits out the loading of just the core types.
10337
10338         * rootcontext.cs (ResolveCore): Split the struct resolution in
10339         two, so we can load the enumeration underlying types before any
10340         enums are used.
10341
10342         * expression.cs (Is): Bandaid until we fix properly Switch (see
10343         bug #24985 for details).
10344
10345         * typemanager.cs (ImplementsInterface): The hashtable will contain
10346         a null if there are no interfaces implemented.
10347
10348 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
10349
10350         * cs-parser.jay (indexer_declarator): It is fine to have array
10351         parameters
10352
10353 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10354
10355         * typemanager.cs: (RegisterBuilder): New function used to register
10356         TypeBuilders that implement interfaces.  Since
10357         TypeBuilder.GetInterfaces (as usual) does not work with lame
10358         Reflection.Emit. 
10359         (AddUserType): register interfaces.
10360
10361         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10362         dealing with TypeBuilder.  Also, arrays are showing up as
10363         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10364         methods can not be invoked on them!
10365
10366         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10367         (ImplicitReferenceConversionExists): Split out from
10368         StandardConversionExists. 
10369
10370         * expression.cs (As): We were only implementing one of the three
10371         cases for the as operator.  We now implement them all.
10372         (Is): Implement the various other cases for Is as well.
10373
10374         * typemanager.cs (CACHE): New define used to control if we want or
10375         not the FindMembers cache.  Seems to have a negative impact on
10376         performance currently
10377
10378         (MemberLookup): Nested types have full acess to
10379         enclosing type members
10380
10381         Remove code that coped with instance/static returns for events, we
10382         now catch this in RealFindMembers.
10383
10384         (RealFindMembers): only perform static lookup if the instance
10385         lookup did not return a type or an event.  
10386
10387 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10388
10389         * assign.cs (CompoundAssign): We pass more semantic information
10390         now to Compound Assignments than we did before: now we have all
10391         the information at hand, and now we resolve the target *before* we
10392         do the expression expansion, which allows the "CacheValue" method
10393         to have the effect we intended (before, a [x] += 1 would generate
10394         two differen ArrayAccess expressions from the ElementAccess,
10395         during the resolution process).
10396
10397         (CompoundAssign.DoResolve): Resolve target and original_source here.
10398
10399 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10400
10401         * expression.cs (ArrayAccess): dropped debugging information. 
10402
10403         * typemanager.cs: Small bug fix: I was always returning i_members,
10404         instead of one of i_members or s_members (depending on which had
10405         the content).
10406
10407         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10408         method is invoked before any code generation takes place, and it
10409         is a mechanism to inform that the expression will be invoked more
10410         than once, and that the method should use temporary values to
10411         avoid having side effects
10412
10413         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10414
10415         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10416         implementation.
10417
10418         * expression.cs (Indirection, ArrayAccess): Add support for
10419         CacheTemporaries in these two bad boys. 
10420
10421         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10422         ldobj or ldind_ref.  
10423         (StoreFromPtr): Handle stobj as well.
10424
10425         * expression.cs (UnaryMutator): Share more code.
10426
10427         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10428         down: I was not tracking the Filter function as well, which
10429         was affecting the results of the cache.
10430
10431 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10432
10433         * attribute.cs: Remove the hack to handle the CharSet property on
10434         StructLayouts. 
10435
10436 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10437
10438         * attribute.cs (DoResolve): More uglyness, we now only try to
10439         resolve the attribute partially, to extract the CharSet
10440         information (only if we are a StructLayout attribute).  Otherwise 
10441
10442         (GetExtraTypeInfo): Add some code to conditionally kill in the
10443         future this.   I am more and more convinced that the .NET
10444         framework has special code to handle the attribute setting on
10445         certain elements.
10446
10447         * expression.cs (IsParamsMethodApplicable): Revert my previous
10448         foreach change here, it was wrong.
10449
10450 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10451
10452         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10453         (pp_expr): do not abort on unknown input, just return.
10454         (eval): abort if there are pending chars.
10455
10456         * attribute.cs (Attribute.Resolve): Positional parameters are
10457         optional.  Deal with that case.
10458
10459         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10460         the Ansi/Unicode/Auto information for the type.
10461
10462         (TypeContainer.DefineType): instantiate the EmitContext here, as
10463         we will be using it during the type definition (to resolve
10464         attributes) and during the emit phase.
10465
10466         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
10467         to pull type information out of the attributes
10468
10469         (Attribute.Resolve): track the constructor builder, and allow for
10470         multiple invocations (structs and classes will use this).
10471
10472         * ecore.cs (MemberLookupFinal): new version with all the
10473         parameters customizable.
10474
10475         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
10476         constructors.  Return if the result value is null (as the error
10477         would have been flagged already by MemberLookupFinal)
10478
10479         Do not allow instances of abstract classes or interfaces to be
10480         created.
10481
10482         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
10483         We have to compare the assembly property here when dealing with
10484         FamANDAssem and Assembly access modifiers, because we might be
10485         creating an assembly from *modules* (that means that we are not
10486         getting TypeBuilders for types defined in other modules that are
10487         part of this assembly).
10488
10489         (Method.Emit): If the method is marked abstract and has a body,
10490         emit an error. 
10491
10492         (TypeContainer.DefineMembers): If both the defined member and the
10493         parent name match are methods, then do not emit any warnings: let
10494         the Method.Define routine take care of flagging warnings.  But if
10495         there is a mismatch (method overrides something else, or method is
10496         overriwritten by something, then emit warning).
10497
10498         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
10499         set to null, this means `do not check for the return type on the
10500         signature'. 
10501
10502         (Method.Define): set the return type for the method signature to
10503         null, so that we get methods with the same name and parameters and
10504         different return types.  This is used to flag warning 114 (you are
10505         hiding a method, and you probably want to use the new/override
10506         keywords instead).
10507
10508         * typemanager.cs (MemberLookup): Implemented proper access
10509         control, closing a long standing set of bug reports.  The problem
10510         was that the Framework only has two bits: Public and NonPublic,
10511         and NonPublic includes private and protected methods, but we need
10512         to enforce the FamANDAssem, FamOrAssem and Family. 
10513
10514 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
10515
10516         * statement.cs (GotoCase): Return true: Ammounts to giving up
10517         knowledge on whether we return or not, and letting the other case
10518         be responsible for it.
10519
10520 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
10521
10522         * driver.cs: Do not load directories for each file processed, only
10523         do it if there is a pattern.
10524
10525         * ecore.cs: Report readonly assigns here as well, as we might have
10526         been resolved only by MemberAccess.
10527
10528         (SimpleName.SimpleNameResolve): Also be useful for LValue
10529         resolution.   We need this to propagate assign to local readonly variables
10530
10531         * typemanager.cs: Use a ptrhashtable for the criteria, because we
10532         do not want to reuse potential criteria memory.
10533
10534         * class.cs (MyEventBuilder): Set reflected_type;
10535
10536         * ecore.cs (Constantify): Added support for constifying bools.
10537
10538         (RootContext.LookupType): Added a cache for values looked up in
10539         the declaration space.
10540
10541         * typemanager.cs (FindMembers): Now is a front-end to
10542         RealFindMembers, and provides a two-level hashtable-based cache to
10543         the request.  
10544
10545         15% performance improvement: from 22.5 to 19.2 seconds.
10546
10547         * expression.cs (IsParamsMethodApplicable): use foreach.
10548         (Invocation.DoResolve): ditto.
10549         (New.DoResolve): ditto.
10550         (ArrayCreation.DoResolve): ditto.
10551
10552         * ecore.cs (FindMostEncompassingType): use foreach.
10553
10554         * delegate.cs (NewDelegate.DoResolve): Use foreach
10555
10556         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
10557         (RemoveMethods): use foreach.
10558
10559         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
10560         nested foreach statements instead of for, and also break out of
10561         the inner loop once a match is found.
10562
10563         (Invocation.OverloadResolve): Use foreach, simplify the code. 
10564
10565 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
10566
10567         * cfold.cs (BinaryFold): During an enumeration evaluation context,
10568         we actually unwrap the expression to allow for extra information
10569         to be extracted. 
10570
10571         * expression.cs: Use Shr_Un on unsigned operations. 
10572
10573 2002-05-08  Ravi Pratap  <ravi@ximian.com>
10574
10575         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
10576         applicable operators was not being considered correctly. This closes
10577         the bug Miguel reported.
10578
10579 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
10580
10581         * attribute.cs: check that the type derives from System.Attribute
10582         and report the correct error in that case (moved the duplicate code to
10583         its own method, too).
10584
10585 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
10586
10587         * attribute.cs: lookup attribute type name as the spec says: first the
10588         bare attribute name and then name + "Attribute" (nant compiles with
10589         mcs after this fix).
10590
10591 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
10592
10593         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
10594         Because of the way we parse things, we should try to see if a
10595         UIntConstant can fit in an integer.
10596
10597 2002-05-07  Ravi Pratap  <ravi@ximian.com>
10598
10599         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
10600         when we are in an explicit context.
10601
10602         (ConvertReferenceExplicit): When converting from Iface type S to Class
10603         T make sure the rules are implemented as an OR.
10604
10605         * parameter.cs (ParameterType): Make it a property for now although the
10606         purpose really isn't anything immediate.
10607
10608         * expression.cs (Is*Applicable): Do better checking on the parameter type
10609         of a ref/out parameter. The ones from the system assemblies are already 
10610         marked with the correct type so we don't need to do any correction.
10611
10612         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
10613         the object type is standard too so include that.
10614
10615 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10616
10617         * ecore.cs (StandardConversionExists): Augment with missing code:
10618         deal with IntConstant, LongConstants and Enumerations.
10619
10620         * assign.cs: Report the error, instead of failing silently
10621
10622         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
10623         typecontainer that they are declared, because the
10624         typecontainer/namespace will have the list of using clauses that
10625         need to be applied.
10626
10627         Assembly Attributes were escaping the normal registration
10628         mechanism. 
10629
10630         (EmitCode): Apply attributes within an EmitContext that represents
10631         the container they were declared on.
10632
10633         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
10634
10635 2002-05-06  Ravi Pratap  <ravi@ximian.com>
10636
10637         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
10638         Revamp completely - make much cleaner as we now operate only
10639         on a set of Types.
10640
10641         (FindMostSpecificSource, FindMostSpecificTarget): New methods
10642         to implement the logic detailed in the spec more correctly.
10643
10644         (UserDefinedConversion): Update accordingly.
10645
10646 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10647
10648         * statement.cs: Return flow analysis information up.
10649
10650         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
10651         and the default.
10652
10653         (token): Do not consume an extra character before calling
10654         decimal_digits.
10655
10656 2002-05-06  Piers Haken <piersh@friskit.com>
10657
10658         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
10659
10660 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10661
10662         * class.cs (Constructor.Emit): Set the IsStatic flag in the
10663         EmitContext during the instance constructor initializer
10664         resolution, to stop access to instance variables.
10665
10666         This is mandated by the spec, last paragraph of the `constructor
10667         initializers' section. 
10668
10669 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
10670
10671         * cs-parser.jay, class.cs (Accessor): new class used to represent
10672         an accessor (get or set).  In the past we used `null' to represent
10673         a missing accessor.  But this is ambiguous because there was no
10674         way to tell in abstract indexers/properties if one of them was
10675         specified.
10676
10677         Now there is a way of addressing that.
10678
10679         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
10680         instead of FindMembers.
10681
10682         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
10683         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
10684
10685         * attribute.cs: Treat indexers and properties as the same in terms
10686         of applying attributes
10687
10688         * ecore.cs (FindMostEncompassedType): Use statically initialized
10689         EmptyExpressions()s like we do elsewhere to avoid creating useless
10690         objects (and we take this out of the tight loop).
10691
10692         (GetConversionOperators): Move the code to extract the actual
10693         operators to a separate routine to clean things up.
10694
10695 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
10696
10697         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
10698         events are always registered FieldBuilders.
10699
10700         * class.cs (FieldBase): New class shared by Fields 
10701
10702         * delegate.cs: If we are a toplevel delegate, use our full name.
10703         If we are a nested delegate, then only use our tail name.
10704
10705 2002-05-02  Ravi Pratap  <ravi@ximian.com>
10706
10707         * expression.cs (IsApplicable): Ensure that we add the "&" to
10708         ref/out types before comparing it with the type of the argument.
10709
10710         (IsParamsMethodApplicable): Ditto.
10711
10712         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
10713         silly me ;-)
10714
10715         * delegate.cs : Handle the case when we have more than one applicable
10716         method. Flag an error only when we finish checking all.
10717
10718 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
10719
10720         * expression.cs: Add support for boolean static initializers.
10721
10722 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
10723
10724         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
10725
10726         * parameter.cs (ComputeParameterTypes,
10727         ComputeAndDefineParameterTypes): Better error handling: now we
10728         clear the `types' cache if we fail during any of the type lookups.
10729         We also return the status code correctly to our caller
10730
10731         * delegate.cs: If we fail to define a delegate, abort the extra
10732         steps. 
10733
10734         * expression.cs (Binary.ResolveOperator): for
10735         operator==(object,object) and operator !=(object, object) we also
10736         have to verify that there is an implicit conversion from one to
10737         the other.
10738
10739         (ArrayAccess.DoResolve): Array Access can operate on
10740         non-variables. 
10741
10742 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
10743
10744         * assign.cs (CompoundAssign): A new class used as a "flag" that
10745         the assignment actually is happening as part of a compound
10746         assignment operator.
10747
10748         During compound assignment, a few new rules exist to enable things
10749         like:
10750
10751         byte b |= 1 + 2
10752
10753         From the spec:
10754
10755         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
10756         to the type of x) if y is implicitly convertible to the type of x,
10757         and the operator is a builtin operator and the return type of the
10758         operator is explicitly convertible to the type of x. 
10759
10760         * rootcontext.cs: Reset warning level to 2.  4 catches various
10761         "interesting" features in mcs, we must clean this up at some
10762         point, but currently am trying to kill other bugs ;-)
10763
10764         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
10765         in container classes as well.  
10766
10767         * expression.cs (Binary.ResolveOperator): Handle string case
10768         before anything else (as operator overloading does emit an error
10769         before doing anything else).
10770
10771         This code could go away when we move to a table driven model, but
10772         i could not come up with a good plan last night.
10773
10774 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
10775
10776         * typemanager.cs (CSharpName): reimplementation using regex.
10777         * class.cs: added null check for fields in Emit
10778         * rootcontext.cs: set warninglevel to 4
10779
10780 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
10781
10782         * typemanager.cs (CSharpName): reimplemented with Lupus
10783         suggestion.
10784
10785 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
10786
10787         * statement.cs (If): correclty implement Resolve, because we were
10788         not catching sem errors in there.  The same process is needed
10789         everywhere else. 
10790         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
10791
10792
10793         (Statement.Warning_DeadCodeFound): Factorize code.
10794         (While): Report dead code here too.
10795
10796         (Statement): Added Resolve virtual method to allow
10797         for resolution split from the emit code.
10798
10799 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10800
10801         * statement.cs (EmitBoolExpression): No longer try to resolve the
10802         expression here.    
10803         (MakeBoolean): New utility function that resolve, implicitly
10804         converts to boolean and tags the expression. 
10805
10806
10807         (If, Do): Implement dead code elimination.
10808         (While): Implement loop inversion
10809
10810         (Do, While, For, If): Resolve the expression prior to calling our
10811         code generation.
10812
10813 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
10814
10815         * class.cs:
10816           - added method Report28 (warning: program has more than one entry point)
10817           - added method IsEntryPoint, implements paragraph 10.1 of the spec
10818           - modified method Method.Define, the part at the end of the method
10819
10820         * rootcontext.cs: added static public Location EntryPointLocation;
10821           
10822         * ../errors/cs0028.cs : Add test case for the above warning.              
10823
10824         * typemanager.cs:
10825           - modified method CSharpName to allow arrays of primitive type to
10826             be printed nicely (e.g. instead of System.Int32[][] it now prints
10827             int[][])
10828           - added method CSharpSignature: returns the signature of a method
10829             in string format to be used in reporting errors, warnings, etc.
10830
10831         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
10832         with String.Empty.
10833
10834 2002-04-26  Ravi Pratap  <ravi@ximian.com>
10835
10836         * delegate.cs (Define): Fix extremely silly bug where I was
10837         setting the type of the 'object' parameter of the BeginInvoke
10838         method to System.IAsyncResult instead of System.Object ;-)
10839
10840 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10841
10842         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
10843         here. 
10844
10845         (Constructor.Emit): return if we fail to initialize the
10846         constructor.  Another door closed!  
10847
10848         * expression.cs (New.DoResolve): Improve error message (from -6 to
10849         1501).  Use DeclaredOnly lookup to find the exact constructor.
10850
10851         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
10852         loop.  This is useful.
10853
10854         * cs-parser.jay: Adjust the default parameters so that destructors
10855         have the proper signature.
10856
10857 2002-04-26  Martin Baulig  <martin@gnome.org>
10858
10859         * driver.cs (LoadAssembly): If `assembly' contains any characters
10860         which are only valid in path names and not in assembly names
10861         (currently slash, backslash and point), use Assembly.LoadFrom ()
10862         instead of Assembly.Load () on the `assembly' (before iteration
10863         over the link_paths).
10864
10865 2002-04-26  Martin Baulig  <martin@gnome.org>
10866
10867         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
10868
10869 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
10870
10871         * class.cs (Property): use the new typemanager.MemberLookup
10872
10873         (TypeContainer.MemberLookup): Implement using the
10874         TypeManager.MemberLookup now. 
10875
10876         * typemanager.cs: Make MemberLookup a function of the TypeManager,
10877         and return MemberInfos, so that these can be used without an
10878         EmitContext (what we had before).
10879
10880 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
10881
10882         * expression.cs: Fix the case where the argument to params if the
10883         type of the params.  I omitted handling this before.   Fixed
10884
10885 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10886
10887         * driver.cs: Call BootCorlib_PopulateCoreType
10888
10889         * class.cs (Property.CheckBase): Check for properties only, not
10890         for all members. 
10891
10892         * interface.cs: Temporary hack: try/catch around the
10893         CustomAttributeBuilder, because I am getting an exception that I
10894         do not understand.
10895
10896         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
10897         types whose definitions are required to be there (attributes are
10898         defined before standard types).
10899
10900         Compute definitions as we boot the various types, as they are used
10901         immediately (value_type class will need object_type, but if we do
10902         not initialize object_type, we will pass a null, which will let
10903         the runtime pick the System.Object from the existing corlib, which
10904         is not what we want).
10905
10906 2002-04-22  Patrik Torstensson <totte@labs2.com>
10907
10908         * cs-tokenizer.cs: fixed a number of trim() issues.
10909
10910 2002-04-22  Ravi Pratap  <ravi@ximian.com>
10911
10912         * expression.cs (Argument.Type): Ensure that we return the correct
10913         type when we have out or ref parameters [in which case we 
10914         append a "&"].
10915
10916 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10917
10918         * class.cs (Property, Indexer): Allow extern modifier in there. 
10919
10920         * typemanager.cs (InitBaseTypes): Initializes object_type and
10921         value_type, since those will be used early on during the bootstrap
10922         process to compile corlib.
10923
10924         (InitCoreTypes): Move code from here to InitBaseTypes.
10925
10926 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
10927
10928         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
10929         single-dimension arrays as using the ldlen opcode.  
10930
10931         Daniel Lewis discovered this optimization.  
10932
10933         * typemanager.cs: Add signature for System.Array::get_Length
10934
10935 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10936
10937         * statement.cs: report the error when the foreach does not apply to an
10938         array nor a collection.
10939
10940 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
10941
10942         * expression.cs: Add implicit conversions to the operator ~.
10943
10944         * constant.cs (DecimalConstant.Emit): Emit decimal value.
10945
10946         * typemanager.cs: Locate the decimal constructor.
10947
10948 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10949
10950         * attribute.cs: use the new property of TypeOf.
10951         * expression.cs: added 'get' property around typearg.
10952
10953         These changes fix a build breaker reported by NickD. Is this the
10954         correct way to fix?  If not, please, revert my changes and make it
10955         work :-).
10956
10957 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
10958
10959         * attribute.cs: Add support for typeof in attribute invocations.
10960         I am not sure that this is right though.
10961
10962 2002-04-14  Duncan Mak  <duncan@ximian.com>
10963
10964         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
10965         Binary.Operator.Division case.
10966
10967 2002-04-13  Ravi Pratap  <ravi@ximian.com>
10968
10969         * class.cs (DefineType): Ensure that we do a proper check on
10970         attribute types and also register it with the TypeManager.
10971
10972         (TypeContainer.Targets): The default for attribute types is
10973         AttributeTargets.All.
10974
10975         * attribute.cs (ApplyAttributes): Registering the attribute type
10976         is done elsewhere, not when we discover we have a Usage attribute.
10977
10978 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10979
10980         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
10981         and get rid of is_delegate parameter.
10982
10983         * everywhere : update.
10984
10985 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10986
10987         * cs-parser.jay (compilation_unit): Revamp completely to use
10988         some new ideas that I got from Rhys' grammar to solve the problems
10989         with assembly level attributes.
10990
10991         (outer_declaration): New grammar production.
10992
10993         (attribute_sections): Add.
10994
10995         (opt_attributes): Base on attribute_sections
10996
10997         (namespace_declaration): Allow opt_attributes to tackle the case
10998         when we have assembly level attributes - we are clever in this
10999         regard now ;-)
11000
11001         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11002         attributes in the non-global context.
11003
11004         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11005         instead of SetGlobalAttributes.
11006
11007         * class.cs, rootcontext.cs : Ensure we define and generate 
11008         attribute types before anything else.
11009
11010         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11011         and flag the new error -20 for the case when the attribute type
11012         does not have valid targets specified. csc does not catch this.
11013
11014         * ../errors/errors.txt : update for error # -20
11015
11016 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11017
11018         * support.cs (InternalParameters.ParameterModifier): Do some null
11019         checking and return sane values.
11020
11021         * class.cs (Method.Define): If we are a PInvoke method, ensure
11022         that we are static and extern. Report error # 601
11023
11024         * ../errors/cs0601.cs : Add test case for the above error.
11025
11026 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11027
11028         * rootcontext.cs (attribute_types): We need to keep type of
11029         all attribute types separately and emit code for them first.
11030
11031         (RegisterAttribute) : Implement.
11032
11033         * class.cs (DefineType): Check if the current Type is a custom
11034         attribute type and register it accordingly.
11035
11036         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11037         adding the first attribute twice and rename to
11038
11039         (SetGlobalAttributes): this.
11040
11041         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11042         lookups.
11043
11044         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11045         if we are processing global arguments. Hmm, I am unsure of this.
11046
11047 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11048
11049         * expression.cs: added static array of strings to avoid calling
11050         Enum.ToString () for Operator in Binary. Significant recover of
11051         performance.
11052
11053 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11054
11055         * class.cs (FindMembers): Allow the Builders of the various
11056         members to be null.  If they are skip them.  This only happens
11057         during the PInvoke declaration.
11058
11059 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11060
11061         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11062         failure, so we do not keep going afterwards.
11063
11064         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11065         wanted to pass `false' as the `is_delegate' argument.  If this is
11066         the case, why not use delegate_type == null to mean `is_delegate =
11067         false' and anything else as is_delegate = true.
11068
11069 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11070
11071         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11072         code for the section, not the beginning of the tests.
11073
11074 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11075
11076         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11077
11078         * expression.cs (Binary): same.  Warn about errors where we have
11079         Enum/Enum in operator + as well.
11080
11081 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11082
11083         * statement.cs:
11084                 - added support for switch(bool)
11085                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11086                 - add TableSwitchEmit() to handle table-based switch statements
11087
11088 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11089
11090         * expression.cs (Invocation.OverloadResolve): Factor out code which
11091         does parameter compatibility checking with arguments so that we can 
11092         re-use the code even from Delegate.VerifyApplicability
11093
11094         (VerifyArgumentsCompat): Move above code here.
11095
11096         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11097         and instead make a call to the above method.
11098
11099 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11100
11101         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11102         We use it to keep track of classes which are attribute types.
11103
11104 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11105
11106         * delegate.cs (Delegate.Define): Correctly define the types in the
11107         presence of fixed and array parameters.
11108
11109         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11110         doing FindMembers.
11111
11112         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11113         include NonPublic after the first iteration.
11114
11115         * class.cs (Indexer.CheckBase): Only check if both parents are
11116         non-null. 
11117
11118         * cs-parser.jay (accessor_body): If empty, set to null.
11119
11120         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11121         same code path here to resolve constants names that we did have in
11122         MemberAccess.DoResolve.  There is too much code duplicated here.
11123
11124 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11125
11126         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11127
11128         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11129         to MakeUnionSet.
11130
11131         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11132         tokens, numbers and strings.
11133
11134         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11135         parenthesis.
11136
11137         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11138         asyncronous parameters and the regular parameters.  
11139
11140         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11141         specify the target directory.
11142
11143         * expression.cs: (This.DoResolve): Simplify
11144         (As.Emit): Optimize, do not generate IsInst if the expression is
11145         always of the given type.
11146
11147         (Is.DoResolve): Bug fix, we were reporting both always/never for
11148         the is expression.
11149
11150         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11151         creating too many unnecessary arrays.
11152
11153 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11154
11155         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11156         fields instead of rolling our own initializer.   Takes care of all
11157         implicit conversions, and drops unnecessary static checks/argument.
11158
11159 2002-03-31  Dick Porter  <dick@ximian.com>
11160
11161         * driver.cs: use the GetDirectories() return values properly, and
11162         use "/" as path separator.
11163
11164 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11165
11166         * expression.cs (Unary): Optimize - - expr into expr.
11167         (Binary): Optimize a + (-b) into a -b.
11168
11169         * codegen.cs (CodeGen): Made all methods static.
11170
11171 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11172
11173         * rootcontext.cs: 
11174
11175         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11176         TypeBuilder property.
11177
11178         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11179         instead. 
11180
11181         * tree.cs: Removed the various RecordXXXX, and replaced with a
11182         single RecordDecl.  Removed all the accessor methods, and just
11183         left a single access point Type 
11184
11185         * enum.cs: Rename DefineEnum to DefineType.
11186
11187         * decl.cs: New abstract method `DefineType' used to unify the
11188         Defines for Enumerations, Interfaces, TypeContainers and
11189         Delegates.
11190
11191         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11192         LookupBaseClasses method that used to live in class.cs and
11193         interface.cs here, and renamed to FindType.
11194
11195         * delegate.cs: Implement DefineType.  Take advantage of the
11196         refactored pattern for locating the parent builder without taking
11197         the parent_builder argument (which we know does not work if we are
11198         nested, and triggering a toplevel definition).
11199
11200 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11201
11202         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11203         accessibility of a member has changed during override and report
11204         an error if so.
11205
11206         * class.cs (Method.Define, Property.Define): Only complain on
11207         overrides if the method is private, any other accessibility is
11208         fine (and since we just checked the permission is the same, we are
11209         good to go).
11210
11211         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11212         and elif are processed always.  The other pre-processing
11213         directives are only processed if we are "taking" the path
11214
11215 2002-03-29  Martin Baulig  <martin@gnome.org>
11216
11217         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11218         current location is not Null.
11219
11220         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11221         a separate method so we can profile it.
11222
11223         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11224         `span.Seconds' are just seconds, but no minutes or hours.
11225         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11226
11227 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11228
11229         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11230         Remove the gratuitous set of Final:
11231
11232                                 // If an interface implementation, then we can set Final.
11233                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11234                                     implementing.DeclaringType.IsInterface)
11235                                         flags |= MethodAttributes.Final;
11236
11237         I do not know what I was smoking when I used that.
11238
11239
11240         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11241         step into fixing the name resolution issues for delegates and
11242         unifying the toplevel name resolution.
11243
11244 2002-03-28  Martin Baulig  <martin@gnome.org>
11245
11246         * class.cs (Method.Emit): If we have a symbol writer, call its
11247         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11248         tell it about the current method.
11249
11250         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11251         writer that we're going to emit the first byte of IL code for a new
11252         statement (a new source line).
11253         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11254         EmitContext.Mark() before emitting any code.
11255
11256         * location.cs (SymbolDocument): Return null when we're Null.
11257
11258         * statement.cs (Statement): Moved the `Location loc' variable here.
11259         (Statement.EmitBoolExpression): If we have a symbol writer, call
11260         ec.Mark() before emitting any code to tell it that we're at the
11261         beginning of a new statement.
11262         (StatementExpression): Added `Location' argument to the constructor.
11263         (Block): Added public readonly variable `StartLocation' and public
11264         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11265         (Block): Added constructor which takes a start and end location.
11266         (Block.SetEndLocation): New method. This sets the end location.
11267         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11268         local variables we create.
11269         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11270         each statement and do also mark the begin and end of the block.
11271
11272         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11273         tell it the current lexer.Location, use Location.Null for the end of the
11274         block.
11275         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11276         current block, set its end location using SetEndLocation().
11277         (statement_expression): StatementExpression constructor now takes the
11278         lexer.Location as additional argument.
11279         (for_statement, declare_local_variables): Likewise.
11280         (declare_local_variables): When creating a new implicit block, use the
11281         new Block constructor and pass it the lexer.Location.
11282
11283 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11284
11285         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11286         members also on the parent interfaces recursively.
11287
11288 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11289
11290         * report.cs: Use new formats, since Gonzalo finished the missing
11291         bits. 
11292
11293         * expression.cs (Binary.ResolveOperator): added missing operator|
11294         operator& and operator^ for bool/bool.
11295
11296         * cs-parser.jay: CheckDef now takes a Location argument that is
11297         used to report errors more precisly (instead of reporting the end
11298         of a definition, we try to track something which is a lot closer
11299         to the source of the problem).
11300
11301         * cs-tokenizer.cs: Track global token use, so we can properly flag
11302         the use of #define/#undef after the first token has been seen.
11303
11304         Also, rename the reportXXXX to Error_DescriptiveName
11305
11306         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11307         TypeContainer, so that Enum and Interface can use this too.
11308
11309         * class.cs (TypeContainer.LookupInterfaceOrClass,
11310         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11311         `builder' argument.  Typically this was used to pass the parent
11312         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11313         the definition).  
11314
11315         The problem is that a nested class could trigger the definition of
11316         a toplevel class, and the builder would be obviously wrong in that
11317         case. 
11318
11319         So we drop this argument, and we compute dynamically the
11320         TypeBuilder/ModuleBuilder (the correct information was available
11321         to us anyways from DeclSpace.Parent)
11322
11323         * interface.cs (Interface.DefineInterface): Drop builder
11324         parameter cleanup like class.cs
11325
11326         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11327         like class.cs
11328
11329         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
11330         values. 
11331
11332         (Try.Emit): Propagate the returns value from the statement.
11333
11334         (Return.Emit): Even if we are leavning 
11335
11336         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
11337
11338         * modifiers.cs: Fix the computation of MethodAttributes flags.
11339
11340 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
11341
11342         * driver.cs: allow compilation of files that start with '/'.
11343         Add a default case when checking the argument of --target.
11344
11345 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
11346
11347         * interface.cs: Implement the same search algorithm for types in
11348         the interface code.
11349
11350         * delegate.cs: Do not allow multiple definition.
11351
11352         * Recovered ChangeLog that got accidentally amputated
11353
11354         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11355
11356         * rootcontext.cs: Load manually enum to allow core classes to
11357         contain enumerations.
11358
11359         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11360         Update to new static methods in TypeManager.
11361
11362         * typemanager.cs (GetMethod, GetConstructor): Use our
11363         implementation of FindMembers to find the members, since during
11364         corlib compilation, the types are TypeBuilders and GetMethod and
11365         GetConstructor do not work.
11366
11367         Make all methods in TypeManager static.
11368
11369         (InitCodeHelpers): Split the functionality from
11370         the InitCodeTypes function.
11371
11372         * driver.cs: Call InitCodeHelpers after we have populated the
11373         types. 
11374
11375         * cs-parser.jay (delegate_declaration): we did not used to compute
11376         the delegate name correctly for void delegates.
11377
11378 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11379
11380         * rootcontext.cs (RootContext): Init the interface_resolve_order
11381         and type_container_resolve_order always.
11382
11383         (ResolveCore, BootstrapCorlib_ResolveClass,
11384         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11385         compiler when compiling with --nostdlib
11386
11387         * class.cs (TypeContainer.DefineType): Check that our parent is
11388         not null.  This test is most important when we are bootstraping
11389         the core types.
11390
11391         * codegen.cs: Split out the symbol writing code.
11392
11393 2002-03-25  Martin Baulig  <martin@gnome.org>
11394
11395         * driver.cs (-g): Made -g an alias for --debug.
11396
11397 2002-03-24  Martin Baulig  <martin@gnome.org>
11398
11399         * codegen.cs (SymbolWriter): New public variable. Returns the
11400         current symbol writer.
11401         (CodeGen): Added `bool want_debugging_support' argument to the
11402          constructor. If true, tell the ModuleBuild that we want debugging
11403         support and ask it for the ISymbolWriter.
11404         (Save): If we have a symbol writer, call it's Close() method after
11405         saving the assembly.
11406
11407         * driver.c (--debug): New command line argument to create a
11408         debugger information file.
11409
11410         * location.cs (SymbolDocument): New public property. Returns an
11411         ISymbolDocumentWriter object for the current source file or null
11412         if we don't have a symbol writer.
11413
11414 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11415
11416         * driver.cs (LoadAssembly): Correctly return when all the paths
11417         have been tried and not before.
11418
11419         * statement.cs (Switch.Emit): return the actual coverage for this
11420         statement (returns/not-returns)
11421
11422         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11423         switch of the statement if we are the last switch section.  That
11424         kills two problems: try/catch problems (we used to emit an empty
11425         nop at the end) and switch statements where all branches would
11426         return. 
11427
11428 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11429
11430         * driver.cs: Add default assemblies (the equivalent to the
11431         Microsoft CSC.RSP file)
11432
11433         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11434         also update tokens_seen and set it to false.
11435
11436         * driver.cs: Implement --recurse for Mike.
11437
11438         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11439         correctly splitting out the paths.
11440
11441 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11442
11443         * interface.cs (Interface.PopulateProperty): Instead of using
11444         `parent' as the declaration space for the set parameters, use
11445         `this' 
11446
11447         * support.cs (InternalParameters): InternalParameters constructor
11448         takes a DeclSpace instead of a TypeContainer.
11449
11450         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11451         types are being initialized, load the address of it before calling
11452         the function.  
11453
11454         (New): Provide a mechanism to disable the generation of local
11455         value type temporaries when the caller will be providing us with
11456         an address to store it.
11457
11458         (ArrayCreation.EmitDynamicInitializers): Use it.
11459
11460 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11461
11462         * expression.cs (Invocation.EmitArguments): Only probe for array
11463         property if there is more than one argument.  Sorry about that.
11464
11465         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
11466         empty param arrays.
11467
11468         * class.cs (Method.LabelParameters): Fix incorrect code path that
11469         prevented the `ParamArrayAttribute' from being applied to the
11470         params attribute.
11471
11472 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
11473
11474         * support.cs (ReflectionParameters): Correctly compute whether the
11475         last argument is a params array.  Fixes the problem with
11476         string.Split ('a')
11477
11478         * typemanager.cs: Make the assemblies array always be non-null
11479         (empty, but non-null)
11480
11481         * tree.cs (RecordDecl): New function that abstracts the recording
11482         of names.  This reports error 101, and provides a pointer to the
11483         previous declaration.  Fixes a crash in the compiler.
11484
11485         * cs-parser.jay (constructor_declaration): Update to new grammar,
11486         and provide a constructor_body that can be empty.
11487
11488 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
11489
11490         * driver.cs: Add support for --resources.
11491
11492         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
11493         Make all types for the various array helper methods be integer.
11494
11495         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
11496         CheckState to ConvCast.
11497
11498         (ConvCast): Now it takes a `checked' state argument, to avoid
11499         depending on the emit context for the conversion, and just using
11500         the resolve time setting.
11501
11502         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
11503         instead of Invocation.EmitArguments.  We do not emit the original
11504         arguments, instead we emit those which have been converted to
11505         unsigned int expressions.
11506
11507         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
11508
11509         * codegen.cs: ditto.
11510
11511         * expression.cs (LocalVariableReference): Drop the use of the
11512         Store function that depended on the variable index.
11513
11514         * statement.cs (VariableInfo): Drop the `Idx' property from this
11515         class, as this is not taking into account the indexes for
11516         temporaries tat we generate during the execution, getting the
11517         indexes wrong.
11518
11519         * class.cs: First emit class initializers, then call the parent
11520         constructor. 
11521
11522         * expression.cs (Binary): Fix opcode emision.
11523         (UnaryMutator.EmitCode): Support checked code generation
11524
11525         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
11526         matches for events for both the Static and Instance scans,
11527         pointing to the same element.   Fix that.
11528
11529 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
11530
11531         * rootcontext.cs (ResolveTree): Always set the
11532         interface_resolve_order, because nested interfaces will be calling
11533         into us.
11534
11535         * class.cs (GetInterfaceOrClass): Track the same resolution
11536         process used by TypeManager.LookupType.  This fixes the nested
11537         type lookups in class declarations (separate path from
11538         LookupType). 
11539
11540         (TypeContainer.DefineType): Also define nested interfaces.
11541         (TypeContainer.RegisterOrder): New public function used to
11542         register the order in which child interfaces need to be closed.
11543
11544         Nested interfaces need to be closed after their parents have been
11545         created. 
11546
11547         * interface.cs (InterfaceAttr): Put all the logic for computing
11548         the interface attribute here. 
11549
11550         (DefineInterface): Register our interface order with the
11551         RootContext or with the TypeContainer depending on the case.
11552
11553 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11554
11555         * cs-parser.jay: rework foreach statement to work with the new
11556         changes to the policy on SimpleNames.
11557
11558         * report.cs: support Stacktrace on warnings as well.
11559
11560         * makefile: drop --unsafe and /unsafe from the compile.
11561
11562 2002-03-13  Ravi Pratap  <ravi@ximian.com>
11563
11564         * ecore.cs (StandardConversionExists): Modify to take an Expression
11565         as the first parameter. Ensure we do null -> reference type conversion
11566         checking.
11567
11568         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
11569         temporary Expression objects.
11570
11571 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
11572
11573         * interface.cs: workaround bug in method overloading resolution
11574         (there is already a bugzilla bug for it).
11575
11576 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11577
11578         We could also solve this problem by having a separate path for
11579         performing type lookups, instead of DoResolve, we could have a
11580         ResolveType entry point, and only participating pieces of the
11581         production (simplename, deref, array) would implement this. 
11582
11583         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
11584         signal SimpleName to only resolve type names and not attempt to
11585         resolve anything else.
11586
11587         * expression.cs (Cast): Set the flag.
11588
11589         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
11590
11591         * class.cs: Only report 108 if there is no `new' modifier.
11592
11593         * cs-parser.jay: rework foreach statement to work with the new
11594         changes to the policy on SimpleNames.
11595
11596         * report.cs: support Stacktrace on warnings as well.
11597
11598         * makefile: drop --unsafe and /unsafe from the compile.
11599
11600 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
11601
11602         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11603         lookups here, instead of doing that at parse time.  This means
11604         that our grammar will not introduce `LocalVariableReferences' as
11605         expressions at this point.  That solves the problem of code like
11606         this:
11607
11608         class X {
11609            static void Main ()
11610            { int X = 1;
11611             { X x = null }}}
11612
11613         This is only half the fix.  The full fix requires parameters to
11614         also be handled in this way.
11615
11616         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
11617         makes the use more obvious of the DeclSpace.  The
11618         ec.TypeContainer.TypeBuilder is now only used to pull the
11619         TypeBuilder for it.
11620
11621         My theory is that I can get rid of the TypeBuilder completely from
11622         the EmitContext, and have typecasts where it is used (from
11623         DeclSpace to where it matters).  
11624
11625         The only pending problem is that the code that implements Aliases
11626         is on TypeContainer, and probably should go in DeclSpace.
11627
11628         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11629         lookups here, instead of doing that at parse time.  This means
11630         that our grammar will not introduce `LocalVariableReferences' as
11631         expressions at this point.  That solves the problem of code like
11632         this:
11633
11634         class X {
11635            static void Main ()
11636            { int X = 1;
11637             { X x = null }}}
11638
11639         This is only half the fix.  The full fix requires parameters to
11640         also be handled in this way.
11641
11642         * class.cs (Property.DefineMethod): When implementing an interface
11643         method, set newslot, when implementing an abstract method, do not
11644         set the flag (before we tried never setting it, or always setting
11645         it, which is the difference).
11646         (Indexer.DefineMethod): same.
11647         (Method.DefineMethod): same.
11648
11649         * ecore.cs: Only set the status used flag if we get back a Field.
11650
11651         * attribute.cs: Temporary hack, so Paolo can keep working.
11652
11653 2002-03-08  Ravi Pratap  <ravi@ximian.com>
11654
11655         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
11656         the unmanaged type in the case we have a MarshalAs attribute.
11657
11658         (Resolve): Handle the case when we are parsing the special MarshalAs
11659         attribute [we need to store the unmanaged type to use later]
11660
11661         * typemanager.cs (marshal_as_attr_type): Built in type for the 
11662         MarshalAs Attribute.
11663
11664         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
11665         on parameters and accordingly set the marshalling info.
11666
11667 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
11668
11669         * class.cs: Optimizing slightly by removing redundant code after
11670         we switched to the `NoTypes' return value.
11671         (Property.DefineMethod): use NoTypes here too.
11672
11673         This fixes the bug I introduced in my last batch of changes.
11674
11675 2002-03-05  Ravi Pratap  <ravi@ximian.com>
11676
11677         * tree.cs (RecordEnum): Add. We now keep track of enums too.
11678
11679         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
11680         Enums since those are types too. 
11681
11682         * cs-parser.jay (enum_declaration): Record enums as we parse them.
11683
11684         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
11685         thanks to a call during the lookup process.
11686
11687 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
11688
11689         * statement.cs (Foreach): Lots of work to accomodate a particular
11690         kind of foreach statement that I had not kept in mind.  It is
11691         possible to have foreachs on classes that provide a GetEnumerator
11692         method that return objects that implement the "pattern" for using
11693         a foreach, there is no need to support GetEnumerator
11694         specifically. 
11695
11696         This is needed to compile nant.
11697
11698         * decl.cs: Only report 114 if the member is not `Finalize' and if
11699         the warning level is at least 2.
11700
11701         * class.cs: Moved the compare function from Method to
11702         MethodSignature. 
11703
11704         (MethodSignature.InheritableMemberSignatureCompare): Add new
11705         filter function that is used to extract inheritable methods from a
11706         class. 
11707
11708         (Method.Define): Use the new `inheritable_method_signature_filter'
11709         delegate
11710
11711         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
11712         command. 
11713
11714 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
11715
11716         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
11717
11718         * cs-parser.jay: Add opt_semicolon to the interface declaration.
11719
11720         * expression.cs: Pass location information to
11721         ConvertImplicitStandard. 
11722
11723         * class.cs: Added debugging code to track return values from
11724         interfaces. 
11725
11726 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
11727
11728         * expression.cs (Is.DoResolve): If either side of the `is' is an
11729         interface, do not flag the warning.
11730
11731         * ecore.cs (ImplicitReferenceConversion): We need a separate test
11732         for interfaces
11733
11734         * report.cs: Allow for --fatal to be used with --probe.
11735
11736         * typemanager.cs (NoTypes): Move the definition for the empty Type
11737         array here. 
11738
11739         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
11740         properties. 
11741         (TypeContainer.DefineProxy): New function used to proxy to parent
11742         implementations when implementing interfaces.
11743         (TypeContainer.ParentImplements): used to lookup if our parent
11744         implements a public function that is required by an interface.
11745         (TypeContainer.VerifyPendingMethods): Hook this up.
11746
11747         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
11748         `modules' and `assemblies' arraylists into arrays.  We only grow
11749         these are the very early start up of the program, so this improves
11750         the speedof LookupType (nicely measured).
11751
11752         * expression.cs (MakeByteBlob): Replaced unsafe code with
11753         BitConverter, as suggested by Paolo.
11754
11755         * cfold.cs (ConstantFold.Binary): Special case: perform constant
11756         folding of string concatenation, but if either side is a string,
11757         and the other is not, then return null, and let the runtime use
11758         the concatenation on the string plus the object (using
11759         `Object.ToString'). 
11760
11761 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
11762
11763         Constant Folding has been implemented now.
11764
11765         * expression.cs (Unary.Reduce): Do not throw an exception, catch
11766         the error instead on types that are not supported in one's
11767         complement. 
11768
11769         * constant.cs (Constant and all children): New set of functions to
11770         perform implict and explicit conversions.
11771
11772         * ecore.cs (EnumConstant): Implement the new functions to perform
11773         conversion by proxying to the child expression.
11774
11775         * codegen.cs: (ConstantCheckState): Constant evaluation has its
11776         own separate setting that can not be turned off from the command
11777         line using --unchecked or --checked and is only controlled using
11778         the checked/unchecked statements and expressions.  This setting is
11779         used by the constant folder to flag errors.
11780
11781         * expression.cs (CheckedExpr, UncheckedExpr): Set the
11782         ConstantCheckState as well.   
11783
11784         During Resolve, they also have to flag the state, because the
11785         constant folder runs completely in the Resolve phase.
11786
11787         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
11788         well.
11789
11790 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11791
11792         * cfold.cs: New file, this file contains the constant folder.
11793
11794         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
11795         argument to track whether we are using the resulting address to
11796         load or store a value and provide better error messages. 
11797
11798         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
11799         new AddressOf arguments.
11800
11801         * statement.cs (Foreach.EmitCollectionForeach): Update
11802
11803         * expression.cs (Argument.Emit): Call AddressOf with proper
11804         arguments to track usage.
11805
11806         (New.DoEmit): Call AddressOf with new arguments.
11807
11808         (Unary.Emit): Adjust AddressOf call.
11809
11810 2002-03-01  Ravi Pratap  <ravi@ximian.com>
11811
11812         * cs-parser.jay (member_access): Change the case for pre-defined types
11813         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
11814         this suggestion.
11815
11816         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
11817         a method body.
11818
11819         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
11820         essentially like methods and apply attributes like MethodImplOptions to them too.
11821
11822         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
11823         not being null.
11824
11825         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
11826         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
11827         is the DeclSpace.
11828
11829         * Update code everywhere accordingly.
11830
11831         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
11832
11833         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
11834
11835 2002-02-28  Ravi Pratap  <ravi@ximian.com>
11836
11837         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
11838         try performing lookups against those instead of jumping straight into using
11839         the 'using' clauses.
11840
11841         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
11842
11843         (LookupType): Perform lookups in implicit parents too.
11844
11845         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
11846         sequence as RootContext.LookupType. 
11847
11848         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
11849         the various cases of namespace lookups into this method.
11850
11851 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11852
11853         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
11854         in positional arguments)
11855
11856         * class.cs (Operator): Update the AllowedModifiers to contain
11857         extern. 
11858
11859         * cs-parser.jay: Update operator declaration to allow for the
11860         operator body to be empty.
11861
11862         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
11863         values. 
11864
11865 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
11866
11867         * class.cs (Method.Emit): Label parameters.
11868
11869         * driver.cs: Return 1 or 0 as the program exit code.
11870
11871 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
11872
11873         * expression.cs: Special case the `null' object when trying to
11874         auto-compute the type, as anything can be explicitly converted to
11875         that. 
11876
11877         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
11878         spotting this Paolo.
11879
11880         (Expression.ImplicitNumericConversion): Perform comparissions of
11881         the type using the underlying type in the case of an enumeration
11882         rather than using the enumeration type for the compare.
11883
11884         Cope with the underlying == type case, which is not possible to
11885         catch before. 
11886
11887         (Expression.ConvertNumericExplicit): Perform comparissions of
11888         the type using the underlying type in the case of an enumeration
11889         rather than using the enumeration type for the compare.
11890
11891         * driver.cs: If the user does not supply an extension, assume .exe
11892
11893         * cs-parser.jay (if_statement): Rewrote so that we can track the
11894         location for the if statement.
11895
11896         * expression.cs (Binary.ConstantFold): Only concat strings when
11897         the operation is "+", not everything ;-)
11898
11899         * statement.cs (Statement.EmitBoolExpression): Take a location
11900         argument. 
11901         (If, While, Do): Track location.
11902
11903         * expression.cs (Binary.ResolveOperator): In the object + string
11904         case, I was missing a call to ConvertImplicit
11905
11906 2002-02-25  Ravi Pratap  <ravi@ximian.com>
11907
11908         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
11909         Location arguments. Ensure we use RootContext.LookupType to do our work
11910         and not try to do a direct Type.GetType and ModuleBuilder.GetType
11911
11912         * interface.cs (PopulateMethod): Handle the type of the parameter being
11913         null gracefully.
11914
11915         * expression.cs (Invocation.BetterFunction): Handle the case when we 
11916         have a params method with no fixed arguments and a call is made with no
11917         arguments.
11918
11919 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
11920
11921         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
11922         the verbatim-string-literal
11923
11924         * support.cs (InternalParameters.ParameterModifier): handle null
11925         fixed parameters.
11926         (InternalParameters.ParameterType): ditto.
11927
11928         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
11929         duplicating the name of the variable parameter.
11930         (GetParameterByName): Fix bug where we were not looking up array
11931         paramters if they were the only present (thanks Paolo!).
11932         (GetParameterInfo): We only have an empty set of types if both
11933         fixed and array are set to null.
11934         (GetParameterInfo-idx): Handle FixedParameter == null
11935
11936         * cs-parser.jay: Handle the case where there is no catch
11937         statements (missing null test).
11938
11939 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
11940
11941         * driver.cs (MainDriver): Be conservative on our command line
11942         handling.
11943
11944         Catch DirectoryNotFoundException when calling GetFiles.
11945
11946         (SplitPathAndPattern): Used to split the input specification into
11947         a path and a pattern that we can feed to Directory.GetFiles.
11948
11949 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
11950
11951         * statement.cs (Fixed): Implement the last case of the Fixed
11952         statement (string handling).
11953
11954         * expression.cs (StringPtr): New class used to return a char * to
11955         a string;  Used by the Fixed statement.
11956
11957         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
11958
11959         * expression.cs (Binary.ResolveOperator): Remove redundant
11960         MemberLookup pn parent type.
11961         Optimize union call, we do not need a union if the types are the same.
11962         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
11963         type.
11964
11965         Specialize the use of MemberLookup everywhere, instead of using
11966         the default settings. 
11967
11968         (StackAlloc): Implement stackalloc keyword.
11969
11970         * cs-parser.jay: Add rule to parse stackalloc.
11971
11972         * driver.cs: Handle /h, /help, /?
11973
11974         * expression.cs (MakeByteBlob): Removed the hacks we had in place
11975         before we supported unsafe code.
11976
11977         * makefile: add --unsafe to the self compilation of mcs.
11978
11979 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
11980
11981         * expression.cs (PointerArithmetic): New class that is used to
11982         perform pointer arithmetic.
11983         (Binary.Resolve): Handle pointer arithmetic
11984         Handle pointer comparission.
11985         (ArrayPtr): Utility expression class that is used to take the
11986         address of an array.
11987
11988         (ElementAccess): Implement array access for pointers
11989
11990         * statement.cs (Fixed): Implement fixed statement for arrays, we
11991         are missing one more case before we are done.
11992
11993         * expression.cs (Indirection): Implement EmitAssign and set the
11994         ExprClass to Variable.  This allows pointer dereferences to be
11995         treated as variables, and to have values assigned to them.
11996
11997         * ecore.cs (Expression.StoreFromPtr): New utility function to
11998         store values dereferencing.
11999
12000 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12001
12002         * expression.cs (Binary.ResolveOperator): Ensure that we are
12003         not trying to operate on a void type - this fixes the reported
12004         bug.
12005
12006         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12007         the parent implementation is sealed.
12008
12009         * ../errors/cs0239.cs : Add.
12010
12011         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12012
12013         * typemanager.cs (unverifiable_code_type): Corresponds to 
12014         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12015         which have unsafe code in them.
12016
12017         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12018         unsafe context.
12019
12020 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12021
12022         * cs-tokenizer.cs: Add support for @"litreal strings"
12023
12024         Make tokenizer accept pre-processor directives
12025         on any column (remove the old C-like limitation). 
12026
12027         * rootcontext.cs (EmitCode): Emit any global attributes.
12028         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12029
12030         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12031
12032         * cs-parser.jay: Add support for global attributes.  
12033
12034 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12035
12036         * expression.cs (Indirection): New helper class.  Unary will
12037         create Indirection classes to be able to implement the
12038         IMemoryLocation interface on it.
12039
12040 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12041
12042         * cs-parser.jay (fixed_statement): reference the right statement.
12043
12044         * statement.cs (Fixed.Emit): Finish implementing the fixed
12045         statement for the &x case.
12046
12047 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12048
12049         * class.cs (Property.Define, Method.Define): Remove newslot when
12050         `implementing'.  
12051
12052         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12053         wrong.  NewSlot should only be used if the `new' keyword is present.
12054
12055         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12056         locating our system dir.  Sorry about this.
12057
12058 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12059
12060         * driver.cs (GetSystemDir): Compute correctly the location of our
12061         system assemblies.  I was using the compiler directory instead of
12062         the library directory.
12063
12064 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12065
12066         * expression.cs (BetterFunction): Put back in what Miguel commented out
12067         since it is the correct fix. The problem is elsewhere ;-)
12068
12069         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12070         parameters of the parms method are themselves compatible or not !
12071
12072         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12073         to check that a class implements an interface before saying that an implicit
12074         conversion was allowed. Use ImplementsInterface to do the checking.
12075
12076 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12077
12078         * class.cs (Method.Define): Track whether we are an explicit
12079         implementation or not.  And only call DefineMethodOverride if we
12080         are an explicit implementation.
12081
12082         (Property.DefineMethod): Ditto.
12083
12084 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12085
12086         * expression.cs (BetterFunction): Catch hideous bug which was
12087          preventing us from detecting ambiguous calls due to implicit casts i.e
12088         cs0121.
12089
12090 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12091
12092         * support.cs (Pair): Remove un-needed method.  I figured why I was
12093         getting the error in cs-parser.jay, the variable in a foreach loop
12094         is readonly, and the compiler does not really treat this as a variable.
12095
12096         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12097         instead of EQUALS in grammar.  
12098
12099         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12100
12101         * expression.cs (Unary.DoResolve): Check whether the argument is
12102         managed or not.
12103
12104 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12105
12106         * support.cs: Api for Pair to set a value.  Despite the fact that
12107         the variables are public the MS C# compiler refuses to compile
12108         code that accesses the field if the variable is part of a foreach
12109         statement. 
12110
12111         * statement.cs (Fixed): Begin implementation of the fixed
12112         statement.
12113
12114         (Block.AddVariable): Return the VariableInfo on success and null
12115         on failure instead of true/false. 
12116
12117         * cs-parser.jay (foreach): Catch errors on variables already
12118         defined (we were ignoring this value before) and properly unwind
12119         the block hierarchy
12120
12121         (fixed_statement): grammar for the fixed statement.
12122
12123 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12124
12125         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12126         pointer types to be incretemented.
12127
12128         (SizeOf): Implement.
12129
12130         * cs-parser.jay (pointer_member_access): Implement
12131         expr->IDENTIFIER production.
12132
12133         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12134         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12135         on safe contexts.
12136
12137         (Unary): Implement indirection.
12138
12139         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12140         use in non-unsafe context).
12141
12142         (SimpleName.DoResolve): Check for pointers in field access on safe
12143         contexts. 
12144
12145         (Expression.LoadFromPtr): Factor the load-indirect code in this
12146         function.  This was duplicated in UnboxCast and ParameterReference
12147
12148 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12149
12150         * expression.cs (ComposedCast): report an error if a pointer cast
12151         is used in a safe region.
12152
12153         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12154         pointer type casts in unsafe context.
12155
12156         * codegen.cs (EmitContext): Set up IsUnsafe.
12157
12158         * cs-parser.jay (non_expression_type): Add productions for pointer
12159         casts. 
12160
12161         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12162         code.  We should not use force into static mode if the method is
12163         not virtual.  Fixes bug in MIS
12164
12165         * statement.cs (Do.Emit, While.Emit, For.Emit,
12166         Statement.EmitBoolExpression): Add support to Do and While to
12167         propagate infinite loop as `I do return' semantics.
12168
12169         Improve the For case to also test for boolean constants.
12170
12171         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12172         to the list of attributes we can add.
12173
12174         Remove `EmitContext' argument.
12175
12176         * class.cs (Method.Define): Apply parameter attributes.
12177         (Constructor.Define): Apply parameter attributes.
12178         (MethodCore.LabelParameters): Move here the core of labeling
12179         parameters. 
12180
12181         * support.cs (ReflectionParameters.ParameterModifier,
12182         InternalParameters.ParameterModifier): Use IsByRef on the type and
12183         only return the OUT bit for these parameters instead of in/out/ref
12184         flags.
12185
12186         This is because I miss-understood things.  The ParameterInfo.IsIn
12187         and IsOut represent whether the parameter has the [In] and [Out]
12188         attributes set.  
12189
12190 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12191
12192         * ecore.cs (FieldExpr.Emit): Release temporaries.
12193
12194         * assign.cs (LocalTemporary.Release): new function.
12195
12196         * codegen.cs (EmitContext.GetTemporaryStorage,
12197         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12198         temporary storage.  Now we can "put back" localbuilders when we
12199         are done with them
12200
12201 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12202
12203         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12204         need to make a copy of the variable to generate verifiable code.
12205
12206 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12207
12208         * driver.cs: Compute dynamically the system directory.
12209
12210         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12211         Slower, but more generally useful.  Used by the abstract
12212         registering implementation. 
12213
12214         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12215         the rules for the special rule on Type/instances.  First check if
12216         we have the same name, and if so, try that special static path
12217         rather than the instance path.
12218
12219 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12220
12221         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12222         for, while and if.
12223
12224         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12225         Enum, ValueType, Delegate or Array for non-corlib compiles.
12226
12227         * cs-tokenizer.cs: Catch long identifiers (645)
12228
12229         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12230         piece of code.
12231
12232         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12233         fix, we were returning too early, so we were not registering
12234         pending methods from abstract classes.
12235
12236         Do not register pending methods if the class is abstract.
12237
12238         * expression.cs (Conditional.DoResolve): Report circular implicit
12239         conversions when we neecd to compute it for conditional
12240         expressions. 
12241
12242         (Is.DoResolve): If the expression is always of the provided type,
12243         flag warning 183.  If the expression can not ever be of the
12244         provided type flag warning 184.
12245
12246         * class.cs: Catch 169 as well.
12247
12248         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12249         read. 
12250
12251 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12252
12253         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12254
12255 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12256
12257         * interface.cs: (PopulateMethod): Check for pointers being defined
12258         only if the unsafe context is active.
12259         (PopulateProperty): ditto.
12260         (PopulateIndexer): ditto.
12261
12262         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12263         specified.  If pointers are present, make sure that they are
12264         present in an unsafe context.
12265         (Constructor, Constructor.Define): ditto.
12266         (Field, Field.Define): ditto.
12267         (Property, Property.Define): ditto.
12268         (Event, Event.Define): ditto.
12269
12270         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12271         hashtable if there are classes or structs defined.
12272
12273         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12274         code, as the constant resolution moved.
12275
12276         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12277         the metadata, so we can flag error 133. 
12278
12279         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12280         pointer is being declared in an unsafe context.
12281
12282 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12283
12284         * modifiers.cs (Modifiers.Check): Require a Location argument.
12285         Report error 227 for Unsafe use.
12286
12287         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12288
12289         * statement.cs (For.Emit): If the test is null, then report that
12290         we do `return', as we wont reach anything afterwards.
12291
12292         (Switch.SwitchGoverningType): Track the expression that matched
12293         the conversion.
12294
12295         * driver.cs: Allow negative numbers as an error code to flag.
12296
12297         * cs-parser.jay: Handle 1551.
12298
12299         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12300
12301 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12302
12303         * cs-parser.jay: Report 1518 (type declaration can only contain
12304         class, struct, interface, enum or delegate)
12305
12306         (switch_label): Report 1523 (keywords `case' or `default' must
12307         preced code)
12308
12309         (opt_switch_sections): Report 1522 (empty switch)
12310
12311         * driver.cs: Report 1515 (response file specified multiple times)
12312         Report 1516 (Source file specified multiple times).
12313
12314         * expression.cs (Argument.Resolve): Signal 1510
12315
12316         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12317         access not allowed in static code)
12318
12319 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12320
12321         * typemanager.cs (IsPointerType): Utility method which we are going
12322         to need a lot.
12323
12324         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12325         the object type, so we take care of that.
12326
12327         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12328
12329         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
12330         added to non-params parameters :-)
12331
12332         * typemanager.cs (CSharpName): Include 'void' type too. 
12333
12334         (void_ptr_type): Include in the set of core types.
12335
12336         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
12337         duplicating code.
12338
12339         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
12340         an unsafe context.
12341
12342         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
12343         completely forgotten about it.
12344
12345 2002-01-10  Ravi Pratap  <ravi@ximian.com>
12346
12347         * cs-parser.jay (pointer_type): Add. This begins our implementation
12348         of parsing rules for unsafe code.
12349
12350         (unsafe_statement): Implement.
12351
12352         (embedded_statement): Modify to include the above.
12353
12354         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12355
12356         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12357         if the current context is an unsafe one.
12358
12359         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12360         are handled differently, we need separate rules for them.
12361
12362         (local_variable_declaration): Update to use local_variable_pointer_type
12363         to allow variable declarations of unmanaged pointer types.
12364
12365         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12366         in unsafe contexts.
12367
12368         * ../errors/cs0214.cs : Add.
12369
12370 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12371
12372         * makefile: remove 'response' file when cleaning.
12373
12374 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12375
12376         * cs-parser.jay: Report 1524.
12377
12378 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12379
12380         * typemanager.cs (RegisterMethod): drop checking if we have
12381         registered this from here
12382
12383 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12384
12385         * class.cs (Method.EmitDestructor): Implement calling our base
12386         destructor. 
12387
12388         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12389         value of InFinally.
12390
12391         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12392         this routine and will wrap the call in a try/catch block.  Deal
12393         with the case.
12394
12395 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12396
12397         * ecore.cs (Expression.MemberLookup): instead of taking a
12398         parameter `same_type' that was used to tell whether we could
12399         access private members we compute our containing type from the
12400         EmitContext.
12401
12402         (FieldExpr): Added partial support for volatile fields.  This does
12403         not work for volatile fields exposed from assemblies, as I can not
12404         figure out how to extract the modreq from it.
12405
12406         Updated all the source files to use this.
12407
12408         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12409         because it is referenced by MemberLookup very often. 
12410
12411 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12412
12413         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12414         TypeBuilder.GetCustomAttributes to retrieve what we need.
12415
12416         Get rid of redundant default_member_attr_type as this is the same as
12417         default_member_type which already exists.
12418
12419         * interface.cs, attribute.cs : Update accordingly.
12420
12421 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12422
12423         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12424         work for TYpeBuilders though.  Ravi, can you please fix this?
12425
12426         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12427
12428         * expression.cs (Argument.Emit): Handle the case of ref objects
12429         being passed to ref functions;  
12430
12431         (ParameterReference.EmitLoad): Loads the content of the pointer
12432         without dereferencing.
12433
12434 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12435
12436         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12437
12438 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12439
12440         * class.cs (Indexer.DefineMethod): Incorporate the interface
12441         type in the name of the method if we are doing explicit interface
12442         implementation.
12443
12444         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12445
12446         (BetterConversion): Fix extremely trivial bug where we were referring to
12447         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12448         again !
12449
12450         * ../errors/bug16.cs : Add although we have fixed it.
12451
12452 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12453
12454         * expression.cs (BaseIndexer): Begin implementation.
12455
12456         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12457
12458         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12459         production directly to remove a shift/reduce, and implement
12460         explicit interface implementation.
12461
12462         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
12463         after a floating point suffix.
12464
12465         * expression.cs (DoNumericPromotions): Improved the conversion for
12466         uint/uint.  If we have a constant, we avoid doing a typecast to a
12467         larger type.
12468
12469         * class.cs (Indexer): Implement explicit interface implementation
12470         for indexers.
12471
12472 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
12473
12474         * class.cs: make the default instance constructor public and hidebysig.
12475
12476 2001-01-03  Ravi Pratap  <ravi@ximian.com>
12477
12478         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
12479         so we can call it from elsewhere.
12480
12481         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
12482         we emit it internally if the class has a defined indexer; otherwise the user
12483         emits it by decorating the class definition with the DefaultMemberAttribute.
12484
12485         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
12486         attribute is not used on a type which defines an indexer.
12487
12488         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
12489         character when we skip whitespace.
12490
12491         * ../errors/cs0646.cs : Add.
12492
12493 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
12494
12495         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
12496         again. 
12497
12498         * makefile: Add practical target `mcs3.exe' which builds the third
12499         generation compiler. 
12500
12501         * expression.cs (New): Fix structures constructor calling.
12502
12503         * class.cs (Property, Method, Indexer): Emit Final flag on the
12504         method if we are an interface implementation and we are not
12505         abstract. 
12506
12507         * ecore.cs (PropertyExpr): New public field `IsBase', tells
12508         whether this property is referencing a `base' method.
12509
12510         * expression.cs (Invocation.EmitCall): take an extra argument:
12511         is_base, this is used to determine whether the `call' or
12512         `callvirt' opcode should be used.
12513
12514
12515         * delegate.cs: update EmitCall.
12516
12517         * class.cs (Method.Define): Set NewSlot for the cases where we are
12518         not implementing an interface method.
12519
12520         (Property.Define): ditto.
12521
12522 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
12523
12524         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
12525         'r'.  Allows mcs to parse itself fully.
12526
12527 2002-01-02  Ravi Pratap  <ravi@ximian.com>
12528
12529         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
12530         of the number of initializers that require the InitializeArray method.
12531
12532         (CheckIndices): Store the Expression in all cases - not the plain value. Also
12533         update the above field where necessary.
12534
12535         (MakeByteBlob): Update accordingly.
12536
12537         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
12538         greater than 2.
12539
12540         (EmitDynamicInitializers): Update in accordance with the new optimization.
12541
12542         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
12543         same OpCode applies.
12544
12545         * cs-parser.jay : Fix some glaring errors I introduced.
12546
12547 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
12548
12549         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
12550         so that we can check for name clashes there too.
12551
12552         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
12553         for interface indexers.
12554
12555         * interfaces.cs (Define): Emit the default member attribute.
12556
12557         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
12558         variable was being referred to while setting the value ;-)
12559
12560 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
12561
12562         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
12563         byte-by-byte information when we know the data is zero.
12564
12565         Make the block always a multiple of 4, because
12566         DefineInitializedData has a bug.
12567
12568         * assign.cs: Fix, we should assign from the temporary, not from
12569         the source. 
12570
12571         * expression.cs (MakeByteBlob): Fix my incorrect code.
12572
12573 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
12574
12575         * typemanager.cs (EnumToUnderlying): This function is used to get
12576         the underlying type from an enumeration, because it does not
12577         always work. 
12578
12579         * constant.cs: Use the I4_S form for values between -128 and 127.
12580
12581         * statement.cs (Block.LookupLabel): Looks up a label.
12582         (Block): Drop support for labeled blocks.
12583
12584         (LabeledStatement): New kind of statement that represents a label
12585         only.
12586
12587         (Goto): Finally implement this bad boy.
12588
12589         * cs-parser.jay: Update to reflect new mechanism to implement
12590         labels.
12591
12592 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
12593
12594         * codegen.cs (EmitContext.This): a codegen property that keeps the
12595         a single instance of this instead of creating many different this
12596         instances. 
12597
12598         * delegate.cs (Delegate.DoResolve): Update to use the property;
12599
12600         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
12601
12602         * expression.cs (BaseAccess.DoResolve): Ditto.
12603
12604 2001-12-29  Ravi Pratap  <ravi@ximian.com>
12605
12606         * typemanager.cs (methodimpl_attr_type): Add to hold the type
12607         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
12608
12609         (InitCoreTypes): Update accordingly.
12610
12611         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
12612         so we can quickly store the state.
12613
12614         (ApplyAttributes): Set the correct implementation flags
12615         for InternalCall methods.
12616
12617 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
12618
12619         * expression.cs (EmitCall): if a method is not virtual, then do
12620         not use callvirt on it.
12621
12622         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
12623         user defined stuff) requires the use of stobj, which takes an
12624         address on the stack instead of an array and an index.  So emit
12625         the Ldelema operation for it.
12626
12627         (EmitStoreOpcode): Use stobj for valuetypes.
12628
12629         (UnaryMutator.EmitCode): Use the right 1 value depending on
12630         whether we are dealing with int64/uint64, float or doubles.
12631
12632         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
12633         constructors that I implemented last night.
12634
12635         (Constructor.IsDefault): Fix to work properly for static
12636         constructors.
12637
12638         * cs-parser.jay (CheckDef): report method signature errors.
12639         Update error number 103 to be 132.
12640
12641         * decl.cs: New AdditionResult enumeration value: MethodExists.
12642         Although we do this check for methods later on in the semantic
12643         analysis, catching repeated default constructors is so easy that
12644         we catch these here. 
12645
12646         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
12647         promotions code.
12648
12649         (ParameterReference.EmitAssign, Emit): handle
12650         bools as bytes.
12651
12652         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
12653         (ArrayAccess.EmitStoreOpcode): ditto.
12654
12655         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
12656
12657         * expression.cs (MakeByteBlob): Complete all the missing types
12658         (uint, short, ushort, byte, sbyte)
12659
12660         * class.cs: Only init instance field initializers on instance
12661         constructors. 
12662
12663         Rename `constructors' to instance_constructors. 
12664
12665         (TypeContainer.AddConstructor): Only add constructors to the list
12666         if it is not static.
12667
12668         Make sure that we handle default_static_constructor independently
12669         everywhere where we handle instance_constructors
12670
12671 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
12672
12673         * class.cs: Do not lookup or create a base initializer for a
12674         static constructor.
12675
12676         (ConstructorInitializer.Resolve): use the proper type to lookup
12677         for constructors.
12678
12679         * cs-parser.jay: Report error 1585 (modifiers between type and name).
12680
12681         * enum.cs, interface.cs: Remove CloseType, this is taken care by
12682         in DeclSpace. 
12683
12684         * decl.cs: CloseType is now an virtual method, the default
12685         implementation just closes this type.
12686
12687 2001-12-28  Ravi Pratap  <ravi@ximian.com>
12688
12689         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
12690         to PreserveSig by default. Also emit HideBySig on such methods.
12691
12692         Basically, set the defaults to standard values.
12693
12694         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
12695         argument, if candidate is better, it can't be worse than the best !
12696
12697         (Invocation): Re-write bits to differentiate between methods being
12698         applicable in their expanded form and their normal form - for params
12699         methods of course.
12700
12701         Get rid of use_standard everywhere as only standard conversions are allowed
12702         in overload resolution. 
12703
12704         More spec conformance.
12705
12706 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12707
12708         * driver.cs: Add --timestamp, to see where the compiler spends
12709         most of its time.
12710
12711         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
12712         `this' in static code.
12713
12714         (SimpleName.DoResolve): Implement in terms of a helper function
12715         that allows static-references to be passed upstream to
12716         MemberAccess.
12717
12718         (Expression.ResolveWithSimpleName): Resolve specially simple
12719         names when called by MemberAccess to implement the special
12720         semantics. 
12721
12722         (Expression.ImplicitReferenceConversion): Handle conversions from
12723         Null to reference types before others, as Null's type is
12724         System.Object. 
12725
12726         * expression.cs (Invocation.EmitCall): Handle the special case of
12727         calling methods declared on a reference type from a ValueType
12728         (Base classes System.Object and System.Enum)
12729
12730         (MemberAccess.Resolve): Only perform lookups on Enumerations if
12731         the left hand side is a TypeExpr, not on every enumeration. 
12732
12733         (Binary.Resolve): If types are reference types, then do a cast to
12734         object on operators != and == of both arguments.
12735
12736         * typemanager.cs (FindMembers): Extract instance and static
12737         members if requested.
12738
12739         * interface.cs (PopulateProperty): Use void_type instead of null
12740         as the return type for the setter method.
12741
12742         (PopulateIndexer): ditto.
12743
12744 2001-12-27  Ravi Pratap  <ravi@ximian.com>
12745
12746         * support.cs (ReflectionParameters): Fix minor bug where we
12747         were examining the wrong parameter for the ParamArray attribute.
12748
12749         Cope with requests for the type of the parameter at position
12750         greater than the params parameter's. We now return the element
12751         type of the params array as that makes more sense.
12752
12753         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
12754         accordingly as we no longer have to extract the element type
12755         ourselves.
12756
12757         (Invocation.OverloadResolve): Update.
12758
12759 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12760
12761         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
12762         against IEnumerator, test whether the return value is a descendant
12763         of the IEnumerator interface.
12764
12765         * class.cs (Indexer.Define): Use an auxiliary method to implement
12766         the other bits of the method definition.  Begin support for
12767         explicit interface implementation.
12768
12769         (Property.DefineMethod): Use TypeManager.void_type instead of null
12770         for an empty return value.
12771
12772 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
12773
12774         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
12775         dealing with a FieldExpr which is composed of a FieldBuilder, in
12776         the code path we did extract the constant, but we should have
12777         obtained the underlying value to be able to cast it (otherwise we
12778         end up in an infinite loop, this is what Ravi was running into).
12779
12780         (ArrayCreation.UpdateIndices): Arrays might be empty.
12781
12782         (MemberAccess.ResolveMemberAccess): Add support for section
12783         14.5.4.1 that deals with the special case of E.I when E is a type
12784         and something else, that I can be a reference to a static member.
12785
12786         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
12787         handle a particular array type to create byte blobs, it is just
12788         something we dont generate byteblobs for.
12789
12790         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
12791         arguments. 
12792
12793         * location.cs (Push): remove the key from the hashtable that we
12794         are about to add.   This happens for empty files.
12795
12796         * driver.cs: Dispose files after we have parsed them.
12797
12798         (tokenize): new function that only runs the tokenizer on its
12799         input, for speed testing.
12800
12801 2001-12-26  Ravi Pratap  <ravi@ximian.com>
12802
12803         * class.cs (Event.Define): Define the private field only if there
12804         are no accessors defined.
12805
12806         * expression.cs (ResolveMemberAccess): If there is no associated
12807         field with the event, that means we have an event defined with its
12808         own accessors and we should flag error cs0070 since transforming
12809         ourselves into a field is not valid in that case.
12810
12811         * ecore.cs (SimpleName.DoResolve): Same as above.
12812
12813         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
12814         and charset to sane values.
12815
12816 2001-12-25  Ravi Pratap  <ravi@ximian.com>
12817
12818         * assign.cs (DoResolve): Perform check on events only if they 
12819         are being accessed outside the declaring type.
12820
12821         * cs-parser.jay (event_declarations): Update rules to correctly
12822         set the type of the implicit parameter etc.
12823
12824         (add_accessor, remove_accessor): Set current local parameters.
12825
12826         * expression.cs (Binary): For delegate addition and subtraction,
12827         cast the return value from the method into the appropriate delegate
12828         type.
12829
12830 2001-12-24  Ravi Pratap  <ravi@ximian.com>
12831
12832         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
12833         of these as the workaround is unnecessary.
12834
12835         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
12836         delegate data - none of that is needed at all.
12837
12838         Re-write bits to extract the instance expression and the delegate method
12839         correctly.
12840
12841         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
12842         on delegates too.
12843
12844         * attribute.cs (ApplyAttributes): New method to take care of common tasks
12845         of attaching attributes instead of duplicating code everywhere.
12846
12847         * everywhere : Update code to do attribute emission using the above method.
12848
12849 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12850
12851         * expression.cs (IsParamsMethodApplicable): if there are not
12852         parameters, return immediately.
12853
12854         * ecore.cs: The 0 literal can be implicity converted to an enum
12855         type. 
12856
12857         (SimpleName.DoResolve): First lookup the type, then lookup the
12858         members. 
12859
12860         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
12861         want to get its address.  If the InstanceExpression is not
12862         addressable, store the result in a temporary variable, then get
12863         the address of it.
12864
12865         * codegen.cs: Only display 219 errors on warning level or above. 
12866
12867         * expression.cs (ArrayAccess): Make it implement the
12868         IMemoryLocation interface.
12869
12870         (Binary.DoResolve): handle the operator == (object a, object b)
12871         and operator != (object a, object b) without incurring into a
12872         BoxedCast (because 5 != o should never be performed).
12873
12874         Handle binary enumerator operators.
12875
12876         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
12877         value type, otherwise use Ldelem_ref.
12878
12879         Use precomputed names;
12880
12881         (AddressOf): Implement address of
12882
12883         * cs-parser.jay (labeled_statement): Fix recursive block
12884         addition by reworking the production.
12885
12886         * expression.cs (New.DoEmit): New has a special case:
12887                 
12888                  If we are dealing with a ValueType, we have a few
12889                  situations to deal with:
12890                 
12891                     * The target of New is a ValueType variable, that is
12892                       easy, we just pass this as the variable reference
12893                 
12894                     * The target of New is being passed as an argument,
12895                       to a boxing operation or a function that takes a
12896                       ValueType.
12897                 
12898                       In this case, we need to create a temporary variable
12899                       that is the argument of New.
12900
12901
12902 2001-12-23  Ravi Pratap  <ravi@ximian.com>
12903
12904         * rootcontext.cs (LookupType): Check that current_type is not null before
12905         going about looking at nested types.
12906
12907         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
12908         not implement the IAssignMethod interface any more.
12909
12910         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
12911         where we tranform them into FieldExprs if they are being resolved from within
12912         the declaring type.
12913
12914         * ecore.cs (SimpleName.DoResolve): Do the same here.
12915
12916         * assign.cs (DoResolve, Emit): Clean up code considerably. 
12917
12918         * ../errors/bug10.cs : Add.
12919
12920         * ../errors/cs0070.cs : Add.
12921
12922         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
12923
12924         * assign.cs : Get rid of EventIsLocal everywhere.
12925
12926 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12927
12928         * ecore.cs (ConvertIntLiteral): finished the implementation.
12929
12930         * statement.cs (SwitchLabel): Convert the value we are using as a
12931         key before looking up the table.
12932
12933 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12934
12935         * codegen.cs (EmitTopBlock): Require a Location argument now.
12936
12937         * cs-parser.jay (constructor_declarator): We need to setup
12938         current_local_parameters before we parse the
12939         opt_constructor_initializer, to allow the variables to be bound
12940         to the constructor arguments.
12941
12942         * rootcontext.cs (LookupType): First lookup nested classes in our
12943         class and our parents before we go looking outside our class.
12944
12945         * expression.cs (ConstantFold): Extract/debox the values at the
12946         beginnning. 
12947
12948         * rootcontext.cs (EmitCode): Resolve the constants first before we
12949         resolve the types.  This is not really needed, but it helps debugging.
12950
12951         * statement.cs: report location.
12952
12953         * cs-parser.jay: pass location to throw statement.
12954
12955         * driver.cs: Small bug fix.
12956
12957         * report.cs: Updated format to be 4-zero filled digits.
12958
12959 2001-12-22  Ravi Pratap  <ravi@ximian.com>
12960
12961         * expression.cs (CheckIndices): Fix minor bug where the wrong
12962         variable was being referred to ;-)
12963
12964         (DoEmit): Do not call EmitStaticInitializers when the 
12965         underlying type is System.Object.
12966
12967 2001-12-21  Ravi Pratap  <ravi@ximian.com>
12968
12969         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
12970         and do the usual workaround for SRE.
12971
12972         * class.cs (MyEventBuilder.EventType): New member to get at the type
12973         of the event, quickly.
12974
12975         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
12976
12977         * assign.cs (Assign.DoResolve): Handle the case when the target
12978         is an EventExpr and perform the necessary checks.
12979
12980         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
12981         interface.
12982
12983         (SimpleName.MemberStaticCheck): Include check for EventExpr.
12984
12985         (EventExpr): Set the type in the constructor itself since we 
12986         are meant to be born fully resolved.
12987
12988         (EventExpr.Define): Revert code I wrote earlier.
12989                 
12990         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
12991         instance expression is null. The instance expression is a This in that case
12992         or a null, depending on whether it is a static method or not.
12993
12994         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
12995         refers to more than one method.
12996
12997         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
12998         and accordingly flag errors.
12999
13000 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13001
13002         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13003
13004 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13005
13006         * location.cs (ToString): Provide useful rutine.
13007
13008 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13009
13010         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13011         objects, return the actual integral boxed.
13012
13013         * statement.cs (SwitchLabel): define an ILLabel for each
13014         SwitchLabel. 
13015
13016         (Switch.CheckSwitch): If the value is a Literal, extract
13017         the underlying literal.
13018
13019         Also in the unused hashtable we had, add the SwitchLabel so we can
13020         quickly look this value up.
13021
13022         * constant.cs: Implement a bunch of new constants.  Rewrite
13023         Literal based on this.  Made changes everywhere to adapt to this.
13024
13025         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13026         dereferencing array only once, and also copes with enumrations.
13027
13028         bytes are two bytes wide, not one.
13029
13030         (Cast): Perform constant conversions.
13031
13032         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13033         wrappers to the literals here.
13034
13035         * expression.cs (DoNumericPromotions): long literals can converted
13036         to ulong implicity (this is taken care of elsewhere, but I was
13037         missing this spot).
13038
13039         * ecore.cs (Expression.Literalize): Make the return type Literal,
13040         to improve type checking.
13041
13042         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13043
13044 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13045
13046         * literal.cs: Revert code from ravi that checked the bounds.  The
13047         bounds are sane by the definition of the type itself. 
13048
13049         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13050         need to actually look up in our parent hierarchy for interfaces
13051         implemented. 
13052
13053         * const.cs: Use the underlying type for enumerations
13054
13055         * delegate.cs: Compute the basename for the delegate creation,
13056         that should fix the delegate test case, and restore the correct
13057         Type Lookup semantics in rootcontext
13058
13059         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13060         referencing a nested type with the Reflection API is using the "+"
13061         sign. 
13062
13063         * cs-parser.jay: Do not require EOF token at the end.
13064
13065 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13066
13067         * rootcontext.cs (LookupType): Concatenate type names with
13068         a '.' instead of a '+' The test suite passes again.
13069
13070         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13071         field of the enumeration.
13072
13073         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13074         the case when the member is an EventExpr.
13075
13076         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13077         static has an associated instance expression.
13078
13079         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13080
13081         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13082
13083         * class.cs (Event.Define): Register event and perform appropriate checks
13084         for error #111.
13085
13086         We define the Add and Remove methods even if the use provides none because
13087         in that case, we provide default implementations ourselves.
13088
13089         Define a private field of the type of the event. This is done by the CSC compiler
13090         and we should be doing it too ;-)
13091
13092         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13093         More methods we use in code we generate.
13094
13095         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13096         is important.
13097
13098         (InitCoreTypes): Update accordingly for the above.
13099
13100         * class.cs (Event.Emit): Generate code for default accessors that we provide
13101
13102         (EmitDefaultMethod): Do the job in the above.
13103
13104         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13105         appropriate place.
13106
13107 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13108
13109         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13110         builders even if we were missing one.
13111
13112         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13113         pass the Basename as our class name instead of the Name.  The
13114         basename will be correctly composed for us.
13115
13116         * parameter.cs (Paramters): Now takes a Location argument.
13117
13118         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13119         make all the code call directly LookupType in RootContext and take
13120         this chance to pass the Location information everywhere.
13121
13122         * Everywhere: pass Location information.
13123
13124 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13125
13126         * class.cs (Constructor.Define): Updated way of detecting the
13127         length of the parameters.
13128
13129         (TypeContainer.DefineType): Use basename as the type name for
13130         nested types.
13131
13132         (TypeContainer.Define): Do not recursively define types here, as
13133         definition is taken care in order by the RootContext.
13134
13135         * tree.cs: Keep track of namespaces in a per-file basis.
13136
13137         * parameter.cs (Parameter.ComputeSignature): Update to use
13138         DeclSpace. 
13139
13140         (Parameters.GetSignature): ditto.
13141
13142         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13143         instead of a TypeContainer.
13144
13145         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13146         resolve names.  Because we need to be resolve in our context, not
13147         our parents.
13148
13149         * driver.cs: Implement response files.
13150
13151         * class.cs (TypeContainer.DefineType): If we are defined, do not
13152         redefine ourselves.
13153
13154         (Event.Emit): Emit the code for add/remove handlers.
13155         (Event.Define): Save the MethodBuilders for add/remove.
13156
13157         * typemanager.cs: Use pair here too.
13158
13159         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13160         DictionaryEntry requires the first argument to be non-null.  
13161
13162         (enum_declaration): Compute full name for registering the
13163         enumeration.
13164
13165         (delegate_declaration): Instead of using
13166         formal_parameter_list, use opt_formal_parameter_list as the list
13167         can be empty.
13168
13169         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13170         (EventParsing): New property that controls whether `add' and
13171         `remove' are returned as tokens or identifiers (for events);
13172
13173 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13174
13175         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13176         use MyEventBuilder only and let it wrap the real builder for us.
13177
13178         (MyEventBuilder): Revamp constructor etc.
13179
13180         Implement all operations that we perform on EventBuilder in precisely the same
13181         way here too.
13182
13183         (FindMembers): Update to use the EventBuilder member.
13184
13185         (Event.Emit): Update accordingly.
13186
13187 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13188
13189         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13190         by calling the appropriate methods.
13191
13192         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13193         useful.
13194
13195         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13196
13197 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13198
13199         * delegate.cs (Delegate.Populate): Check that the return type
13200         and various parameters types are indeed accessible.
13201
13202         * class.cs (Constructor.Define): Same here.
13203
13204         (Field.Define): Ditto.
13205
13206         (Event.Define): Ditto.
13207
13208         (Operator.Define): Check that the underlying Method defined itself
13209         correctly - so it's MethodBuilder should not be null.
13210
13211         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13212         expression happens to be null.
13213
13214         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13215         members but as of now we don't seem to be able to do anything really useful with it.
13216
13217         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13218         not the EventBuilder.
13219
13220 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13221
13222         * cs-tokenizer.cs: Add support for defines.
13223         Add support for #if, #elif, #else, #endif
13224
13225         (eval_var): evaluates a variable.
13226         (eval): stubbed for evaluating functions.
13227
13228         * cs-parser.jay: Pass the defines information
13229
13230         * driver.cs: Add --define command line option.
13231
13232         * decl.cs: Move MemberCore here.
13233
13234         Make it the base class for DeclSpace.  This allows us to catch and
13235         report 108 and 109 for everything now.
13236
13237         * class.cs (TypeContainer.Define): Extract all the members
13238         before populating and emit the warning 108 (new keyword required
13239         to override) instead of having each member implement this.
13240
13241         (MemberCore.Define): New abstract method, we will be using this in
13242         the warning reporting engine in Populate.
13243
13244         (Operator.Define): Adjust to new MemberCore protocol. 
13245
13246         * const.cs (Const): This does not derive from Expression, it is a
13247         temporary object we use to create fields, it is a MemberCore. 
13248
13249         * class.cs (Method.Define): Allow the entry point to be in a
13250         specific class.
13251
13252         * driver.cs: Rewrite the argument handler to clean it up a bit.
13253
13254         * rootcontext.cs: Made it just an auxiliary namespace feature by
13255         making everything static.
13256
13257         * driver.cs: Adapt code to use RootContext type name instead of
13258         instance variable.
13259
13260         * delegate.cs: Remove RootContext argument.
13261
13262         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13263         argument. 
13264
13265         * class.cs (Event.Define): The lookup can fail.
13266
13267         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13268
13269         * expression.cs: Resolve the this instance before invoking the code.
13270
13271 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13272
13273         * cs-parser.jay: Add a production in element_access that allows
13274         the thing to become a "type" reference.  This way we can parse
13275         things like "(string [])" as a type.
13276
13277         Note that this still does not handle the more complex rules of
13278         casts. 
13279
13280
13281         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13282
13283         * ecore.cs: (CopyNewMethods): new utility function used to
13284         assemble the list of methods from running FindMembers.
13285
13286         (MemberLookup): Rework FindMembers so that 
13287
13288 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13289
13290         * class.cs (TypeContainer): Remove Delegates who fail to be
13291         defined.
13292
13293         * delegate.cs (Populate): Verify that we dont get null return
13294         values.   TODO: Check for AsAccessible.
13295
13296         * cs-parser.jay: Use basename to emit error 574 (destructor should
13297         have the same name as container class), not the full name.
13298
13299         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13300         possible representation.  
13301
13302         Also implements integer type suffixes U and L.
13303
13304 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13305
13306         * expression.cs (ArrayCreation.DoResolve): We need to do the
13307         argument resolution *always*.
13308
13309         * decl.cs: Make this hold the namespace.  Hold the root context as
13310         well.
13311         (LookupType): Move here.
13312
13313         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13314
13315         * location.cs (Row, Name): Fixed the code, it was always returning
13316         references to the first file.
13317
13318         * interface.cs: Register properties defined through interfaces.
13319
13320         * driver.cs: Add support for globbing on the command line
13321
13322         * class.cs (Field): Make it derive from MemberCore as well.
13323         (Event): ditto.
13324
13325 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13326
13327         * class.cs (Event::Define): Check that the type of the event is a delegate
13328         type else flag error #66.
13329
13330         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
13331         same.
13332
13333         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
13334         values of EntryPoint, CharSet etc etc.
13335
13336         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
13337
13338         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
13339         be null and we should ignore this. I am not sure if this is really clean. Apparently,
13340         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
13341         which needs this to do its work.
13342
13343         * ../errors/cs0066.cs : Add.
13344
13345 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
13346
13347         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
13348         helper functions.
13349
13350         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13351         clears out the parameters field.
13352         (MemberSignatureCompare): Cleanup
13353
13354         (MemberCore): New base class used to share code between MethodCore
13355         and Property.
13356
13357         (RegisterRequiredImplementations) BindingFlags.Public requires
13358         either BindingFlags.Instace or Static.  Use instance here.
13359
13360         (Property): Refactored code to cope better with the full spec.
13361
13362         * parameter.cs (GetParameterInfo): Return an empty array instead
13363         of null on error.
13364
13365         * class.cs (Property): Abstract or extern properties have no bodies.
13366
13367         * parameter.cs (GetParameterInfo): return a zero-sized array.
13368
13369         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13370         method modifier validation to the typecontainer so we can reuse
13371         this on properties.
13372
13373         (MethodCore.ParameterTypes): return an empty sized array of types.
13374
13375         (Property.Define): Test property modifier validity.
13376
13377         Add tests for sealed/override too.
13378
13379         (Method.Emit): abstract or extern methods have no bodies.
13380
13381 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13382
13383         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13384         thing.
13385
13386         (Method::Define, ::Emit): Modify accordingly.
13387
13388         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13389
13390         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13391
13392         * makefile: Pass in /unsafe.
13393
13394 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13395
13396         * class.cs (MakeKey): Kill routine.
13397
13398         * class.cs (TypeContainer.Define): Correctly define explicit
13399         method implementations (they require the full interface name plus
13400         the method name).
13401
13402         * typemanager.cs: Deply the PtrHashtable here and stop using the
13403         lame keys.  Things work so much better.
13404
13405         This of course broke everyone who depended on `RegisterMethod' to
13406         do the `test for existance' test.  This has to be done elsewhere.
13407
13408         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13409         the object stupid Equals method (because, that like fails all over
13410         the place).  We still do not use it.
13411
13412         * class.cs (TypeContainer.SetRequiredInterface,
13413         TypeContainer.RequireMethods): Killed these two routines and moved
13414         all the functionality to RegisterRequiredImplementations.
13415
13416         (TypeContainer.RegisterRequiredImplementations): This routine now
13417         registers all the implementations required in an array for the
13418         interfaces and abstract methods.  We use an array of structures
13419         which can be computed ahead of time to reduce memory usage and we
13420         also assume that lookups are cheap as most classes will not
13421         implement too many interfaces.
13422
13423         We also avoid creating too many MethodSignatures.
13424
13425         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13426         clear the "pending" bit if we find that there are problems with
13427         the declaration.
13428
13429         (TypeContainer.VerifyPendingMethods): Update to report errors of
13430         methods that look like implementations but are not.
13431
13432         (TypeContainer.Define): Add support for explicit interface method
13433         implementation. 
13434
13435 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13436
13437         * typemanager.cs: Keep track of the parameters here instead of
13438         being a feature of the TypeContainer.
13439
13440         * class.cs: Drop the registration of parameters here, as
13441         InterfaceMethods are also interface declarations.
13442
13443         * delegate.cs: Register methods with the TypeManager not only with
13444         the TypeContainer.  This code was buggy.
13445
13446         * interface.cs: Full registation here.
13447
13448 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13449
13450         * expression.cs: Remove reducer for binary expressions, it can not
13451         be done this way.
13452
13453         * const.cs: Put here the code that used to go into constant.cs
13454
13455         * constant.cs: Put here the code for constants, this is a new base
13456         class for Literals.
13457
13458         * literal.cs: Make Literal derive from Constant.
13459
13460 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13461
13462         * statement.cs (Return.Emit): Report error 157 if the user
13463         attempts to return from a finally block.
13464
13465         (Return.Emit): Instead of emitting a return, jump to the end of
13466         the function.
13467
13468         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
13469         LocalBuilder to store the result of the function.  ReturnLabel is
13470         the target where we jump.
13471
13472
13473 2001-12-09  Radek Doulik  <rodo@ximian.com>
13474
13475         * cs-parser.jay: remember alias in current namespace
13476
13477         * ecore.cs (SimpleName::DoResolve): use aliases for types or
13478         namespaces
13479
13480         * class.cs (LookupAlias): lookup alias in my_namespace
13481
13482         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
13483         aliases hashtable
13484         (LookupAlias): lookup alias in this and if needed in parent
13485         namespaces
13486
13487 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
13488
13489         * support.cs: 
13490
13491         * rootcontext.cs: (ModuleBuilder) Made static, first step into
13492         making things static.  I need this to avoid passing the
13493         TypeContainer when calling ParameterType.
13494
13495         * support.cs (InternalParameters.ParameterType): Remove ugly hack
13496         that did string manipulation to compute the type and then call
13497         GetType.  Use Parameter.ParameterType instead.
13498
13499         * cs-tokenizer.cs: Consume the suffix for floating values.
13500
13501         * expression.cs (ParameterReference): figure out whether this is a
13502         reference parameter or not.  Kill an extra variable by computing
13503         the arg_idx during emission.
13504
13505         * parameter.cs (Parameters.GetParameterInfo): New overloaded
13506         function that returns whether a parameter is an out/ref value or not.
13507
13508         (Parameter.ParameterType): The type of the parameter (base,
13509         without ref/out applied).
13510
13511         (Parameter.Resolve): Perform resolution here.
13512         (Parameter.ExternalType): The full type (with ref/out applied).
13513
13514         * statement.cs (Using.Emit, Using.EmitExpression): Implement
13515         support for expressions on the using statement.
13516
13517 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
13518
13519         * statement.cs (Using.EmitLocalVariableDecls): Split the
13520         localvariable handling of the using statement.
13521
13522         (Block.EmitMeta): Keep track of variable count across blocks.  We
13523         were reusing slots on separate branches of blocks.
13524
13525         (Try.Emit): Emit the general code block, we were not emitting it. 
13526
13527         Check the type of the declaration to be an IDisposable or
13528         something that can be implicity converted to it. 
13529
13530         Emit conversions if required.
13531
13532         * ecore.cs (EmptyExpression): New utility class.
13533         (Expression.ImplicitConversionExists): New utility function.
13534
13535 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
13536
13537         * statement.cs (Using): Implement.
13538
13539         * expression.cs (LocalVariableReference): Support read only variables.
13540
13541         * statement.cs: Remove the explicit emit for the Leave opcode.
13542         (VariableInfo): Add a readonly field.
13543
13544 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
13545
13546         * ecore.cs (ConvCast): new class used to encapsulate the various
13547         explicit integer conversions that works in both checked and
13548         unchecked contexts.
13549
13550         (Expression.ConvertNumericExplicit): Use new ConvCast class to
13551         properly generate the overflow opcodes.
13552
13553 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13554
13555         * statement.cs: The correct type for the EmptyExpression is the
13556         element_type, not the variable type.  Ravi pointed this out.
13557
13558 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13559
13560         * class.cs (Method::Define): Handle PInvoke methods specially
13561         by using DefinePInvokeMethod instead of the usual one.
13562
13563         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
13564         above to do the task of extracting information and defining the method.
13565
13566 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13567
13568         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
13569         of the condition for string type.
13570
13571         (Emit): Move that here. 
13572
13573         (ArrayCreation::CheckIndices): Keep string literals in their expression
13574         form.
13575
13576         (EmitDynamicInitializers): Handle strings appropriately.
13577
13578 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13579
13580         * codegen.cs (EmitContext): Replace multiple variables with a
13581         single pointer to the current Switch statement.
13582
13583         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
13584         EmitContext.
13585
13586 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13587
13588         * statement.cs 
13589
13590         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
13591         default'.
13592
13593         (Foreach.Emit): Foreach on arrays was not setting
13594         up the loop variables (for break/continue).
13595
13596         (GotoCase): Semi-implented.
13597
13598 2001-12-03  Ravi Pratap  <ravi@ximian.com>
13599
13600         * attribute.cs (CheckAttribute): Handle system attributes by using
13601         Attribute.GetAttributes to examine information we need.
13602
13603         (GetValidPlaces): Same here.
13604
13605         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
13606
13607         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
13608
13609         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
13610
13611         (Method::Define): Set appropriate flags if we have a DllImport attribute.
13612
13613         (Method::Emit): Handle the case when we are a PInvoke method.
13614
13615 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13616
13617         * expression.cs: Use ResolveWithSimpleName on compound names.
13618
13619 2001-12-02  Ravi Pratap  <ravi@ximian.com>
13620
13621         * constant.cs (EmitConstant): Make sure we resolve the associated expression
13622         before trying to reduce it.
13623
13624         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
13625
13626         * constant.cs (LookupConstantValue): Implement.
13627
13628         (EmitConstant): Use the above in emitting the constant.
13629
13630         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
13631         that are user-defined by doing a LookupConstantValue on them.
13632
13633         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
13634         too, like above.
13635
13636 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
13637
13638         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
13639
13640         (BaseAccess.DoResolve): Implement.
13641
13642         (MemberAccess.DoResolve): Split this routine into a
13643         ResolveMemberAccess routine that can be used independently
13644
13645 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
13646
13647         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
13648         As that share bits of the implementation.  Is returns a boolean,
13649         while As returns the Type that is being probed.
13650
13651 2001-12-01  Ravi Pratap  <ravi@ximian.com>
13652
13653         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
13654         instead of a Literal - much easier.
13655
13656         (EnumInTransit): Remove - utterly useless :-)
13657
13658         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
13659
13660         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
13661
13662         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
13663         chain when we have no associated expression.
13664
13665 2001-11-30  Ravi Pratap  <ravi@ximian.com>
13666
13667         * constant.cs (Define): Use Location while reporting the errror.
13668
13669         Also emit a warning when 'new' is used and there is no inherited
13670         member to hide.
13671
13672         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
13673         populated.
13674
13675         (LookupEnumValue): Implement to lookup an enum member's value and define it
13676         if necessary.
13677
13678         (Populate): Re-write accordingly to use the above routine.
13679
13680 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
13681
13682         * expression.cs (This): Fix prototype for DoResolveLValue to
13683         override the base class DoResolveLValue.
13684
13685         * cs-parser.cs: Report errors cs574 and cs575 (destructor
13686         declarations) 
13687
13688         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
13689         (we need to load the address of the field here).  This fixes
13690         test-22. 
13691
13692         (FieldExpr.DoResolveLValue): Call the DoResolve
13693         function to initialize the Instance expression.
13694
13695         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
13696         correctly the GetEnumerator operation on a value type.
13697
13698         * cs-parser.jay: Add more simple parsing error catches.
13699
13700         * statement.cs (Switch): Add support for string switches.
13701         Handle null specially.
13702
13703         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
13704
13705 2001-11-28  Ravi Pratap  <ravi@ximian.com>
13706
13707         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
13708
13709         (declare_local_constant): New helper function.
13710
13711         * statement.cs (AddConstant): Keep a separate record of constants
13712
13713         (IsConstant): Implement to determine if a variable is a constant.
13714
13715         (GetConstantExpression): Implement.
13716
13717         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
13718
13719         * statement.cs (IsVariableDefined): Re-write.
13720
13721 2001-11-27  Ravi Pratap  <ravi@ximian.com>
13722
13723         * class.cs (TypeContainer::FindMembers): Look for constants
13724         in the case when we are looking for MemberTypes.Field
13725
13726         * expression.cs (MemberAccess::DoResolve): Check that in the
13727         case we are a FieldExpr and a Literal, we are not being accessed
13728         by an instance reference.
13729
13730         * cs-parser.jay (local_constant_declaration): Implement.
13731
13732         (declaration_statement): Implement for constant declarations.
13733
13734 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
13735
13736         * statement.cs (Switch): Catch double defaults.
13737
13738         (Switch): More work on the switch() statement
13739         implementation.  It works for integral values now, need to finish
13740         string support.
13741
13742
13743 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13744
13745         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
13746         integer literals into other integer literals.  To be used by
13747         switch. 
13748
13749 2001-11-24  Ravi Pratap  <ravi@ximian.com>
13750
13751         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
13752         some memory.
13753
13754         (EmitDynamicInitializers): Cope with the above since we extract data
13755         directly from ArrayData now.
13756
13757         (ExpectInitializers): Keep track of whether initializers are mandatory
13758         or not.
13759
13760         (Bounds): Make it a hashtable to prevent the same dimension being 
13761         recorded for every element in that dimension.
13762
13763         (EmitDynamicInitializers): Fix bug which prevented the Set array method
13764         from being found.
13765
13766         Also fix bug which was causing the indices to be emitted in the reverse
13767         order.
13768
13769 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13770
13771         * expression.cs (ArrayCreation): Implement the bits that Ravi left
13772         unfinished.  They do not work, because the underlying code is
13773         sloppy.
13774
13775 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13776
13777         * cs-parser.jay: Remove bogus fixme.
13778
13779         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
13780         on Switch statement.
13781
13782 2001-11-23  Ravi Pratap  <ravi@ximian.com>
13783
13784         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
13785         the same. 
13786
13787         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
13788         parameter. Apparently, any expression is allowed. 
13789
13790         (ValidateInitializers): Update accordingly.
13791
13792         (CheckIndices): Fix some tricky bugs thanks to recursion.
13793
13794         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
13795         I was being completely brain-dead.
13796
13797         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
13798         and re-write acordingly.
13799
13800         (DelegateInvocation): Re-write accordingly.
13801
13802         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
13803
13804         (MakeByteBlob): Handle types more correctly.
13805
13806         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
13807         initialization from expressions but it is incomplete because I am a complete
13808         Dodo :-|
13809
13810 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13811
13812         * statement.cs (If.Emit): Fix a bug that generated incorrect code
13813         on If.  Basically, we have to return `true' (ie, we do return to
13814         our caller) only if both branches of the if return.
13815
13816         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
13817         short-circuit operators, handle them as short circuit operators. 
13818
13819         (Cast.DoResolve): Resolve type.
13820         (Cast.Cast): Take an expression as the target type.
13821
13822         * cs-parser.jay (cast_expression): Remove old hack that only
13823         allowed a limited set of types to be handled.  Now we take a
13824         unary_expression and we resolve to a type during semantic
13825         analysis.
13826
13827         Use the grammar productions from Rhys to handle casts (this is
13828         not complete like Rhys syntax yet, we fail to handle that corner
13829         case that C# has regarding (-x), but we will get there.
13830
13831 2001-11-22  Ravi Pratap  <ravi@ximian.com>
13832
13833         * class.cs (EmitFieldInitializer): Take care of the case when we have a
13834         field which is an array type.
13835
13836         * cs-parser.jay (declare_local_variables): Support array initialization too.
13837
13838         * typemanager.cs (MakeKey): Implement.
13839
13840         (everywhere): Use the above appropriately.
13841
13842         * cs-parser.jay (for_statement): Update for array initialization while
13843         declaring variables.
13844
13845         * ecore.cs : The error message was correct, it's the variable's names that
13846         were misleading ;-) Make the code more readable.
13847
13848         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
13849         the correct type etc.
13850
13851         (ConvertExplicit): Handle Enum types by examining the underlying type.
13852
13853 2001-11-21  Ravi Pratap  <ravi@ximian.com>
13854
13855         * parameter.cs (GetCallingConvention): Always return
13856         CallingConventions.Standard for now.
13857
13858 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13859
13860         * expression.cs (Binary.ResolveOperator): Update the values of `l'
13861         and `r' after calling DoNumericPromotions.
13862
13863         * ecore.cs: Fix error message (the types were in the wrong order).
13864
13865         * statement.cs (Foreach.ProbeCollectionType): Need to pass
13866         BindingFlags.Instance as well 
13867
13868         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
13869         implicit int literal conversion in an empty cast so that we
13870         propagate the right type upstream.
13871
13872         (UnboxCast): new class used to unbox value types.
13873         (Expression.ConvertExplicit): Add explicit type conversions done
13874         by unboxing.
13875
13876         (Expression.ImplicitNumericConversion): Oops, forgot to test for
13877         the target type before applying the implicit LongLiterals to ULong
13878         literal cast.
13879
13880 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
13881
13882         * cs-parser.jay (for_statement): Reworked the way For works: now
13883         we declare manually any variables that are introduced in
13884         for_initializer to solve the problem of having out-of-band code
13885         emition (that is what got for broken).
13886
13887         (declaration_statement): Perform the actual variable declaration
13888         that used to be done in local_variable_declaration here.
13889
13890         (local_variable_declaration): Do not declare anything, just pass
13891         the information on a DictionaryEntry
13892
13893 2001-11-20  Ravi Pratap  <ravi@ximian.com>
13894
13895         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
13896         re-write of the logic to now make it recursive.
13897
13898         (UpdateIndices): Re-write accordingly.
13899
13900         Store element data in a separate ArrayData list in the above methods.
13901
13902         (MakeByteBlob): Implement to dump the array data into a byte array.
13903
13904 2001-11-19  Ravi Pratap  <ravi@ximian.com>
13905
13906         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
13907         into CheckIndices.
13908
13909         * constant.cs (Define): Implement.
13910
13911         (EmitConstant): Re-write fully.
13912
13913         Pass in location info.
13914
13915         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
13916         respectively.
13917
13918         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
13919         DictionaryEntry since we need location info too.
13920
13921         (constant_declaration): Update accordingly.
13922
13923         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
13924         code into another method : UpdateIndices.
13925
13926 2001-11-18  Ravi Pratap  <ravi@ximian.com>
13927
13928         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
13929         some type checking etc.
13930
13931 2001-11-17  Ravi Pratap  <ravi@ximian.com>
13932
13933         * expression.cs (ArrayCreation::ValidateInitializers): Implement
13934         bits to provide dimension info if the user skips doing that.
13935
13936         Update second constructor to store the rank correctly.
13937
13938 2001-11-16  Ravi Pratap  <ravi@ximian.com>
13939
13940         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
13941         and try to implement.
13942
13943         * ../errors/cs0150.cs : Add.
13944
13945         * ../errors/cs0178.cs : Add.
13946
13947 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
13948
13949         * statement.cs: Implement foreach on multi-dimensional arrays. 
13950
13951         * parameter.cs (Parameters.GetParameterByName): Also lookup the
13952         name of the params argument.
13953
13954         * expression.cs: Use EmitStoreOpcode to get the right opcode while
13955         initializing the array.
13956
13957         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
13958         we can use this elsewhere.
13959
13960         * statement.cs: Finish implementation of foreach for single
13961         dimension arrays.
13962
13963         * cs-parser.jay: Use an out-of-band stack to pass information
13964         around, I wonder why I need this.
13965
13966         foreach_block: Make the new foreach_block the current_block.
13967
13968         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
13969         function used to return a static Parameters structure.  Used for
13970         empty parameters, as those are created very frequently.
13971
13972         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
13973
13974 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13975
13976         * interface.cs : Default modifier is private, not public. The
13977         make verify test passes again.
13978
13979 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13980
13981         * support.cs (ReflectionParameters): Fix logic to determine
13982         whether the last parameter is a params one. Test 9 passes again.
13983
13984         * delegate.cs (Populate): Register the builders we define with
13985         RegisterParameterForBuilder. Test 19 passes again.
13986
13987         * cs-parser.jay (property_declaration): Reference $6 instead
13988         of $$ to get at the location.
13989
13990         (indexer_declaration): Similar stuff.
13991
13992         (attribute): Ditto.
13993
13994         * class.cs (Property): Register parameters for the Get and Set methods
13995         if they exist. Test 23 passes again.
13996
13997         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
13998         call to EmitArguments as we are sure there aren't any params arguments. 
13999         Test 32 passes again.
14000
14001         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14002         IndexOutOfRangeException. 
14003
14004         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14005         Test 33 now passes again.
14006
14007 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14008
14009         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14010         broke a bunch of things.  Will have to come up with a better way
14011         of tracking locations.
14012
14013         * statement.cs: Implemented foreach for single dimension arrays.
14014
14015 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14016
14017         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14018         an error.  This removes the lookup from the critical path.
14019
14020         * cs-parser.jay: Removed use of temporary_loc, which is completely
14021         broken. 
14022
14023 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14024
14025         * support.cs (ReflectionParameters.ParameterModifier): Report
14026         whether the argument is a PARAMS argument or not.
14027
14028         * class.cs: Set the attribute `ParamArrayAttribute' on the
14029         parameter argument.
14030
14031         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14032         and cons_param_array_attribute (ConstructorInfo for
14033         ParamArrayAttribute)., 
14034
14035         * codegen.cs: Emit the return using the `Return' statement, that
14036         way we can report the error correctly for missing return values. 
14037
14038         * class.cs (Method.Emit): Clean up.
14039
14040         * expression.cs (Argument.Resolve): Take another argument: the
14041         location where this argument is used.  Notice that this is not
14042         part of the "Argument" class as to reduce the size of the
14043         structure (we know the approximate location anyways).
14044
14045         Test if the argument is a variable-reference, if not, then
14046         complain with a 206.
14047
14048         (Argument.Emit): Emit addresses of variables.
14049
14050         (Argument.FullDesc): Simplify.
14051
14052         (Invocation.DoResolve): Update for Argument.Resolve.
14053
14054         (ElementAccess.DoResolve): ditto.
14055
14056         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14057         method should be virtual, as this method is always virtual.
14058
14059         (NewDelegate.DoResolve): Update for Argument.Resolve.
14060
14061         * class.cs (ConstructorInitializer.DoResolve): ditto.
14062
14063         * attribute.cs (Attribute.Resolve): ditto.
14064
14065 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14066
14067         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14068
14069         * expression.cs (ParameterReference): Drop IStackStorage and implement
14070         IAssignMethod instead. 
14071
14072         (LocalVariableReference): ditto.
14073
14074         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14075         IAssignMethod instead. 
14076
14077 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14078
14079         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14080         enumerations that are used in heavily used structures derive from
14081         byte in a laughable and pathetic attempt to reduce memory usage.
14082         This is the kind of pre-optimzations that you should not do at
14083         home without adult supervision.
14084
14085         * expression.cs (UnaryMutator): New class, used to handle ++ and
14086         -- separatedly from the other unary operators.  Cleans up the
14087         code, and kills the ExpressionStatement dependency in Unary.
14088
14089         (Unary): Removed `method' and `Arguments' from this class, making
14090         it smaller, and moving it all to SimpleCall, so I can reuse this
14091         code in other locations and avoid creating a lot of transient data
14092         strucutres when not required.
14093
14094         * cs-parser.jay: Adjust for new changes.
14095
14096 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14097
14098         * enum.cs (Enum.Populate): If there is a failure during
14099         definition, return
14100
14101         * cs-parser.jay (opt_enum_base): we used to catch type errors
14102         here, but this is really incorrect.  The type error should be
14103         catched during semantic analysis.
14104
14105 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14106
14107         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14108         current_local_parameters as expected since I, in my stupidity, had forgotten
14109         to do this :-)
14110
14111         * attribute.cs (GetValidPlaces): Fix stupid bug.
14112
14113         * class.cs (Method::Emit): Perform check on applicability of attributes.
14114
14115         (Constructor::Emit): Ditto.
14116
14117         (Field::Emit): Ditto.
14118
14119         (Field.Location): Store location information.
14120
14121         (Property, Event, Indexer, Operator): Ditto.
14122
14123         * cs-parser.jay (field_declaration): Pass in location for each field.
14124
14125         * ../errors/cs0592.cs : Add.
14126
14127 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14128
14129         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14130
14131         (InitCoreTypes): Update accordingly.
14132
14133         (RegisterAttrType, LookupAttr): Implement.
14134
14135         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14136         info about the same.
14137
14138         (Resolve): Update to populate the above as necessary.
14139
14140         (Error592): Helper.
14141
14142         (GetValidPlaces): Helper to the above.
14143
14144         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14145
14146         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14147
14148 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14149
14150         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14151
14152         * ../errors/cs0617.cs : Add.
14153
14154 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14155
14156         * enum.cs (Emit): Rename to Populate to be more consistent with what
14157         we expect it to do and when exactly it is called.
14158
14159         * class.cs, rootcontext.cs : Update accordingly.
14160
14161         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14162         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14163
14164         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14165
14166         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14167         of a fieldinfo using the above, when dealing with a FieldBuilder.
14168
14169 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14170
14171         * ../errors/cs0031.cs : Add.
14172
14173         * ../errors/cs1008.cs : Add.
14174
14175         * ../errrors/cs0543.cs : Add.
14176
14177         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14178         enum type.
14179
14180         (FindMembers): Implement.
14181
14182         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14183         enums and delegates too.
14184
14185         (enum_types): Rename to builder_to_enum.
14186
14187         (delegate_types): Rename to builder_to_delegate.
14188
14189         * delegate.cs (FindMembers): Implement.
14190
14191 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14192
14193         * typemanager.cs (IsEnumType): Implement.
14194
14195         * enum.cs (Emit): Re-write parts to account for the underlying type
14196         better and perform checking etc.
14197
14198         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14199         of the underlying type.
14200
14201         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14202         value
14203
14204         * enum.cs (error31): Helper to report error #31.
14205
14206         * cs-parser.jay (enum_declaration): Store location of each member too.
14207
14208         * enum.cs (member_to_location): New hashtable. 
14209
14210         (AddEnumMember): Update location hashtable.
14211
14212         (Emit): Use the location of each member while reporting errors.
14213
14214 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14215
14216         * cs-parser.jay: A for_initializer if is a
14217         local_variable_declaration really ammount to have an implicit
14218         block with the variable declaration and no initializer for for.
14219
14220         * statement.cs (For.Emit): Cope with null initializers.
14221
14222         This fixes the infinite loop on for initializers.
14223
14224 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14225
14226         * enum.cs: More cleanup.
14227
14228         * ecore.cs: Remove dead code.
14229
14230         * class.cs (Property.Emit): More simplification.
14231         (Event.Emit): ditto.
14232
14233         Reworked to have less levels of indentation.
14234
14235 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14236
14237         * class.cs (Property): Emit attributes.
14238
14239         (Field): Ditto.
14240
14241         (Event): Ditto.
14242
14243         (Indexer): Ditto.
14244
14245         (Operator): Ditto.
14246
14247         * enum.cs (Emit): Ditto.
14248
14249         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14250         Enums too.
14251
14252         * class.cs (Field, Event, etc.): Move attribute generation into the
14253         Emit method everywhere.
14254
14255         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14256         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14257         as we had no way of defining nested enums !
14258
14259         * rootcontext.cs : Adjust code accordingly.
14260
14261         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14262
14263 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14264
14265         * expression.cs (EvalConstantExpression): Move into ecore.cs
14266
14267         * enum.cs (Enum): Rename some members and make them public and readonly
14268         according to our convention.
14269
14270         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14271         nothing else.
14272
14273         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14274
14275         (Enum::Emit): Write a simple version for now which doesn't try to compute
14276         expressions. I shall modify this to be more robust in just a while.
14277
14278         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14279
14280         (TypeContainer::CloseType): Create the Enum types too.
14281
14282         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14283
14284         * expression.cs (EvalConstantExpression): Get rid of completely.
14285
14286         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14287         user-defined values and other cases.
14288
14289         (IsValidEnumLiteral): Helper function.
14290
14291         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14292         out there in the case we had a literal FieldExpr.
14293
14294         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14295
14296         (Literalize): Revamp a bit to take two arguments.
14297
14298         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14299
14300 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14301
14302         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14303
14304         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14305
14306         (Resolve): Use the above to ensure we have proper initializers.
14307
14308 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14309
14310         * expression.cs (Expression::EvalConstantExpression): New method to 
14311         evaluate constant expressions.
14312
14313         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14314
14315 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14316
14317         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14318         in an array.
14319
14320         (Binary.ResolveOperator): Handle operator != (object a, object b)
14321         and operator == (object a, object b);
14322
14323         (Binary.DoNumericPromotions): Indicate whether the numeric
14324         promotion was possible.
14325
14326         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14327         Implement.  
14328
14329         Made the ArrayAccess implement interface IAssignMethod instead of
14330         IStackStore as the order in which arguments are passed reflects
14331         this.
14332
14333         * assign.cs: Instead of using expr.ExprClass to select the way of
14334         assinging, probe for the IStackStore/IAssignMethod interfaces.
14335
14336         * typemanager.cs: Load InitializeArray definition.
14337
14338         * rootcontext.cs (RootContext.MakeStaticData): Used to define
14339         static data that can be used to initialize arrays. 
14340
14341 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
14342
14343         * expression.cs: Handle operator== and operator!= for booleans.
14344
14345         (Conditioal.Reduce): Implement reducer for the ?: operator.
14346
14347         (Conditional.Resolve): Implement dead code elimination.
14348
14349         (Binary.Resolve): Catch string literals and return a new
14350         concatenated string.
14351
14352         (Unary.Reduce): Implement reduction of unary expressions.
14353
14354         * ecore.cs: Split out the expression core handling here.
14355
14356         (Expression.Reduce): New method used to perform constant folding
14357         and CSE.  This is needed to support constant-expressions. 
14358
14359         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14360         targets, and optimize for !x.
14361
14362 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14363
14364         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14365         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14366         set custom atttributes.
14367
14368         * literal.cs (Literal::GetValue): New abstract method to return the actual
14369         value of the literal, cast as an object.
14370
14371         (*Literal): Implement GetValue method.
14372
14373         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14374         expressions to the arraylist but objects of type Argument.
14375
14376         * class.cs (TypeContainer::Emit): Emit our attributes too.
14377
14378         (Method::Emit, Constructor::Emit): Ditto.
14379
14380         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14381         to be ignoring earlier.
14382
14383 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14384
14385         * attribute.cs (AttributeSection::Define): Implement to do the business
14386         of constructing a CustomAttributeBuilder.
14387
14388         (Attribute): New trivial class. Increases readability of code.  
14389
14390         * cs-parser.jay : Update accordingly.
14391
14392         (positional_argument_list, named_argument_list, named_argument): New rules
14393
14394         (attribute_arguments): Use the above so that we are more correct.
14395
14396 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14397
14398         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14399         to perform all checks for a method with a params parameter.
14400
14401         (Invocation::OverloadResolve): Update to use the above method and therefore
14402         cope correctly with params method invocations.
14403
14404         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14405         params too.
14406
14407         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14408         constructors in our parent too because we can't afford to miss out on 
14409         protected ones ;-)
14410
14411         * attribute.cs (AttributeSection): New name for the class Attribute
14412
14413         Other trivial changes to improve readability.
14414
14415         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14416         use the new class names.
14417
14418 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14419
14420         * class.cs (Method::Define): Complete definition for params types too
14421
14422         (Indexer::Define): Ditto.
14423
14424         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14425         Cope everywhere with a request for info about the array parameter.
14426
14427 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14428
14429         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14430
14431         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14432         local_variable_type to extract the string corresponding to the type.
14433
14434         (local_variable_type): Fixup the action to use the new helper method.
14435
14436         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14437         go.
14438
14439         * expression.cs : Clean out code which uses the above.
14440
14441 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14442
14443         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14444         and bale out if necessary by returning a false.
14445
14446         (RegisterProperty): Ditto.
14447
14448         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14449         and print out appropriate error messages.
14450
14451         * interface.cs (everywhere): Ditto.
14452
14453         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14454         location to constructor.
14455
14456         * class.cs (Property, Event, Indexer): Update accordingly.
14457
14458         * ../errors/cs111.cs : Added.
14459
14460         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14461         of a method, as laid down by the spec.
14462
14463         (Invocation::OverloadResolve): Use the above method.
14464
14465 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14466
14467         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
14468         now take a TypeContainer and a Parameters object.
14469
14470         (ParameterData): Modify return type of ParameterModifier method to be 
14471         Parameter.Modifier and not a string.
14472
14473         (ReflectionParameters, InternalParameters): Update accordingly.
14474
14475         * expression.cs (Argument::GetParameterModifier): Same here.
14476
14477         * support.cs (InternalParameters::ParameterType): Find a better way of determining
14478         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
14479         symbol in it at all so maybe this is only for now.
14480
14481 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14482
14483         * support.cs (InternalParameters): Constructor now takes an extra argument 
14484         which is the actual Parameters class.
14485
14486         (ParameterDesc): Update to provide info on ref/out modifiers.
14487
14488         * class.cs (everywhere): Update call to InternalParameters to pass in
14489         the second argument too.
14490
14491         * support.cs (ParameterData): Add ParameterModifier, which is a method 
14492         to return the modifier info [ref/out etc]
14493
14494         (InternalParameters, ReflectionParameters): Implement the above.
14495
14496         * expression.cs (Argument::ParameterModifier): Similar function to return
14497         info about the argument's modifiers.
14498
14499         (Invocation::OverloadResolve): Update to take into account matching modifiers 
14500         too.
14501
14502         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
14503         a new SetFormalParameters object which we pass to InternalParameters.
14504
14505 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14506
14507         * expression.cs (NewArray): Merge into the ArrayCreation class.
14508
14509 2001-10-29  Ravi Pratap  <ravi@ximian.com>
14510
14511         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
14512         NewUserdefinedArray into one as there wasn't much of a use in having
14513         two separate ones.
14514
14515         * expression.cs (Argument): Change field's name to ArgType from Type.
14516
14517         (Type): New readonly property which returns the proper type, taking into 
14518         account ref/out modifiers.
14519
14520         (everywhere): Adjust code accordingly for the above.
14521
14522         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
14523         whether we are emitting for a ref or out parameter.
14524
14525         * expression.cs (Argument::Emit): Use the above field to set the state.
14526
14527         (LocalVariableReference::Emit): Update to honour the flag and emit the
14528         right stuff.
14529
14530         * parameter.cs (Attributes): Set the correct flags for ref parameters.
14531
14532         * expression.cs (Argument::FullDesc): New function to provide a full desc.
14533
14534         * support.cs (ParameterData): Add method ParameterDesc to the interface.
14535
14536         (ReflectionParameters, InternalParameters): Implement the above method.
14537
14538         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
14539         reporting errors.
14540
14541         (Invocation::FullMethodDesc): Ditto. 
14542
14543 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
14544
14545         * cs-parser.jay: Add extra production for the second form of array
14546         creation. 
14547
14548         * expression.cs (ArrayCreation): Update to reflect the above
14549         change. 
14550
14551         * Small changes to prepare for Array initialization.
14552
14553 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
14554
14555         * typemanager.cs (ImplementsInterface): interface might be null;
14556         Deal with this problem;
14557
14558         Also, we do store negative hits on the cache (null values), so use
14559         this instead of calling t.GetInterfaces on the type everytime.
14560
14561 2001-10-28  Ravi Pratap  <ravi@ximian.com>
14562
14563         * typemanager.cs (IsBuiltinType): New method to help determine the same.
14564
14565         * expression.cs (New::DoResolve): Get rid of array creation code and instead
14566         split functionality out into different classes.
14567
14568         (New::FormArrayType): Move into NewBuiltinArray.
14569
14570         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
14571         quite useless.
14572
14573         (NewBuiltinArray): New class to handle creation of built-in arrays.
14574
14575         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
14576         account creation of one-dimensional arrays.
14577
14578         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
14579
14580         (NewUserdefinedArray::DoResolve): Implement.
14581
14582         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
14583
14584         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
14585         we maintain inside the TypeManager. This is necessary to perform lookups on the
14586         module builder.
14587
14588         (LookupType): Update to perform GetType on the module builders too.     
14589
14590         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
14591
14592         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
14593
14594 2001-10-23  Ravi Pratap  <ravi@ximian.com>
14595
14596         * expression.cs (New::DoResolve): Implement guts of array creation.
14597
14598         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
14599
14600 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
14601
14602         * expression.cs: Fix bug I introduced lsat night that broke
14603         Delegates. 
14604
14605         (Expression.Resolve): Report a 246 error (can not resolve name)
14606         if we find a SimpleName in the stream.
14607
14608         (Expression.ResolveLValue): Ditto.
14609
14610         (Expression.ResolveWithSimpleName): This function is a variant of
14611         ResolveName, this one allows SimpleNames to be returned without a
14612         warning.  The only consumer of SimpleNames is MemberAccess
14613
14614 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
14615
14616         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
14617         might arrive here.  I have my doubts that this is correct.
14618
14619         * statement.cs (Lock): Implement lock statement.
14620
14621         * cs-parser.jay: Small fixes to support `lock' and `using'
14622
14623         * cs-tokenizer.cs: Remove extra space
14624
14625         * driver.cs: New flag --checked, allows to turn on integer math
14626         checking. 
14627
14628         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
14629         Threading.Monitor.Exit 
14630
14631 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
14632
14633         * expression.cs (IndexerAccess::DoResolveLValue): Set the
14634         Expression Class to be IndexerAccess.
14635
14636         Notice that Indexer::DoResolve sets the eclass to Value.
14637
14638 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
14639
14640         * class.cs (TypeContainer::Emit): Emit code for indexers.
14641
14642         * assign.cs (IAssignMethod): New interface implemented by Indexers
14643         and Properties for handling assignment.
14644
14645         (Assign::Emit): Simplify and reuse code. 
14646
14647         * expression.cs (IndexerAccess, PropertyExpr): Implement
14648         IAssignMethod, clean up old code. 
14649
14650 2001-10-22  Ravi Pratap  <ravi@ximian.com>
14651
14652         * typemanager.cs (ImplementsInterface): New method to determine if a type
14653         implements a given interface. Provides a nice cache too.
14654
14655         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
14656         method.
14657
14658         (ConvertReferenceExplicit): Ditto.
14659
14660         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
14661         various methods, with correct names etc.
14662
14663         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
14664         Operator.UnaryNegation.
14665
14666         * cs-parser.jay (operator_declarator): Be a little clever in the case where
14667         we have a unary plus or minus operator.
14668
14669         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
14670         UnaryMinus.
14671
14672         * everywhere : update accordingly.
14673
14674         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
14675         respectively.
14676
14677         * class.cs (Method::Define): For the case where we are implementing a method
14678         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
14679         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
14680
14681 2001-10-21  Ravi Pratap  <ravi@ximian.com>
14682
14683         * interface.cs (FindMembers): Implement to work around S.R.E
14684         lameness.
14685
14686         * typemanager.cs (IsInterfaceType): Implement.
14687
14688         (FindMembers): Update to handle interface types too.
14689
14690         * expression.cs (ImplicitReferenceConversion): Re-write bits which
14691         use IsAssignableFrom as that is not correct - it doesn't work.
14692
14693         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
14694         and accordingly override EmitStatement.
14695
14696         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
14697         using the correct logic :-)
14698
14699 2001-10-19  Ravi Pratap  <ravi@ximian.com>
14700
14701         * ../errors/cs-11.cs : Add to demonstrate error -11 
14702
14703 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
14704
14705         * assign.cs (Assign::Resolve): Resolve right hand side first, and
14706         then pass this as a hint to ResolveLValue.
14707
14708         * expression.cs (FieldExpr): Add Location information
14709
14710         (FieldExpr::LValueResolve): Report assignment to readonly
14711         variable. 
14712
14713         (Expression::ExprClassFromMemberInfo): Pass location information.
14714
14715         (Expression::ResolveLValue): Add new method that resolves an
14716         LValue. 
14717
14718         (Expression::DoResolveLValue): Default invocation calls
14719         DoResolve. 
14720
14721         (Indexers): New class used to keep track of indexers in a given
14722         Type. 
14723
14724         (IStackStore): Renamed from LValue, as it did not really describe
14725         what this did.  Also ResolveLValue is gone from this interface and
14726         now is part of Expression.
14727
14728         (ElementAccess): Depending on the element access type
14729
14730         * typemanager.cs: Add `indexer_name_type' as a Core type
14731         (System.Runtime.CompilerServices.IndexerNameAttribute)
14732
14733         * statement.cs (Goto): Take a location.
14734
14735 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14736
14737         * delegate.cs (Delegate::VerifyDelegate): New method to verify
14738         if two delegates are compatible.
14739
14740         (NewDelegate::DoResolve): Update to take care of the case when
14741         we instantiate a delegate from another delegate.
14742
14743         * typemanager.cs (FindMembers): Don't even try to look up members
14744         of Delegate types for now.
14745
14746 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14747
14748         * delegate.cs (NewDelegate): New class to take care of delegate
14749         instantiation.
14750
14751         * expression.cs (New): Split the delegate related code out into 
14752         the NewDelegate class.
14753
14754         * delegate.cs (DelegateInvocation): New class to handle delegate 
14755         invocation.
14756
14757         * expression.cs (Invocation): Split out delegate related code into
14758         the DelegateInvocation class.
14759
14760 2001-10-17  Ravi Pratap  <ravi@ximian.com>
14761
14762         * expression.cs (New::DoResolve): Implement delegate creation fully
14763         and according to the spec.
14764
14765         (New::DoEmit): Update to handle delegates differently.
14766
14767         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
14768         because of which we were printing out arguments in reverse order !
14769
14770         * delegate.cs (VerifyMethod): Implement to check if the given method
14771         matches the delegate.
14772
14773         (FullDelegateDesc): Implement.
14774
14775         (VerifyApplicability): Implement.
14776
14777         * expression.cs (Invocation::DoResolve): Update to accordingly handle
14778         delegate invocations too.
14779
14780         (Invocation::Emit): Ditto.
14781
14782         * ../errors/cs1593.cs : Added.
14783
14784         * ../errors/cs1594.cs : Added.
14785
14786         * delegate.cs (InstanceExpression, TargetMethod): New properties.
14787
14788 2001-10-16  Ravi Pratap  <ravi@ximian.com>
14789
14790         * typemanager.cs (intptr_type): Core type for System.IntPtr
14791
14792         (InitCoreTypes): Update for the same.
14793
14794         (iasyncresult_type, asynccallback_type): Ditto.
14795
14796         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
14797         correct.
14798
14799         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
14800         too.
14801
14802         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
14803         the builders for the 4 members of a delegate type :-)
14804
14805         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
14806         type.
14807
14808         * expression.cs (New::DoResolve): Implement guts for delegate creation.
14809
14810         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
14811
14812 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
14813
14814         * statement.cs (Break::Emit): Implement.   
14815         (Continue::Emit): Implement.
14816
14817         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14818         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14819         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14820         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
14821         end loop
14822
14823         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
14824         properties that track the label for the current loop (begin of the
14825         loop and end of the loop).
14826
14827 2001-10-15  Ravi Pratap  <ravi@ximian.com>
14828
14829         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
14830         use of emitting anything at all.
14831
14832         * class.cs, rootcontext.cs : Get rid of calls to the same.
14833
14834         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
14835
14836         (Populate): Define the constructor correctly and set the implementation
14837         attributes.
14838
14839         * typemanager.cs (delegate_types): New hashtable to hold delegates that
14840         have been defined.
14841
14842         (AddDelegateType): Implement.
14843
14844         (IsDelegateType): Implement helper method.
14845
14846         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
14847
14848         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
14849         and accordingly handle it.
14850
14851         * delegate.cs (Populate): Take TypeContainer argument.
14852         Implement bits to define the Invoke method. However, I still haven't figured out
14853         how to take care of the native int bit :-(
14854
14855         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
14856         Qualify the name of the delegate, not its return type !
14857
14858         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
14859         conversion.
14860
14861         (StandardConversionExists): Checking for array types turns out to be recursive.
14862
14863         (ConvertReferenceExplicit): Implement array conversion.
14864
14865         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
14866
14867 2001-10-12  Ravi Pratap  <ravi@ximian.com>
14868
14869         * cs-parser.jay (delegate_declaration): Store the fully qualified
14870         name as it is a type declaration.
14871
14872         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
14873         readonly.
14874
14875         (DefineDelegate): Renamed from Define. Does the same thing essentially,
14876         as TypeContainer::DefineType.
14877
14878         (Populate): Method in which all the definition of the various methods (Invoke)
14879         etc is done.
14880
14881         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
14882         see.
14883
14884         (CloseDelegate): Finally creates the delegate.
14885
14886         * class.cs (TypeContainer::DefineType): Update to define delegates.
14887         (Populate, Emit and CloseType): Do the same thing here too.
14888
14889         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
14890         delegates in all these operations.
14891
14892 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
14893
14894         * expression.cs: LocalTemporary: a new expression used to
14895         reference a temporary that has been created.
14896
14897         * assign.cs: Handle PropertyAccess back here, so that we can
14898         provide the proper semantic access to properties.
14899
14900         * expression.cs (Expression::ConvertReferenceExplicit): Implement
14901         a few more explicit conversions. 
14902
14903         * modifiers.cs: `NEW' modifier maps to HideBySig.
14904
14905         * expression.cs (PropertyExpr): Make this into an
14906         ExpressionStatement, and support the EmitStatement code path. 
14907
14908         Perform get/set error checking, clean up the interface.
14909
14910         * assign.cs: recognize PropertyExprs as targets, and if so, turn
14911         them into toplevel access objects.
14912
14913 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
14914
14915         * expression.cs: PropertyExpr::PropertyExpr: use work around the
14916         SRE.
14917
14918         * typemanager.cs: Keep track here of our PropertyBuilders again to
14919         work around lameness in SRE.
14920
14921 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
14922
14923         * expression.cs (LValue::LValueResolve): New method in the
14924         interface, used to perform a second resolution pass for LValues. 
14925
14926         (This::DoResolve): Catch the use of this in static methods.
14927
14928         (This::LValueResolve): Implement.
14929
14930         (This::Store): Remove warning, assigning to `this' in structures
14931         is 
14932
14933         (Invocation::Emit): Deal with invocation of
14934         methods on value types.  We need to pass the address to structure
14935         methods rather than the object itself.  (The equivalent code to
14936         emit "this" for structures leaves the entire structure on the
14937         stack instead of a pointer to it). 
14938
14939         (ParameterReference::DoResolve): Compute the real index for the
14940         argument based on whether the method takes or not a `this' pointer
14941         (ie, the method is static).
14942
14943         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
14944         value types returned from functions when we need to invoke a
14945         method on the sturcture.
14946
14947
14948 2001-10-11  Ravi Pratap  <ravi@ximian.com>
14949
14950         * class.cs (TypeContainer::DefineType): Method to actually do the business of
14951         defining the type in the Modulebuilder or Typebuilder. This is to take
14952         care of nested types which need to be defined on the TypeBuilder using
14953         DefineNestedMethod.
14954
14955         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
14956         methods in RootContext, only ported to be part of TypeContainer.
14957
14958         (TypeContainer::GetInterfaceOrClass): Ditto.
14959
14960         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
14961
14962         * interface.cs (Interface::DefineInterface): New method. Does exactly
14963         what RootContext.CreateInterface did earlier, only it takes care of nested types 
14964         too.
14965
14966         (Interface::GetInterfaces): Move from RootContext here and port.
14967
14968         (Interface::GetInterfaceByName): Same here.
14969
14970         * rootcontext.cs (ResolveTree): Re-write.
14971
14972         (PopulateTypes): Re-write.
14973
14974         * class.cs (TypeContainer::Populate): Populate nested types too.
14975         (TypeContainer::Emit): Emit nested members too.
14976
14977         * typemanager.cs (AddUserType): Do not make use of the FullName property,
14978         instead just use the name argument passed in as it is already fully
14979         qualified.
14980
14981         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
14982         to TypeContainer mapping to see if a type is user-defined.
14983
14984         * class.cs (TypeContainer::CloseType): Implement. 
14985
14986         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
14987         the default constructor.
14988
14989         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
14990         twice.
14991
14992         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
14993
14994         * interface.cs (CloseType): Create the type here.
14995
14996         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
14997         the hierarchy.
14998
14999         Remove all the methods which are now in TypeContainer.
15000
15001 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15002
15003         * delegate.cs (Define): Re-write bits to define the delegate
15004         correctly.
15005
15006 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15007
15008         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15009
15010         * expression.cs (ImplicitReferenceConversion): handle null as well
15011         as a source to convert to any reference type.
15012
15013         * statement.cs (Return): Perform any implicit conversions to
15014         expected return type.  
15015
15016         Validate use of return statement.  
15017
15018         * codegen.cs (EmitContext): Pass the expected return type here.
15019
15020         * class.cs (Method, Constructor, Property): Pass expected return
15021         type to EmitContext.
15022
15023 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15024
15025         * expression.cs: Make DoResolve take an EmitContext instead of a
15026         TypeContainer.
15027
15028         Replaced `l' and `location' for `loc', for consistency.
15029
15030         (Error, Warning): Remove unneeded Tc argument.
15031
15032         * assign.cs, literal.cs, constant.cs: Update to new calling
15033         convention. 
15034
15035         * codegen.cs: EmitContext now contains a flag indicating whether
15036         code is being generated in a static method or not.
15037
15038         * cs-parser.jay: DecomposeQI, new function that replaces the old
15039         QualifiedIdentifier.  Now we always decompose the assembled
15040         strings from qualified_identifier productions into a group of
15041         memberaccesses.
15042
15043 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15044
15045         * rootcontext.cs: Deal with field-less struct types correctly now
15046         by passing the size option to Define Type.
15047
15048         * class.cs: Removed hack that created one static field. 
15049
15050 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15051
15052         * statement.cs: Moved most of the code generation here. 
15053
15054 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15055
15056         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15057         seem very right.
15058
15059         (ElementAccess): Remove useless bits for now - keep checks as the spec
15060         says.
15061
15062 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15063
15064         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15065         and start performing checks according to the spec.
15066
15067 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15068
15069         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15070         rank_specifiers instead.
15071
15072         (rank_specifiers): Change the order in which the rank specifiers are stored
15073
15074         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15075
15076         * expression.cs (ElementAccess): Implement the LValue interface too.
15077
15078 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15079
15080         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15081         except that user defined conversions are not included.
15082
15083         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15084         perform the conversion of the return type, if necessary.
15085
15086         (New::DoResolve): Check whether we are creating an array or an object
15087         and accordingly do the needful.
15088
15089         (New::Emit): Same here.
15090
15091         (New::DoResolve): Implement guts of array creation.
15092
15093         (New::FormLookupType): Helper function.
15094
15095 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15096
15097         * codegen.cs: Removed most of the code generation here, and move the
15098         corresponding code generation bits to the statement classes. 
15099
15100         Added support for try/catch/finalize and throw.
15101
15102         * cs-parser.jay: Added support for try/catch/finalize.
15103
15104         * class.cs: Catch static methods having the flags override,
15105         virtual or abstract.
15106
15107         * expression.cs (UserCast): This user cast was not really doing
15108         what it was supposed to do.  Which is to be born in fully resolved
15109         state.  Parts of the resolution were being performed at Emit time! 
15110
15111         Fixed this code.
15112
15113 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15114
15115         * expression.cs: Implicity convert the result from UserCast.
15116
15117 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15118
15119         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15120         prevented it from working correctly. 
15121
15122         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15123         merely ConvertImplicit.
15124
15125 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15126
15127         * typemanager.cs: Make the LookupTypeContainer function static,
15128         and not per-instance.  
15129
15130         * class.cs: Make static FindMembers (the one that takes a Type
15131         argument). 
15132
15133         * codegen.cs: Add EmitForeach here.
15134
15135         * cs-parser.jay: Make foreach a toplevel object instead of the
15136         inline expansion, as we need to perform semantic analysis on it. 
15137
15138 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15139
15140         * expression.cs (Expression::ImplicitUserConversion): Rename to
15141         UserDefinedConversion.
15142
15143         (Expression::UserDefinedConversion): Take an extra argument specifying 
15144         whether we look for explicit user conversions too.
15145
15146         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15147
15148         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15149
15150         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15151         with the appropriate arguments.
15152
15153         * cs-parser.jay (cast_expression): Record location too.
15154
15155         * expression.cs (Cast): Record location info.
15156
15157         (Expression::ConvertExplicit): Take location argument.
15158
15159         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15160         to determine if we are doing explicit conversions.
15161
15162         (UserCast::Emit): Update accordingly.
15163
15164         (Expression::ConvertExplicit): Report an error if everything fails.
15165
15166         * ../errors/cs0030.cs : Add.
15167
15168 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15169
15170         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15171         virtual and newslot bits. 
15172
15173         * class.cs (TypeContainer::RegisterRequiredImplementations):
15174         Record methods we need.
15175
15176         (TypeContainer::MakeKey): Helper function to make keys for
15177         MethodBases, since the Methodbase key is useless.
15178
15179         (TypeContainer::Populate): Call RegisterRequiredImplementations
15180         before defining the methods.   
15181
15182         Create a mapping for method_builders_to_methods ahead of time
15183         instead of inside a tight loop.
15184
15185         (::RequireMethods):  Accept an object as the data to set into the
15186         hashtable so we can report interface vs abstract method mismatch.
15187
15188 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15189
15190         * report.cs: Make all of it static.
15191
15192         * rootcontext.cs: Drop object_type and value_type computations, as
15193         we have those in the TypeManager anyways.
15194
15195         Drop report instance variable too, now it is a global.
15196
15197         * driver.cs: Use try/catch on command line handling.
15198
15199         Add --probe option to debug the error reporting system with a test
15200         suite. 
15201
15202         * report.cs: Add support for exiting program when a probe
15203         condition is reached.
15204
15205 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15206
15207         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15208         we do a forcible conversion regardless of type, to check if 
15209         ForceConversion returns a null.
15210
15211         (Binary::error19): Use location to report error.
15212
15213         (Unary::error23): Use location here too.
15214
15215         * ../errors/cs0019.cs : Check in.
15216
15217         * ../errors/cs0023.cs : Check in.
15218
15219         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15220         case of a non-null MethodInfo object with a length of 0 !
15221
15222         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15223         an applicable member - according to the spec :-)
15224         Also fix logic to find members in base types.
15225
15226         (Unary::ResolveOperator): Same here.
15227
15228         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15229         as I was getting thoroughly confused between this and error19 :-)
15230
15231         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15232         (::FindMostEncompassedType): Implement.
15233         (::FindMostEncompassingType): Implement.
15234         (::StandardConversionExists): Implement.
15235
15236         (UserImplicitCast): Re-vamp. We now need info about most specific
15237         source and target types so that we can do the necessary conversions.
15238
15239         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15240         mathematical union with no duplicates.
15241
15242 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15243
15244         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15245         in order from base classes to child classes, so that we can in
15246         child classes look up in our parent for method names and
15247         attributes (required for handling abstract, virtual, new, override
15248         constructs: we need to instrospect our base class, and if we dont
15249         populate the classes in order, the introspection might be
15250         incorrect.  For example, a method could query its parent before
15251         the parent has any methods and would determine that the parent has
15252         no abstract methods (while it could have had them)).
15253
15254         (RootContext::CreateType): Record the order in which we define the
15255         classes.
15256
15257 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15258
15259         * class.cs (TypeContainer::Populate): Also method definitions can
15260         fail now, keep track of this.
15261
15262         (TypeContainer::FindMembers): Implement support for
15263         DeclaredOnly/noDeclaredOnly flag.
15264
15265         (Constructor::Emit) Return the ConstructorBuilder.
15266
15267         (Method::Emit) Return the MethodBuilder. 
15268         Check for abstract or virtual methods to be public.
15269
15270         * rootcontext.cs (RootContext::CreateType): Register all the
15271         abstract methods required for the class to be complete and the
15272         interface methods that must be implemented. 
15273
15274         * cs-parser.jay: Report error 501 (method requires body if it is
15275         not marked abstract or extern).
15276
15277         * expression.cs (TypeOf::Emit): Implement.
15278
15279         * typemanager.cs: runtime_handle_type, new global type.
15280
15281         * class.cs (Property::Emit): Generate code for properties.
15282
15283 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15284
15285         * expression.cs (Unary::ResolveOperator): Find operators on base type
15286         too - we now conform exactly to the spec.
15287
15288         (Binary::ResolveOperator): Same here.
15289
15290         * class.cs (Operator::Define): Fix minor quirk in the tests.
15291
15292         * ../errors/cs0215.cs : Added.
15293
15294         * ../errors/cs0556.cs : Added.
15295
15296         * ../errors/cs0555.cs : Added.
15297
15298 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15299
15300         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15301         single integer which is really efficient
15302
15303 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15304
15305         *  expression.cs (Expression::ImplicitUserConversion): Use location
15306         even in the case when we are examining True operators.
15307  
15308         * class.cs (Operator::Define): Perform extensive checks to conform
15309         with the rules for operator overloading in the spec.
15310
15311         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15312         some of the other conversions mentioned in the spec.
15313
15314         * typemanager.cs (array_type): New static member for the System.Array built-in
15315         type.
15316
15317         (cloneable_interface): For System.ICloneable interface.
15318
15319         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15320         we start resolving the tree and populating types.
15321
15322         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15323  
15324 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15325
15326         * expression.cs (Expression::ExprClassFromMemberInfo,
15327         Expression::Literalize): Create literal expressions from
15328         FieldInfos which are literals.
15329
15330         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
15331         type casts, because they were wrong.  The test suite in tests
15332         caught these ones.
15333
15334         (ImplicitNumericConversion): ushort to ulong requires a widening
15335         cast. 
15336
15337         Int32 constant to long requires widening cast as well.
15338
15339         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
15340         for integers because the type on the stack is not i4.
15341
15342 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
15343
15344         * expression.cs (report118): require location argument. 
15345
15346         * parameter.cs: Do not dereference potential null value.
15347
15348         * class.cs: Catch methods that lack the `new' keyword when
15349         overriding a name.  Report warnings when `new' is used without
15350         anything being there to override.
15351
15352         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15353
15354         * class.cs: Only add constructor to hashtable if it is non-null
15355         (as now constructors can fail on define).
15356
15357         (TypeManager, Class, Struct): Take location arguments.
15358
15359         Catch field instance initialization in structs as errors.
15360
15361         accepting_filter: a new filter for FindMembers that is static so
15362         that we dont create an instance per invocation.
15363
15364         (Constructor::Define): Catch errors where a struct constructor is
15365         parameterless 
15366
15367         * cs-parser.jay: Pass location information for various new
15368         constructs. 
15369
15370         * delegate.cs (Delegate): take a location argument.
15371
15372         * driver.cs: Do not call EmitCode if there were problesm in the
15373         Definition of the types, as many Builders wont be there. 
15374
15375         * decl.cs (Decl::Decl): Require a location argument.
15376
15377         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15378         into integers, and find the most appropiate integer for it.
15379
15380         * literal.cs: Implement ULongLiteral.
15381
15382         * rootcontext.cs: Provide better information about the location of
15383         failure when CreateType fails.
15384
15385 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15386
15387         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15388         as well.
15389
15390         * expression.cs (Binary::CheckShiftArguments): Add missing type
15391         computation.
15392         (Binary::ResolveOperator): Add type to the logical and and logical
15393         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15394         before.
15395
15396         (Binary::DoNumericPromotions): In the case where either argument
15397         is ulong (and most signed types combined with ulong cause an
15398         error) perform implicit integer constant conversions as well.
15399
15400 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15401
15402         * expression.cs (UserImplicitCast): Method should always be
15403         non-null. 
15404         (Invocation::BetterConversion): Simplified test for IntLiteral.
15405
15406         (Expression::ImplicitNumericConversion): Split this routine out.
15407         Put the code that performs implicit constant integer conversions
15408         here. 
15409
15410         (Expression::Resolve): Become a wrapper around DoResolve so we can
15411         check eclass and type being set after resolve.
15412
15413         (Invocation::Badness): Remove this dead function
15414
15415         (Binary::ResolveOperator): Do not compute the expensive argumnets
15416         unless we have a union for it.
15417
15418         (Probe::Emit): Is needs to do an isinst and then
15419         compare against null.
15420
15421         (::CanConvert): Added Location argument.  If the Location argument
15422         is null (Location.Null), then we do not report errors.  This is
15423         used by the `probe' mechanism of the Explicit conversion.  We do
15424         not want to generate an error for something that the user
15425         explicitly requested to be casted.  But the pipeline for an
15426         explicit cast first tests for potential implicit casts.
15427
15428         So for now, if the Location is null, it means `Probe only' to
15429         avoid adding another argument.   Might have to revise this
15430         strategy later.
15431
15432         (ClassCast): New class used to type cast objects into arbitrary
15433         classes (used in Explicit Reference Conversions).
15434
15435         Implement `as' as well.
15436
15437         Reverted all the patches from Ravi below: they were broken:
15438
15439                 * The use of `level' as a mechanism to stop recursive
15440                   invocations is wrong.  That was there just to catch the
15441                   bug with a strack trace but not as a way of addressing
15442                   the problem.
15443
15444                   To fix the problem we have to *understand* what is going
15445                   on and the interactions and come up with a plan, not
15446                   just get things going.
15447
15448                 * The use of the type conversion cache that I proposed
15449                   last night had an open topic: How does this work across
15450                   protection domains.  A user defined conversion might not
15451                   be public in the location where we are applying the
15452                   conversion, a different conversion might be selected
15453                   (ie, private A->B (better) but public B->A (worse),
15454                   inside A, A->B applies, but outside it, B->A will
15455                   apply).
15456
15457                 * On top of that (ie, even if the above is solved),
15458                   conversions in a cache need to be abstract.  Ie, `To
15459                   convert from an Int to a Short use an OpcodeCast', not
15460                   `To convert from an Int to a Short use the OpcodeCast on
15461                   the variable 5' (which is what this patch was doing).
15462
15463 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15464
15465         * expression.cs (Invocation::ConversionExists): Re-write to use
15466         the conversion cache
15467
15468         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
15469         cache all conversions done, not just user-defined ones.
15470
15471         (Invocation::BetterConversion): The real culprit. Use ConversionExists
15472         to determine if a conversion exists instead of acutually trying to 
15473         perform the conversion. It's faster too.
15474
15475         (Expression::ConvertExplicit): Modify to use ConversionExists to check
15476         and only then attempt the implicit conversion.
15477
15478 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15479
15480         * expression.cs (ConvertImplicit): Use a cache for conversions
15481         already found. Check level of recursion and bail out if necessary.
15482
15483 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15484
15485         * typemanager.cs (string_concat_string_string, string_concat_object_object):
15486         Export standard methods that we expect for string operations.
15487
15488         * statement.cs (Block::UsageWarning): Track usage of variables and
15489         report the errors for not used variables.
15490
15491         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
15492         operator. 
15493
15494 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15495
15496         * codegen.cs: remove unnneded code 
15497
15498         * expression.cs: Removed BuiltinTypeAccess class
15499
15500         Fix the order in which implicit conversions are
15501         done.  
15502
15503         The previous fixed dropped support for boxed conversions (adding a
15504         test to the test suite now)
15505
15506         (UserImplicitCast::CanConvert): Remove test for source being null,
15507         that code is broken.  We should not feed a null to begin with, if
15508         we do, then we should track the bug where the problem originates
15509         and not try to cover it up here.
15510
15511         Return a resolved expression of type UserImplicitCast on success
15512         rather than true/false.  Ravi: this is what I was talking about,
15513         the pattern is to use a static method as a "constructor" for
15514         objects. 
15515
15516         Also, do not create arguments until the very last minute,
15517         otherwise we always create the arguments even for lookups that
15518         will never be performed. 
15519
15520         (UserImplicitCast::Resolve): Eliminate, objects of type
15521         UserImplicitCast are born in a fully resolved state. 
15522
15523         * typemanager.cs (InitCoreTypes): Init also value_type
15524         (System.ValueType). 
15525
15526         * expression.cs (Cast::Resolve): First resolve the child expression.
15527
15528         (LValue): Add new method AddressOf to be used by
15529         the `&' operator.  
15530
15531         Change the argument of Store to take an EmitContext instead of an
15532         ILGenerator, because things like FieldExpr need to be able to call
15533         their children expression to generate the instance code. 
15534
15535         (Expression::Error, Expression::Warning): Sugar functions for
15536         reporting errors.
15537
15538         (Expression::MemberLookup): Accept a TypeContainer instead of a
15539         Report as the first argument.
15540
15541         (Expression::ResolvePrimary): Killed.  I still want to improve
15542         this as currently the code is just not right.
15543
15544         (Expression::ResolveMemberAccess): Simplify, but it is still
15545         wrong. 
15546
15547         (Unary::Resolve): Catch errors in AddressOf operators.
15548
15549         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
15550         index to a byte for the short-version, or the compiler will choose
15551         the wrong Emit call, which generates the wrong data.
15552
15553         (ParameterReference::Emit, ::Store): same.
15554
15555         (FieldExpr::AddressOf): Implement.
15556
15557         * typemanager.cs: TypeManager: made public variable instead of
15558         property.
15559
15560         * driver.cs: document --fatal.
15561
15562         * report.cs (ErrorMessage, WarningMessage): new names for the old
15563         Error and Warning classes.
15564
15565         * cs-parser.jay (member_access): Turn built-in access to types
15566         into a normal simplename
15567
15568 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15569
15570         * expression.cs (Invocation::BetterConversion): Fix to cope
15571         with q being null, since this was introducing a bug.
15572
15573         * expression.cs (ConvertImplicit): Do built-in conversions first.
15574
15575 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15576
15577         * expression.cs (UserImplicitCast::Resolve): Fix bug.
15578
15579 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15580
15581         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
15582         I had introduced long ago (what's new ?).
15583
15584         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
15585         the work of all the checking. 
15586         (ConvertImplicit): Call CanConvert and only then create object if necessary.
15587         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
15588
15589         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
15590         that is the right way. 
15591
15592         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
15593         overloading resolution. Use everywhere instead of cutting and pasting code.
15594
15595         (Binary::ResolveOperator): Use MakeUnionSet.
15596
15597         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
15598         we have to convert to bool types. Not complete yet.
15599
15600 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15601
15602         * typemanager.cs (TypeManager::CSharpName): support ushort.
15603
15604         * expression.cs (Expression::TryImplicitIntConversion): Attempts
15605         to provide an expression that performsn an implicit constant int
15606         conversion (section 6.1.6).
15607         (Expression::ConvertImplicitRequired): Reworked to include
15608         implicit constant expression conversions.
15609
15610         (Expression::ConvertNumericExplicit): Finished.
15611
15612         (Invocation::Emit): If InstanceExpression is null, then it means
15613         that we perform a call on this.
15614
15615 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15616
15617         * expression.cs (Unary::Emit): Remove some dead code.
15618         (Probe): Implement Resolve and Emit for `is'.
15619         (Expression::ConvertImplicitRequired): Attempt to do constant
15620         expression conversions here.  Maybe should be moved to
15621         ConvertImplicit, but I am not sure.
15622         (Expression::ImplicitLongConstantConversionPossible,
15623         Expression::ImplicitIntConstantConversionPossible): New functions
15624         that tell whether is it possible to apply an implicit constant
15625         expression conversion.
15626
15627         (ConvertNumericExplicit): Started work on explicit numeric
15628         conversions.
15629
15630         * cs-parser.jay: Update operator constants.
15631
15632         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
15633         (Parameters::GetSignature): Hook up VerifyArgs here.
15634         (Parameters::VerifyArgs): Verifies that no two arguments have the
15635         same name. 
15636
15637         * class.cs (Operator): Update the operator names to reflect the
15638         ones that the spec expects (as we are just stringizing the
15639         operator names).
15640
15641         * expression.cs (Unary::ResolveOperator): Fix bug: Use
15642         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
15643         previous usage did only work for our methods.
15644         (Expression::ConvertImplicit): Handle decimal implicit numeric
15645         conversions as well.
15646         (Expression::InternalTypeConstructor): Used to invoke constructors
15647         on internal types for default promotions.
15648
15649         (Unary::Emit): Implement special handling for the pre/post
15650         increment/decrement for overloaded operators, as they need to have
15651         the same semantics as the other operators.
15652
15653         (Binary::ResolveOperator): ditto.
15654         (Invocation::ConversionExists): ditto.
15655         (UserImplicitCast::Resolve): ditto.
15656
15657 2001-09-26  Ravi Pratap  <ravi@ximian.com>
15658
15659         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
15660         operator, return after emitting body. Regression tests pass again !
15661
15662         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
15663         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
15664         (Invocation::OverloadResolve): Ditto.
15665         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
15666
15667         * everywhere : update calls to the above methods accordingly.
15668
15669 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15670
15671         * assign.cs (Assign): Make it inherit from ExpressionStatement.
15672
15673         * expression.cs (ExpressionStatement): New base class used for
15674         expressions that can appear in statements, so that we can provide
15675         an alternate path to generate expression that do not leave a value
15676         on the stack.
15677
15678         (Expression::Emit, and all the derivatives): We no longer return
15679         whether a value is left on the stack or not.  Every expression
15680         after being emitted leaves a single value on the stack.
15681
15682         * codegen.cs (EmitContext::EmitStatementExpression): Use the
15683         facilties of ExpressionStatement if possible.
15684
15685         * cs-parser.jay: Update statement_expression.
15686
15687 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
15688
15689         * driver.cs: Change the wording of message
15690
15691 2001-09-25  Ravi Pratap  <ravi@ximian.com>
15692
15693         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
15694         the type of the expression to the return type of the method if
15695         we have an overloaded operator match ! The regression tests pass again !
15696         (Unary::ResolveOperator): Ditto.
15697
15698         * expression.cs (Invocation::ConversionExists): Correct the member lookup
15699         to find "op_Implicit", not "implicit" ;-)
15700         (UserImplicitCast): New class to take care of user-defined implicit conversions.
15701         (ConvertImplicit, ForceConversion): Take TypeContainer argument
15702
15703         * everywhere : Correct calls to the above accordingly.
15704
15705         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
15706         (ConvertImplicit): Do user-defined conversion if it exists.
15707
15708 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
15709
15710         * assign.cs: track location.
15711         (Resolve): Use implicit conversions on assignment.
15712
15713         * literal.cs: Oops.  Not good, Emit of short access values should
15714         pass (Bytes) or the wrong argument will be selected.
15715
15716         * expression.cs (Unary::Emit): Emit code for -expr.
15717
15718         (Unary::ResolveOperator): Handle `Substract' for non-constants
15719         (substract from zero from the non-constants).
15720         Deal with Doubles as well. 
15721
15722         (Expression::ConvertImplicitRequired): New routine that reports an
15723         error if no implicit conversion exists. 
15724
15725         (Invocation::OverloadResolve): Store the converted implicit
15726         expressions if we make them
15727
15728 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15729
15730         * class.cs (ConstructorInitializer): Take a Location argument.
15731         (ConstructorBaseInitializer): Same here.
15732         (ConstructorThisInitializer): Same here.
15733
15734         * cs-parser.jay : Update all calls accordingly.
15735
15736         * expression.cs (Unary, Binary, New): Take location argument.
15737         Update accordingly everywhere.
15738
15739         * cs-parser.jay : Update all calls to the above to take a location
15740         argument.
15741
15742         * class.cs : Ditto.
15743
15744 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15745
15746         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
15747         (Invocation::BetterConversion): Same here
15748         (Invocation::ConversionExists): Ditto.
15749
15750         (Invocation::ConversionExists): Implement.
15751
15752 2001-09-22  Ravi Pratap  <ravi@ximian.com>
15753
15754         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
15755         Also take an additional TypeContainer argument.
15756
15757         * All over : Pass in TypeContainer as argument to OverloadResolve.
15758
15759         * typemanager.cs (CSharpName): Update to check for the string type and return
15760         that too.
15761
15762         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
15763         a given method.
15764
15765 2001-09-21  Ravi Pratap  <ravi@ximian.com>
15766
15767         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
15768         (Invocation::BetterFunction): Implement.
15769         (Invocation::BetterConversion): Implement.
15770         (Invocation::ConversionExists): Skeleton, no implementation yet.
15771
15772         Okay, things work fine !
15773
15774 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
15775
15776         * typemanager.cs: declare and load enum_type, delegate_type and
15777         void_type. 
15778
15779         * expression.cs (Expression::Emit): Now emit returns a value that
15780         tells whether a value is left on the stack or not.  This strategy
15781         might be reveted tomorrow with a mechanism that would address
15782         multiple assignments.
15783         (Expression::report118): Utility routine to report mismatches on
15784         the ExprClass.
15785
15786         (Unary::Report23): Report impossible type/operator combination
15787         utility function.
15788
15789         (Unary::IsIncrementableNumber): Whether the type can be
15790         incremented or decremented with add.
15791         (Unary::ResolveOperator): Also allow enumerations to be bitwise
15792         complemented. 
15793         (Unary::ResolveOperator): Implement ++, !, ~,
15794
15795         (Invocation::Emit): Deal with new Emit convetion.
15796
15797         * All Expression derivatives: Updated their Emit method to return
15798         whether they leave values on the stack or not.
15799
15800         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
15801         stack for expressions that are statements. 
15802
15803 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15804
15805         * expression.cs (LValue): New interface.  Must be implemented by
15806         LValue objects.
15807         (LocalVariableReference, ParameterReference, FieldExpr): Implement
15808         LValue interface.
15809
15810         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
15811         interface for generating code, simplifies the code.
15812
15813 2001-09-20  Ravi Pratap  <ravi@ximian.com>
15814
15815         * expression.cs (everywhere): Comment out return statements in ::Resolve
15816         methods to avoid the warnings.
15817
15818 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15819
15820         * driver.cs (parse): Report error 2001 if we can not open the
15821         source file.
15822
15823         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
15824         not resolve it.
15825
15826         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
15827         object. 
15828
15829         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
15830         otherwise nested blocks end up with the same index.
15831
15832         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
15833
15834         * expression.cs:  Instead of having FIXMEs in the Resolve
15835         functions, throw exceptions so it is obvious that we are facing a
15836         bug. 
15837
15838         * cs-parser.jay (invocation_expression): Pass Location information.
15839
15840         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
15841         Use a basename for those routines because .NET does not like paths
15842         on them. 
15843
15844         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
15845         already defined.
15846
15847 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
15848
15849         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
15850         are loading the correct data types (throws an exception if not).
15851         (TypeManager::InitCoreTypes): Use CoreLookupType
15852
15853         * expression.cs (Unary::ResolveOperator): return the child
15854         expression for expressions which are just +expr.
15855         (Unary::ResolveOperator): Return negative literals for -LITERAL
15856         expressions (otherwise they are Unary {Literal}).
15857         (Invocation::Badness): Take into account `Implicit constant
15858         expression conversions'.
15859
15860         * literal.cs (LongLiteral): Implement long literal class.
15861         (IntLiteral): export the `Value' of the intliteral. 
15862
15863 2001-09-19  Ravi Pratap  <ravi@ximian.com>
15864
15865         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
15866
15867         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
15868         instead of 'Operator'
15869
15870         * expression.cs (Binary::ResolveOperator): Update accordingly.
15871         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
15872         and 'Minus'
15873
15874         * cs-parser.jay (unary_expression): Update to use the new names.
15875
15876         * gen-treedump.cs (GetUnary): Same here.
15877
15878         * expression.cs (Unary::Resolve): Implement.
15879         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
15880         operators are found instead of making noise ;-)
15881         (Unary::ResolveOperator): New method to do precisely the same thing which
15882         Binary::ResolveOperator does for Binary expressions.
15883         (Unary.method, .Arguments): Add.
15884         (Unary::OperName): Implement.   
15885         (Unary::ForceConversion): Copy and Paste !
15886
15887         * class.cs (Operator::Define): Fix a small bug for the case when we have 
15888         a unary operator.
15889
15890         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
15891         for the inbuilt operators. Only overloading works for now ;-)
15892
15893 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
15894
15895         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
15896         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
15897
15898         * expression.cs (This::Emit): Implement. 
15899         (This::Resolve): Implement.
15900         (TypeOf:Resolve): Implement.
15901         (Expression::ResolveSimpleName): Add an implicit this to instance
15902         field references. 
15903         (MemberAccess::Resolve): Deal with Parameters and Fields. 
15904         Bind instance variable to Field expressions.
15905         (FieldExpr::Instance): New field used to track the expression that
15906         represents the object instance.
15907         (FieldExpr::Resolve): Track potential errors from MemberLookup not
15908         binding 
15909         (FieldExpr::Emit): Implement.
15910
15911         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
15912         the last instruction contains a return opcode to avoid generating
15913         the last `ret' instruction (this generates correct code, and it is
15914         nice to pass the peverify output).
15915
15916         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
15917         initializer for static and instance variables.
15918         (Constructor::Emit): Allow initializer to be null in the case of
15919         static constructors.  Only emit initializer for instance
15920         constructors. 
15921
15922         (TypeContainer::FindMembers): Return a null array if there are no
15923         matches.
15924
15925         Also fix the code for the MemberTypes.Method branch, as it was not
15926         scanning that for operators (or tried to access null variables before).
15927
15928         * assign.cs (Assign::Emit): Handle instance and static fields. 
15929
15930         * TODO: Updated.
15931
15932         * driver.cs: Stop compilation if there are parse errors.
15933
15934         * cs-parser.jay (constructor_declaration): Provide default base
15935         initializer for non-static constructors.
15936         (constructor_declarator): Do not provide a default base
15937         initializers if none was specified.
15938         Catch the fact that constructors should not have parameters.
15939
15940         * class.cs: Do not emit parent class initializers for static
15941         constructors, that should be flagged as an error.
15942
15943 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15944
15945         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
15946         Move back code into TypeContainer::Populate.
15947
15948 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15949
15950         * class.cs (TypeContainer::AddConstructor): Fix the check to
15951         compare against Name, not Basename. 
15952         (Operator::OpType): Change Plus and Minus to Add and Subtract.
15953
15954         * cs-parser.jay : Update accordingly.
15955
15956         * class.cs (TypeContainer::FindMembers): For the case where we are searching
15957         for methods, don't forget to look into the operators too.
15958         (RegisterMethodBuilder): Helper method to take care of this for
15959         methods, constructors and operators.
15960         (Operator::Define): Completely revamp.
15961         (Operator.OperatorMethod, MethodName): New fields.
15962         (TypeContainer::Populate): Move the registering of builders into
15963         RegisterMethodBuilder.
15964         (Operator::Emit): Re-write.
15965
15966         * expression.cs (Binary::Emit): Comment out code path to emit method
15967         invocation stuff for the case when we have a user defined operator. I am
15968         just not able to get it right !
15969
15970 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15971
15972         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
15973         argument. 
15974
15975         (Expression::MemberLookup): Provide a version that allows to
15976         specify the MemberTypes and BindingFlags. 
15977
15978         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
15979         so it was not fetching variable information from outer blocks.
15980
15981         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
15982         Beforefieldinit as it was buggy.
15983
15984         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
15985         that Ravi put here.  
15986
15987         * class.cs (Constructor::Emit): Only emit if block is not null.
15988         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
15989         deal with this by semantically definining it as if the user had
15990         done it.
15991
15992         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
15993         constructors as we now "emit" them at a higher level.
15994
15995         (TypeContainer::DefineDefaultConstructor): Used to define the
15996         default constructors if none was provided.
15997
15998         (ConstructorInitializer): Add methods Resolve and Emit. 
15999
16000         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16001
16002 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16003
16004         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16005         the default constructor builder with our hashtable for methodbuilders
16006         to methodcores.
16007
16008         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16009         and argument_count is 0 in which case we have a match.
16010         (Binary::ResolveOperator): More null checking and miscellaneous coding
16011         style cleanup.
16012
16013 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16014
16015         * rootcontext.cs (IsNameSpace): Compare against null.
16016
16017         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16018
16019         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16020         and Unary::Operator.
16021
16022         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16023         accordingly.
16024
16025         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16026         we have overloaded operators.
16027         (Binary::ResolveOperator): Implement the part which does the operator overload
16028         resolution.
16029
16030         * class.cs (Operator::Emit): Implement.
16031         (TypeContainer::Emit): Emit the operators we have too.
16032
16033         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16034         the case when we have a user-defined operator.
16035
16036 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16037
16038         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16039
16040 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16041
16042         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16043         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16044         (Constructor::Emit): Implement.
16045         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16046         if we have no work to do. 
16047         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16048         Emit method.
16049
16050         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16051         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16052
16053         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16054         of parent.parent.
16055
16056 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16057
16058         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16059         in the source.
16060         (Tree::RecordNamespace): Method to do what the name says ;-)
16061         (Tree::Namespaces): Property to get at the namespaces hashtable.
16062
16063         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16064         keep track.
16065
16066         * rootcontext.cs (IsNamespace): Fixed it :-)
16067
16068 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16069
16070         * class.cs (TypeContainer::FindMembers): Add support for
16071         constructors. 
16072         (MethodCore): New class that encapsulates both the shared aspects
16073         of a Constructor and a Method.  
16074         (Method, Constructor): Factored pieces into MethodCore.
16075
16076         * driver.cs: Added --fatal which makes errors throw exceptions.
16077         Load System assembly as well as part of the standard library.
16078
16079         * report.cs: Allow throwing exceptions on errors for debugging.
16080
16081         * modifiers.cs: Do not use `parent', instead use the real type
16082         container to evaluate permission settings.
16083
16084         * class.cs: Put Ravi's patch back in.  He is right, and we will
16085         have to cope with the
16086
16087 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16088
16089         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16090         FamORAssem, not FamANDAssem.
16091
16092 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16093
16094         * driver.cs: Added --parse option that only parses its input files
16095         and terminates.
16096
16097         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16098         incorrect.  IsTopLevel is not used to tell whether an object is
16099         root_types or not (that can be achieved by testing this ==
16100         root_types).  But to see if this is a top-level *class* (not
16101         necessarly our "toplevel" container). 
16102
16103 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16104
16105         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16106         parent instead of a direct call to GetType.
16107
16108 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16109
16110         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16111         Modifiers.TypeAttr. This should just be a call to that method.
16112
16113         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16114         object so that we can determine if we are top-level or not.
16115
16116         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16117         TypeContainer too.
16118
16119         * enum.cs (Enum::Define): Ditto.
16120
16121         * modifiers.cs (FieldAttr): Re-write.
16122
16123         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16124         (TypeContainer::HaveStaticConstructor): New property to provide access
16125         to precisely that info.
16126
16127         * modifiers.cs (MethodAttr): Re-write.
16128         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16129
16130         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16131         of top-level types as claimed.
16132
16133 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16134
16135         * expression.cs (MemberLookup): Fruitless attempt to lookup
16136         constructors.  Maybe I need to emit default constructors?  That
16137         might be it (currently .NET emits this for me automatically).
16138         (Invocation::OverloadResolve): Cope with Arguments == null.
16139         (Invocation::EmitArguments): new function, shared by the new
16140         constructor and us.
16141         (Invocation::Emit): Handle static and instance methods.  Emit
16142         proper call instruction for virtual or non-virtual invocations.
16143         (New::Emit): Implement.
16144         (New::Resolve): Implement.
16145         (MemberAccess:Resolve): Implement.
16146         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16147         to track instances.
16148         (FieldExpr::Resolve): Set type.
16149
16150         * support.cs: Handle empty arguments.
16151                 
16152         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16153         SimpleLookup): Auxiliary routines to help parse a qualifier
16154         identifier.  
16155
16156         Update qualifier_identifier rule.
16157
16158         * codegen.cs: Removed debugging messages.
16159
16160         * class.cs: Make this a global thing, this acts just as a "key" to
16161         objects that we might have around.
16162
16163         (Populate): Only initialize method_builders_to_methods once.
16164
16165         * expression.cs (PropertyExpr): Initialize type from the
16166         PropertyType. 
16167
16168         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16169         Resolve pattern.  Attempt to implicitly convert value to boolean.
16170         Emit code.
16171
16172         * expression.cs: Set the type for the int32/int32 argument case.
16173         (Binary::ResolveOperator): Set the return type to boolean for
16174         comparission operators
16175
16176         * typemanager.cs: Remove debugging print code.
16177
16178         (Invocation::Resolve): resolve type.
16179
16180         * class.cs: Allocate a MemberInfo of the correct size, as the code
16181         elsewhere depends on the test to reflect the correct contents.
16182
16183         (Method::) Keep track of parameters, due to System.Reflection holes
16184
16185         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16186         mapping here.
16187
16188         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16189         of the exact size and return that.
16190
16191         (Class::LookupMethodByBuilder): New function that maps
16192         MethodBuilders to its methods.  Required to locate the information
16193         on methods because System.Reflection bit us again.
16194
16195         * support.cs: New file, contains an interface ParameterData and
16196         two implementations: ReflectionParameters and InternalParameters
16197         used to access Parameter information.  We will need to grow this
16198         as required.
16199
16200         * expression.cs (Invocation::GetParameterData): implement a cache
16201         and a wrapper around the ParameterData creation for methods. 
16202         (Invocation::OverloadResolve): Use new code.
16203
16204 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16205
16206         * class.cs (TypeContainer::EmitField): Remove and move into 
16207         (Field::Define): here and modify accordingly.
16208         (Field.FieldBuilder): New member.
16209         (TypeContainer::Populate): Update accordingly.
16210         (TypeContainer::FindMembers): Implement.
16211
16212 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16213
16214         * statement.cs: (VariableInfo::VariableType): New field to be
16215         initialized with the full type once it is resolved. 
16216
16217 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16218
16219         * parameter.cs (GetParameterInfo): Use a type cache to compute
16220         things only once, and to reuse this information
16221
16222         * expression.cs (LocalVariableReference::Emit): Implement.
16223         (OpcodeCast::Emit): fix.
16224
16225         (ParameterReference::Resolve): Implement.
16226         (ParameterReference::Emit): Implement.
16227
16228         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16229         that are expressions need to stay as Expressions.
16230
16231         * typemanager.cs (CSharpName): Returns the C# name of a type if
16232         possible. 
16233
16234         * expression.cs (Expression::ConvertImplicit): New function that
16235         implements implicit type conversions.
16236
16237         (Expression::ImplicitReferenceConversion): Implements implicit
16238         reference conversions.
16239
16240         (EmptyCast): New type for transparent casts.
16241
16242         (OpcodeCast): New type for casts of types that are performed with
16243         a sequence of bytecodes.
16244
16245         (BoxedCast): New type used for casting value types into reference
16246         types.  Emits a box opcode.
16247
16248         (Binary::DoNumericPromotions): Implements numeric promotions of
16249         and computation of the Binary::Type.
16250
16251         (Binary::EmitBranchable): Optimization.
16252
16253         (Binary::Emit): Implement code emission for expressions.
16254
16255         * typemanager.cs (TypeManager): Added two new core types: sbyte
16256         and byte.
16257
16258 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16259
16260         * class.cs (TypeContainer::FindMembers): Method which does exactly
16261         what Type.FindMembers does, only we don't have to use reflection. No
16262         implementation yet.
16263
16264         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16265         typecontainer objects as we need to get at them.
16266         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16267
16268         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16269         typecontainer object.
16270
16271         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16272         of just a Report object.
16273
16274 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16275
16276         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16277         "remove_"
16278         (TypeContainer::Populate): Now define the delegates of the type too.
16279         (TypeContainer.Delegates): Property to access the list of delegates defined
16280         in the type.
16281
16282         * delegates.cs (Delegate::Define): Implement partially.
16283
16284         * modifiers.cs (TypeAttr): Handle more flags.
16285
16286 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16287
16288         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16289         and not <=
16290         (Operator::Define): Re-write logic to get types by using the LookupType method
16291         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16292         (Indexer::Define): Ditto.
16293         (Event::Define): Ditto.
16294         (Property::Define): Ditto.
16295
16296 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16297
16298         * class.cs (TypeContainer::Populate): Now define operators too. 
16299         (TypeContainer.Operators): New property to access the list of operators
16300         in a type.
16301         (Operator.OperatorMethodBuilder): New member to hold the method builder
16302         for the operator we are defining.
16303         (Operator::Define): Implement.
16304
16305 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16306
16307         * class.cs (Event::Define): Make the prefixes of the accessor methods
16308         addOn_ and removeOn_ 
16309
16310         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16311         of the location being passed in too. Ideally, this should go later since all
16312         error reporting should be done through the Report object.
16313
16314         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16315         (Populate): Iterate thru the indexers we have and define them too.
16316         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16317         for the get and set accessors.
16318         (Indexer::Define): Implement.
16319
16320 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16321
16322         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16323         my previous implementation, did not work.
16324
16325         * typemanager.cs: Add a couple of missing types (the longs).
16326
16327         * literal.cs: Use TypeManager.bool_type instead of getting it.
16328
16329         * expression.cs (EventExpr): New kind of expressions.
16330         (Expressio::ExprClassFromMemberInfo): finish
16331
16332 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
16333
16334         * assign.cs: Emit stores to static fields differently.
16335
16336 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16337
16338         * Merge in changes and adjust code to tackle conflicts. Backed out my
16339         code in Assign::Resolve ;-) 
16340
16341 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16342
16343         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
16344         instead Report.Error and also pass in the location.
16345         (CSharpParser::Lexer): New readonly property to return the reference
16346         to the Tokenizer object.
16347         (declare_local_variables): Use Report.Error with location instead of plain 
16348         old error.
16349         (CheckDef): Ditto.
16350
16351         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16352         (Operator.CheckBinaryOperator): Ditto.
16353
16354         * cs-parser.jay (operator_declarator): Update accordingly.
16355
16356         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16357         (CheckBinaryOperator): Same here.
16358
16359         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16360         on the name without any prefixes of namespace names etc. This is because we
16361         already might have something already fully qualified like 
16362         'System.Console.WriteLine'
16363
16364         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16365
16366 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16367
16368         * cs-tokenizer.cs (location): Return a string which also contains
16369         the file name.
16370
16371         * expression.cs (ElementAccess): New class for expressions of the
16372         type 'element access.'
16373         (BaseAccess): New class for expressions of the type 'base access.'
16374         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16375         respectively.
16376
16377         * cs-parser.jay (element_access): Implement action.
16378         (base_access): Implement actions.
16379         (checked_expression, unchecked_expression): Implement.
16380
16381         * cs-parser.jay (local_variable_type): Correct and implement.
16382         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16383
16384         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16385
16386         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16387         name and the specifiers.
16388
16389         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16390
16391         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16392         making them all public ;-)
16393
16394         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16395         class anyways.
16396
16397 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16398
16399         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16400         PropertyExprs.
16401         (FieldExpr, PropertyExprs): New resolved expressions.
16402         (SimpleName::MemberStaticCheck): Perform static checks for access
16403         to non-static fields on static methods. Maybe this should be
16404         generalized for MemberAccesses. 
16405         (SimpleName::ResolveSimpleName): More work on simple name
16406         resolution. 
16407
16408         * cs-parser.jay (primary_expression/qualified_identifier): track
16409         the parameter index.
16410
16411         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16412         (EmitContext::EmitBoolExpression): Chain to expression generation
16413         instead of temporary hack.
16414         (::EmitStatementExpression): Put generic expression code generation.
16415
16416         * assign.cs (Assign::Emit): Implement variable assignments to
16417         local variables, parameters and fields.
16418
16419 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16420
16421         * statement.cs (Block::GetVariableInfo): New method, returns the
16422         VariableInfo for a variable name in a block.
16423         (Block::GetVariableType): Implement in terms of GetVariableInfo
16424
16425         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16426         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16427
16428 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16429
16430         * cs-parser.jay (operator_declaration): Continue on my quest : update
16431         to take attributes argument.
16432         (event_declaration): Ditto.
16433         (enum_declaration): Ditto.
16434         (indexer_declaration): Ditto.
16435
16436         * class.cs (Operator::Operator): Update constructor accordingly.
16437         (Event::Event): Ditto.
16438
16439         * delegate.cs (Delegate::Delegate): Same here.
16440
16441         * enum.cs (Enum::Enum): Same here.
16442
16443 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16444
16445         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16446
16447         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16448
16449         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16450         being passed around as an arraylist.
16451         (Attributes::AddAttribute): Method to add attribute sections.
16452
16453         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16454         (struct_declaration): Update accordingly.
16455         (constant_declaration): Update.
16456         (field_declaration): Update.
16457         (method_header): Update.
16458         (fixed_parameter): Update.
16459         (parameter_array): Ditto.
16460         (property_declaration): Ditto.
16461         (destructor_declaration): Ditto.
16462
16463         * class.cs (Struct::Struct): Update constructors accordingly.
16464         (Class::Class): Ditto.
16465         (Field::Field): Ditto.
16466         (Method::Method): Ditto.
16467         (Property::Property): Ditto.
16468         (TypeContainer::OptAttribute): update property's return type.
16469
16470         * interface.cs (Interface.opt_attributes): New member.
16471         (Interface::Interface): Update to take the extra Attributes argument.
16472
16473         * parameter.cs (Parameter::Parameter): Ditto.
16474
16475         * constant.cs (Constant::Constant): Ditto.
16476
16477         * interface.cs (InterfaceMemberBase): New OptAttributes field.
16478         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
16479         the attributes as a parameter.
16480         (InterfaceProperty): Update constructor call.
16481         (InterfaceEvent): Ditto.
16482         (InterfaceMethod): Ditto.
16483         (InterfaceIndexer): Ditto.
16484
16485         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
16486         pass the attributes too.
16487         (interface_event_declaration): Ditto.
16488         (interface_property_declaration): Ditto.
16489         (interface_method_declaration): Ditto.
16490         (interface_declaration): Ditto.
16491
16492 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
16493
16494         * class.cs (Method::Define): Track the "static Main" definition to
16495         create an entry point. 
16496
16497         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
16498         EntryPoint if we find it. 
16499
16500         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
16501         (EmitContext::ig): Make this variable public.
16502
16503         * driver.cs: Make the default output file be the first file name
16504         with the .exe extension.  
16505
16506         Detect empty compilations
16507
16508         Handle various kinds of output targets.  Handle --target and
16509         rename -t to --dumper.
16510
16511         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
16512         methods inherited from Expression return now an Expression.  This
16513         will is used during the tree rewriting as we resolve them during
16514         semantic analysis.
16515
16516         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
16517         the spec.  Missing entirely is the information about
16518         accessability of elements of it.
16519
16520         (Expression::ExprClassFromMemberInfo): New constructor for
16521         Expressions that creates a fully initialized Expression based on
16522         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
16523         a Type.
16524
16525         (Invocation::Resolve): Begin implementing resolution of invocations.
16526
16527         * literal.cs (StringLiteral):  Implement Emit.
16528
16529 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16530
16531         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
16532         member.
16533
16534 2001-09-04  Ravi Pratap  <ravi@ximian.com>
16535
16536         * cs-parser.jay (attribute_arguments): Implement actions.
16537         (attribute): Fix bug in production. Implement action.
16538         (attribute_list): Implement.
16539         (attribute_target): Implement.
16540         (attribute_target_specifier, opt_target_specifier): Implement
16541         (CheckAttributeTarget): New method to check if the attribute target
16542         is valid.
16543         (attribute_section): Implement.
16544         (opt_attributes): Implement.
16545
16546         * attribute.cs : New file to handle attributes.
16547         (Attribute): Class to hold attribute info.
16548
16549         * cs-parser.jay (opt_attribute_target_specifier): Remove production
16550         (attribute_section): Modify production to use 2 different rules to 
16551         achieve the same thing. 1 s/r conflict down !
16552         Clean out commented, useless, non-reducing dimension_separator rules.
16553
16554         * class.cs (TypeContainer.attributes): New member to hold list
16555         of attributes for a type.
16556         (Struct::Struct): Modify to take one more argument, the attribute list.
16557         (Class::Class): Ditto.
16558         (Field::Field): Ditto.
16559         (Method::Method): Ditto.
16560         (Property::Property): Ditto.
16561
16562         * cs-parser.jay (struct_declaration): Update constructor call to
16563         pass in the attributes too.
16564         (class_declaration): Ditto.
16565         (constant_declaration): Ditto.
16566         (field_declaration): Ditto.
16567         (method_header): Ditto.
16568         (fixed_parameter): Ditto.
16569         (parameter_array): Ditto.
16570         (property_declaration): Ditto.
16571
16572         * constant.cs (Constant::Constant): Update constructor similarly.
16573         Use System.Collections.
16574
16575         * parameter.cs (Parameter::Parameter): Update as above.
16576
16577 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16578
16579         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
16580         (TypeContainer.delegates): New member to hold list of delegates.
16581
16582         * cs-parser.jay (delegate_declaration): Implement the action correctly 
16583         this time as I seem to be on crack ;-)
16584
16585 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
16586
16587         * rootcontext.cs (RootContext::IsNamespace): new function, used to
16588         tell whether an identifier represents a namespace.
16589
16590         * expression.cs (NamespaceExpr): A namespace expression, used only
16591         temporarly during expression resolution.
16592         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
16593         utility functions to resolve names on expressions.
16594
16595 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
16596
16597         * codegen.cs: Add hook for StatementExpressions. 
16598
16599         * class.cs: Fix inverted test for static flag in methods.
16600
16601 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16602
16603         * class.cs (Operator::CheckUnaryOperator): Correct error number used
16604         to make it coincide with MS' number.
16605         (Operator::CheckBinaryOperator): Ditto.
16606
16607         * ../errors/errors.txt : Remove error numbers added earlier.
16608
16609         * ../errors/cs1019.cs : Test case for error # 1019
16610
16611         * ../errros/cs1020.cs : Test case for error # 1020
16612
16613         * cs-parser.jay : Clean out commented cruft.
16614         (dimension_separators, dimension_separator): Comment out. Ostensibly not
16615         used anywhere - non-reducing rule.
16616         (namespace_declarations): Non-reducing rule - comment out.
16617
16618         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
16619         with TypeContainer::AddEnum.
16620
16621         * delegate.cs : New file for delegate handling classes.
16622         (Delegate): Class for declaring delegates.
16623
16624         * makefile : Update.
16625
16626         * cs-parser.jay (delegate_declaration): Implement.
16627
16628 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
16629
16630         * class.cs (Event::Define): Implement.
16631         (Event.EventBuilder): New member.
16632
16633         * class.cs (TypeContainer::Populate): Update to define all enums and events
16634         we have.
16635         (Events): New property for the events arraylist we hold. Shouldn't we move to using
16636         readonly fields for all these cases ?
16637
16638 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16639
16640         * class.cs (Property): Revamp to use the convention of making fields readonly.
16641         Accordingly modify code elsewhere.
16642
16643         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
16644         the Define method of the Property class.
16645
16646         * class.cs : Clean up applied patch and update references to variables etc. Fix 
16647         trivial bug.
16648         (TypeContainer::Populate): Update to define all the properties we have. Also
16649         define all enumerations.
16650
16651         * enum.cs (Define): Implement.
16652
16653 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16654
16655         * cs-parser.jay (overloadable_operator): The semantic value is an
16656         enum of the Operator class.
16657         (operator_declarator): Implement actions.
16658         (operator_declaration): Implement.
16659
16660         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
16661         validity of definitions.
16662         (Operator::CheckBinaryOperator): Static method to check for binary operators
16663         (TypeContainer::AddOperator): New method to add an operator to a type.
16664
16665         * cs-parser.jay (indexer_declaration): Added line to actually call the
16666         AddIndexer method so it gets added ;-)
16667
16668         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
16669         already taken care of by the MS compiler ?  
16670
16671 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16672
16673         * class.cs (Operator): New class for operator declarations.
16674         (Operator::OpType): Enum for the various operators.
16675
16676 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16677
16678         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
16679         ostensibly handle this in semantic analysis.
16680
16681         * cs-parser.jay (general_catch_clause): Comment out
16682         (specific_catch_clauses, specific_catch_clause): Ditto.
16683         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
16684         (catch_args, opt_catch_args): New productions.
16685         (catch_clause): Rewrite to use the new productions above
16686         (catch_clauses): Modify accordingly.
16687         (opt_catch_clauses): New production to use in try_statement
16688         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
16689         and re-write the code in the actions to extract the specific and
16690         general catch clauses by being a little smart ;-)
16691
16692         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
16693         Hooray, try and catch statements parse fine !
16694
16695 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16696
16697         * statement.cs (Block::GetVariableType): Fix logic to extract the type
16698         string from the hashtable of variables.
16699
16700         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
16701         I end up making that mistake ;-)
16702         (catch_clauses): Fixed gross error which made Key and Value of the 
16703         DictionaryEntry the same : $1 !!
16704
16705 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16706
16707         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
16708
16709         * cs-parser.jay (event_declaration): Correct to remove the semicolon
16710         when the add and remove accessors are specified. 
16711
16712 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16713
16714         * cs-parser.jay (IndexerDeclaration): New helper class to hold
16715         information about indexer_declarator.
16716         (indexer_declarator): Implement actions.
16717         (parsing_indexer): New local boolean used to keep track of whether
16718         we are parsing indexers or properties. This is necessary because 
16719         implicit_parameters come into picture even for the get accessor in the 
16720         case of an indexer.
16721         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
16722
16723         * class.cs (Indexer): New class for indexer declarations.
16724         (TypeContainer::AddIndexer): New method to add an indexer to a type.
16725         (TypeContainer::indexers): New member to hold list of indexers for the
16726         type.
16727
16728 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16729
16730         * cs-parser.jay (add_accessor_declaration): Implement action.
16731         (remove_accessor_declaration): Implement action.
16732         (event_accessors_declaration): Implement
16733         (variable_declarators): swap statements for first rule - trivial.
16734
16735         * class.cs (Event): New class to hold information about event
16736         declarations.
16737         (TypeContainer::AddEvent): New method to add an event to a type
16738         (TypeContainer::events): New member to hold list of events.
16739
16740         * cs-parser.jay (event_declaration): Implement actions.
16741
16742 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16743
16744         * cs-parser.jay (dim_separators): Implement. Make it a string
16745         concatenating all the commas together, just as they appear.
16746         (opt_dim_separators): Modify accordingly
16747         (rank_specifiers): Update accordingly. Basically do the same
16748         thing - instead, collect the brackets here.
16749         (opt_rank_sepcifiers): Modify accordingly.
16750         (array_type): Modify to actually return the complete type string
16751         instead of ignoring the rank_specifiers.
16752         (expression_list): Implement to collect the expressions
16753         (variable_initializer): Implement. We make it a list of expressions
16754         essentially so that we can handle the array_initializer case neatly too.
16755         (variable_initializer_list): Implement.
16756         (array_initializer): Make it a list of variable_initializers
16757         (opt_array_initializer): Modify accordingly.
16758
16759         * expression.cs (New::NType): Add enumeration to help us
16760         keep track of whether we have an object/delegate creation
16761         or an array creation.
16762         (New:NewType, New::Rank, New::Indices, New::Initializers): New
16763         members to hold data about array creation.
16764         (New:New): Modify to update NewType
16765         (New:New): New Overloaded contructor for the array creation
16766         case.
16767
16768         * cs-parser.jay (array_creation_expression): Implement to call
16769         the overloaded New constructor.
16770
16771 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
16772
16773         * class.cs (TypeContainer::Constructors): Return member
16774         constructors instead of returning null.
16775
16776 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
16777
16778         * typemanager.cs (InitCoreTypes): Initialize the various core
16779         types after we have populated the type manager with the user
16780         defined types (this distinction will be important later while
16781         compiling corlib.dll)
16782
16783         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
16784         on Expression Classification.  Now all expressions have a method
16785         `Resolve' and a method `Emit'.
16786
16787         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
16788         generation from working.     Also add some temporary debugging
16789         code. 
16790
16791 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
16792
16793         * codegen.cs: Lots of code generation pieces.  This is only the
16794         beginning, will continue tomorrow with more touches of polish.  We
16795         handle the fundamentals of if, while, do, for, return.  Others are
16796         trickier and I need to start working on invocations soon.
16797
16798         * gen-treedump.cs: Bug fix, use s.Increment here instead of
16799         s.InitStatement. 
16800
16801         * codegen.cs (EmitContext): New struct, used during code
16802         emission to keep a context.   Most of the code generation will be
16803         here. 
16804
16805         * cs-parser.jay: Add embedded blocks to the list of statements of
16806         this block.  So code generation proceeds in a top down fashion.
16807
16808 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
16809
16810         * statement.cs: Add support for multiple child blocks.
16811
16812 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
16813
16814         * codegen.cs (EmitCode): New function, will emit the code for a
16815         Block of code given a TypeContainer and its ILGenerator. 
16816
16817         * statement.cs (Block): Standard public readonly optimization.
16818         (Block::Block constructors): Link children. 
16819         (Block::Child): Child Linker.
16820         (Block::EmitVariables): Emits IL variable declarations.
16821
16822         * class.cs: Drop support for MethodGroups here, delay until
16823         Semantic Analysis.
16824         (Method::): Applied the same simplification that I did before, and
16825         move from Properties to public readonly fields.
16826         (Method::ParameterTypes): Returns the parameter types for the
16827         function, and implements a cache that will be useful later when I
16828         do error checking and the semantic analysis on the methods is
16829         performed.
16830         (Constructor::GetCallingConvention): Renamed from CallingConvetion
16831         and made a method, optional argument tells whether this is a class
16832         or a structure to apply the `has-this' bit.
16833         (Method::GetCallingConvention): Implement, returns the calling
16834         convention. 
16835         (Method::Define): Defines the type, a second pass is performed
16836         later to populate the methods.
16837
16838         (Constructor::ParameterTypes): implement a cache similar to the
16839         one on Method::ParameterTypes, useful later when we do semantic
16840         analysis. 
16841
16842         (TypeContainer::EmitMethod):  New method.  Emits methods.
16843
16844         * expression.cs: Removed MethodGroup class from here.
16845
16846         * parameter.cs (Parameters::GetCallingConvention): new method.
16847
16848 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
16849
16850         * class.cs (TypeContainer::Populate): Drop RootContext from the
16851         argument. 
16852
16853         (Constructor::CallingConvention): Returns the calling convention.
16854         (Constructor::ParameterTypes): Returns the constructor parameter
16855         types. 
16856
16857         (TypeContainer::AddConstructor): Keep track of default constructor
16858         and the default static constructor.
16859
16860         (Constructor::) Another class that starts using `public readonly'
16861         instead of properties. 
16862
16863         (Constructor::IsDefault): Whether this is a default constructor. 
16864
16865         (Field::) use readonly public fields instead of properties also.
16866
16867         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
16868         track of static constructors;  If none is used, turn on
16869         BeforeFieldInit in the TypeAttributes. 
16870
16871         * cs-parser.jay (opt_argument_list): now the return can be null
16872         for the cases where there are no arguments. 
16873
16874         (constructor_declarator): If there is no implicit `base' or
16875         `this', then invoke the default parent constructor. 
16876
16877         * modifiers.cs (MethodAttr): New static function maps a set of
16878         modifiers flags into a MethodAttributes enum
16879         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
16880         MethodAttr, TypeAttr to represent the various mappings where the
16881         modifiers are used.
16882         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
16883
16884 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
16885
16886         * parameter.cs (GetParameterInfo): Fix bug where there would be no
16887         method arguments.
16888
16889         * interface.cs (PopulateIndexer): Implemented the code generator
16890         for interface indexers.
16891
16892 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
16893
16894         * interface.cs (InterfaceMemberBase): Now we track the new status
16895         here.  
16896
16897         (PopulateProperty): Implement property population.  Woohoo!  Got
16898         Methods and Properties going today. 
16899
16900         Removed all the properties for interfaces, and replaced them with
16901         `public readonly' fields. 
16902
16903 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
16904
16905         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
16906         initialize their hashtables/arraylists only when they are needed
16907         instead of doing this always.
16908
16909         * parameter.cs: Handle refs and out parameters.
16910
16911         * cs-parser.jay: Use an ArrayList to construct the arguments
16912         instead of the ParameterCollection, and then cast that to a
16913         Parameter[] array.
16914
16915         * parameter.cs: Drop the use of ParameterCollection and use
16916         instead arrays of Parameters.
16917
16918         (GetParameterInfo): Use the Type, not the Name when resolving
16919         types. 
16920
16921 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
16922
16923         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
16924         and instead use public readonly fields.
16925
16926         * class.cs: Put back walking code for type containers.
16927
16928 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
16929
16930         * class.cs (MakeConstant): Code to define constants.
16931
16932         * rootcontext.cs (LookupType): New function.  Used to locate types 
16933
16934
16935 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
16936
16937         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
16938         this System.Reflection code is.  Kudos to Microsoft
16939
16940         * typemanager.cs: Implement a type cache and avoid loading all
16941         types at boot time.  Wrap in LookupType the internals.  This made
16942         the compiler so much faster.  Wow.  I rule!
16943
16944         * driver.cs: Make sure we always load mscorlib first (for
16945         debugging purposes, nothing really important).
16946
16947         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
16948         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
16949
16950         * rootcontext.cs: Lookup types on their namespace;  Lookup types
16951         on namespaces that have been imported using the `using' keyword.
16952
16953         * class.cs (TypeContainer::TypeAttr): Virtualize.
16954         (Class::TypeAttr): Return attributes suitable for this bad boy.
16955         (Struct::TypeAttr): ditto.
16956         Handle nested classes.
16957         (TypeContainer::) Remove all the type visiting code, it is now
16958         replaced with the rootcontext.cs code
16959
16960         * rootcontext.cs (GetClassBases): Added support for structs. 
16961
16962 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
16963
16964         * interface.cs, statement.cs, class.cs, parameter.cs,
16965         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
16966         Drop use of TypeRefs, and use strings instead.
16967
16968 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
16969
16970         * rootcontext.cs: 
16971
16972         * class.cs (Struct::Struct): set the SEALED flags after
16973         checking the modifiers.
16974         (TypeContainer::TypeAttr): new property, returns the
16975         TypeAttributes for a class.  
16976
16977         * cs-parser.jay (type_list): Oops, list production was creating a
16978         new list of base types.
16979
16980         * rootcontext.cs (StdLib): New property.
16981         (GetInterfaceTypeByName): returns an interface by type name, and
16982         encapsulates error handling here.
16983         (GetInterfaces): simplified.
16984         (ResolveTree): Encapsulated all the tree resolution here.
16985         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
16986         types. 
16987
16988         * driver.cs: Add support for --nostdlib, to avoid loading the
16989         default assemblies.
16990         (Main): Do not put tree resolution here. 
16991
16992         * rootcontext.cs: Beginning of the class resolution.
16993
16994 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
16995
16996         * rootcontext.cs: Provide better error reporting. 
16997
16998         * cs-parser.jay (interface_base): set our $$ to be interfaces.
16999
17000         * rootcontext.cs (CreateInterface): Handle the case where there
17001         are no parent interfaces.
17002
17003         (CloseTypes): Routine to flush types at the end.
17004         (CreateInterface): Track types.
17005         (GetInterfaces): Returns an array of Types from the list of
17006         defined interfaces.
17007
17008         * typemanager.c (AddUserType): Mechanism to track user types (puts
17009         the type on the global type hash, and allows us to close it at the
17010         end). 
17011
17012 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17013
17014         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17015         RecordInterface instead.
17016
17017         * cs-parser.jay: Updated to reflect changes above.
17018
17019         * decl.cs (Definition): Keep track of the TypeBuilder type that
17020         represents this type here.  Not sure we will use it in the long
17021         run, but wont hurt for now.
17022
17023         * driver.cs: Smaller changes to accomodate the new code.
17024
17025         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17026         when done. 
17027
17028         * rootcontext.cs (CreateInterface):  New method, used to create
17029         the System.TypeBuilder type for interfaces.
17030         (ResolveInterfaces): new entry point to resolve the interface
17031         hierarchy. 
17032         (CodeGen): Property, used to keep track of the code generator.
17033
17034 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17035
17036         * cs-parser.jay: Add a second production for delegate_declaration
17037         with `VOID'.
17038
17039         (enum_body): Put an opt_comma here instead of putting it on
17040         enum_body or enum_member_declarations so we can handle trailing
17041         commas on enumeration members.  Gets rid of a shift/reduce.
17042
17043         (type_list): Need a COMMA in the middle.
17044
17045         (indexer_declaration): Tell tokenizer to recognize get/set
17046
17047         * Remove old targets.
17048
17049         * Re-add the parser target.
17050
17051 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17052
17053         * cs-parser.jay: Add precendence rules for a number of operators
17054         ot reduce the number of shift/reduce conflicts in the grammar.
17055
17056 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17057
17058         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17059         and put it here.
17060
17061         Get rid of old crufty code.
17062
17063         * rootcontext.cs: Use this to keep track of the parsed
17064         representation and the defined types available to the program. 
17065
17066         * gen-treedump.cs: adjust for new convention.
17067
17068         * type.cs: Split out the type manager, and the assembly builder
17069         from here. 
17070
17071         * typemanager.cs: the type manager will live here now.
17072
17073         * cil-codegen.cs: And the code generator here. 
17074
17075 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17076
17077         * makefile: Fixed up for easy making.
17078
17079 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17080
17081         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17082         the 
17083
17084         (unary_expression): Expand pre_increment_expression and
17085         post_decrement_expression to reduce a shift/reduce.
17086
17087 2001-07-11  Simon Cozens
17088
17089         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17090
17091         Improve allow_keyword_as_indent name.
17092
17093 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17094
17095         * Adjustments for Beta2. 
17096
17097 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17098
17099         * decl.cs: Added `Define' abstract method.
17100         (InTransit): new property, used to catch recursive definitions. 
17101
17102         * interface.cs: Implement `Define'. 
17103
17104         * modifiers.cs: Map Modifiers.constants to
17105         System.Reflection.TypeAttribute flags.
17106
17107         * class.cs: Keep track of types and user-defined types.
17108         (BuilderInit): New method for creating an assembly
17109         (ResolveType): New function to launch the resolution process, only
17110         used by interfaces for now.
17111
17112         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17113         that are inserted into the name space. 
17114
17115 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17116
17117         * ARGH.  I have screwed up my tree so many times due to the use of
17118         rsync rather than using CVS.  Going to fix this at once. 
17119
17120         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17121         load types.
17122
17123 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17124
17125         * Experiment successful: Use System.Type rather that our own
17126         version of Type.  
17127
17128 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17129
17130         * cs-parser.jay: Removed nsAliases from here.
17131
17132         Use new namespaces, handle `using XXX;' 
17133
17134         * namespace.cs: Reimplemented namespace handling, use a recursive
17135         definition of the class.  Now we can keep track of using clauses
17136         and catch invalid using clauses.
17137
17138 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17139
17140         * gen-treedump.cs: Adapted for all the renaming.
17141
17142         * expression.cs (Expression): this class now has a Type property
17143         which returns an expression Type.
17144
17145         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17146         `Type', as this has a different meaning now in the base
17147
17148 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17149
17150         * interface.cs, class.cs: Removed from all the sources the
17151         references to signature computation, as we can not do method
17152         signature computation during the parsing time, as we are not
17153         trying to solve at that point distinguishing:
17154
17155         class X {
17156                 void a (Blah x) {}
17157                 void a (NS.Blah x) {}
17158         }
17159
17160         Which depending on the context might be valid or not, as we do not
17161         know if Blah is the same thing as NS.Blah at that point.
17162
17163         * Redid everything so the code uses TypeRefs now instead of
17164         Types.  TypeRefs are just temporary type placeholders, that need
17165         to be resolved.  They initially have a pointer to a string and the
17166         current scope in which they are used.  This is used later by the
17167         compiler to resolve the reference to an actual Type. 
17168
17169         * DeclSpace is no longer a CIR.Type, and neither are
17170         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17171         are all DeclSpaces, but no Types. 
17172
17173         * type.cs (TypeRefManager): This implements the TypeRef manager,
17174         which keeps track of all the types that need to be resolved after
17175         the parsing has finished. 
17176
17177 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17178
17179         * ARGH.  We are going to have to store `foreach' as a class rather
17180         than resolving it, as we need to verify error 1579 after name
17181         resolution.   *OR* we could keep a flag that says `This request to
17182         IEnumerator comes from a foreach statement' which we can then use
17183         to generate the error.
17184
17185 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17186
17187         * class.cs (TypeContainer.AddMethod): we now add methods to the
17188         MethodGroup instead of the method hashtable.  
17189
17190         * expression.cs: Add MethodGroup abstraction, which gets us one
17191         step closer to the specification in the way we handle method
17192         declarations.  
17193
17194         * cs-parser.jay (primary_expression): qualified_identifier now
17195         tried to match up an identifier to a local variable reference or
17196         to a parameter reference.
17197
17198         current_local_parameters is now a parser global variable that
17199         points to the current parameters for the block, used during name
17200         lookup.
17201
17202         (property_declaration): Now creates an implicit `value' argument to
17203         the set accessor.
17204
17205 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17206
17207         * parameter.cs: Do not use `param' arguments as part of the
17208         signature, per the spec.
17209
17210 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17211
17212         * decl.cs: Base class for classes, structs and interfaces.  This
17213         is the "Declaration Space" 
17214
17215         * cs-parser.jay: Use CheckDef for checking declaration errors
17216         instead of having one on each function.
17217
17218         * class.cs: Factor out some code for handling error handling in
17219         accordance to the "Declarations" section in the "Basic Concepts"
17220         chapter in the ECMA C# spec.
17221
17222         * interface.cs: Make all interface member classes derive from
17223         InterfaceMemberBase.
17224
17225 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17226
17227         * Many things: all interfaces are parsed and generated in
17228         gen-treedump.  Support for member variables, constructors,
17229         destructors, properties, constants is there.
17230
17231         Beginning of the IL backend, but very little done, just there for
17232         testing purposes. 
17233
17234 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17235
17236         * cs-parser.jay: Fix labeled statement.
17237
17238         * cs-tokenizer.cs (escape): Escape " and ' always.
17239         ref_line, ref_name: keep track of the line/filename as instructed
17240         by #line by the compiler.
17241         Parse #line.
17242
17243 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17244
17245         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17246         to match the values in System.CodeDOM.
17247
17248         Divid renamed to Divide.
17249
17250         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17251         statements. 
17252         (Statements.set): remove.
17253
17254         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17255         statements. 
17256
17257         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17258         falseStatements always have valid values. 
17259
17260         * cs-parser.jay: Use System.CodeDOM now.
17261