Reverted this.
[mono.git] / mcs / gmcs / ChangeLog
1 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
2
3         * expression.cs (Invocation.OverloadResolve): Flag error if we are
4         calling an unsafe method from a safe location.
5
6 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
7
8         Fix #69167
9         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
10
11 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
12
13         * namespace.cs (VerifyUsing): use GetPartialName instead of
14         ToString. 
15
16 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
17
18         * statement.cs (Return.Resolve): Fix regression in typo: if
19         `in_exc', we have to request a NeedReturnLabel, this was a typo
20         introduced in the anonymous method check-in.  Fixes #69131.
21
22         * Indexers were using the ShortName when defining themselves,
23         causing a regression in the compiler bootstrap when applying the
24         patch from 2004-11-02 (first part), now they use their full name
25         and the bug is gone.
26
27 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
28
29         * driver.cs: Strip the path from the names of embedded resources. Fixes
30         #68519.
31
32 2004-11-04  Raja R Harinath  <rharinath@novell.com>
33
34         Fix error message regression: cs0104-2.cs.
35         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
36         (AliasEntry.Resolve): Update.
37         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
38         'silent' flag.
39         (RootContext.LookupType): Update.
40
41 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
42
43         * cs-parser.jay: Add support for handling accessor modifiers
44         * class: Add support port accessor modifiers and error checking,
45         define PropertyMethod.Define as virtual (not abstract anymore)
46         * ecore.cs: Add checking for proeprties access with access modifiers
47         * iterators.cs: Modify Accessor constructor call based in the modified
48         constructor
49 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
50
51         * expression.cs (StringConcat): Handle being called twice,
52         as when we have a concat in a field init with more than two
53         ctors in the class
54
55 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
56
57         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
58         special case explicit implementations, we should always produce
59         the .property or .event declaration.
60         
61         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
62         since it will not return correct data if people use this
63         unresolved in the presence of using statements (see test-313).
64
65         * class.cs (MethodData.Define): If we are an explicit interface
66         implementation, set the method name to the full name of the
67         interface plus the name of the method.  
68
69         Notice that using the method.MethodName.GetFullName() does not
70         work, as it will only contain the name as declared on the source
71         file (it can be a shorthand in the presence of using statements)
72         and not the fully qualifed type name, for example:
73
74         using System;
75
76         class D : ICloneable {
77                 object ICloneable.Clone ()  {
78                 }
79         }
80
81         Would produce a method called `ICloneable.Clone' instead of
82         `System.ICloneable.Clone'.
83
84         * namespace.cs (Alias.Resolve): Use GetPartialName.
85         
86 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
87
88         * cs-parser.jay: Add error 1055 report.
89
90 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
91
92         * assign.cs (Assign.DoResolve): Only do the transform of
93         assignment into a New if the types are compatible, if not, fall
94         through and let the implicit code deal with the errors and with
95         the necessary conversions. 
96
97 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
98
99         * cs-parser.jay: Add error 1031 report.
100
101         * cs-tokenizer.cs: Add location for error 1038.
102
103 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
104
105         * cs-parser.jay: Add error 1016 report.
106
107 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
108
109         * cs-parser.jay: Add errors 1575,1611 report.
110
111 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
112
113         * cs-parser.jay: Add error 1001 report.
114
115 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
116
117         Fix #68850
118         * attribute.cs (GetMarshal): Add method argument for
119         caller identification.
120
121         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
122         agument for GetMarshal and RuntimeMissingSupport.
123
124 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
125
126         * attribute.cs (ExtractSecurityPermissionSet): Removed
127         TypeManager.code_access_permission_type.
128
129         * typemanager.cs: Removed TypeManager.code_access_permission_type.
130
131 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
132
133         * expression.cs (LocalVariableReference.DoResolveLValue): Check
134         for obsolete use of a variable here.   Fixes regression on errors
135         cs0619-25 and cs0619-26.
136
137 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
138
139         Fix #62358, implemented security attribute encoding.
140
141         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
142         Tests permitted SecurityAction for assembly or other types.
143         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
144         data from SecurityPermissionAttribute to PermisionSet class.
145
146         * class.cs (ApplyAttributeBuilder): Added special handling
147         for System.Security.Permissions.SecurityAttribute based types.
148
149         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
150         special handling for System.Security.Permissions.SecurityAttribute
151         based types.
152
153         * enum.cs (ApplyAttributeBuilder): Added special handling
154         for System.Security.Permissions.SecurityAttribute based types.
155
156         * parameter.cs (ApplyAttributeBuilder): Added special handling
157         for System.Security.Permissions.SecurityAttribute based types.
158
159         * rootcontext.cs: Next 2 core types.
160
161         * typemanager.cs (TypeManager.security_permission_attr_type):
162         Built in type for the SecurityPermission Attribute.
163         (code_access_permission_type): Build in type.
164
165 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
166
167         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
168         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
169         all of this information into
170         EmitContext.EmitCapturedVariableInstance.
171         
172         * codegen.cs (EmitCapturedVariableInstance): move here the
173         funcionality of emitting an ldarg.0 in the presence of a
174         remapping.   This centralizes the instance emit code.
175
176         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
177         then emit a load of this: it means that we have reached the
178         topmost ScopeInfo: the one that contains the pointer to the
179         instance of the class hosting the anonymous method.
180
181         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
182         captures to the topmost CaptureContext.
183
184 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
185
186         * expression.cs (LocalVariableReference): Move the knowledge about
187         the iterators into codegen's EmitCapturedVariableInstance.
188
189 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
190
191         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
192         all code paths return a value from an anonymous method (it is the
193         same as the 161 error, but for anonymous methods).
194
195 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
196
197         The introduction of anonymous methods in the compiler changed
198         various ways of doing things in the compiler.  The most
199         significant one is the hard split between the resolution phase
200         and the emission phases of the compiler.
201
202         For instance, routines that referenced local variables no
203         longer can safely create temporary variables during the
204         resolution phase: they must do so from the emission phase,
205         since the variable might have been "captured", hence access to
206         it can not be done with the local-variable operations from the runtime.
207         
208         * statement.cs 
209
210         (Block.Flags): New flag `IsTopLevel' to indicate that this block
211         is a toplevel block.
212
213         (ToplevelBlock): A new kind of Block, these are the blocks that
214         are created by the parser for all toplevel method bodies.  These
215         include methods, accessors and anonymous methods.
216
217         These contain some extra information not found in regular blocks:
218         A pointer to an optional CaptureContext (for tracking captured
219         local variables and parameters).  A pointer to the parent
220         ToplevelBlock.
221         
222         (Return.Resolve): Catch missmatches when returning a value from an
223         anonymous method (error 1662).
224         Invoke NeedReturnLabel from the Resolve phase instead of the emit
225         phase.
226
227         (Break.Resolve): ditto.
228
229         (SwitchLabel): instead of defining the labels during the
230         resolution phase, we now turned the public ILLabel and ILLabelCode
231         labels into methods called GetILLabelCode() and GetILLabel() that
232         only define the label during the Emit phase.
233
234         (GotoCase): Track the SwitchLabel instead of the computed label
235         (its contained therein).  Emit the code by using
236         SwitchLabel.GetILLabelCode ().
237
238         (LocalInfo.Flags.Captured): A new flag has been introduce to track
239         whether the Local has been captured or not.
240
241         (LocalInfo.IsCaptured): New property, used to tell whether the
242         local has been captured.
243         
244         * anonymous.cs: Vastly updated to contain the anonymous method
245         support.
246
247         The main classes here are: CaptureContext which tracks any
248         captured information for a toplevel block and ScopeInfo used to
249         track the activation frames for various local variables.   
250
251         Each toplevel block has an optional capture context associated
252         with it.  When a method contains an anonymous method both the
253         toplevel method and the anonymous method will create a capture
254         context.   When variables or parameters are captured, they are
255         recorded on the CaptureContext that owns them, for example:
256
257         void Demo () {
258              int a;
259              MyDelegate d = delegate {
260                  a = 1;
261              }
262         }
263
264         Here `a' will be recorded as captured on the toplevel
265         CapturedContext, the inner captured context will not have anything
266         (it will only have data if local variables or parameters from it
267         are captured in a nested anonymous method.
268
269         The ScopeInfo is used to track the activation frames for local
270         variables, for example:
271
272         for (int i = 0; i < 10; i++)
273                 for (int j = 0; j < 10; j++){
274                    MyDelegate d = delegate {
275                         call (i, j);
276                    }
277                 }
278
279         At runtime this captures a single captured variable `i', but it
280         captures 10 different versions of the variable `j'.  The variable
281         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
282         recorded on a child.  
283
284         The toplevel ScopeInfo will also track information like the `this'
285         pointer if instance variables were referenced (this is necessary
286         as the anonymous method lives inside a nested class in the host
287         type of the method). 
288
289         (AnonymousMethod): Expanded to track the Toplevel, implement
290         `AnonymousMethod.Compatible' to tell whether an anonymous method
291         can be converted to a target delegate type. 
292
293         The routine now also produces the anonymous method content
294
295         (AnonymousDelegate): A helper class that derives from
296         DelegateCreation, this is used to generate the code necessary to
297         produce the delegate for the anonymous method that was created. 
298
299         * assign.cs: API adjustments for new changes in
300         Convert.ImplicitStandardConversionExists.
301
302         * class.cs: Adjustments to cope with the fact that now toplevel
303         blocks are of type `ToplevelBlock'. 
304
305         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
306         insteda of standard blocks.
307
308         Flag errors if params arguments are passed to anonymous methods.
309
310         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
311         `CurrentAnonymousMethod' which points to the current Anonymous
312         Method.  The variable points to the AnonymousMethod class that
313         holds the code being compiled.  It is set in the new EmitContext
314         created for the anonymous method.
315
316         (EmitContext.Phase): Introduce a variable and an enumeration to
317         assist in enforcing some rules about when and where we are allowed
318         to invoke certain methods (EmitContext.NeedsReturnLabel is the
319         only one that enfonces this right now).
320
321         (EmitContext.HaveCaptureInfo): new helper method that returns
322         whether we have a CapturedContext initialized.
323
324         (EmitContext.CaptureVariable): New method used to register that a
325         LocalInfo must be flagged for capturing. 
326
327         (EmitContext.CapturedParameter): New method used to register that a
328         parameters must be flagged for capturing. 
329         
330         (EmitContext.CapturedField): New method used to register that a
331         field must be flagged for capturing. 
332
333         (EmitContext.HaveCapturedVariables,
334         EmitContext.HaveCapturedFields): Return whether there are captured
335         variables or fields. 
336
337         (EmitContext.EmitMethodHostInstance): This is used to emit the
338         instance for the anonymous method.  The instance might be null
339         (static methods), this (for anonymous methods that capture nothing
340         and happen to live side-by-side with the current method body) or a
341         more complicated expression if the method has a CaptureContext.
342
343         (EmitContext.EmitTopBlock): Routine that drives the emission of
344         code: it will first resolve the top block, then emit any metadata
345         and then emit the code.  The split is done so that we can extract
346         any anonymous methods and flag any captured variables/parameters.
347         
348         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
349         during this phase, the ILGenerator should not be used as labels
350         and local variables declared here might not be accessible to any
351         code that is part of an anonymous method.  
352
353         Exceptions to this include the temporary variables that are
354         created by some statements internally for holding temporary
355         variables. 
356         
357         (EmitContext.EmitMeta): New routine, in charge of emitting all the
358         metadata for a cb
359
360         (EmitContext.TemporaryReturn): This method is typically called
361         from the Emit phase, and its the only place where we allow the
362         ReturnLabel to be defined other than the EmitMeta.  The reason is
363         that otherwise we would have to duplicate a lot of logic in the
364         Resolve phases of various methods that today is on the Emit
365         phase. 
366
367         (EmitContext.NeedReturnLabel): This no longer creates the label,
368         as the ILGenerator is not valid during the resolve phase.
369
370         (EmitContext.EmitThis): Extended the knowledge in this class to
371         work in anonymous methods in addition to iterators. 
372
373         (EmitContext.EmitCapturedVariableInstance): This emits whatever
374         code is necessary on the stack to access the instance to a local
375         variable (the variable will be accessed as a field).
376
377         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
378         EmitContext.EmitAddressOfParameter): Routines to support
379         parameters (not completed at this point). 
380         
381         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
382         will also remove the parameters.
383
384         * convert.cs (Convert): Define a `ConstantEC' which points to a
385         null.  This is just to prefity some code that uses
386         ImplicitStandardConversion code and do not have an EmitContext
387         handy.
388
389         The idea is to flag explicitly that at that point in time, it is
390         known that the conversion will not trigger the delegate checking
391         code in implicit conversions (which requires a valid
392         EmitContext). 
393
394         Everywhere: pass new EmitContext parameter since
395         ImplicitStandardConversionExists now requires it to check for
396         anonymous method conversions. 
397
398         (Convert.ImplicitStandardConversionExists): If the type of an
399         expression is the anonymous_method_type, and the type is a
400         delegate, we invoke the AnonymousMethod.Compatible method to check
401         whether an implicit conversion is possible. 
402
403         (Convert.ImplicitConversionStandard): Only do implicit method
404         group conversions if the language level is not ISO_1.
405
406         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
407         MethodInfo for the Invoke method.  used by Delegate and
408         AnonymousDelegate.
409
410         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
411         method conversions if the target type is a delegate.
412
413         Removed extra debugging nops.
414
415         (LocalVariableReference): Turn the `local_info' into a public
416         field. 
417
418         Add `prepared' field, the same hack used for FieldExprs to cope
419         with composed assignments, as Local variables do not necessarily
420         operate purely on the stack as they used to: they can be captured
421         fields. 
422
423         Add `temp' for a temporary result, like fields.
424
425         Refactor DoResolve and DoResolveLValue into DoResolveBase.
426
427         It now copes with Local variables that are captured and emits the
428         proper instance variable to load it from a field in the captured
429         case. 
430
431         (ParameterReference.DoResolveBase): During the resolve phase,
432         capture parameters if we are in an anonymous method.
433
434         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
435         anonymous method, use the EmitContext helper routines to emit the
436         parameter reference.
437
438         * iterators.cs: Set RemapToProxy to true/false during the
439         EmitDispose class.
440
441         * parameters.cs (GetParameterByName): New helper method. 
442
443         * typemanager.cs (anonymous_method_type) a new type that
444         represents an anonyous method.  This is always an internal type,
445         used as a fencepost to test against the anonymous-methodness of an
446         expression. 
447         
448 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
449
450         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
451         561 report.
452         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
453
454 2004-11-10  Martin Baulig  <martin@ximian.com>
455
456         * expression.cs (Invocation.BetterFunction): If two methods have
457         equal parameter types, but only one of them is generic, the
458         non-generic one wins.
459         (New.DoResolve): Don't set `is_struct' to false if we're a generic
460         instance; just use `Type.IsValueType' to determine whether
461         something is a struct or not.
462         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
463         so we can be called multiple times.
464
465 2004-11-10  Martin Baulig  <martin@ximian.com>
466
467         * generic.cs (TypeParameter.DefineConstraints): New public method.
468         (TypeParameter.CheckAccessLevel): Override this and return true.
469         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
470         override ResolveType() anymore.
471         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
472
473 2004-11-10  Martin Baulig  <martin@ximian.com>
474
475         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
476         call DeclSpace.ResolveNestedType() on it.
477
478 2004-11-10  Martin Baulig  <martin@ximian.com>
479
480         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
481         non-null, call ParameterModifier() on it.
482
483 2004-11-10  Martin Baulig  <martin@ximian.com>
484
485         * iterators.cs
486         (Iterators): Added `current_type' and `this_type' fields.
487         (Iterators.DefineIterator): Create a new EmitContext and store it
488         in `ec'; compute `this_type'.
489
490 2004-11-10  Martin Baulig  <martin@ximian.com>
491
492         * typemanager.cs
493         (TypeManager.IsPrivateAccessible): New public method.
494         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
495
496 2004-11-10  Martin Baulig  <martin@ximian.com>
497
498         * class.cs (TypeContainer.DefineType): Call
499         TypeBuilder.DefineGenericParameters() before resolving the type
500         parameters.
501         (MethodData.parent_method): New protected field.
502         (MethodData..ctor): Added `MethodInfo parent_method' argument.
503         (MethodData.Define): Compute `parent_method'.
504
505         * decl.cs
506         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
507         (MemberCore.GetClsCompliantAttributeValue): Likewise.
508         (DeclSpace.ec): New protected field; store the EmitContext here.
509         (DeclSpace.EmitContext): New public property.
510         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
511         (DeclSpace.ResolveNestedType): New public method.
512         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
513         (DeclSpace.NestedAccessible): Added `Type tb' argument.
514         (DeclSpace.FamilyAccessible): Likewise.
515         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
516         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
517         EmitContext.
518
519         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
520         field.
521
522         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
523         (Enum.Emit): Don't create a new EmitContext.
524
525 2004-10-18  Martin Baulig  <martin@ximian.com>
526
527         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
528         `Type' directly, but call ResolveType() on it.
529         (Catch.Resolve): Likewise.
530         (Foreach.Resolve): Likewise.
531
532 2004-10-18  Martin Baulig  <martin@ximian.com>
533
534         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
535         `Type' directly, but call ResolveType() on it.
536         (Probe.DoResolve): Likewise.
537         (ArrayCreation.LookupType): Likewise.
538         (TypeOf.DoResolve): Likewise.
539         (SizeOf.DoResolve): Likewise.
540
541 2004-10-18  Raja R Harinath  <rharinath@novell.com>
542
543         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
544         the ResolveType.
545
546 2004-10-17  John Luke  <john.luke@gmail.com>
547
548         * class.cs (Operator.GetSignatureForError): use CSharpName
549
550         * parameter.cs (Parameter.GetSignatureForError): Returns
551         correct name even if was not defined.
552
553 2004-10-13  Raja R Harinath  <rharinath@novell.com>
554
555         Fix #65816.
556         * class.cs (TypeContainer.EmitContext): New property.
557         (DefineNestedTypes): Create an emitcontext for each part.
558         (MethodCore.DoDefineParameters): Use container's emitcontext.
559         Pass type array to InternalParameters.
560         (MemberBase.DoDefine): Use container's emitcontext.
561         (FieldMember.Define): Likewise.
562         (Event.Define): Likewise.
563         (SetMethod.GetParameterInfo): Change argument to EmitContext.
564         Pass type array to InternalParameters.
565         (SetIndexerMethod.GetParameterInfo): Likewise.
566         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
567         * delegate.cs (Define): Pass emitcontext to
568         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
569         array to InternalParameters.
570         * expression.cs (ParameterReference.DoResolveBase): Pass
571         emitcontext to GetParameterInfo.
572         (ComposedCast.DoResolveAsTypeStep): Remove check on
573         ec.ResolvingTypeTree.
574         * parameter.cs (Parameter.Resolve): Change argument to
575         EmitContext.  Use ResolveAsTypeTerminal.
576         (Parameter.GetSignature): Change argument to EmitContext.
577         (Parameters.ComputeSignature): Likewise.
578         (Parameters.ComputeParameterTypes): Likewise.
579         (Parameters.GetParameterInfo): Likewise.
580         (Parameters.ComputeAndDefineParameterTypes): Likewise.
581         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
582         * support.cs (InternalParameters..ctor): Remove variant that takes
583         a DeclSpace.
584         * typemanager.cs (system_intptr_expr): New.
585         (InitExpressionTypes): Initialize it.
586
587 2004-10-12  Chris Toshok  <toshok@ximian.com>
588
589         * cs-parser.jay: fix location for try_statement and catch_clause.
590
591 2004-10-18  Martin Baulig  <martin@ximian.com>
592
593         * class.cs (FieldMember.Define): Don't access the TypeExpr's
594         `Type' directly, but call ResolveType() on it.
595         (MemberBase.DoDefine): Likewise.
596
597         * expression.cs (New.DoResolve): Don't access the TypeExpr's
598         `Type' directly, but call ResolveType() on it.
599         (ComposedCast.DoResolveAsTypeStep): Likewise.
600
601         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
602         `Type' directly, but call ResolveType() on it.
603
604 2004-10-17  John Luke  <john.luke@gmail.com>
605
606         * class.cs (Operator.GetSignatureForError): use CSharpName
607
608         * parameter.cs (Parameter.GetSignatureForError): Returns
609         correct name even if was not defined.
610
611 2004-10-13  Raja R Harinath  <rharinath@novell.com>
612
613         Fix #65816.
614         * class.cs (TypeContainer.EmitContext): New property.
615         (DefineNestedTypes): Create an emitcontext for each part.
616         (MethodCore.DoDefineParameters): Use container's emitcontext.
617         Pass type array to InternalParameters.
618         (MemberBase.DoDefine): Use container's emitcontext.
619         (FieldMember.Define): Likewise.
620         (Event.Define): Likewise.
621         (SetMethod.GetParameterInfo): Change argument to EmitContext.
622         Pass type array to InternalParameters.
623         (SetIndexerMethod.GetParameterInfo): Likewise.
624         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
625         * delegate.cs (Define): Pass emitcontext to
626         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
627         array to InternalParameters.
628         * expression.cs (ParameterReference.DoResolveBase): Pass
629         emitcontext to GetParameterInfo.
630         (ComposedCast.DoResolveAsTypeStep): Remove check on
631         ec.ResolvingTypeTree.
632         * parameter.cs (Parameter.Resolve): Change argument to
633         EmitContext.  Use ResolveAsTypeTerminal.
634         (Parameter.GetSignature): Change argument to EmitContext.
635         (Parameters.ComputeSignature): Likewise.
636         (Parameters.ComputeParameterTypes): Likewise.
637         (Parameters.GetParameterInfo): Likewise.
638         (Parameters.ComputeAndDefineParameterTypes): Likewise.
639         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
640         * support.cs (InternalParameters..ctor): Remove variant that takes
641         a DeclSpace.
642         * typemanager.cs (system_intptr_expr): New.
643         (InitExpressionTypes): Initialize it.
644
645 2004-10-12  Chris Toshok  <toshok@ximian.com>
646
647         * cs-parser.jay: fix location for try_statement and catch_clause.
648
649 2004-10-07  Raja R Harinath  <rharinath@novell.com>
650
651         More DeclSpace.ResolveType avoidance.
652         * decl.cs (MemberCore.InUnsafe): New property.
653         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
654         with newly created EmitContext.
655         (FieldMember.Define): Likewise.
656         * delegate.cs (Delegate.Define): Likewise.
657         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
658         only if normal name-lookup fails.
659         (TypeExpr.DoResolve): Enable error-checking.
660         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
661         (SizeOf.DoResolve): Likewise.
662         (ComposedCast.DoResolveAsTypeStep): Likewise.
663         (StackAlloc.DoResolve): Likewise.
664         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
665         (Block.Unsafe): New property.
666         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
667         (Unsafe): Set 'unsafe' flag of contained block.
668         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
669         (Fixed.Resolve): Likewise.
670         (Catch.Resolve): Likewise.
671         (Using.ResolveLocalVariableDecls): Likewise.
672         (Foreach.Resolve): Likewise.
673
674 2004-10-05  John Luke <john.luke@gmail.com>
675
676         * cs-parser.jay: add location to error CS0175
677
678 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
679
680         * ecore.cs (Expression.Constantity): Add support for turning null
681         into a constant.
682
683         * const.cs (Const.Define): Allow constants to be reference types
684         as long as the value is Null.
685
686 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
687
688         * namespace.cs (NamespaceEntry.Using): No matter which warning
689         level is set, check if this namespace name has already been added.
690
691 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
692
693         * expression.cs: reftype [!=]= null should always use br[true,false].
694         # 67410
695
696 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
697
698         Fix #67108
699         * attribute.cs: Enum conversion moved to 
700         GetAttributeArgumentExpression to be applied to the all
701         expressions.
702
703 2004-10-01  Raja R Harinath  <rharinath@novell.com>
704
705         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
706         * class.c (TypeContainer.DefineType): Flag error if
707         base types aren't accessible due to access permissions.
708         * decl.cs (DeclSpace.ResolveType): Move logic to
709         Expression.ResolveAsTypeTerminal.
710         (DeclSpace.ResolveTypeExpr): Thin layer over
711         Expression.ResolveAsTypeTerminal.
712         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
713         Refactor code into NestedAccess.  Use it.
714         (DeclSpace.NestedAccess): New.
715         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
716         argument to silence errors.  Check access permissions.
717         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
718         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
719         (Cast.DoResolve): Likewise.
720         (New.DoResolve): Likewise.
721         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
722         (TypeOf.DoResolve): Likewise.
723
724         * expression.cs (Invocation.BetterConversion): Return the Type of
725         the better conversion.  Implement section 14.4.2.3 more faithfully.
726         (Invocation.BetterFunction): Make boolean.  Make correspondence to
727         section 14.4.2.2 explicit.
728         (Invocation.OverloadResolve): Update.
729         (Invocation): Remove is_base field.
730         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
731         (Invocation.Emit): Likewise.
732
733 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
734
735         * cs-parser.jay: Reverted 642 warning fix.
736
737 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
738
739         Fix bug #66615
740         * decl.cs (FindMemberWithSameName): Indexer can have more than
741         1 argument.
742
743 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
744
745         * expression.cs (LocalVariableReference.DoResolveLValue):
746         Do not report warning 219 for out values.
747         (EmptyExpression.Null): New member to avoid extra allocations.
748
749 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
750
751         * cs-parser.jay: Fix wrong warning 642 report.
752
753         * cs-tokenizer.cs (CheckNextToken): New helper;
754         Inspect next character if is same as expected.
755
756 2004-09-23  Martin Baulig  <martin@ximian.com>
757
758         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
759         (Convert.ImplicitReferenceConversionExists): Likewise.
760
761 2004-11-09  Raja R Harinath  <rharinath@novell.com>
762
763         * Makefile (DISTFILES): Comment out a few missing files.
764
765 2004-10-29  Raja R Harinath  <rharinath@novell.com>
766
767         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
768         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
769         (gmcs.exe): Invoke bootstrap-libs.
770         (clean-local): Clean the net_2_0_bootstrap profile too.
771         (PROGRAM_INSTALL_DIR): New.
772         (install-local): Use it.
773
774 2004-10-13  Martin Baulig  <martin@ximian.com>
775
776         * generic.cs (TypeManager.InflatedConstraints): New nested class.
777         (TypeParameter.DefineType): If we're a method type parameter and
778         that method is overriding something, "inflate" its constraints.
779
780 2004-10-12  Martin Baulig  <martin@ximian.com>
781
782         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
783         and have type arguments, create and resolve a ConstructedType.
784
785 2004-10-12  Martin Baulig  <martin@ximian.com>
786
787         * decl.cs (MemberCache.FindMemberToOverride): Use
788         TypeManager.IsEqual() to compare the parameters and Type.Equals()
789         to compare the invocationType.
790
791         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
792         When comparing two type parameters, only do the signature-only
793         comparision for method type parameters.
794
795 2004-10-11  Martin Baulig  <martin@ximian.com>
796
797         * report.cs: Don't make --fatal abort on warnings, we have
798         -warnaserror for that.
799
800 2004-10-11  Martin Baulig  <martin@ximian.com>
801
802         * typemanager.cs
803         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
804         (TypeManager.IsEqual): Call ourself recursively instead of using
805         Type.IsEqual(). 
806
807 2004-10-11  Martin Baulig  <martin@ximian.com>
808
809         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
810         on our own type parameters, not on the ones we inherit from a containing
811         class.
812
813         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
814         the comparision.
815
816         * generic.cs (TypeParameter.Define): We may only be called once.
817
818         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
819         instead of TypeManager.IsEqual().
820
821 2004-09-28  Martin Baulig  <martin@ximian.com>
822
823         * generic.cs
824         (GenericConstraints.EffectiveBaseClass): New public property.
825         (TypeParameter.GenericConstraints): New public property.
826         (ConstructedType.CheckConstraints): Improved.
827
828         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
829         (Convert.TypeParameterConversion): New private method; use this in
830         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
831         for all conversions related to type parameters.
832
833 2004-09-24  Martin Baulig  <martin@ximian.com>
834
835         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
836         type parameter conversions for type parameters which are known to
837         be reference types.
838
839 2004-09-24  Martin Baulig  <martin@ximian.com>
840
841         * generic.cs (GenericConstraints): Added `IsReferenceType' and
842         `IsValueType' properties.
843
844         * support.cs (ReflectionConstraints): Use
845         Type.GetGenericParameterConstraints() instead of the old hack.
846
847 2004-09-24  Martin Baulig  <martin@ximian.com>
848
849         * generic.cs (GenericConstraints): Moved here and made it an
850         abstract class.
851
852         * support.cs (GenericConstraints): Moved to generic.cs.
853
854 2004-09-24  Martin Baulig  <martin@ximian.com>
855
856         * support.cs
857         (ReflectionConstraints): Un-nested this class and made it public.
858
859         * typemanager.cs
860         (TypeManager.GetTypeParameterConstraints): New public method.
861         (TypeManager.HasConstructorConstraint): Use the attributes.
862
863 2004-09-24  Martin Baulig  <martin@ximian.com>
864
865         * support.cs (GenericConstraints): Replaced `HasConstructor',
866         `IsReferenceType' and `IsValueType' with `Attributes'.
867         (ReflectionParameters.ReflectionConstraints): Removed the Create()
868         method and made the .ctor public.
869
870         * generic.cs (Constraints.Attributes): New public property.
871         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
872         `IsReferenceType' -> `HasReferenceTypeConstraint' and
873         `IsValueType' -> `HasValueTypeConstraint'.
874
875 2004-09-23  Martin Baulig  <martin@ximian.com>
876
877         * generic.cs (Constraints): Reflect latest runtime changes.
878
879 2004-09-23  Martin Baulig  <martin@ximian.com>
880
881         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
882         (Convert.ImplicitReferenceConversionExists): Likewise.
883
884 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
885
886         * class.cs (Operator.Define): Add error 448 and 559 report.
887         
888 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
889
890         * class.cs (MemberBase.IsTypePermitted): New protected
891         method for checking error CS0610.
892
893 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
894
895         * class.cs (TypeContainer.HasExplicitLayout): New property
896         Returns whether container has StructLayout attribute set Explicit.
897         (FieldMember): New abstract class for consts and fields.
898         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
899         (Field): Reuse FieldMember.
900
901         * const.cs (Const): Reuse FieldMember.
902
903         * rootcontext.cs: EmitConstants call moved to class.
904
905 2004-09-22  Martin Baulig  <martin@ximian.com>
906
907         Marek and me just fixed one of our oldest bugs: #28562 :-)
908
909         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
910
911         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
912         we're an EnumConstant, just return that.
913         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
914         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
915         to get the value which'll actually be written into the attribute.
916         However, we have to use GetValue() to access the attribute's value
917         in the compiler.        
918
919 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
920
921         * constant.cs (Constant.IsNegative): New abstract property
922         IsNegative.
923
924         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
925         (StackAlloc.DoResolve): Reused IsNegative.
926
927 2004-09-22  Martin Baulig  <martin@ximian.com>
928
929         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
930         public method; like LookupTypeContainer, but also works for
931         generic instances.
932
933         * report.cs (Report.SymbolRelatedToPreviousError): Use
934         TypeManager.LookupGenericTypeContainer().       
935
936 2004-09-22  Martin Baulig  <martin@ximian.com>
937
938         Thanks to Peter Sestoft for this bug report.
939
940         * expression.cs (Conditional): If both the `trueExpr' and the
941         `falseExpr' is a NullLiteral, return a NullLiteral.
942
943 2004-09-22  Martin Baulig  <martin@ximian.com>
944
945         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
946         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
947         for the "get_Current" call.
948
949 2004-09-21  Martin Baulig  <martin@ximian.com>
950
951         * convert.cs (Convert.ImplicitReferenceConversion): When
952         converting to an interface type, first check whether we're
953         converting from a reference type.
954
955 2004-09-14  Martin Baulig  <martin@ximian.com>
956
957         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
958
959 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
960
961         Fixed bug #61902
962         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
963         called and is obsolete then this member suppress message
964         when call is inside next [Obsolete] method or type.
965
966         * expression.cs: Use TestObsoleteMethodUsage member.
967
968 2004-09-14  Martin Baulig  <martin@ximian.com>
969
970         * genericparser.cs: Removed.
971
972 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
973
974         * class.cs (MethodCore.CheckBase): Fix bug #65757.
975
976 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
977
978         * attribute.cs (Attribute.Resolve): Add error 653 report.
979
980         * class.cs (Class.ApplyAttributeBuilder): Add error 641
981         report.
982         (Method.ApplyAttributeBuilder): Add error 685 report.
983         (Operator.Define): Add error 564 report.
984
985         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
986
987         * expression.cs (Invocation.DoResolve): Add error
988         245 and 250 report.
989
990         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
991         error 674 report.
992
993 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
994
995         * class.cs (ConstructorInitializer.Resolve):
996         Wrong error number (515->516).
997
998 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
999
1000         * class.cs (Indexer.Define): Add error 631 report.
1001
1002 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1003
1004         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1005
1006 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1007
1008         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1009
1010 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1011
1012         * cs-parser.jay: Added error CS0241 report.
1013
1014 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1015
1016         * cs-parser.jay (fixed_statement): Introduce a scope for the
1017         declaration in the 'fixed' statement.
1018
1019 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1020
1021         * cs-parser.jay: Added CS0230 error report.
1022
1023 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1024
1025         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1026
1027 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1028
1029         * expression.cs (Argument.Resolve): Added error CS0192 and
1030         CS0199 report.
1031
1032 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1033
1034         C# 2.0 #pragma warning feature
1035
1036         * cs-tokenizer.cs (PreProcessPragma): New method; 
1037         Handles #pragma directive.
1038
1039         * report.cs (WarningRegions): New class; Support
1040         class for #pragma warning directive. It tests whether
1041         warning is enabled for a given line.
1042
1043 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1044
1045         * const.cs: Add more descriptive error report, tahnks to
1046         Sebastien. 
1047
1048 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1049
1050         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1051
1052 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1053
1054         * expression.cs: Apply patch from Ben: Remove dead code from
1055         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1056         as that code just threw an exception anwyays.
1057
1058         * const.cs: Remove the call to the turnintoconstant, for details
1059         see bug: #63144
1060         
1061         * literal.cs: The type of the null-literal is the null type;  So
1062         we use a placeholder type (literal.cs:System.Null, defined here)
1063         for it.
1064
1065         * expression.cs (Conditional.DoResolve): Remove some old code that
1066         is no longer needed, conversions have been fixed.
1067
1068         (ArrayCreationExpression.DoResolve): Return false if we fail to
1069         resolve the inner expression.
1070
1071 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1072
1073         Fix test-290.cs.
1074         * cs-parser.jay (delegate_declaration): Record a delegate
1075         declaration as a type declaration.
1076         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1077
1078 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1079
1080         * parameter.cs: Do not crash if the type can not be resolved. 
1081
1082         * expression.cs: Report errors with unsafe pointers, fixes #64896
1083
1084 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1085
1086         * expression.cs: Pointer arith always needs to do a conv.i
1087         if the operand is a long. fix 65320
1088
1089 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1090
1091         Fixed cs0619-37.cs, cs0619-38.cs
1092
1093         * enum.cs (GetObsoleteAttribute): Removed.
1094
1095         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1096         on Enum member is double staged. The first is tested member
1097         and then enum.
1098
1099 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1100
1101         Fixed #56986, #63631, #65231
1102
1103         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1104         adds member to name container.
1105         (TypeContainer.AddToTypeContainer): New method, adds type to
1106         name container.
1107         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1108         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1109         AddOperator): Simplified by reusing AddToMemberContainer.
1110         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1111         instead of field.
1112         (Method.CheckForDuplications): Fixed implementation to test all
1113         possibilities.
1114         (MemberBase): Detection whether member is explicit interface
1115         implementation is now in constructor.
1116         (MemberBase.UpdateMemberName): Handles IndexerName.
1117         (Accessor): Changed to keep also location information.
1118         (AbstractPropertyEventMethod): Is derived from MemberCore.
1119         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1120         will be emited or not.
1121         (PropertyBase.AreAccessorsDuplicateImplementation):
1122         Tests whether accessors are not in collision with some method.
1123         (Operator): Is derived from MethodCore to simplify common
1124         operations.
1125
1126         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1127         must be performed.
1128         (DeclSpace.AddToContainer): Adds the member to defined_names
1129         table. It tests for duplications and enclosing name conflicts.
1130
1131         * enum.cs (EnumMember): Clean up to reuse the base structures
1132
1133 2004-09-03  Martin Baulig  <martin@ximian.com>
1134
1135         Merged latest changes into gmcs.  Please keep this comment in
1136         here, it makes it easier for me to see what changed in MCS since
1137         the last time I merged.
1138
1139 2004-09-03  Martin Baulig  <martin@ximian.com>
1140
1141         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1142         into TypeContainer, to make partial classes work again.
1143
1144 2004-09-03  Martin Baulig  <martin@ximian.com>
1145
1146         * rootcontext.cs (RootContext.V2): Removed.
1147
1148 2004-03-23  Martin Baulig  <martin@ximian.com>
1149
1150         * expression.cs (Invocation.OverloadResolve): Added `bool
1151         may_fail' argument and use it instead of the Location.IsNull() hack.
1152
1153 2004-09-09  Martin Baulig  <martin@ximian.com>
1154
1155         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
1156
1157 2004-09-09  Martin Baulig  <martin@ximian.com>
1158
1159         * generic.cs (TypeParameter.DefineType): Added support for
1160         explicit interface methods.
1161
1162 2004-09-09  Martin Baulig  <martin@ximian.com>
1163
1164         * README.Changes: New document.  Started to list important changes
1165         between MCS and GMCS here.
1166
1167 2004-09-08  Martin Baulig  <martin@ximian.com>
1168
1169         * class.cs
1170         (TypeContainer.CheckRecursiveDefinition): New protected method.
1171         (TypeContainer.DefineType): Move the CS0146 check into
1172         CheckRecursiveDefinition().     
1173
1174 2004-09-06  Martin Baulig  <martin@ximian.com>
1175
1176         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
1177         types for the constructor constraint.
1178
1179 2004-09-03  Martin Baulig  <martin@ximian.com>
1180
1181         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1182         into TypeContainer, to make partial classes work again.
1183
1184 2004-09-03  Martin Baulig  <martin@ximian.com>
1185
1186         * rootcontext.cs (RootContext.V2): Removed.
1187
1188 2004-03-23  Martin Baulig  <martin@ximian.com>
1189
1190         * expression.cs (Invocation.OverloadResolve): Added `bool
1191         may_fail' argument and use it instead of the Location.IsNull() hack.
1192
1193 2004-09-03  Martin Baulig  <martin@ximian.com>
1194
1195         Merged latest changes into gmcs.  Please keep this comment in
1196         here, it makes it easier for me to see what changed in MCS since
1197         the last time I merged.
1198
1199 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1200
1201         Fix #61128.
1202         * expression.cs (BetterConversion): Don't allow either conversion 
1203         to be null.  Remove redundant implicit conversion test when 'q ==
1204         null' -- when this function is invoked, we already know that the
1205         implicit conversion exists.
1206         (BetterFunction): Assume that 'best' is non-null.  Remove
1207         redundant reimplementation of IsApplicable when 'best' is null.
1208         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1209         number of arguments.
1210         (IsAncestralType): Extract from OverloadResolve.
1211         (OverloadResolve): Make robust to the MethodGroupExpr being
1212         unsorted.  Implement all the logic of Section 14.5.5.1, and
1213         support overloading of methods from multiple applicable types.
1214         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1215
1216         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1217         (RealError, Warning): Append type of report to related symbol.
1218
1219 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1220
1221         * enum.cs: Fixed CLS-Compliance checks for enum members.
1222         Error tests cs3008-8.cs, cs3014-8.cs
1223
1224 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1225
1226         Fixed bug #62342, #63102
1227         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1228         like ImplementMethod.
1229
1230 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1231
1232         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1233         Fixed bug #65170.
1234
1235 2004-09-02  Martin Baulig  <martin@ximian.com>
1236
1237         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1238         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1239         on the MethodBase.
1240
1241 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1242
1243         C# 2.0 Static classes implemented
1244
1245         * class.cs (TypeContainer): instance_constructors,
1246         initialized_fields, initialized_static_fields,
1247         default_constructor, base_inteface_types are protected to be
1248         accessible from StaticClass.
1249         (TypeContainer.DefineDefaultConstructor): New virtual method
1250         for custom default constructor generating
1251         (StaticClass): New class to handle "Static classes" feature.
1252
1253         * cs-parser.jay: Handle static keyword on class like instance
1254         of StaticClass.
1255
1256         * driver.cs: Added "/langversion" command line switch with two
1257         options (iso-1, default).
1258
1259 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1260
1261         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1262
1263 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1264
1265         * delegate.cs: Style.
1266
1267 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1268
1269         * delegate.cs: Add seperate instance expr field for miguel.
1270
1271 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1272
1273         * PointerArithmetic (Resolve): make sure we are not doing
1274         pointer arith on void*. Also, make sure we are resolved
1275         by not setting eclass until resolve.
1276
1277         All callers: Make sure that PointerArithmetic gets resolved.
1278
1279 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1280
1281         * ArrayCreation (LookupType): If the type does not resolve 
1282         to an array, give an error.
1283
1284 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1285
1286         * statement.cs (Try.Resolve): Fixed bug #64222
1287
1288 2004-08-27  Martin Baulig  <martin@ximian.com>
1289
1290         * class.cs
1291         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1292         crash here.     
1293
1294 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1295
1296         * ecore.cs (Constantify): Get underlying type via
1297         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1298         Windows in special cases.
1299
1300 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1301
1302         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1303         for obtaining also private methods.
1304         (GetRemoveMethod): Used GetRemoveMethod (true)
1305         for obtaining also private methods.
1306
1307 2004-09-02  Martin Baulig  <martin@ximian.com>
1308
1309         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1310         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1311         on the MethodBase.
1312
1313 2004-08-27  Martin Baulig  <martin@ximian.com>
1314
1315         * class.cs
1316         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1317         crash here.     
1318
1319 2004-08-25  Martin Baulig  <martin@ximian.com>
1320
1321         * support.cs (ReflectionParameters..ctor): If this is a generic
1322         method, retrieve and store its type parameters.
1323         (InternalParameters..ctor): Added `TypeParameter[]' argument.
1324         (ReflectionParameters.GenericConstraints): The argument specifies
1325         the type parameter, not the method parameter.
1326         (InternalParameters.GenericConstraints): Likewise.
1327
1328         * generic.cs (TypeParameter.DefineType): Correctly handle
1329         constraints wrt. generic methods in interfaces and their
1330         implementations.        
1331
1332 2004-08-24  Martin Baulig  <martin@ximian.com>
1333
1334         * generic.cs (TypeParameter.IsSubclassOf): New public method.
1335         (Constraints.IsSubclassOf): New internal method.
1336
1337         * typemanager.cs (TypeManager.FindMembers): Added special support
1338         for GenericTypeParameterBuilder's.      
1339         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
1340         type parameters.
1341
1342 2004-08-24  Martin Baulig  <martin@ximian.com>
1343
1344         * typemanager.cs
1345         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
1346         this for accessibility checks.
1347         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
1348         IsNestedFamilyAccessible.
1349         (TypeManager.IsSubclassOf): New method, do what the name actually
1350         says.   
1351
1352 2004-08-24  Martin Baulig  <martin@ximian.com>
1353
1354         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
1355         as a SimpleName, include the generic arity.
1356
1357 2004-08-24  Martin Baulig  <martin@ximian.com>
1358
1359         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1360         MethodAttributes.HideBySig for operators.
1361
1362 2004-08-23  Martin Baulig  <martin@ximian.com>
1363
1364         Back to the old error reporting system :-)
1365
1366         * report.cs (Message): Removed.
1367         (Report.MessageData, ErrorData, WarningData): Removed.
1368         (Report.Error, Warning): Back to the old system.
1369
1370 2004-08-23  Martin Baulig  <martin@ximian.com>
1371
1372         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1373
1374         * class.cs (TypeContainer.ParentContainer): New public virtual
1375         method; replaces the explicit interface implementation.
1376         (ClassPart.ParentContainer): Override.
1377
1378 2004-08-23  Martin Baulig  <martin@ximian.com>
1379
1380         * statement.cs (Switch): Added support for constant switches; see
1381         #59428 or test-285.cs.
1382
1383 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1384
1385         Fixed bug #62740.
1386         * statement.cs (GetEnumeratorFilter): Removed useless
1387         logic because C# specs is strict. GetEnumerator must be
1388         public.
1389
1390 2004-08-22  Martin Baulig  <martin@ximian.com>
1391
1392         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1393         a switch and may break, reset the barrier.  Fixes #59867.
1394
1395 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1396
1397         CLS-Compliance speed up (~5% for corlib)
1398
1399         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1400         New method. Tests container for CLS-Compliant names
1401
1402         * class.cs (TypeContainer.VerifyClsName): New method.
1403         Checks whether container name is CLS Compliant.
1404         (Constructor): Implements IMethodData.
1405
1406         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1407         low-case table for CLS Compliance test.
1408         (MemberCache.VerifyClsParameterConflict): New method.
1409         Checks method parameters for CS3006 error.
1410
1411         * enum.cs (EnumMember): Is derived from MemberCore.
1412         (Enum.VerifyClsName): Optimized for better performance.
1413
1414 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1415
1416         * report.cs: Renamed Error_T to Error and changed all
1417         references.
1418
1419 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1420
1421         * class.cs (TypeContainer.IndexerArrayList): New inner class
1422         container for indexers.
1423         (TypeContainer.DefaultIndexerName): New constant for default
1424         indexer name. Replaced all "Item" with this constant.
1425         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1426
1427         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1428         DefaultMemberAttribute constructor.
1429
1430 2004-08-05  Martin Baulig  <martin@ximian.com>
1431
1432         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1433         Fix bug #59429.
1434
1435 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1436
1437         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1438         multi platforms problem.
1439
1440         * compiler.csproj: Included shared files.
1441
1442 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1443
1444         Fix bug 60333, 55971 in the more general way
1445         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1446         Added arg_type argument for constant conversion.
1447         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1448
1449 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1450
1451         Fix bug #59760
1452         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1453         OperatorArrayList, MethodCoreArrayList for typecontainer
1454         containers. Changed class member types to these new types.
1455         (MethodArrayList.DefineMembers): Added test for CS0659.
1456
1457 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1458
1459         * cfold.cs: Synchronize the folding with the code in expression.cs
1460         Binary.DoNumericPromotions for uint operands.
1461
1462         * attribute.cs: Revert patch from Raja, it introduced a regression
1463         while building Blam-1.2.1 (hard to isolate a test case).
1464
1465 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1466
1467         Fix for #55382
1468         * class.cs:
1469         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1470         name collision.
1471         (MethodCore.parent_method): New member. The method we're overriding
1472         if this is an override method.
1473         (MethodCore.CheckBase): Moved from Method class and made common.
1474         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1475         private.
1476         (MethodCore.CheckForDuplications): New abstract method. For custom
1477         member duplication search in a container
1478         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1479         method and its return type.
1480         (Event.conflict_symbol): New member. Symbol with same name in the
1481         parent class.
1482
1483         * decl.cs:
1484         (MemberCache.FindMemberWithSameName): New method. The method
1485         is looking for conflict with inherited symbols.
1486
1487 2004-08-04  Martin Baulig  <martin@ximian.com>
1488
1489         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1490
1491         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1492
1493 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1494
1495         * report.cs (Message): New enum for better error, warning reference in
1496         the code.
1497         (MessageData): New inner abstract class. It generally handles printing of
1498         error and warning messages.
1499         Removed unused Error, Warning, Message methods.
1500
1501 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1502
1503         Fix for cs0592-8.cs test
1504         * attribute.cs
1505         (Attributable.ValidAttributeTargets): Made public.
1506         (Attribute.ExplicitTarget): New member for explicit target value.
1507         (Attribute.CheckTargets): Now we translate explicit attribute
1508         target to Target here.
1509
1510 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1511
1512         * ecore.cs (MethodGroupExpr): new IsBase property.
1513
1514         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1515
1516         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1517         rather than an instance expr.
1518
1519         (DelegateCreation.Emit): Use the method group rather than
1520         the instance expression. Also, if you have base.Foo as the
1521         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1522
1523         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1524
1525         (NewDelegate.DoResolve): Only check for the existance of Invoke
1526         if the method is going to be needed. Use MethodGroupExpr.
1527
1528         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1529
1530         * expression.cs: For pointer arith., make sure to use
1531         the size of the type, not the size of the pointer to
1532         the type.
1533
1534 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1535
1536         Fix for #60722
1537         * class.cs (Class): Added error CS0502 test.
1538
1539 2004-08-03  John Luke  <jluke@cfl.rr.com>
1540             Raja R Harinath  <rharinath@novell.com>
1541
1542         Fix for #60997.
1543         * attribute.cs (Attribute.complained_before): New flag.
1544         (Attribute.ResolveType, Attribute.Resolve),
1545         (Attribute.DefinePInvokeMethod): Set it.
1546         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1547         
1548 2004-08-03  Martin Baulig  <martin@ximian.com>
1549
1550         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1551         use a user-defined operator; we still need to do numeric
1552         promotions in case one argument is a builtin type and the other
1553         one has an implicit conversion to that type.  Fixes #62322.
1554
1555 2004-08-18  Martin Baulig  <martin@ximian.com>
1556
1557         * class.cs (Method.Define): Use the correct method name when
1558         creating the MethodBuilder for a generic method.
1559
1560 2004-08-17  Martin Baulig  <martin@ximian.com>
1561
1562         * generic.cs (Constraints): Support type parameter constraints.
1563
1564 2004-08-16  Martin Baulig  <martin@ximian.com>
1565
1566         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
1567         (Token.GENERIC_DIMENSION): New token; this is returned if we
1568         encounter an unbound generic type in a typeof() expression.
1569
1570         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
1571         this token is only generated while parsing a typeof() expression.
1572         (typeof_expression): Removed the old unbound_type hack.
1573
1574         * generic.cs (TypeArguments.IsUnbound): New public property.
1575
1576         * decl.cs (MemberName): Added support for unbound types.
1577
1578 2004-08-14  Martin Baulig  <martin@ximian.com>
1579
1580         * typemanager.cs
1581         (TypeManager.IsEqualGenericInstance): New static method.
1582         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
1583         just used to check accessibility, so follow the rules of 26.1.6.        
1584
1585         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
1586         ConstructedType instead of a TypeExpression if we have type arguments.
1587
1588         * cs-parser.jay (typeof_expression): Support unbound generic types.
1589
1590         * ecore.cs (UnboundTypeExpression): New public class.
1591
1592 2004-08-12  Martin Baulig  <martin@ximian.com>
1593
1594         * typemanager.cs (TypeManager.IsNestedChildOf): Use
1595         TypeManager.IsEqual() rather than `=='.
1596
1597         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
1598         generic instances as well.
1599
1600 2004-08-12  Martin Baulig  <martin@ximian.com>
1601
1602         * expression.cs (Invocation.InferType): We can only infer method
1603         type parameters.  Fixes #62647.
1604
1605 2004-08-11  Martin Baulig  <martin@ximian.com>
1606
1607         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
1608         before resolving the base classes.
1609
1610 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
1611
1612         * Makefile: install .mdb file too.
1613
1614 2004-08-05  Martin Baulig  <martin@ximian.com>
1615
1616         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
1617         initializer, the current type is just the TypeBuilder, not the
1618         instantiated generic type.
1619         (FieldExpr.IsFieldInitializer): New public property.
1620
1621 2004-08-04  Martin Baulig  <martin@ximian.com>
1622
1623         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1624
1625         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1626
1627 2004-08-03  Martin Baulig  <martin@ximian.com>
1628
1629         * class.cs (MethodData.Define): If we're an explicit
1630         implementation, remove the generic arity from the type name.
1631
1632 2004-08-03  Martin Baulig  <martin@ximian.com>
1633
1634         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1635         use a user-defined operator; we still need to do numeric
1636         promotions in case one argument is a builtin type and the other
1637         one has an implicit conversion to that type.  Fixes #62322.
1638
1639 2004-08-02  Martin Baulig  <martin@ximian.com>
1640
1641         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
1642         `TypeExpr[]' array.
1643         (TypeContainer.GetClassBases): Return the unexpanded list of
1644         interfaces; we expand them later.
1645         (TypeContainer.DefineType): After creating the TypeBuilder, call
1646         TypeManager.ExpandInterfaces() to get an expanded and resolved
1647         list of interfaces.
1648
1649         * ecore.cs (TypeExpr.GetInterfaces): Removed
1650
1651         * generics.cs (Constraints.InterfaceConstraints): Remove.
1652         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
1653         register the interface constraints.
1654
1655         * typemanager.cs
1656         (TypeManager.AddUserType): Removed the `ifaces' argument.
1657         (TypeManager.AddTypeParameter): Likewise.
1658         (TypeManager.AddUserInterface): Removed, was unused.
1659         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
1660         `TypeExpr[]' array for the interfaces.
1661         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
1662         has been defined, returns a list of the resolved interfaces types.
1663         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
1664         (TypeManager.GetExplicitInterfaces): Likewise.  
1665
1666 2004-08-02  Martin Baulig  <martin@ximian.com>
1667
1668         * expression.cs (Invocation.EmitCall): If we're invoking a method
1669         on a type parameter, use the new `Constrained' prefix opcode.
1670
1671 2004-08-02  Martin Baulig  <martin@ximian.com>
1672
1673         * statement.cs (LocalInfo.Flags): Added `IsThis'.
1674         (LocalInfo.IsThis): New public property.
1675         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
1676
1677 2004-08-01  Martin Baulig  <martin@ximian.com>
1678
1679         * class.cs (TypeContainer.GetClassBases): Don't set the default
1680         here since we may get called from GetPartialBases().
1681         (TypeContainer.DefineType): If GetClassBases() didn't return a
1682         parent, use the default one.
1683
1684 2004-07-30  Martin Baulig  <martin@ximian.com>
1685
1686         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
1687
1688         * class.cs (SourceMethod): New public class, derive from the
1689         symbol writer's ISourceMethod.
1690         (Method): Use the new symbol writer API.
1691
1692         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
1693         as argument and use the new symbol writer.
1694
1695         * location.cs
1696         (SourceFile): Implement the symbol writer's ISourceFile.
1697         (Location.SymbolDocument): Removed.
1698         (Location.SourceFile): New public property.
1699
1700         * symbolwriter.cs: Use the new symbol writer API.
1701
1702 2004-07-30  Raja R Harinath  <rharinath@novell.com>
1703
1704         * Makefile (install-local): Remove.  Functionality moved to
1705         executable.make.
1706
1707 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
1708
1709         * Makefile: Install mcs.exe.config file together with mcs.exe.
1710         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
1711         correct runtime version.
1712         
1713 2004-07-25  Martin Baulig  <martin@ximian.com>
1714
1715         * class.cs
1716         (TypeContainer.RegisterOrder): Removed, this was unused.
1717         (TypeContainer, interface_order): Removed.
1718         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
1719         TypeContainer as argument since we can also be called with a
1720         `PartialContainer' for a partial class/struct/interface.
1721         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
1722         of checking whether we're an `Interface' - we could be a
1723         `PartialContainer'.
1724         (PartialContainer.Register): Override; call
1725         AddClass()/AddStruct()/AddInterface() on our parent.
1726
1727         * cs-parser.jay (interface_member_declaration): Add things to the
1728         `current_container', not the `current_class'.
1729
1730         * rootcontext.cs (RegisterOrder): The overloaded version which
1731         takes an `Interface' was unused, removed.
1732
1733         * typemanager.cs (TypeManager.LookupInterface): Return a
1734         `TypeContainer', not an `Interface'.
1735         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
1736         contain a `PartialContainer' for an interface, so check it's
1737         `Kind' to figure out what it is.
1738
1739 2004-07-25  Martin Baulig  <martin@ximian.com>
1740
1741         * class.cs (Class.DefaultTypeAttributes): New public constant.
1742         (Struct.DefaultTypeAttributes): Likewise.
1743         (Interface.DefaultTypeAttributes): Likewise.
1744         (PartialContainer.TypeAttr): Override this and add the
1745         DefaultTypeAttributes.
1746
1747 2004-07-25  Martin Baulig  <martin@ximian.com>
1748
1749         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
1750         we can just use the `Parent' field instead.
1751
1752 2004-07-25  Martin Baulig  <martin@ximian.com>
1753
1754         * class.cs (TypeContainer.Emit): Renamed to EmitType().
1755
1756 2004-07-25  Martin Baulig  <martin@ximian.com>
1757
1758         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
1759         our parts before defining any methods.
1760         (TypeContainer.VerifyImplements): Make this virtual.
1761         (ClassPart.VerifyImplements): Override and call VerifyImplements()
1762         on our PartialContainer.
1763
1764 2004-07-25  Martin Baulig  <martin@ximian.com>
1765
1766         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1767
1768         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1769         argument, we can just use the `Parent' field instead.
1770
1771         * class.cs
1772         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1773         (MemberBase.DoDefine): Likewise.
1774
1775 2004-07-24  Martin Baulig  <martin@ximian.com>
1776
1777         * decl.cs (MemberCore.Parent): New public field.
1778         (DeclSpace.Parent): Moved to MemberCore.
1779
1780         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1781         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1782         parent's .ctor.
1783         (FieldBase, Field, Operator): Likewise.
1784         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1785         (EventField, Event): Likewise.
1786
1787 2004-07-23  Martin Baulig  <martin@ximian.com>
1788
1789         * class.cs (PartialContainer): New public class.
1790         (ClassPart): New public class.
1791         (TypeContainer): Added support for partial classes.
1792         (TypeContainer.GetClassBases): Splitted some of the functionality
1793         out into GetNormalBases() and GetPartialBases().
1794
1795         * cs-tokenizer.cs (Token.PARTIAL): New token.
1796         (Tokenizer.consume_identifier): Added some hacks to recognize
1797         `partial', but only if it's immediately followed by `class',
1798         `struct' or `interface'.
1799
1800         * cs-parser.jay: Added support for partial clases.
1801
1802 2004-07-23  Martin Baulig  <martin@ximian.com>
1803
1804         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1805         a `DeclSpace' and also made it readonly.
1806         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1807         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1808         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1809
1810         * cs-parser.jay: Pass the `current_class', not the
1811         `current_container' (at the moment, this is still the same thing)
1812         to a new Method, Property, Event, Indexer or Constructor.
1813
1814 2004-07-23  Martin Baulig  <martin@ximian.com>
1815
1816         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1817         and removed the `current_interface' one.
1818         (struct_declaration, class_declaration, interface_declaration):
1819         Set `current_class' to the newly created class/struct/interface;
1820         set their `Bases' and call Register() before parsing their body.
1821
1822 2004-07-23  Martin Baulig  <martin@ximian.com>
1823
1824         * class.cs (Kind): New public enum.
1825         (TypeContainer): Made this class abstract.
1826         (TypeContainer.Kind): New public readonly field.
1827         (TypeContainer.CheckDef): New public method; moved here from
1828         cs-parser.jay.
1829         (TypeContainer.Register): New public abstract method.
1830         (TypeContainer.GetPendingImplementations): New public abstract
1831         method.
1832         (TypeContainer.GetClassBases): Removed the `is_class' and
1833         `is_iface' parameters.
1834         (TypeContainer.DefineNestedTypes): Formerly known as
1835         DoDefineType().
1836         (ClassOrStruct): Made this class abstract.
1837
1838         * tree.cs (RootTypes): New public type. 
1839
1840 2004-07-20  Martin Baulig  <martin@ximian.com>
1841
1842         * tree.cs (Tree.RecordNamespace): Removed.
1843         (Tree.Namespaces): Removed.
1844
1845         * rootcontext.cs (RootContext.IsNamespace): Removed.
1846
1847         * cs-parser.jay (namespace_declaration): Just create a new
1848         NamespaceEntry here.
1849
1850 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
1851
1852         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
1853         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
1854         entry to make sure it runs in the correct runtime version.
1855         
1856 2004-07-18  Martin Baulig  <martin@ximian.com>
1857
1858         * generic.cs (ConstructedType.CheckConstraints): Improved
1859         constraints checking.
1860
1861 2004-07-18  Martin Baulig  <martin@ximian.com>
1862
1863         * expression.cs (Invocation.BetterMethod): Call
1864         TypeManager.TypeToCoreType() on all types and removed my previous
1865         hack; we're already doig the right thing here.
1866
1867 2004-07-17  Martin Baulig  <martin@ximian.com>
1868
1869         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
1870
1871 2004-07-16  Martin Baulig  <martin@ximian.com>
1872
1873         * iterators.cs: Added generics support.
1874
1875 2004-07-16  Martin Baulig  <martin@ximian.com>
1876
1877         * iterators.cs: Rewrote this.  We're now using one single Proxy
1878         class for both the IEnumerable and the IEnumerator interface and
1879         `Iterator' derives from Class so we can use the high-level API.
1880
1881         * class.cs (TypeContainer.AddIterator): New method.
1882         (TypeContainer.DoDefineType): New protected virtual method, which
1883         is called from DefineType().
1884         (TypeContainer.DoDefineMembers): Call DefineType() and
1885         DefineMembers() on all our iterators.
1886         (TypeContainer.Emit): Call Emit() on all our iterators.
1887         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1888
1889         * codegen.cs (EmitContext.CurrentIterator): New public field.
1890
1891 2004-07-15  Martin Baulig  <martin@ximian.com>
1892
1893         * typemanager.cs
1894         (TypeManager.not_supported_exception_type): New type.   
1895
1896 2004-07-14  Martin Baulig  <martin@ximian.com>
1897
1898         * typemanager.cs
1899         (TypeManager.generic_ienumerable_type): New type.
1900         (TypeManager.generic_ienumerator_type): New type.
1901
1902         * rootcontext.cs
1903         (RootContext.interfaces_first_stage): Added
1904         "System.Collections.Generic.IEnumerator`1" and
1905         "System.Collections.Generic.IEnumerable`1".     
1906
1907 2004-07-14  Martin Baulig  <martin@ximian.com>
1908
1909         * iterators.cs: Use real error numbers.
1910
1911 2004-07-14  Martin Baulig  <martin@ximian.com>
1912
1913         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1914         requires this to be a System.Collection.IEnumerable and not a
1915         class implementing that interface.
1916         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1917
1918 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1919
1920         * class.cs: Fixed previous fix, it broke some error tests.
1921
1922 2004-07-12  Martin Baulig  <martin@ximian.com>
1923
1924         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1925         Fixes #61293.
1926
1927 2004-07-14  Martin Baulig  <martin@ximian.com>
1928
1929         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
1930         an exclamation mark (!) for the generic arity to reflect the
1931         latest spec changes; ie. use "System.Collections.Generic.IList`1".
1932
1933 2004-07-13  Martin Baulig  <martin@ximian.com>
1934
1935         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
1936         specifiers being part of a type argument.
1937
1938 2004-07-13  Martin Baulig  <martin@ximian.com>
1939
1940         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
1941         name for generic types.
1942
1943 2004-07-13  Martin Baulig  <martin@ximian.com>
1944
1945         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
1946         bit to fix #60119.
1947
1948 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1949
1950         * assign.cs (LocalTemporary): Add new argument: is_address,If
1951         `is_address' is true, then the value that we store is the address
1952         to the real value, and not the value itself.
1953         
1954         * ecore.cs (PropertyExpr): use the new local temporary
1955         stuff to allow us to handle X.Y += z (where X is a struct)
1956
1957 2004-07-08  Martin Baulig  <martin@ximian.com>
1958
1959         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1960         not always return, just like we're doing in Using.Resolve().
1961
1962 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1963
1964         * cs-parser.jay (fixed_statement): flag this as Pinned.
1965
1966 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1967
1968         * typemanager.cs (TypeManager): Removed MakePinned method, this
1969         mechanism is replaced with the .NET 2.x compatible mechanism of
1970         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1971
1972         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1973         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1974         `IsFixed' property which has a different meaning.
1975
1976 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1977
1978         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1979         visible from inside a nested class, not just the names of the
1980         immediately enclosing class.
1981         Fix for bug #60730.
1982
1983 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1984
1985         * expression.cs (BetterConversion): Remove buggy special-case
1986         handling of "implicit constant expression conversions".  At this
1987         point, we already know that the conversion is possible -- we're
1988         only checking to see which is better.
1989
1990 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1991
1992         * cs-parser.jay: Added error CS0210 test.
1993
1994 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1995
1996         * cs-parser.jay: Added error CS0134 test.
1997
1998 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1999
2000         Fix bug #52507
2001         * cs-parser.jay: Added error CS0145 test.
2002
2003 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2004
2005         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2006
2007 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2008         
2009         * expression.cs (StackAlloc.Resolve): The argument may not
2010         be a constant; deal with this case.
2011         
2012 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2013
2014         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2015         GetIndexerAttributeValue.
2016         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2017
2018         * class.cs (Indexer.Define): Added error tests for CS0415,
2019         CS0609.
2020
2021 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2022
2023         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2024         property code.
2025
2026 2004-06-23  Martin Baulig  <martin@ximian.com>
2027
2028         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2029         neither return nor throw, reset the barrier as well.  Fixes #60457.
2030
2031 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2032
2033         * class.cs : EventAttributes is now set to None by default.
2034           This fixes bug #60459.
2035
2036 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2037
2038         Fix bug #60219
2039         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2040         Don't throw exception but return null (it's sufficient now).
2041
2042 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2043
2044         * typemanager.cs (GetArgumentTypes): Faster implementation.
2045
2046 2004-06-18  Martin Baulig  <martin@ximian.com>
2047
2048         * attribute.cs (Attribute.Resolve): Check whether we're an
2049         EmptyCast which a Constant child.  Fixes #60333.
2050
2051 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2052
2053         * statement.cs (EmitCollectionForeach): Account for the fact that
2054         not all valuetypes are in areas which we can take the address of.
2055         For these variables, we store to a temporary variable. Also, make
2056         sure that we dont emit a `callvirt' on a valuetype method.
2057
2058 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2059
2060         * expression.cs (StackAlloc.DoReSolve): Added test for
2061         negative parameter (CS0247).
2062
2063 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2064
2065         Fix bug #59792
2066         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2067
2068 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2069
2070         Fix bug #59781
2071         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2072         ulong.
2073
2074 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2075
2076         Fix bug #58254 & cs1555.cs, cs1556.cs
2077         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2078
2079 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2080
2081         * cs-parser.jay: Added error CS1669 test for indexers.
2082
2083 2004-06-18  Martin Baulig  <martin@ximian.com>
2084
2085         * generics.cs (GenericMethod.ctor): Don't take an Attributes
2086         argument.  Fixes #60441.
2087
2088 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
2089         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
2090         The name needs to have the actual name of the method in order
2091         for other tests (such as the one in OverloadResolve for Invoke
2092         on a delegate) to work. As well, it does not really help
2093         error reporting because the method group had multiple methods.
2094         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
2095         Make profiling work.
2096         
2097 2004-06-13  Martin Baulig  <martin@ximian.com>
2098
2099         * cs-parser.jay: Don't allow generic attributes.
2100
2101 2004-06-13  Martin Baulig  <martin@ximian.com>
2102
2103         * class.cs (MemberBase.DoDefineBase): New protected method.
2104         (MemberBase.DoDefine): Compute the `flags' in the new
2105         DoDefineBase() which must be called first.
2106         (Method.Define): Call DoDefineBase() first so we have the flags
2107         when defining the generic method.
2108
2109         * cs-parser.jay (interface_method_declaration): Support generic methods.
2110
2111 2004-06-13  Martin Baulig  <martin@ximian.com>
2112
2113         * decl.cs (TypeName): Removed.
2114         (MemberName): Removed TypeName and MemberNow; now we just have
2115         MemberName.
2116
2117         * cs-parser.jay: Don't distinguish between type arguments and type
2118         parameters in the grammar and simplified the rules a bit.  The
2119         reduce/reduce conflicts are now gone (except the one we inherited
2120         from mcs).
2121
2122 2004-06-11  Martin Baulig  <martin@ximian.com>
2123
2124         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2125         call this twice: for params and varargs methods.
2126
2127 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2128
2129         * class.cs:
2130         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2131
2132 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2133
2134         * attribute.cs (Attribute.GetValidTargets): Made public.
2135
2136         * class.cs: 
2137         (AbstractPropertyEventMethod): New class for better code sharing.
2138         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2139         CS1667 report.
2140         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2141
2142 2004-06-09  Martin Baulig  <martin@ximian.com>
2143
2144         * cs-parser.jay: Removed a reduce/reduce conflict.
2145
2146 2004-06-03  Martin Baulig  <martin@ximian.com>
2147
2148         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
2149         GetSimpleName() and return a SimpleName.
2150
2151         * ecore.cs (SimpleName.Arguments): New public field.
2152         (SimpleName): Added overloaded ctor which takes an additional
2153         TypeArguments argument.
2154         (SimpleName.SimpleNameResolve): Added support for generic methods.
2155         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
2156         formerly in MemberAccess.DoResolve(), but we also need it in
2157         SimpleNameResolve().
2158
2159         * expression.cs (MemberAccess.DoResolve): Use the new
2160         MethodGroupExpr.ResolveGeneric().       
2161
2162 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2163
2164         * decl.cs: If possible, use lookuptypedirect here. We can only do
2165         this if there is no `.' after the namespace. Avoids using
2166         LookupType, which does lots of slow processing.
2167         (FindNestedType) New method, does what it says :-).
2168         * namespace.cs: use LookupTypeDirect.
2169         * rootcontext.cs: use membercache, if possible.
2170         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2171
2172 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2173
2174         * expression.cs:
2175         According to the spec, 
2176
2177         In a member access of the form E.I, if E is a single identifier,
2178         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2179         field, property, localvariable, or parameter with the same type as
2180         the meaning of E as a type-name (§3.8), then both possible
2181         meanings of E are permitted.
2182
2183         We did not check that E as a simple-name had the same type as E as
2184         a type name.
2185
2186         This trivial check gives us 5-7% on bootstrap time.
2187
2188 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2189
2190         * expression.cs (Invocation.OverloadResolve): Avoid the
2191         use of hashtables and boxing here by allocating on demand.
2192
2193 2004-05-30  Martin Baulig  <martin@ximian.com>
2194
2195         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2196         we're doing a silent lookup.  Don't try to lookup nested types in
2197         TypeManager.object_type (thanks to Ben Maurer).
2198
2199 2004-05-30  Martin Baulig  <martin@ximian.com>
2200
2201         Committing a patch from Ben Maurer.
2202
2203         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2204
2205 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2206
2207         * convert.cs: add a trivial cache for overload operator resolution.
2208
2209 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
2210
2211         * attribute.cs
2212         (AttributeTester.GetObsoleteAttribute): Returns instance of
2213         ObsoleteAttribute when type is obsolete.
2214
2215         * class.cs
2216         (TypeContainer.VerifyObsoleteAttribute): Override.
2217         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2218         (MethodCode.VerifyObsoleteAttribute): Override.
2219         (MemberBase.VerifyObsoleteAttribute): Override.
2220
2221         * decl.cs
2222         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2223         and report proper error.
2224
2225         *delegate.cs
2226         (Delegate.VerifyObsoleteAttribute): Override.
2227
2228         * ecore.cs
2229         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2230         and report proper error.
2231         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2232
2233         * enum.cs
2234         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2235         and enum member.
2236
2237         * expression.cs
2238         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2239         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2240         Added test for ObsoleteAttribute.
2241
2242         * statement.cs
2243         (Catch): Derived from Statement.
2244
2245 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2246
2247         * decl.cs: If possible, use lookuptypedirect here. We can only do
2248         this if there is no `.' after the namespace. Avoids using
2249         LookupType, which does lots of slow processing.
2250         (FindNestedType) New method, does what it says :-).
2251         * namespace.cs: use LookupTypeDirect.
2252         * rootcontext.cs: use membercache, if possible.
2253         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2254
2255 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2256
2257         * expression.cs:
2258         According to the spec, 
2259
2260         In a member access of the form E.I, if E is a single identifier,
2261         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2262         field, property, localvariable, or parameter with the same type as
2263         the meaning of E as a type-name (§3.8), then both possible
2264         meanings of E are permitted.
2265
2266         We did not check that E as a simple-name had the same type as E as
2267         a type name.
2268
2269         This trivial check gives us 5-7% on bootstrap time.
2270
2271 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2272
2273         Fixed bug #59071 & cs0160.cs
2274         * statement.cs (Try.Resolve): Check here whether order of catch
2275         clauses matches their dependencies.
2276
2277 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2278
2279         Fixed bug #58624
2280         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
2281         unsafe type.
2282
2283 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2284
2285         * expression.cs (Invocation.OverloadResolve): Avoid the
2286         use of hashtables and boxing here by allocating on demand.
2287
2288 2004-05-30  Martin Baulig  <martin@ximian.com>
2289
2290         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2291         we're doing a silent lookup.  Don't try to lookup nested types in
2292         TypeManager.object_type (thanks to Ben Maurer).
2293
2294 2004-05-30  Martin Baulig  <martin@ximian.com>
2295
2296         Committing a patch from Ben Maurer.
2297
2298         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
2299
2300 2004-05-29  Martin Baulig  <martin@ximian.com>
2301
2302         * class.cs (IMethodData.ShouldIgnore): New method.
2303
2304         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2305         `Location' argument, we don't need it anywhere.  Use
2306         `IMethodData.ShouldIgnore ()' instead of
2307         `MethodData.GetMethodFlags ()'.
2308         (TypeManager.AddMethod): Removed.
2309         (TypeManager.AddMethod2): Renamed to AddMethod.
2310
2311 2004-05-29  Martin Baulig  <martin@ximian.com>
2312
2313         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2314
2315         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2316         converting from a class type S to an interface type and we already
2317         have an object on the stack, don't box it again.  Fixes #52578.
2318
2319 2004-05-29  Martin Baulig  <martin@ximian.com>
2320
2321         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2322         Added support for `params' parameters.  Fixes #59267.
2323
2324 2004-05-29  Martin Baulig  <martin@ximian.com>
2325
2326         * literal.cs (NullPointer): Provide a private .ctor which sets
2327         `type' to TypeManager.object_type.  Fixes #59048.
2328
2329 2004-05-29  Martin Baulig  <martin@ximian.com>
2330
2331         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2332         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2333
2334         * ecore.cs (EventExpr.instance_expr): Make the field private.
2335
2336 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2337
2338         Fixed bug #50080 & cs0214-2.cs
2339         * expression.cs (Cast.DoResolve): Check unsafe context here.
2340         
2341         * statement.cs (Resolve.DoResolve): Likewise.
2342
2343 2004-05-26  Martin Baulig  <martin@ximian.com>
2344
2345         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2346
2347         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2348         (RootContext.LookupType): Pass down the `silent' flag.
2349
2350 2004-05-25  Martin Baulig  <martin@ximian.com>
2351
2352         * expression.cs
2353         (MethodGroupExpr.IdenticalTypeName): New public property.
2354         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2355         expression actually refers to a type.
2356
2357 2004-05-25  Martin Baulig  <martin@ximian.com>
2358
2359         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2360         for #56176 and made it actually work.
2361
2362 2004-05-25  Martin Baulig  <martin@ximian.com>
2363
2364         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2365         (FieldExpr, PropertyExpr): Override and implement
2366         CacheTemporaries.  Fixes #52279.
2367
2368 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2369
2370         * location.cs: In the new compiler listing a file twice is a
2371         warning, not an error.
2372
2373 2004-05-24  Martin Baulig  <martin@ximian.com>
2374
2375         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2376         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2377
2378 2004-05-24  Martin Baulig  <martin@ximian.com>
2379
2380         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2381         walking the `using' list.  Fixes #53921.
2382
2383 2004-05-24  Martin Baulig  <martin@ximian.com>
2384
2385         * const.cs (Const.LookupConstantValue): Added support for
2386         EmptyCast's; fixes #55251.
2387
2388 2004-05-24  Martin Baulig  <martin@ximian.com>
2389
2390         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2391         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2392         which does the CS0135 check.  The reason is that we first need to
2393         check whether the variable actually exists.
2394
2395 2004-05-24  Martin Baulig  <martin@ximian.com>
2396
2397         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2398         than RootContext.LookupType() to find the explicit interface
2399         type.  Fixes #58584.
2400
2401 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2402
2403         * Makefile: Simplify.  Use executable.make.
2404         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2405
2406 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2407
2408         * decl.cs:
2409         * enum.cs:
2410         Use the invariant culture when doing String.Compare for CLS case
2411         sensitivity.
2412         
2413 2004-05-23  Martin Baulig  <martin@ximian.com>
2414
2415         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2416         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2417
2418         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2419
2420 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2421
2422         * class.cs (MemberBase.Define): Reuse MemberType member for 
2423         resolved type. Other methods can use it too.
2424
2425 2004-05-23  Martin Baulig  <martin@ximian.com>
2426
2427         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2428         the variable also exists in the current block (otherwise, we need
2429         to report a CS0103).  Fixes #58670.
2430
2431 2004-05-23  Martin Baulig  <martin@ximian.com>
2432
2433         * flowanalysis.cs (Reachability.Reachable): Compute this
2434         on-the-fly rather than storing it as a field.
2435
2436 2004-05-23  Martin Baulig  <martin@ximian.com>
2437
2438         * flowanalysis.cs (Reachability.And): Manually compute the
2439         resulting `barrier' from the reachability.      
2440        
2441 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2442
2443         Fix bug #57835
2444         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2445         instance of ObsoleteAttribute when symbol is obsolete.
2446
2447         * class.cs
2448         (IMethodData): Extended interface for ObsoleteAttribute support.
2449
2450 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2451
2452         * attribute.cs: Fix bug #55970
2453
2454 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2455
2456         Fix bug #52705
2457         * attribute.cs
2458         (GetObsoleteAttribute): New method. Creates the instance of
2459         ObsoleteAttribute.
2460         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2461         ObsoleteAttribute when member is obsolete.
2462         (AttributeTester.Report_ObsoleteMessage): Common method for
2463         Obsolete error/warning reporting.
2464
2465         * class.cs
2466         (TypeContainer.base_classs_type): New member for storing parent type.
2467
2468         * decl.cs
2469         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2470         for this MemberCore.
2471
2472 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2473
2474         * attribute.cs, const.cs: Fix bug #58590
2475
2476 2004-05-21  Martin Baulig  <martin@ximian.com>
2477
2478         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2479         out parameters if the end of the method is unreachable.  Fixes
2480         #58098. 
2481
2482 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2483
2484         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2485         Hari was right, why extra method.
2486
2487 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2488
2489         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2490
2491 2004-05-20  Martin Baulig  <martin@ximian.com>
2492
2493         * delegate.cs: Convert this file to Unix mode - like the original
2494         version in mcs is.
2495
2496 2004-05-20  Martin Baulig  <martin@ximian.com>
2497
2498         * attribute.cs: Convert this file to Unix mode - like the original
2499         version in mcs is.
2500
2501 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2502
2503        Fix bug #58688 (MCS does not report error when the same attribute
2504        is assigned twice)
2505
2506        * attribute.cs (Attribute.Emit): Distinction between null and default.
2507
2508 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2509
2510        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2511        of a top-level attribute without an attribute target.
2512        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2513        Make non-static.
2514        (Attribute.Conditional_GetConditionName), 
2515        (Attribute.Obsolete_GetObsoleteMessage): Update.
2516        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2517        part of ScanForIndexerName.
2518        (Attribute.CanIgnoreInvalidAttribute): New function.
2519        (Attribute.ScanForIndexerName): Move to ...
2520        (Attributes.ScanForIndexerName): ... here.
2521        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2522        (Attributes.Search): New internal variant that can choose not to
2523        complain if types aren't resolved.  The original signature now
2524        complains.
2525        (Attributes.GetClsCompliantAttribute): Use internal variant, with
2526        complaints suppressed.
2527        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2528        only if it not useful.
2529        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2530        top-level for attributes that are shared between the assembly
2531        and a top-level class.
2532        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2533        * class.cs: Update to reflect changes.
2534        (DefineIndexers): Fuse loops.
2535        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2536        a couple more variants of attribute names.
2537
2538 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2539
2540         Fix bug #52585 (Implemented explicit attribute declaration)
2541
2542         * attribute.cs:
2543         (Attributable.ValidAttributeTargets): New abstract method. It gets
2544         list of valid attribute targets for explicit target declaration.
2545         (Attribute.Target): It holds target itself.
2546         (AttributeSection): Removed.
2547         (Attribute.CheckTargets): New method. It checks whether attribute
2548         target is valid for the current element.
2549
2550         * class.cs:
2551         (EventProperty): New class. For events that are declared like
2552         property (with add and remove accessors).
2553         (EventField): New class. For events that are declared like field.
2554         class.cs
2555
2556         * cs-parser.jay: Implemented explicit attribute target declaration.
2557
2558         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2559         Override ValidAttributeTargets.
2560
2561         * parameter.cs:
2562         (ReturnParameter): Class for applying custom attributes on 
2563         the return type.
2564         (ParameterAtribute): New class. Class for applying custom
2565         attributes on the parameter type.
2566
2567 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
2568
2569         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
2570         definitions. 
2571
2572         (Method): Allow UNSAFE here.
2573
2574         * modifiers.cs: Support unsafe reporting.
2575
2576 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
2577
2578         * decl.cs: Fix bug #58478.
2579
2580 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2581
2582         * statement.cs: When checking for unreachable code on an EmptyStatement,
2583         set the location. Fixes bug #58488.
2584
2585 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
2586
2587         * driver.cs: Add -pkg handling.
2588
2589         From Gonzalo: UseShelLExecute=false
2590
2591 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
2592
2593         * attribute.cs:
2594         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
2595         for attribute.
2596         (Attribute.IsClsCompliaceRequired): Moved to base for better
2597         accesibility.
2598         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
2599         when attribute is AttributeUsageAttribute.
2600         (Attribute.GetValidTargets): Simplified.
2601         (Attribute.GetAttributeUsage): New method returns AttributeUsage
2602         attribute for this type.
2603         (Attribute.ApplyAttributes): Method renamed to Emit and make
2604         non-static.
2605         (GlobalAttributeSection): New class for special handling of global
2606         attributes (assembly, module).
2607         (AttributeSection.Emit): New method.
2608
2609         * class.cs: Implemented Attributable abstract methods.
2610         (MethodCore.LabelParameters): Moved to Parameter class.
2611         (Accessor): Is back simple class.
2612         (PropertyMethod): Implemented Attributable abstract class.
2613         (DelegateMethod): Implemented Attributable abstract class.
2614         (Event): New constructor for disctintion between normal Event
2615         and Event with accessors.
2616
2617         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
2618
2619         * codegen.cs, const.cs, decl.cs, delegate.cs:
2620         (CommonAssemblyModulClass): Implemented Attributable abstract class
2621         and simplified.
2622
2623         * enum.cs: Implement IAttributeSupport interface.
2624         (EnumMember): New class for emum members. Implemented Attributable
2625         abstract class
2626
2627         * parameter.cs:
2628         (ParameterBase): Is abstract.
2629         (ReturnParameter): New class for easier [return:] attribute handling.
2630
2631         * typemanager.cs: Removed builder_to_attr.
2632
2633 2004-05-11  Raja R Harinath  <rharinath@novell.com>
2634
2635         Fix bug #57151.
2636         * attribute.cs (Attribute.GetPositionalValue): New function.
2637         * class.cs (TypeContainer.VerifyMembers): New function.
2638         (TypeContainer.Emit): Use it.
2639         (ClassOrStruct): New base class for Class and Struct.
2640         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
2641         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
2642         class.
2643         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
2644         then each non-static field should have a FieldOffset attribute.
2645         Otherwise, none of the fields should have a FieldOffset attribute.
2646         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
2647         and FieldOffset attributes.
2648         * typemanager.cs (TypeManager.struct_layout_attribute_type)
2649         (TypeManager.field_offset_attribute_type): New core types.
2650         (TypeManager.InitCoreTypes): Initialize them.
2651
2652 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
2653
2654         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
2655         Return correct type.
2656         From bug #58270.
2657
2658 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
2659
2660         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
2661         be implicitly converted to ulong.
2662         
2663         * expression.cs: The logic for allowing operator &, | and ^ worked
2664         was wrong, it worked before because we did not report an error in
2665         an else branch.  Fixes 57895.
2666
2667         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
2668         allow volatile fields to be reference types.
2669
2670 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
2671
2672         * driver.cs: Add support for /debug-
2673
2674 2004-05-07  Raja R Harinath  <rharinath@novell.com>
2675
2676         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
2677         Add a 'complain' parameter to silence errors.
2678         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
2679         silently overlooked type-resolutions.
2680         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
2681         to reflect changes.
2682         (Attributes.Search): New function.
2683         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
2684         (Attributes.GetAttributeFullName): Remove hack.
2685         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
2686         Update to reflect changes.
2687         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
2688         Use Attributes.Search instead of nested loops.
2689
2690 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
2691
2692         * decl.cs:
2693         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
2694         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
2695         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
2696
2697         * report.cs: (Report.Warning): Renamed to Warning_T because of
2698         parameter collision.
2699
2700 2004-05-05  Raja R Harinath  <rharinath@novell.com>
2701
2702         * expression.cs (MemberAccess.ResolveMemberAccess):
2703         Exit with non-zero status after Report.Error.
2704         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
2705         Likewise.
2706         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
2707
2708 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2709
2710         * support.cs: Don't hang when the file is empty.
2711
2712 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2713
2714         * support.cs: In SeekableStreamReader, compute the preamble size of the
2715           underlying stream. Position changes should take into account that initial
2716           count of bytes.
2717
2718 2004-05-03  Todd Berman  <tberman@sevenl.net>
2719
2720         * driver.cs: remove unused GetSysVersion function.
2721
2722 2004-05-03  Todd Berman  <tberman@sevenl.net>
2723
2724         * driver.cs: Remove the hack from saturday, as well as the hack
2725         from jackson (LoadAssemblyFromGac), also adds the CWD to the
2726         link_paths to get that bit proper.
2727
2728 2004-05-01  Todd Berman  <tberman@sevenl.net>
2729
2730         * driver.cs: Try a LoadFrom before a Load, this checks the current
2731         path. This is currently a bug in mono that is be fixed, however, this
2732         provides a workaround for now. This will be removed when the bug
2733         is fixed.
2734
2735 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
2736
2737         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2738         incomplete key pairs (#57941).
2739
2740 2004-05-01  Todd Berman  <tberman@sevenl.net>
2741
2742         * driver.cs: Remove '.' from path_chars, now System.* loads properly
2743         from the GAC
2744
2745 2004-04-30  Jackson Harper  <jackson@ximian.com>
2746
2747         * codegen.cs: Open keys readonly.
2748         
2749 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2750
2751         * typemanager.cs: don't report cyclic struct layout when a struct
2752         contains 2 or more fields of the same type. Failed for Pango.AttrShape
2753         which has 2 Pango.Rectangle fields.
2754
2755 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2756
2757         * expression.cs: Handle IntPtr comparisons with IL code
2758         rather than a method call.
2759
2760 2004-04-29  Martin Baulig  <martin@ximian.com>
2761
2762         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
2763         the list of PropertyInfo's in class hierarchy and find the
2764         accessor.  Fixes #56013.
2765
2766 2004-04-29  Martin Baulig  <martin@ximian.com>
2767
2768         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2769
2770 2004-04-29  Martin Baulig  <martin@ximian.com>
2771
2772         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2773
2774         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2775
2776 2004-04-29  Martin Baulig  <martin@ximian.com>
2777
2778         * class.cs (ConstructorInitializer.Resolve): Check whether the
2779         parent .ctor is accessible.  Fixes #52146.
2780
2781 2004-04-29  Martin Baulig  <martin@ximian.com>
2782
2783         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2784
2785         * statement.cs (Using.EmitLocalVariableDecls): Use
2786         TypeManager.idisposable_type, not typeof (IDisposable).
2787         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2788
2789 2004-04-29  Martin Baulig  <martin@ximian.com>
2790
2791         * class.cs (Event.Define): Don't emit the field and don't set
2792         RTSpecialName and SpecialName for events on interfaces.  Fixes
2793         #57703. 
2794
2795 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2796
2797         Refactor Attribute.ApplyAttributes.
2798         * attribute.cs (Attributable): New base class for objects that can
2799         have Attributes applied on them.
2800         (Attribute): Make AttributeUsage fields public.
2801         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2802         (Attribute.IsInternalCall): New property.
2803         (Attribute.UsageAttr): Convert to a public read-only property.
2804         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2805         (Attribute.ResolveType, Attribute.Resolve)
2806         (Attribute.ScanForIndexerName): Update to reflect changes.
2807         (Attribute.CheckAttributeTarget): Re-format.
2808         (Attribute.ApplyAttributes): Refactor, to various
2809         Attributable.ApplyAttributeBuilder methods.
2810         * decl.cs (MemberCore): Make Attributable.
2811         * class.cs (Accessor): Make Attributable.
2812         (MethodData.ApplyAttributes): Use proper attribute types, not
2813         attribute names.
2814         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2815         (TypeContainer.ApplyAttributeBuilder)
2816         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2817         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2818         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2819         (Operator.ApplyAttributeBuilder): New factored-out methods.
2820         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2821         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2822         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2823         * parameter.cs (ParameterBase): New Attributable base class
2824         that can also represent Return types.
2825         (Parameter): Update to the changes.
2826
2827 2004-04-29  Jackson Harper  <jackson@ximian.com>
2828
2829         * driver.cs: Prefer the corlib system version when looking for
2830         assemblies in the GAC. This is still a hack, but its a better hack
2831         now.
2832         
2833 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2834
2835         * decl.cs, enum.cs: Improved error 3005 reporting.
2836   
2837         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2838         (related_symbols): New private member for list of symbols
2839         related to reported error/warning.
2840         
2841         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2842
2843 2004-04-29  Martin Baulig  <martin@ximian.com>
2844
2845         * ecore.cs (Expression.Constantify): If we're an enum and
2846         TypeManager.TypeToCoreType() doesn't give us another type, use
2847         t.UnderlyingSystemType.  Fixes #56178.  
2848
2849 2004-04-29  Martin Baulig  <martin@ximian.com>
2850
2851         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2852         interfaces and for each interface, only add members directly
2853         declared in that interface.  Fixes #53255.
2854
2855 2004-04-28  Martin Baulig  <martin@ximian.com>
2856
2857         * expression.cs (ConditionalLogicalOperator): Use a temporary
2858         variable for `left' to avoid that we evaluate it more than once;
2859         bug #52588.
2860
2861 2004-04-28  Martin Baulig  <martin@ximian.com>
2862
2863         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2864         `void[]' (CS1547).
2865
2866 2004-04-28  Martin Baulig  <martin@ximian.com>
2867
2868         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2869         void (CS1547).
2870
2871         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2872         whether the type is not void (CS1547).
2873
2874 2004-04-28  Martin Baulig  <martin@ximian.com>
2875
2876         * expression.cs (Unary.DoResolveLValue): Override this and report
2877         CS0131 for anything but Operator.Indirection.
2878
2879 2004-04-28  Martin Baulig  <martin@ximian.com>
2880
2881         Committing a patch from Ben Maurer; see bug #50820.
2882
2883         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2884         check for classes.
2885
2886         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2887         classes.        
2888
2889 2004-04-28  Martin Baulig  <martin@ximian.com>
2890
2891         Committing a patch from Ben Maurer; see bug #50820.
2892
2893         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2894         check for classes.
2895
2896         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2897         classes.        
2898
2899 2004-04-28  Martin Baulig  <martin@ximian.com>
2900
2901         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2902         (Block.AddLabel): Call DoLookupLabel() to only search in the
2903         current block.
2904
2905 2004-04-28  Martin Baulig  <martin@ximian.com>
2906
2907         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2908         comparing StringConstants and NullLiterals in Equality and Inequality.
2909
2910 2004-04-28  Jackson Harper  <jackson@ximian.com>
2911
2912         * driver.cs: Attempt to load referenced assemblies from the
2913         GAC. This is the quick and dirty version of this method that
2914         doesnt take into account versions and just takes the first
2915         canidate found. Will be good enough for now as we will not have more
2916         then one version installed into the GAC until I update this method.
2917
2918 2004-04-28  Martin Baulig  <martin@ximian.com>
2919
2920         * typemanager.cs (TypeManager.CheckStructCycles): New public
2921         static method to check for cycles in the struct layout.
2922
2923         * rootcontext.cs (RootContext.PopulateTypes): Call
2924         TypeManager.CheckStructCycles() for each TypeContainer.
2925         [Note: We only need to visit each type once.]
2926
2927 2004-04-28  Martin Baulig  <martin@ximian.com>
2928
2929         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2930
2931         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2932         success and added `out object value'.  Use a `bool resolved' field
2933         to check whether we've already been called rather than
2934         `ConstantValue != null' since this breaks for NullLiterals.
2935
2936 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2937
2938         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2939         setting of this flag, since the 'set' method may be non-public.
2940
2941 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2942
2943         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2944         check on current_vector.Block.
2945
2946 2004-04-27  Martin Baulig  <martin@ximian.com>
2947
2948         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2949         a field initializer.  Fixes #56459.
2950
2951 2004-04-27  Martin Baulig  <martin@ximian.com>
2952
2953         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2954         we're not attempting to use an indexer.  Fixes #52154.
2955
2956 2004-04-27  Martin Baulig  <martin@ximian.com>
2957
2958         * statement.cs (Return): Don't create a return label if we don't
2959         need it; reverts my change from January 20th.  Thanks to Ben
2960         Maurer for this.
2961
2962 2004-04-27  Martin Baulig  <martin@ximian.com>
2963
2964         According to the spec, `goto' can only leave a nested scope, but
2965         never enter it.
2966
2967         * statement.cs (Block.LookupLabel): Only lookup in the current
2968         block, don't recurse into parent or child blocks.
2969         (Block.AddLabel): Check in parent and child blocks, report
2970         CS0140/CS0158 if we find a duplicate.
2971         (Block): Removed this indexer for label lookups.
2972         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2973         this already does the error reporting for us.
2974
2975         * flowanalysis.cs
2976         (FlowBranching.UsageVector.Block): New public variable; may be null.
2977         (FlowBranching.CreateSibling): Added `Block' argument.
2978         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2979         label for the target of a `goto' and check whether we're not
2980         leaving a `finally'.
2981
2982 2004-04-27  Martin Baulig  <martin@ximian.com>
2983
2984         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2985         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2986         just for returns).
2987
2988 2004-04-27  Martin Baulig  <martin@ximian.com>
2989
2990         * statement.cs (Block.AddLabel): Also check for implicit blocks
2991         and added a CS0158 check.
2992
2993 2004-04-27  Martin Baulig  <martin@ximian.com>
2994
2995         * flowanalysis.cs (FlowBranchingLoop): New class.
2996         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2997         UsageVector's instead of an ArrayList.
2998         (FlowBranching.Label): Likewise.
2999         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3000         (FlowBranching.AddBreakVector): New method.
3001
3002 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3003
3004         * attribute.cs: Small regression fix: only convert the type if we
3005         the type is different, fixes System.Drawing build.
3006
3007 2004-04-27  Martin Baulig  <martin@ximian.com>
3008
3009         * attribute.cs (Attribute.Resolve): If we have a constant value
3010         for a named field or property, implicity convert it to the correct
3011         type.
3012
3013 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3014
3015         * statement.cs (Block.Block): Implicit blocks share
3016         'child_variable_names' fields with parent blocks.
3017         (Block.AddChildVariableNames): Remove.
3018         (Block.AddVariable): Mark variable as "used by a child block" in
3019         every surrounding block.
3020         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3021         been used in a child block, complain about violation of "Invariant
3022         meaning in blocks" rule.
3023         * cs-parser.jay (declare_local_variables): Don't use
3024         AddChildVariableNames.
3025         (foreach_statement): Don't create an implicit block: 'foreach'
3026         introduces a scope.
3027
3028 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3029
3030         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3031         converting from 0L to ulong.  Fixes 57522.
3032
3033 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3034
3035         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3036         derived class hides via 'new' keyword field from base class (test-242.cs).
3037         TODO: Handle this in the more general way.
3038         
3039         * class.cs (CheckBase): Ditto.
3040
3041 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3042
3043         * decl.cs (caching_flags): New member for storing cached values
3044         as bit flags.
3045         (MemberCore.Flags): New enum where bit flags for caching_flags
3046         are defined.
3047         (MemberCore.cls_compliance): Moved to caching_flags.
3048         (DeclSpace.Created): Moved to caching_flags.
3049
3050         * class.cs: Use caching_flags instead of DeclSpace.Created
3051         
3052 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3053
3054         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3055         if we are only a derived class, not a nested class.
3056
3057         * typemanager.cs: Same as above, but do this at the MemberLookup
3058         level (used by field and methods, properties are handled in
3059         PropertyExpr).   Allow for the qualified access if we are a nested
3060         method. 
3061
3062 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3063
3064         * class.cs: Refactoring.
3065         (IMethodData): New inteface; Holds links to parent members
3066         to avoid member duplication (reduced memory allocation).
3067         (Method): Implemented IMethodData interface.
3068         (PropertyBase): New inner classes for get/set methods.
3069         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3070         (Event): New inner classes for add/remove methods.
3071         (Event.DelegateMethod): Implemented IMethodData interface.
3072
3073         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3074         EmitContext (related to class.cs refactoring).
3075
3076 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3077
3078         * delegate.cs (Delegate.VerifyApplicability): If the number of
3079         arguments are the same as the number of parameters, first try to
3080         verify applicability ignoring  any 'params' modifier on the last
3081         parameter.
3082         Fixes #56442.
3083
3084 2004-04-08  Martin Baulig  <martin@ximian.com>
3085
3086         Merged latest changes into gmcs.  Please keep this comment in
3087         here, it makes it easier for me to see what changed in MCS since
3088         the last time I merged.
3089
3090 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3091
3092         * class.cs (TypeContainer.AddIndexer): Use
3093         'ExplicitInterfaceName' to determine if interface name was
3094         explicitly specified.  'InterfaceType' is not initialized at this time.
3095         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3096         Indexers array is already in the required order.  Initialize
3097         'IndexerName' only if there are normal indexers.
3098         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3099         (TypeContainer.Emit): Emit DefaultMember attribute only if
3100         IndexerName is initialized.
3101         Fixes #56300.
3102
3103 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3104
3105         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3106         Fixes #57007
3107
3108 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3109
3110         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3111         attributes.
3112         Fix for #56456.
3113
3114         * attribute.cs (Attribute.Resolve): Check for duplicate named
3115         attributes.
3116         Fix for #56463.
3117
3118 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3119
3120         * iterators.cs (MarkYield): track whether we are in an exception,
3121         and generate code accordingly.  Use a temporary value to store the
3122         result for our state.
3123
3124         I had ignored a bit the interaction of try/catch with iterators
3125         since their behavior was not entirely obvious, but now it is
3126         possible to verify that our behavior is the same as MS .NET 2.0
3127
3128         Fixes 54814
3129
3130 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3131
3132         * iterators.cs: Avoid creating temporaries if there is no work to
3133         do. 
3134
3135         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3136         Enumerations, use TypeManager.EnumToUnderlying and call
3137         recursively. 
3138
3139         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3140         bug #57013
3141
3142         (This.Emit): Use EmitContext.EmitThis to emit our
3143         instance variable.
3144
3145         (This.EmitAssign): Ditto.
3146
3147         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3148         codepaths, we will move all the functionality into
3149         Mono.CSharp.This 
3150
3151         (FieldExpr.EmitAssign): Ditto.
3152
3153         This fixes several hidden bugs that I uncovered while doing a code
3154         review of this today.
3155
3156         * codegen.cs (EmitThis): reworked so the semantics are more clear
3157         and also support value types "this" instances.
3158
3159         * iterators.cs: Changed so that for iterators in value types, we
3160         do not pass the value type as a parameter.  
3161
3162         Initialization of the enumerator helpers is now done in the caller
3163         instead of passing the parameters to the constructors and having
3164         the constructor set the fields.
3165
3166         The fields have now `assembly' visibility instead of private.
3167
3168 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3169
3170         * expression.cs (Argument.Resolve): Check if fields passed as ref
3171         or out are contained in a MarshalByRefObject.
3172
3173         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3174         another compiler type.
3175
3176 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3177
3178         * class.cs (Indexer.Define): use the new name checking method.
3179         Also, return false on an error.
3180         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3181         (is_identifier_[start/part]_character): make static.
3182
3183 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3184
3185         * expression.cs (Binary.ResolveOperator): Do no append strings
3186         twice: since we can be invoked more than once (array evaluation)
3187         on the same concatenation, take care of this here.  Based on a fix
3188         from Ben (bug #56454)
3189
3190 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3191
3192         * codegen.cs: Fix another case where CS1548 must be reported (when 
3193         delay-sign isn't specified and no private is available #56564). Fix
3194         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3195         error when MCS is used on the MS runtime and we need to delay-sign 
3196         (which seems unsupported by AssemblyBuilder - see #56621).
3197
3198 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3199
3200         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3201         (TypeManager.ComputeNamespaces): Faster implementation for
3202         Microsoft runtime.
3203
3204         * compiler.csproj: Updated AssemblyName to mcs.
3205
3206 2004-05-11  Jackson Harper  <jackson@ximian.com>
3207
3208         * Makefile: Preserve MONO_PATH
3209         
3210 2004-05-11  Jackson Harper  <jackson@ximian.com>
3211
3212         * Makefile: Use mono and mcs to build gmcs
3213         
3214 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
3215
3216         * codegen.cs: Add patch from Robert Shade
3217         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
3218         sync with mcs.
3219
3220 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
3221
3222         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3223         incomplete key pairs (#57941).
3224
3225 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3226
3227         * codegen.cs: Fix another case where CS1548 must be reported (when 
3228         delay-sign isn't specified and no private is available #56564). Fix
3229         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3230         error when MCS is used on the MS runtime and we need to delay-sign 
3231         (which seems unsupported by AssemblyBuilder - see #56621).
3232
3233 2004-04-29  Jackson Harper  <jackson@ximian.com>
3234
3235         * Makefile: Set MONO_PATH to use the bootstrap corlib
3236         * driver.cs: Check the GAC for referenced assemblies.
3237                 
3238 2004-04-29  Martin Baulig  <martin@ximian.com>
3239
3240         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
3241
3242 2004-04-07  Martin Baulig  <martin@ximian.com>
3243
3244         * expression.cs (Binary.ResolveOperator): Added special case for
3245         Equality/Inequality between a type parameter and a null literal.
3246
3247 2004-04-07  Martin Baulig  <martin@ximian.com>
3248
3249         * convert.cs: Check null literal -> type parameter conversions.
3250
3251 2004-04-07  Martin Baulig  <martin@ximian.com>
3252
3253         * generic.cs (ConstructedType.CheckConstraints): Enforce the
3254         `class' and `struct' constraints.
3255
3256 2004-04-07  Martin Baulig  <martin@ximian.com>
3257
3258         * generic.cs (SpecialConstraint): New public enum.
3259         (Constraints.Resolve): Added support for the `class' and `struct'
3260         constraints.
3261
3262         * cs-parser.jay (type_parameter_constraint): Added support for the
3263         `class' and `struct' constraints.
3264
3265 2004-04-07  Martin Baulig  <martin@ximian.com>
3266
3267         * support.cs (GenericConstraints): Replaced `Types' by
3268         `ClassConstraint' and `InterfaceConstraints'; added
3269         `HasClassConstraint'.   
3270
3271 2004-04-07  Martin Baulig  <martin@ximian.com>
3272
3273         * generic.cs
3274         (Constraints.InterfaceConstraints): New public property.
3275         (Constraints.Types): Make this property public
3276         (TypeParameter): Implement IMemberContainer.
3277         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
3278         instead of a TypeBuilder/MethodBuilder; pass the interface
3279         constraints to TypeManager.AddTypeParameter().
3280         (TypeParameter.DefineType): Just take an EmitContext and no
3281         TypeBuilder/MethodBuilder.  Use the new public API.
3282
3283         * typemanager.cs (TypeManager.AddTypeParameter): Added
3284         `TypeExpr[]' argument; add the interfaces to the
3285         `builder_to_ifaces' hash.
3286         (TypeManager.LookupMemberContainer): For
3287         GenericTypeParameterBuilders, get the TypeParameter from the
3288         `builder_to_type_param'.
3289         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
3290         the TypeParameter and call FindMembers on it.
3291
3292 2004-04-07  Martin Baulig  <martin@ximian.com>
3293
3294         * class.cs
3295         (MethodCore.GenericMethod): Moved this field here from Method.
3296         (MethodCore.IsDuplicateImplementation): Take the number of type
3297         parameters into account if we're a generic method.
3298
3299         * expression.cs (Invocation.InferTypeArguments): Don't return true
3300         if `arguments' is null; we still need to check whether we actually
3301         don't need to infer anything in this case.
3302         (MemberAccess): Merged the functionality from GenericMemberAccess
3303         into this class.
3304
3305         * generic.cs (GenericMemberAccess): Removed.
3306
3307 2004-04-05  Martin Baulig  <martin@ximian.com>
3308
3309         * decl.cs (MemberCore): For generic classes, interfaces and
3310         structs, `Name' now includes the number of type parameters
3311         ("Stack!1.Node!1").
3312         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
3313         encode the number of type arguments in the type name.
3314
3315         * expression.cs (Expression.MemberLookup): Removed the
3316         `num_type_args' argument; we now encode the number of type
3317         arguments in the type name.
3318
3319         * ecore.cs (SimpleName): Encode the number of type arguments in
3320         the type name itself.
3321
3322         * generic.cs (ConstructedType): Likewise.
3323
3324         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
3325         `MemberName'; we now include the number of type parameters in the
3326         type name.
3327
3328         * typemanager.cs (TypeManager.CheckGeneric): Removed.
3329         (TypeManager.MemberLookup): Removed the
3330         `num_type_args' argument; we now encode the number of type
3331         arguments in the type name.     
3332
3333 2004-04-03  Martin Baulig  <martin@ximian.com>
3334
3335         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
3336         (MemberCore.MemberName): Moved here from MemberBase.
3337         (DeclSpace.SetParameterInfo): Just take the constraints as an
3338         ArrayList; we already have the type parameters in our
3339         `MemberName'; also do the CS0080 reporting here.
3340
3341         * cs-parser.jay (struct_declaration): Use `member_name' instead of
3342         `IDENTIFIER opt_type_parameter_list'; when constructing our
3343         `MemberName', it'll already include our type parameters.
3344         (class_declaration, interface_declaration): Likewise.
3345         (delegate_declaration): Likewise.
3346         (MakeName): Take a MemberName and return a MemberName.
3347         The following two changes are required to avoid shift/reduce conflicts:
3348         (member_name): Don't include a TypeName anymore; ie. this is now
3349         just 'IDENTIFIER opt_type_parameter_list'.
3350         (property_declaration, event_declaration): Use a
3351         `namespace_or_type_name' instead of a `member_name'.            
3352
3353 2004-04-03  Martin Baulig  <martin@ximian.com>
3354
3355         * decl.cs (MemberName): Renamed to `TypeName' and created a new
3356         `MemberName' class.
3357         (TypeName): Formerly known as MemberName.
3358
3359         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
3360         instead of a `MemberName'.
3361
3362         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
3363         (member_name): New rule; create a MemberName.
3364
3365 2004-04-02  Martin Baulig  <martin@ximian.com>
3366
3367         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
3368         (CS0305 and CS0308).
3369
3370 2004-04-02  Martin Baulig  <martin@ximian.com>
3371
3372         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
3373         support for nested types.
3374
3375 2004-04-02  Martin Baulig  <martin@ximian.com>
3376
3377         * ecore.cs (IAlias): New public interface.
3378         (TypeExpr, TypeExpression): Implement IAlias.
3379         (TypeAliasExpression): New public class.
3380
3381         * namespace.cs (Namespace): Implement IAlias.
3382         (Namespace.Lookup): Return an IAlias instead on an object.
3383         (Namespace.DefineName): Take an IAlias instead of an object.
3384         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
3385         an object.
3386         (NamespaceEntry.UsingAlias): Take a Membername instead of an
3387         Expression.
3388         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
3389         object.
3390         (NamespaceEntry.Lookup): Likewise.
3391
3392         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
3393         instead of a Type.      
3394
3395         * decl.cs (DeclSpace): Implement IAlias.
3396         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
3397
3398         * generic.cs (ConstructedType): Improved error checking.
3399
3400 2004-04-02  Martin Baulig  <martin@ximian.com>
3401
3402         * convert.cs: Added type parameter conversions.
3403
3404         * ecore.cs
3405         (UnboxCast.Emit): Emit an `unbox.any' for type params.
3406         (ClassCast.Emit): If the source type is a type parameter, box it.
3407         If the target type is a type parameter, emit an `unbox.any'
3408         instead of a `classcast'.1      
3409
3410 2004-04-01  Martin Baulig  <martin@ximian.com>
3411
3412         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
3413
3414 2004-04-01  Martin Baulig  <martin@ximian.com>
3415
3416         * generic.cs (ConstructedType.CheckConstraints): Use
3417         Convert.ImplicitStandardConversionExists(); user-defined implicit
3418         conversions are not allowed according to the spec.
3419
3420 2004-03-30  Martin Baulig  <martin@ximian.com>
3421
3422         * expression.cs (New): Added support for type parameters.
3423
3424         * typemanager.cs
3425         (TypeManager.activator_type): New public static field.
3426         (TypeManager.activator_create_instance): Likewise.
3427
3428 2004-03-30  Martin Baulig  <martin@ximian.com>
3429
3430         * typemanager.cs (TypeManager.HasConstructorConstraint): New
3431         public method.
3432
3433 2004-03-30  Martin Baulig  <martin@ximian.com>
3434
3435         * generic.cs (ConstructedType.CheckConstraints): Actually follow
3436         the spec here: the argument type must be convertible to the
3437         constraints.
3438
3439 2004-03-30  Martin Baulig  <martin@ximian.com>
3440
3441         * generic.cs
3442         (TypeParameter.Define, TypeParameter.DefineMethod): Call
3443         TypeManager.AddTypeParameter().
3444         (ConstructedType.CheckConstraints): Re-enable this and actually
3445         check whether we have a constructor constraint.
3446
3447         * typemanager.cs
3448         (TypeManager.builder_to_type_param): New static field.
3449         (TypeManager.AddTypeParameter): New static method.
3450         (TypeManager.LookupTypeParameter): New public method.
3451
3452 2004-03-30  Martin Baulig  <martin@ximian.com>
3453
3454         * generic.cs (TypeParameter.DefineType): Return a boolean and use
3455         the new API to actually define the constructor constraint.
3456
3457         * typemanager.cs
3458         (TypeManager.new_constraint_attr_type): New static field.
3459         (TypeManager.InitCoreTypes): Initialize it.
3460
3461 2004-03-30  Martin Baulig  <martin@ximian.com>
3462
3463         * generic.cs (Constraints): Completed error checking, use correct
3464         error numbers.
3465
3466 2004-03-29  Martin Baulig  <martin@ximian.com>
3467
3468         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
3469
3470         * expression.cs (Invocation.InferTypeArguments): Added overloaded
3471         public version which takes a `ParameterData pd' instead of an
3472         `ArrayList args'.
3473
3474 2004-03-29  Martin Baulig  <martin@ximian.com>
3475
3476         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
3477         not a MethodInfo.       
3478
3479 2004-03-29  Martin Baulig  <martin@ximian.com>
3480
3481         * expression.cs (Argument.ResolveMethodGroup): If we're a
3482         ConstructedType, call GetMemberAccess() on it.  
3483
3484 2004-03-29  Martin Baulig  <martin@ximian.com>
3485
3486         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
3487         (MethodCore.CheckGenericOverride): When overriding a generic
3488         method, check whether the constraints match.
3489
3490         * support.cs (GenericConstraints): New public interface.
3491         (ParameterData.GenericConstraints): New public method.
3492
3493         * parameter.cs (Parameter.Resolve): Check whether we're a generic
3494         method parameter and compute our constraints if appropriate.
3495         (Parameter.GenericConstraints): New public property.
3496
3497         * generic.cs (Constraints): Implement GenericConstraints.
3498
3499 2004-03-29  Martin Baulig  <martin@ximian.com>
3500
3501         * decl.cs (MemberCache.FindMemberToOverride): Use
3502         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
3503
3504 2004-03-29  Martin Baulig  <martin@ximian.com>
3505
3506         * generic.cs (GenericMethod.Define): Resolve our type parameters.
3507
3508 2004-03-29  Martin Baulig  <martin@ximian.com>
3509
3510         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
3511         not allowed on non-generic declarations").
3512
3513 2004-03-29  Martin Baulig  <martin@ximian.com>
3514
3515         * expression.cs (Invocation.InferTypeArguments): Added overloaded
3516         public version of this method.
3517
3518         * class.cs (MethodCore.IsDuplicateImplementation): Use
3519         Invocation.InferTypeArguments() to check this.
3520
3521 2004-03-29  Martin Baulig  <martin@ximian.com>
3522
3523         * convert.cs: Use TypeManager.IsDelegateType() instead of
3524         comparing types correctly.
3525
3526 2004-03-29  Martin Baulig  <martin@ximian.com>
3527
3528         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
3529         types directly to make it work for generic instances.
3530
3531         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
3532
3533 2004-03-29  Martin Baulig  <martin@ximian.com>
3534
3535         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
3536         support for arrays.     
3537
3538 2004-03-24  Martin Baulig  <martin@ximian.com>
3539
3540         * decl.cs (DeclSpace.FindType): Also use
3541         TypeManager.CheckGeneric() for types from the using clauses.
3542
3543 2004-03-23  Martin Baulig  <martin@ximian.com>
3544
3545         * expression.cs (Invocation.OverloadResolve): Added `bool
3546         may_fail' argument and use it instead of the Location.IsNull() hack.
3547
3548 2004-03-23  Martin Baulig  <martin@ximian.com>
3549
3550         * expression.cs (Invocation.InferType): Use correct type inference
3551         rules here.     
3552
3553 2004-03-23  Martin Baulig  <martin@ximian.com>
3554
3555         * ecore.cs (MethodGroupExpr.Name): Use
3556         TypeManager.CSharpSignature() instead of just the name.
3557
3558         * expression.cs (Invocation.OverloadResolve): Provide better error
3559         reporting.
3560         (Invocation.DoResolve): OverloadResolve() never returns null
3561         without reporting an error, so removed the error -6 reporting here.
3562
3563 2004-03-23  Martin Baulig  <martin@ximian.com>
3564
3565         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
3566         generic methods.
3567
3568         * cs-parser.jay (delegate_declaration): Support generic delegates.
3569
3570         * delegate.cs: Support generic delegates.
3571
3572 2004-03-22  Martin Baulig  <martin@ximian.com>
3573
3574         * expression.cs (Invocation.InferParamsTypeArguments): New static
3575         method; does type inference for params arguments.
3576
3577 2004-03-21  Martin Baulig  <martin@ximian.com>
3578
3579         * typemanager.cs (TypeManager.IsGenericMethod): New public static
3580         method; checks whether a method is a generic method.    
3581
3582         * expression.cs (Invocation.InferTypeArguments): New static method;
3583         infer type arguments for generic method invocation.
3584
3585         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
3586         property; we set this to true if we're resolving a generic method
3587         invocation and the user specified type arguments, ie. we're not
3588         doing type inference.
3589
3590 2004-03-20  Martin Baulig  <martin@ximian.com>
3591
3592         * class.cs (MethodData.DeclaringType): New public property.
3593         (MethodData.Define): Set DeclaringType here.
3594         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
3595         instead of OperatorMethodBuilder.DeclaringType.
3596
3597 2004-03-20  Martin Baulig  <martin@ximian.com>
3598
3599         * cs-tokenizer.cs (xtoken): Return a special
3600         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
3601
3602         * cs-parser.jay (default_value_expression): Switch to the new
3603         syntax (14.5.13).
3604
3605 2004-03-19  Martin Baulig  <martin@ximian.com>
3606
3607         * decl.cs (MemberName): New class.  We use this to "construct"
3608         namespace_or_type_name's.
3609
3610         * generics.cs (TypeArguments.GetDeclarations): New public method;
3611         returns the type arguments as a string[] and reports a CS0081 if
3612         one of them is not an identifier.
3613
3614         * class.cs (MemberBase): The .ctor now takes the name as a
3615         MemberName instead of a string.
3616         (MemberBase.ExplicitInterfaceName): Changed type from string to
3617         Expression.
3618         (MemberBase.DoDefine): If we're an explicit implementation, the
3619         InterfaceType may be a generic instance.
3620
3621         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
3622         (namespace_name): Call MemberName.GetName () to transform the
3623         MemberName into a string and ensure we don't have any type
3624         arguments.
3625         (type_name): Call MemberName.GetTypeExpression() to transfrom the
3626         MemberName into an expression.
3627         (method_header): Use namespace_or_type_name instead of member_name.     
3628
3629 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3630
3631         * rootcontext.cs: Add new types to the boot resolution.
3632
3633         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3634         MulticastDelegate is not allowed.
3635
3636         * typemanager.cs: Add new types to lookup: System.TypedReference
3637         and ArgIterator.
3638
3639         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3640         check for TypedReference or ArgIterator, they are not allowed. 
3641
3642         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3643         makes us properly catch 1510 in some conditions (see bug 56016 for
3644         details). 
3645
3646 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3647
3648         * CryptoConvert.cs: update from corlib version
3649         with endian fixes.
3650
3651 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3652
3653         * class.cs (Indexer.Define): Check indexername declaration
3654
3655 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3656
3657         * attribute.cs (IsClsCompliant): Fixed problem with handling
3658         all three states (compliant, not-compliant, undetected).
3659
3660 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3661
3662         * attribute.cs (Attribute): Location is now public.
3663         (Resolve): Store resolved arguments (pos_values) in attribute class.
3664         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3665         (GetClsCompliantAttributeValue): New method that gets
3666         CLSCompliantAttribute value.
3667         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3668         if exists else null.
3669         (AttributeTester): New class for CLS-Compliant verification routines.
3670
3671         * class.cs (Emit): Add CLS-Compliant verification.
3672         (Method.GetSignatureForError): Implemented.
3673         (Constructor.GetSignatureForError): Implemented
3674         (Constructor.HasCompliantArgs): Returns if constructor has
3675         CLS-Compliant arguments.
3676         (Constructor.Emit): Override.
3677         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3678         is needed to test only parameters.
3679         (FieldBase.GetSignatureForError): Implemented.
3680         (TypeContainer): New member for storing base interfaces.
3681         (TypeContainer.FindMembers): Search in base interfaces too.
3682
3683         * codegen.cs (GetClsComplianceAttribute): New method that gets
3684         assembly or module CLSCompliantAttribute value.
3685         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3686         for assembly.
3687         (ModuleClass.Emit): Add error 3012 test.
3688
3689         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3690
3691         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3692         state for all decl types.
3693         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3694         if CLS-Compliant tests are required.
3695         (IsClsCompliaceRequired): New method. Analyze whether code
3696         must be CLS-Compliant.
3697         (IsExposedFromAssembly): New method. Returns true when MemberCore
3698         is exposed from assembly.
3699         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3700         value or gets cached value.
3701         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3702         is explicitly marked with CLSCompliantAttribute.
3703         (IsIdentifierClsCompliant): New abstract method. This method is
3704         used to testing error 3005.
3705         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3706         for identifier and parameters CLS-Compliant testing.
3707         (VerifyClsCompliance): New method. The main virtual method for
3708         CLS-Compliant verifications.
3709         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3710         null. I don't know why is null (too many public members !).
3711         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3712         and get value of first CLSCompliantAttribute that found.
3713
3714         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3715         (VerifyClsCompliance): Override and add extra tests.
3716
3717         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3718         clscheck- disable CLS-Compliant verification event if assembly is has
3719         CLSCompliantAttribute(true).
3720
3721         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3722         ApllyAttribute is now called in emit section as in the other cases.
3723         Possible future Emit integration.
3724         (IsIdentifierClsCompliant): New override.
3725         (VerifyClsCompliance): New override.
3726         (GetEnumeratorName): Returns full enum name.
3727
3728         * parameter.cs (GetSignatureForError): Implemented.
3729
3730         * report.cs (WarningData): New struct for Warning message information.
3731         (LocationOfPreviousError): New method.
3732         (Warning): New method. Reports warning based on the warning table.
3733         (Error_T): New method. Reports error based on the error table.
3734
3735         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3736         verifications are done here.
3737
3738         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3739
3740         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3741         CLSCompliantAttribute.
3742         (all_imported_types): New member holds all imported types from other
3743         assemblies.
3744         (LoadAllImportedTypes): New method fills static table with exported types
3745         from all referenced assemblies.
3746         (Modules): New property returns all assembly modules.
3747
3748 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3749
3750         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3751         throwing a parser error.
3752
3753         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3754         which removes the hardcoded get_/set_ prefixes for properties, as
3755         IL allows for the properties to be named something else.  
3756
3757         Bug #56013
3758
3759         * expression.cs: Do not override operand before we know if it is
3760         non-null.  Fix 56207
3761
3762 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3763
3764         * typemanager.cs: support for pinned variables.
3765
3766 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3767
3768         * decl.cs, typemanager.cs: Avoid using an arraylist
3769         as a buffer if there is only one result set.
3770
3771 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3772
3773         * expression.cs: Make sure you cant call a static method
3774         with an instance expression, bug #56174.
3775
3776 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3777
3778         * class.cs (IsDuplicateImplementation): Improve error reporting to
3779         flag 663 (method only differs in parameter modifier).
3780
3781         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3782         in preprocessor directives.
3783
3784         * location.cs (LookupFile): Allow for the empty path.
3785
3786         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3787         better approach for some of that patch, but its failing with the
3788         CharSet enumeration.  For now try/catch will do.
3789
3790         * typemanager.cs: Do not crash if a struct does not have fields.
3791         Fixes 56150.
3792
3793 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3794
3795         * expression.cs: cs0213, cant fix a fixed expression.
3796         fixes 50231.
3797
3798 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3799
3800         * cs-parser.jay: detect invalid embeded statements gracefully.
3801         bug #51113.
3802
3803 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3804
3805         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3806         As a regex:
3807         s/
3808         the invocation type may not be a subclass of the tye of the item/
3809         The type of the item must be a subclass of the invocation item.
3810         /g
3811
3812         Fixes bug #50820.
3813
3814 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3815
3816         * attribute.cs: Added methods to get a string and a bool from an
3817         attribute. Required to information from AssemblyKeyFileAttribute,
3818         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3819         * codegen.cs: Modified AssemblyName creation to include support for
3820         strongnames. Catch additional exceptions to report them as CS1548.
3821         * compiler.csproj: Updated include CryptoConvert.cs.
3822         * compiler.csproj.user: Removed file - user specific configuration.
3823         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3824         Mono.Security assembly. The original class is maintained and tested in
3825         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3826         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3827         like CSC 8.0 (C# v2) supports.
3828         * Makefile: Added CryptoConvert.cs to mcs sources.
3829         * rootcontext.cs: Added new options for strongnames.
3830
3831 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3832
3833         * driver.cs: For --expect-error, report error code `2'
3834         if the program compiled with no errors, error code `1' if
3835         it compiled with an error other than the one expected.
3836
3837 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3838
3839         * compiler.csproj: Updated for Visual Studio .NET 2003.
3840         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3841         * compiler.sln: Updated for Visual Studio .NET 2003.
3842
3843 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3844
3845         * expression.cs: Fix bug #47234. We basically need to apply the
3846         rule that we prefer the conversion of null to a reference type
3847         when faced with a conversion to 'object' (csc behaviour).
3848
3849 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3850
3851         * statement.cs: Shorter form for foreach, eliminates
3852         a local variable. r=Martin.
3853
3854 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3855
3856         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3857         checks if we can use brtrue/brfalse to test for 0.
3858         * expression.cs: use the above in the test for using brtrue/brfalse.
3859         cleanup code a bit.
3860
3861 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3862
3863         * expression.cs: Rewrite string concat stuff. Benefits:
3864
3865         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3866         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3867         rather than a concat chain.
3868
3869         * typemanager.cs: Add lookups for more concat overloads.
3870
3871 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3872
3873         * expression.cs: Emit shorter il code for array init.
3874
3875         newarr
3876         dup
3877         // set 1
3878
3879         // set 2
3880
3881         newarr
3882         stloc.x
3883
3884         ldloc.x
3885         // set 1
3886
3887         ldloc.x
3888         // set 2
3889
3890 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3891
3892         * statement.cs: Before, two switch blocks would be merged if the
3893         total size of the blocks (end_item - begin_item + 1) was less than
3894         two times the combined sizes of the blocks.
3895
3896         Now, it will only merge if after the merge at least half of the
3897         slots are filled.
3898
3899         fixes 55885.
3900
3901 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3902
3903         * class.cs : csc build fix for GetMethods(). See bug #52503.
3904
3905 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3906
3907         * expression.cs: Make sure fp comparisons work with NaN.
3908         This fixes bug #54303. Mig approved this patch a long
3909         time ago, but we were not able to test b/c the runtime
3910         had a related bug.
3911
3912 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3913
3914         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3915
3916 2004-03-19  Martin Baulig  <martin@ximian.com>
3917
3918         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
3919         two overloads may unify for some type parameter substitutions and
3920         report a CS0408 if appropriate.
3921
3922 2004-03-19  Martin Baulig  <martin@ximian.com>
3923
3924         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3925         error here and not in our caller.
3926
3927 2004-03-19  Martin Baulig  <martin@ximian.com>
3928
3929         * interface.cs: Completely killed this file.
3930         (Interface): We're now a TypeContainer and live in class.cs.
3931
3932         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3933         argument; we're now also called for interfaces.
3934         (TypeContainer.DefineMembers): Allow this method being called
3935         multiple times.
3936         (TypeContainer.GetMethods): New public method; formerly known as
3937         Interface.GetMethod().  This is used by PendingImplementation.
3938         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3939         it's now private and non-static.
3940         (Interface): Moved this here; it's now implemented similar to
3941         Class and Struct.
3942         (Method, Property, Event, Indexer): Added `bool is_interface'
3943         argument to their .ctor's.
3944         (MemberBase.IsInterface): New public field.
3945
3946         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3947         instances instead of InterfaceMethod, InterfaceProperty, etc.
3948         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3949         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3950
3951 2004-03-19  Martin Baulig  <martin@ximian.com>
3952
3953         * class.cs (MethodCore.IsDuplicateImplementation): New private
3954         method which does the CS0111 checking.
3955         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3956         Use IsDuplicateImplementation().
3957
3958 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3959
3960         * decl.cs (FindMemberToOverride): New method to find the correct
3961         method or property to override in the base class.
3962         * class.cs
3963             - Make Method/Property use the above method to find the
3964               version in the base class.
3965             - Remove the InheritableMemberSignatureCompare as it is now
3966               dead code.
3967
3968         This patch makes large code bases much faster to compile, as it is
3969         O(n) rather than O(n^2) to do this validation.
3970
3971         Also, it fixes bug 52458 which is that nested classes are not
3972         taken into account when finding the base class member.
3973
3974         Reviewed/Approved by Martin.
3975
3976 2004-03-17  Martin Baulig  <martin@ximian.com>
3977
3978         * expression.cs (MemberAccess.DoResolve): Take the parent's number
3979         of type arguments into account; use the `real_num_type_args'
3980         approach like in DoResolveAsTypeStep().
3981
3982         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
3983         nested types.
3984
3985 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3986
3987         * interface.cs: In all interface classes removed redundant
3988         member initialization.
3989
3990 2004-03-16  Martin Baulig  <martin@ximian.com>
3991
3992         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3993
3994 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3995
3996         * decl.cs (DefineTypeAndParents): New helper method to define a
3997         type's containers before the type itself is defined;  This is a
3998         bug exposed by the recent changes to Windows.Forms when an
3999         implemented interface was defined inside a class that had not been
4000         built yet.   
4001
4002         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4003
4004         (Check): Loop correctly to report errors modifiers
4005         (UNSAFE was not in the loop, since it was the same as TOP).
4006
4007         * interface.cs: Every interface member now takes a ModFlags,
4008         instead of a "is_new" bool, which we set on the base MemberCore. 
4009
4010         Every place where we called "UnsafeOk" in the interface, now we
4011         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4012         the unsafe settings from the member declaration instead of the
4013         container interface. 
4014
4015         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4016
4017         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4018         `set_indexer_name' to the pending bits (one per type).
4019
4020         We fixed a bug today that was picking the wrong method to
4021         override, since for properties the existing InterfaceMethod code
4022         basically ignored the method name.  Now we make sure that the
4023         method name is one of the valid indexer names.
4024
4025 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4026  
4027         * support.cs (SeekableStreamReader): Keep track of stream byte
4028         positions and don't mix them with character offsets to the buffer.
4029
4030         Patch from Gustavo Giráldez
4031
4032 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4033
4034         * interface.cs (InterfaceSetGetBase): Removed double member
4035         initialization, base class does it as well.
4036
4037 2004-03-13  Martin Baulig  <martin@ximian.com>
4038
4039         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4040         when compiling corlib.
4041
4042 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4043
4044         * convert.cs (ExplicitConversion): We were reporting an error on
4045         certain conversions (object_type source to a value type, when the
4046         expression was `null') before we had a chance to pass it through
4047         the user defined conversions.
4048
4049         * driver.cs: Replace / and \ in resource specifications to dots.
4050         Fixes 50752
4051
4052         * class.cs: Add check for duplicate operators.  Fixes 52477
4053
4054 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4055
4056         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4057         that are in the middle of the statements, not only at the end.
4058         Fixes #54987
4059
4060         * class.cs (TypeContainer.AddField): No longer set the
4061         `HaveStaticConstructor' flag, now we call it
4062         `UserDefineStaticConstructor' to diferentiate the slightly
4063         semantic difference.
4064
4065         The situation is that we were not adding BeforeFieldInit (from
4066         Modifiers.TypeAttr) to classes that could have it.
4067         BeforeFieldInit should be set to classes that have no static
4068         constructor. 
4069
4070         See:
4071
4072         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4073
4074         And most importantly Zoltan's comment:
4075
4076         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4077
4078         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4079          before its static fields are used', i.e. initialization does not need
4080          to be triggered by the first access to the type. Setting this flag
4081          helps the JIT to compile better code, since it can run the static
4082          constructor at JIT time, and does not need to generate code to call it
4083          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4084          this flag for lots of classes like String. 
4085          
4086          csc sets this flag if the type does not have an explicit static 
4087          constructor. The reasoning seems to be that if there are only static
4088          initalizers for a type, and no static constructor, then the programmer
4089          does not care when this initialization happens, so beforefieldinit
4090          can be used.
4091          
4092          This bug prevents the AOT compiler from being usable, since it 
4093          generates so many calls to mono_runtime_class_init that the AOT code
4094          is much slower than the JITted code. The JITted code is faster, 
4095          because it does not generate these calls if the vtable is type is
4096          already initialized, which is true in the majority of cases. But the
4097          AOT compiler can't do this."
4098
4099 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4100
4101         * class.cs (MethodData.Emit): Refactor the code so symbolic
4102         information is generated for destructors;  For some reasons we
4103         were taking a code path that did not generate symbolic information
4104         before. 
4105
4106 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4107
4108         * class.cs: Create a Constructor.CheckBase method that
4109         takes care of all validation type code. The method
4110         contains some code that was moved from Define.
4111
4112         It also includes new code that checks for duplicate ctors.
4113         This fixes bug #55148.
4114
4115 2004-03-09  Joshua Tauberer <tauberer@for.net>
4116
4117         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4118         a { ... }-style array creation invokes EmitStaticInitializers
4119         which is not good for reference-type arrays.  String, decimal
4120         and now null constants (NullCast) are not counted toward
4121         static initializers.
4122
4123 2004-03-05  Martin Baulig  <martin@ximian.com>
4124
4125         * location.cs (SourceFile.HasLineDirective): New public field;
4126         specifies whether the file contains or is referenced by a "#line"
4127         directive.
4128         (Location.DefineSymbolDocuments): Ignore source files which
4129         either contain or are referenced by a "#line" directive.        
4130
4131 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4132
4133         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4134         direct access to our parent, so check the method inline there.
4135
4136 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4137
4138         * expression.cs (Invocation.EmitCall): Miguel's last commit
4139         caused a regression. If you had:
4140
4141             T t = null;
4142             t.Foo ();
4143
4144         In Foo the implict this would be null.
4145
4146 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4147
4148         * expression.cs (Invocation.EmitCall): If the method is not
4149         virtual, do not emit a CallVirt to it, use Call.
4150
4151         * typemanager.cs (GetFullNameSignature): Improve the method to
4152         cope with ".ctor" and replace it with the type name.
4153
4154         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4155         as an argument the ConstructorBuilder where it is being defined,
4156         to catch the recursive constructor invocations.
4157
4158 2004-03-16  Martin Baulig  <martin@ximian.com>
4159
4160         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
4161         ConstructedType, call ResolveType() on it to get the type rather
4162         than just using `expr.Type'.
4163
4164 2004-03-16  Martin Baulig  <martin@ximian.com>
4165
4166         * generics.cs (ConstructedType.GetMemberAccess): Take the
4167         EmitContext instead on the TypeExpr and use
4168         ec.TypeContainer.CurrentType/ec.ContainerType.
4169
4170 2004-03-16  Martin Baulig  <martin@ximian.com>
4171
4172         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
4173         parameters before aliases.
4174
4175 2004-03-16  Martin Baulig  <martin@ximian.com>
4176
4177         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
4178         New oublic function; checks whether two generic instances may become
4179         equal under some instantiations (26.3.1).
4180
4181         * class.cs (TypeContainer.Define): Call
4182         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
4183         error.
4184
4185 2004-03-16  Martin Baulig  <martin@ximian.com>
4186
4187         * class.cs (TypeContainer.GetClassBases): Moved
4188         Error_TypeParameterAsBase() here and also check whether the base
4189         class is not an attribute.
4190
4191 2004-03-16  Martin Baulig  <martin@ximian.com>
4192
4193         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4194
4195 2004-03-16  Martin Baulig  <martin@ximian.com>
4196
4197         * class.cs (Error_TypeParameterAsBase): Use correct error number
4198         here (CS0689).  
4199
4200 2004-03-16  Martin Baulig  <martin@ximian.com>
4201
4202         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
4203         for generics.
4204
4205         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
4206         error reporting.
4207
4208 2004-03-15  Martin Baulig  <martin@ximian.com>
4209
4210         * typemanager.cs (TypeManager.GetFullName): New public method.
4211         (TypeManager.MemberLookup): Added `int_num_type_arguments'
4212         argument; only return members with the correct number of type
4213         arguments.
4214         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
4215         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
4216         whether the number of type arguments matches.
4217
4218         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
4219         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
4220
4221         * expression.cs (MemberAccess): Added public `NumTypeArguments'
4222         field; it's set by the protected .ctor when we're actually a
4223         GenericMemberAccess.
4224         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
4225         arguments and pass it to MemberLookupFinal ().
4226
4227         * ecore.cs (Expression.MemberLookup): Added `int
4228         num_type_arguments' argument; only return members with the correct
4229         number of type arguments.
4230         (Expression.MemberLookupFailed): Check whether the MemberLookup
4231         failed because we did not have the correct number of type
4232         arguments; report CS0305 in this case.
4233
4234         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
4235         `e.ResolveAsTypeTerminal()' already did so.
4236
4237 2004-03-15  Martin Baulig  <martin@ximian.com>
4238
4239         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
4240         we're a ConstructedType; in this case, the caller must report an
4241         error (for instance CS0131).
4242
4243         * generic.cs (TypeArguments): Added Location argument to the .ctor.
4244         (TypeArguments.Resolve): Actually report errors here.
4245
4246 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4247
4248         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4249         `set_indexer_name' to the pending bits (one per type).
4250
4251         We fixed a bug today that was picking the wrong method to
4252         override, since for properties the existing InterfaceMethod code
4253         basically ignored the method name.  Now we make sure that the
4254         method name is one of the valid indexer names.
4255
4256 2004-03-15  Martin Baulig  <martin@ximian.com>
4257
4258         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
4259         for generic instances.
4260
4261 2004-03-13  Martin Baulig  <martin@ximian.com>
4262
4263         * class.cs (TypeContainer.DefineType): Call
4264         TypeManager.AddUserType() immediately after creating the
4265         TypeBuilder; pass all type parameters when creating the
4266         CurrentType.
4267
4268         * decl.cs (DeclSpace.FindNestedType): New public method.
4269         (DeclSpace.FindType): Added `int num_type_args' argument; only
4270         return types with the correct number of type parameters.
4271         (DeclSpace.CountTypeParams): New public property.
4272
4273         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
4274         the number of type parameters; defaults to zero.
4275
4276         * generic.cs (TypeArguments.Count): New public property.
4277         (ConstructedType.DoResolveAsTypeStep): First call
4278         ds.FindNestedType() to find out whether we're nested in the
4279         current generic type; in this case, we inherit all type parameters
4280         from the current class.
4281
4282         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
4283         num_type_args' argument.
4284         (RootContext.LookupType): Added overloaded version which takes the
4285         number of type arguments; only return types with the correct
4286         number of type arguments.
4287
4288         * typemanager.cs (TypeManager.CheckGeneric): New public function;
4289         checks whether `Type t' has `int num_type_args'.
4290
4291 2004-03-13  Martin Baulig  <martin@ximian.com>
4292
4293         * generic.cs (GenericMethod.DefineType): New method; calls
4294         DefineType() on all the type parameters.
4295
4296         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
4297         (MethodData.Define): If we're a generic method, call
4298         GenericMethod.DefineType() to define the type parameters.       
4299
4300 2004-03-10  Martin Baulig  <martin@ximian.com>
4301
4302         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
4303         instead of IsAssignableFrom.    
4304
4305 2004-03-10  Martin Baulig  <martin@ximian.com>
4306
4307         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
4308
4309         * support.cs (ParameterData.HasArrayParameter): New property.
4310         (ReflectionParameters.ctor): Take a MethodBase instead of a
4311         ParameterInfo[].  If we have any type parameters, get the generic
4312         method definition and ask it whether we have variable arguments.
4313
4314 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4315
4316         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4317         routines to check if a type is an enumerable/enumerator allow
4318         classes that implement the IEnumerable or IEnumerator interfaces.
4319
4320         * class.cs (Property, Operator): Implement IIteratorContainer, and
4321         implement SetYields.
4322
4323         (Property.Define): Do the block swapping for get_methods in the
4324         context of iterators.   We need to check if Properties also
4325         include indexers or not.
4326
4327         (Operator): Assign the Block before invoking the
4328         OperatorMethod.Define, so we can trigger the Iterator code
4329         replacement. 
4330
4331         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4332         Property and Operator classes are not created when we parse the
4333         declarator but until we have the block completed, so we use a
4334         singleton SimpleIteratorContainer.Simple to flag whether the
4335         SetYields has been invoked.
4336
4337         We propagate this setting then to the Property or the Operator to
4338         allow the `yield' to function.
4339
4340 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4341
4342         * codegen.cs: Implemented attribute support for modules.
4343         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4344         Assembly/Module functionality.
4345
4346         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4347         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4348         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4349
4350 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4351
4352         * interface.cs (FindMembers): The operation is performed on all base
4353         interfaces and not only on the first. It is required for future CLS Compliance patch.
4354
4355 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4356
4357         * statement.cs, codegen.cs:
4358         This patch deals with patterns such as:
4359
4360         public class List : IEnumerable {
4361
4362                 public MyEnumerator GetEnumerator () {
4363                         return new MyEnumerator(this);
4364                 }
4365
4366                 IEnumerator IEnumerable.GetEnumerator () {
4367                         ...
4368                 }
4369                 
4370                 public struct MyEnumerator : IEnumerator {
4371                         ...
4372                 }
4373         }
4374
4375         Before, there were a few things we did wrong:
4376         1) we would emit callvirt on a struct, which is illegal
4377         2) we emited ldarg when we needed to emit ldarga
4378         3) we would mistakenly call the interface methods on an enumerator
4379         type that derived from IEnumerator and was in another assembly. For example:
4380
4381         public class MyEnumerator : IEnumerator
4382
4383         Would have the interface methods called, even if there were public impls of the
4384         method. In a struct, this lead to invalid IL code.
4385
4386 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4387
4388         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4389           renamed to Emit.
4390
4391         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4392
4393 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4394
4395         * cs-parser.jay: Fix small regression: we were not testing V2
4396         compiler features correctly.
4397
4398         * interface.cs: If the emit context is null, then create one
4399
4400 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4401
4402         * decl.cs (GetSignatureForError): New virtual method to get full name
4403           for error messages.
4404
4405         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4406           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4407
4408         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4409           Duplicated members and code in these classes has been removed.
4410           Better encapsulation in these classes.
4411
4412 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4413
4414         * assign.cs (Assign.DoResolve): When dealing with compound
4415         assignments, there is a new rule in ECMA C# 2.4 (might have been
4416         there before, but it is documented here) that states that in:
4417
4418         a op= b;
4419
4420         If b is of type int, and the `op' is a shift-operator, then the
4421         above is evaluated as:
4422
4423         a = (int) a op b 
4424
4425         * expression.cs (Binary.ResolveOperator): Instead of testing for
4426         int/uint/long/ulong, try to implicitly convert to any of those
4427         types and use that in pointer arithmetic.
4428
4429         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4430         method to print information for from the type, not from the
4431         null-method we were given.
4432
4433 2004-02-01  Duncan Mak  <duncan@ximian.com>
4434
4435         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4436         parsing for cmd, fixes bug #53694.
4437
4438 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4439
4440         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4441         in the member name duplication tests. Property and operator name duplication
4442         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4443
4444 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4445
4446         * interface.cs (PopulateMethod): Fixed crash when interface method
4447         returns not existing type (error test cs0246-3.cs).
4448
4449 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4450
4451         * cs-parser.jay (interface_accessors): Re-write actions to also
4452         store attributes attached to get and set methods. Fix spelling
4453         while at it.
4454
4455         (inteface_property_declaration): Modify accordingly.
4456
4457         (InterfaceAccessorInfo): New helper class to store information to pass
4458         around between rules that use interface_accessors.
4459
4460         * interface.cs (Emit): Apply attributes on the get and set
4461         accessors of properties and indexers too.
4462
4463         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4464         right MethodBuilder when applying attributes to the get and set accessors.
4465
4466 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4467
4468         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4469
4470 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4471
4472         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4473
4474 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4475
4476         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4477         changes that treat `yield' specially when present before `break'
4478         or `return' tokens.
4479
4480         * cs-tokenizer.cs: yield is no longer a keyword.
4481
4482 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4483
4484         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4485         setting for default constructors.
4486         For default constructors are almost every time set wrong Modifier. The
4487         generated IL code has been alright. But inside mcs this values was
4488         wrong and this was reason why several of my CLS Compliance tests
4489         failed.
4490
4491 2004-02-27  Martin Baulig  <martin@ximian.com>
4492
4493         * generics.cs (ConstructedType.ResolveType): Make the nested type
4494         stuff actually work.
4495
4496 2004-02-25  Martin Baulig  <martin@ximian.com>
4497
4498         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
4499         property; returns the type parameters just from the current type,
4500         ie. with the ones from outer classes.
4501         (DeclSpace.LookupGeneric): First search in the current class, then
4502         in outer classes.
4503         (DeclSpace.initialize_type_params): When hiding a type parameter
4504         from an outer class, put it into the `type_param_list' anyways.
4505
4506         * expression.cs (MemberAccess.expr): Made this field protected.
4507
4508         * class.cs (TypeContainer.Define): The `CurrentType' just contains
4509         the type parameters from the current class.
4510
4511         * generic.cs (ConstructedType.ResolveType): Support nested generic
4512         types by taking the type parameters which we inherit from outer
4513         classes into account.
4514         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
4515         support for nested generic types.
4516
4517 2004-02-23  Martin Baulig  <martin@ximian.com>
4518
4519         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
4520         field and check whether we're nested inside a generic type.
4521         (DeclSpace.ResolveType): If we're resolving to a generic type
4522         definition, create a ConstructedType and return its resolved type.
4523         (DeclSpace.initialize_type_params): New private method;
4524         initializes the `type_param_list' field from the type parameters
4525         from this and all enclosing classes.
4526         (DeclSpace.TypeParameters): Call initialize_type_params() unless
4527         we're already initialized.
4528
4529 2004-02-23  Martin Baulig  <martin@ximian.com>
4530
4531         * class.cs (Method.Define): Create the generic method before
4532         calling DoDefine().
4533         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
4534         the TypeContainer one); we use this for generic methods.
4535
4536         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
4537         parent's TypeBuilder.
4538
4539 2004-02-18  Martin Baulig  <martin@ximian.com>
4540
4541         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
4542         to check for equality.
4543
4544 2004-02-05  Martin Baulig  <martin@ximian.com>
4545
4546         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
4547         `ec.TypeContainer.CurrentType', use it instead of
4548         `ec.ContainerType' to check whether we're in the type's ctor.
4549
4550 2004-01-29  Martin Baulig  <martin@ximian.com>
4551
4552         * expression.cs (Invocation.DoResolve): If we're a
4553         `ConstructedType', then we're actually a generic method, so
4554         rewrite the expr as a GenericMemberAccess.
4555
4556         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
4557         here; manually parse it into a string.
4558
4559 2004-01-28  Martin Baulig  <martin@ximian.com>
4560
4561         * typemanager.cs (TypeManager.IsEqual): New static method.
4562         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
4563         check for equality instead of using `=='.
4564
4565 2004-01-26  Martin Baulig  <martin@ximian.com>
4566
4567         * decl.cs (DeclSpace.CurrentType): New public field.
4568
4569         * expression.cs (This.ResolveBase): If we have an
4570         `ec.TypeContainer.CurrentType', use it instead of
4571         `ec.ContainerType'.
4572
4573         * class.cs (TypeContainer.DefineType): If we're a generic type,
4574         create the `CurrentType' (unresolved).
4575         (TypeContainer.GenericType): New private field.
4576         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
4577         it and store it in `GenericType' before creating the MemberCache.
4578         (TypeContainer.GetMembers): If we have a `GenericType', call
4579         TypeManager.FindMembers() on it.
4580
4581         * interface.cs (Interface.GenericType): New private field.
4582         (Interface.DefineType): If we're a generic type, create the
4583         `CurrentType' (unresolved).
4584         (Interface.DefineMembers): If we have a `CurrentType', resolve it
4585         and store it in `GenericType' before creating the MemberCache.
4586         (Interface.GetMembers): If we have a `GenericType', call
4587         TypeManager.FindMembers() on it.
4588
4589 2004-01-22  Martin Baulig  <martin@ximian.com>
4590
4591         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4592         not a QualifiedIdentifier.  This is what `type_name_expression'
4593         was previously doing.
4594         (type_name_expression): Removed; the code is now in
4595         `namespace_or_type_name'.
4596         (qualified_identifier): Removed, use `namespace_or_type_name'
4597         instead.
4598         (QualifiedIdentifier): Removed this class.      
4599
4600 2004-01-22  Martin Baulig  <martin@ximian.com>
4601
4602         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4603         not a string as alias name.
4604
4605 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4606
4607         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4608         #52730 bug, and instead compute correctly the need to use a
4609         temporary variable when requesting an address based on the
4610         static/instace modified of the field and the constructor.
4611  
4612 2004-01-21  Martin Baulig  <martin@ximian.com>
4613
4614         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4615         class and namespace before looking up aliases.  Fixes #52517.
4616
4617 2004-01-21  Martin Baulig  <martin@ximian.com>
4618
4619         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4620         assinged in a 'try'; fixes exception4.cs.
4621
4622 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4623         * class.cs : Implemented parameter-less constructor for TypeContainer
4624
4625         * decl.cs: Attributes are now stored here. New property OptAttributes
4626
4627         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4628
4629         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4630
4631 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4632
4633         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4634           (CSharpSignature): New method for indexer and property signature.
4635
4636 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4637
4638         * pending.cs (IsVirtualFilter): Faster implementation.
4639
4640 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4641
4642         * typemanager.cs: Avoid inclusion of same assembly more than once.
4643
4644 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4645
4646         * cs-parser.jay: Fixed problem where the last assembly attribute
4647           has been applied also to following declaration (class, struct, etc.)
4648           
4649 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4650
4651         * class.cs: Added error CS0538, CS0539 reporting.
4652         Fixed crash on Microsoft runtime when field type is void.
4653
4654         * cs-parser.jay: Added error CS0537 reporting.
4655
4656         * pending.cs: Added error CS0535 reporting.
4657         Improved error report for errors CS0536, CS0534.
4658
4659 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4660
4661         Merge a few bits from the Anonymous Method MCS tree.
4662
4663         * statement.cs (ToplevelBlock): New class for toplevel methods,
4664         will hold anonymous methods, lifted variables.
4665
4666         * cs-parser.jay: Create toplevel blocks for delegates and for
4667         regular blocks of code. 
4668
4669 2004-01-20  Martin Baulig  <martin@ximian.com>
4670
4671         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4672         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4673         and `NeedExplicitReturn'; added `IsLastStatement'.
4674         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4675         have a `ReturnLabel' or we're not unreachable.
4676
4677         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4678         child's reachability; don't just override ours with it.  Fixes
4679         #58058 (lluis's example).
4680         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4681         InFinally(), InLoop(), InSwitch() and
4682         BreakCrossesTryCatchBoundary() methods.
4683
4684         * statement.cs (Return): Do all error checking in Resolve().
4685         Unless we are the last statement in a top-level block, always
4686         create a return label and jump to it.
4687         (Break, Continue): Do all error checking in Resolve(); also make
4688         sure we aren't leaving a `finally'.
4689         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4690         statement in a top-level block.
4691         (Block.Flags): Added `IsDestructor'.
4692         (Block.IsDestructor): New public property.
4693
4694 2004-01-20  Martin Baulig  <martin@ximian.com>
4695
4696         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4697
4698 2004-01-20  Martin Baulig  <martin@ximian.com>
4699
4700         * statement.cs (Statement.ResolveUnreachable): New public method.
4701         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4702         (Block.Resolve): Resolve unreachable statements.
4703
4704 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4705
4706         * expression.cs: We need to fix the case where we do
4707         not have a temp variable here.
4708
4709         * assign.cs: Only expression compound assignments need
4710         temporary variables.
4711
4712 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4713
4714         * flowanalysis.cs: Reduce memory allocation in a few ways:
4715           - A block with no variables should not allocate a bit
4716             vector for itself.
4717           - A method with no out parameters does not need any tracking
4718             for assignment of the parameters, so we need not allocate
4719             any data for it.
4720           - The arrays:
4721                 public readonly Type[] VariableTypes;
4722                 public readonly string[] VariableNames;
4723             Are redundant. The data is already stored in the variable
4724             map, so we need not allocate another array for it.
4725           - We need to add alot of checks for if (params | locals) == null
4726             due to the first two changes.
4727
4728 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4729
4730         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4731         implement IMemoryLocation, we store a copy on a local variable and
4732         take the address of it.  Patch from Benjamin Jemlich
4733
4734         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4735         to use a special "type_name_expression" rule which reduces the
4736         number of "QualifiedIdentifier" classes created, and instead
4737         directly creates MemberAccess expressions.
4738
4739 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4740
4741         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4742         that fixes #52853.  Null literal assignment to ValueType
4743
4744         * class.cs (MethodData.Emit): Instead of checking the name of the
4745         method to determine if its a destructor, create a new derived
4746         class from Method called Destructor, and test for that.  
4747
4748         * cs-parser.jay: Create a Destructor object instead of a Method.  
4749
4750         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4751
4752         Fixes: 52933
4753
4754 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4755
4756         * expression.cs (Binary.ResolveOperator): Perform an implicit
4757         conversion from MethodGroups to their delegate types on the
4758         Addition operation.
4759
4760         * delegate.cs: Introduce a new class DelegateCreation that is the
4761         base class for `NewDelegate' and `ImplicitDelegateCreation',
4762         factor some code in here.
4763
4764         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4765         conversion from MethodGroups to compatible delegate types. 
4766
4767         * ecore.cs (Expression.Resolve): Do not flag error 654
4768         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4769         we allow conversions from MethodGroups to delegate types now.
4770
4771         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4772         assignments in v2 either.
4773
4774 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4775
4776         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4777         static read-only fields in ctors.
4778
4779         Applied patch from Benjamin Jemlich 
4780
4781         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4782
4783 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4784
4785         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4786         here to return true, as they can be used like this:
4787
4788                 (XXX) int.MEMBER ()
4789
4790         Fixed 49836 and all the other dups
4791
4792 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4793
4794         * driver.cs: Implement /win32res and /win32icon.
4795
4796 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4797
4798         * cs-parser.jay: Add a rule to improve error handling for the
4799         common mistake of placing modifiers after the type.
4800
4801 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4802
4803         * cs-parser.jay (interface_event_declaration): Catch
4804         initialization of events on interfaces, and report cs0068
4805
4806         * cs-parser.jay (interface_event_declaration): Catch
4807         initialization of events. 
4808
4809         * ecore.cs: Better report missing constructors.
4810
4811         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4812         the error reporting done in the wrong place.  Fix.
4813
4814         * expression.cs (Binary.ResolveOperator): Catch the 
4815         operator + (E x, E y) error earlier, and later allow for implicit
4816         conversions in operator +/- (E e, U x) from U to the underlying
4817         type of E.
4818
4819         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4820         52596, if the container class is abstract, the default constructor
4821         is protected otherwise its public (before, we were always public).
4822
4823         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4824         fixed statement.
4825
4826         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4827         Jemlich that fixes bug #52597, MCS was generating invalid code for
4828         idisposable structs.   Thanks to Ben for following up with this
4829         bug as well.
4830
4831 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4832
4833         * driver.cs: Allow assemblies without code to be generated, fixes
4834         52230.
4835
4836 2004-01-07  Nick Drochak <ndrochak@gol.com>
4837
4838         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4839
4840 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4841
4842         * cs-parser.jay: Add rules to improve error reporting if fields or
4843         methods are declared at the namespace level (error 116)
4844
4845         * Add rules to catch event add/remove
4846
4847 2004-01-04  David Sheldon <dave-mono@earth.li>
4848
4849   * expression.cs: Added matching ")" to error message for 
4850   CS0077
4851
4852 2004-01-03 Todd Berman <tberman@gentoo.org>
4853
4854         * ecore.cs, attribute.cs:
4855         Applying fix from #52429.
4856
4857 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4858
4859         * ecore.cs, expression.cs, statement.cs:
4860         Total rewrite of how we handle branching. We
4861         now handle complex boolean expressions with fewer
4862         jumps. As well if (x == 0) no longer emits a ceq.
4863
4864         if (x is Foo) is much faster now, because we generate
4865         better code.
4866
4867         Overall, we get a pretty big improvement on our benchmark
4868         tests. The code we generate is smaller and more readable.
4869
4870         I did a full two-stage bootstrap. The patch was reviewed
4871         by Martin and Miguel.
4872
4873 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4874
4875         * cs-parser.jay: Make primary_expression not take a QI.
4876         we dont need this because the member_access rule covers
4877         us here. So we replace the rule with just IDENTIFIER.
4878
4879         This has two good effects. First, we remove a s/r conflict.
4880         Second, we allocate many fewer QualifiedIdentifier objects.
4881
4882 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4883
4884         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4885         set the correct information via SRE. This prevents
4886         hanging on the MS runtime. Fixes #29374.
4887
4888 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4889
4890         * convert.cs: correctly handle conversions to value types
4891         from Enum and ValueType as unboxing conversions.
4892
4893         Fixes bug #52569. Patch by Benjamin Jemlich.
4894
4895 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4896
4897         * expression.cs (BetterConversion): Prefer int -> uint
4898         over int -> ulong (csc's behaviour). This fixed bug #52046.
4899
4900 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4901
4902         * decl.cs (MemberCache.FindMembers): now returns a
4903         MemberInfo [].
4904
4905         * typemanager.cs: In general, go with with ^^.
4906         (CopyNewMethods): take an IList.
4907         (RealMemberLookup): Only allocate an arraylist
4908         if we copy from two sets of methods.
4909
4910         This change basically does two things:
4911         1) Fewer array lists allocated due to CopyNewMethods.
4912         2) the explicit cast in MemberList costed ALOT.
4913
4914 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4915
4916         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4917         a hashtable to avoid needless string allocations when an identifier is
4918         used more than once (the common case).
4919
4920 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4921
4922         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4923         is broken, it will not return anything. So, we
4924         have to use the information we have in mcs to
4925         do the task.
4926
4927         * typemanager.cs: Add a cache for GetInterfaces,
4928         since this will now be used more often (due to ^^)
4929
4930         (GetExplicitInterfaces) New method that gets the
4931         declared, not effective, interfaces on a type
4932         builder (eg, if you have interface IFoo, interface
4933         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4934         { IBar }.
4935
4936         This patch makes MCS able to bootstrap itself on
4937         Windows again.
4938
4939 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4940
4941         * expression.cs: Remove the Nop's that Miguel put
4942         in by mistake.
4943
4944 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4945
4946         * report.cs, codegen.cs: Give the real stack trace to
4947         the error when an exception is thrown.
4948
4949 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4950
4951         * decl.cs: only allocate hashtables for ifaces if 
4952         it is an iface!
4953
4954 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4955
4956         * expression.cs: fix the error from cs0121-2.cs
4957         (a parent interface has two child interfaces that
4958         have a function with the same name and 0 params
4959         and the function is called through the parent).
4960
4961 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4962
4963         * class.cs, rootcontext.cs, typmanager.cs: do not
4964         leak pointers.
4965
4966 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4967
4968         * codegen.cs: remove stack for the ec flow branching.
4969         It is already a linked list, so no need.
4970
4971 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4972
4973         * Makefile: Allow custom profiler here.
4974
4975 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4976
4977         * typemanager.cs (LookupType):
4978           - Use a static char [], because split takes
4979             a param array for args, so it was allocating
4980             every time.
4981           - Do not store true in a hashtable, it boxes.
4982
4983 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4984
4985         * flowanalysis.cs: bytify common enums.
4986
4987 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4988
4989         * modifiers.cs: Add a new set of flags for the
4990         flags allowed on explicit interface impls.
4991         * cs-parser.jay: catch the use of modifiers in
4992         interfaces correctly.
4993         * class.cs: catch private void IFoo.Blah ().
4994
4995         All related to bug #50572.
4996
4997 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4998
4999         * decl.cs: Rewrite the consistant accessability checking.
5000         Accessability is not linear, it must be implemented in
5001         a tableish way. Fixes #49704.
5002
5003 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5004
5005         * expression.cs: Handle negation in a checked context.
5006         We must use subtraction from zero. Fixes #38674.
5007
5008 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5009
5010         * class.cs: Ignore static void main in DLLs.
5011         * rootcontext.cs: Handle the target type here,
5012         since we are have to access it from class.cs
5013         * driver.cs: account for the above.
5014
5015 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5016
5017         * report.cs: Give line numbers and files if available.
5018
5019 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
5020
5021         * driver.cs: Implement /addmodule.
5022
5023         * typemanager.cs:  Change 'modules' field so it now contains Modules not
5024         ModuleBuilders.
5025
5026 2003-12-20  Martin Baulig  <martin@ximian.com>
5027
5028         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
5029         (FieldBase.IsAssigned): Removed this field.
5030         (FieldBase.SetAssigned): New public method.
5031         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
5032
5033 2003-12-20  Martin Baulig  <martin@ximian.com>
5034
5035         * expression.cs (LocalVariableReference.DoResolve): Don't set
5036         `vi.Used' if we're called from DoResolveLValue().
5037
5038         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
5039         returns the usage vector it just merged into the current one -
5040         pass this one to UsageWarning().
5041         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
5042         of the `EmitContext', don't call this recursively on our children.
5043
5044 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
5045
5046         * driver.cs: Implement /target:module.
5047
5048 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
5049
5050         * support.cs (CharArrayHashtable): New helper class.
5051
5052         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
5053         char arrays, not strings, so we can avoid creating a string in
5054         consume_identifier if the identifier is a keyword.
5055
5056 2003-12-16  Martin Baulig  <martin@ximian.com>
5057
5058         * statement.cs (LocalInfo.Assigned): Removed this property.
5059         (LocalInfo.Flags): Removed `Assigned'.
5060         (LocalInfo.IsAssigned): New public method; takes the EmitContext
5061         and uses flow analysis.
5062         (Block.UsageWarning): Made this method private.
5063         (Block.Resolve): Call UsageWarning() if appropriate.
5064
5065         * expression.cs (LocalVariableReference.DoResolve): Always set
5066         LocalInfo.Used here.
5067
5068 2003-12-13  Martin Baulig  <martin@ximian.com>
5069
5070         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
5071         any value here; we're now using flow analysis to figure out
5072         whether a statement/block returns a value.
5073
5074 2003-12-13  Martin Baulig  <martin@ximian.com>
5075
5076         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
5077         working again.
5078         (FlowBranching.MergeFinally): Don't call
5079         `branching.CheckOutParameters()' here, this is called in
5080         MergeTopBlock().
5081         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5082         when adding the `finally' vector.       
5083
5084 2003-12-13  Martin Baulig  <martin@ximian.com>
5085
5086         * flowanalysis.cs
5087         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5088         actually work and also fix #48962.
5089
5090 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5091
5092         * decl.cs: Do not check System.Object for nested types,
5093         since we know it does not have any. Big bang for buck:
5094
5095         BEFORE:
5096            Run 1:   8.35 seconds
5097            Run 2:   8.32 seconds
5098            corlib:  17.99 seconds
5099         AFTER:
5100            Run 1:   8.17 seconds
5101            Run 2:   8.17 seconds
5102            corlib:  17.39 seconds
5103
5104 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5105
5106         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5107         time we are returning 0 members, so we save alot here.
5108
5109 2003-12-11  Martin Baulig  <martin@ximian.com>
5110
5111         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5112         `MergeChild()', also just take the `FlowBranching' as argument;
5113         call Merge() on it and return the result.
5114         (FlowBranching.Merge): We don't need to do anything if we just
5115         have one sibling.
5116
5117 2003-12-11  Martin Baulig  <martin@ximian.com>
5118
5119         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5120         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5121         Maurer for this idea.
5122
5123 2003-12-11  Martin Baulig  <martin@ximian.com>
5124
5125         * flowanalysis.cs (MergeResult): This class is now gone; we now
5126         use the `UsageVector' for this.  The reason for this is that if a
5127         branching just has one sibling, we don't need to "merge" them at
5128         all - that's the next step to do.
5129         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5130         `MergeResult'.
5131
5132 2003-12-11  Martin Baulig  <martin@ximian.com>
5133
5134         Reworked flow analyis and made it more precise and bug-free.  The
5135         most important change is that we're now using a special `Reachability'
5136         class instead of having "magic" meanings of `FlowReturns'.  I'll
5137         do some more cleanups and optimizations and also add some more
5138         documentation this week.
5139
5140         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5141         largely reworked this class.
5142         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5143         the new `Reachability' class instead of having "magic" values here.
5144         (FlowBranching): We're now using an instance of `Reachability'
5145         instead of having separate `Returns', `Breaks' etc. fields.
5146
5147         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5148         based on flow analysis; ignore the return value of block.Emit ().
5149
5150 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5151
5152         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5153         if they are private.
5154
5155 2003-12-09  Martin Baulig  <martin@ximian.com>
5156
5157         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5158         call them directly on the UsageVector.
5159
5160 2003-12-09  Martin Baulig  <martin@ximian.com>
5161
5162         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5163         Changed return type from `FlowReturns' to `Reachability'.
5164
5165 2003-12-09  Martin Baulig  <martin@ximian.com>
5166
5167         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5168         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5169         `Reachable' fields with a single `Reachability' one.
5170
5171 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5172
5173         * class.cs (FindMembers): Remove foreach's.
5174
5175         Bootstrap times:
5176
5177         BEFORE
5178                 Run 1:   8.74 seconds
5179                 Run 2:   8.71 seconds
5180
5181         AFTER
5182                 Run 1:   8.64 seconds
5183                 Run 2:   8.58 seconds
5184
5185
5186 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5187
5188         * cs-parser.jay:
5189         * gen-treedump.cs:
5190         * statement.cs:
5191         This patch does a few things:
5192                 1. EmptyStatement is now a singleton, so it is never reallocated.
5193                 2. All blah is EmptyStatement constructs have been changed to
5194                    blah == EmptyStatement.Value, which is much faster and valid
5195                    now that EmptyStatement is a singleton.
5196                 3. When resolving a block, rather than allocating a new array for
5197                    the non-empty statements, empty statements are replaced with
5198                    EmptyStatement.Value
5199                 4. Some recursive functions have been made non-recursive.
5200         Mainly the performance impact is from (3), however (1) and (2) are needed for
5201         this to work. (4) does not make a big difference in normal situations, however
5202         it makes the profile look saner.
5203
5204         Bootstrap times:
5205
5206         BEFORE
5207         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5208         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5209         Total memory allocated: 56397 KB
5210
5211         AFTER
5212         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5213         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5214         Total memory allocated: 55666 KB
5215
5216 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5217
5218         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5219         than the hashtable in a hashtable version
5220
5221         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5222         we always end up concating a string. This results in a huge perf
5223         loss, because many strings have to be tracked by the GC. In this
5224         patch, we first use a hashtable that works with two keys, so that
5225         the strings do not need to be concat'ed.
5226
5227         Bootstrap times:
5228         BEFORE
5229                 Run 1:   8.74 seconds
5230                 Run 2:   8.71 seconds
5231
5232         AFTER
5233                 Run 1:   8.65 seconds
5234                 Run 2:   8.56 seconds
5235
5236 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5237
5238         * Makefile: Add a new target `do-time' that does a quick and simple
5239         profile, leaving easy to parse output.
5240
5241 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5242
5243         * codegen.cs (Init): Create the dynamic assembly with 
5244         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5245
5246 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5247
5248         * support.cs: Make the PtrHashtable use only one
5249         instance of its comparer.
5250
5251 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5252
5253         * typemanager.cs: Fix lookup of GetNamespaces.
5254
5255 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5256
5257         * expression.cs: Removed redundant line.
5258
5259         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5260         ArrayLists, use for loops with bounds.  
5261
5262         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5263         arraylist.
5264
5265         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5266         arraylists, use for loop with bounds.
5267
5268         The above three changes give us a 0.071 second performance
5269         improvement out of 3.294 seconds down to 3.223.  On my machine
5270         the above changes reduced the memory usage by 1,387 KB during
5271         compiler bootstrap.
5272
5273         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5274         QualifiedIdentifiers.  Before we created a new string through
5275         concatenation, and mostly later on, the result would be
5276         manipulated by DecomposeQI through string manipulation.
5277
5278         This reduced the compiler memory usage for bootstrapping from
5279         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5280         compile times in 0.05 seconds.
5281
5282 2003-11-28  Dick Porter  <dick@ximian.com>
5283
5284         * support.cs: Do string compares with the Invariant culture.
5285
5286         * rootcontext.cs: 
5287         * gen-treedump.cs: 
5288         * expression.cs: 
5289         * driver.cs: 
5290         * decl.cs: 
5291         * codegen.cs: 
5292         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5293         the comparison is done with the Invariant culture.
5294
5295 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5296
5297         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5298         GetEnumerator method.
5299
5300         (ProbeCollectionType): Iterate starting at the most specific type
5301         upwards looking for a GetEnumerator
5302
5303         * expression.cs: Shift count can be up to 31 for int/uint and 63
5304         for long/ulong.
5305
5306 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5307
5308         * statement.cs (Block.LookupLabel): Also look for the label on the
5309         children blocks.  Use a hash table to keep track of visited
5310         nodes. 
5311
5312         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5313         we actually did transform the other operand, otherwise fall back
5314         to the common codepath that casts to long.
5315
5316         * cs-tokenizer.cs: Use the same code pattern as the int case.
5317         Maybe I should do the parsing myself, and avoid depending on the
5318         Parse routines to get this done.
5319
5320 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5321
5322         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5323         which fixes bug 51347.  This time test it.
5324
5325         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5326         attributes for example can not tell the difference between these.
5327         The difference was only a syntax feature of the language. 
5328
5329         * attribute.cs: Apply attributes to delegates.
5330
5331         * delegate.cs: Call the apply attributes method.
5332
5333 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5334
5335         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5336         comparing 0 vs Byte.MinValue, not the value
5337
5338         (ImplicitConversionRequired): When reporting a conversion error,
5339         use error 31 to print out the constant error instead of the
5340         simpler 29.
5341
5342         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5343         which fixes bug 51347.
5344
5345 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5346
5347         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5348         which fixes the -warnaserror command line option.
5349
5350 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5351
5352         * cfold.cs (DoNumericPromotions): During constant folding of
5353         additions on UIntConstant, special case intconstants with
5354         IntConstants like we do on the expression binary operator. 
5355
5356 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5357
5358         * convert.cs (ImplicitReferenceConversion): We were missing a case
5359         (System.Enum are not value types or class types, so we need to
5360         classify them separatedly).
5361
5362         * driver.cs: We do not support error 2007.
5363
5364 2003-11-12 Jackson Harper <jackson@ximian.com>
5365
5366         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5367         system directory. Also use the full file name so users can
5368         libraries names mscorlib-o-tron.dll in a non system dir.
5369         
5370 2004-01-04  David Sheldon <dave-mono@earth.li>
5371
5372         * expression.cs: Added matching ")" to error message for CS0077.
5373
5374 2003-12-19  Martin Baulig  <martin@ximian.com>
5375
5376         * typemanager.cs (TypeManager.IsEqualGenericType): New public
5377         static method; see documentation in the method.
5378         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
5379
5380         * convert.cs (Convert.ImplicitReferenceConversion,
5381         Convert.ImplicitReferenceConversionExists): Add support for
5382         generic type declarations; see gen-36.cs.
5383
5384 2003-12-19  Martin Baulig  <martin@ximian.com>
5385
5386         * pending.cs (Pending.InterfaceMethod): Use
5387         `Type.IsAssignableFrom()' instead of `=='.
5388
5389 2003-12-18  Martin Baulig  <martin@ximian.com>
5390
5391         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
5392         byref types first.
5393
5394         * convert.cs (Convert.ImplicitStandardConversionExists): Use
5395         `expr_type.Equals (target_type)' instead of `=='.
5396
5397 2003-12-08  Martin Baulig  <martin@ximian.com>
5398
5399         * generics.cs (Constraints.Types): Removed.
5400         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
5401         to Type's.
5402         (Constraints.ResolveTypes): New public method; resolves the
5403         TypeExpr's to Type's.
5404         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
5405         longer takes the constraints.
5406         (TypeParameter.DefineMethod): Likewise.
5407         (TypeParameter.DefineType): New public method.  Calls
5408         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
5409         the constraints.
5410
5411 2003-12-08  Martin Baulig  <martin@ximian.com>
5412
5413         * convert.cs (Convert.ImplicitConversionStandard): Use
5414         `expr_type.Equals (target_type)' instead of `=='.
5415
5416 2003-12-08  Martin Baulig  <martin@ximian.com>
5417
5418         * typemanager.cs (TypeManager.GetReferenceType): Call
5419         `Type.MakeByRefType ()'.
5420
5421 2003-12-08  Martin Baulig  <martin@ximian.com>
5422
5423         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
5424         just has some special meaning in some situations.  For instance,
5425         it is allowed to use `where' as the name of a variable etc.
5426
5427 2003-12-04  Martin Baulig  <martin@ximian.com>
5428
5429         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
5430         `Type.MakeArrayType()' for array types.
5431
5432 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
5433
5434         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
5435         debugging message.
5436
5437         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
5438         corlib to compile.
5439
5440 2003-11-16  Martin Baulig  <martin@ximian.com>
5441
5442         * codegen.cs (EmitContext.IsGeneric): Removed.
5443
5444         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
5445         ResolveGeneric() on the DeclSpace.
5446
5447 2003-11-16  Martin Baulig  <martin@ximian.com>
5448
5449         * generic.cs (TypeArguments.Resolve):
5450         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
5451         `ResolveType()' on it to get the Type.
5452
5453 2003-11-15  Martin Baulig  <martin@ximian.com>
5454
5455         * generic.cs (ConstructedType.GetInterfaces): Override this.
5456
5457 2003-11-14  Martin Baulig  <martin@ximian.com>
5458
5459         * interface.cs (Interface.DefineType): Define all type parameters
5460         before adding the interfaces we inherit.
5461
5462 2003-11-11  Martin Baulig  <martin@ximian.com>
5463
5464         * generic.cs (ConstructedType.ResolveType): Always call
5465         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
5466
5467 2003-11-10  Martin Baulig  <martin@ximian.com>
5468
5469         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5470         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5471         calling `ResolveType()' on them, directly assign their `Type'.
5472
5473 2003-11-08  Martin Baulig  <martin@ximian.com>
5474
5475         * generic.cs (ConstructedType): Override `IsClass' etc.
5476
5477 2003-11-08  Martin Baulig  <martin@ximian.com>
5478
5479         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5480         return value and the `out parent' parameter.
5481         (TypeContainer.DefineType): Moved the CS0644 check into
5482         GetClassBases().  Don't pass the interface types to the
5483         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5484         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5485
5486         * ecore.cs (TypeExpr.IsAttribute): New property.
5487         (TypeExpr.GetInterfaces): New method.
5488
5489         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5490         TypeExpr instead of a Type.
5491         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5492         (Interface.DefineType): Don't pass the interface types to the
5493         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5494         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5495
5496         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5497         instead of a `Type[]'.
5498         (TypeManager.RegisterBuilder): Likewise.
5499         (TypeManager.AddUserInterface): Likewise.
5500         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5501         `Type[]' and also return a `TypeExpr[]'.
5502         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5503
5504 2003-11-08  Martin Baulig  <martin@ximian.com>
5505
5506         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5507         Expression.     
5508
5509 2003-11-08  Martin Baulig  <martin@ximian.com>
5510
5511         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5512         TypeManager.ResolveExpressionTypes().
5513
5514         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5515         instead of an Expression.
5516         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5517         (TypeExpression): New public class; formerly known as `TypeExpr'.
5518
5519         * expression.cs (ComposedCast): Derive from TypeExpr.
5520
5521         * typemanager.cs (TypeManager.system_*_expr): These are now
5522         TypExpr's instead of Expression's.
5523         (TypeManager.ResolveExpressionTypes): New public static function;
5524         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5525         of them.        
5526
5527 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5528
5529         * expression.cs (New.DoResolve): Do not dereference value that
5530         might be a null return.
5531
5532         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5533         sure that the constant value has the right type.  Fixes an
5534         unreported bug, similar to 50425.
5535
5536         * const.cs (Const.LookupConstantValue): Call
5537         ImplicitStandardConversionExists before doing a conversion to
5538         avoid havng the TypeManager.ChangeType do conversions.
5539
5540         Reduced the number of casts used
5541
5542         (Const.ChangeType): New routine to enable reuse of the constant
5543         type changing code from statement.
5544
5545         * typemanager.cs (ChangeType): Move common initialization to
5546         static global variables.
5547
5548         Fixes #50425.
5549
5550         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5551         every value type to go through, even if it was void.  Fix that. 
5552
5553         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5554         character of the define, and the is_identifier_part_character for
5555         the rest of the string.
5556
5557 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5558
5559         * expression.cs (UnaryMutator.EmitCode): When I updated
5560         LocalVariableReference.DoResolve, I overdid it, and dropped an
5561         optimization done on local variable references.
5562
5563 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5564
5565         * ecore.cs: Convert the return from Ldlen into an int.
5566
5567 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5568
5569         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5570         the accessibility, this is a special case for toplevel non-public
5571         classes (internal for instance).
5572
5573 2003-10-20  Nick Drochak <ndrochak@gol.com>
5574
5575         * ecore.cs: Fix typo and build.  Needed another right paren.
5576
5577 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5578
5579         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5580         `internal' case regular and protected, but not allowing protected
5581         to be evaluated later.  Bug 49840
5582
5583 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5584
5585         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5586         to kb.Nlast, and not the kb.nFirst to isolate the switch
5587         statement.
5588
5589         Extract the underlying type, so enumerations of long/ulong are
5590         treated like long/ulong.
5591
5592 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5593
5594         * expression.cs (New): Overload the meaning of RequestedType to
5595         track the possible creation of the NewDelegate type, since
5596         DoResolve is invoked more than once for new constructors on field
5597         initialization.
5598
5599         See bugs: #48800 and #37014
5600
5601         * cs-parser.jay (declare_local_constants): Take an arraylist
5602         instead of a single constant.
5603
5604         (local_constant_declaration): It should take a
5605         constant_declarators, not a constant_declarator.  Fixes 49487
5606
5607         * convert.cs: Fix error report.
5608
5609 2003-10-13 Jackson Harper <jackson@ximian.com>
5610
5611         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5612         bug #49611
5613         
5614 2003-11-03  Martin Baulig  <martin@ximian.com>
5615
5616         * expression.cs (ArrayAccess.GetStoreOpcode): Added
5617         `out bool has_type_arg'; if set, we need to pass the type to
5618         ig.Emit().
5619         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
5620         Stelem_Any/Ldelem_Any for generic parameters.   
5621
5622 2003-11-02  Martin Baulig  <martin@ximian.com>
5623
5624         * expression.cs (Invocation.EmitCall): Use
5625         `TypeManager.IsValueType()' to check whether it's a value type.
5626         Don't set `struct_call' when calling a method on a type parameter.
5627
5628 2003-11-02  Martin Baulig  <martin@ximian.com>
5629
5630         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
5631         and removed the TypeBuilder argument.
5632
5633         * typemanager.cs (TypeManager.IsValueType): Return
5634         `t.IsGenericParameter || t.IsValueType'.
5635
5636 2003-10-25  Martin Baulig  <martin@ximian.com>
5637
5638         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
5639         call ConstructedType.Resolve() on it.
5640
5641         * generic.cs (ConstructedType.Resolve): Set `type' on success.
5642
5643 2003-10-25  Martin Baulig  <martin@ximian.com>
5644
5645         * class.cs (TypeContainer.GetClassBases): Changed
5646         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
5647         CS8214 reporting here.
5648         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
5649         instead of a `Type' for our parent.  In case of a recursive
5650         declaration (see tests/gen-23.cs for an example), our parent is a
5651         ConstructedType and it doesn't have its type set.  So, first
5652         create our own TypeBuilder, then call constructed.Resolve() to get
5653         the parent's type and finally TypeBuilder.SetParent() it.
5654
5655         * ecore.cs (TypeExpr.Name): New public virtual property.
5656
5657         * generic.cs
5658         (ConstructedType): We're now a TypeExpr and not just an Expression.
5659         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
5660         arguments here; this is done later.
5661         (ConstructedType.Resolve): New public method to resolve the type
5662         arguments and bind them.
5663
5664 2003-10-21  Martin Baulig  <martin@ximian.com>
5665
5666         * convert.cs: Use `TypeManager.IsValueType' instead of
5667         'type.IsValueType' everywhere.
5668
5669         * typemanager.cs (TypeManager.IsValueType): Return true for type
5670         parameters.  The reason for this is that we need to box a type
5671         parameter when converting it to a reference type.
5672
5673         * cs-parser.jay: Added support for default value expressions.
5674
5675         * generics.cs (DefaultValueExpression): New public class.       
5676
5677 2003-10-17  Martin Baulig  <martin@ximian.com>
5678
5679         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
5680         TypeContainer so we can also use this for Interfaces.
5681         (TypeParameter.Resolve): Likewise.
5682
5683         * interface.cs (Interface.DefineType): Added support for generic
5684         interfaces.
5685
5686         * cs-parser.jay: Added support for generic structs and interfaces.
5687
5688 2003-10-17  Martin Baulig  <martin@ximian.com>
5689
5690         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
5691         call generic methods :-)
5692
5693 2003-10-16  Martin Baulig  <martin@ximian.com>
5694
5695         * cs-parser.jay (namespace_or_type_name): Only create a
5696         GenericMemberAccess if we actually have type arguments.
5697
5698 2003-10-13  Martin Baulig  <martin@ximian.com>
5699
5700         * class.cs (Method.Define): If we're a generic method, call
5701         TypeBuilder.DefineGenericMethod () before resolving
5702         the parameters.
5703         (MethodData): Added .ctor which takes an additional MethodBuilder
5704         argument; this is used for generic methods.
5705         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
5706         we already have a MethodBuilder.
5707
5708 2003-10-10  Martin Baulig  <martin@ximian.com>
5709
5710         * class.cs (Method): Added .ctor which takes a `GenericMethod'
5711         instead of a `DeclSpace'.  This is used for generic methods.
5712
5713         * cs-parser.jay (method_header): Added support for generic
5714         methods; create a `GenericMethod' instance and pass it to the
5715         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
5716         parameters and locals.
5717
5718         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
5719         since we already have the location.  Check whether we're a generic
5720         type declaration or a generic method and create the correct type
5721         parameter.
5722
5723         * generic.cs (TypeParameter.DefineMethod): New public method.
5724         (GenericMethod): New public class; derives from DeclSpace and is
5725         used for generic methods.       
5726
5727 2003-10-09  Martin Baulig  <martin@ximian.com>
5728
5729         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5730         to the .ctor.
5731         (MethodCore.DoDefineParameters): Removed the TypeContainer
5732         argument; use the DeclSpace which was passed to the .ctor instead.
5733         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5734         TypeContainer; we only need a DeclSpace here.
5735
5736 2003-10-09  Martin Baulig  <martin@ximian.com>
5737
5738         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5739         to the .ctor.
5740         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5741         EmitContext's .ctor.    
5742
5743 2003-10-09  Martin Baulig  <martin@ximian.com>
5744
5745         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5746         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5747         AsAccessible(), moved them as well.
5748
5749         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5750
5751 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5752
5753         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5754         generation for >=, as spotted by Paolo, bug 48679.  
5755         Patch from David Waite.
5756
5757         * cs-tokenizer.cs: Add handling for #pragma.
5758
5759         * cs-parser.jay: Allow for both yield and yield return in the
5760         syntax.  The anti-cobolization of C# fight will go on!
5761
5762         * class.cs (TypeBuilder.DefineType): Catch error condition here
5763         (Parent.DefineType erroring out and returning null).
5764
5765         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5766         coping with enumerations variables, we were mistakenly processing
5767         them as a regular value type instead of built-in types.  Fixes the
5768         bug #48063
5769
5770         * typemanager.cs (IsBuiltinOrEnum): New method.
5771
5772 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5773
5774         * cs-parser.jay: Upgrade: yield now needs the return clause.
5775
5776 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5777
5778         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5779
5780 2003-09-29  Martin Baulig  <martin@ximian.com>
5781
5782         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
5783         inflated generic methods.
5784
5785         * generics.cs (ConstructedType): Distinguish between open and
5786         closed constructed types; correctly resolve the arguments.
5787
5788 2003-09-22  Martin Baulig  <martin@ximian.com>
5789
5790         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
5791         all type arguments meet their constraints.
5792
5793 2003-09-19  Martin Baulig  <martin@ximian.com>
5794
5795         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5796         `MemberCache parent' argument.  Normally, an interface doesn't
5797         have a parent type except System.Object, but we use this in gmcs
5798         for generic type parameters.
5799
5800 2003-09-18  Martin Baulig  <martin@ximian.com>
5801
5802         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5803         on `type.IsInterface'; don't check whether the type has a parent
5804         to determine whether it's an interface.
5805
5806 2003-09-17  Martin Baulig  <martin@ximian.com>
5807
5808         * generic.cs (ConstructedType.ToString): Always use `name' as the
5809         type name.
5810
5811 2003-09-15  Martin Baulig  <martin@ximian.com>
5812
5813         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
5814
5815         * generic.cs (Constraints.Resolve): New public method; this is
5816         called to resolve the constraint types and to check whether all
5817         the constraints are correct.
5818         (Constraints.Types): New public property.
5819         (TypeParameter.Resolve): New public method; resolves all the
5820         type's constraints.
5821
5822         * class.cs (TypeContainer.DefineType): Call
5823         TypeParameter.Resolve() before actually defining the type.
5824
5825 2003-09-15  Martin Baulig  <martin@ximian.com>
5826
5827         * class.cs (TypeContainer.DefineType): Added an error flag to
5828         avoid reporting duplicate CS0146's ("class definition is
5829         circular.").
5830
5831         * driver.cs (Driver.MainDriver): Abort if
5832         RootContext.ResolveTree() reported any errors.
5833
5834 2003-09-07  Martin Baulig  <martin@ximian.com>
5835
5836         * report.cs (Error, Warning): Added overloaded versions which take
5837         a `params object[] args' and call String.Format().
5838
5839 2003-09-07  Martin Baulig  <martin@ximian.com>
5840
5841         * decl.cs (DeclSpace..ctor): Don't call
5842         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5843         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5844         (DeclSpace.RecordDecl): New method.
5845
5846         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5847
5848 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5849
5850         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5851         value attributes to be applied to ParameterBuilders.
5852
5853         * class.cs (MethodCore.LabelParameters): Make static and more
5854         generic so that it can be used from other places - like interface
5855         methods, for instance.
5856
5857         * interface.cs (Interface.Emit): Call LabelParameters before
5858         emitting attributes on the InterfaceMethod.
5859
5860 2003-09-07  Martin Baulig  <martin@ximian.com>
5861
5862         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
5863         if the number of type parameters doesn't match.
5864
5865 2003-09-04  Martin Baulig  <martin@ximian.com>
5866
5867         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
5868         for arrays of generic type params (ie. `!0[]').
5869
5870 2003-09-04  Martin Baulig  <martin@ximian.com>
5871
5872         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
5873         for the moment.
5874
5875 2003-09-04  Martin Baulig  <martin@ximian.com>
5876
5877         * decl.cs (DeclSpace.LookupGeneric): New method.
5878         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
5879         moment.
5880
5881         * generic.cs (TypeParameterExpr): Take a TypeParameter as
5882         argument, not just a string.
5883         (TypeParameter.Define): New public method; this is called to
5884         actually define the generic parameter; after this, you can use the
5885         new `Type' property to get the type.
5886
5887 2003-09-04  Martin Baulig  <martin@ximian.com>
5888
5889         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
5890         is now an ArrayList; initialize the result of the `TypeParameters'
5891         property here.
5892         (DeclSpace.GetGenericData): Removed.
5893         (DeclSpace.LookupGeneric): Temporarily removed; we need to
5894         implement this in a different way.
5895         (DeclSpace.GetTypeParameters): Removed; there's now a
5896         `TypeParameters' property.
5897         (DeclSpace.TypeParameters): New public property.
5898
5899         * generic.cs (Constraints): Make this class public.
5900         (TypeParameter): New public class.
5901
5902 2003-09-04  Martin Baulig  <martin@ximian.com>
5903
5904         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
5905         generic parameters.
5906
5907         * class.cs (TypeContainer.DefineType): Call
5908         TypeBuilder.DefineGenericParameter () on all generic parameters if
5909         this is a generic type.
5910
5911 2003-08-28  Martin Baulig  <martin@ximian.com>
5912
5913         * sample-stack.il: Compile this with ilasm: "ilasm /dll
5914         sample-stack.il".
5915
5916         * sample-hello.cs: Compile this with gmcs: "gmcs
5917         /r:sample-stack.dll sample-hello.cs".
5918
5919 2003-08-28  Martin Baulig  <martin@ximian.com>
5920
5921         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
5922         the parameters to the generic type.
5923
5924 2003-08-28  Martin Baulig  <martin@ximian.com>
5925
5926         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
5927
5928 2003-08-28  Martin Baulig  <martin@ximian.com>
5929
5930         * cs-parser.jay (opt_type_argument_list): Use
5931         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
5932         (primary_expression): Replace `qualified_identifier' with `type_name'.
5933         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
5934
5935         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
5936         parser to check whether it is syntactically a type parameter list;
5937         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
5938         this case.
5939
5940 2003-08-26  Martin Baulig  <martin@ximian.com>
5941
5942         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5943         resolving aliases; fixes #47927.
5944
5945 2003-08-26  Martin Baulig  <martin@ximian.com>
5946
5947         * statement.cs (Using.DoResolve): This is internally emitting a
5948         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5949         do not always return.  Fixes #47681.
5950
5951 2003-08-26  Martin Baulig  <martin@ximian.com>
5952
5953         * decl.cs (MemberCore): Moved WarningNotHiding(),
5954         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5955         into MemberBase.
5956         (AdditionResult): Make this nested in DeclSpace.
5957         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5958         argument; call NamespaceEntry.Define() unless we're nested in a
5959         class or struct.
5960
5961         * namespace.cs (Namespace.DefineName): New public function.  This
5962         is called from DeclSpace's .ctor to add 
5963         (Namespace.Lookup): Include DeclSpaces in the lookup.
5964
5965         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5966
5967         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5968
5969 2003-08-25  Martin Baulig  <martin@ximian.com>
5970
5971         * convert.cs (Convert.ExplicitReferenceConversion): When
5972         converting from an interface type to a class, unbox if the target
5973         type is a struct type.  Fixes #47822.
5974
5975 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5976
5977         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5978         #47854.
5979
5980 2003-08-22  Martin Baulig  <martin@ximian.com>
5981
5982         * class.cs (TypeManager.DefineType): When defining a nested type,
5983         call DefineType() on our parent; fixes #47801.
5984
5985 2003-08-22  Martin Baulig  <martin@ximian.com>
5986
5987         * class.cs (MethodData.Define): While checking if a method is an
5988         interface implementation, improve the test a bit more to fix #47654.
5989
5990 2003-08-22  Martin Baulig  <martin@ximian.com>
5991
5992         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5993         correctly; fixes #47722.
5994
5995 2003-08-22  Martin Baulig  <martin@ximian.com>
5996
5997         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5998         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5999
6000         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
6001
6002 2003-08-22  Martin Baulig  <martin@ximian.com>
6003
6004         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
6005         can only be assigned in static constructors.  Fixes #47161.
6006
6007 2003-08-22  Martin Baulig  <martin@ximian.com>
6008
6009         Rewrote and improved the flow analysis code.
6010
6011         * flowbranching.cs (FlowBranching): Make this class abstract.
6012         (FlowBranching.CreateBranching): New static function to create a
6013         new flow branching.
6014         (FlowBranchingBlock, FlowBranchingException): New classes.
6015         (FlowBranching.UsageVector.Type): New public readonly field.
6016         (FlowBranching.UsageVector.Breaks): Removed the setter.
6017         (FlowBranching.UsageVector.Returns): Removed the setter.
6018         (FlowBranching.UsageVector): Added Break(), Return(),
6019         NeverReachable() and Throw() methods to modify the reachability.
6020         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
6021         done by FlowBranching.Merge().
6022         (FlowBranching.UsageVector.MergeChild): New method; merges the
6023         merge result into the current vector.
6024         (FlowBranching.Merge): New abstract method to merge a branching.
6025
6026 2003-08-12  Martin Baulig  <martin@ximian.com>
6027
6028         * expression.cs (Indirection.CacheTemporaries): Create the
6029         LocalTemporary with the pointer type, not its element type.
6030
6031 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
6032
6033         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
6034         token was a keyword or not.
6035
6036         Add `error' options where an IDENTIFIER was expected;  Provide
6037         CheckToken and CheckIdentifierToken convenience error reporting
6038         functions. 
6039
6040         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
6041
6042         * decl.cs: Rename `NamespaceEntry Namespace' public field into
6043         NameSpaceEntry NameSpaceEntry.
6044
6045         (LookupInterfaceOrClass): Avoid creating a full qualified name
6046         from namespace and name: avoid doing lookups when we know the
6047         namespace is non-existant.   Use new Tree.LookupByNamespace which
6048         looks up DeclSpaces based on their namespace, name pair.
6049
6050         * driver.cs: Provide a new `parser verbose' to display the
6051         exception thrown during parsing.  This is turned off by default
6052         now, so the output of a failure from mcs is more graceful.
6053
6054         * namespace.cs: Track all the namespaces defined in a hashtable
6055         for quick lookup.
6056
6057         (IsNamespace): New method
6058
6059 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
6060
6061         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
6062         we know that we need to concatenate (full typename can never be
6063         null). 
6064
6065         * class.cs: ditto.
6066
6067         * statement.cs: Use a bitfield;  Do not initialize to null things
6068         which are done by the constructor by default.
6069
6070         * cs-parser.jay: bug fix, parameter was 4, not 3.
6071
6072         * expression.cs: Just use the property;
6073
6074         * statement.cs: No need for GetVariableInfo method.
6075
6076 2003-08-08  Martin Baulig  <martin@ximian.com>
6077
6078         * flowanalysis.cs (FlowReturns): This is now nested in the
6079         `FlowBranching' class.
6080         (MyBitVector): Moved this here from statement.cs.
6081         (FlowBranching.SiblingType): New enum type.
6082         (FlowBranching.CreateSibling): Added `SiblingType' argument.
6083
6084 2003-08-07  Martin Baulig  <martin@ximian.com>
6085
6086         * flowanalysis.cs (FlowBranchingType): This is now nested in the
6087         `FlowBranching' class and called `BranchingType'.
6088
6089 2003-08-07  Martin Baulig  <martin@ximian.com>
6090
6091         * flowanalysis.cs: Moved all the control flow analysis code into
6092         its own file.
6093
6094 2003-08-07  Martin Baulig  <martin@ximian.com>
6095
6096         * assign.cs (Assign.DoResolve): `target' must either be an
6097         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
6098         #37319.
6099
6100 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
6101
6102         * expression.cs (BinaryMethod): This kind of expression is created by the
6103         Binary class if it determines that the operator has to be handled
6104         by a method.
6105
6106         (BinaryDelegate): This kind of expression is created if we are
6107         dealing with a + or - operator on delegates.
6108
6109         (Binary): remove method, argumetns, and DelegateOperator: when
6110         dealing with methods, 
6111
6112         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
6113
6114         * statement.cs (Block): use bitfields for the three extra booleans
6115         we had in use.   Remove unused topblock parameter.
6116
6117         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
6118
6119         * assign.cs: Drop extra unneeded tests.
6120
6121 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
6122
6123         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
6124
6125         * statement.cs (Foreach): Use VariableStorage instead of
6126         LocalBuilders.   
6127
6128         * codegen.cs (VariableStorage): New class used by clients that
6129         require a variable stored: locals or fields for variables that
6130         need to live across yield.
6131
6132         Maybe provide a convenience api for EmitThis+EmitLoad?
6133
6134         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
6135         these bad boys.
6136
6137 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
6138
6139         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
6140         RemapParameterLValue): New methods that are used to turn a
6141         precomputed FieldInfo into an expression like this:
6142
6143                 instance.FieldInfo
6144
6145         The idea is to use this instead of making LocalVariableReference
6146         have more than one meaning.
6147
6148         * cs-parser.jay: Add error production to BASE.
6149
6150         * ecore.cs: Deal with TypeManager.GetField returning null, which
6151         is now a valid return value.
6152
6153         (FieldExprNoAddress): New expression for Fields whose address can
6154         not be taken.
6155
6156         * expression.cs (LocalVariableReference): During the resolve
6157         phases, create new expressions if we are in a remapping context.
6158         Remove code that dealt with remapping here.
6159
6160         (ParameterReference): same.
6161
6162         (ProxyInstance): New expression, like the `This' expression, but
6163         it is born fully resolved.  We know what we are doing, so remove
6164         the errors that are targeted to user-provided uses of `this'.
6165
6166         * statement.cs (Foreach): our variable is now stored as an
6167         Expression;  During resolution, follow the protocol, dont just
6168         assume it will return this.
6169
6170 2003-08-06  Martin Baulig  <martin@ximian.com>
6171
6172         * support.cs (SeekableStreamReader.cs): New public class.
6173
6174         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
6175         SeekableStreamReader instead of the normal StreamReader.
6176
6177 2003-08-04  Martin Baulig  <martin@ximian.com>
6178
6179         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
6180         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
6181         deambiguate casts and delegate invocations.
6182         (parenthesized_expression): Use the new tokens to ensure this is
6183         not a cast of method invocation.
6184
6185         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
6186         when reading a `)' and Deambiguate_CloseParens () was previously
6187         called.
6188
6189         * expression.cs (ParenthesizedExpression): New class.  This is
6190         just used for the CS0075 test.
6191         (Binary.DoResolve): Check for CS0075.   
6192
6193 2003-07-29  Ravi Pratap  <ravi@ximian.com>
6194
6195         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
6196         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
6197         reference comparison.
6198
6199         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
6200         examine the ReturnType for equality - this is necessary in the
6201         cases of implicit and explicit operators whose signature also
6202         includes the return type.
6203
6204 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
6205
6206         * namespace.cs: Cache the result of the namespace computation,
6207         instead of computing it every time.
6208
6209 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6210
6211         * decl.cs: Use a global arraylist that we reuse over invocations
6212         to avoid excesive memory consumption.  Reduces memory usage on an
6213         mcs compile by one meg (45 average).
6214
6215         * typemanager.cs (LookupTypeReflection): In .NET pointers are
6216         private, work around that.
6217
6218 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
6219
6220         * literal.cs (IntLiteral): Define Zero and One static literals. 
6221
6222         * cs-parser.jay (integer_literal): use static literals to reduce
6223         memory usage for the most used literals (0, 1 and -1).  211kb
6224         reduced in memory usage.
6225
6226         Replace all calls to `new ArrayList' with `new
6227         ArrayList(4)' which is a good average number for most allocations,
6228         and also requires only 16 bytes of memory for its buffer by
6229         default. 
6230
6231         This reduced MCS memory usage in seven megabytes for the RSS after
6232         bootstrapping.
6233
6234 2003-07-28  Ravi Pratap  <ravi@ximian.com>
6235
6236         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
6237         handle params methods the correct way by forming only one
6238         applicable set with params and normal methods in them. Earlier we
6239         were looking at params methods only if we found no normal methods
6240         which was not the correct thing to do.
6241
6242         (Invocation.BetterFunction): Take separate arguments indicating
6243         when candidate and the best method are params methods in their
6244         expanded form.
6245
6246         This fixes bugs #43367 and #46199.
6247
6248         * attribute.cs: Documentation updates.
6249
6250         (CheckAttribute): Rename to CheckAttributeTarget.
6251         (GetValidPlaces): Rename to GetValidTargets.
6252
6253         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
6254         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
6255
6256         Fixes bug #44468.
6257
6258 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
6259
6260         * codegen.cs: Compute IsGeneric correctly.
6261
6262         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
6263         resolution. 
6264
6265         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
6266         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
6267         regressions, and I was chasing more bugs than I required.
6268
6269         * interface.cs: Use expressions for base type names (like classes
6270         and structs have been doing for a while now), and resolve that.
6271         This patch should probably go into head as well.
6272
6273         This makes it one less user of FindType.
6274
6275 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6276
6277         This compiler can not self host currently.  Need to fix that.
6278         
6279         * Makefile: compile to `gmcs.exe'
6280
6281         * driver.cs: Turn on v2 by default on gmcs.
6282
6283         * generic.cs (ConstructedType): Does no longer take a container
6284         type argument;  That will be taken care of later.
6285
6286         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
6287         Use SimpleName to resolve for now, so we can continue the work on
6288         the parser, until we get Type.GetType that understands generics.
6289
6290         (ConstructedType.ToString): Implement
6291
6292         (TypeArguments.Resolve): Resolve the child expressions as types. 
6293         
6294         * cs-parser.jay: Rename interface_constraints to
6295         type_parameter_constraints
6296
6297         (namespace_or_type_name): Only use constructed types for the basic
6298         construction, we will deal with identifier<...> later.
6299
6300         (type/type_name): No longer call DecomposeQI, as
6301         namespace_or_type_name is always decoded now.
6302         
6303 2003-07-22  Ravi Pratap  <ravi@ximian.com>
6304
6305         * expression.cs (Invocation.OverloadResolve): Follow the spec more
6306         closely: we eliminate methods in base types when we have an
6307         applicable method in a top-level type.
6308
6309         Please see section 14.5.5.1 for an exact description of what goes
6310         on. 
6311
6312         This fixes bug #45127 and a host of other related to corlib compilation.
6313
6314         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
6315         array is the method corresponding to the top-level type (this is
6316         because of the changes made to icall.c) so we change this
6317         accordingly.
6318
6319         (MethodGroupExpr.Name): This too.
6320
6321         * typemanager.cs (GetElementType): New method which does the right
6322         thing when compiling corlib. 
6323
6324         * everywhere: Make use of the above in the relevant places.
6325
6326 2003-07-22  Martin Baulig  <martin@ximian.com>
6327
6328         * cs-parser.jay (invocation_expression): Moved
6329         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
6330         `cast_expression', but create a InvocationOrCast which later
6331         resolves to either an Invocation or a Cast.
6332
6333         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
6334         method; call this before EmitStatement() to make sure that this
6335         expression can be used as a statement.
6336
6337         * expression.cs (InvocationOrCast): New class; resolves to either
6338         an Invocation or a Cast.
6339
6340         * statement.cs (StatementExpression): Call ResolveStatement() on
6341         the ExpressionStatement before emitting it.
6342
6343 2003-07-21  Martin Baulig  <martin@ximian.com>
6344
6345         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
6346         `ref' and `out' attributes match; fixes #46220.
6347         (MemberAccess.ResolveMemberAccess): You can't reference a type
6348         through an expression; fixes #33180.
6349         (Indexers.GetIndexersForType): Don't return the indexers from
6350         interfaces the class implements; fixes #46502.
6351
6352 2003-07-21  Martin Baulig  <martin@ximian.com>
6353
6354         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
6355         CS0661 checks; fixes bug #30442.
6356
6357 2003-07-21  Martin Baulig  <martin@ximian.com>
6358
6359         * decl.cs (AdditionResult): Added `Error'.
6360
6361         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
6362
6363         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
6364         cs0031.cs actually work.
6365
6366  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6367  
6368         * cs-parser.jay (namespace_name): do not use
6369         namespace_or_type_name, use qualified_identifier, because
6370         namespace_or_type_name will soon return a composed expression
6371         instead of a string.
6372  
6373         (namespace_or_type_name): Instead of returning a string, now this
6374         production returns an expression.
6375  
6376         * codegen.cs (EmitContext): Setup IsGeneric property based on
6377         whether our DeclSpace is generic, our the method is generic.
6378  
6379         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
6380         the method is generic.
6381  
6382         * cs-parser.jay (type_arguments, opt_type_argument_list,
6383         type_parameters, type_parameter_list, opt_type_parameter_list,
6384         type_parameter,, opt_type_parameter_constraints_clauses,
6385         type_parameter_constraints_clauses,
6386         type_parameter_constraint_clause, type_parameter_constraint,
6387         interface_constraints): Add new production
6388  
6389         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
6390         DeclSpace is generic or not.
6391  
6392         (DeclSpace.SetParameterInfo): New routine, used to set the
6393         parameter info for a type.
6394  
6395         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
6396         returns a GenericTypeExpr
6397  
6398         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
6399         generic, lookup the generic argument.
6400  
6401         * attribute.cs: Do not allow TypeParameterExpressions in
6402         Attributes.
6403  
6404         * class.cs: Do not allow the Main method to be defined in a
6405         Generic container.
6406  
6407         * expression.cs (SizeOf): Do not allow generic types to be used as
6408         arguments to sizeof.
6409  
6410         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
6411         it: whether a type is generic or not.  Only works for types we are
6412         currently building for now.
6413         
6414 2003-07-20  Martin Baulig  <martin@ximian.com>
6415
6416         * namespace.cs: Fixed that bug which caused a crash when compiling
6417         the debugger's GUI.
6418
6419 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6420
6421         * typemanager.cs (LookupTypeReflection): Never expose types which
6422         are NotPublic, NestedPrivate, NestedAssembly, or
6423         NestedFamANDAssem.  We used to return these, and later do a check
6424         that would report a meaningful error, but the problem is that we
6425         would not get the real match, if there was a name override.
6426
6427 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
6428
6429         * namespace.cs (Namespace, Name): Do not compute the namespace
6430         name dynamically, compute it in the constructor.  This reduced
6431         memory usage by 1697 KB.
6432
6433         * driver.cs: Use --pause to pause at the end.
6434
6435 2003-07-17  Peter Williams  <peter@newton.cx>
6436
6437         * Makefile: Change the name of the test target so that it doesn't
6438         conflict with the recursive test target.
6439
6440 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
6441
6442         * expression.cs (LocalVariableReference.Emit, EmitAssign,
6443         AddressOf): Do not use EmitThis, that was wrong, use the actual
6444         this pointer.
6445
6446 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
6447
6448         * class.cs (MethodData.Define): While checking if a method is an
6449         interface implementation, improve the test: If we are not public
6450         (use new test here: use the computed MethodAttributes directly,
6451         instead of the parsed modifier flags) check if the `implementing'
6452         method comes from an interface or not.
6453
6454         * pending.cs (VerifyPendingMethods): Slightly better error
6455         message.
6456
6457         * makefile: add test target that does the mcs bootstrap.
6458
6459 2003-07-16  Ravi Pratap  <ravi@ximian.com>
6460
6461         * interface.cs (Define): Do nothing here since there are no
6462         members to populate etc. Move the attribute emission out of here
6463         since this was just totally the wrong place to put it. Attribute
6464         application happens during the 'Emit' phase, not in the 'Define'
6465         phase.
6466
6467         (Emit): Add this method and move the attribute emission here
6468
6469         * rootcontext.cs (EmitCode): Call the Emit method on interface
6470         types too.
6471
6472 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6473
6474         * expression.cs (OverloadResolve): Report error only if Location
6475         is not 'Null' which means that there was a probe going on.
6476
6477 2003-07-14  Martin Baulig  <martin@ximian.com>
6478
6479         * expression.cs (ConditionalLogicalOperator): New public class to
6480         implement user defined conditional logical operators.
6481         This is section 14.11.2 in the spec and bug #40505.
6482
6483 2003-07-14  Martin Baulig  <martin@ximian.com>
6484
6485         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6486
6487 2003-07-14  Martin Baulig  <martin@ximian.com>
6488
6489         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6490
6491         * ecore.cs (IVariable.VerifyFixed): New interface method.
6492
6493         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6494         operator, check whether the variable is actually fixed.  Fixes bug
6495         #36055.  Set a variable definitely assigned when taking its
6496         address as required by the spec.
6497
6498         * statement.cs (LocalInfo.IsFixed): New field.
6499         (LocalInfo.MakePinned): Set `IsFixed' to true.
6500
6501 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6502
6503         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6504         for .ctors, ensure that we only ask for members declared in the
6505         attribute type (BindingFlags.DeclaredOnly).
6506
6507         Fixes bug #43632.
6508
6509         * expression.cs (Error_WrongNumArguments): Report error 1501
6510         correctly the way CSC does.
6511
6512 2003-07-13  Martin Baulig  <martin@ximian.com>
6513
6514         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6515         lookup on the fully qualified name, to make things like "X.X" work
6516         where "X.X" is a fully qualified type name, but we also have a
6517         namespace "X" in the using list.  Fixes #41975.
6518
6519 2003-07-13  Martin Baulig  <martin@ximian.com>
6520
6521         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6522         function. If we're a CompoundAssign, we need to create an embedded
6523         CompoundAssign, not an embedded Assign.
6524         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6525         Fixes #45854.
6526
6527 2003-07-13  Martin Baulig  <martin@ximian.com>
6528
6529         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6530         work to fix bug #46088.
6531
6532 2003-07-13  Ravi Pratap <ravi@ximian.com>
6533
6534         * class.cs (Operator.Emit): Do not emit attributes here - it is
6535         taken care of by the Method class that we delegate too. This takes
6536         care of bug #45876.
6537
6538 2003-07-10  Martin Baulig  <martin@ximian.com>
6539
6540         * expression.cs (TypeOfVoid): New class.
6541         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6542
6543 2003-07-10  Martin Baulig  <martin@ximian.com>
6544
6545         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6546         bug #35957.
6547
6548 2003-07-10  Martin Baulig  <martin@ximian.com>
6549
6550         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6551         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6552
6553         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6554
6555         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6556
6557 2003-07-10  Martin Baulig  <martin@ximian.com>
6558
6559         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6560         of decimal.  Fixes #42850.
6561
6562         NOTE: I also fixed the created byte blob, but this doesn't work on
6563         the MS runtime and csc never produces any byte blobs for decimal
6564         arrays.
6565
6566 2003-07-10  Martin Baulig  <martin@ximian.com>
6567
6568         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6569         structs; fixes #32068.
6570         (Block.AddChildVariableNames): Fixed #44302.
6571
6572 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6573
6574         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6575
6576 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6577
6578         * attribute.cs: And this test is onger needed.
6579
6580 2003-07-08  Martin Baulig  <martin@ximian.com>
6581
6582         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6583         inaccessible types.  Fixes #36313.
6584
6585         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6586
6587         * namespace.cs (NamespaceEntry): Create implicit entries for all
6588         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6589         implicit entries for N1.N2 and N1.
6590
6591 2003-07-08  Martin Baulig  <martin@ximian.com>
6592
6593         Rewrote the handling of namespaces to fix a lot of the issues
6594         wrt. `using' aliases etc.
6595
6596         * namespace.cs (Namespace): Splitted this class into a
6597         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6598
6599         * typemanager.cs (TypeManager.IsNamespace): Removed.
6600         (TypeManager.ComputeNamespaces): Only compute namespaces from
6601         loaded assemblies here, not the namespaces from the assembly we're
6602         currently compiling.
6603
6604 2003-07-08  Martin Baulig  <martin@ximian.com>
6605
6606         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6607
6608 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6609
6610         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6611         already fixed it.  
6612
6613         I thought about the memory savings here, but LookupTypeReflection
6614         is used under already very constrained scenarios.  Compiling
6615         corlib or mcs only exposes one hit, so it would not really reduce
6616         any memory consumption.
6617
6618 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6619
6620         * typemanager.cs: fixes bug #45889 by only adding public types from
6621         other assemblies to the list of known types.
6622
6623 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6624
6625         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6626         on the type we resolved.
6627
6628 2003-07-05  Martin Baulig  <martin@ximian.com>
6629
6630         * pending.cs (PendingImplementation.ParentImplements): Don't
6631         create the proxy if the parent is abstract.
6632
6633         * class.cs (TypeContainer.DefineIndexers): Process explicit
6634         interface implementations first.  Fixes #37714.
6635
6636 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6637
6638         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6639         defined recursively;  but since we modify the input parameters
6640         (left is set to `this' temporarily), we reset this value if the
6641         left_is_explicit is false, which gives the original semantics to
6642         the code.  
6643
6644         * literal.cs (NullPointer): new class used to represent a null
6645         literal in a pointer context.
6646
6647         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6648         type is a pointer, use a NullPointer object instead of a
6649         NullLiteral.   Closes 43687
6650
6651         (ExplicitConversion): Convert pointer values using
6652         the conv opcode to the proper type.
6653
6654         * ecore.cs (New): change ValueTypeVariable property into a method,
6655         that returns whether the valuetype is suitable for being used.
6656
6657         * expression.cs (Binary.DoNumericPromotions): Only return if we
6658         the int constant was a valid uint, and we can return both left and
6659         right as uints.  If not, we continue processing, to trigger the
6660         type conversion.  This fixes 39018.
6661
6662         * statement.cs (Block.EmitMeta): During constant resolution, set
6663         the CurrentBlock property on the emitcontext, so that we resolve
6664         constants propertly.
6665
6666 2003-07-02  Martin Baulig  <martin@ximian.com>
6667
6668         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6669         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6670
6671         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6672         than emitting it here.
6673
6674         * statement.cs: Fixed some more flow analysis bugs.
6675
6676 2003-07-02  Martin Baulig  <martin@ximian.com>
6677
6678         * class.cs (MethodData.Define): When implementing interface
6679         methods, set Final unless we're Virtual.
6680
6681         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6682         check work for interface methods.
6683
6684 2003-07-01  Martin Baulig  <martin@ximian.com>
6685
6686         * ecore.cs (EmitContext.This): Replaced this property with a
6687         GetThis() method which takes a Location argument.  This ensures
6688         that we get the correct error location for a CS0188.
6689
6690 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6691
6692         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6693         ImplicitStandardConversion.
6694
6695         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6696
6697 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6698
6699         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6700         optimization.
6701
6702 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6703
6704         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6705         constructors.
6706
6707         (MethodData.Define): Turn off initlocals for unsafe methods.
6708
6709 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6710
6711         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6712         complete;  Fixes #37521.
6713
6714         * delegate.cs: Use Modifiers.TypeAttr to compute the
6715         TypeAttributes, instead of rolling our own.  This makes the flags
6716         correct for the delegates.
6717
6718 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6719
6720         * class.cs (Constructor.Define): Set the private flag for static
6721         constructors as well.
6722
6723         * cs-parser.jay (statement_expression): Set the return value to
6724         null, to avoid a crash when we catch an error.
6725
6726 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6727
6728         * cs-parser.jay: Applied patch from Jackson that adds support for
6729         extern and unsafe modifiers to destructor declarations.
6730
6731         * expression.cs: Report error 21 if the user is trying to index a
6732         System.Array.
6733
6734         * driver.cs: Add an error message, suggested by the bug report.
6735
6736         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6737         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6738
6739 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6740
6741         * namespace.cs: Add some information to reduce FAQs.
6742
6743 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6744
6745         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6746         underlying enumeration types.  Fixes #43915.
6747
6748         * expression.cs: Treat ushort/short as legal values to be used in
6749         bitwise operations.
6750
6751 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6752
6753         * delegate.cs: transfer custom attributes for paramenters from
6754         the delegate declaration to Invoke and BeginInvoke.
6755
6756 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6757
6758         * attribute.cs: handle custom marshalers and emit marshal info
6759         for fields, too.
6760
6761 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6762
6763         * makefile.gnu: Added anonymous.cs to the compiler sources.
6764
6765 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6766
6767         * iterators.cs: Change the name of the proxy class to include two
6768         underscores.
6769
6770         * cs-parser.jay: Update grammar to include anonymous methods.
6771
6772         * anonymous.cs: new file.
6773
6774 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6775
6776         * class.cs (Field.Define): Add missing test for pointers and
6777         safety. 
6778
6779 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6780
6781         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6782         we use the stobj opcode.
6783
6784         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6785         since it wasn't the correct fix. 
6786
6787         It still is puzzling that we are required to use stobj for IntPtr
6788         which seems to be a ValueType.
6789
6790 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6791
6792         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6793         during regular simple name resolution.   Now, the trick is that
6794         instead of returning for processing the simplename, we do a
6795         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6796         contextual lookup type).   If a match is found, return that, if
6797         not, return for further composition.
6798
6799         This fixes long-standing 30485.
6800
6801         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6802         using the address to initialize an object, do an Stobj instead of
6803         using the regular Stelem.
6804
6805         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6806         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6807         Because if we are a BaseIndexerAccess that value will be true.
6808         Fixes 43643.
6809
6810         * statement.cs (GotoCase.Resolve): Return after reporting an
6811         error, do not attempt to continue. 
6812
6813         * expression.cs (PointerArithmetic.Emit): If our operand is a
6814         long, convert our constants to match the operand before
6815         multiplying.  Convert to I type before adding.   Fixes 43670.
6816
6817 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6818
6819         * enum.cs (ImplicitConversionExists) : Rename to
6820         ImplicitEnumConversionExists to remove ambiguity. 
6821
6822         * ecore.cs (NullCast): New type of cast expression class which
6823         basically is very similar to EmptyCast with the difference being
6824         it still is a constant since it is used only to cast a null to
6825         something else
6826         (eg. (string) null)
6827
6828         * convert.cs (ImplicitReferenceConversion): When casting a null
6829         literal, we return a NullCast.
6830
6831         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6832         should be around anymore.
6833
6834         The renaming (reported was slightly wrong). Corrections:
6835
6836         ConvertImplicitStandard -> ImplicitConversionStandard
6837         ConvertExplicitStandard -> ExplicitConversionStandard
6838
6839         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6840         before passing them in !
6841
6842         * convert.cs (ImplicitConversionStandard): When comparing for
6843         equal expr and target types, ensure that expr is not a
6844         NullLiteral.
6845
6846         In general, we must not be checking (expr_type ==
6847         target_type) in the top level conversion methods
6848         (ImplicitConversion, ExplicitConversion etc). This checking is
6849         done in the methods that they delegate to.
6850
6851 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6852
6853         * convert.cs: Move Error_CannotConvertType,
6854         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6855         ImplicitNumericConversion, ImplicitConversionExists,
6856         ImplicitUserConversionExists, StandardConversionExists,
6857         FindMostEncompassedType, FindMostSpecificSource,
6858         FindMostSpecificTarget, ImplicitUserConversion,
6859         ExplicitUserConversion, GetConversionOperators,
6860         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6861         TryImplicitIntConversion, Error_CannotConvertImplicit,
6862         ConvertImplicitRequired, ConvertNumericExplicit,
6863         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6864         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6865         its own file.
6866
6867         Perform the following renames:
6868
6869         StandardConversionExists -> ImplicitStandardConversionExists
6870         ConvertImplicit -> ImplicitConversion
6871         ConvertImplicitStandard -> ImplicitStandardConversion
6872         TryImplicitIntConversion -> ImplicitIntConversion
6873         ConvertImplicitRequired -> ImplicitConversionRequired
6874         ConvertNumericExplicit -> ExplicitNumericConversion
6875         ConvertReferenceExplicit -> ExplicitReferenceConversion
6876         ConvertExplicit -> ExplicitConversion
6877         ConvertExplicitStandard -> ExplicitStandardConversion
6878
6879 2003-05-19  Martin Baulig  <martin@ximian.com>
6880
6881         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6882         (TypeInfo): Added support for structs having structs as fields.
6883
6884         * ecore.cs (FieldExpr): Implement IVariable.
6885         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6886         VariableInfo for the field.
6887
6888 2003-05-18  Martin Baulig  <martin@ximian.com>
6889
6890         * expression.cs (This.DoResolve): Report a CS0027 if we're
6891         emitting a field initializer.
6892
6893 2003-05-18  Martin Baulig  <martin@ximian.com>
6894
6895         * expression.cs (This.ResolveBase): New public function.
6896         (This.DoResolve): Check for CS0188.
6897
6898         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6899         This.Resolve().
6900
6901         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6902         `instance_expression' to null if we don't have any non-static
6903         methods.
6904
6905 2003-05-18  Martin Baulig  <martin@ximian.com>
6906
6907         Reworked the way how local variables and parameters are handled by
6908         the flow analysis code.
6909
6910         * statement.cs (TypeInfo, VariableMap): New public classes.
6911         (VariableInfo): New public class.  This is now responsible for
6912         checking whether a variable has been assigned.  It is used for
6913         parameters and local variables.
6914         (Block.EmitMeta): Take the InternalParameters as argument; compute
6915         the layout of the flow vectors here.
6916         (Block.LocalMap, Block.ParameterMap): New public properties.
6917         (FlowBranching): The .ctor doesn't get the InternalParameters
6918         anymore since Block.EmitMeta() now computes the layout of the flow
6919         vector.
6920         (MyStructInfo): This class is now known as `StructInfo' and nested
6921         in `TypeInfo'; we don't access this directly anymore.
6922
6923         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6924         property and removed IsAssigned(), IsFieldAssigned(),
6925         SetAssigned() and SetFieldAssigned(); we now call them on the
6926         VariableInfo so we don't need to duplicate this code everywhere.
6927
6928         * expression.cs (ParameterReference): Added `Block block' argument
6929         to the .ctor.
6930         (LocalVariableReference, ParameterReference, This): The new
6931         VariableInfo class is now responsible for all the definite
6932         assignment stuff.
6933
6934         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6935         IsParameterAssigned, SetParameterAssigned): Removed.
6936
6937 2003-05-18  Martin Baulig  <martin@ximian.com>
6938
6939         * typemanager.cs (InitCoreTypes): Try calling
6940         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6941         the 3-args-version.  Corlib now also needs our `void_type'.
6942         (GetMethod): Added overloaded version which takes an optional
6943         `bool report_errors' to allow lookups of optional methods.
6944
6945 2003-05-12  Martin Baulig  <martin@ximian.com>
6946
6947         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6948         only used for locals and not for parameters.
6949
6950 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6951
6952         * support.cs (InternalParameters.ParameterType): Return the
6953         ExternalType of the parameter.
6954
6955         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6956         they were unused.
6957
6958 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6959
6960         * class.cs (MethodData.Define): Do not set the `newslot' on
6961         interface members, if they are also flagged as "override".
6962
6963         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6964         better code for ++i and i++.  This only works for static fields
6965         and local variables.
6966
6967         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6968         want to pull the DeclSpace out of the builder_to_declspace instead
6969         of the TypeBuilder (like in TypeContainer.FindMembers).
6970
6971         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6972         instead of LookupTypeContainer.  Fixes the crash on .NET for
6973         looking up interface members.
6974
6975         * const.cs: Create our own emit context during the Definition
6976         stage, so that constants are evaluated in the proper context, when
6977         a recursive definition happens.
6978
6979 2003-05-11  Martin Baulig  <martin@ximian.com>
6980
6981         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6982         new block for a switch section.
6983         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6984         the adding/lookup in the switch block.  Fixes #39828.
6985
6986 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6987
6988         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6989         functionality: I needed to convert the data after I had performed
6990         the add/sub operation into the operands type size.
6991
6992         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6993         pass the type for the box operation, otherwise the resulting
6994         object would have been of type object.
6995
6996         (BoxedCast): Add constructor to specify the type to box as.
6997
6998 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6999
7000         * iterators.cs: I was reusing the `count' variable inadvertently,
7001         take steps to not allow this to happen.
7002
7003 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
7004
7005         * attribute.cs (Attribute.Resolve): Params attributes are encoded
7006         by creating an array at the point where the params starts and
7007         putting all those arguments there, then adjusting the size of the
7008         array.
7009
7010 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
7011
7012         * expression.cs (New.AddressOf): Implement interface
7013         IMemoryLocation.  This is used when the `new' operator is used in
7014         the context of an invocation to a method on a value type.
7015
7016         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
7017         example. 
7018
7019         * namespace.cs: Also check the using aliases here.
7020
7021         * driver.cs: Move the test for using validity after the types have
7022         been entered, so we do a single pass that also includes the using
7023         aliases. 
7024
7025         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
7026         in the regular case.   CreateSiblingForFinally is doing extra
7027         error checking.
7028
7029         * attribute.cs (GetAttributeArgumentExpression): Store the result
7030         on an out value, and use the return value to indicate failure
7031         instead of using null (which is a valid return for Constant.GetValue).
7032
7033         * statement.cs: Perform the analysis flow for the increment
7034         portion after the statement, because this will be the real flow of
7035         execution.  Fixes #42385
7036
7037         * codegen.cs (EmitContext.EmitArgument,
7038         EmitContext.EmitStoreArgument): New helper functions when the
7039         RemapToProxy flag is set.
7040
7041         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
7042         function.
7043
7044         Add support for remapping parameters. 
7045
7046         * iterators.cs: Propagate parameter values;  Store parameter
7047         values in the proxy classes.
7048
7049 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
7050
7051         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
7052         need a proxy reference;  I do not know what I was thinking
7053
7054         * cs-parser.jay (constructor_initializer): catch another error,
7055         and display nice message.
7056
7057         (field_declaration): catch void field declaration
7058         to flag a better error. 
7059
7060         * class.cs (MemberBase.CheckBase): Report an error instead of a
7061         warning if a new protected member is declared in a struct. 
7062         (Field.Define): catch the error of readonly/volatile.
7063
7064         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
7065
7066         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
7067         volatile variable is taken
7068
7069 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
7070
7071         * statement.cs (Fixed.Resolve): Report an error if we are not in
7072         an unsafe context.
7073
7074 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
7075
7076         * typemanager.cs: reuse the code that handles type clashes for
7077         delegates and enumerations.
7078
7079         * class.cs (Report28): Always report.
7080
7081         * expression.cs (EncodeAsAttribute): Allow nulls here.
7082
7083 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
7084
7085         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
7086         the functionality for testing whether an expression is valid for
7087         an attribute here.  Also handle the case of arrays of elements
7088         being stored. 
7089
7090         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
7091         encoding a linear array into an array of objects that are suitable
7092         to be passed to an CustomAttributeBuilder.
7093
7094         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
7095
7096         * ecore.cs: (FieldExpr): Handle field remapping here.
7097
7098         * iteratators.cs: Pass the instance variable (if the method is an
7099         instance method) to the constructors, so we can access the field
7100         variables on the class.
7101
7102         TODO: Test this with structs.  I think the THIS variable on
7103         structs might have to be a pointer, and not a refenrece
7104
7105 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
7106
7107         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
7108         local variables to fields in a proxy class.
7109
7110         * iterators.cs (PopulateProxy): Rename our internal fields to
7111         <XXX>.  
7112         Create a <THIS> field if we are an instance method, so we can
7113         reference our parent container variables.
7114         (MapVariable): Called back from the EmitContext code to enter a
7115         new variable to field mapping into the proxy class (we just create
7116         a FieldBuilder).
7117
7118         * expression.cs
7119         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
7120         for using the remapped locals to fields.
7121
7122         I placed the code here, because that gives the same semantics to
7123         local variables, and only changes the Emit code.
7124
7125         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
7126         statements inside iterators.
7127         (VariableInfo): Add a FieldBuilder for the cases when we are
7128         remapping local variables to fields in a proxy class
7129
7130         * ecore.cs (SimpleNameResolve): Avoid testing two times for
7131         current_block != null.
7132
7133         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
7134         not cope with strings, as it has been moved to the
7135         TableSwitchEmit.  Fixed bug in switch generation.
7136
7137         * expression.cs (New.DoResolve): Provide more context for the user
7138         when reporting an error.
7139
7140         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
7141         pointers. 
7142
7143         * expression.cs (MemberAccess.DoResolve): When we get a type back,
7144         check the permissions for it.  Note than in a type-resolution
7145         context the check was already present in DeclSpace.ResolveType,
7146         but was missing from the MemberAccess.
7147
7148         (ArrayCreation.CheckIndices): warn if the user has
7149         more nested levels of expressions, but there are no more
7150         dimensions specified.  Avoids crash on bug 41906.
7151
7152 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
7153
7154         * statement.cs (Block): replace Implicit bool, for a generic
7155         flags.   
7156         New flag: `Unchecked'.  This is used during the EmitMeta phase
7157         (which is out-of-line with the regular Resolve/Emit process for a
7158         statement, as this is done ahead of time, but still gets a chance
7159         to call constant resolve).
7160
7161         (Block.Flags): new enum for adding a new flag.
7162
7163         (Block.EmitMeta): track the state of unchecked.
7164
7165         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
7166         to enable constant resolution to work there as well.
7167
7168 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
7169
7170         * typemanager.cs (ienumerable_type): Also look up
7171         System.Collections.IEnumerable. 
7172
7173 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
7174
7175         TODO: Test more than one conditional per method.
7176
7177         * class.cs (Indexer.Define): Report the location where the user is
7178         referencing the unsupported feature.
7179
7180         (MethodData): Overload the use of `conditionals' to
7181         minimize the creation of needless ArrayLists.   This saves roughly
7182         212kb on my machine.
7183
7184         (Method): Implement the new IIteratorContainer interface.
7185         (Method.SetYields): Implement the method by setting the ModFlags
7186         to contain METHOD_YIELDS.
7187
7188         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
7189         which just got set to null.
7190
7191         * iterators.cs: New file.
7192
7193         (Yield, YieldBreak): New statements.
7194
7195         * statement.cs (Return.Resolve): Flag an error if we are used in
7196         an iterator method.
7197
7198         * codegen.cs (InIterator): New flag set if the code is being
7199         compiled in an iterator method.
7200
7201         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
7202         internal modifier, and we just use it to avoid adding extra
7203         fields, as this is seldom used.  
7204
7205         * cs-parser.jay: Add yield_statement (yield and yield break).
7206
7207         * driver.cs: New flag -v2 to turn on version 2 features. 
7208
7209         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
7210         hashtable when v2 is enabled.
7211
7212 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
7213
7214         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
7215         there is already a namespace defined with this name.
7216
7217         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
7218         people upgraded their corlibs.
7219
7220         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
7221         always use fully qualified types, no need to use the compiler
7222         front end.
7223
7224         (TypeManager.IsNamespace): Use binarysearch.
7225
7226         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
7227         AddDelegate): I did not quite use the new IsValid API properly: I
7228         have to pass the short-name and the fullname.  I was passing only
7229         the basename instead of the fullname sometimes. 
7230
7231         (TypeContainer.DefineType): call NamespaceClash.
7232
7233         * interface.cs (Interface.DefineType): use NamespaceClash before
7234         defining the type.
7235
7236         * delegate.cs (Delegate.DefineType): use NamespaceClash before
7237         defining the type.
7238
7239         * enum.cs: (Enum.DefineType): use NamespaceClash before
7240         defining the type.
7241
7242         * typemanager.cs (: 3-line patch that gives us some tasty 11%
7243         speed increase.  First, use the negative_hits cache when we get a
7244         negative.  Second, add the type with its full original name
7245         instead of the new . and + encoded name (reflection uses + to
7246         separate type from a nested type).  Use LookupTypeReflection
7247         directly which bypasses the type->name hashtable (that we already
7248         know does not contain the type.
7249
7250         * decl.cs (DeclSpace.ResolveTypeExpr): track the
7251         location/container type. 
7252
7253         * driver.cs: When passing utf8, use directly the UTF8Encoding.
7254
7255 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
7256
7257         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
7258
7259         * delegate.cs (NewDelegate.Resolve): Test whether an instance
7260         method is being referenced in the method group from a static
7261         context, and report error 120 if so.
7262
7263         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
7264         Error118. 
7265
7266         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
7267         is created, we create the A namespace).
7268
7269         * cs-parser.jay: A namespace also introduces a DeclarationFound.
7270         Fixes #41591
7271
7272 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
7273
7274         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
7275         invocation to ModuleBuilder.GetType with the same values will
7276         return a new type instance, so we need to cache its return
7277         values. 
7278
7279         * expression.cs (Binary.ResolveOperator): Only allow the compare
7280         operators on enums if they are of the same type.
7281
7282         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
7283         types of ValueType on their own case.  Before we were giving them
7284         the same treatment as objects.
7285
7286         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
7287         fullname.  Short name is used to compare against container name.
7288         Fullname is used to check against defined namespace names.
7289
7290         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
7291         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
7292
7293         (Method.CheckBase): Call parent.
7294         (MemberBase.CheckBase): Check for protected members on sealed
7295         classes.
7296         (PropertyBase.CheckBase): Call parent.
7297         (Field.Define): Call parent.
7298
7299         * report.cs: Negative error codes are now mapped to 8000 - code,
7300         so that the display is render more nicely.
7301
7302         * typemanager.cs: Do not use try/catch, instead report a regular
7303         error. 
7304
7305         (GetPointerType, GetReferenceType): These methods provide
7306         mechanisms to obtain the T* and T& from a T.  We had the code
7307         previously scattered around the code base, and it also used
7308         TypeManager.LookupType that would go through plenty of caches.
7309         This one goes directly to the type source.
7310
7311         In some places we did the Type.GetType followed by
7312         ModuleBuilder.GetType, but not in others, so this unifies the
7313         processing as well.
7314
7315         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
7316         statements now that we have namespace information.
7317
7318         * typemanager.cs (IsNamespace): New method, returns whether the
7319         string presented is a namespace or not.
7320
7321         (ComputeNamespaces): New public entry point, computes the list of
7322         available namespaces, using the GetNamespaces API call in Mono, or
7323         the slower version in MS.NET.   
7324
7325         Now before we start the semantic analysis phase, we have a
7326         complete list of namespaces including everything that the user has
7327         provided.
7328
7329         Deleted old code to cache namespaces in .nsc files.
7330
7331 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
7332
7333         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
7334         class/struct location definition Location for the implicit
7335         constructor location.
7336
7337         (Operator.Define): Use the location of the operator for the
7338         implicit Method definition.
7339
7340         (Constructor.Emit): use the constructor location for the implicit
7341         base initializer constructor.
7342
7343         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
7344         and the Expression class now contains two new methods:
7345
7346         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
7347         isolate type lookup from the rest of the resolution process.
7348
7349         Since we use Expressions to hold type definitions due to the way
7350         we parse the input we have historically overloaded Resolve to
7351         perform the Type lookups if a special flag is passed.  Now this is
7352         eliminated and two methods take their place. 
7353
7354         The differences in the two methods between xStep and xTerminal is
7355         that xStep is involved in our current lookup system that uses
7356         SimpleNames to compose a name, while xTerminal is used just to
7357         catch the case where the simplename lookup failed.
7358
7359 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
7360
7361         * expression.cs (ResolveMemberAccess): Remove redundant code.
7362         TypeExpr expressions are always born fully resolved.
7363
7364         * interface.cs (PopulateMethod): Do not lookup the types twice.
7365         We were doing it once during SemanticAnalysis and once during
7366         PopulateMethod.
7367
7368         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
7369         in local variable type definitions, were being returned as a
7370         SimpleName (we decomposed everything into a string), that is
7371         because primary_expression was being used instead of a type in the
7372         grammar (reduce/reduce conflicts).
7373
7374         The part that was wrong is that we converted the expression into a
7375         string (an oversimplification in one hand, compounded with primary
7376         expressions doing string concatenation).
7377
7378         So things like:
7379
7380         A.B.C [] x;
7381
7382         Would return "A.B.C[]" as a SimpleName.  This stopped things like
7383         using clauses from working on this particular context.  And a type
7384         was being matched directly against "A.B.C[]".
7385
7386         We now use the correct approach, and allow for ComposedCast to be
7387         part of the unary expression.  So the "A.B.C []" become a composed
7388         cast of "A.B.C" (as a nested group of MemberAccess with a
7389         SimpleName at the end) plus the rank composition "[]". 
7390
7391         Also fixes 35567
7392
7393 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
7394
7395         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
7396         for the access level checking.
7397
7398         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
7399         `TypeContainer container', because I kept getting confused when I
7400         was debugging this code.
7401
7402         * expression.cs (Indexers): Instead of tracking getters/setters,
7403         we now track them in parallel.  We create one arraylist less, but
7404         most importantly it is possible now for the LValue code to find a
7405         matching get for a set.
7406
7407         (IndexerAccess.DoResolveLValue): Update the code.
7408         GetIndexersForType has been modified already to extract all the
7409         indexers from a type.  The code assumed it did not.
7410
7411         Also make the code set the correct return type for the indexer.
7412         This was fixed a long time ago for properties, but was missing for
7413         indexers.  It used to be void_type.
7414
7415         (Binary.Emit): Test first for doubles instead of
7416         floats, as they are more common.
7417
7418         (Binary.EmitBranchable): Use the .un version of the branch opcodes
7419         when dealing with floats and the <=, >= operators.  This fixes bug
7420         #39314 
7421
7422         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
7423         to load the array value by emitting a load on the foreach variable
7424         type.  This was incorrect.  
7425
7426         We now emit the code to load an element using the the array
7427         variable type, and then we emit the conversion operator.
7428
7429         Fixed #40176
7430
7431 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
7432
7433         * attribute.cs: Avoid allocation of ArrayLists in the common case.
7434
7435 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
7436
7437         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
7438         test for protection before we test for signatures. 
7439
7440         (MethodSignature.ToString): implement.
7441
7442         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
7443         to the case where we reduced into a LongConstant.
7444
7445         * decl.cs (CheckAccessLevel): If the type is an array, we can not
7446         depend on whether the information is acurrate, because the
7447         Microsoft runtime will always claim that the array type is public,
7448         regardless of the real state.
7449
7450         If the type is a pointer, another problem happens: the type is
7451         reported as non-public in Microsoft.  
7452
7453         In both cases we have to call CheckAccessLevel recursively with
7454         the underlying type as the argument to be tested.
7455
7456 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
7457
7458         * assign.cs (Assign.Emit): If we are dealing with a compound
7459         assignment expression, we should use the code path that stores the
7460         intermediate result in a temporary value.  This fixes #40903.
7461
7462         *expression.cs (Indirection.ToString): Provide ToString method for
7463         debugging. 
7464
7465 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7466
7467         * class.cs: Null out fields holding references to Block objects so
7468         they can be garbage collected.
7469
7470         * expression.cs (OverloadResolve): Remove unused local.
7471
7472 2003-04-07  Martin Baulig  <martin@ximian.com>
7473
7474         * codegen.cs (EmitContext.CurrentFile): New public field.
7475         (EmitContext.Mark): Use the CurrentFile to check whether the
7476         location is in the correct file.
7477         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7478
7479 2003-04-07  Martin Baulig  <martin@ximian.com>
7480
7481         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7482
7483         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7484         location.  [FIXME: The location argument which gets passed to this
7485         method is sometimes wrong!]
7486
7487 2003-04-07  Nick Drochak <ndrochak@gol.com>
7488
7489         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7490
7491 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7492
7493         * expression.cs (Indirection.EmitAssign): We were using the
7494         temporary, but returning immediately instead of continuing the
7495         EmitAssing flow.
7496
7497 2003-04-06  Martin Baulig  <martin@ximian.com>
7498
7499         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7500         if it's a nested child, but also deriving from the outer class.
7501         See test 190.cs.
7502
7503         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7504         nested child, but also deriving from the outer class.  See
7505         test-190.cs.
7506         (FilterWithClosure): We may access private members of the outer
7507         class if we're a nested child and deriving from the outer class.
7508         (RealMemberLookup): Only set `closure_private_ok' if the
7509         `original_bf' contained BindingFlags.NonPublic.
7510
7511 2003-04-05  Martin Baulig  <martin@ximian.com>
7512
7513         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
7514         probe if its a type parameter, and if so, flag an error.
7515
7516         * decl.cs: Move here the SetParameterInfo code from class.cs.
7517         Handle IsGeneric here.
7518
7519         Handle a variety of errors in the parameter info definition.
7520
7521         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
7522         type parameters here.
7523
7524         * cs-parser.jay (class_declaration): report errors for parameters
7525         here as well.
7526
7527 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
7528
7529         * generic.cs: New file, contains support code for generics.
7530
7531         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
7532         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
7533
7534         Update parser for the above removals.
7535
7536         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
7537         now taken care of in the parser.
7538
7539 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7540
7541         * class.cs (Event.Define): Do not allow abstract events to have
7542         initializers. 
7543
7544 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7545
7546         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7547         block in event declarations.
7548
7549         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7550         value type, get its address.
7551
7552         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7553         leaving a class on the stack instead of a boolean value (int
7554         0/1).  Change the code so we compare against null, and then the
7555         result against zero.
7556
7557         * class.cs (TypeContainer.GetClassBases): We were checking for the
7558         parent class being sealed too late.
7559
7560         * expression.cs (Binary.Emit): For <= and >= when dealing with
7561         floating point values, use cgt.un and clt.un instead of cgt and
7562         clt alone.
7563
7564 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7565
7566         * statement.cs: Apply the same optimization as MS: skip the 
7567         GetEnumerator returning an IEnumerator, and use the one returning a 
7568         CharEnumerator instead. This allows us to avoid the try-finally block 
7569         and the boxing.
7570
7571 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7572
7573         * cs-parser.jay: Attributes cannot be applied to
7574                          namespaces. Fixes #40473
7575
7576 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7577
7578         * class.cs:
7579         (Add*): check if the name is valid using the full name for constants,
7580         fields, properties and events.
7581
7582 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7583
7584         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7585         char constants to be part of the enumeration.
7586
7587         * expression.cs (Conditional.DoResolve): Add support for operator
7588         true. Implements the missing functionality from 14.12
7589
7590         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7591         operator true/false as required by the spec.
7592
7593         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7594         implicit conversion to boolean.
7595
7596         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7597         also one where the type implements `operator true'. 
7598
7599         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7600         get an expression that will invoke operator true based on an
7601         expression.  
7602
7603         (GetConversionOperators): Removed the hack that called op_True
7604         here.  
7605
7606         (Expression.ResolveBoolean): Move this from Statement.
7607
7608 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7609
7610         * ecore.cs (FieldExpr): do not allow initialization of initonly
7611         fields on derived classes
7612
7613 2003-03-13  Martin Baulig  <martin@ximian.com>
7614
7615         * statement.cs (Block.Emit): Call ig.BeginScope() and
7616         ig.EndScope() when compiling with debugging info; call
7617         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7618
7619 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7620
7621         * expression.cs (Indexers): Do not construct immediately, allow
7622         for new members to be appended as we go.  Fixes 38143
7623
7624 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7625
7626         * expression.cs: save/restore context when resolving an unchecked
7627         expression.
7628
7629 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7630
7631         * cfold.cs: Catch division by zero in modulus operator during
7632         constant folding.
7633
7634 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7635
7636         * interface.cs (Interface.DefineMembers): Avoid defining members
7637         twice. 
7638
7639 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7640
7641         * driver.cs: handle the +/- options for -noconfig
7642
7643         * statement.cs (Unckeched.Resolve): Also track the state of
7644         unchecked in the Resolve phase.
7645
7646 2003-02-27  Martin Baulig  <martin@ximian.com>
7647
7648         * ecore.cs (Expression.MemberLookup): Don't create a
7649         MethodGroupExpr for something which is not a method.  Fixes #38291.
7650
7651 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7652
7653         * class.cs (MemberBase.CheckParameters): Also check that the type
7654         is unmanaged if it is a pointer.
7655
7656         * expression.cs (SizeOf.Resolve): Add location information.
7657
7658         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7659         a managed type is declared.
7660
7661         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7662         parameter modifiers as well.  Fixes bug 38606
7663
7664         * class.cs: Very sad.  Am backing out the speed up changes
7665         introduced by the ArrayList -> Array in the TypeContainer, as they
7666         were not actually that much faster, and introduced a bug (no error
7667         reports on duplicated methods).
7668
7669         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7670         source first, this will guarantee that we have a valid expression
7671         before calling in lower levels functions that will require a
7672         resolved object.  Then use this original_source in the
7673         target.ResolveLValue instead of the original source that was
7674         passed to us.
7675
7676         Another change.  Use target.Resolve instead of LValueResolve.
7677         Although we are resolving for LValues, we will let the Assign code
7678         take care of that (it will be called again from Resolve).  This
7679         basically allows code like this:
7680
7681         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7682         class Y { void A (X x) { x [0] += o; }
7683
7684         The problem was that the indexer was trying to resolve for
7685         set_Item (idx, object o) and never finding one.  The real set_Item
7686         was set_Item (idx, X).  By delaying the process we get the right
7687         semantics. 
7688
7689         Fixes bug 36505
7690
7691 2003-02-23  Martin Baulig  <martin@ximian.com>
7692
7693         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7694         while calling DoEmit ().
7695
7696         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7697         source files; if you use the #line directive inside a method, the
7698         compiler stops emitting line numbers for the debugger until it
7699         reaches the end of the method or another #line directive which
7700         restores the original file.
7701
7702 2003-02-23  Martin Baulig  <martin@ximian.com>
7703
7704         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7705
7706 2003-02-23  Martin Baulig  <martin@ximian.com>
7707
7708         * statement.cs (Block.AddChildVariableNames): We need to call this
7709         recursively, not just for our immediate children.
7710
7711 2003-02-23  Martin Baulig  <martin@ximian.com>
7712
7713         * class.cs (Event.Define): Always make the field private, like csc does.
7714
7715         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7716         actually work, fixes bug #37521.
7717
7718 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7719
7720         * delegate.cs: When creating the various temporary "Parameters"
7721         classes, make sure that we call the ComputeAndDefineParameterTypes
7722         on those new parameters (just like we do with the formal ones), to
7723         allow them to be resolved in the context of the DeclSpace.
7724
7725         This fixes the bug that Dick observed in Bugzilla #38530.
7726
7727 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7728
7729         * expression.cs (ResolveMemberAccess): When resolving a constant,
7730         do not attempt to pull a constant if the value was not able to
7731         generate a valid constant.
7732
7733         * const.cs (LookupConstantValue): Do not report more errors than required.
7734
7735 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7736
7737         * expression.cs: fixes bug #38328.
7738
7739 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7740
7741         * class.cs: Changed all the various members that can be part of a
7742         class from being an ArrayList to be an Array of the right type.
7743         During the DefineType type_list, interface_list, delegate_list and
7744         enum_list are turned into types, interfaces, delegates and enums
7745         arrays.  
7746
7747         And during the member population, indexer_list, event_list,
7748         constant_list, field_list, instance_constructor_list, method_list,
7749         operator_list and property_list are turned into their real arrays.
7750
7751         Although we could probably perform this operation earlier, for
7752         good error reporting we need to keep the lists and remove the
7753         lists for longer than required.
7754
7755         This optimization was triggered by Paolo profiling the compiler
7756         speed on the output of `gen-sample-program.pl' perl script. 
7757
7758         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7759         not crash in methods like MemberLookupFailed that use this field.  
7760
7761         This problem arises when the compiler fails to resolve a type
7762         during interface type definition for example.
7763
7764 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7765
7766         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7767         inherit from System.Object, so we have to stop at null, not only
7768         when reaching System.Object.
7769
7770 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7771
7772         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7773         DeclaredOnly because the parent indexer might have had a different
7774         name, but did not loop until the top of the hierarchy was reached.
7775
7776         The problem this one fixes is 35492: when a class implemented an
7777         indexer from an interface, we were getting the interface method
7778         (which was abstract) and we were flagging an error (can not invoke
7779         abstract method).
7780
7781         This also keeps bug 33089 functioning, and test-148 functioning.
7782
7783         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7784         out if a method is special is to see if it is declared in a
7785         property or event, or whether it is one of the predefined operator
7786         names.   This should fix correctly #36804.
7787
7788 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7789
7790         The goal here is to remove the dependency on EmptyCast.Peel ().
7791         Killing it completely.
7792
7793         The problem is that currently in a number of places where
7794         constants are expected, we have to "probe" for an EmptyCast, and
7795         Peel, which is not the correct thing to do, as this will be
7796         repetitive and will likely lead to errors. 
7797
7798         The idea is to remove any EmptyCasts that are used in casts that
7799         can be reduced to constants, so we only have to cope with
7800         constants. 
7801
7802         This bug hunt was triggered by Bug 37363 and the desire to remove
7803         the duplicate pattern where we were "peeling" emptycasts to check
7804         whether they were constants.  Now constants will always be
7805         constants.
7806
7807         * ecore.cs: Use an enumconstant here instead of wrapping with
7808         EmptyCast.  
7809
7810         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7811         throwing me off.  By handling this we can get rid of a few hacks.
7812
7813         * statement.cs (Switch): Removed Peel() code.
7814
7815 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7816
7817         * class.cs: Location information for error 508
7818
7819         * expression.cs (New.DoResolve): Add a guard against double
7820         resolution of an expression.  
7821
7822         The New DoResolve might be called twice when initializing field
7823         expressions (see EmitFieldInitializers, the call to
7824         GetInitializerExpression will perform a resolve on the expression,
7825         and later the assign will trigger another resolution
7826
7827         This leads to bugs (#37014)
7828
7829         * delegate.cs: The signature for EndInvoke should contain any ref
7830         or out parameters as well.  We were not doing this in the past. 
7831
7832         * class.cs (Field.Define): Do not overwrite the type definition
7833         inside the `volatile' group.  Turns out that volatile enumerations
7834         were changing the type here to perform a validity test, which
7835         broke conversions. 
7836
7837 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7838
7839         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7840         and structs, we do not want to load the instance variable
7841
7842         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7843         enum_type has to be handled like an object reference (implicit
7844         conversions exists from this to object), but the regular IsClass
7845         and IsValueType tests will never return true for this one.
7846
7847         Also we use TypeManager.IsValueType instead of type.IsValueType,
7848         just for consistency with the rest of the code (this is only
7849         needed if we ever use the construct exposed by test-180.cs inside
7850         corlib, which we dont today).
7851
7852 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7853
7854         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7855         just InternalCall.
7856
7857 2003-02-09  Martin Baulig  <martin@ximian.com>
7858
7859         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7860         (Namespace.DefineNamespaces): New static public method; this is
7861         called when we're compiling with debugging to add all namespaces
7862         to the symbol file.
7863
7864         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7865         pass it to the Namespace's .ctor.
7866
7867         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7868         and MethodBase arguments; pass the namespace ID to the symwriter;
7869         pass the MethodBase instead of the token to the symwriter.
7870         (SymbolWriter.DefineNamespace): New method to add a namespace to
7871         the symbol file.
7872
7873 2003-02-09  Martin Baulig  <martin@ximian.com>
7874
7875         * symbolwriter.cs: New file.  This is a wrapper around
7876         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7877         methods here in near future.
7878
7879 2003-02-09  Martin Baulig  <martin@ximian.com>
7880
7881         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7882         ILGenerator.MarkSequencePoint() which are actually used by the
7883         symbol writer.
7884
7885 2003-02-09  Martin Baulig  <martin@ximian.com>
7886
7887         * location.cs (SourceFile): New public sealed class.  This
7888         contains the name and an index which is used in the location's token.
7889         (Location): Reserve an appropriate number of bits in the token for
7890         the source file instead of walking over that list, this gives us a
7891         really huge performance improvement when compiling with debugging.
7892
7893         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7894         `SourceFile' argument instead of a string.
7895         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7896         but don't parse/tokenize here, we need to generate the list of all
7897         source files before we do that.
7898         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7899         the files.
7900
7901         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7902         instead of a string.
7903
7904         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7905         of a string.
7906
7907 2003-02-09  Martin Baulig  <martin@ximian.com>
7908
7909         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7910         filename on `#line default'.
7911
7912 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7913
7914         * statement.cs: don't clear the pinned var when the fixed statement
7915         returns from the method (fixes bug#37752).
7916
7917 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7918
7919         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7920         to IsValueType.
7921
7922 2003-02-07  Martin Baulig  <martin@ximian.com>
7923
7924         * driver.cs: Removed the `--debug-args' command line argument.
7925
7926         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7927         automatically by the AsssemblyBuilder.
7928         (CodeGen.InitializeSymbolWriter): We don't need to call any
7929         initialization function on the symbol writer anymore.  This method
7930         doesn't take any arguments.
7931
7932 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7933
7934         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7935         from referenced assemblies as well.
7936
7937 2003-02-02  Martin Baulig  <martin@ximian.com>
7938
7939         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7940
7941 2003-02-02  Martin Baulig  <martin@ximian.com>
7942
7943         * class.cs (Constructor.Emit): Open the symbol writer before
7944         emitting the constructor initializer.
7945         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7946         single-stepping through constructor initializers.
7947
7948 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7949
7950         * class.cs: Handle error 549: do not allow virtual methods in
7951         sealed classes. 
7952
7953 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7954
7955         * decl.cs: Check access levels when resolving types
7956
7957 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7958
7959         * statement.cs: Add parameters and locals set in catch blocks that might 
7960         return to set vector
7961
7962 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7963
7964         * class.cs (Operator): Set the SpecialName flags for operators.
7965
7966         * expression.cs (Invocation.DoResolve): Only block calls to
7967         accessors and operators on SpecialName methods.
7968
7969         (Cast.TryReduce): Handle conversions from char constants.
7970
7971
7972 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7973
7974         * statement.cs: small memory and time optimization in FlowBranching.
7975
7976 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7977
7978         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7979         problem that the last fix but in the other sid (Set).
7980
7981         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7982         access when there is no indexer in the hierarchy.
7983
7984 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7985
7986         * class.cs: Combine some if statements.
7987
7988 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7989
7990         * driver.cs: fixed bug #37187.
7991
7992 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7993
7994         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7995         any indexer, it's needed to build a list with all the indexers in the
7996         hierarchy (AllGetters), else we have problems. Fixes #35653.
7997
7998 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7999
8000         * class.cs (MethodData.Define): It is wrong for an interface
8001         implementation to be static in both cases: explicit and implicit.
8002         We were only handling this in one case.
8003
8004         Improve the if situation there to not have negations.
8005
8006         * class.cs (Field.Define): Turns out that we do not need to check
8007         the unsafe bit on field definition, only on usage.  Remove the test.
8008
8009 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8010
8011         * driver.cs: use assembly.Location instead of Codebase (the latest
8012         patch made mcs fail when using MS assemblies).
8013
8014 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
8015
8016         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
8017         get the path to *corlib.dll.
8018
8019 2003-01-21  Nick Drochak <ndrochak@gol.com>
8020
8021         * cs-tokenizer.cs:
8022         * pending.cs:
8023         * typemanager.cs: Remove compiler warnings
8024
8025 2003-01-20  Duncan Mak  <duncan@ximian.com>
8026
8027         * AssemblyInfo.cs: Bump the version number to 0.19.
8028
8029 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8030
8031         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
8032
8033 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
8034
8035         * class.cs (Constructor::Emit): Emit debugging info for constructors.
8036
8037 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
8038
8039         * cs-parser.jay: Small fix: we were not comparing the constructor
8040         name correctly.   Thanks to Zoltan for the initial pointer.
8041
8042 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
8043
8044         * cs-tokenizer.cs: Set file name when specified with #line
8045
8046 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
8047
8048         * cs-parser.jay: Only perform the constructor checks here if we
8049         are named like the class;  This will help provider a better
8050         error.  The constructor path is taken when a type definition is
8051         not found, but most likely the user forgot to add the type, so
8052         report that rather than the constructor error.
8053
8054 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
8055
8056         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
8057         allocations.
8058
8059 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8060
8061         * cs-parser.jay: Add cleanup call.
8062
8063 2003-01-13  Duncan Mak  <duncan@ximian.com>
8064
8065         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
8066         consistent with other methods.
8067
8068 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8069
8070         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
8071
8072 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
8073
8074         * attribute.cs: only set GuidAttr to true when we have a
8075         GuidAttribute.
8076
8077 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8078
8079         * ecore.cs:
8080         * expression.cs:
8081         * typemanager.cs: fixes to allow mcs compile corlib with the new
8082         Type.IsSubclassOf fix.
8083
8084 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
8085
8086         * expression.cs (LocalVariableReference.DoResolve): Classify a
8087         constant as a value, not as a variable.   Also, set the type for
8088         the variable.
8089
8090         * cs-parser.jay (fixed_statement): take a type instead of a
8091         pointer_type, so we can produce a better error message later.
8092
8093         * statement.cs (Fixed.Resolve): Flag types that are not pointers
8094         as an error.  
8095
8096         (For.DoEmit): Make inifinite loops have a
8097         non-conditional branch back.
8098
8099         (Fixed.DoEmit): First populate the pinned variables, then emit the
8100         statement, then clear the variables.  Before I was emitting the
8101         code once for each fixed piece.
8102
8103
8104 2003-01-08  Martin Baulig  <martin@ximian.com>
8105
8106         * statement.cs (FlowBranching.MergeChild): A break in a
8107         SWITCH_SECTION does not leave a loop.  Fixes #36155.
8108
8109 2003-01-08  Martin Baulig  <martin@ximian.com>
8110
8111         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
8112         lives in the same number space than `param_map'.  Fixes #36154.
8113
8114 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
8115
8116         * cs-parser.jay (constructor_declaration): Set the
8117         Constructor.ModFlags before probing for it.  This makes the
8118         compiler report 514, 515 and 132 (the code was there, but got
8119         broken). 
8120
8121         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
8122         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
8123         (GotoCase.Resolve): Set `Returns' to ALWAYS.
8124
8125 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
8126
8127         * enum.cs: create the enum static fields using the enum type.
8128
8129 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
8130
8131         * class.cs: don't try to create the ParamBuilder for the return
8132         type if it's not needed (and handle it breaking for the ms runtime
8133         anyway).
8134
8135 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
8136
8137         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
8138
8139 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
8140
8141         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
8142         the command.   This showed up while compiling the JANET source
8143         code, which used \r as its only newline separator.
8144
8145 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
8146
8147         * class.cs (Method.Define): If we are an operator (because it
8148         reuses our code), then set the SpecialName and HideBySig.  #36128
8149
8150 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
8151
8152         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
8153         exception, report error 120 `object reference required'.
8154
8155         * driver.cs: Add --pause option, used during to measure the size
8156         of the process as it goes with --timestamp.
8157
8158         * expression.cs (Invocation.DoResolve): Do not allow methods with
8159         SpecialName to be invoked.
8160
8161 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
8162
8163         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
8164         number before adding it.
8165
8166 2002-12-21  Ravi Pratap  <ravi@ximian.com>
8167
8168         * ecore.cs (StandardImplicitConversion): When in an unsafe
8169         context, we allow conversion between void * to any other pointer
8170         type. This fixes bug #35973.
8171
8172 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
8173
8174         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
8175         is not thrown when extensionless outputs are used 
8176
8177 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8178
8179         * rootcontext.cs: fixed compilation of corlib.
8180
8181 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
8182
8183         * attribute.cs (Attributes.Contains): Add new method.
8184
8185         * class.cs (MethodCore.LabelParameters): if the parameter is an
8186         `out' parameter, check that no attribute `[In]' has been passed.
8187
8188         * enum.cs: Handle the `value__' name in an enumeration.
8189
8190 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
8191
8192         * decl.cs: Added special case to allow overrides on "protected
8193         internal" methods
8194
8195 2002-12-18  Ravi Pratap  <ravi@ximian.com>
8196
8197         * attribute.cs (Attributes.AddAttributeSection): Rename to this
8198         since it makes much more sense.
8199
8200         (Attributes.ctor): Don't require a Location parameter.
8201
8202         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
8203
8204         * attribute.cs (ApplyAttributes): Remove extra Location parameters
8205         since we already have that information per attribute.
8206
8207         * everywhere : make appropriate changes.
8208
8209         * class.cs (LabelParameters): Write the code which actually
8210         applies attributes to the return type. We can't do this on the MS
8211         .NET runtime so we flag a warning in the case an exception is
8212         thrown.
8213
8214 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
8215
8216         * const.cs: Handle implicit null conversions here too.
8217
8218 2002-12-17  Ravi Pratap  <ravi@ximian.com>
8219
8220         * class.cs (MethodCore.LabelParameters): Remove the extra
8221         Type [] parameter since it is completely unnecessary. Instead
8222         pass in the method's attributes so that we can extract
8223         the "return" attribute.
8224
8225 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
8226
8227         * cs-parser.jay (parse): Use Report.Error to flag errors instead
8228         of ignoring it and letting the compile continue.
8229
8230         * typemanager.cs (ChangeType): use an extra argument to return an
8231         error condition instead of throwing an exception.
8232
8233 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
8234
8235         * expression.cs (Unary.TryReduce): mimic the code for the regular
8236         code path.  Perform an implicit cast in the cases where we can
8237         implicitly convert to one of the integral types, and then reduce
8238         based on that constant.   This fixes bug #35483.
8239
8240 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8241
8242         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
8243
8244 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8245
8246         * namespace.cs: fixed bug #35489.
8247
8248 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
8249
8250         * class.cs: Remove some dead code.
8251
8252         * cs-parser.jay: Estimate the number of methods needed
8253         (RootContext.MethodCount);
8254
8255         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
8256         numbers instead of StringBuilders.
8257
8258         * support.cs (PtrHashtable): Add constructor with initial size;
8259         We can now reduce reallocations of the method table.
8260
8261 2002-12-10  Ravi Pratap  <ravi@ximian.com>
8262
8263         * attribute.cs (ApplyAttributes): Keep track of the emitted
8264         attributes on a per-target basis. This fixes bug #35413.
8265
8266 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
8267
8268         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
8269         default to the Windows 1252 encoding.
8270
8271         (UnixParseOption): Support version, thanks to Alp for the missing
8272         pointer. 
8273
8274         * AssemblyInfo.cs: Add nice assembly information.
8275
8276         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
8277         (bug 35169).
8278
8279         * cs-parser.jay: Allow a trailing comma before the close bracked
8280         in the attribute_section production.
8281
8282         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
8283         address of the instance was being taken, I will take this out,
8284         because we take the address of the object immediately here.
8285
8286 2002-12-09  Ravi Pratap  <ravi@ximian.com>
8287
8288         * typemanager.cs (AreMultipleAllowed): Take care of the most
8289         obvious case where attribute type is not in the current assembly -
8290         stupid me ;-)
8291
8292 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
8293
8294         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
8295         definitions, instead of doing that afterwards.  
8296
8297         Also we use a nice little hack, depending on the constructor, we
8298         know if we are a "composed" name or a simple name.  Hence, we
8299         avoid the IndexOf test, and we avoid 
8300
8301         * codegen.cs: Add code to assist in a bug reporter to track down
8302         the source of a compiler crash. 
8303
8304 2002-12-07  Ravi Pratap  <ravi@ximian.com>
8305
8306         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
8307         types have been emitted for a given element and flag an error
8308         if something which does not have AllowMultiple set is used more
8309         than once.
8310
8311         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
8312         attribute types and their corresponding AllowMultiple properties
8313
8314         (AreMultipleAllowed): Check the property for a given type.
8315
8316         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
8317         property in the case we have a TypeContainer.
8318
8319         (Attributes.AddAttribute): Detect duplicates and just skip on
8320         adding them. This trivial fix catches a pretty gross error in our
8321         attribute emission - global attributes were being emitted twice!
8322
8323         Bugzilla bug #33187 is now fixed.
8324
8325 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
8326
8327         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
8328         instead of pp_and).
8329
8330         * expression.cs (Binary.ResolveOperator): I can only use the
8331         Concat (string, string, string) and Concat (string, string,
8332         string, string) if the child is actually a concatenation of
8333         strings. 
8334
8335 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
8336
8337         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
8338         context where we need a 2-character lookahead.
8339
8340         * pending.cs (PendingImplementation): Rework so we can keep track
8341         of interface types all the time, and flag those which were
8342         implemented by parents as optional.
8343
8344 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
8345
8346         * expression.cs (Binary.ResolveOperator): Use
8347         String.Concat(string,string,string) or
8348         String.Concat(string,string,string,string) when possible. 
8349
8350         * typemanager: More helper methods.
8351
8352
8353 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
8354
8355         * pending.cs: remove the bogus return from GetMissingInterfaces()
8356         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
8357
8358 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8359
8360         * namespace.cs: avoid duplicated 'using xxx' being added to
8361         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
8362         when we get more than one 'using' statement for the same namespace.
8363         Report a CS0105 warning for it.
8364
8365 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
8366
8367         * cs-tokenizer.cs (consume_identifier): use read directly, instead
8368         of calling getChar/putback, uses internal knowledge of it.    
8369
8370         (xtoken): Reorder tokenizer so most common patterns are checked
8371         first.  This reduces the compilation time in another 5% (from 8.11s
8372         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
8373
8374         The parsing time is 22% of the compilation in mcs, and from that
8375         64% is spent on the tokenization process.  
8376
8377         I tried using a binary search for keywords, but this is slower
8378         than the hashtable.  Another option would be to do a couple of
8379         things:
8380
8381                 * Not use a StringBuilder, instead use an array of chars,
8382                   with a set value.  Notice that this way we could catch
8383                   the 645 error without having to do it *afterwards*.
8384
8385                 * We could write a hand-parser to avoid the hashtable
8386                   compares altogether.
8387
8388         The identifier consumption process takes 37% of the tokenization
8389         time.  Another 15% is spent on is_number.  56% of the time spent
8390         on is_number is spent on Int64.Parse:
8391
8392                 * We could probably choose based on the string length to
8393                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
8394                   computations. 
8395
8396         Another 3% is spend on wrapping `xtoken' in the `token' function.
8397
8398         Handle 0xa0 as whitespace (#34752)
8399
8400 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
8401
8402         * typemanager.cs (IsCLRType): New routine to tell whether a type
8403         is one of the builtin types.  
8404
8405         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
8406         typecode in more places instead of doing pointer comparissions.
8407         We could leverage some knowledge about the way the typecodes are
8408         laid out.
8409
8410         New code to cache namespaces in assemblies, it is currently not
8411         invoked, to be used soon.
8412
8413         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
8414
8415         * expression.cs (Binary.ResolveOperator): specially handle
8416         strings, and do not perform user-defined operator overloading for
8417         built-in types.
8418
8419 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
8420
8421         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
8422         internalcall as it is a pretty simple operation;  Avoid whenever
8423         possible to call Char.IsLetter.
8424
8425         (consume_identifier): Cut by half the number of
8426         hashtable calls by merging the is_keyword and GetKeyword behavior.
8427
8428         Do not short-circuit, because if we do, we
8429         report errors (ie, #if false && true would produce an invalid
8430         directive error);
8431
8432
8433 2002-11-24  Martin Baulig  <martin@ximian.com>
8434
8435         * expression.cs (Cast.TryReduce): If we're in checked syntax,
8436         check constant ranges and report a CS0221.  Fixes #33186.
8437
8438 2002-11-24  Martin Baulig  <martin@ximian.com>
8439
8440         * cs-parser.jay: Make this work for uninitialized variable
8441         declarations in the `for' initializer.  Fixes #32416.
8442
8443 2002-11-24  Martin Baulig  <martin@ximian.com>
8444
8445         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
8446         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
8447
8448 2002-11-24  Martin Baulig  <martin@ximian.com>
8449
8450         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
8451         argument; if true, we also check for user-defined conversions.
8452         This is only needed if both arguments are of a user-defined type.
8453         Fixes #30443, added test-175.cs.
8454         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
8455
8456         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
8457
8458 2002-11-24  Martin Baulig  <martin@ximian.com>
8459
8460         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
8461         function to get the store opcode.
8462         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
8463         only emit the Ldelema if the store opcode is Stobj.  You must run
8464         both test-34 and test-167 to test this.  Fixes #34529.
8465
8466 2002-11-23  Martin Baulig  <martin@ximian.com>
8467
8468         * ecore.cs (Expression.MemberLookup): Added additional
8469         `qualifier_type' argument which is used when we're being called
8470         from MemberAccess.DoResolve() and null if we're called from a
8471         SimpleName lookup.
8472         (Expression.MemberLookupFailed): New method to report errors; this
8473         does the CS1540 check and reports the correct error message.
8474
8475         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
8476         argument for the CS1540 check and redone the way how we're dealing
8477         with private members.  See the comment in the source code for details.
8478         (FilterWithClosure): Reverted this back to revision 1.197; renamed
8479         `closure_start_type' to `closure_qualifier_type' and check whether
8480         it's not null.  It was not this filter being broken, it was just
8481         being called with the wrong arguments.
8482
8483         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
8484         and pass it the correct `qualifier_type'; this also does the error
8485         handling for us.
8486
8487 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
8488
8489         * expression.cs (Invocation.EmitParams): If the we are dealing
8490         with a non-built-in value type, load its address as well.
8491
8492         (ArrayCreation): Use a a pretty constant instead
8493         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8494         static initializers.  
8495
8496         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8497         because they are not really value types, just glorified integers. 
8498
8499         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8500
8501         * ecore.cs: Remove redundant code for enumerations, make them use
8502         the same code path as everything else, fixes the casting issue
8503         with enumerations in Windows.Forms.
8504
8505         * attribute.cs: Do only cast to string if it is a string, the
8506         validation happens later.
8507
8508         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8509         people upgrade their corlibs.
8510
8511         * ecore.cs: Oops, enumerations were not following the entire code path
8512
8513 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8514
8515         * typemanager.cs (FilterWithClosure): Commented out the test for
8516         1540 in typemanager.cs, as it has problems when accessing
8517         protected methods from a parent class (see test-174.cs). 
8518
8519         * attribute.cs (Attribute.ValidateGuid): new method.
8520         (Attribute.Resolve): Use above.
8521
8522 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8523
8524         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8525
8526         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8527         handling for enumerations, as we only needed the TypeContainer
8528         functionality to begin with (this is required for the fix below to
8529         work for enums that reference constants in a container class for
8530         example). 
8531
8532         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8533
8534         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8535         a valid TypeBuilder to perform lookups on.o
8536
8537         * class.cs (InheritableMemberSignatureCompare): Use true in the
8538         call to GetGetMethod and GetSetMethod, because we are comparing
8539         the signature, and we need to get the methods *even* if they are
8540         private. 
8541
8542         (PropertyBase.CheckBase): ditto.
8543
8544         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8545         GotoCase.Resolve): Use Peel on EmpytCasts.
8546
8547         * ecore.cs (EmptyCast): drop child, add Peel method.
8548
8549 2002-11-17  Martin Baulig  <martin@ximian.com>
8550
8551         * ecore.cs (EmptyCast.Child): New public property.
8552
8553         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8554         label resolved to an EmptyCast.  Fixes #34162.
8555         (GotoCase.Resolve): Likewise.
8556         (Block.EmitMeta): Likewise.
8557
8558 2002-11-17  Martin Baulig  <martin@ximian.com>
8559
8560         * expression.cs (Invocation.BetterConversion): Prefer int over
8561         uint; short over ushort; long over ulong for integer literals.
8562         Use ImplicitConversionExists instead of StandardConversionExists
8563         since we also need to check for user-defined implicit conversions.
8564         Fixes #34165.  Added test-173.cs.
8565
8566 2002-11-16  Martin Baulig  <martin@ximian.com>
8567
8568         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8569         with the `true' and `false' literals.  Fixes #33151.
8570
8571 2002-11-16  Martin Baulig  <martin@ximian.com>
8572
8573         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8574         October 22nd; don't do the cs1540 check for static members.
8575
8576         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8577         now using our own filter here and doing the cs1540 check again.
8578
8579 2002-11-16  Martin Baulig  <martin@ximian.com>
8580
8581         * support.cs (InternalParameters): Don't crash if we don't have
8582         any fixed parameters.  Fixes #33532.
8583
8584 2002-11-16  Martin Baulig  <martin@ximian.com>
8585
8586         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8587         when looking up static methods to make this work on Windows.
8588         Fixes #33773.
8589
8590 2002-11-16  Martin Baulig  <martin@ximian.com>
8591
8592         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8593         a setter rather than using PropertyInfo.CanWrite.
8594
8595 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8596
8597         * class.cs: Allow acces to block member by subclasses. Fixes build
8598         breaker.
8599
8600 2002-11-14  Martin Baulig  <martin@ximian.com>
8601
8602         * class.cs (Constructor.Emit): Added the extern/block check.
8603         Fixes bug #33678.
8604
8605 2002-11-14  Martin Baulig  <martin@ximian.com>
8606
8607         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8608         iteration while looking for indexers, this is needed because the
8609         indexer may have a different name in our base classes.  Fixed the
8610         error reporting (no indexers at all, not get accessor, no
8611         overloaded match).  Fixes bug #33089.
8612         (IndexerAccess.DoResolveLValue): Likewise.
8613
8614 2002-11-14  Martin Baulig  <martin@ximian.com>
8615
8616         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8617         indexers.  Fixes the first part of bug #33089.
8618         (MethodSignature.InheritableMemberSignatureCompare): Added support
8619         for properties.
8620
8621 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8622
8623         * attribute.cs (Attribute.Resolve): Catch the
8624         NullReferenceException and report it since it isn't supposed to
8625         happen. 
8626
8627 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8628
8629         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8630         LogicalOr and LogicalAnd that can benefit from recursively
8631         handling EmitBranchable.  The code now should be nice for Paolo.
8632
8633 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8634
8635         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8636         the Type lookups, as we perform quite a number of lookups on
8637         non-Types.  This can be removed once we can deterministically tell
8638         whether we have a type or a namespace in advance.
8639
8640         But this might require special hacks from our corlib.
8641
8642         * TODO: updated.
8643
8644         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8645         and double which avoids a conversion from an integer to a double.
8646
8647         * expression.cs: tiny optimization, avoid calling IsConstant,
8648         because it effectively performs the lookup twice.
8649
8650 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8651
8652         But a bogus return here to keep the semantics of the old code
8653         until the Mono runtime is fixed.
8654
8655         * pending.cs (GetMissingInterfaces): New method used to remove all
8656         the interfaces that are already implemented by our parent
8657         classes from the list of pending methods. 
8658
8659         * interface.cs: Add checks for calls after ResolveTypeExpr.
8660
8661 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8662
8663         * class.cs (Class.Emit): Report warning 67: event not used if the
8664         warning level is beyond 3.
8665
8666         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8667         being a NullLiteral.
8668
8669         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8670         specifiers. 
8671
8672         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8673         path that might fail if a type can not be resolved.
8674
8675         * expression.cs (Binary.Emit): Emit unsigned versions of the
8676         operators. 
8677
8678         * driver.cs: use error 5.
8679
8680 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8681
8682         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8683
8684 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8685
8686         * cs-parser.jay (switch_section): A beautiful patch from Martin
8687         Baulig that fixed 33094.
8688
8689 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8690
8691         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8692         Check whether the base is abstract and report an error if so.
8693
8694         * expression.cs (IndexerAccess.DoResolveLValue,
8695         IndexerAccess.DoResolve): ditto. 
8696
8697         (Invocation.DoResolve): ditto.
8698
8699         (Invocation.FullMethodDesc): Improve the report string.
8700
8701         * statement.cs (Block): Eliminate IsVariableDefined as it is
8702         basically just a wrapper for GetVariableInfo.
8703
8704         * ecore.cs (SimpleName): Use new 
8705
8706         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8707         type, as we return the actual parameter ref/unref state on a
8708         different call.
8709
8710 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8711
8712         * support.cs: Return proper flags REF/OUT fixing the previous
8713         commit.  
8714
8715         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8716         not used to mean `ref' but `ref or out' in ParameterReference
8717
8718         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8719         full type signature instead of calling TypeManger.CSharpName
8720         ourselves. 
8721
8722         * support.cs (InternalParameters.ParameterDesc): Do not compare
8723         directly to the modflags, because REF/OUT will actually be bitsets
8724         if set. 
8725
8726         * delegate.cs (VerifyMethod): Check also the modifiers.
8727
8728         * cs-tokenizer.cs: Fix bug where floating point values with an
8729         exponent where a sign was missing was ignored.
8730
8731         * driver.cs: Allow multiple assemblies to be specified in a single
8732         /r: argument
8733
8734 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8735
8736         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8737         because identifiers after a parenthesis would end up in this kind
8738         of production, and we needed to desamiguate it for having casts
8739         like:
8740
8741                 (UserDefinedType *) xxx
8742
8743 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8744
8745         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8746         we should set on the Bindingflags.NonPublic, but not turn on
8747         private_ok.  private_ok controls whether a Private member is
8748         returned (this is chekced on the filter routine), while the
8749         BindingFlags.NonPublic just controls whether private/protected
8750         will be allowed.   This fixes the problem part of the problem of
8751         private properties being allowed to be used in derived classes.
8752
8753         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8754         so we can call the children DoResolveLValue method (this will
8755         properly signal errors on lvalue assignments to base properties)
8756
8757         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8758         getter are null, and we have a property info, we know that this
8759         happened because the lookup failed, so we report an error 122 for
8760         protection level violation.
8761
8762         We also silently return if setter and getter are null in the
8763         resolve functions, this condition only happens if we have flagged
8764         the error before.  This is the other half of the problem. 
8765
8766         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8767         not have accessibility information, that is why we were returning
8768         true in the filter function in typemanager.cs.
8769
8770         To properly report 122 (property is inaccessible because of its
8771         protection level) correctly, we report this error in ResolveAccess
8772         by failing if both the setter and the getter are lacking (ie, the
8773         lookup failed). 
8774
8775         DoResolve and DoLResolve have been modified to check for both
8776         setter/getter being null and returning silently, the reason being
8777         that I did not want to put the knowledge about this error in upper
8778         layers, like:
8779
8780         int old = Report.Errors;
8781         x = new PropertyExpr (...);
8782         if (old != Report.Errors)
8783                 return null;
8784         else
8785                 return x;
8786
8787         So the property expr is returned, but it is invalid, so the error
8788         will be flagged during the resolve process. 
8789
8790         * class.cs: Remove InheritablePropertySignatureCompare from the
8791         class, as we no longer depend on the property signature to compute
8792         whether it is possible to implement a method or not.
8793
8794         The reason is that calling PropertyInfo.GetGetMethod will return
8795         null (in .NET, in Mono it works, and we should change this), in
8796         cases where the Get Method does not exist in that particular
8797         class.
8798
8799         So this code:
8800
8801         class X { public virtual int A { get { return 1; } } }
8802         class Y : X { }
8803         class Z : Y { public override int A { get { return 2; } } }
8804
8805         Would fail in Z because the parent (Y) would not have the property
8806         defined.  So we avoid this completely now (because the alternative
8807         fix was ugly and slow), and we now depend exclusively on the
8808         method names.
8809
8810         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8811         reference method, instead of using the property.
8812
8813         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8814         routines are gone now.
8815
8816         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8817         names, they were incorrectly named.
8818
8819         * cs-tokenizer.cs: Return are more gentle token on failure. 
8820
8821         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8822         had an out-of-sync index variable, which caused it to remove from
8823         the list of pending methods the wrong method sometimes.
8824
8825 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8826
8827         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8828         CanWrite, because those refer to this particular instance of the
8829         property, and do not take into account the fact that we can
8830         override single members of a property.
8831
8832         Constructor requires an EmitContext.  The resolution process does
8833         not happen here, but we need to compute the accessors before,
8834         because the resolution does not always happen for properties.
8835
8836         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8837         subclass, before we did not update this flag, but we did update
8838         bindingflags. 
8839
8840         (GetAccessors): Drop this routine, as it did not work in the
8841         presence of partially overwritten set/get methods. 
8842
8843         Notice that this broke the cs1540 detection, but that will require
8844         more thinking. 
8845
8846 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8847
8848         * class.cs:
8849         * codegen.cs:
8850         * driver.cs: issue a warning instead of an error if we don't support
8851         debugging for the platform. Also ignore a couple of errors that may
8852         arise when trying to write the symbols. Undo my previous patch.
8853
8854 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8855
8856         * driver.cs: ignore /debug switch except for Unix platforms.
8857
8858 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8859
8860         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8861
8862 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8863
8864         * driver.cs: Do not make mcs-debug conditional, so we do not break
8865         builds that use it.
8866
8867         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8868         review this patch.  But basically after all the children variables
8869         have been merged, the value of "Breaks" was not being set to
8870         new_breaks for Switch blocks.  I think that it should be set after
8871         it has executed.  Currently I set this to the value of new_breaks,
8872         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8873         conservative, but I do not understand this code very well.
8874
8875         I did not break anything in the build, so that is good ;-)
8876
8877         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8878
8879 2002-10-20  Mark Crichton  <crichton@gimp.org>
8880
8881         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8882
8883 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8884
8885         * cfold.cs: Fixed compile blocker.
8886
8887 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8888
8889         * driver.cs: I was chekcing the key, not the file.
8890
8891 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8892
8893         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8894         message that we were generating - we just need to silently return
8895         a null.
8896
8897 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8898
8899         * class.cs (Event.Define): Change my previous commit, as this
8900         breaks the debugger.  This is a temporary hack, as it seems like
8901         the compiler is generating events incorrectly to begin with.
8902
8903         * expression.cs (Binary.ResolveOperator): Added support for 
8904         "U operator - (E x, E y)"
8905
8906         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8907         y)".
8908
8909         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8910         init-only variables, but this path did not take into account that
8911         there might be also instance readonly variables.  Correct this
8912         problem. 
8913
8914         This fixes bug 32253
8915
8916         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8917         delegates as well.
8918
8919         * driver.cs: Change the extension for modules to `netmodule'
8920
8921         * cs-parser.jay: Improved slightly the location tracking for
8922         the debugger symbols.
8923
8924         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8925         modifiers that were specified instead of the hardcoded value
8926         (FamAndAssem).  This was basically ignoring the static modifier,
8927         and others.  Fixes 32429.
8928
8929         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8930         fixed a bug in the process (32476)
8931
8932         * expression.cs (ArrayAccess.EmitAssign): Patch from
8933         hwang_rob@yahoo.ca that fixes bug 31834.3
8934
8935 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8936
8937         * driver.cs: Make the module extension .netmodule.
8938
8939 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8940
8941         * driver.cs: Report an error if the resource file is not found
8942         instead of crashing.
8943
8944         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8945         false, like Emit does.
8946
8947 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8948
8949         * typemanager.cs: Remove unused private member.  Also reported mcs
8950         bug to report this as a warning like csc.
8951
8952 2002-10-15  Martin Baulig  <martin@gnome.org>
8953
8954         * statement.cs (Statement.Emit): Made this a virtual method; emits
8955         the line number info and calls DoEmit().
8956         (Statement.DoEmit): New protected abstract method, formerly knows
8957         as Statement.Emit().
8958
8959         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8960
8961 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8962
8963         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8964         have fixed a remaining problem: not every AddXXXX was adding a
8965         fully qualified name.  
8966
8967         Now everyone registers a fully qualified name in the DeclSpace as
8968         being defined instead of the partial name.  
8969
8970         Downsides: we are slower than we need to be due to the excess
8971         copies and the names being registered this way.  
8972
8973         The reason for this is that we currently depend (on the corlib
8974         bootstrap for instance) that types are fully qualified, because
8975         we dump all the types in the namespace, and we should really have
8976         types inserted into the proper namespace, so we can only store the
8977         basenames in the defined_names array.
8978
8979 2002-10-10  Martin Baulig  <martin@gnome.org>
8980
8981         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8982         from bug #31834, see the bug report for a testcase which is
8983         miscompiled.
8984
8985 2002-10-10  Martin Baulig  <martin@gnome.org>
8986
8987         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8988         flow analysis code for this.
8989
8990         * statement.cs (Do, While, For): Tell the flow analysis code about
8991         infinite loops.
8992         (FlowBranching.UsageVector): Added support for infinite loops.
8993         (Block.Resolve): Moved the dead code elimination here and use flow
8994         analysis to do it.
8995
8996 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8997
8998         * class.cs (Field.Define): Catch cycles on struct type
8999         definitions. 
9000
9001         * typemanager.cs (IsUnmanagedtype): Do not recursively check
9002         fields if the fields are static.  We only need to check instance
9003         fields. 
9004
9005         * expression.cs (As.DoResolve): Test for reference type.
9006
9007         * statement.cs (Using.ResolveExpression): Use
9008         ConvertImplicitRequired, not ConvertImplicit which reports an
9009         error on failture
9010         (Using.ResolveLocalVariableDecls): ditto.
9011
9012         * expression.cs (Binary.ResolveOperator): Report errors in a few
9013         places where we had to.
9014
9015         * typemanager.cs (IsUnmanagedtype): Finish implementation.
9016
9017 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
9018
9019         * expression.cs: Use StoreFromPtr instead of extracting the type
9020         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
9021
9022         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
9023         an enumeration value to a System.Enum, but System.Enum is not a
9024         value type, but an class type, so we need to box.
9025
9026         (Expression.ConvertExplicit): One codepath could return
9027         errors but not flag them.  Fix this.  Fixes #31853
9028
9029         * parameter.cs (Resolve): Do not allow void as a parameter type.
9030
9031 2002-10-06  Martin Baulig  <martin@gnome.org>
9032
9033         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
9034         if it's a class type and not a struct.  Fixes #31815.
9035
9036 2002-10-06  Martin Baulig  <martin@gnome.org>
9037
9038         * statement.cs: Reworked the flow analysis code a bit to make it
9039         usable for dead code elimination.
9040
9041 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9042
9043         * cs-parser.jay: allow empty source files. Fixes bug #31781.
9044
9045 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9046
9047         * expression.cs (ComposedCast.DoResolveType): A quick workaround
9048         to fix the test 165, will investigate deeper.
9049
9050 2002-10-04  Martin Baulig  <martin@gnome.org>
9051
9052         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
9053         finally blocks actually work.
9054         (Try.Resolve): We don't need to create a sibling for `finally' if
9055         there is no finally block.
9056
9057 2002-10-04  Martin Baulig  <martin@gnome.org>
9058
9059         * class.cs (Constructor.Define): The default accessibility for a
9060         non-default constructor is private, not public.
9061
9062 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9063
9064         * class.cs (Constructor): Make AllowedModifiers public, add
9065         EXTERN.
9066
9067         * cs-parser.jay: Perform the modifiers test here, as the
9068         constructor for the Constructor class usually receives a zero
9069         because of the way we create it (first we create, later we
9070         customize, and we were never checking the modifiers).
9071
9072         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
9073         is a version of LookupTypeReflection that includes the type-name
9074         cache.  This can be used as a fast path for functions that know
9075         the fully qualified name and are only calling into *.GetType() to
9076         obtain a composed type.
9077
9078         This is also used by TypeManager.LookupType during its type
9079         composition.
9080
9081         (LookupType): We now also track the real type name, as sometimes
9082         we can get a quey for the real type name from things like
9083         ComposedCast.  This fixes bug 31422.
9084
9085         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
9086         complete type fullname, it does not have to go through the type
9087         resolution system to obtain the composed version of the type (for
9088         obtaining arrays or pointers).
9089
9090         (Conditional.Emit): Use the EmitBoolExpression to
9091         generate nicer code, as requested by Paolo.
9092
9093         (ArrayCreation.CheckIndices): Use the patch from
9094         hwang_rob@yahoo.ca to validate the array initializers. 
9095
9096 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
9097
9098         * class.cs (ConstructorInitializer.Emit): simplify code by using
9099         Invocation.EmitCall, and at the same time, fix the bugs in calling
9100         parent constructors that took variable arguments. 
9101
9102         * ecore.cs (Expression.ConvertNumericExplicit,
9103         Expression.ImplicitNumericConversion): Remove the code that
9104         manually wrapped decimal (InternalTypeConstructor call is now gone
9105         as well).
9106
9107         * expression.cs (Cast.TryReduce): Also handle decimal types when
9108         trying to perform a constant fold on the type.
9109
9110         * typemanager.cs (IsUnmanagedtype): Partially implemented.
9111
9112         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
9113         that only turned off an error report, and did nothing else. 
9114
9115 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
9116
9117         * driver.cs: Handle and ignore /fullpaths
9118
9119 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
9120
9121         * expression.cs (Binary.ResolveOperator): Catch the case where
9122         DoNumericPromotions returns true, 
9123
9124         (Binary.DoNumericPromotions): Simplify the code, and the tests.
9125
9126 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
9127
9128         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
9129         report error 70.
9130
9131 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
9132
9133         * ecore.cs (ConvertNumericExplicit): It is not enough that the
9134         conversion exists, but it is also required that the conversion be
9135         performed.  This manifested in "(Type64Enum) 2".  
9136
9137         * class.cs (TypeManager.AddMethod): The fix is not to change
9138         AddEnum, because that one was using a fully qualified name (every
9139         DeclSpace derivative does), but to change the AddMethod routine
9140         that was using an un-namespaced name.  This now correctly reports
9141         the duplicated name.
9142
9143         Revert patch until I can properly fix it.  The issue
9144         is that we have a shared Type space across all namespaces
9145         currently, which is wrong.
9146
9147         Options include making the Namespace a DeclSpace, and merge
9148         current_namespace/current_container in the parser.
9149
9150 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
9151
9152         * cs-parser.jay: Improve error reporting when we get a different
9153         kind of expression in local_variable_type and
9154         local_variable_pointer_type. 
9155
9156         Propagate this to avoid missleading errors being reported.
9157
9158         * ecore.cs (ImplicitReferenceConversion): treat
9159         TypeManager.value_type as a target just like object_type.   As
9160         code like this:
9161
9162         ValueType v = 1;
9163
9164         Is valid, and needs to result in the int 1 being boxed before it
9165         is assigned to the value type v.
9166
9167         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
9168         to validate the enumeration name.
9169
9170         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
9171         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
9172         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
9173
9174         * ecore.cs (TryImplicitIntConversion): When doing an
9175         implicit-enumeration-conversion, check if the type is 64-bits and
9176         perform a conversion before passing to EnumConstant.
9177
9178 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
9179
9180         * decl.cs (Error_AmbiguousTypeReference); New routine used to
9181         report ambiguous type references.  Unlike the MS version, we
9182         report what the ambiguity is.   Innovation at work ;-)
9183
9184         (DeclSpace.FindType): Require a location argument to
9185         display when we display an ambiguous error.
9186
9187         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
9188
9189         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
9190
9191         * expression.cs (EmitDynamicInitializers): Apply patch from
9192         hwang_rob@yahoo.ca that fixes the order in which we emit our
9193         initializers. 
9194
9195 2002-09-21  Martin Baulig  <martin@gnome.org>
9196
9197         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
9198         delegate takes no arguments.
9199
9200 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
9201
9202         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
9203         from integers.
9204
9205         * expression.cs: Extract the underlying type.
9206
9207         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
9208
9209         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
9210
9211 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
9212
9213         * class.cs (TypeContainer.DefineType): We can not use the nice
9214         PackingSize with the size set to 1 DefineType method, because it
9215         will not allow us to define the interfaces that the struct
9216         implements.
9217
9218         This completes the fixing of bug 27287
9219
9220         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
9221         means also structs.  This fixes part of the problem. 
9222         (Expresion.ImplicitReferenceConversionExists): ditto.
9223
9224         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
9225         error if there were no errors reported during the type lookup
9226         process, to avoid duplicates or redundant errors.  Without this
9227         you would get an ambiguous errors plus a type not found.  We have
9228         beaten the user enough with the first error.  
9229
9230         (DeclSparce.FindType): Emit a warning if we have an ambiguous
9231         reference. 
9232
9233         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
9234         during the resolution process, stop the lookup, this avoids
9235         repeated error reports (same error twice).
9236
9237         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
9238
9239         * typemanager.cs (LookupType): Redo the type lookup code to match
9240         the needs of System.Reflection.  
9241
9242         The issue is that System.Reflection requires references to nested
9243         types to begin with a "+" sign instead of a dot.  So toplevel
9244         types look like: "NameSpace.TopLevelClass", and nested ones look
9245         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
9246         levels. 
9247
9248 2002-09-19  Martin Baulig  <martin@gnome.org>
9249
9250         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
9251         says that a method always returns or always throws an exception,
9252         don't report the CS0161.
9253
9254         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
9255         set `Returns = new_returns'.
9256
9257 2002-09-19  Martin Baulig  <martin@gnome.org>
9258
9259         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
9260         to an enum constant, check for a CS0176.
9261
9262 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
9263
9264         * class.cs (TypeContainer.CheckPairedOperators): Now we check
9265         for operators that must be in pairs and report errors.
9266
9267         * ecore.cs (SimpleName.DoResolveType): During the initial type
9268         resolution process, when we define types recursively, we must
9269         check first for types in our current scope before we perform
9270         lookups in the enclosing scopes.
9271
9272         * expression.cs (MakeByteBlob): Handle Decimal blobs.
9273
9274         (Invocation.VerifyArgumentsCompat): Call
9275         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
9276         I thought we were supposed to always call this, but there are a
9277         few places in the code where we dont do it.
9278
9279 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
9280
9281         * driver.cs: Add support in -linkres and -resource to specify the
9282         name of the identifier.
9283
9284 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9285
9286         * ecore.cs (StandardConversionExists): Sync with the conversion
9287         code: allow anything-* to void* conversions.
9288
9289         (FindMostSpecificSource): Use an Expression argument
9290         instead of a Type, because we might be handed over a Literal which
9291         gets a few more implicit conversions that plain types do not.  So
9292         this information was being lost.
9293
9294         Also, we drop the temporary type-holder expression when not
9295         required.
9296
9297 2002-09-17  Martin Baulig  <martin@gnome.org>
9298
9299         * class.cs (PropertyBase.CheckBase): Don't check the base class if
9300         this is an explicit interface implementation.
9301
9302 2002-09-17  Martin Baulig  <martin@gnome.org>
9303
9304         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
9305         different `IndexerName' attributes.
9306
9307         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
9308         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
9309         virtual CommonResolve().
9310
9311 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9312
9313         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
9314         and convert that to the UnderlyingType.
9315
9316         * statement.cs (Foreach.Resolve): Indexers are just like variables
9317         or PropertyAccesses.
9318
9319         * cs-tokenizer.cs (consume_string): Track line numbers and columns
9320         inside quoted strings, we were not doing this before.
9321
9322 2002-09-16  Martin Baulig  <martin@gnome.org>
9323
9324         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
9325         resolve it.  This is needed for the definite assignment check of the
9326         instance expression, fixes bug #29846.
9327         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
9328
9329 2002-09-16  Nick Drochak  <ndrochak@gol.com>
9330
9331         * parameter.cs: Fix compile error.  Cannot reference static member
9332         from an instance object.  Is this an mcs bug?
9333
9334 2002-09-14  Martin Baulig  <martin@gnome.org>
9335
9336         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
9337         multiple times.  Fixes bug #30295, added test-166.cs.
9338
9339 2002-09-14  Martin Baulig  <martin@gnome.org>
9340
9341         * statement.cs (Block.Emit): Don't emit unreachable code.
9342         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
9343         `break' statements.
9344         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
9345
9346 2002-09-14  Martin Baulig  <martin@gnome.org>
9347
9348         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
9349         is set.
9350
9351 2002-09-14  Martin Baulig  <martin@gnome.org>
9352
9353         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
9354         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
9355         be false on the ms runtime.
9356
9357 2002-09-13  Martin Baulig  <martin@gnome.org>
9358
9359         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
9360         the CS0038 error message.
9361
9362 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
9363
9364         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
9365         constant inside, return it.
9366
9367 2002-09-12  Martin Baulig  <martin@gnome.org>
9368
9369         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
9370         implicit conversion can be done between enum types.
9371
9372         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
9373         check whether an implicit conversion to the current enum's UnderlyingType
9374         exists and report an error if not.
9375
9376         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
9377         without debugging support.
9378
9379         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
9380         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
9381
9382 2002-09-12  Martin Baulig  <martin@gnome.org>
9383
9384         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
9385
9386         * ecore.cs (IMemberExpr.DeclaringType): New property.
9387         (SimpleName.SimpleNameResolve): Check whether we're accessing a
9388         nonstatic member of an outer type (CS0038).
9389
9390 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
9391
9392         * driver.cs: Activate the using-error detector at warning level
9393         4 (at least for MS-compatible APIs).
9394
9395         * namespace.cs (VerifyUsing): Small buglett fix.
9396
9397         * pending.cs (PendingImplementation): pass the container pointer. 
9398
9399         * interface.cs (GetMethods): Allow for recursive definition.  Long
9400         term, I would like to move every type to support recursive
9401         definitions, not the current ordering mechanism that we have right
9402         now.
9403
9404         The situation is this: Attributes are handled before interfaces,
9405         so we can apply attributes to interfaces.  But some attributes
9406         implement interfaces, we will now handle the simple cases
9407         (recursive definitions will just get an error).  
9408
9409         * parameter.cs: Only invalidate types at the end if we fail to
9410         lookup all types.  
9411
9412 2002-09-09  Martin Baulig  <martin@gnome.org>
9413
9414         * ecore.cs (PropertyExpr.Emit): Also check for
9415         TypeManager.system_int_array_get_length so this'll also work when
9416         compiling corlib.  Fixes #30003.
9417
9418 2002-09-09  Martin Baulig  <martin@gnome.org>
9419
9420         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
9421         and throw an exception if we can't get the type's size.  Fixed #30040,
9422         added test-165.cs.
9423
9424 2002-09-09  Martin Baulig  <martin@gnome.org>
9425
9426         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
9427
9428         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
9429         context.  Fixes bug #30027.
9430
9431         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
9432         virtual functions.  Fixes bug #30043, added test-164.cs.
9433
9434 2002-09-08  Ravi Pratap  <ravi@ximian.com>
9435
9436         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
9437
9438 2002-09-08  Nick Drochak  <ndrochak@gol.com>
9439
9440         * driver.cs: Use an object to get the windows codepage since it's not a
9441         static property.
9442
9443 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
9444
9445         * statement.cs (For.Emit): for infinite loops (test == null)
9446         return whether there is a break inside, not always "true".
9447
9448         * namespace.cs (UsingEntry): New struct to hold the name of the
9449         using definition, the location where it is defined, and whether it
9450         has been used in a successful type lookup.
9451
9452         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
9453         strings.
9454
9455         * decl.cs: ditto.
9456
9457 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9458
9459         * attribute.cs : Fix incorrect code which relied on catching
9460         a NullReferenceException to detect a null being passed in
9461         where an object was expected.
9462
9463 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
9464
9465         * statement.cs (Try): flag the catch variable as assigned
9466
9467         * expression.cs (Cast): Simplified by using ResolveType instead of
9468         manually resolving.
9469
9470         * statement.cs (Catch): Fix bug by using ResolveType.
9471
9472 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9473
9474         * expression.cs (BetterConversion): Special case for when we have
9475         a NullLiteral as the argument and we have to choose between string
9476         and object types - we choose string the way csc does.
9477
9478         * attribute.cs (Attribute.Resolve): Catch the
9479         NullReferenceException and report error #182 since the Mono
9480         runtime no more has the bug and having this exception raised means
9481         we tried to select a constructor which takes an object and is
9482         passed a null.
9483
9484 2002-09-05  Ravi Pratap  <ravi@ximian.com>
9485
9486         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
9487         message (1502, 1503) when we can't locate a method after overload
9488         resolution. This is much more informative and closes the bug
9489         Miguel reported.
9490
9491         * interface.cs (PopulateMethod): Return if there are no argument
9492         types. Fixes a NullReferenceException bug.
9493
9494         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9495         expressions too. Previously we were checking only in one place for
9496         positional arguments leaving out named arguments.
9497
9498         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9499         type to the enum type is not allowed. Remove code corresponding to
9500         that.
9501
9502         (ConvertNumericExplicit): Allow explicit conversions from
9503         the underlying type to enum type. This precisely follows the spec
9504         and closes a bug filed by Gonzalo.
9505
9506 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9507
9508         * compiler.csproj:
9509         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9510
9511 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9512
9513         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9514         it was important that we stored the right value after the
9515         reduction in `converted'.
9516
9517 2002-09-04  Martin Baulig  <martin@gnome.org>
9518
9519         * location.cs (Location.SymbolDocument): Use full pathnames for the
9520         source files.
9521
9522 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9523
9524         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9525         of the expression resolve mechanism, because that will catch the
9526         SimpleName error failures.
9527
9528         (Conditional): If we can not resolve the
9529         expression, return, do not crash.
9530
9531 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9532
9533         * cs-tokenizer.cs:
9534         (location): display token name instead of its number.
9535
9536 2002-08-28  Martin Baulig  <martin@gnome.org>
9537
9538         * expression.cs (Binary.ResolveOperator): Don't silently return
9539         but return an error if an operator cannot be applied between two
9540         enum types.
9541
9542 2002-08-28  Martin Baulig  <martin@gnome.org>
9543
9544         * class.cs (Constructor.Define): Set the permission attributes
9545         correctly instead of making all constructors public.
9546
9547 2002-08-28  Martin Baulig  <martin@gnome.org>
9548
9549         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9550         for private members before reporting a CS0103; if we find anything,
9551         it's a CS0122.
9552
9553 2002-08-28  Martin Baulig  <martin@gnome.org>
9554
9555         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9556         to check whether `closure_start_type == closure_invocation_type',
9557         we also need to check whether `m.DeclaringType == closure_invocation_type'
9558         before bypassing the permission checks.  We might be accessing
9559         protected/private members from the base class.
9560         (TypeManager.RealMemberLookup): Only set private_ok if private
9561         members were requested via BindingFlags.NonPublic.
9562
9563         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9564
9565         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9566         MethodGroupExpr.IsExplicitImpl if appropriate.
9567         (Invocation.DoResolve): Don't report the CS0120 for explicit
9568         interface implementations.
9569
9570 2002-08-27  Martin Baulig  <martin@gnome.org>
9571
9572         * expression.cs (Invocation.DoResolve): If this is a static
9573         method and we don't have an InstanceExpression, we must report
9574         a CS0120.
9575
9576 2002-08-25  Martin Baulig  <martin@gnome.org>
9577
9578         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9579         `==' between a valuetype and an object.
9580
9581 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9582
9583         * ecore.cs (TypeExpr): Provide a ToString method.
9584
9585 2002-08-24  Martin Baulig  <martin@gnome.org>
9586
9587         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9588         now called proggie.dbg and it's a binary file.
9589
9590 2002-08-23  Martin Baulig  <martin@gnome.org>
9591
9592         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9593
9594 2002-08-23  Martin Baulig  <martin@gnome.org>
9595
9596         * struct.cs (MyStructInfo.ctor): Make this work with empty
9597         structs; it's not allowed to use foreach() on null.
9598
9599 2002-08-23  Martin Baulig  <martin@gnome.org>
9600
9601         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9602         writer the full pathname of the generated assembly.
9603
9604 2002-08-23  Martin Baulig  <martin@gnome.org>
9605
9606         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9607         A `finally' block never returns or breaks; improved handling of
9608         unreachable code.
9609
9610 2002-08-23  Martin Baulig  <martin@gnome.org>
9611
9612         * statement.cs (Throw.Resolve): Allow `throw null'.
9613
9614 2002-08-23  Martin Baulig  <martin@gnome.org>
9615
9616         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9617         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9618         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9619         MemberLookup would return a wrong event if this is an explicit
9620         interface implementation and the class has an event with the same
9621         name.
9622
9623 2002-08-23  Martin Baulig  <martin@gnome.org>
9624
9625         * statement.cs (Block.AddChildVariableNames): New public method.
9626         (Block.AddChildVariableName): Likewise.
9627         (Block.IsVariableNameUsedInChildBlock): Likewise.
9628         (Block.AddVariable): Check whether a variable name has already
9629         been used in a child block.
9630
9631         * cs-parser.jay (declare_local_variables): Mark all variable names
9632         from the current block as being used in a child block in the
9633         implicit block.
9634
9635 2002-08-23  Martin Baulig  <martin@gnome.org>
9636
9637         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9638         find the symbol writer.
9639
9640         * driver.cs: csc also allows the arguments to /define being
9641         separated by commas, not only by semicolons.
9642
9643 2002-08-23  Martin Baulig  <martin@gnome.org>
9644
9645         * interface.cs (Interface.GetMembers): Added static check for events.
9646
9647 2002-08-15  Martin Baulig  <martin@gnome.org>
9648
9649         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9650         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9651
9652         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9653         why the MethodData.EmitDestructor() change was necessary.
9654
9655 2002-08-20  Martin Baulig  <martin@gnome.org>
9656
9657         * class.cs (TypeContainer.FindMembers): Added static check for events.
9658
9659         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9660
9661         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9662         use Type.GetEvents(), not Type.FindMembers().
9663
9664 2002-08-20  Martin Baulig  <martin@gnome.org>
9665
9666         * decl.cs (MemberCache): Added a special method cache which will
9667         be used for method-only searched.  This ensures that a method
9668         search will return a MethodInfo with the correct ReflectedType for
9669         inherited methods.      
9670
9671 2002-08-20  Martin Baulig  <martin@gnome.org>
9672
9673         * decl.cs (DeclSpace.FindMembers): Made this public.
9674
9675 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9676
9677         * delegate.cs: fixed build on windows.
9678         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9679
9680 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9681
9682         * ecore.cs (StandardConversionExists): Return a false
9683         if we are trying to convert the void type to anything else
9684         since that is not allowed.
9685
9686         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9687         we flag error 70 in the event an event is trying to be accessed
9688         directly from outside the declaring type.
9689
9690 2002-08-20  Martin Baulig  <martin@gnome.org>
9691
9692         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9693         MemberCache from typemanager.cs to decl.cs.
9694
9695 2002-08-19  Martin Baulig  <martin@gnome.org>
9696
9697         * class.cs (TypeContainer): Implement IMemberContainer.
9698         (TypeContainer.DefineMembers): Create the MemberCache.
9699         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9700         return public members if BindingFlags.Public was given, check
9701         whether members are static.
9702
9703 2002-08-16  Martin Baulig  <martin@gnome.org>
9704
9705         * decl.cs (DeclSpace.Define): Splitted this in Define and
9706         DefineMembers.  DefineMembers is called first and initializes the
9707         MemberCache.
9708
9709         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9710         DefineMembers() on all our DeclSpaces.
9711
9712         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9713         but call DefineMembers() on all nested interfaces.  We call their
9714         Define() in our new Define() function.
9715
9716         * interface.cs (Interface): Implement IMemberContainer.
9717         (Interface.Define): Moved all code except the attribute stuf to
9718         DefineMembers().
9719         (Interface.DefineMembers): Initialize the member cache.
9720
9721         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9722         need this anymore since we can use MemberCache.FindMembers directly.
9723
9724 2002-08-19  Martin Baulig  <martin@gnome.org>
9725
9726         * typemanager.cs (MemberCache): When creating the cache for an
9727         interface type, add all inherited members.
9728         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9729         to `out bool used_cache' and documented it.
9730         (TypeManager.MemberLookup): If we already used the cache in the first
9731         iteration, we don't need to do the interfaces check.
9732
9733 2002-08-19  Martin Baulig  <martin@gnome.org>
9734
9735         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9736         here from IMemberFinder and don't implement this interface anymore.
9737         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9738
9739         * typemanager.cs (IMemberFinder): This interface is now only used by
9740         classes which actually support the member cache.
9741         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9742         since we only put DeclSpaces into this Hashtable.
9743         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9744         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9745
9746 2002-08-16  Martin Baulig  <martin@gnome.org>
9747
9748         * typemanager.cs (ICachingMemberFinder): Removed.
9749         (IMemberFinder.MemberCache): New property.
9750         (TypeManager.FindMembers): Merged this with RealFindMembers().
9751         This function will never be called from TypeManager.MemberLookup()
9752         so we can't use the cache here, just the IMemberFinder.
9753         (TypeManager.MemberLookup_FindMembers): Check whether the
9754         IMemberFinder has a MemberCache and call the cache's FindMembers
9755         function.
9756         (MemberCache): Rewrote larger parts of this yet another time and
9757         cleaned it up a bit.
9758
9759 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9760
9761         * driver.cs (LoadArgs): Support quoting.
9762
9763         (Usage): Show the CSC-like command line arguments.
9764
9765         Improved a few error messages.
9766
9767 2002-08-15  Martin Baulig  <martin@gnome.org>
9768
9769         * typemanager.cs (IMemberContainer.Type): New property.
9770         (IMemberContainer.IsInterface): New property.
9771
9772         The following changes are conditional to BROKEN_RUNTIME, which is
9773         defined at the top of the file.
9774
9775         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9776         class'es members, but add all members from TypeHandle.ObjectType
9777         if we're an interface.
9778         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9779         is the current type.
9780         (MemberCache.CacheEntry.Container): Removed this field.
9781         (TypeHandle.GetMembers): Include inherited members.
9782
9783 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9784
9785         * typemanager.cs: fixed compilation and added a comment on a field that
9786         is never used.
9787
9788 2002-08-15  Martin Baulig  <martin@gnome.org>
9789
9790         * class.cs (ConstructorInitializer.Resolve): In the
9791         Expression.MemberLookup call, use the queried_type as
9792         invocation_type.
9793
9794         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9795         declared' attribute, it's always true.
9796         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9797         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9798         temporary wrapper for FindMembers which tells MemberLookup whether
9799         members from the base classes are included in the return value.
9800         This will go away soon.
9801         (TypeManager.MemberLookup): Use this temporary hack here; once the
9802         new MemberCache is completed, we don't need to do the DeclaredOnly
9803         looping here anymore since the MemberCache will take care of this.
9804         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9805         (MemberCache): When creating the MemberCache for a class, get
9806         members from the current class and all its base classes.
9807         (MemberCache.CacheEntry.Container): New field.  This is a
9808         temporary hack until the Mono runtime is fixed to distinguish
9809         between ReflectedType and DeclaringType.  It allows us to use MCS
9810         with both the MS runtime and the unfixed Mono runtime without
9811         problems and without accecting performance.
9812         (MemberCache.SearchMembers): The DeclaredOnly looping from
9813         TypeManager.MemberLookup is now done here.      
9814
9815 2002-08-14  Martin Baulig  <martin@gnome.org>
9816
9817         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9818         Type.GetFields on dynamic types but get the fields from the
9819         corresponding TypeContainer.
9820         (MyStructInfo.GetStructInfo): Added check for enum types.
9821
9822         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9823         (MemberList.SyncRoot): Implemented.
9824         (TypeManager.FilterWithClosure): No need to check permissions if
9825         closure_start_type == closure_invocation_type, don't crash if
9826         closure_invocation_type is null.
9827
9828 2002-08-13  Martin Baulig  <martin@gnome.org>
9829
9830         Rewrote TypeContainer.FindMembers to use a member cache.  This
9831         gives us a speed increase of about 35% for the self-hosting MCS
9832         build and of about 15-20% for the class libs (both on GNU/Linux).
9833
9834         * report.cs (Timer): New class to get enhanced profiling.  This
9835         whole class is "TIMER" conditional since it remarkably slows down
9836         compilation speed.
9837
9838         * class.cs (MemberList): New class.  This is an IList wrapper
9839         which we're now using instead of passing MemberInfo[]'s around to
9840         avoid copying this array unnecessarily.
9841         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9842         (ICachingMemberFinder, IMemberContainer): New interface.
9843         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9844         has already been checked, otherwise use it for the name comparision.
9845         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9846         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9847         if possible.  Returns a MemberList, not a MemberInfo [].
9848         (TypeHandle): New class, implements IMemberContainer.  We create
9849         one instance of this class per type, it contains a MemberCache
9850         which is used to do the member lookups.
9851         (MemberCache): New class.  Each instance of this class contains
9852         all members of a type and a name-based hash table.
9853         (MemberCache.FindMembers): This is our new member lookup
9854         function.  First, it looks up all members of the requested name in
9855         the hash table.  Then, it walks this list and sorts out all
9856         applicable members and returns them.
9857
9858 2002-08-13  Martin Baulig  <martin@gnome.org>
9859
9860         In addition to a nice code cleanup, this gives us a performance
9861         increase of about 1.4% on GNU/Linux - not much, but it's already
9862         half a second for the self-hosting MCS compilation.
9863
9864         * typemanager.cs (IMemberFinder): New interface.  It is used by
9865         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9866         Enum, Delegate or Interface.
9867         (TypeManager.finder_to_member_finder): New PtrHashtable.
9868         (TypeManager.finder_to_container): Removed.
9869         (TypeManager.finder_to_delegate): Removed.
9870         (TypeManager.finder_to_interface): Removed.
9871         (TypeManager.finder_to_enum): Removed.
9872
9873         * interface.cs (Interface): Implement IMemberFinder.
9874
9875         * delegate.cs (Delegate): Implement IMemberFinder.
9876
9877         * enum.cs (Enum): Implement IMemberFinder.
9878
9879         * class.cs (TypeContainer): Implement IMemberFinder.
9880
9881 2002-08-12  Martin Baulig  <martin@gnome.org>
9882
9883         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9884
9885 2002-08-12  Martin Baulig  <martin@gnome.org>
9886
9887         * ecore.cs (ITypeExpression): New interface for expressions which
9888         resolve to a type.
9889         (TypeExpression): Renamed to TypeLookupExpression.
9890         (Expression.DoResolve): If we're doing a types-only lookup, the
9891         expression must implement the ITypeExpression interface and we
9892         call DoResolveType() on it.
9893         (SimpleName): Implement the new ITypeExpression interface.
9894         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9895         hack, the situation that we're only looking up types can't happen
9896         anymore when this method is called.  Moved the type lookup code to
9897         DoResolveType() and call it.
9898         (SimpleName.DoResolveType): This ITypeExpression interface method
9899         is now doing the types-only lookup.
9900         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9901         (ResolveFlags): Added MaskExprClass.
9902
9903         * expression.cs (MemberAccess): Implement the ITypeExpression
9904         interface.
9905         (MemberAccess.DoResolve): Added support for a types-only lookup
9906         when we're called via ITypeExpression.DoResolveType().
9907         (ComposedCast): Implement the ITypeExpression interface.
9908
9909         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9910         Expression.Resolve() with ResolveFlags.Type instead.
9911
9912 2002-08-12  Martin Baulig  <martin@gnome.org>
9913
9914         * interface.cs (Interface.Define): Apply attributes.
9915
9916         * attribute.cs (Attribute.ApplyAttributes): Added support for
9917         interface attributes.
9918
9919 2002-08-11  Martin Baulig  <martin@gnome.org>
9920
9921         * statement.cs (Block.Emit): Only check the "this" variable if we
9922         do not always throw an exception.
9923
9924         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9925         whether the property has a set accessor.
9926
9927 2002-08-11  Martin Baulig  <martin@gnome.org>
9928
9929         Added control flow analysis support for structs.
9930
9931         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9932         with control flow analysis turned off.
9933         (IVariable): New interface.
9934         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9935         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9936         (FieldExpr.DoResolve): Resolve the instance expression with flow
9937         analysis turned off and do the definite assignment check after the
9938         resolving when we know what the expression will resolve to.
9939
9940         * expression.cs (LocalVariableReference, ParameterReference):
9941         Implement the new IVariable interface, only call the flow analysis
9942         code if ec.DoFlowAnalysis is true.
9943         (This): Added constructor which takes a Block argument.  Implement
9944         the new IVariable interface.
9945         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9946         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9947         This does the definite assignment checks for struct members.
9948
9949         * class.cs (Constructor.Emit): If this is a non-static `struct'
9950         constructor which doesn't have any initializer, call
9951         Block.AddThisVariable() to tell the flow analysis code that all
9952         struct elements must be initialized before control returns from
9953         the constructor.
9954
9955         * statement.cs (MyStructInfo): New public class.
9956         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9957         argument to this indexer.  If non-zero, check an individual struct
9958         member, not the whole struct.
9959         (FlowBranching.CheckOutParameters): Check struct members.
9960         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9961         overloaded versions of these methods which take an additional
9962         `int field_idx' argument to check struct members.
9963         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9964         overloaded versions of these methods which take an additional
9965         `string field_name' argument to check struct member.s
9966         (VariableInfo): Implement the IVariable interface.
9967         (VariableInfo.StructInfo): New public property.  Returns the
9968         MyStructInfo instance of the variable if it's a struct or null.
9969         (Block.AddThisVariable): New public method.  This is called from
9970         Constructor.Emit() for non-static `struct' constructor which do
9971         not have any initializer.  It creates a special variable for the
9972         "this" instance variable which will be checked by the flow
9973         analysis code to ensure that all of the struct's fields are
9974         initialized before control returns from the constructor.
9975         (UsageVector): Added support for struct members.  If a
9976         variable/parameter is a struct with N members, we reserve a slot
9977         in the usage vector for each member.  A struct is considered fully
9978         initialized if either the struct itself (slot 0) or all its
9979         members are initialized.
9980
9981 2002-08-08  Martin Baulig  <martin@gnome.org>
9982
9983         * driver.cs (Driver.MainDriver): Only report an error CS5001
9984         if there were no compilation errors.
9985
9986         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9987         `UnsafeContext' property to determine whether the parent is in
9988         unsafe context rather than checking the parent's ModFlags:
9989         classes nested in an unsafe class are unsafe as well.
9990
9991 2002-08-08  Martin Baulig  <martin@gnome.org>
9992
9993         * statement.cs (UsageVector.MergeChildren): Distinguish between
9994         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9995         we return.  Added test17() and test18() to test-154.cs.
9996
9997 2002-08-08  Martin Baulig  <martin@gnome.org>
9998
9999         * typemanager.cs (TypeManager.FilterWithClosure): If we have
10000         Family access, make sure the invoking type isn't a subclass of the
10001         queried type (that'd be a CS1540).
10002
10003         * ecore.cs (Expression.MemberLookup): Added overloaded version of
10004         this method which takes an additional `Type invocation_type'.
10005
10006         * expression.cs (BaseAccess.DoResolve): Use the base type as
10007         invocation and query type.
10008         (MemberAccess.DoResolve): If the lookup failed and we're about to
10009         report a CS0122, try a lookup with the ec.ContainerType - if this
10010         succeeds, we must report a CS1540.
10011
10012 2002-08-08  Martin Baulig  <martin@gnome.org>
10013
10014         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
10015         (MethodGroupExpr): Implement the IMemberExpr interface.
10016
10017         * expression (MemberAccess.ResolveMemberAccess): No need to have
10018         any special code for MethodGroupExprs anymore, they're now
10019         IMemberExprs.   
10020
10021 2002-08-08  Martin Baulig  <martin@gnome.org>
10022
10023         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
10024         Family, FamANDAssem and FamORAssem permissions.
10025         (TypeManager.IsSubclassOrNestedChildOf): New public method.
10026
10027 2002-08-08  Martin Baulig  <martin@gnome.org>
10028
10029         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
10030         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
10031         or loop block.
10032
10033 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
10034
10035         * driver.cs: implemented /resource option to embed managed resources.
10036
10037 2002-08-07  Martin Baulig  <martin@gnome.org>
10038
10039         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
10040         (FieldBase.HasFieldInitializer): New public property.
10041         (FieldBase.GetInitializerExpression): New public method.  Resolves and
10042         returns the field initializer and makes sure it is only resolved once.
10043         (TypeContainer.EmitFieldInitializers): Call
10044         FieldBase.GetInitializerExpression to get the initializer, this ensures
10045         that it isn't resolved multiple times.
10046
10047         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
10048         the resolving process (SimpleName/MemberLookup) that we're currently
10049         emitting a field initializer (which must not access any instance members,
10050         this is an error CS0236).
10051
10052         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
10053         argument, if the `IsFieldInitializer' flag is set, we must report and
10054         error CS0236 and not an error CS0120.   
10055
10056 2002-08-07  Martin Baulig  <martin@gnome.org>
10057
10058         * ecore.cs (IMemberExpr): New public interface.
10059         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
10060         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
10061         if the expression is an IMemberExpr.
10062
10063         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
10064         to be null, implicitly default to `this' if we're non-static in
10065         this case.  Simplified the code a lot by using the new IMemberExpr
10066         interface.  Also fixed bug #28176 here.
10067
10068 2002-08-06  Martin Baulig  <martin@gnome.org>
10069
10070         * cs-parser.jay (SimpleLookup): Removed.  We need to create
10071         ParameterReferences during semantic analysis so that we can do a
10072         type-only search when resolving Cast, TypeOf and SizeOf.
10073         (block): Pass the `current_local_parameters' to the Block's
10074         constructor.
10075
10076         * class.cs (ConstructorInitializer): Added `Parameters parameters'
10077         argument to the constructor.
10078         (ConstructorInitializer.Resolve): Create a temporary implicit
10079         block with the parameters.
10080
10081         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
10082         references here if we aren't doing a type-only search.
10083
10084         * statement.cs (Block): Added constructor which takes a
10085         `Parameters parameters' argument.
10086         (Block.Parameters): New public property.
10087
10088         * support.cs (InternalParameters.Parameters): Renamed `parameters'
10089         to `Parameters' and made it public readonly.
10090
10091 2002-08-06  Martin Baulig  <martin@gnome.org>
10092
10093         * ecore.cs (Expression.Warning): Made this public as well.
10094
10095         * report.cs (Report.Debug): Print the contents of collections.
10096
10097 2002-08-06  Martin Baulig  <martin@gnome.org>
10098
10099         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
10100         used to tell Resolve() which kinds of expressions it may return.
10101         (Expression.Resolve): Added overloaded version of this method which
10102         takes a `ResolveFlags flags' argument.  This can be used to tell
10103         Resolve() which kinds of expressions it may return.  Reports a
10104         CS0118 on error.
10105         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
10106         ResolveFlags.SimpleName.
10107         (Expression.Error118): Added overloaded version of this method which
10108         takes a `ResolveFlags flags' argument.  It uses the flags to determine
10109         which kinds of expressions are allowed.
10110
10111         * expression.cs (Argument.ResolveMethodGroup): New public method.
10112         Resolves an argument, but allows a MethodGroup to be returned.
10113         This is used when invoking a delegate.
10114
10115         * TODO: Updated a bit.
10116
10117 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10118
10119         Fixed compilation with csc.
10120
10121         * ecore.cs: Expression.Error made public. Is this correct? Should
10122         Warning be made public too?
10123
10124         * expression.cs: use ea.Location instead of ea.loc.
10125         [FIXME:  Filed as bug #28607: MCS must report these errors.]
10126
10127 2002-08-06  Martin Baulig  <martin@gnome.org>
10128
10129         * ecore.cs (Expression.loc): Moved the location here instead of
10130         duplicating it in all derived classes.
10131         (Expression.Location): New public property.
10132         (Expression.Error, Expression.Warning): Made them non-static and
10133         removed the location argument.
10134         (Expression.Warning): Added overloaded version which takes an
10135         `int level' argument.
10136         (Expression.Error118): Make this non-static and removed the
10137         expression and location arguments.
10138         (TypeExpr): Added location argument to the constructor.
10139
10140         * expression.cs (StaticCallExpr): Added location argument to
10141         the constructor.
10142         (Indirection, PointerArithmetic): Likewise.
10143         (CheckedExpr, UnCheckedExpr): Likewise.
10144         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
10145         (StringPtr): Likewise.
10146
10147
10148 2002-08-05  Martin Baulig  <martin@gnome.org>
10149
10150         * expression.cs (BaseAccess.DoResolve): Actually report errors.
10151
10152         * assign.cs (Assign.DoResolve): Check whether the source
10153         expression is a value or variable.
10154
10155         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
10156         while resolving the corresponding blocks.
10157
10158         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
10159         an error, don't silently return null.
10160
10161         * statement.cs (Block.AddVariable): Do the error reporting here
10162         and distinguish between CS0128 and CS0136.
10163         (Block.DoResolve): Report all unused labels (warning CS0164).
10164         (LabeledStatement): Pass the location to the constructor.
10165         (LabeledStatement.HasBeenReferenced): New property.
10166         (LabeledStatement.Resolve): Set it to true here.
10167
10168         * statement.cs (Return.Emit): Return success even after reporting
10169         a type mismatch error (CS0126 or CS0127), this is what csc does and
10170         it avoids confusing the users with any consecutive errors.
10171
10172 2002-08-05  Martin Baulig  <martin@gnome.org>
10173
10174         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
10175
10176         * const.cs (Const.LookupConstantValue): Catch circular definitions.
10177
10178         * expression.cs (MemberAccess.DoResolve): Silently return if an
10179         error has already been reported.
10180
10181         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
10182         error has already been reported.
10183
10184 2002-08-05  Martin Baulig  <martin@gnome.org>
10185
10186         * statement.cs (UsageVector): Only initialize the `parameters'
10187         vector if we actually have any "out" parameters.
10188
10189 2002-08-05  Martin Baulig  <martin@gnome.org>
10190
10191         * expression.cs (Binary.ResolveOperator): When combining delegates,
10192         they must have the same type.
10193
10194 2002-08-05  Martin Baulig  <martin@gnome.org>
10195
10196         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
10197         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
10198         work with the ms runtime and we also don't need it: if we're a
10199         PropertyBuilder and not in the `indexer_arguments' hash, then we
10200         are a property and not an indexer.
10201
10202         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
10203         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
10204         since the latter one doesn't work with the ms runtime.
10205
10206 2002-08-03  Martin Baulig  <martin@gnome.org>
10207
10208         Fixed bugs #27998 and #22735.
10209
10210         * class.cs (Method.IsOperator): New public field.
10211         (Method.CheckBase): Report CS0111 if there's already a method
10212         with the same parameters in the current class.  Report CS0508 when
10213         attempting to change the return type of an inherited method.
10214         (MethodData.Emit): Report CS0179 if a method doesn't have a body
10215         and it's not marked abstract or extern.
10216         (PropertyBase): New abstract base class for Property and Indexer.
10217         (PropertyBase.CheckBase): Moved here from Property and made it work
10218         for indexers.
10219         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
10220         the same so we can reuse it there.
10221         (Property, Indexer): Derive from PropertyBase.
10222         (MethodSignature.inheritable_property_signature_filter): New delegate
10223         to find properties and indexers.
10224
10225         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
10226         argument and improved error reporting.
10227
10228         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
10229         EmptyReadOnlyParameters and made it a property.
10230
10231         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
10232         version of this method which takes a `PropertyInfo indexer'.
10233         (TypeManager.RegisterIndexer): New method.
10234
10235         * class.cs: Added myself as author of this file :-)
10236
10237 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10238
10239         * class.cs: fixed compilation on windoze.
10240
10241 2002-08-03  Martin Baulig  <martin@gnome.org>
10242
10243         * interface.cs (Interface.GetInterfaceBases): Check whether all
10244         base interfaces are at least as accessible than the current one.
10245
10246         * class.cs (TypeContainer.GetClassBases): Check whether base types
10247         are at least as accessible than the current type.
10248         (TypeContainer.AsAccessible): Implemented and made non-static.
10249         (MemberBase.CheckParameters): Report errors if the accessibility
10250         checks fail.
10251
10252         * delegate.cs (Delegate.Delegate): The default visibility is
10253         internal for top-level types and private for nested types.
10254         (Delegate.Define): Report errors if the accessibility checks fail.
10255
10256         * enum.cs (Enum.Enum): The default visibility is internal for
10257         top-level types and private for nested types.
10258         (Enum.DefineType): Compute the correct visibility.
10259
10260         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
10261         function which takes a `bool is_toplevel' instead of a TypeContainer.
10262
10263         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
10264         builtin type.
10265
10266 2002-08-02  Martin Baulig  <martin@gnome.org>
10267
10268         * expression.cs (LocalVariableReferenc): Added constructor which
10269         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
10270         (LocalVariableReference.IsReadOnly): New property.
10271         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
10272         variable is readonly, use our own readonly flag to do this; you can
10273         use the new constructor to get a writable reference to a read-only
10274         variable.
10275
10276         * cs-parser.jay (foreach_statement, using_statement): Get a writable
10277         reference to the local variable.
10278
10279 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
10280
10281         * rootcontext.cs (ResolveCore): Also include System.Exception
10282
10283         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
10284         we reach an EmptyStatement.
10285
10286         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
10287         is also fine.
10288
10289         * expression.cs (Binary.ResolveOperator): Check error result in
10290         two places.
10291
10292         use brtrue/brfalse directly and avoid compares to null.
10293
10294 2002-08-02  Martin Baulig  <martin@gnome.org>
10295
10296         * class.cs (TypeContainer.Define): Define all nested interfaces here.
10297         Fixes bug #28407, added test-155.cs.
10298
10299 2002-08-01  Martin Baulig  <martin@gnome.org>
10300
10301         * class.cs (Event.EmitDefaultMethod): Make this work with static
10302         events.  Fixes #28311, added verify-3.cs.
10303
10304 2002-08-01  Martin Baulig  <martin@gnome.org>
10305
10306         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
10307         `is_disposable' fields.
10308         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
10309         `hm.is_disposable' if we're using the collection pattern.
10310         (Foreach.EmitCollectionForeach): Use the correct type for the
10311         enumerator's local variable, only emit the try/finally block if
10312         necessary (fixes #27713).
10313
10314 2002-08-01  Martin Baulig  <martin@gnome.org>
10315
10316         * ecore.cs (Expression.report118): Renamed to Error118 and made
10317         it public static.
10318
10319         * statement.cs (Throw.Resolve): Check whether the expression is of
10320         the correct type (CS0118) and whether the type derives from
10321         System.Exception (CS0155).
10322         (Catch.Resolve): New method.  Do the type lookup here and check
10323         whether it derives from System.Exception (CS0155).
10324         (Catch.CatchType, Catch.IsGeneral): New public properties.
10325
10326         * typemanager.cs (TypeManager.exception_type): Added.
10327
10328 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
10329
10330         * driver.cs: Updated About function.
10331
10332 2002-07-31  Martin Baulig  <martin@gnome.org>
10333
10334         Implemented Control Flow Analysis.
10335
10336         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
10337         (EmitContext.CurrentBranching): Added.
10338         (EmitContext.StartFlowBranching): Added.
10339         (EmitContext.EndFlowBranching): Added.
10340         (EmitContext.KillFlowBranching): Added.
10341         (EmitContext.IsVariableAssigned): Added.
10342         (EmitContext.SetVariableAssigned): Added.
10343         (EmitContext.IsParameterAssigned): Added.
10344         (EmitContext.SetParameterAssigned): Added.
10345         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
10346         Added control flow analysis stuff here.
10347
10348         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
10349         resolve the expression as lvalue.
10350         (LocalVariableReference.DoResolve): Check whether the variable has
10351         already been assigned.
10352         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
10353         the parameter as assigned here.
10354         (ParameterReference.DoResolve): Check whether the parameter has already
10355         been assigned.
10356         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
10357         expression as lvalue.
10358
10359         * statement.cs (FlowBranching): New class for the flow analysis code.
10360         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
10361         (LabeledStatement.IsDefined): New public property.
10362         (LabeledStatement.AddUsageVector): New public method to tell flow
10363         analyis that the label may be reached via a forward jump.
10364         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
10365         flow analysis.
10366         (VariableInfo.Number): New public field.  This is used by flow analysis
10367         to number all locals of a block.
10368         (Block.CountVariables): New public property.  This is the number of
10369         local variables in this block (including the locals from all parent
10370         blocks).
10371         (Block.EmitMeta): Number all the variables.
10372
10373         * statement.cs: Added flow analysis support to all classes.
10374
10375 2002-07-31  Martin Baulig  <martin@gnome.org>
10376
10377         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
10378         To get debugging messages, compile mcs with /define:MCS_DEBUG and
10379         then use this argument.
10380
10381         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
10382
10383         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
10384         use this to specify /define options.
10385
10386 2002-07-29  Martin Baulig  <martin@gnome.org>
10387
10388         * statement.cs (Fixed): Moved all code that does variable lookups
10389         and resolvings from Emit to Resolve.
10390
10391         * statement.cs (For): Moved all code that does variable lookups
10392         and resolvings from Emit to Resolve.
10393
10394         * statement.cs (Using): Moved all code that does variable lookups
10395         and resolvings from Emit to Resolve.
10396
10397 2002-07-29  Martin Baulig  <martin@gnome.org>
10398
10399         * attribute.cs (Attribute.Resolve): Explicitly catch a
10400         System.NullReferenceException when creating the
10401         CustromAttributeBuilder and report a different warning message.
10402
10403 2002-07-29  Martin Baulig  <martin@gnome.org>
10404
10405         * support.cs (ParameterData.ParameterName): Added method to
10406         get the name of a parameter.
10407
10408         * typemanager.cs (TypeManager.IsValueType): New public method.
10409
10410 2002-07-29  Martin Baulig  <martin@gnome.org>
10411
10412         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
10413         is a flag which specifies that it's either ref or out.
10414         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
10415         the out parameter to `out Parameter.Modifier mod', also set the
10416         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
10417
10418         * support.cs (InternalParameters.ParameterModifier): Distinguish
10419         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10420         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10421
10422         * expression.cs (Argument.GetParameterModifier): Distinguish
10423         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10424         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10425
10426 2002-07-29  Martin Baulig  <martin@gnome.org>
10427
10428         * expression.cs (ParameterReference.ParameterReference): Added
10429         `Location loc' argument to the constructor.
10430
10431         * cs-parser.jay: Pass location to ParameterReference.
10432
10433 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
10434
10435         * statement.cs (Try): Initialize the location.
10436
10437         * cs-parser.jay: pass location to Try.
10438
10439         * expression.cs (Unary.Reduce): Change the prototype to return
10440         whether a constant fold could be performed or not.  The result is
10441         returned in an out parameters.  In the case of Indirection and
10442         AddressOf, we want to perform the full tests.
10443
10444 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
10445
10446         * statement.cs (Statement.Emit): Flag dead code.
10447
10448 2002-07-27  Andrew Birkett  <andy@nobugs.org>
10449
10450         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
10451
10452 2002-07-27  Martin Baulig  <martin@gnome.org>
10453
10454         * class.cs (MethodData.Define): Put back call to
10455         TypeManager.AddMethod(), accidentally commented this out.
10456
10457         * report.cs (Debug): New public method to print debugging information,
10458         this is `[Conditional ("DEBUG")]'.
10459
10460 2002-07-26  Martin Baulig  <martin@gnome.org>
10461
10462         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
10463         (switch_statement): Push the current_block to the switch_stack and
10464         pop it again when we're done with the switch.
10465         (switch_section): The new block is a child of the current_block.
10466         Fixes bug #24007, added test-152.cs.
10467
10468 2002-07-27  Martin Baulig  <martin@gnome.org>
10469
10470         * expression.cs (Invocation.EmitArguments): When calling a varargs
10471         function with only its fixed arguments, we need to pass an empty
10472         array.
10473
10474 2002-07-27  Martin Baulig  <martin@gnome.org>
10475
10476         Mono 0.13 has been released.
10477
10478 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
10479
10480         * driver.cs: Rename --resource to --linkres, because that is what
10481         we do currently, we dont support --resource yet.
10482
10483         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
10484
10485 2002-07-25  Martin Baulig  <martin@gnome.org>
10486
10487         * class.cs (MethodData): New public class.  This is a `method builder'
10488         class for a method or one accessor of a Property/Indexer/Event.
10489         (MethodData.GetMethodFlags): Moved here from MemberBase.
10490         (MethodData.ApplyAttributes): Likewise.
10491         (MethodData.ApplyObsoleteAttribute): Likewise.
10492         (MethodData.ApplyConditionalAttribute): Likewise.
10493         (MethodData.ApplyDllImportAttribute): Likewise.
10494         (MethodData.CheckAbstractAndExternal): Likewise.
10495         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10496         (MethodData.Emit): Formerly known as Method.Emit().
10497         (MemberBase): Moved everything which was specific to a single
10498         accessor/method to MethodData.
10499         (Method): Create a new MethodData and call Define() and Emit() on it.
10500         (Property, Indexer, Event): Create a new MethodData objects for each
10501         accessor and call Define() and Emit() on them.
10502
10503 2002-07-25  Martin Baulig  <martin@gnome.org>
10504
10505         Made MethodCore derive from MemberBase to reuse the code from there.
10506         MemberBase now also checks for attributes.
10507
10508         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10509         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10510         as virtual.
10511         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10512         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10513         (MemberBase.ApplyAttributes): New virtual method; applies the
10514         attributes to a method or accessor.
10515         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10516         (MemberBase.ApplyConditionalAttribute): Likewise.
10517         (MemberBase.ApplyDllImportAttribute): Likewise.
10518         (MemberBase.CheckAbstractAndExternal): Likewise.
10519         (MethodCore.ParameterTypes): This is now a property instead of a
10520         method, it's initialized from DoDefineParameters().
10521         (MethodCore.ParameterInfo): Removed the set accessor.
10522         (MethodCore.DoDefineParameters): New protected virtual method to
10523         initialize ParameterTypes and ParameterInfo.
10524         (Method.GetReturnType): We can now simply return the MemberType.
10525         (Method.GetMethodFlags): Override the MemberBase version and add
10526         the conditional flags.
10527         (Method.CheckBase): Moved some code from Define() here, call
10528         DoDefineParameters() here.
10529         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10530         here to avoid some larger code duplication.
10531         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10532         ensure that abstract and external accessors don't declare a body.
10533
10534         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10535         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10536         lookup in the attribute's parent classes, so we need to abort as soon
10537         as we found the first match.
10538         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10539         the attribute has no arguments.
10540
10541         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10542         of a Method.
10543
10544 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10545
10546         * cs-parser.jay: reverted previous patch.
10547
10548 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10549
10550         * cs-parser.jay: fixed bug #22119.
10551
10552 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10553
10554         * attribute.cs: fixed compilation. The error was:
10555         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10556         be assigned to before control leaves the current method."
10557         [FIXME:  Filed as bug #28186: MCS must report this error.]
10558
10559 2002-07-25  Martin Baulig  <martin@gnome.org>
10560
10561         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10562         method to pull the condition name ouf of a Conditional attribute.
10563         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10564         the obsolete message and error flag out of an Obsolete attribute.
10565
10566         * class.cs (Method.GetMethodFlags): New public method to get the
10567         TypeManager.MethodFlags for this method.
10568         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10569         private methods.
10570         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10571         if we're overriding a virtual function, set the new private variable
10572         `parent_method'; call the new TypeManager.AddMethod().
10573
10574         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10575         the MethodBuilder and the Method in a PtrHashtable.
10576         (TypeManager.builder_to_method): Added for this purpose.
10577         (TypeManager.MethodFlags): Added IsObsoleteError.
10578         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10579         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10580         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10581         the message from the attribute.
10582
10583 2002-07-24  Martin Baulig  <martin@gnome.org>
10584
10585         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10586         preprocessor directives, ensure that the argument to #define/#undef is
10587         exactly one identifier and that it's actually an identifier.
10588
10589         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10590         did not work ....
10591
10592 2002-07-24  Martin Baulig  <martin@gnome.org>
10593
10594         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10595         initialize it to TypeManager.object_type in the constructor.
10596         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10597         of the `hm.get_current' method if we're using the collection pattern.
10598         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10599         for the explicit conversion to make it work when we're using the collection
10600         pattern and the `Current' property has a different return type than `object'.
10601         Fixes #27713.
10602
10603 2002-07-24  Martin Baulig  <martin@gnome.org>
10604
10605         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10606         does not match, but don't report any errors.  This method is called in
10607         order for all methods in a MethodGroupExpr until a matching method is
10608         found, so we don't want to bail out if the first method doesn't match.
10609         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10610         matches, report the 123.  Fixes #28070.
10611
10612 2002-07-24  Martin Baulig  <martin@gnome.org>
10613
10614         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10615         TypeManager.TypeToCoreType() to the top of the method so the
10616         following equality checks will work.  Fixes #28107.
10617
10618 2002-07-24  Martin Baulig  <martin@gnome.org>
10619
10620         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10621         operand is of type uint, and the other operand is of type sbyte,
10622         short or int, the operands are converted to type long." -
10623         Actually do what this comment already told us.  Fixes bug #28106,
10624         added test-150.cs.
10625
10626 2002-07-24  Martin Baulig  <martin@gnome.org>
10627
10628         * class.cs (MethodBase): New abstract class.  This is now a base
10629         class for Property, Indexer and Event to avoid some code duplication
10630         in their Define() and DefineMethods() methods.
10631         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10632         generic methods for Define() and DefineMethods().
10633         (FieldBase): Derive from MemberBase, not MemberCore.
10634         (Property): Derive from MemberBase, not MemberCore.
10635         (Property.DefineMethod): Moved all the code from this method to the
10636         new MethodBase.DefineAccessor(), just call it with appropriate
10637         argumetnts.
10638         (Property.Define): Call the new Property.DoDefine(), this does some
10639         sanity checks and we don't need to duplicate the code everywhere.
10640         (Event): Derive from MemberBase, not MemberCore.
10641         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10642         accessors, this will also make them work with interface events.
10643         (Indexer): Derive from MemberBase, not MemberCore.
10644         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10645         (Indexer.Define): Use the new MethodBase functions.
10646
10647         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10648         argument to the constructor.
10649         (Interface.FindMembers): Added support for interface events.
10650         (Interface.PopluateEvent): Implemented.
10651
10652         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10653
10654 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10655
10656         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10657         but this is required to check for a method name being the same as
10658         the containing class.  
10659
10660         Handle this now.
10661
10662 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10663
10664         * interface.cs: initialize variable.
10665
10666 2002-07-23  Martin Baulig  <martin@gnome.org>
10667
10668         Implemented the IndexerName attribute in interfaces.
10669
10670         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10671         name if this is an explicit interface implementation.
10672         (Indexer.InterfaceIndexerName): New public variable.  If we're
10673         implementing an interface indexer, this is the IndexerName in that
10674         interface.  Otherwise, it's the IndexerName.
10675         (Indexer.DefineMethod): If we're implementing interface indexer,
10676         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10677         and Pending.ImplementIndexer methods.
10678         (Indexer.Define): Also define the PropertyBuilder if we're
10679         implementing an interface indexer and this is neither an explicit
10680         interface implementation nor do the IndexerName match the one in
10681         the interface.
10682
10683         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10684         If a method is defined here, then we always need to create a proxy
10685         for it.  This is used when implementing interface indexers.
10686         (Pending.IsInterfaceIndexer): New public method.
10687         (Pending.ImplementIndexer): New public method.
10688         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10689         This is used when implementing interface indexers to define a proxy
10690         if necessary.
10691         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10692         define a proxy if necessary.
10693
10694         * interface.cs (Interface.IndexerName): New public variable.
10695         (Interface.PopulateIndexer): Set the IndexerName.
10696         (Interface.DefineIndexers): New private method.  Populate all the
10697         indexers and make sure their IndexerNames match.
10698
10699         * typemanager.cs (IndexerPropertyName): Added support for interface
10700         indexers.
10701
10702 2002-07-22  Martin Baulig  <martin@gnome.org>
10703
10704         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10705         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10706         ret if HasReturnLabel.
10707         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10708         variables.
10709
10710         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10711         and set the ec.LoopBeginTryCatchLevel.
10712         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10713         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10714         the current ec.TryCatchLevel, the branch goes out of an exception
10715         block.  In this case, we need to use Leave and not Br.
10716
10717 2002-07-22  Martin Baulig  <martin@gnome.org>
10718
10719         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10720         block unless the block does not always return or it is contained in
10721         another try { ... } catch { ... } block.  Fixes bug #26506.
10722         Added verify-1.cs to the test suite.
10723
10724 2002-07-22  Martin Baulig  <martin@gnome.org>
10725
10726         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10727         then we do not always return.  Fixes bug #24985.
10728
10729 2002-07-22  Martin Baulig  <martin@gnome.org>
10730
10731         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10732         lookup on a per-class level; ie. walk up the class hierarchy until we
10733         found at least one applicable method, then choose the best among them.
10734         Fixes bug #24463 and test-29.cs.
10735
10736 2002-07-22  Martin Baulig  <martin@gnome.org>
10737
10738         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10739         return types of the methods.  The return type is not part of the
10740         signature and we must not check it to make the `new' modifier work.
10741         Fixes bug #27999, also added test-147.cs.
10742         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10743
10744         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10745         on the method's return type.
10746
10747 2002-07-21  Martin Baulig  <martin@gnome.org>
10748
10749         * assign.cs: Make this work if the rightmost source is a constant and
10750         we need to do an implicit type conversion.  Also adding a few more tests
10751         to test-38.cs which should have caught this.
10752
10753         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10754         target in the makefile for this.  The makefile.gnu is primarily intended
10755         for end-users who don't want to debug the compiler.
10756
10757 2002-07-21  Martin Baulig  <martin@gnome.org>
10758
10759         * assign.cs: Improved the Assign class so it can now handle embedded
10760         assignments (X = Y = Z = something).  As a side-effect this'll now also
10761         consume less local variables.  test-38.cs now passes with MCS, added
10762         a few new test cases to that test.
10763
10764 2002-07-20  Martin Baulig  <martin@gnome.org>
10765
10766         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10767         instructions.  Fixes bug #27977, also added test-146.cs.
10768
10769 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10770
10771         * cs-tokenizer.cs: fixed getHex ().
10772
10773 2002-07-19  Martin Baulig  <martin@gnome.org>
10774
10775         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10776         not Type.GetType() to lookup the array type.  This is needed when
10777         we're constructing an array of a user-defined type.
10778         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10779         single-dimensional arrays, but also for single-dimensial arrays of
10780         type decimal.
10781
10782 2002-07-19  Martin Baulig  <martin@gnome.org>
10783
10784         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10785         this function is called, it's not allowed to share LocalBuilders
10786         among ILGenerators.
10787
10788 2002-07-19  Martin Baulig  <martin@gnome.org>
10789
10790         * expression.cs (Argument.Resolve): Report an error 118 when trying
10791         to pass a type as argument.
10792
10793 2002-07-18  Martin Baulig  <martin@gnome.org>
10794
10795         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10796         Conv_R_Un for the signed `long' type.
10797
10798 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10799
10800         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10801         `expr' for the temporary result, as that will fail if we do
10802         multiple resolves on the same expression.
10803
10804 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10805
10806         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10807         ec.TypeContainer for looking up aliases. 
10808
10809         * class.cs (TypeContainer): Remove LookupAlias from here.
10810
10811         * decl.cs (DeclSpace); Move here.
10812
10813 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10814
10815         * class.cs (FindMembers): Only call filter if the constructor
10816         bulider is not null.
10817
10818         Also handle delegates in `NestedTypes' now.  Now we will perform
10819         type lookups using the standard resolution process.  This also
10820         fixes a bug.
10821
10822         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10823         This uses Expressions (the limited kind that can be parsed by the
10824         tree) instead of strings.
10825
10826         * expression.cs (ComposedCast.ToString): Implement, used to flag
10827         errors since now we have to render expressions.
10828
10829         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10830         FormArrayType. 
10831
10832         * ecore.cs (SimpleName.ToString): ditto.
10833
10834         * cs-parser.jay: Instead of using strings to assemble types, use
10835         Expressions to assemble the type (using SimpleName, ComposedCast,
10836         MemberAccess).  This should fix the type lookups in declarations,
10837         because we were using a different code path for this.
10838
10839         * statement.cs (Block.Resolve): Continue processing statements
10840         even when there is an error.
10841
10842 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10843
10844         * class.cs (Event.Define): Also remove the `remove' method from
10845         the list of pending items.
10846
10847         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10848         generate more compact code. 
10849
10850 2002-07-17  Martin Baulig  <martin@gnome.org>
10851
10852         * const.cs (Const.LookupConstantValue): Add support for constant
10853         `unchecked' and `checked' expressions.
10854         Also adding test case test-140.cs for this.
10855
10856 2002-07-17  Martin Baulig  <martin@gnome.org>
10857
10858         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10859         check whether mi.ReturnType implements the IEnumerator interface; the
10860         `==' and the IsAssignableFrom() will fail in this situation.
10861
10862 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10863
10864         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10865         here too.
10866
10867 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10868
10869         * expression.cs: fixed bug #27811.
10870
10871 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10872
10873         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10874         Molaro: when we are a ref, the value already contains a pointer
10875         value, do not take the address of it.
10876
10877 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10878         * removed mb-parser.jay and mb-tokenizer.cs
10879
10880 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10881
10882         * expression.cs: check against the building corlib void type.
10883
10884 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10885
10886         * ecore.cs: fix for valuetype static readonly fields: when 
10887         initializing them, we need their address, not the address of a copy.
10888
10889 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10890
10891         * typemanager.cs: register also enum_type in corlib.
10892
10893 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10894
10895         * class.cs: allow calling this (but not base) initializers in structs.
10896
10897 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10898
10899         * ecore.cs: make sure we compare against the building base types
10900         in GetTypeSize ().
10901
10902 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10903
10904         * typemanager.cs: fix TypeToCoreType() to handle void and object
10905         (corlib gets no more typerefs after this change).
10906
10907 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10908
10909         * expression.cs (ArrayCreation.EmitArrayArguments): use
10910         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10911
10912         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10913         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10914         array indexes, the runtime actually forbids them.
10915
10916         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10917         for array arguments here.
10918
10919         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10920         instead of the default for ValueTypes.
10921
10922         (New.DoEmit): Use IsValueType instead of
10923         IsSubclassOf (value_type)
10924         (New.DoResolve): ditto.
10925         (Invocation.EmitCall): ditto.
10926
10927         * assign.cs (Assign): ditto.
10928
10929         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10930         Statements *are* currently doing part of their resolution during
10931         Emit.  
10932
10933         Expressions do always resolve during resolve, but statements are
10934         only required to propagate resolution to their children.
10935
10936 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10937
10938         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10939
10940         (LoadAssembly): Do not add the dll if it is already specified
10941
10942         (MainDriver): Add the System directory to the link path at the end,
10943         after all the other -L arguments. 
10944
10945         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10946         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10947         ldelem.u1) and using the opposite for sbytes.
10948
10949         This fixes Digger, and we can finally run it.
10950
10951         * driver.cs (UnixParseOption): Move the option parsing here.  
10952         (CSCParseOption): Implement CSC-like parsing of options.
10953
10954         We now support both modes of operation, the old Unix way, and the
10955         new CSC-like way.  This should help those who wanted to make cross
10956         platform makefiles.
10957
10958         The only thing broken is that /r:, /reference: and /lib: are not
10959         implemented, because I want to make those have the same semantics
10960         as the CSC compiler has, and kill once and for all the confussion
10961         around this.   Will be doing this tomorrow.
10962
10963         * statement.cs (Unsafe.Resolve): The state is checked during
10964         resolve, not emit, so we have to set the flags for IsUnsfe here.
10965
10966 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10967
10968         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10969         not catch the Error_ObjectRefRequired in SimpleName (as it is
10970         possible to have a class/instance variable name that later gets
10971         deambiguated), we have to check this here.      
10972
10973 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10974
10975         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10976         make static and put into Expression.
10977
10978         (Event.Define): Register the private field of the event with the 
10979         TypeManager so that GetFieldFromEvent can get at it.
10980
10981         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10982         keep track of the private field associated with an event which
10983         has no accessors.
10984
10985         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10986         private field.
10987
10988         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10989
10990 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10991
10992         * expression.cs (Binary.EmitBranchable): this routine emits the
10993         Binary expression in a branchable context.  This basically means:
10994         we need to branch somewhere, not just get the value on the stack.
10995
10996         This works together with Statement.EmitBoolExpression.
10997
10998         * statement.cs (Statement.EmitBoolExpression): Use
10999         EmitBranchable. 
11000
11001 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
11002
11003         * statement.cs (For): Reduce the number of jumps in loops.
11004
11005         (For): Implement loop inversion for the For statement.
11006
11007         (Break): We can be breaking out of a Try/Catch controlled section
11008         (foreach might have an implicit try/catch clause), so we need to
11009         use Leave instead of Br.
11010
11011         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
11012         now).  If the instace expression supports IMemoryLocation, we use
11013         the AddressOf method from the IMemoryLocation to extract the
11014         address instead of emitting the instance.
11015
11016         This showed up with `This', as we were emitting the instance
11017         always (Emit) instead of the Address of This.  Particularly
11018         interesting when This is a value type, as we dont want the Emit
11019         effect (which was to load the object).
11020
11021 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
11022
11023         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
11024
11025         * statement.cs (Checked): Set the CheckedState during the resolve
11026         process too, as the ConvCast operations track the checked state on
11027         the resolve process, and not emit.
11028
11029         * cs-parser.jay (namespace_member_declaration): Flag that we have
11030         found a declaration when we do.  This is used to flag error 1529
11031
11032         * driver.cs: Report ok when we display the help only.
11033
11034 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
11035
11036         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
11037
11038 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
11039
11040         * cs-tokenizer.cs (define): We also have to track locally the
11041         defines.  AllDefines is just used for the Conditional Attribute,
11042         but we also need the local defines for the current source code. 
11043
11044 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
11045
11046         * statement.cs (While, For, Do): These loops can exit through a
11047         Break statement, use this information to tell whether the
11048         statement is the last piece of code.
11049
11050         (Break): Flag that we break.
11051
11052         * codegen.cs (EmitContexts): New `Breaks' state variable.
11053
11054 2002-07-03  Martin Baulig  <martin@gnome.org>
11055
11056         * class.cs (TypeContainer.MethodModifiersValid): Allow override
11057         modifiers in method declarations in structs.  Otherwise, you won't
11058         be able to override things like Object.Equals().
11059
11060 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11061
11062         * class.cs (Method, Property, Indexer): Do not allow the public
11063         modifier to be used in explicit interface implementations.
11064
11065         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
11066         override modifiers in method declarations in structs
11067
11068 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
11069
11070         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
11071         integer or real overflow, report an error
11072
11073 2002-07-02  Martin Baulig  <martin@gnome.org>
11074
11075         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
11076         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
11077         to tell the runtime about our newly created System.Object and
11078         System.ValueType types.
11079
11080 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11081
11082         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
11083         struct instead of Ldarg/Starg.
11084
11085 2002-07-02  Martin Baulig  <martin@gnome.org>
11086
11087         * expression.cs (Indirection.Indirection): Call
11088         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
11089
11090 2002-07-02  Martin Baulig  <martin@gnome.org>
11091
11092         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
11093         ValueType, call TypeManager.TypeToCoreType() on it.
11094         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
11095         the OpCodes.Newarr argument.
11096
11097 2002-07-02  Martin Baulig  <martin@gnome.org>
11098
11099         * expression.cs (Invocation.EmitCall): When compiling corlib,
11100         replace all calls to the system's System.Array type to calls to
11101         the newly created one.
11102
11103         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
11104         System.Array methods.
11105         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
11106         from the system's System.Array type which must be replaced.
11107
11108 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
11109
11110         * typemanager.cs: load unverifiable_code_ctor so we can build
11111         corlib using the correct type. Avoid using GetTypeCode() with
11112         TypeBuilders.
11113         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
11114         TypeManager.object_type to allow building corlib.
11115
11116 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
11117
11118         * ecore.cs: handle System.Enum separately in LoadFromPtr().
11119
11120 2002-07-01  Martin Baulig  <martin@gnome.org>
11121
11122         * class.cs: Make the last change actually work, we need to check
11123         whether `ifaces != null' to avoid a crash.
11124
11125 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11126
11127         * class.cs: when we build structs without fields that implement
11128         interfaces, we need to add the interfaces separately, since there is
11129         no API to both set the size and add the interfaces at type creation
11130         time.
11131
11132 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11133
11134         * expression.cs: the dimension arguments to the array constructors
11135         need to be converted if they are a long.
11136
11137 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
11138
11139         * class.cs: don't emit ldarg.0 if there is no parent constructor
11140         (fixes showstopper for corlib).
11141
11142 2002-06-29  Martin Baulig  <martin@gnome.org>
11143
11144         MCS now compiles corlib on GNU/Linux :-)
11145
11146         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
11147         ie. check for MethodImplOptions.InternalCall.
11148
11149         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
11150         and TypeManager.attribute_type are null, so we must explicitly check
11151         whether parent is not null to find out whether it's an attribute type.
11152         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
11153         and SetBuilder, not only if the property is neither abstract nor external.
11154         This is necessary to set the MethodImplOptions on the accessor methods.
11155         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
11156         SetBuilder, see Property.Emit().
11157
11158         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
11159         populate "System.Object", "System.ValueType" and "System.Attribute" since
11160         they've already been populated from BootCorlib_PopulateCoreTypes().
11161
11162 2002-06-29  Martin Baulig  <martin@gnome.org>
11163
11164         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
11165         is the NullLiteral, we also need to make sure that target_type is not
11166         an enum type.   
11167
11168 2002-06-29  Martin Baulig  <martin@gnome.org>
11169
11170         * rootcontext.cs (RootContext.ResolveCore): We must initialize
11171         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
11172         before calling BootstrapCorlib_ResolveDelegate ().
11173
11174 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11175
11176         * statement.cs: fixed build-breaker. All tests passed ok.
11177
11178 2002-06-27  Martin Baulig  <martin@gnome.org>
11179
11180         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
11181         for System.Decimal when compiling corlib.
11182
11183 2002-06-27  Martin Baulig  <martin@gnome.org>
11184
11185         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
11186         switch blocks which contain nothing but a default clause.
11187
11188 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
11189
11190        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
11191
11192 2002-06-27  Martin Baulig  <martin@gnome.org>
11193
11194         * ecore.cs (PropertyExpr.PropertyExpr): Call
11195         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
11196
11197         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
11198         is already a TypeBuilder.
11199
11200 2002-06-27  Martin Baulig  <martin@gnome.org>
11201
11202         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
11203         `target_type == TypeManager.array_type', not IsAssignableFrom() in
11204         the "from an array-type to System.Array" case.  This makes it work
11205         when compiling corlib.
11206
11207 2002-06-27  Martin Baulig  <martin@gnome.org>
11208
11209         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
11210         non-static PropertyExpr, set its InstanceExpression.  This makes
11211         the `ICollection.Count' property work in System/Array.cs.
11212
11213 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
11214
11215         * driver.cs: Made error handling more consistent.  Errors now
11216         tracked by Report class, so many methods which used to return int
11217         now return void.  Main() now prints success/failure and 
11218         errors/warnings message.
11219
11220         Renamed '--probe' compiler argument to '--expect-error'.  Removed
11221         the magic number return values (123 and 124).  Now, if the
11222         expected error occurs, the compiler exits with success (exit value
11223         0).  If the compilation completes without seeing that particular
11224         error, the compiler exits with failure (exit value 1).  The
11225         makefile in mcs/errors has been changed to handle the new behaviour.
11226
11227         * report.cs: Made 'expected error' number a property and renamed
11228         it from 'Probe' to 'ExpectedError'.
11229
11230         * genericparser.cs: Removed error handling support, since it is
11231         now all done by Report class.
11232
11233         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
11234         class, so parse() no longer returns an int.
11235
11236         * namespace.cs: Use Report.Error instead of GenericParser.error
11237
11238 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
11239
11240         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
11241         TypeContainer.AddOperator): At the front of the list put the
11242         explicit implementations, so they get resolved/defined first. 
11243
11244 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
11245
11246         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
11247         interface type is implemented by this TypeContainer.  Used during
11248         explicit interface implementation.
11249
11250         (Property.Define, Indexer.Define, Method.Define): Validate that
11251         the given interface in the explicit implementation is one of the
11252         base classes for the containing type.
11253
11254         Also if we are explicitly implementing an interface, but there is
11255         no match in the pending implementation table, report an error.
11256
11257         (Property.Define): Only define the property if we are
11258         not explicitly implementing a property from an interface.  Use the
11259         correct name also for those properties (the same CSC uses,
11260         although that is really not needed).
11261
11262         (Property.Emit): Do not emit attributes for explicitly implemented
11263         properties, as there is no TypeBuilder.
11264
11265         (Indexer.Emit): ditto.
11266
11267         Hiding then means that we do not really *implement* a pending
11268         implementation, which makes code fail.
11269
11270 2002-06-22  Martin Baulig  <martin@gnome.org>
11271
11272         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
11273         the return value of Object.GetType().  [FIXME: we need to do this whenever
11274         we get a type back from the reflection library].
11275
11276 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
11277
11278         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
11279
11280 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
11281
11282         * attribute.cs: Return null if we can not look up the type.
11283
11284         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
11285         the interface types found.
11286
11287         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
11288         interface types found.
11289
11290         * typemanager.cs (GetInterfaces): Make this routine returns alll
11291         the interfaces and work around the lame differences between
11292         System.Type and System.Reflection.Emit.TypeBuilder in the results
11293         result for GetInterfaces.
11294
11295         (ExpandInterfaces): Given an array of interface types, expand and
11296         eliminate repeated ocurrences of an interface.  This expands in
11297         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
11298         be IA, IB, IC.
11299
11300 2002-06-21  Martin Baulig  <martin@gnome.org>
11301
11302         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
11303         on System.Enum.
11304
11305 2002-06-21  Martin Baulig  <martin@gnome.org>
11306
11307         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
11308         and called with one of the core types, return the corresponding typebuilder for
11309         that type.
11310
11311         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
11312         element type.
11313
11314 2002-06-21  Martin Baulig  <martin@gnome.org>
11315
11316         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
11317         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
11318         (Expression.ConvertReferenceExplicit): Likewise.
11319
11320         * expression.cs (ElementAccess.DoResolve): Likewise.
11321         (ElementAccess.DoResolveLValue): Likewise.
11322
11323 2002-06-10  Martin Baulig  <martin@gnome.org>
11324
11325         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
11326         add the "value" parameter to the parameter list.
11327
11328         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
11329         to our caller.
11330
11331 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
11332
11333         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
11334         the argument to an int, uint, long or ulong, per the spec.  Also
11335         catch negative constants in array creation.
11336
11337 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
11338
11339         * class.cs: do not allow the same interface to appear twice in
11340         the definition list.
11341
11342 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
11343
11344         * ecore.cs: don't use ldlen with System.Array.
11345
11346 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
11347
11348         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
11349
11350 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
11351
11352         * modifiers.cs: produce correct field attributes for protected
11353         internal. Easy fix so miguel can work on ther harder stuff:-)
11354
11355 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
11356
11357         * pending.cs: New file.  Move the code from class.cs here.
11358         Support clearning the pending flag for all methods (when not doing
11359         explicit interface implementation).
11360
11361 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
11362
11363         * rootcontext.cs: added a couple more types needed to bootstrap.
11364
11365 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
11366
11367         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
11368         constructor in the type, instead of any constructor in the type
11369         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
11370         a bug in the Mono runtime when applying the params attribute). 
11371
11372 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
11373         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
11374
11375 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
11376
11377         * expression.cs (Unary.ResolveOperator): Use TypeManager
11378         to resolve the type.
11379
11380 2002-06-13  Ravi Pratap  <ravi@ximian.com>
11381
11382         * cs-parser.jay (enum_member_declaration): Pass in the attributes
11383         attached.
11384
11385         * enum.cs (AddEnumMember): Add support to store the attributes associated 
11386         with each member too.
11387
11388         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
11389         field builders too - this takes care of the enum member case.
11390
11391 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
11392
11393         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
11394         address-of operator on both value types and pointers.
11395
11396 2002-06-10  Martin Baulig  <martin@gnome.org>
11397
11398         * interface.cs (Interface.PopulateIndexer): Add the indexer's
11399         PropertyBuilder to the `property_builders' list.
11400
11401         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
11402         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
11403         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
11404         find any indexers which are inherited from an interface.
11405
11406 2002-06-09  Martin Baulig  <martin@gnome.org>
11407
11408         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
11409         the same type as the constant if necessary.  There's also a test-130.cs
11410         for this.
11411
11412         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
11413
11414         * typemanager.cs (TypeManager.ChangeType): Previously known as
11415         Enum.ChangeEnumType().
11416
11417 2002-06-09  Martin Baulig  <martin@gnome.org>
11418
11419         * expression.cs (Cast.TryReduce): Added support for consts.
11420
11421 2002-06-08  Ravi Pratap  <ravi@ximian.com>
11422
11423         * class.cs (Accessor): Hold attributes information so we can pass
11424         it along.
11425
11426         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
11427         Modify to pass in attributes attached to the methods.
11428
11429         (add_accessor_declaration, remove_accessor_declaration): Ditto.
11430
11431         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
11432         to handle the Accessor kind :-)
11433
11434         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
11435
11436 2002-06-08  Martin Baulig  <martin@gnome.org>
11437
11438         * expression.cs (Unary.TryReduceNegative): Added support for
11439         ULongConstants.
11440
11441 2002-06-08  Martin Baulig  <martin@gnome.org>
11442
11443         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
11444         name can't be found in the `defined_names' - the caller will do a
11445         MemberLookup in this case and thus find methods in System.Enum
11446         such as Enum.IsDefined().
11447
11448 2002-06-08  Martin Baulig  <martin@gnome.org>
11449
11450         * enum.cs (Enum.ChangeEnumType): This is a custom version of
11451         Convert.ChangeType() which works with TypeBuilder created types.
11452         (Enum.LookupEnumValue, Enum.Define): Use it here.
11453
11454         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
11455         `TypeBuilder.BaseType != null' check.
11456         (TypeContainer.FindMembers): Only lookup parent members if we
11457         actually have a parent.
11458         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
11459         (ConstructorInitializer.Resolve): Likewise.
11460
11461         * interface.cs (Interface.FindMembers): Added
11462         `TypeBuilder.BaseType != null' check.
11463
11464         * rootcontext.cs (RootContext.ResolveCore): Added
11465         "System.Runtime.CompilerServices.IndexerNameAttribute" to
11466         classes_second_stage.
11467
11468         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
11469         debug_type and trace_type when compiling with --nostdlib.       
11470
11471 2002-06-07  Martin Baulig  <martin@gnome.org>
11472
11473         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
11474         (AddField): Set it to true when adding a non-static field.
11475         (DefineType): Use `have_nonstatic_fields' to find out whether we
11476         have non-static fields, not `Fields != null'.
11477
11478 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
11479
11480         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
11481         dereferencing a null on the static-field code path)
11482
11483 2002-05-30  Martin Baulig  <martin@gnome.org>
11484
11485         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
11486         to take command line arguments.  Use reflection to call the new
11487         custom `Initialize' function on the symbol writer and pass it the
11488         command line arguments.
11489
11490         * driver.cs (--debug-args): New command line argument to pass command
11491         line arguments to the symbol writer.
11492
11493 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11494
11495         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11496         the target type for indexers and properties.  Thanks to Joe for
11497         catching this.
11498
11499 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11500
11501         * typemanager.cs (MethodFlags): returns the method flags
11502         (Obsolete/ShouldIgnore) that control warning emission and whether
11503         the invocation should be made, or ignored. 
11504
11505         * expression.cs (Invocation.Emit): Remove previous hack, we should
11506         not do this on matching a base type, we should do this based on an attribute
11507
11508         Only emit calls to System.Diagnostics.Debug and
11509         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11510         on the command line.
11511
11512         * rootcontext.cs: Global settings for tracing and debugging.
11513
11514         * cs-tokenizer.cs (define): New utility function to track
11515         defines.   Set the global settings for TRACE and DEBUG if found.
11516
11517 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11518
11519         * interface.cs (Populate*): Pass in the TypeContainer as well as
11520         the DeclSpace as parameters so that we can create EmitContexts and
11521         then use that to apply attributes etc.
11522
11523         (PopulateMethod, PopulateEvent, PopulateProperty)
11524         (PopulateIndexer): Apply attributes everywhere.
11525
11526         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11527         etc.
11528
11529         (ApplyAttributes): Update accordingly.
11530
11531         We now apply interface attributes for all members too.
11532
11533 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11534
11535         * class.cs (Indexer.Define); Correctly check if we are explicit
11536         implementation (instead of checking the Name for a ".", we
11537         directly look up if the InterfaceType was specified).
11538
11539         Delay the creation of the PropertyBuilder.
11540
11541         Only create the PropertyBuilder if we are not an explicit
11542         interface implementation.   This means that explicit interface
11543         implementation members do not participate in regular function
11544         lookups, and hence fixes another major ambiguity problem in
11545         overload resolution (that was the visible effect).
11546
11547         (DefineMethod): Return whether we are doing an interface
11548         implementation. 
11549
11550         * typemanager.cs: Temporary hack until we get attributes in
11551         interfaces (Ravi is working on that) and we get IndexerName
11552         support in interfaces.
11553
11554         * interface.cs: Register the indexers as properties.
11555
11556         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11557         warning, I have verified that this is a bug in the .NET runtime
11558         (JavaScript suffers of the same problem).
11559
11560         * typemanager.cs (MemberLookup): When looking up members for
11561         interfaces, the parent of an interface is the implicit
11562         System.Object (so we succeed in searches of Object methods in an
11563         interface method invocation.  Example:  IEnumerable x;  x.ToString
11564         ()) 
11565
11566 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11567
11568         * class.cs (Event): Events should also register if they do
11569         implement the methods that an interface requires.
11570
11571         * typemanager.cs (MemberLookup); use the new GetInterfaces
11572         method. 
11573
11574         (GetInterfaces): The code used to lookup interfaces for a type is
11575         used in more than one place, factor it here. 
11576
11577         * driver.cs: Track the errors at the bottom of the file, we kept
11578         on going.
11579
11580         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11581         instance if the method we are calling is static!
11582
11583 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11584
11585         * attribute.cs (ApplyAttributes): Make this function filter out
11586         the IndexerName attribute (as that attribute in reality is never
11587         applied) and return the string constant for the IndexerName
11588         attribute. 
11589
11590         * class.cs (TypeContainer.Emit): Validate that all the indexers
11591         have the same IndexerName attribute, and if so, set the
11592         DefaultName attribute on the class. 
11593
11594         * typemanager.cs: The return value might contain other stuff (not
11595         only methods).  For instance, consider a method with an "Item"
11596         property and an Item method.
11597
11598         * class.cs: If there is a problem with the parameter types,
11599         return. 
11600
11601 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11602
11603         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11604         looks at user defined conversion after making a call to 
11605         StandardConversionExists - we need this for overload resolution.
11606
11607         * expression.cs : Update accordingly the various method calls.
11608
11609         This fixes 2 bugs filed against implicit user defined conversions 
11610
11611 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11612
11613         * statement.cs: Track the result of the assignment.
11614
11615 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11616
11617         * expression.cs (MemberAccess): Improved error reporting for
11618         inaccessible members.
11619
11620 2002-05-22  Martin Baulig  <martin@gnome.org>
11621
11622         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11623         itself with debugging support.
11624
11625 2002-05-22  Martin Baulig  <martin@gnome.org>
11626
11627         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11628         Removed, this isn't needed anymore.
11629
11630 2002-05-20  Martin Baulig  <martin@gnome.org>
11631
11632         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11633         be underlying type for an enum.
11634
11635 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11636
11637         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11638         that splits out the loading of just the core types.
11639
11640         * rootcontext.cs (ResolveCore): Split the struct resolution in
11641         two, so we can load the enumeration underlying types before any
11642         enums are used.
11643
11644         * expression.cs (Is): Bandaid until we fix properly Switch (see
11645         bug #24985 for details).
11646
11647         * typemanager.cs (ImplementsInterface): The hashtable will contain
11648         a null if there are no interfaces implemented.
11649
11650 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11651
11652         * cs-parser.jay (indexer_declarator): It is fine to have array
11653         parameters
11654
11655 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11656
11657         * typemanager.cs: (RegisterBuilder): New function used to register
11658         TypeBuilders that implement interfaces.  Since
11659         TypeBuilder.GetInterfaces (as usual) does not work with lame
11660         Reflection.Emit. 
11661         (AddUserType): register interfaces.
11662
11663         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11664         dealing with TypeBuilder.  Also, arrays are showing up as
11665         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11666         methods can not be invoked on them!
11667
11668         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11669         (ImplicitReferenceConversionExists): Split out from
11670         StandardConversionExists. 
11671
11672         * expression.cs (As): We were only implementing one of the three
11673         cases for the as operator.  We now implement them all.
11674         (Is): Implement the various other cases for Is as well.
11675
11676         * typemanager.cs (CACHE): New define used to control if we want or
11677         not the FindMembers cache.  Seems to have a negative impact on
11678         performance currently
11679
11680         (MemberLookup): Nested types have full acess to
11681         enclosing type members
11682
11683         Remove code that coped with instance/static returns for events, we
11684         now catch this in RealFindMembers.
11685
11686         (RealFindMembers): only perform static lookup if the instance
11687         lookup did not return a type or an event.  
11688
11689 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11690
11691         * assign.cs (CompoundAssign): We pass more semantic information
11692         now to Compound Assignments than we did before: now we have all
11693         the information at hand, and now we resolve the target *before* we
11694         do the expression expansion, which allows the "CacheValue" method
11695         to have the effect we intended (before, a [x] += 1 would generate
11696         two differen ArrayAccess expressions from the ElementAccess,
11697         during the resolution process).
11698
11699         (CompoundAssign.DoResolve): Resolve target and original_source here.
11700
11701 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11702
11703         * expression.cs (ArrayAccess): dropped debugging information. 
11704
11705         * typemanager.cs: Small bug fix: I was always returning i_members,
11706         instead of one of i_members or s_members (depending on which had
11707         the content).
11708
11709         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11710         method is invoked before any code generation takes place, and it
11711         is a mechanism to inform that the expression will be invoked more
11712         than once, and that the method should use temporary values to
11713         avoid having side effects
11714
11715         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11716
11717         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11718         implementation.
11719
11720         * expression.cs (Indirection, ArrayAccess): Add support for
11721         CacheTemporaries in these two bad boys. 
11722
11723         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11724         ldobj or ldind_ref.  
11725         (StoreFromPtr): Handle stobj as well.
11726
11727         * expression.cs (UnaryMutator): Share more code.
11728
11729         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11730         down: I was not tracking the Filter function as well, which
11731         was affecting the results of the cache.
11732
11733 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11734
11735         * attribute.cs: Remove the hack to handle the CharSet property on
11736         StructLayouts. 
11737
11738 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11739
11740         * attribute.cs (DoResolve): More uglyness, we now only try to
11741         resolve the attribute partially, to extract the CharSet
11742         information (only if we are a StructLayout attribute).  Otherwise 
11743
11744         (GetExtraTypeInfo): Add some code to conditionally kill in the
11745         future this.   I am more and more convinced that the .NET
11746         framework has special code to handle the attribute setting on
11747         certain elements.
11748
11749         * expression.cs (IsParamsMethodApplicable): Revert my previous
11750         foreach change here, it was wrong.
11751
11752 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11753
11754         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11755         (pp_expr): do not abort on unknown input, just return.
11756         (eval): abort if there are pending chars.
11757
11758         * attribute.cs (Attribute.Resolve): Positional parameters are
11759         optional.  Deal with that case.
11760
11761         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11762         the Ansi/Unicode/Auto information for the type.
11763
11764         (TypeContainer.DefineType): instantiate the EmitContext here, as
11765         we will be using it during the type definition (to resolve
11766         attributes) and during the emit phase.
11767
11768         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11769         to pull type information out of the attributes
11770
11771         (Attribute.Resolve): track the constructor builder, and allow for
11772         multiple invocations (structs and classes will use this).
11773
11774         * ecore.cs (MemberLookupFinal): new version with all the
11775         parameters customizable.
11776
11777         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11778         constructors.  Return if the result value is null (as the error
11779         would have been flagged already by MemberLookupFinal)
11780
11781         Do not allow instances of abstract classes or interfaces to be
11782         created.
11783
11784         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11785         We have to compare the assembly property here when dealing with
11786         FamANDAssem and Assembly access modifiers, because we might be
11787         creating an assembly from *modules* (that means that we are not
11788         getting TypeBuilders for types defined in other modules that are
11789         part of this assembly).
11790
11791         (Method.Emit): If the method is marked abstract and has a body,
11792         emit an error. 
11793
11794         (TypeContainer.DefineMembers): If both the defined member and the
11795         parent name match are methods, then do not emit any warnings: let
11796         the Method.Define routine take care of flagging warnings.  But if
11797         there is a mismatch (method overrides something else, or method is
11798         overriwritten by something, then emit warning).
11799
11800         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11801         set to null, this means `do not check for the return type on the
11802         signature'. 
11803
11804         (Method.Define): set the return type for the method signature to
11805         null, so that we get methods with the same name and parameters and
11806         different return types.  This is used to flag warning 114 (you are
11807         hiding a method, and you probably want to use the new/override
11808         keywords instead).
11809
11810         * typemanager.cs (MemberLookup): Implemented proper access
11811         control, closing a long standing set of bug reports.  The problem
11812         was that the Framework only has two bits: Public and NonPublic,
11813         and NonPublic includes private and protected methods, but we need
11814         to enforce the FamANDAssem, FamOrAssem and Family. 
11815
11816 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11817
11818         * statement.cs (GotoCase): Return true: Ammounts to giving up
11819         knowledge on whether we return or not, and letting the other case
11820         be responsible for it.
11821
11822 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11823
11824         * driver.cs: Do not load directories for each file processed, only
11825         do it if there is a pattern.
11826
11827         * ecore.cs: Report readonly assigns here as well, as we might have
11828         been resolved only by MemberAccess.
11829
11830         (SimpleName.SimpleNameResolve): Also be useful for LValue
11831         resolution.   We need this to propagate assign to local readonly variables
11832
11833         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11834         do not want to reuse potential criteria memory.
11835
11836         * class.cs (MyEventBuilder): Set reflected_type;
11837
11838         * ecore.cs (Constantify): Added support for constifying bools.
11839
11840         (RootContext.LookupType): Added a cache for values looked up in
11841         the declaration space.
11842
11843         * typemanager.cs (FindMembers): Now is a front-end to
11844         RealFindMembers, and provides a two-level hashtable-based cache to
11845         the request.  
11846
11847         15% performance improvement: from 22.5 to 19.2 seconds.
11848
11849         * expression.cs (IsParamsMethodApplicable): use foreach.
11850         (Invocation.DoResolve): ditto.
11851         (New.DoResolve): ditto.
11852         (ArrayCreation.DoResolve): ditto.
11853
11854         * ecore.cs (FindMostEncompassingType): use foreach.
11855
11856         * delegate.cs (NewDelegate.DoResolve): Use foreach
11857
11858         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11859         (RemoveMethods): use foreach.
11860
11861         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11862         nested foreach statements instead of for, and also break out of
11863         the inner loop once a match is found.
11864
11865         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11866
11867 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11868
11869         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11870         we actually unwrap the expression to allow for extra information
11871         to be extracted. 
11872
11873         * expression.cs: Use Shr_Un on unsigned operations. 
11874
11875 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11876
11877         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11878         applicable operators was not being considered correctly. This closes
11879         the bug Miguel reported.
11880
11881 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11882
11883         * attribute.cs: check that the type derives from System.Attribute
11884         and report the correct error in that case (moved the duplicate code to
11885         its own method, too).
11886
11887 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11888
11889         * attribute.cs: lookup attribute type name as the spec says: first the
11890         bare attribute name and then name + "Attribute" (nant compiles with
11891         mcs after this fix).
11892
11893 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11894
11895         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11896         Because of the way we parse things, we should try to see if a
11897         UIntConstant can fit in an integer.
11898
11899 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11900
11901         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11902         when we are in an explicit context.
11903
11904         (ConvertReferenceExplicit): When converting from Iface type S to Class
11905         T make sure the rules are implemented as an OR.
11906
11907         * parameter.cs (ParameterType): Make it a property for now although the
11908         purpose really isn't anything immediate.
11909
11910         * expression.cs (Is*Applicable): Do better checking on the parameter type
11911         of a ref/out parameter. The ones from the system assemblies are already 
11912         marked with the correct type so we don't need to do any correction.
11913
11914         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11915         the object type is standard too so include that.
11916
11917 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11918
11919         * ecore.cs (StandardConversionExists): Augment with missing code:
11920         deal with IntConstant, LongConstants and Enumerations.
11921
11922         * assign.cs: Report the error, instead of failing silently
11923
11924         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11925         typecontainer that they are declared, because the
11926         typecontainer/namespace will have the list of using clauses that
11927         need to be applied.
11928
11929         Assembly Attributes were escaping the normal registration
11930         mechanism. 
11931
11932         (EmitCode): Apply attributes within an EmitContext that represents
11933         the container they were declared on.
11934
11935         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11936
11937 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11938
11939         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11940         Revamp completely - make much cleaner as we now operate only
11941         on a set of Types.
11942
11943         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11944         to implement the logic detailed in the spec more correctly.
11945
11946         (UserDefinedConversion): Update accordingly.
11947
11948 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11949
11950         * statement.cs: Return flow analysis information up.
11951
11952         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11953         and the default.
11954
11955         (token): Do not consume an extra character before calling
11956         decimal_digits.
11957
11958 2002-05-06  Piers Haken <piersh@friskit.com>
11959
11960         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11961
11962 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11963
11964         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11965         EmitContext during the instance constructor initializer
11966         resolution, to stop access to instance variables.
11967
11968         This is mandated by the spec, last paragraph of the `constructor
11969         initializers' section. 
11970
11971 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11972
11973         * cs-parser.jay, class.cs (Accessor): new class used to represent
11974         an accessor (get or set).  In the past we used `null' to represent
11975         a missing accessor.  But this is ambiguous because there was no
11976         way to tell in abstract indexers/properties if one of them was
11977         specified.
11978
11979         Now there is a way of addressing that.
11980
11981         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11982         instead of FindMembers.
11983
11984         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11985         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11986
11987         * attribute.cs: Treat indexers and properties as the same in terms
11988         of applying attributes
11989
11990         * ecore.cs (FindMostEncompassedType): Use statically initialized
11991         EmptyExpressions()s like we do elsewhere to avoid creating useless
11992         objects (and we take this out of the tight loop).
11993
11994         (GetConversionOperators): Move the code to extract the actual
11995         operators to a separate routine to clean things up.
11996
11997 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11998
11999         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
12000         events are always registered FieldBuilders.
12001
12002         * class.cs (FieldBase): New class shared by Fields 
12003
12004         * delegate.cs: If we are a toplevel delegate, use our full name.
12005         If we are a nested delegate, then only use our tail name.
12006
12007 2002-05-02  Ravi Pratap  <ravi@ximian.com>
12008
12009         * expression.cs (IsApplicable): Ensure that we add the "&" to
12010         ref/out types before comparing it with the type of the argument.
12011
12012         (IsParamsMethodApplicable): Ditto.
12013
12014         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
12015         silly me ;-)
12016
12017         * delegate.cs : Handle the case when we have more than one applicable
12018         method. Flag an error only when we finish checking all.
12019
12020 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
12021
12022         * expression.cs: Add support for boolean static initializers.
12023
12024 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
12025
12026         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
12027
12028         * parameter.cs (ComputeParameterTypes,
12029         ComputeAndDefineParameterTypes): Better error handling: now we
12030         clear the `types' cache if we fail during any of the type lookups.
12031         We also return the status code correctly to our caller
12032
12033         * delegate.cs: If we fail to define a delegate, abort the extra
12034         steps. 
12035
12036         * expression.cs (Binary.ResolveOperator): for
12037         operator==(object,object) and operator !=(object, object) we also
12038         have to verify that there is an implicit conversion from one to
12039         the other.
12040
12041         (ArrayAccess.DoResolve): Array Access can operate on
12042         non-variables. 
12043
12044 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
12045
12046         * assign.cs (CompoundAssign): A new class used as a "flag" that
12047         the assignment actually is happening as part of a compound
12048         assignment operator.
12049
12050         During compound assignment, a few new rules exist to enable things
12051         like:
12052
12053         byte b |= 1 + 2
12054
12055         From the spec:
12056
12057         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
12058         to the type of x) if y is implicitly convertible to the type of x,
12059         and the operator is a builtin operator and the return type of the
12060         operator is explicitly convertible to the type of x. 
12061
12062         * rootcontext.cs: Reset warning level to 2.  4 catches various
12063         "interesting" features in mcs, we must clean this up at some
12064         point, but currently am trying to kill other bugs ;-)
12065
12066         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
12067         in container classes as well.  
12068
12069         * expression.cs (Binary.ResolveOperator): Handle string case
12070         before anything else (as operator overloading does emit an error
12071         before doing anything else).
12072
12073         This code could go away when we move to a table driven model, but
12074         i could not come up with a good plan last night.
12075
12076 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
12077
12078         * typemanager.cs (CSharpName): reimplementation using regex.
12079         * class.cs: added null check for fields in Emit
12080         * rootcontext.cs: set warninglevel to 4
12081
12082 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
12083
12084         * typemanager.cs (CSharpName): reimplemented with Lupus
12085         suggestion.
12086
12087 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
12088
12089         * statement.cs (If): correclty implement Resolve, because we were
12090         not catching sem errors in there.  The same process is needed
12091         everywhere else. 
12092         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
12093
12094
12095         (Statement.Warning_DeadCodeFound): Factorize code.
12096         (While): Report dead code here too.
12097
12098         (Statement): Added Resolve virtual method to allow
12099         for resolution split from the emit code.
12100
12101 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12102
12103         * statement.cs (EmitBoolExpression): No longer try to resolve the
12104         expression here.    
12105         (MakeBoolean): New utility function that resolve, implicitly
12106         converts to boolean and tags the expression. 
12107
12108
12109         (If, Do): Implement dead code elimination.
12110         (While): Implement loop inversion
12111
12112         (Do, While, For, If): Resolve the expression prior to calling our
12113         code generation.
12114
12115 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
12116
12117         * class.cs:
12118           - added method Report28 (warning: program has more than one entry point)
12119           - added method IsEntryPoint, implements paragraph 10.1 of the spec
12120           - modified method Method.Define, the part at the end of the method
12121
12122         * rootcontext.cs: added static public Location EntryPointLocation;
12123           
12124         * ../errors/cs0028.cs : Add test case for the above warning.              
12125
12126         * typemanager.cs:
12127           - modified method CSharpName to allow arrays of primitive type to
12128             be printed nicely (e.g. instead of System.Int32[][] it now prints
12129             int[][])
12130           - added method CSharpSignature: returns the signature of a method
12131             in string format to be used in reporting errors, warnings, etc.
12132
12133         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
12134         with String.Empty.
12135
12136 2002-04-26  Ravi Pratap  <ravi@ximian.com>
12137
12138         * delegate.cs (Define): Fix extremely silly bug where I was
12139         setting the type of the 'object' parameter of the BeginInvoke
12140         method to System.IAsyncResult instead of System.Object ;-)
12141
12142 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12143
12144         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
12145         here. 
12146
12147         (Constructor.Emit): return if we fail to initialize the
12148         constructor.  Another door closed!  
12149
12150         * expression.cs (New.DoResolve): Improve error message (from -6 to
12151         1501).  Use DeclaredOnly lookup to find the exact constructor.
12152
12153         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
12154         loop.  This is useful.
12155
12156         * cs-parser.jay: Adjust the default parameters so that destructors
12157         have the proper signature.
12158
12159 2002-04-26  Martin Baulig  <martin@gnome.org>
12160
12161         * driver.cs (LoadAssembly): If `assembly' contains any characters
12162         which are only valid in path names and not in assembly names
12163         (currently slash, backslash and point), use Assembly.LoadFrom ()
12164         instead of Assembly.Load () on the `assembly' (before iteration
12165         over the link_paths).
12166
12167 2002-04-26  Martin Baulig  <martin@gnome.org>
12168
12169         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
12170
12171 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
12172
12173         * class.cs (Property): use the new typemanager.MemberLookup
12174
12175         (TypeContainer.MemberLookup): Implement using the
12176         TypeManager.MemberLookup now. 
12177
12178         * typemanager.cs: Make MemberLookup a function of the TypeManager,
12179         and return MemberInfos, so that these can be used without an
12180         EmitContext (what we had before).
12181
12182 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
12183
12184         * expression.cs: Fix the case where the argument to params if the
12185         type of the params.  I omitted handling this before.   Fixed
12186
12187 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12188
12189         * driver.cs: Call BootCorlib_PopulateCoreType
12190
12191         * class.cs (Property.CheckBase): Check for properties only, not
12192         for all members. 
12193
12194         * interface.cs: Temporary hack: try/catch around the
12195         CustomAttributeBuilder, because I am getting an exception that I
12196         do not understand.
12197
12198         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
12199         types whose definitions are required to be there (attributes are
12200         defined before standard types).
12201
12202         Compute definitions as we boot the various types, as they are used
12203         immediately (value_type class will need object_type, but if we do
12204         not initialize object_type, we will pass a null, which will let
12205         the runtime pick the System.Object from the existing corlib, which
12206         is not what we want).
12207
12208 2002-04-22  Patrik Torstensson <totte@labs2.com>
12209
12210         * cs-tokenizer.cs: fixed a number of trim() issues.
12211
12212 2002-04-22  Ravi Pratap  <ravi@ximian.com>
12213
12214         * expression.cs (Argument.Type): Ensure that we return the correct
12215         type when we have out or ref parameters [in which case we 
12216         append a "&"].
12217
12218 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12219
12220         * class.cs (Property, Indexer): Allow extern modifier in there. 
12221
12222         * typemanager.cs (InitBaseTypes): Initializes object_type and
12223         value_type, since those will be used early on during the bootstrap
12224         process to compile corlib.
12225
12226         (InitCoreTypes): Move code from here to InitBaseTypes.
12227
12228 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
12229
12230         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
12231         single-dimension arrays as using the ldlen opcode.  
12232
12233         Daniel Lewis discovered this optimization.  
12234
12235         * typemanager.cs: Add signature for System.Array::get_Length
12236
12237 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12238
12239         * statement.cs: report the error when the foreach does not apply to an
12240         array nor a collection.
12241
12242 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
12243
12244         * expression.cs: Add implicit conversions to the operator ~.
12245
12246         * constant.cs (DecimalConstant.Emit): Emit decimal value.
12247
12248         * typemanager.cs: Locate the decimal constructor.
12249
12250 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12251
12252         * attribute.cs: use the new property of TypeOf.
12253         * expression.cs: added 'get' property around typearg.
12254
12255         These changes fix a build breaker reported by NickD. Is this the
12256         correct way to fix?  If not, please, revert my changes and make it
12257         work :-).
12258
12259 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
12260
12261         * attribute.cs: Add support for typeof in attribute invocations.
12262         I am not sure that this is right though.
12263
12264 2002-04-14  Duncan Mak  <duncan@ximian.com>
12265
12266         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
12267         Binary.Operator.Division case.
12268
12269 2002-04-13  Ravi Pratap  <ravi@ximian.com>
12270
12271         * class.cs (DefineType): Ensure that we do a proper check on
12272         attribute types and also register it with the TypeManager.
12273
12274         (TypeContainer.Targets): The default for attribute types is
12275         AttributeTargets.All.
12276
12277         * attribute.cs (ApplyAttributes): Registering the attribute type
12278         is done elsewhere, not when we discover we have a Usage attribute.
12279
12280 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12281
12282         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
12283         and get rid of is_delegate parameter.
12284
12285         * everywhere : update.
12286
12287 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12288
12289         * cs-parser.jay (compilation_unit): Revamp completely to use
12290         some new ideas that I got from Rhys' grammar to solve the problems
12291         with assembly level attributes.
12292
12293         (outer_declaration): New grammar production.
12294
12295         (attribute_sections): Add.
12296
12297         (opt_attributes): Base on attribute_sections
12298
12299         (namespace_declaration): Allow opt_attributes to tackle the case
12300         when we have assembly level attributes - we are clever in this
12301         regard now ;-)
12302
12303         * attribute.cs (ApplyAttributes): Do not worry about assembly 
12304         attributes in the non-global context.
12305
12306         * rootcontext.cs (AddGlobalAttributes): Go back to using this
12307         instead of SetGlobalAttributes.
12308
12309         * class.cs, rootcontext.cs : Ensure we define and generate 
12310         attribute types before anything else.
12311
12312         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
12313         and flag the new error -20 for the case when the attribute type
12314         does not have valid targets specified. csc does not catch this.
12315
12316         * ../errors/errors.txt : update for error # -20
12317
12318 2002-04-11  Ravi Pratap  <ravi@ximian.com>
12319
12320         * support.cs (InternalParameters.ParameterModifier): Do some null
12321         checking and return sane values.
12322
12323         * class.cs (Method.Define): If we are a PInvoke method, ensure
12324         that we are static and extern. Report error # 601
12325
12326         * ../errors/cs0601.cs : Add test case for the above error.
12327
12328 2002-04-07  Ravi Pratap  <ravi@ximian.com>
12329
12330         * rootcontext.cs (attribute_types): We need to keep type of
12331         all attribute types separately and emit code for them first.
12332
12333         (RegisterAttribute) : Implement.
12334
12335         * class.cs (DefineType): Check if the current Type is a custom
12336         attribute type and register it accordingly.
12337
12338         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
12339         adding the first attribute twice and rename to
12340
12341         (SetGlobalAttributes): this.
12342
12343         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
12344         lookups.
12345
12346         * attribute.cs (ApplyAttributes): Take an additional argument telling us
12347         if we are processing global arguments. Hmm, I am unsure of this.
12348
12349 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12350
12351         * expression.cs: added static array of strings to avoid calling
12352         Enum.ToString () for Operator in Binary. Significant recover of
12353         performance.
12354
12355 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
12356
12357         * class.cs (FindMembers): Allow the Builders of the various
12358         members to be null.  If they are skip them.  This only happens
12359         during the PInvoke declaration.
12360
12361 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
12362
12363         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
12364         failure, so we do not keep going afterwards.
12365
12366         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
12367         wanted to pass `false' as the `is_delegate' argument.  If this is
12368         the case, why not use delegate_type == null to mean `is_delegate =
12369         false' and anything else as is_delegate = true.
12370
12371 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
12372
12373         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
12374         code for the section, not the beginning of the tests.
12375
12376 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
12377
12378         * cfold.cs: Handle operator + (Enum x, Underlying x) 
12379
12380         * expression.cs (Binary): same.  Warn about errors where we have
12381         Enum/Enum in operator + as well.
12382
12383 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
12384
12385         * statement.cs:
12386                 - added support for switch(bool)
12387                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
12388                 - add TableSwitchEmit() to handle table-based switch statements
12389
12390 2002-04-05  Ravi Pratap  <ravi@ximian.com>
12391
12392         * expression.cs (Invocation.OverloadResolve): Factor out code which
12393         does parameter compatibility checking with arguments so that we can 
12394         re-use the code even from Delegate.VerifyApplicability
12395
12396         (VerifyArgumentsCompat): Move above code here.
12397
12398         * delegate.cs (VerifyApplicability): Get rid of duplicate code
12399         and instead make a call to the above method.
12400
12401 2002-03-31  Ravi Pratap  <ravi@ximian.com>
12402
12403         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
12404         We use it to keep track of classes which are attribute types.
12405
12406 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
12407
12408         * delegate.cs (Delegate.Define): Correctly define the types in the
12409         presence of fixed and array parameters.
12410
12411         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
12412         doing FindMembers.
12413
12414         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
12415         include NonPublic after the first iteration.
12416
12417         * class.cs (Indexer.CheckBase): Only check if both parents are
12418         non-null. 
12419
12420         * cs-parser.jay (accessor_body): If empty, set to null.
12421
12422         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
12423         same code path here to resolve constants names that we did have in
12424         MemberAccess.DoResolve.  There is too much code duplicated here.
12425
12426 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
12427
12428         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
12429
12430         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
12431         to MakeUnionSet.
12432
12433         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
12434         tokens, numbers and strings.
12435
12436         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
12437         parenthesis.
12438
12439         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
12440         asyncronous parameters and the regular parameters.  
12441
12442         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
12443         specify the target directory.
12444
12445         * expression.cs: (This.DoResolve): Simplify
12446         (As.Emit): Optimize, do not generate IsInst if the expression is
12447         always of the given type.
12448
12449         (Is.DoResolve): Bug fix, we were reporting both always/never for
12450         the is expression.
12451
12452         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
12453         creating too many unnecessary arrays.
12454
12455 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
12456
12457         * class.cs (EmitFieldInitializer): Use Assign expression to assign
12458         fields instead of rolling our own initializer.   Takes care of all
12459         implicit conversions, and drops unnecessary static checks/argument.
12460
12461 2002-03-31  Dick Porter  <dick@ximian.com>
12462
12463         * driver.cs: use the GetDirectories() return values properly, and
12464         use "/" as path separator.
12465
12466 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
12467
12468         * expression.cs (Unary): Optimize - - expr into expr.
12469         (Binary): Optimize a + (-b) into a -b.
12470
12471         * codegen.cs (CodeGen): Made all methods static.
12472
12473 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
12474
12475         * rootcontext.cs: 
12476
12477         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
12478         TypeBuilder property.
12479
12480         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
12481         instead. 
12482
12483         * tree.cs: Removed the various RecordXXXX, and replaced with a
12484         single RecordDecl.  Removed all the accessor methods, and just
12485         left a single access point Type 
12486
12487         * enum.cs: Rename DefineEnum to DefineType.
12488
12489         * decl.cs: New abstract method `DefineType' used to unify the
12490         Defines for Enumerations, Interfaces, TypeContainers and
12491         Delegates.
12492
12493         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12494         LookupBaseClasses method that used to live in class.cs and
12495         interface.cs here, and renamed to FindType.
12496
12497         * delegate.cs: Implement DefineType.  Take advantage of the
12498         refactored pattern for locating the parent builder without taking
12499         the parent_builder argument (which we know does not work if we are
12500         nested, and triggering a toplevel definition).
12501
12502 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12503
12504         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12505         accessibility of a member has changed during override and report
12506         an error if so.
12507
12508         * class.cs (Method.Define, Property.Define): Only complain on
12509         overrides if the method is private, any other accessibility is
12510         fine (and since we just checked the permission is the same, we are
12511         good to go).
12512
12513         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12514         and elif are processed always.  The other pre-processing
12515         directives are only processed if we are "taking" the path
12516
12517 2002-03-29  Martin Baulig  <martin@gnome.org>
12518
12519         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12520         current location is not Null.
12521
12522         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12523         a separate method so we can profile it.
12524
12525         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12526         `span.Seconds' are just seconds, but no minutes or hours.
12527         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12528
12529 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12530
12531         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12532         Remove the gratuitous set of Final:
12533
12534                                 // If an interface implementation, then we can set Final.
12535                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12536                                     implementing.DeclaringType.IsInterface)
12537                                         flags |= MethodAttributes.Final;
12538
12539         I do not know what I was smoking when I used that.
12540
12541
12542         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12543         step into fixing the name resolution issues for delegates and
12544         unifying the toplevel name resolution.
12545
12546 2002-03-28  Martin Baulig  <martin@gnome.org>
12547
12548         * class.cs (Method.Emit): If we have a symbol writer, call its
12549         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12550         tell it about the current method.
12551
12552         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12553         writer that we're going to emit the first byte of IL code for a new
12554         statement (a new source line).
12555         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12556         EmitContext.Mark() before emitting any code.
12557
12558         * location.cs (SymbolDocument): Return null when we're Null.
12559
12560         * statement.cs (Statement): Moved the `Location loc' variable here.
12561         (Statement.EmitBoolExpression): If we have a symbol writer, call
12562         ec.Mark() before emitting any code to tell it that we're at the
12563         beginning of a new statement.
12564         (StatementExpression): Added `Location' argument to the constructor.
12565         (Block): Added public readonly variable `StartLocation' and public
12566         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12567         (Block): Added constructor which takes a start and end location.
12568         (Block.SetEndLocation): New method. This sets the end location.
12569         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12570         local variables we create.
12571         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12572         each statement and do also mark the begin and end of the block.
12573
12574         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12575         tell it the current lexer.Location, use Location.Null for the end of the
12576         block.
12577         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12578         current block, set its end location using SetEndLocation().
12579         (statement_expression): StatementExpression constructor now takes the
12580         lexer.Location as additional argument.
12581         (for_statement, declare_local_variables): Likewise.
12582         (declare_local_variables): When creating a new implicit block, use the
12583         new Block constructor and pass it the lexer.Location.
12584
12585 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12586
12587         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12588         members also on the parent interfaces recursively.
12589
12590 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12591
12592         * report.cs: Use new formats, since Gonzalo finished the missing
12593         bits. 
12594
12595         * expression.cs (Binary.ResolveOperator): added missing operator|
12596         operator& and operator^ for bool/bool.
12597
12598         * cs-parser.jay: CheckDef now takes a Location argument that is
12599         used to report errors more precisly (instead of reporting the end
12600         of a definition, we try to track something which is a lot closer
12601         to the source of the problem).
12602
12603         * cs-tokenizer.cs: Track global token use, so we can properly flag
12604         the use of #define/#undef after the first token has been seen.
12605
12606         Also, rename the reportXXXX to Error_DescriptiveName
12607
12608         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12609         TypeContainer, so that Enum and Interface can use this too.
12610
12611         * class.cs (TypeContainer.LookupInterfaceOrClass,
12612         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12613         `builder' argument.  Typically this was used to pass the parent
12614         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12615         the definition).  
12616
12617         The problem is that a nested class could trigger the definition of
12618         a toplevel class, and the builder would be obviously wrong in that
12619         case. 
12620
12621         So we drop this argument, and we compute dynamically the
12622         TypeBuilder/ModuleBuilder (the correct information was available
12623         to us anyways from DeclSpace.Parent)
12624
12625         * interface.cs (Interface.DefineInterface): Drop builder
12626         parameter cleanup like class.cs
12627
12628         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12629         like class.cs
12630
12631         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12632         values. 
12633
12634         (Try.Emit): Propagate the returns value from the statement.
12635
12636         (Return.Emit): Even if we are leavning 
12637
12638         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12639
12640         * modifiers.cs: Fix the computation of MethodAttributes flags.
12641
12642 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12643
12644         * driver.cs: allow compilation of files that start with '/'.
12645         Add a default case when checking the argument of --target.
12646
12647 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12648
12649         * interface.cs: Implement the same search algorithm for types in
12650         the interface code.
12651
12652         * delegate.cs: Do not allow multiple definition.
12653
12654         * Recovered ChangeLog that got accidentally amputated
12655
12656         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12657
12658         * rootcontext.cs: Load manually enum to allow core classes to
12659         contain enumerations.
12660
12661         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12662         Update to new static methods in TypeManager.
12663
12664         * typemanager.cs (GetMethod, GetConstructor): Use our
12665         implementation of FindMembers to find the members, since during
12666         corlib compilation, the types are TypeBuilders and GetMethod and
12667         GetConstructor do not work.
12668
12669         Make all methods in TypeManager static.
12670
12671         (InitCodeHelpers): Split the functionality from
12672         the InitCodeTypes function.
12673
12674         * driver.cs: Call InitCodeHelpers after we have populated the
12675         types. 
12676
12677         * cs-parser.jay (delegate_declaration): we did not used to compute
12678         the delegate name correctly for void delegates.
12679
12680 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12681
12682         * rootcontext.cs (RootContext): Init the interface_resolve_order
12683         and type_container_resolve_order always.
12684
12685         (ResolveCore, BootstrapCorlib_ResolveClass,
12686         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12687         compiler when compiling with --nostdlib
12688
12689         * class.cs (TypeContainer.DefineType): Check that our parent is
12690         not null.  This test is most important when we are bootstraping
12691         the core types.
12692
12693         * codegen.cs: Split out the symbol writing code.
12694
12695 2002-03-25  Martin Baulig  <martin@gnome.org>
12696
12697         * driver.cs (-g): Made -g an alias for --debug.
12698
12699 2002-03-24  Martin Baulig  <martin@gnome.org>
12700
12701         * codegen.cs (SymbolWriter): New public variable. Returns the
12702         current symbol writer.
12703         (CodeGen): Added `bool want_debugging_support' argument to the
12704          constructor. If true, tell the ModuleBuild that we want debugging
12705         support and ask it for the ISymbolWriter.
12706         (Save): If we have a symbol writer, call it's Close() method after
12707         saving the assembly.
12708
12709         * driver.c (--debug): New command line argument to create a
12710         debugger information file.
12711
12712         * location.cs (SymbolDocument): New public property. Returns an
12713         ISymbolDocumentWriter object for the current source file or null
12714         if we don't have a symbol writer.
12715
12716 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12717
12718         * driver.cs (LoadAssembly): Correctly return when all the paths
12719         have been tried and not before.
12720
12721         * statement.cs (Switch.Emit): return the actual coverage for this
12722         statement (returns/not-returns)
12723
12724         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12725         switch of the statement if we are the last switch section.  That
12726         kills two problems: try/catch problems (we used to emit an empty
12727         nop at the end) and switch statements where all branches would
12728         return. 
12729
12730 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12731
12732         * driver.cs: Add default assemblies (the equivalent to the
12733         Microsoft CSC.RSP file)
12734
12735         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12736         also update tokens_seen and set it to false.
12737
12738         * driver.cs: Implement --recurse for Mike.
12739
12740         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12741         correctly splitting out the paths.
12742
12743 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12744
12745         * interface.cs (Interface.PopulateProperty): Instead of using
12746         `parent' as the declaration space for the set parameters, use
12747         `this' 
12748
12749         * support.cs (InternalParameters): InternalParameters constructor
12750         takes a DeclSpace instead of a TypeContainer.
12751
12752         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12753         types are being initialized, load the address of it before calling
12754         the function.  
12755
12756         (New): Provide a mechanism to disable the generation of local
12757         value type temporaries when the caller will be providing us with
12758         an address to store it.
12759
12760         (ArrayCreation.EmitDynamicInitializers): Use it.
12761
12762 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12763
12764         * expression.cs (Invocation.EmitArguments): Only probe for array
12765         property if there is more than one argument.  Sorry about that.
12766
12767         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12768         empty param arrays.
12769
12770         * class.cs (Method.LabelParameters): Fix incorrect code path that
12771         prevented the `ParamArrayAttribute' from being applied to the
12772         params attribute.
12773
12774 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12775
12776         * support.cs (ReflectionParameters): Correctly compute whether the
12777         last argument is a params array.  Fixes the problem with
12778         string.Split ('a')
12779
12780         * typemanager.cs: Make the assemblies array always be non-null
12781         (empty, but non-null)
12782
12783         * tree.cs (RecordDecl): New function that abstracts the recording
12784         of names.  This reports error 101, and provides a pointer to the
12785         previous declaration.  Fixes a crash in the compiler.
12786
12787         * cs-parser.jay (constructor_declaration): Update to new grammar,
12788         and provide a constructor_body that can be empty.
12789
12790 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12791
12792         * driver.cs: Add support for --resources.
12793
12794         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12795         Make all types for the various array helper methods be integer.
12796
12797         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12798         CheckState to ConvCast.
12799
12800         (ConvCast): Now it takes a `checked' state argument, to avoid
12801         depending on the emit context for the conversion, and just using
12802         the resolve time setting.
12803
12804         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12805         instead of Invocation.EmitArguments.  We do not emit the original
12806         arguments, instead we emit those which have been converted to
12807         unsigned int expressions.
12808
12809         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12810
12811         * codegen.cs: ditto.
12812
12813         * expression.cs (LocalVariableReference): Drop the use of the
12814         Store function that depended on the variable index.
12815
12816         * statement.cs (VariableInfo): Drop the `Idx' property from this
12817         class, as this is not taking into account the indexes for
12818         temporaries tat we generate during the execution, getting the
12819         indexes wrong.
12820
12821         * class.cs: First emit class initializers, then call the parent
12822         constructor. 
12823
12824         * expression.cs (Binary): Fix opcode emision.
12825         (UnaryMutator.EmitCode): Support checked code generation
12826
12827         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12828         matches for events for both the Static and Instance scans,
12829         pointing to the same element.   Fix that.
12830
12831 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12832
12833         * rootcontext.cs (ResolveTree): Always set the
12834         interface_resolve_order, because nested interfaces will be calling
12835         into us.
12836
12837         * class.cs (GetInterfaceOrClass): Track the same resolution
12838         process used by TypeManager.LookupType.  This fixes the nested
12839         type lookups in class declarations (separate path from
12840         LookupType). 
12841
12842         (TypeContainer.DefineType): Also define nested interfaces.
12843         (TypeContainer.RegisterOrder): New public function used to
12844         register the order in which child interfaces need to be closed.
12845
12846         Nested interfaces need to be closed after their parents have been
12847         created. 
12848
12849         * interface.cs (InterfaceAttr): Put all the logic for computing
12850         the interface attribute here. 
12851
12852         (DefineInterface): Register our interface order with the
12853         RootContext or with the TypeContainer depending on the case.
12854
12855 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12856
12857         * cs-parser.jay: rework foreach statement to work with the new
12858         changes to the policy on SimpleNames.
12859
12860         * report.cs: support Stacktrace on warnings as well.
12861
12862         * makefile: drop --unsafe and /unsafe from the compile.
12863
12864 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12865
12866         * ecore.cs (StandardConversionExists): Modify to take an Expression
12867         as the first parameter. Ensure we do null -> reference type conversion
12868         checking.
12869
12870         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12871         temporary Expression objects.
12872
12873 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12874
12875         * interface.cs: workaround bug in method overloading resolution
12876         (there is already a bugzilla bug for it).
12877
12878 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12879
12880         We could also solve this problem by having a separate path for
12881         performing type lookups, instead of DoResolve, we could have a
12882         ResolveType entry point, and only participating pieces of the
12883         production (simplename, deref, array) would implement this. 
12884
12885         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12886         signal SimpleName to only resolve type names and not attempt to
12887         resolve anything else.
12888
12889         * expression.cs (Cast): Set the flag.
12890
12891         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12892
12893         * class.cs: Only report 108 if there is no `new' modifier.
12894
12895         * cs-parser.jay: rework foreach statement to work with the new
12896         changes to the policy on SimpleNames.
12897         
12898         * report.cs: support Stacktrace on warnings as well.
12899
12900         * makefile: drop --unsafe and /unsafe from the compile.
12901
12902 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12903
12904         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12905         lookups here, instead of doing that at parse time.  This means
12906         that our grammar will not introduce `LocalVariableReferences' as
12907         expressions at this point.  That solves the problem of code like
12908         this:
12909
12910         class X {
12911            static void Main ()
12912            { int X = 1;
12913             { X x = null }}}
12914
12915         This is only half the fix.  The full fix requires parameters to
12916         also be handled in this way.
12917
12918         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12919         makes the use more obvious of the DeclSpace.  The
12920         ec.TypeContainer.TypeBuilder is now only used to pull the
12921         TypeBuilder for it.
12922
12923         My theory is that I can get rid of the TypeBuilder completely from
12924         the EmitContext, and have typecasts where it is used (from
12925         DeclSpace to where it matters).  
12926
12927         The only pending problem is that the code that implements Aliases
12928         is on TypeContainer, and probably should go in DeclSpace.
12929
12930         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12931         lookups here, instead of doing that at parse time.  This means
12932         that our grammar will not introduce `LocalVariableReferences' as
12933         expressions at this point.  That solves the problem of code like
12934         this:
12935
12936         class X {
12937            static void Main ()
12938            { int X = 1;
12939             { X x = null }}}
12940
12941         This is only half the fix.  The full fix requires parameters to
12942         also be handled in this way.
12943
12944         * class.cs (Property.DefineMethod): When implementing an interface
12945         method, set newslot, when implementing an abstract method, do not
12946         set the flag (before we tried never setting it, or always setting
12947         it, which is the difference).
12948         (Indexer.DefineMethod): same.
12949         (Method.DefineMethod): same.
12950
12951         * ecore.cs: Only set the status used flag if we get back a Field.
12952
12953         * attribute.cs: Temporary hack, so Paolo can keep working.
12954
12955 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12956
12957         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12958         the unmanaged type in the case we have a MarshalAs attribute.
12959
12960         (Resolve): Handle the case when we are parsing the special MarshalAs
12961         attribute [we need to store the unmanaged type to use later]
12962
12963         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12964         MarshalAs Attribute.
12965
12966         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12967         on parameters and accordingly set the marshalling info.
12968
12969 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12970
12971         * class.cs: Optimizing slightly by removing redundant code after
12972         we switched to the `NoTypes' return value.
12973         (Property.DefineMethod): use NoTypes here too.
12974
12975         This fixes the bug I introduced in my last batch of changes.
12976
12977 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12978
12979         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12980
12981         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12982         Enums since those are types too. 
12983
12984         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12985
12986         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12987         thanks to a call during the lookup process.
12988
12989 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12990
12991         * statement.cs (Foreach): Lots of work to accomodate a particular
12992         kind of foreach statement that I had not kept in mind.  It is
12993         possible to have foreachs on classes that provide a GetEnumerator
12994         method that return objects that implement the "pattern" for using
12995         a foreach, there is no need to support GetEnumerator
12996         specifically. 
12997
12998         This is needed to compile nant.
12999
13000         * decl.cs: Only report 114 if the member is not `Finalize' and if
13001         the warning level is at least 2.
13002
13003         * class.cs: Moved the compare function from Method to
13004         MethodSignature. 
13005
13006         (MethodSignature.InheritableMemberSignatureCompare): Add new
13007         filter function that is used to extract inheritable methods from a
13008         class. 
13009
13010         (Method.Define): Use the new `inheritable_method_signature_filter'
13011         delegate
13012
13013         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
13014         command. 
13015
13016 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
13017
13018         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
13019
13020         * cs-parser.jay: Add opt_semicolon to the interface declaration.
13021
13022         * expression.cs: Pass location information to
13023         ConvertImplicitStandard. 
13024
13025         * class.cs: Added debugging code to track return values from
13026         interfaces. 
13027
13028 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
13029
13030         * expression.cs (Is.DoResolve): If either side of the `is' is an
13031         interface, do not flag the warning.
13032
13033         * ecore.cs (ImplicitReferenceConversion): We need a separate test
13034         for interfaces
13035
13036         * report.cs: Allow for --fatal to be used with --probe.
13037
13038         * typemanager.cs (NoTypes): Move the definition for the empty Type
13039         array here. 
13040
13041         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
13042         properties. 
13043         (TypeContainer.DefineProxy): New function used to proxy to parent
13044         implementations when implementing interfaces.
13045         (TypeContainer.ParentImplements): used to lookup if our parent
13046         implements a public function that is required by an interface.
13047         (TypeContainer.VerifyPendingMethods): Hook this up.
13048
13049         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
13050         `modules' and `assemblies' arraylists into arrays.  We only grow
13051         these are the very early start up of the program, so this improves
13052         the speedof LookupType (nicely measured).
13053
13054         * expression.cs (MakeByteBlob): Replaced unsafe code with
13055         BitConverter, as suggested by Paolo.
13056
13057         * cfold.cs (ConstantFold.Binary): Special case: perform constant
13058         folding of string concatenation, but if either side is a string,
13059         and the other is not, then return null, and let the runtime use
13060         the concatenation on the string plus the object (using
13061         `Object.ToString'). 
13062
13063 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
13064
13065         Constant Folding has been implemented now.
13066
13067         * expression.cs (Unary.Reduce): Do not throw an exception, catch
13068         the error instead on types that are not supported in one's
13069         complement. 
13070
13071         * constant.cs (Constant and all children): New set of functions to
13072         perform implict and explicit conversions.
13073
13074         * ecore.cs (EnumConstant): Implement the new functions to perform
13075         conversion by proxying to the child expression.
13076
13077         * codegen.cs: (ConstantCheckState): Constant evaluation has its
13078         own separate setting that can not be turned off from the command
13079         line using --unchecked or --checked and is only controlled using
13080         the checked/unchecked statements and expressions.  This setting is
13081         used by the constant folder to flag errors.
13082
13083         * expression.cs (CheckedExpr, UncheckedExpr): Set the
13084         ConstantCheckState as well.   
13085
13086         During Resolve, they also have to flag the state, because the
13087         constant folder runs completely in the Resolve phase.
13088
13089         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
13090         well.
13091
13092 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13093
13094         * cfold.cs: New file, this file contains the constant folder.
13095
13096         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
13097         argument to track whether we are using the resulting address to
13098         load or store a value and provide better error messages. 
13099
13100         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
13101         new AddressOf arguments.
13102
13103         * statement.cs (Foreach.EmitCollectionForeach): Update
13104
13105         * expression.cs (Argument.Emit): Call AddressOf with proper
13106         arguments to track usage.
13107
13108         (New.DoEmit): Call AddressOf with new arguments.
13109
13110         (Unary.Emit): Adjust AddressOf call.
13111
13112 2002-03-01  Ravi Pratap  <ravi@ximian.com>
13113
13114         * cs-parser.jay (member_access): Change the case for pre-defined types
13115         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
13116         this suggestion.
13117
13118         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
13119         a method body.
13120
13121         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
13122         essentially like methods and apply attributes like MethodImplOptions to them too.
13123
13124         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
13125         not being null.
13126
13127         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
13128         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
13129         is the DeclSpace.
13130
13131         * Update code everywhere accordingly.
13132
13133         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
13134
13135         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
13136
13137 2002-02-28  Ravi Pratap  <ravi@ximian.com>
13138
13139         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
13140         try performing lookups against those instead of jumping straight into using
13141         the 'using' clauses.
13142
13143         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
13144
13145         (LookupType): Perform lookups in implicit parents too.
13146
13147         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
13148         sequence as RootContext.LookupType. 
13149
13150         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
13151         the various cases of namespace lookups into this method.
13152
13153 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13154
13155         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
13156         in positional arguments)
13157
13158         * class.cs (Operator): Update the AllowedModifiers to contain
13159         extern. 
13160
13161         * cs-parser.jay: Update operator declaration to allow for the
13162         operator body to be empty.
13163
13164         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
13165         values. 
13166
13167 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
13168
13169         * class.cs (Method.Emit): Label parameters.
13170
13171         * driver.cs: Return 1 or 0 as the program exit code.
13172
13173 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
13174
13175         * expression.cs: Special case the `null' object when trying to
13176         auto-compute the type, as anything can be explicitly converted to
13177         that. 
13178
13179         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
13180         spotting this Paolo.
13181
13182         (Expression.ImplicitNumericConversion): Perform comparissions of
13183         the type using the underlying type in the case of an enumeration
13184         rather than using the enumeration type for the compare.
13185
13186         Cope with the underlying == type case, which is not possible to
13187         catch before. 
13188
13189         (Expression.ConvertNumericExplicit): Perform comparissions of
13190         the type using the underlying type in the case of an enumeration
13191         rather than using the enumeration type for the compare.
13192
13193         * driver.cs: If the user does not supply an extension, assume .exe
13194
13195         * cs-parser.jay (if_statement): Rewrote so that we can track the
13196         location for the if statement.
13197
13198         * expression.cs (Binary.ConstantFold): Only concat strings when
13199         the operation is "+", not everything ;-)
13200
13201         * statement.cs (Statement.EmitBoolExpression): Take a location
13202         argument. 
13203         (If, While, Do): Track location.
13204
13205         * expression.cs (Binary.ResolveOperator): In the object + string
13206         case, I was missing a call to ConvertImplicit
13207
13208 2002-02-25  Ravi Pratap  <ravi@ximian.com>
13209
13210         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
13211         Location arguments. Ensure we use RootContext.LookupType to do our work
13212         and not try to do a direct Type.GetType and ModuleBuilder.GetType
13213
13214         * interface.cs (PopulateMethod): Handle the type of the parameter being
13215         null gracefully.
13216
13217         * expression.cs (Invocation.BetterFunction): Handle the case when we 
13218         have a params method with no fixed arguments and a call is made with no
13219         arguments.
13220
13221 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
13222
13223         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
13224         the verbatim-string-literal
13225
13226         * support.cs (InternalParameters.ParameterModifier): handle null
13227         fixed parameters.
13228         (InternalParameters.ParameterType): ditto.
13229
13230         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
13231         duplicating the name of the variable parameter.
13232         (GetParameterByName): Fix bug where we were not looking up array
13233         paramters if they were the only present (thanks Paolo!).
13234         (GetParameterInfo): We only have an empty set of types if both
13235         fixed and array are set to null.
13236         (GetParameterInfo-idx): Handle FixedParameter == null
13237
13238         * cs-parser.jay: Handle the case where there is no catch
13239         statements (missing null test).
13240
13241 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
13242
13243         * driver.cs (MainDriver): Be conservative on our command line
13244         handling.
13245
13246         Catch DirectoryNotFoundException when calling GetFiles.
13247
13248         (SplitPathAndPattern): Used to split the input specification into
13249         a path and a pattern that we can feed to Directory.GetFiles.
13250
13251 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
13252
13253         * statement.cs (Fixed): Implement the last case of the Fixed
13254         statement (string handling).
13255
13256         * expression.cs (StringPtr): New class used to return a char * to
13257         a string;  Used by the Fixed statement.
13258
13259         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
13260
13261         * expression.cs (Binary.ResolveOperator): Remove redundant
13262         MemberLookup pn parent type.
13263         Optimize union call, we do not need a union if the types are the same.
13264         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
13265         type.
13266
13267         Specialize the use of MemberLookup everywhere, instead of using
13268         the default settings. 
13269
13270         (StackAlloc): Implement stackalloc keyword.
13271
13272         * cs-parser.jay: Add rule to parse stackalloc.
13273
13274         * driver.cs: Handle /h, /help, /?
13275
13276         * expression.cs (MakeByteBlob): Removed the hacks we had in place
13277         before we supported unsafe code.
13278
13279         * makefile: add --unsafe to the self compilation of mcs.
13280
13281 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
13282
13283         * expression.cs (PointerArithmetic): New class that is used to
13284         perform pointer arithmetic.
13285         (Binary.Resolve): Handle pointer arithmetic
13286         Handle pointer comparission.
13287         (ArrayPtr): Utility expression class that is used to take the
13288         address of an array.
13289
13290         (ElementAccess): Implement array access for pointers
13291
13292         * statement.cs (Fixed): Implement fixed statement for arrays, we
13293         are missing one more case before we are done.
13294
13295         * expression.cs (Indirection): Implement EmitAssign and set the
13296         ExprClass to Variable.  This allows pointer dereferences to be
13297         treated as variables, and to have values assigned to them.
13298
13299         * ecore.cs (Expression.StoreFromPtr): New utility function to
13300         store values dereferencing.
13301
13302 2002-02-20  Ravi Pratap  <ravi@ximian.com>
13303
13304         * expression.cs (Binary.ResolveOperator): Ensure that we are
13305         not trying to operate on a void type - this fixes the reported
13306         bug.
13307
13308         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
13309         the parent implementation is sealed.
13310
13311         * ../errors/cs0239.cs : Add.
13312
13313         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
13314
13315         * typemanager.cs (unverifiable_code_type): Corresponds to 
13316         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
13317         which have unsafe code in them.
13318
13319         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
13320         unsafe context.
13321
13322 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
13323
13324         * cs-tokenizer.cs: Add support for @"litreal strings"
13325
13326         Make tokenizer accept pre-processor directives
13327         on any column (remove the old C-like limitation). 
13328
13329         * rootcontext.cs (EmitCode): Emit any global attributes.
13330         (AddGlobalAttributes): Used to keep track of assembly attributes. 
13331
13332         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
13333
13334         * cs-parser.jay: Add support for global attributes.  
13335
13336 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
13337
13338         * expression.cs (Indirection): New helper class.  Unary will
13339         create Indirection classes to be able to implement the
13340         IMemoryLocation interface on it.
13341
13342 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
13343
13344         * cs-parser.jay (fixed_statement): reference the right statement.
13345
13346         * statement.cs (Fixed.Emit): Finish implementing the fixed
13347         statement for the &x case.
13348
13349 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
13350
13351         * class.cs (Property.Define, Method.Define): Remove newslot when
13352         `implementing'.  
13353
13354         * modifiers.cs: My use of NewSlot when `Abstract' was set was
13355         wrong.  NewSlot should only be used if the `new' keyword is present.
13356
13357         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
13358         locating our system dir.  Sorry about this.
13359
13360 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13361
13362         * driver.cs (GetSystemDir): Compute correctly the location of our
13363         system assemblies.  I was using the compiler directory instead of
13364         the library directory.
13365
13366 2002-02-13  Ravi Pratap  <ravi@ximian.com>
13367
13368         * expression.cs (BetterFunction): Put back in what Miguel commented out
13369         since it is the correct fix. The problem is elsewhere ;-)
13370
13371         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
13372         parameters of the parms method are themselves compatible or not !
13373
13374         (StandardConversionExists): Fix very dangerous bug where we were forgetting
13375         to check that a class implements an interface before saying that an implicit
13376         conversion was allowed. Use ImplementsInterface to do the checking.
13377
13378 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13379
13380         * class.cs (Method.Define): Track whether we are an explicit
13381         implementation or not.  And only call DefineMethodOverride if we
13382         are an explicit implementation.
13383
13384         (Property.DefineMethod): Ditto.
13385
13386 2002-02-11  Ravi Pratap  <ravi@ximian.com>
13387
13388         * expression.cs (BetterFunction): Catch hideous bug which was
13389          preventing us from detecting ambiguous calls due to implicit casts i.e
13390         cs0121.
13391
13392 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
13393
13394         * support.cs (Pair): Remove un-needed method.  I figured why I was
13395         getting the error in cs-parser.jay, the variable in a foreach loop
13396         is readonly, and the compiler does not really treat this as a variable.
13397
13398         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
13399         instead of EQUALS in grammar.  
13400
13401         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
13402
13403         * expression.cs (Unary.DoResolve): Check whether the argument is
13404         managed or not.
13405
13406 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
13407
13408         * support.cs: Api for Pair to set a value.  Despite the fact that
13409         the variables are public the MS C# compiler refuses to compile
13410         code that accesses the field if the variable is part of a foreach
13411         statement. 
13412
13413         * statement.cs (Fixed): Begin implementation of the fixed
13414         statement.
13415
13416         (Block.AddVariable): Return the VariableInfo on success and null
13417         on failure instead of true/false. 
13418
13419         * cs-parser.jay (foreach): Catch errors on variables already
13420         defined (we were ignoring this value before) and properly unwind
13421         the block hierarchy
13422
13423         (fixed_statement): grammar for the fixed statement.
13424
13425 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
13426
13427         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
13428         pointer types to be incretemented.
13429
13430         (SizeOf): Implement.
13431
13432         * cs-parser.jay (pointer_member_access): Implement
13433         expr->IDENTIFIER production.
13434
13435         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
13436         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
13437         on safe contexts.
13438
13439         (Unary): Implement indirection.
13440
13441         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
13442         use in non-unsafe context).
13443
13444         (SimpleName.DoResolve): Check for pointers in field access on safe
13445         contexts. 
13446
13447         (Expression.LoadFromPtr): Factor the load-indirect code in this
13448         function.  This was duplicated in UnboxCast and ParameterReference
13449
13450 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
13451
13452         * expression.cs (ComposedCast): report an error if a pointer cast
13453         is used in a safe region.
13454
13455         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
13456         pointer type casts in unsafe context.
13457
13458         * codegen.cs (EmitContext): Set up IsUnsafe.
13459
13460         * cs-parser.jay (non_expression_type): Add productions for pointer
13461         casts. 
13462
13463         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
13464         code.  We should not use force into static mode if the method is
13465         not virtual.  Fixes bug in MIS
13466
13467         * statement.cs (Do.Emit, While.Emit, For.Emit,
13468         Statement.EmitBoolExpression): Add support to Do and While to
13469         propagate infinite loop as `I do return' semantics.
13470
13471         Improve the For case to also test for boolean constants.
13472
13473         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
13474         to the list of attributes we can add.
13475
13476         Remove `EmitContext' argument.
13477
13478         * class.cs (Method.Define): Apply parameter attributes.
13479         (Constructor.Define): Apply parameter attributes.
13480         (MethodCore.LabelParameters): Move here the core of labeling
13481         parameters. 
13482
13483         * support.cs (ReflectionParameters.ParameterModifier,
13484         InternalParameters.ParameterModifier): Use IsByRef on the type and
13485         only return the OUT bit for these parameters instead of in/out/ref
13486         flags.
13487
13488         This is because I miss-understood things.  The ParameterInfo.IsIn
13489         and IsOut represent whether the parameter has the [In] and [Out]
13490         attributes set.  
13491
13492 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13493
13494         * ecore.cs (FieldExpr.Emit): Release temporaries.
13495
13496         * assign.cs (LocalTemporary.Release): new function.
13497
13498         * codegen.cs (EmitContext.GetTemporaryStorage,
13499         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13500         temporary storage.  Now we can "put back" localbuilders when we
13501         are done with them
13502
13503 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13504
13505         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13506         need to make a copy of the variable to generate verifiable code.
13507
13508 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13509
13510         * driver.cs: Compute dynamically the system directory.
13511
13512         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13513         Slower, but more generally useful.  Used by the abstract
13514         registering implementation. 
13515
13516         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13517         the rules for the special rule on Type/instances.  First check if
13518         we have the same name, and if so, try that special static path
13519         rather than the instance path.
13520
13521 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13522
13523         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13524         for, while and if.
13525
13526         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13527         Enum, ValueType, Delegate or Array for non-corlib compiles.
13528
13529         * cs-tokenizer.cs: Catch long identifiers (645)
13530
13531         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13532         piece of code.
13533
13534         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13535         fix, we were returning too early, so we were not registering
13536         pending methods from abstract classes.
13537
13538         Do not register pending methods if the class is abstract.
13539
13540         * expression.cs (Conditional.DoResolve): Report circular implicit
13541         conversions when we neecd to compute it for conditional
13542         expressions. 
13543
13544         (Is.DoResolve): If the expression is always of the provided type,
13545         flag warning 183.  If the expression can not ever be of the
13546         provided type flag warning 184.
13547
13548         * class.cs: Catch 169 as well.
13549
13550         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13551         read. 
13552
13553 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13554
13555         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13556
13557 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13558
13559         * interface.cs: (PopulateMethod): Check for pointers being defined
13560         only if the unsafe context is active.
13561         (PopulateProperty): ditto.
13562         (PopulateIndexer): ditto.
13563
13564         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13565         specified.  If pointers are present, make sure that they are
13566         present in an unsafe context.
13567         (Constructor, Constructor.Define): ditto.
13568         (Field, Field.Define): ditto.
13569         (Property, Property.Define): ditto.
13570         (Event, Event.Define): ditto.
13571
13572         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13573         hashtable if there are classes or structs defined.
13574
13575         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13576         code, as the constant resolution moved.
13577
13578         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13579         the metadata, so we can flag error 133. 
13580
13581         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13582         pointer is being declared in an unsafe context.
13583
13584 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13585
13586         * modifiers.cs (Modifiers.Check): Require a Location argument.
13587         Report error 227 for Unsafe use.
13588
13589         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13590
13591         * statement.cs (For.Emit): If the test is null, then report that
13592         we do `return', as we wont reach anything afterwards.
13593
13594         (Switch.SwitchGoverningType): Track the expression that matched
13595         the conversion.
13596
13597         * driver.cs: Allow negative numbers as an error code to flag.
13598
13599         * cs-parser.jay: Handle 1551.
13600
13601         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13602
13603 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13604
13605         * cs-parser.jay: Report 1518 (type declaration can only contain
13606         class, struct, interface, enum or delegate)
13607
13608         (switch_label): Report 1523 (keywords `case' or `default' must
13609         preced code)
13610
13611         (opt_switch_sections): Report 1522 (empty switch)
13612
13613         * driver.cs: Report 1515 (response file specified multiple times)
13614         Report 1516 (Source file specified multiple times).
13615
13616         * expression.cs (Argument.Resolve): Signal 1510
13617
13618         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13619         access not allowed in static code)
13620
13621 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13622
13623         * typemanager.cs (IsPointerType): Utility method which we are going
13624         to need a lot.
13625
13626         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13627         the object type, so we take care of that.
13628
13629         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13630
13631         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13632         added to non-params parameters :-)
13633
13634         * typemanager.cs (CSharpName): Include 'void' type too. 
13635
13636         (void_ptr_type): Include in the set of core types.
13637
13638         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13639         duplicating code.
13640
13641         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13642         an unsafe context.
13643
13644         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13645         completely forgotten about it.
13646
13647 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13648
13649         * cs-parser.jay (pointer_type): Add. This begins our implementation
13650         of parsing rules for unsafe code.
13651
13652         (unsafe_statement): Implement.
13653
13654         (embedded_statement): Modify to include the above.
13655
13656         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13657
13658         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13659         if the current context is an unsafe one.
13660
13661         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13662         are handled differently, we need separate rules for them.
13663
13664         (local_variable_declaration): Update to use local_variable_pointer_type
13665         to allow variable declarations of unmanaged pointer types.
13666
13667         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13668         in unsafe contexts.
13669
13670         * ../errors/cs0214.cs : Add.
13671
13672 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13673
13674         * makefile: remove 'response' file when cleaning.
13675
13676 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13677
13678         * cs-parser.jay: Report 1524.
13679
13680 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13681
13682         * typemanager.cs (RegisterMethod): drop checking if we have
13683         registered this from here
13684
13685 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13686
13687         * class.cs (Method.EmitDestructor): Implement calling our base
13688         destructor. 
13689
13690         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13691         value of InFinally.
13692
13693         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13694         this routine and will wrap the call in a try/catch block.  Deal
13695         with the case.
13696
13697 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13698
13699         * ecore.cs (Expression.MemberLookup): instead of taking a
13700         parameter `same_type' that was used to tell whether we could
13701         access private members we compute our containing type from the
13702         EmitContext.
13703
13704         (FieldExpr): Added partial support for volatile fields.  This does
13705         not work for volatile fields exposed from assemblies, as I can not
13706         figure out how to extract the modreq from it.
13707
13708         Updated all the source files to use this.
13709
13710         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13711         because it is referenced by MemberLookup very often. 
13712
13713 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13714
13715         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13716         TypeBuilder.GetCustomAttributes to retrieve what we need.
13717
13718         Get rid of redundant default_member_attr_type as this is the same as
13719         default_member_type which already exists.
13720
13721         * interface.cs, attribute.cs : Update accordingly.
13722
13723 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13724
13725         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13726         work for TYpeBuilders though.  Ravi, can you please fix this?
13727
13728         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13729
13730         * expression.cs (Argument.Emit): Handle the case of ref objects
13731         being passed to ref functions;  
13732
13733         (ParameterReference.EmitLoad): Loads the content of the pointer
13734         without dereferencing.
13735
13736 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13737
13738         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13739
13740 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13741
13742         * class.cs (Indexer.DefineMethod): Incorporate the interface
13743         type in the name of the method if we are doing explicit interface
13744         implementation.
13745
13746         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13747
13748         (BetterConversion): Fix extremely trivial bug where we were referring to
13749         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13750         again !
13751
13752         * ../errors/bug16.cs : Add although we have fixed it.
13753
13754 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13755
13756         * expression.cs (BaseIndexer): Begin implementation.
13757
13758         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13759
13760         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13761         production directly to remove a shift/reduce, and implement
13762         explicit interface implementation.
13763
13764         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13765         after a floating point suffix.
13766
13767         * expression.cs (DoNumericPromotions): Improved the conversion for
13768         uint/uint.  If we have a constant, we avoid doing a typecast to a
13769         larger type.
13770
13771         * class.cs (Indexer): Implement explicit interface implementation
13772         for indexers.
13773
13774 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13775
13776         * class.cs: make the default instance constructor public and hidebysig.
13777
13778 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13779
13780         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13781         so we can call it from elsewhere.
13782
13783         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13784         we emit it internally if the class has a defined indexer; otherwise the user
13785         emits it by decorating the class definition with the DefaultMemberAttribute.
13786
13787         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13788         attribute is not used on a type which defines an indexer.
13789
13790         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13791         character when we skip whitespace.
13792
13793         * ../errors/cs0646.cs : Add.
13794
13795 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13796
13797         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13798         again. 
13799
13800         * makefile: Add practical target `mcs3.exe' which builds the third
13801         generation compiler. 
13802
13803         * expression.cs (New): Fix structures constructor calling.
13804
13805         * class.cs (Property, Method, Indexer): Emit Final flag on the
13806         method if we are an interface implementation and we are not
13807         abstract. 
13808
13809         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13810         whether this property is referencing a `base' method.
13811
13812         * expression.cs (Invocation.EmitCall): take an extra argument:
13813         is_base, this is used to determine whether the `call' or
13814         `callvirt' opcode should be used.
13815
13816
13817         * delegate.cs: update EmitCall.
13818
13819         * class.cs (Method.Define): Set NewSlot for the cases where we are
13820         not implementing an interface method.
13821
13822         (Property.Define): ditto.
13823
13824 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13825
13826         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13827         'r'.  Allows mcs to parse itself fully.
13828
13829 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13830
13831         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13832         of the number of initializers that require the InitializeArray method.
13833
13834         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13835         update the above field where necessary.
13836
13837         (MakeByteBlob): Update accordingly.
13838
13839         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13840         greater than 2.
13841
13842         (EmitDynamicInitializers): Update in accordance with the new optimization.
13843
13844         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13845         same OpCode applies.
13846
13847         * cs-parser.jay : Fix some glaring errors I introduced.
13848
13849 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13850
13851         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13852         so that we can check for name clashes there too.
13853
13854         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13855         for interface indexers.
13856
13857         * interfaces.cs (Define): Emit the default member attribute.
13858
13859         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13860         variable was being referred to while setting the value ;-)
13861
13862 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13863
13864         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13865         byte-by-byte information when we know the data is zero.
13866
13867         Make the block always a multiple of 4, because
13868         DefineInitializedData has a bug.
13869
13870         * assign.cs: Fix, we should assign from the temporary, not from
13871         the source. 
13872
13873         * expression.cs (MakeByteBlob): Fix my incorrect code.
13874
13875 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13876
13877         * typemanager.cs (EnumToUnderlying): This function is used to get
13878         the underlying type from an enumeration, because it does not
13879         always work. 
13880
13881         * constant.cs: Use the I4_S form for values between -128 and 127.
13882
13883         * statement.cs (Block.LookupLabel): Looks up a label.
13884         (Block): Drop support for labeled blocks.
13885
13886         (LabeledStatement): New kind of statement that represents a label
13887         only.
13888
13889         (Goto): Finally implement this bad boy.
13890
13891         * cs-parser.jay: Update to reflect new mechanism to implement
13892         labels.
13893
13894 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13895
13896         * codegen.cs (EmitContext.This): a codegen property that keeps the
13897         a single instance of this instead of creating many different this
13898         instances. 
13899
13900         * delegate.cs (Delegate.DoResolve): Update to use the property;
13901
13902         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13903
13904         * expression.cs (BaseAccess.DoResolve): Ditto.
13905
13906 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13907
13908         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13909         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13910
13911         (InitCoreTypes): Update accordingly.
13912
13913         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13914         so we can quickly store the state.
13915
13916         (ApplyAttributes): Set the correct implementation flags
13917         for InternalCall methods.
13918
13919 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13920
13921         * expression.cs (EmitCall): if a method is not virtual, then do
13922         not use callvirt on it.
13923
13924         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13925         user defined stuff) requires the use of stobj, which takes an
13926         address on the stack instead of an array and an index.  So emit
13927         the Ldelema operation for it.
13928
13929         (EmitStoreOpcode): Use stobj for valuetypes.
13930
13931         (UnaryMutator.EmitCode): Use the right 1 value depending on
13932         whether we are dealing with int64/uint64, float or doubles.
13933
13934         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13935         constructors that I implemented last night.
13936
13937         (Constructor.IsDefault): Fix to work properly for static
13938         constructors.
13939
13940         * cs-parser.jay (CheckDef): report method signature errors.
13941         Update error number 103 to be 132.
13942
13943         * decl.cs: New AdditionResult enumeration value: MethodExists.
13944         Although we do this check for methods later on in the semantic
13945         analysis, catching repeated default constructors is so easy that
13946         we catch these here. 
13947
13948         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13949         promotions code.
13950
13951         (ParameterReference.EmitAssign, Emit): handle
13952         bools as bytes.
13953
13954         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13955         (ArrayAccess.EmitStoreOpcode): ditto.
13956
13957         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13958
13959         * expression.cs (MakeByteBlob): Complete all the missing types
13960         (uint, short, ushort, byte, sbyte)
13961
13962         * class.cs: Only init instance field initializers on instance
13963         constructors. 
13964
13965         Rename `constructors' to instance_constructors. 
13966
13967         (TypeContainer.AddConstructor): Only add constructors to the list
13968         if it is not static.
13969
13970         Make sure that we handle default_static_constructor independently
13971         everywhere where we handle instance_constructors
13972
13973 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13974
13975         * class.cs: Do not lookup or create a base initializer for a
13976         static constructor.
13977
13978         (ConstructorInitializer.Resolve): use the proper type to lookup
13979         for constructors.
13980
13981         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13982
13983         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13984         in DeclSpace. 
13985
13986         * decl.cs: CloseType is now an virtual method, the default
13987         implementation just closes this type.
13988
13989 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13990
13991         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13992         to PreserveSig by default. Also emit HideBySig on such methods.
13993
13994         Basically, set the defaults to standard values.
13995
13996         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13997         argument, if candidate is better, it can't be worse than the best !
13998
13999         (Invocation): Re-write bits to differentiate between methods being
14000         applicable in their expanded form and their normal form - for params
14001         methods of course.
14002
14003         Get rid of use_standard everywhere as only standard conversions are allowed
14004         in overload resolution. 
14005
14006         More spec conformance.
14007
14008 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14009
14010         * driver.cs: Add --timestamp, to see where the compiler spends
14011         most of its time.
14012
14013         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
14014         `this' in static code.
14015
14016         (SimpleName.DoResolve): Implement in terms of a helper function
14017         that allows static-references to be passed upstream to
14018         MemberAccess.
14019
14020         (Expression.ResolveWithSimpleName): Resolve specially simple
14021         names when called by MemberAccess to implement the special
14022         semantics. 
14023
14024         (Expression.ImplicitReferenceConversion): Handle conversions from
14025         Null to reference types before others, as Null's type is
14026         System.Object. 
14027
14028         * expression.cs (Invocation.EmitCall): Handle the special case of
14029         calling methods declared on a reference type from a ValueType
14030         (Base classes System.Object and System.Enum)
14031
14032         (MemberAccess.Resolve): Only perform lookups on Enumerations if
14033         the left hand side is a TypeExpr, not on every enumeration. 
14034
14035         (Binary.Resolve): If types are reference types, then do a cast to
14036         object on operators != and == of both arguments.
14037
14038         * typemanager.cs (FindMembers): Extract instance and static
14039         members if requested.
14040
14041         * interface.cs (PopulateProperty): Use void_type instead of null
14042         as the return type for the setter method.
14043
14044         (PopulateIndexer): ditto.
14045
14046 2001-12-27  Ravi Pratap  <ravi@ximian.com>
14047
14048         * support.cs (ReflectionParameters): Fix minor bug where we
14049         were examining the wrong parameter for the ParamArray attribute.
14050
14051         Cope with requests for the type of the parameter at position
14052         greater than the params parameter's. We now return the element
14053         type of the params array as that makes more sense.
14054
14055         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
14056         accordingly as we no longer have to extract the element type
14057         ourselves.
14058
14059         (Invocation.OverloadResolve): Update.
14060
14061 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14062
14063         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
14064         against IEnumerator, test whether the return value is a descendant
14065         of the IEnumerator interface.
14066
14067         * class.cs (Indexer.Define): Use an auxiliary method to implement
14068         the other bits of the method definition.  Begin support for
14069         explicit interface implementation.
14070
14071         (Property.DefineMethod): Use TypeManager.void_type instead of null
14072         for an empty return value.
14073
14074 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
14075
14076         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
14077         dealing with a FieldExpr which is composed of a FieldBuilder, in
14078         the code path we did extract the constant, but we should have
14079         obtained the underlying value to be able to cast it (otherwise we
14080         end up in an infinite loop, this is what Ravi was running into).
14081
14082         (ArrayCreation.UpdateIndices): Arrays might be empty.
14083
14084         (MemberAccess.ResolveMemberAccess): Add support for section
14085         14.5.4.1 that deals with the special case of E.I when E is a type
14086         and something else, that I can be a reference to a static member.
14087
14088         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
14089         handle a particular array type to create byte blobs, it is just
14090         something we dont generate byteblobs for.
14091
14092         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
14093         arguments. 
14094
14095         * location.cs (Push): remove the key from the hashtable that we
14096         are about to add.   This happens for empty files.
14097
14098         * driver.cs: Dispose files after we have parsed them.
14099
14100         (tokenize): new function that only runs the tokenizer on its
14101         input, for speed testing.
14102
14103 2001-12-26  Ravi Pratap  <ravi@ximian.com>
14104
14105         * class.cs (Event.Define): Define the private field only if there
14106         are no accessors defined.
14107
14108         * expression.cs (ResolveMemberAccess): If there is no associated
14109         field with the event, that means we have an event defined with its
14110         own accessors and we should flag error cs0070 since transforming
14111         ourselves into a field is not valid in that case.
14112
14113         * ecore.cs (SimpleName.DoResolve): Same as above.
14114
14115         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
14116         and charset to sane values.
14117
14118 2001-12-25  Ravi Pratap  <ravi@ximian.com>
14119
14120         * assign.cs (DoResolve): Perform check on events only if they 
14121         are being accessed outside the declaring type.
14122
14123         * cs-parser.jay (event_declarations): Update rules to correctly
14124         set the type of the implicit parameter etc.
14125
14126         (add_accessor, remove_accessor): Set current local parameters.
14127
14128         * expression.cs (Binary): For delegate addition and subtraction,
14129         cast the return value from the method into the appropriate delegate
14130         type.
14131
14132 2001-12-24  Ravi Pratap  <ravi@ximian.com>
14133
14134         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
14135         of these as the workaround is unnecessary.
14136
14137         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
14138         delegate data - none of that is needed at all.
14139
14140         Re-write bits to extract the instance expression and the delegate method
14141         correctly.
14142
14143         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
14144         on delegates too.
14145
14146         * attribute.cs (ApplyAttributes): New method to take care of common tasks
14147         of attaching attributes instead of duplicating code everywhere.
14148
14149         * everywhere : Update code to do attribute emission using the above method.
14150
14151 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14152
14153         * expression.cs (IsParamsMethodApplicable): if there are not
14154         parameters, return immediately.
14155
14156         * ecore.cs: The 0 literal can be implicity converted to an enum
14157         type. 
14158
14159         (SimpleName.DoResolve): First lookup the type, then lookup the
14160         members. 
14161
14162         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
14163         want to get its address.  If the InstanceExpression is not
14164         addressable, store the result in a temporary variable, then get
14165         the address of it.
14166
14167         * codegen.cs: Only display 219 errors on warning level or above. 
14168
14169         * expression.cs (ArrayAccess): Make it implement the
14170         IMemoryLocation interface.
14171
14172         (Binary.DoResolve): handle the operator == (object a, object b)
14173         and operator != (object a, object b) without incurring into a
14174         BoxedCast (because 5 != o should never be performed).
14175
14176         Handle binary enumerator operators.
14177
14178         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
14179         value type, otherwise use Ldelem_ref.
14180
14181         Use precomputed names;
14182
14183         (AddressOf): Implement address of
14184
14185         * cs-parser.jay (labeled_statement): Fix recursive block
14186         addition by reworking the production.
14187
14188         * expression.cs (New.DoEmit): New has a special case:
14189                 
14190                  If we are dealing with a ValueType, we have a few
14191                  situations to deal with:
14192                 
14193                     * The target of New is a ValueType variable, that is
14194                       easy, we just pass this as the variable reference
14195                 
14196                     * The target of New is being passed as an argument,
14197                       to a boxing operation or a function that takes a
14198                       ValueType.
14199                 
14200                       In this case, we need to create a temporary variable
14201                       that is the argument of New.
14202
14203
14204 2001-12-23  Ravi Pratap  <ravi@ximian.com>
14205
14206         * rootcontext.cs (LookupType): Check that current_type is not null before
14207         going about looking at nested types.
14208
14209         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
14210         not implement the IAssignMethod interface any more.
14211
14212         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
14213         where we tranform them into FieldExprs if they are being resolved from within
14214         the declaring type.
14215
14216         * ecore.cs (SimpleName.DoResolve): Do the same here.
14217
14218         * assign.cs (DoResolve, Emit): Clean up code considerably. 
14219
14220         * ../errors/bug10.cs : Add.
14221
14222         * ../errors/cs0070.cs : Add.
14223
14224         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
14225
14226         * assign.cs : Get rid of EventIsLocal everywhere.
14227
14228 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14229
14230         * ecore.cs (ConvertIntLiteral): finished the implementation.
14231
14232         * statement.cs (SwitchLabel): Convert the value we are using as a
14233         key before looking up the table.
14234
14235 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14236
14237         * codegen.cs (EmitTopBlock): Require a Location argument now.
14238
14239         * cs-parser.jay (constructor_declarator): We need to setup
14240         current_local_parameters before we parse the
14241         opt_constructor_initializer, to allow the variables to be bound
14242         to the constructor arguments.
14243
14244         * rootcontext.cs (LookupType): First lookup nested classes in our
14245         class and our parents before we go looking outside our class.
14246
14247         * expression.cs (ConstantFold): Extract/debox the values at the
14248         beginnning. 
14249
14250         * rootcontext.cs (EmitCode): Resolve the constants first before we
14251         resolve the types.  This is not really needed, but it helps debugging.
14252
14253         * statement.cs: report location.
14254
14255         * cs-parser.jay: pass location to throw statement.
14256
14257         * driver.cs: Small bug fix.
14258
14259         * report.cs: Updated format to be 4-zero filled digits.
14260
14261 2001-12-22  Ravi Pratap  <ravi@ximian.com>
14262
14263         * expression.cs (CheckIndices): Fix minor bug where the wrong
14264         variable was being referred to ;-)
14265
14266         (DoEmit): Do not call EmitStaticInitializers when the 
14267         underlying type is System.Object.
14268
14269 2001-12-21  Ravi Pratap  <ravi@ximian.com>
14270
14271         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
14272         and do the usual workaround for SRE.
14273
14274         * class.cs (MyEventBuilder.EventType): New member to get at the type
14275         of the event, quickly.
14276
14277         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
14278
14279         * assign.cs (Assign.DoResolve): Handle the case when the target
14280         is an EventExpr and perform the necessary checks.
14281
14282         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
14283         interface.
14284
14285         (SimpleName.MemberStaticCheck): Include check for EventExpr.
14286
14287         (EventExpr): Set the type in the constructor itself since we 
14288         are meant to be born fully resolved.
14289
14290         (EventExpr.Define): Revert code I wrote earlier.
14291                 
14292         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
14293         instance expression is null. The instance expression is a This in that case
14294         or a null, depending on whether it is a static method or not.
14295
14296         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
14297         refers to more than one method.
14298
14299         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
14300         and accordingly flag errors.
14301
14302 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14303
14304         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
14305
14306 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14307
14308         * location.cs (ToString): Provide useful rutine.
14309
14310 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14311
14312         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
14313         objects, return the actual integral boxed.
14314
14315         * statement.cs (SwitchLabel): define an ILLabel for each
14316         SwitchLabel. 
14317
14318         (Switch.CheckSwitch): If the value is a Literal, extract
14319         the underlying literal.
14320
14321         Also in the unused hashtable we had, add the SwitchLabel so we can
14322         quickly look this value up.
14323
14324         * constant.cs: Implement a bunch of new constants.  Rewrite
14325         Literal based on this.  Made changes everywhere to adapt to this.
14326
14327         * expression.cs (Expression.MakeByteBlob): Optimize routine by
14328         dereferencing array only once, and also copes with enumrations.
14329
14330         bytes are two bytes wide, not one.
14331
14332         (Cast): Perform constant conversions.
14333
14334         * ecore.cs (TryImplicitIntConversion): Return literals instead of
14335         wrappers to the literals here.
14336
14337         * expression.cs (DoNumericPromotions): long literals can converted
14338         to ulong implicity (this is taken care of elsewhere, but I was
14339         missing this spot).
14340
14341         * ecore.cs (Expression.Literalize): Make the return type Literal,
14342         to improve type checking.
14343
14344         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
14345
14346 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14347
14348         * literal.cs: Revert code from ravi that checked the bounds.  The
14349         bounds are sane by the definition of the type itself. 
14350
14351         * typemanager.cs: Fix implementation of ImplementsInterface.  We
14352         need to actually look up in our parent hierarchy for interfaces
14353         implemented. 
14354
14355         * const.cs: Use the underlying type for enumerations
14356
14357         * delegate.cs: Compute the basename for the delegate creation,
14358         that should fix the delegate test case, and restore the correct
14359         Type Lookup semantics in rootcontext
14360
14361         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
14362         referencing a nested type with the Reflection API is using the "+"
14363         sign. 
14364
14365         * cs-parser.jay: Do not require EOF token at the end.
14366
14367 2001-12-20  Ravi Pratap  <ravi@ximian.com>
14368
14369         * rootcontext.cs (LookupType): Concatenate type names with
14370         a '.' instead of a '+' The test suite passes again.
14371
14372         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
14373         field of the enumeration.
14374
14375         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
14376         the case when the member is an EventExpr.
14377
14378         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
14379         static has an associated instance expression.
14380
14381         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
14382
14383         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
14384
14385         * class.cs (Event.Define): Register event and perform appropriate checks
14386         for error #111.
14387
14388         We define the Add and Remove methods even if the use provides none because
14389         in that case, we provide default implementations ourselves.
14390
14391         Define a private field of the type of the event. This is done by the CSC compiler
14392         and we should be doing it too ;-)
14393
14394         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
14395         More methods we use in code we generate.
14396
14397         (multicast_delegate_type, delegate_type): Two separate types since the distinction
14398         is important.
14399
14400         (InitCoreTypes): Update accordingly for the above.
14401
14402         * class.cs (Event.Emit): Generate code for default accessors that we provide
14403
14404         (EmitDefaultMethod): Do the job in the above.
14405
14406         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
14407         appropriate place.
14408
14409 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14410
14411         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
14412         builders even if we were missing one.
14413
14414         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
14415         pass the Basename as our class name instead of the Name.  The
14416         basename will be correctly composed for us.
14417
14418         * parameter.cs (Paramters): Now takes a Location argument.
14419
14420         * decl.cs (DeclSpace.LookupType): Removed convenience function and
14421         make all the code call directly LookupType in RootContext and take
14422         this chance to pass the Location information everywhere.
14423
14424         * Everywhere: pass Location information.
14425
14426 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
14427
14428         * class.cs (Constructor.Define): Updated way of detecting the
14429         length of the parameters.
14430
14431         (TypeContainer.DefineType): Use basename as the type name for
14432         nested types.
14433
14434         (TypeContainer.Define): Do not recursively define types here, as
14435         definition is taken care in order by the RootContext.
14436
14437         * tree.cs: Keep track of namespaces in a per-file basis.
14438
14439         * parameter.cs (Parameter.ComputeSignature): Update to use
14440         DeclSpace. 
14441
14442         (Parameters.GetSignature): ditto.
14443
14444         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
14445         instead of a TypeContainer.
14446
14447         (Interface.SemanticAnalysis): Use `this' instead of our parent to
14448         resolve names.  Because we need to be resolve in our context, not
14449         our parents.
14450
14451         * driver.cs: Implement response files.
14452
14453         * class.cs (TypeContainer.DefineType): If we are defined, do not
14454         redefine ourselves.
14455
14456         (Event.Emit): Emit the code for add/remove handlers.
14457         (Event.Define): Save the MethodBuilders for add/remove.
14458
14459         * typemanager.cs: Use pair here too.
14460
14461         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
14462         DictionaryEntry requires the first argument to be non-null.  
14463
14464         (enum_declaration): Compute full name for registering the
14465         enumeration.
14466
14467         (delegate_declaration): Instead of using
14468         formal_parameter_list, use opt_formal_parameter_list as the list
14469         can be empty.
14470
14471         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
14472         (EventParsing): New property that controls whether `add' and
14473         `remove' are returned as tokens or identifiers (for events);
14474
14475 2001-12-19  Ravi Pratap  <ravi@ximian.com>
14476
14477         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
14478         use MyEventBuilder only and let it wrap the real builder for us.
14479
14480         (MyEventBuilder): Revamp constructor etc.
14481
14482         Implement all operations that we perform on EventBuilder in precisely the same
14483         way here too.
14484
14485         (FindMembers): Update to use the EventBuilder member.
14486
14487         (Event.Emit): Update accordingly.
14488
14489 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14490
14491         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14492         by calling the appropriate methods.
14493
14494         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14495         useful.
14496
14497         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14498
14499 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14500
14501         * delegate.cs (Delegate.Populate): Check that the return type
14502         and various parameters types are indeed accessible.
14503
14504         * class.cs (Constructor.Define): Same here.
14505
14506         (Field.Define): Ditto.
14507
14508         (Event.Define): Ditto.
14509
14510         (Operator.Define): Check that the underlying Method defined itself
14511         correctly - so it's MethodBuilder should not be null.
14512
14513         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14514         expression happens to be null.
14515
14516         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14517         members but as of now we don't seem to be able to do anything really useful with it.
14518
14519         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14520         not the EventBuilder.
14521
14522 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14523
14524         * cs-tokenizer.cs: Add support for defines.
14525         Add support for #if, #elif, #else, #endif
14526
14527         (eval_var): evaluates a variable.
14528         (eval): stubbed for evaluating functions.
14529
14530         * cs-parser.jay: Pass the defines information
14531
14532         * driver.cs: Add --define command line option.
14533
14534         * decl.cs: Move MemberCore here.
14535
14536         Make it the base class for DeclSpace.  This allows us to catch and
14537         report 108 and 109 for everything now.
14538
14539         * class.cs (TypeContainer.Define): Extract all the members
14540         before populating and emit the warning 108 (new keyword required
14541         to override) instead of having each member implement this.
14542
14543         (MemberCore.Define): New abstract method, we will be using this in
14544         the warning reporting engine in Populate.
14545
14546         (Operator.Define): Adjust to new MemberCore protocol. 
14547
14548         * const.cs (Const): This does not derive from Expression, it is a
14549         temporary object we use to create fields, it is a MemberCore. 
14550
14551         * class.cs (Method.Define): Allow the entry point to be in a
14552         specific class.
14553
14554         * driver.cs: Rewrite the argument handler to clean it up a bit.
14555
14556         * rootcontext.cs: Made it just an auxiliary namespace feature by
14557         making everything static.
14558
14559         * driver.cs: Adapt code to use RootContext type name instead of
14560         instance variable.
14561
14562         * delegate.cs: Remove RootContext argument.
14563
14564         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14565         argument. 
14566
14567         * class.cs (Event.Define): The lookup can fail.
14568
14569         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14570
14571         * expression.cs: Resolve the this instance before invoking the code.
14572
14573 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14574
14575         * cs-parser.jay: Add a production in element_access that allows
14576         the thing to become a "type" reference.  This way we can parse
14577         things like "(string [])" as a type.
14578
14579         Note that this still does not handle the more complex rules of
14580         casts. 
14581
14582
14583         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14584
14585         * ecore.cs: (CopyNewMethods): new utility function used to
14586         assemble the list of methods from running FindMembers.
14587
14588         (MemberLookup): Rework FindMembers so that 
14589
14590 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14591
14592         * class.cs (TypeContainer): Remove Delegates who fail to be
14593         defined.
14594
14595         * delegate.cs (Populate): Verify that we dont get null return
14596         values.   TODO: Check for AsAccessible.
14597
14598         * cs-parser.jay: Use basename to emit error 574 (destructor should
14599         have the same name as container class), not the full name.
14600
14601         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14602         possible representation.  
14603
14604         Also implements integer type suffixes U and L.
14605
14606 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14607
14608         * expression.cs (ArrayCreation.DoResolve): We need to do the
14609         argument resolution *always*.
14610
14611         * decl.cs: Make this hold the namespace.  Hold the root context as
14612         well.
14613         (LookupType): Move here.
14614
14615         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14616
14617         * location.cs (Row, Name): Fixed the code, it was always returning
14618         references to the first file.
14619
14620         * interface.cs: Register properties defined through interfaces.
14621
14622         * driver.cs: Add support for globbing on the command line
14623
14624         * class.cs (Field): Make it derive from MemberCore as well.
14625         (Event): ditto.
14626
14627 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14628
14629         * class.cs (Event::Define): Check that the type of the event is a delegate
14630         type else flag error #66.
14631
14632         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14633         same.
14634
14635         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14636         values of EntryPoint, CharSet etc etc.
14637
14638         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14639
14640         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14641         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14642         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14643         which needs this to do its work.
14644
14645         * ../errors/cs0066.cs : Add.
14646
14647 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14648
14649         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14650         helper functions.
14651
14652         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14653         clears out the parameters field.
14654         (MemberSignatureCompare): Cleanup
14655
14656         (MemberCore): New base class used to share code between MethodCore
14657         and Property.
14658
14659         (RegisterRequiredImplementations) BindingFlags.Public requires
14660         either BindingFlags.Instace or Static.  Use instance here.
14661
14662         (Property): Refactored code to cope better with the full spec.
14663
14664         * parameter.cs (GetParameterInfo): Return an empty array instead
14665         of null on error.
14666
14667         * class.cs (Property): Abstract or extern properties have no bodies.
14668
14669         * parameter.cs (GetParameterInfo): return a zero-sized array.
14670
14671         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14672         method modifier validation to the typecontainer so we can reuse
14673         this on properties.
14674
14675         (MethodCore.ParameterTypes): return an empty sized array of types.
14676
14677         (Property.Define): Test property modifier validity.
14678
14679         Add tests for sealed/override too.
14680
14681         (Method.Emit): abstract or extern methods have no bodies.
14682
14683 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14684
14685         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14686         thing.
14687
14688         (Method::Define, ::Emit): Modify accordingly.
14689
14690         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14691
14692         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14693
14694         * makefile: Pass in /unsafe.
14695
14696 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14697
14698         * class.cs (MakeKey): Kill routine.
14699
14700         * class.cs (TypeContainer.Define): Correctly define explicit
14701         method implementations (they require the full interface name plus
14702         the method name).
14703
14704         * typemanager.cs: Deply the PtrHashtable here and stop using the
14705         lame keys.  Things work so much better.
14706
14707         This of course broke everyone who depended on `RegisterMethod' to
14708         do the `test for existance' test.  This has to be done elsewhere.
14709
14710         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14711         the object stupid Equals method (because, that like fails all over
14712         the place).  We still do not use it.
14713
14714         * class.cs (TypeContainer.SetRequiredInterface,
14715         TypeContainer.RequireMethods): Killed these two routines and moved
14716         all the functionality to RegisterRequiredImplementations.
14717
14718         (TypeContainer.RegisterRequiredImplementations): This routine now
14719         registers all the implementations required in an array for the
14720         interfaces and abstract methods.  We use an array of structures
14721         which can be computed ahead of time to reduce memory usage and we
14722         also assume that lookups are cheap as most classes will not
14723         implement too many interfaces.
14724
14725         We also avoid creating too many MethodSignatures.
14726
14727         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14728         clear the "pending" bit if we find that there are problems with
14729         the declaration.
14730
14731         (TypeContainer.VerifyPendingMethods): Update to report errors of
14732         methods that look like implementations but are not.
14733
14734         (TypeContainer.Define): Add support for explicit interface method
14735         implementation. 
14736
14737 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14738
14739         * typemanager.cs: Keep track of the parameters here instead of
14740         being a feature of the TypeContainer.
14741
14742         * class.cs: Drop the registration of parameters here, as
14743         InterfaceMethods are also interface declarations.
14744
14745         * delegate.cs: Register methods with the TypeManager not only with
14746         the TypeContainer.  This code was buggy.
14747
14748         * interface.cs: Full registation here.
14749
14750 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14751
14752         * expression.cs: Remove reducer for binary expressions, it can not
14753         be done this way.
14754
14755         * const.cs: Put here the code that used to go into constant.cs
14756
14757         * constant.cs: Put here the code for constants, this is a new base
14758         class for Literals.
14759
14760         * literal.cs: Make Literal derive from Constant.
14761
14762 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14763
14764         * statement.cs (Return.Emit): Report error 157 if the user
14765         attempts to return from a finally block.
14766
14767         (Return.Emit): Instead of emitting a return, jump to the end of
14768         the function.
14769
14770         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14771         LocalBuilder to store the result of the function.  ReturnLabel is
14772         the target where we jump.
14773
14774
14775 2001-12-09  Radek Doulik  <rodo@ximian.com>
14776
14777         * cs-parser.jay: remember alias in current namespace
14778
14779         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14780         namespaces
14781
14782         * class.cs (LookupAlias): lookup alias in my_namespace
14783
14784         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14785         aliases hashtable
14786         (LookupAlias): lookup alias in this and if needed in parent
14787         namespaces
14788
14789 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14790
14791         * support.cs: 
14792
14793         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14794         making things static.  I need this to avoid passing the
14795         TypeContainer when calling ParameterType.
14796
14797         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14798         that did string manipulation to compute the type and then call
14799         GetType.  Use Parameter.ParameterType instead.
14800
14801         * cs-tokenizer.cs: Consume the suffix for floating values.
14802
14803         * expression.cs (ParameterReference): figure out whether this is a
14804         reference parameter or not.  Kill an extra variable by computing
14805         the arg_idx during emission.
14806
14807         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14808         function that returns whether a parameter is an out/ref value or not.
14809
14810         (Parameter.ParameterType): The type of the parameter (base,
14811         without ref/out applied).
14812
14813         (Parameter.Resolve): Perform resolution here.
14814         (Parameter.ExternalType): The full type (with ref/out applied).
14815
14816         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14817         support for expressions on the using statement.
14818
14819 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14820
14821         * statement.cs (Using.EmitLocalVariableDecls): Split the
14822         localvariable handling of the using statement.
14823
14824         (Block.EmitMeta): Keep track of variable count across blocks.  We
14825         were reusing slots on separate branches of blocks.
14826
14827         (Try.Emit): Emit the general code block, we were not emitting it. 
14828
14829         Check the type of the declaration to be an IDisposable or
14830         something that can be implicity converted to it. 
14831
14832         Emit conversions if required.
14833
14834         * ecore.cs (EmptyExpression): New utility class.
14835         (Expression.ImplicitConversionExists): New utility function.
14836
14837 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14838
14839         * statement.cs (Using): Implement.
14840
14841         * expression.cs (LocalVariableReference): Support read only variables.
14842
14843         * statement.cs: Remove the explicit emit for the Leave opcode.
14844         (VariableInfo): Add a readonly field.
14845
14846 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14847
14848         * ecore.cs (ConvCast): new class used to encapsulate the various
14849         explicit integer conversions that works in both checked and
14850         unchecked contexts.
14851
14852         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14853         properly generate the overflow opcodes.
14854
14855 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14856
14857         * statement.cs: The correct type for the EmptyExpression is the
14858         element_type, not the variable type.  Ravi pointed this out.
14859
14860 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14861
14862         * class.cs (Method::Define): Handle PInvoke methods specially
14863         by using DefinePInvokeMethod instead of the usual one.
14864
14865         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14866         above to do the task of extracting information and defining the method.
14867
14868 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14869
14870         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14871         of the condition for string type.
14872
14873         (Emit): Move that here. 
14874
14875         (ArrayCreation::CheckIndices): Keep string literals in their expression
14876         form.
14877
14878         (EmitDynamicInitializers): Handle strings appropriately.
14879
14880 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14881
14882         * codegen.cs (EmitContext): Replace multiple variables with a
14883         single pointer to the current Switch statement.
14884
14885         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14886         EmitContext.
14887
14888 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14889
14890         * statement.cs 
14891
14892         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14893         default'.
14894
14895         (Foreach.Emit): Foreach on arrays was not setting
14896         up the loop variables (for break/continue).
14897
14898         (GotoCase): Semi-implented.
14899
14900 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14901
14902         * attribute.cs (CheckAttribute): Handle system attributes by using
14903         Attribute.GetAttributes to examine information we need.
14904
14905         (GetValidPlaces): Same here.
14906
14907         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14908
14909         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14910
14911         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14912
14913         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14914
14915         (Method::Emit): Handle the case when we are a PInvoke method.
14916
14917 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14918
14919         * expression.cs: Use ResolveWithSimpleName on compound names.
14920
14921 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14922
14923         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14924         before trying to reduce it.
14925
14926         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14927
14928         * constant.cs (LookupConstantValue): Implement.
14929
14930         (EmitConstant): Use the above in emitting the constant.
14931
14932         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14933         that are user-defined by doing a LookupConstantValue on them.
14934
14935         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14936         too, like above.
14937
14938 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14939
14940         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14941
14942         (BaseAccess.DoResolve): Implement.
14943
14944         (MemberAccess.DoResolve): Split this routine into a
14945         ResolveMemberAccess routine that can be used independently
14946
14947 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14948
14949         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14950         As that share bits of the implementation.  Is returns a boolean,
14951         while As returns the Type that is being probed.
14952
14953 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14954
14955         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14956         instead of a Literal - much easier.
14957
14958         (EnumInTransit): Remove - utterly useless :-)
14959
14960         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14961
14962         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14963
14964         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14965         chain when we have no associated expression.
14966
14967 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14968
14969         * constant.cs (Define): Use Location while reporting the errror.
14970
14971         Also emit a warning when 'new' is used and there is no inherited
14972         member to hide.
14973
14974         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14975         populated.
14976
14977         (LookupEnumValue): Implement to lookup an enum member's value and define it
14978         if necessary.
14979
14980         (Populate): Re-write accordingly to use the above routine.
14981
14982 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14983
14984         * expression.cs (This): Fix prototype for DoResolveLValue to
14985         override the base class DoResolveLValue.
14986
14987         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14988         declarations) 
14989
14990         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14991         (we need to load the address of the field here).  This fixes
14992         test-22. 
14993
14994         (FieldExpr.DoResolveLValue): Call the DoResolve
14995         function to initialize the Instance expression.
14996
14997         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14998         correctly the GetEnumerator operation on a value type.
14999
15000         * cs-parser.jay: Add more simple parsing error catches.
15001
15002         * statement.cs (Switch): Add support for string switches.
15003         Handle null specially.
15004
15005         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
15006
15007 2001-11-28  Ravi Pratap  <ravi@ximian.com>
15008
15009         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
15010
15011         (declare_local_constant): New helper function.
15012
15013         * statement.cs (AddConstant): Keep a separate record of constants
15014
15015         (IsConstant): Implement to determine if a variable is a constant.
15016
15017         (GetConstantExpression): Implement.
15018
15019         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
15020
15021         * statement.cs (IsVariableDefined): Re-write.
15022
15023 2001-11-27  Ravi Pratap  <ravi@ximian.com>
15024
15025         * class.cs (TypeContainer::FindMembers): Look for constants
15026         in the case when we are looking for MemberTypes.Field
15027
15028         * expression.cs (MemberAccess::DoResolve): Check that in the
15029         case we are a FieldExpr and a Literal, we are not being accessed
15030         by an instance reference.
15031
15032         * cs-parser.jay (local_constant_declaration): Implement.
15033
15034         (declaration_statement): Implement for constant declarations.
15035
15036 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
15037
15038         * statement.cs (Switch): Catch double defaults.
15039
15040         (Switch): More work on the switch() statement
15041         implementation.  It works for integral values now, need to finish
15042         string support.
15043
15044
15045 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15046
15047         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
15048         integer literals into other integer literals.  To be used by
15049         switch. 
15050
15051 2001-11-24  Ravi Pratap  <ravi@ximian.com>
15052
15053         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
15054         some memory.
15055
15056         (EmitDynamicInitializers): Cope with the above since we extract data
15057         directly from ArrayData now.
15058
15059         (ExpectInitializers): Keep track of whether initializers are mandatory
15060         or not.
15061
15062         (Bounds): Make it a hashtable to prevent the same dimension being 
15063         recorded for every element in that dimension.
15064
15065         (EmitDynamicInitializers): Fix bug which prevented the Set array method
15066         from being found.
15067
15068         Also fix bug which was causing the indices to be emitted in the reverse
15069         order.
15070
15071 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15072
15073         * expression.cs (ArrayCreation): Implement the bits that Ravi left
15074         unfinished.  They do not work, because the underlying code is
15075         sloppy.
15076
15077 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15078
15079         * cs-parser.jay: Remove bogus fixme.
15080
15081         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
15082         on Switch statement.
15083
15084 2001-11-23  Ravi Pratap  <ravi@ximian.com>
15085
15086         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
15087         the same. 
15088
15089         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
15090         parameter. Apparently, any expression is allowed. 
15091
15092         (ValidateInitializers): Update accordingly.
15093
15094         (CheckIndices): Fix some tricky bugs thanks to recursion.
15095
15096         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
15097         I was being completely brain-dead.
15098
15099         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
15100         and re-write acordingly.
15101
15102         (DelegateInvocation): Re-write accordingly.
15103
15104         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
15105
15106         (MakeByteBlob): Handle types more correctly.
15107
15108         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
15109         initialization from expressions but it is incomplete because I am a complete
15110         Dodo :-|
15111
15112 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15113
15114         * statement.cs (If.Emit): Fix a bug that generated incorrect code
15115         on If.  Basically, we have to return `true' (ie, we do return to
15116         our caller) only if both branches of the if return.
15117
15118         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
15119         short-circuit operators, handle them as short circuit operators. 
15120
15121         (Cast.DoResolve): Resolve type.
15122         (Cast.Cast): Take an expression as the target type.
15123
15124         * cs-parser.jay (cast_expression): Remove old hack that only
15125         allowed a limited set of types to be handled.  Now we take a
15126         unary_expression and we resolve to a type during semantic
15127         analysis.
15128
15129         Use the grammar productions from Rhys to handle casts (this is
15130         not complete like Rhys syntax yet, we fail to handle that corner
15131         case that C# has regarding (-x), but we will get there.
15132
15133 2001-11-22  Ravi Pratap  <ravi@ximian.com>
15134
15135         * class.cs (EmitFieldInitializer): Take care of the case when we have a
15136         field which is an array type.
15137
15138         * cs-parser.jay (declare_local_variables): Support array initialization too.
15139
15140         * typemanager.cs (MakeKey): Implement.
15141
15142         (everywhere): Use the above appropriately.
15143
15144         * cs-parser.jay (for_statement): Update for array initialization while
15145         declaring variables.
15146
15147         * ecore.cs : The error message was correct, it's the variable's names that
15148         were misleading ;-) Make the code more readable.
15149
15150         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
15151         the correct type etc.
15152
15153         (ConvertExplicit): Handle Enum types by examining the underlying type.
15154
15155 2001-11-21  Ravi Pratap  <ravi@ximian.com>
15156
15157         * parameter.cs (GetCallingConvention): Always return
15158         CallingConventions.Standard for now.
15159
15160 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15161
15162         * expression.cs (Binary.ResolveOperator): Update the values of `l'
15163         and `r' after calling DoNumericPromotions.
15164
15165         * ecore.cs: Fix error message (the types were in the wrong order).
15166
15167         * statement.cs (Foreach.ProbeCollectionType): Need to pass
15168         BindingFlags.Instance as well 
15169
15170         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
15171         implicit int literal conversion in an empty cast so that we
15172         propagate the right type upstream.
15173
15174         (UnboxCast): new class used to unbox value types.
15175         (Expression.ConvertExplicit): Add explicit type conversions done
15176         by unboxing.
15177
15178         (Expression.ImplicitNumericConversion): Oops, forgot to test for
15179         the target type before applying the implicit LongLiterals to ULong
15180         literal cast.
15181
15182 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
15183
15184         * cs-parser.jay (for_statement): Reworked the way For works: now
15185         we declare manually any variables that are introduced in
15186         for_initializer to solve the problem of having out-of-band code
15187         emition (that is what got for broken).
15188
15189         (declaration_statement): Perform the actual variable declaration
15190         that used to be done in local_variable_declaration here.
15191
15192         (local_variable_declaration): Do not declare anything, just pass
15193         the information on a DictionaryEntry
15194
15195 2001-11-20  Ravi Pratap  <ravi@ximian.com>
15196
15197         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
15198         re-write of the logic to now make it recursive.
15199
15200         (UpdateIndices): Re-write accordingly.
15201
15202         Store element data in a separate ArrayData list in the above methods.
15203
15204         (MakeByteBlob): Implement to dump the array data into a byte array.
15205
15206 2001-11-19  Ravi Pratap  <ravi@ximian.com>
15207
15208         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
15209         into CheckIndices.
15210
15211         * constant.cs (Define): Implement.
15212
15213         (EmitConstant): Re-write fully.
15214
15215         Pass in location info.
15216
15217         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
15218         respectively.
15219
15220         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
15221         DictionaryEntry since we need location info too.
15222
15223         (constant_declaration): Update accordingly.
15224
15225         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
15226         code into another method : UpdateIndices.
15227
15228 2001-11-18  Ravi Pratap  <ravi@ximian.com>
15229
15230         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
15231         some type checking etc.
15232
15233 2001-11-17  Ravi Pratap  <ravi@ximian.com>
15234
15235         * expression.cs (ArrayCreation::ValidateInitializers): Implement
15236         bits to provide dimension info if the user skips doing that.
15237
15238         Update second constructor to store the rank correctly.
15239
15240 2001-11-16  Ravi Pratap  <ravi@ximian.com>
15241
15242         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
15243         and try to implement.
15244
15245         * ../errors/cs0150.cs : Add.
15246
15247         * ../errors/cs0178.cs : Add.
15248
15249 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
15250
15251         * statement.cs: Implement foreach on multi-dimensional arrays. 
15252
15253         * parameter.cs (Parameters.GetParameterByName): Also lookup the
15254         name of the params argument.
15255
15256         * expression.cs: Use EmitStoreOpcode to get the right opcode while
15257         initializing the array.
15258
15259         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
15260         we can use this elsewhere.
15261
15262         * statement.cs: Finish implementation of foreach for single
15263         dimension arrays.
15264
15265         * cs-parser.jay: Use an out-of-band stack to pass information
15266         around, I wonder why I need this.
15267
15268         foreach_block: Make the new foreach_block the current_block.
15269
15270         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
15271         function used to return a static Parameters structure.  Used for
15272         empty parameters, as those are created very frequently.
15273
15274         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
15275
15276 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15277
15278         * interface.cs : Default modifier is private, not public. The
15279         make verify test passes again.
15280
15281 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15282
15283         * support.cs (ReflectionParameters): Fix logic to determine
15284         whether the last parameter is a params one. Test 9 passes again.
15285
15286         * delegate.cs (Populate): Register the builders we define with
15287         RegisterParameterForBuilder. Test 19 passes again.
15288
15289         * cs-parser.jay (property_declaration): Reference $6 instead
15290         of $$ to get at the location.
15291
15292         (indexer_declaration): Similar stuff.
15293
15294         (attribute): Ditto.
15295
15296         * class.cs (Property): Register parameters for the Get and Set methods
15297         if they exist. Test 23 passes again.
15298
15299         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
15300         call to EmitArguments as we are sure there aren't any params arguments. 
15301         Test 32 passes again.
15302
15303         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
15304         IndexOutOfRangeException. 
15305
15306         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
15307         Test 33 now passes again.
15308
15309 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
15310
15311         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
15312         broke a bunch of things.  Will have to come up with a better way
15313         of tracking locations.
15314
15315         * statement.cs: Implemented foreach for single dimension arrays.
15316
15317 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15318
15319         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
15320         an error.  This removes the lookup from the critical path.
15321
15322         * cs-parser.jay: Removed use of temporary_loc, which is completely
15323         broken. 
15324
15325 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
15326
15327         * support.cs (ReflectionParameters.ParameterModifier): Report
15328         whether the argument is a PARAMS argument or not.
15329
15330         * class.cs: Set the attribute `ParamArrayAttribute' on the
15331         parameter argument.
15332
15333         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
15334         and cons_param_array_attribute (ConstructorInfo for
15335         ParamArrayAttribute)., 
15336
15337         * codegen.cs: Emit the return using the `Return' statement, that
15338         way we can report the error correctly for missing return values. 
15339
15340         * class.cs (Method.Emit): Clean up.
15341
15342         * expression.cs (Argument.Resolve): Take another argument: the
15343         location where this argument is used.  Notice that this is not
15344         part of the "Argument" class as to reduce the size of the
15345         structure (we know the approximate location anyways).
15346
15347         Test if the argument is a variable-reference, if not, then
15348         complain with a 206.
15349
15350         (Argument.Emit): Emit addresses of variables.
15351
15352         (Argument.FullDesc): Simplify.
15353
15354         (Invocation.DoResolve): Update for Argument.Resolve.
15355
15356         (ElementAccess.DoResolve): ditto.
15357
15358         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
15359         method should be virtual, as this method is always virtual.
15360
15361         (NewDelegate.DoResolve): Update for Argument.Resolve.
15362
15363         * class.cs (ConstructorInitializer.DoResolve): ditto.
15364
15365         * attribute.cs (Attribute.Resolve): ditto.
15366
15367 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
15368
15369         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
15370
15371         * expression.cs (ParameterReference): Drop IStackStorage and implement
15372         IAssignMethod instead. 
15373
15374         (LocalVariableReference): ditto.
15375
15376         * ecore.cs (FieldExpr): Drop IStackStorage and implement
15377         IAssignMethod instead. 
15378
15379 2001-11-13  Miguel de Icaza <miguel@ximian.com>
15380
15381         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
15382         enumerations that are used in heavily used structures derive from
15383         byte in a laughable and pathetic attempt to reduce memory usage.
15384         This is the kind of pre-optimzations that you should not do at
15385         home without adult supervision.
15386
15387         * expression.cs (UnaryMutator): New class, used to handle ++ and
15388         -- separatedly from the other unary operators.  Cleans up the
15389         code, and kills the ExpressionStatement dependency in Unary.
15390
15391         (Unary): Removed `method' and `Arguments' from this class, making
15392         it smaller, and moving it all to SimpleCall, so I can reuse this
15393         code in other locations and avoid creating a lot of transient data
15394         strucutres when not required.
15395
15396         * cs-parser.jay: Adjust for new changes.
15397
15398 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
15399
15400         * enum.cs (Enum.Populate): If there is a failure during
15401         definition, return
15402
15403         * cs-parser.jay (opt_enum_base): we used to catch type errors
15404         here, but this is really incorrect.  The type error should be
15405         catched during semantic analysis.
15406
15407 2001-12-11  Ravi Pratap  <ravi@ximian.com>
15408
15409         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
15410         current_local_parameters as expected since I, in my stupidity, had forgotten
15411         to do this :-)
15412
15413         * attribute.cs (GetValidPlaces): Fix stupid bug.
15414
15415         * class.cs (Method::Emit): Perform check on applicability of attributes.
15416
15417         (Constructor::Emit): Ditto.
15418
15419         (Field::Emit): Ditto.
15420
15421         (Field.Location): Store location information.
15422
15423         (Property, Event, Indexer, Operator): Ditto.
15424
15425         * cs-parser.jay (field_declaration): Pass in location for each field.
15426
15427         * ../errors/cs0592.cs : Add.
15428
15429 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15430
15431         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
15432
15433         (InitCoreTypes): Update accordingly.
15434
15435         (RegisterAttrType, LookupAttr): Implement.
15436
15437         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
15438         info about the same.
15439
15440         (Resolve): Update to populate the above as necessary.
15441
15442         (Error592): Helper.
15443
15444         (GetValidPlaces): Helper to the above.
15445
15446         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
15447
15448         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
15449
15450 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15451
15452         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
15453
15454         * ../errors/cs0617.cs : Add.
15455
15456 2001-11-11  Ravi Pratap  <ravi@ximian.com>
15457
15458         * enum.cs (Emit): Rename to Populate to be more consistent with what
15459         we expect it to do and when exactly it is called.
15460
15461         * class.cs, rootcontext.cs : Update accordingly.
15462
15463         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
15464         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
15465
15466         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
15467
15468         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
15469         of a fieldinfo using the above, when dealing with a FieldBuilder.
15470
15471 2001-11-10  Ravi Pratap  <ravi@ximian.com>
15472
15473         * ../errors/cs0031.cs : Add.
15474
15475         * ../errors/cs1008.cs : Add.
15476
15477         * ../errrors/cs0543.cs : Add.
15478
15479         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
15480         enum type.
15481
15482         (FindMembers): Implement.
15483
15484         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
15485         enums and delegates too.
15486
15487         (enum_types): Rename to builder_to_enum.
15488
15489         (delegate_types): Rename to builder_to_delegate.
15490
15491         * delegate.cs (FindMembers): Implement.
15492
15493 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15494
15495         * typemanager.cs (IsEnumType): Implement.
15496
15497         * enum.cs (Emit): Re-write parts to account for the underlying type
15498         better and perform checking etc.
15499
15500         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15501         of the underlying type.
15502
15503         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15504         value
15505
15506         * enum.cs (error31): Helper to report error #31.
15507
15508         * cs-parser.jay (enum_declaration): Store location of each member too.
15509
15510         * enum.cs (member_to_location): New hashtable. 
15511
15512         (AddEnumMember): Update location hashtable.
15513
15514         (Emit): Use the location of each member while reporting errors.
15515
15516 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15517
15518         * cs-parser.jay: A for_initializer if is a
15519         local_variable_declaration really ammount to have an implicit
15520         block with the variable declaration and no initializer for for.
15521
15522         * statement.cs (For.Emit): Cope with null initializers.
15523
15524         This fixes the infinite loop on for initializers.
15525
15526 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15527
15528         * enum.cs: More cleanup.
15529
15530         * ecore.cs: Remove dead code.
15531
15532         * class.cs (Property.Emit): More simplification.
15533         (Event.Emit): ditto.
15534
15535         Reworked to have less levels of indentation.
15536
15537 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15538
15539         * class.cs (Property): Emit attributes.
15540
15541         (Field): Ditto.
15542
15543         (Event): Ditto.
15544
15545         (Indexer): Ditto.
15546
15547         (Operator): Ditto.
15548
15549         * enum.cs (Emit): Ditto.
15550
15551         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15552         Enums too.
15553
15554         * class.cs (Field, Event, etc.): Move attribute generation into the
15555         Emit method everywhere.
15556
15557         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15558         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15559         as we had no way of defining nested enums !
15560
15561         * rootcontext.cs : Adjust code accordingly.
15562
15563         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15564
15565 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15566
15567         * expression.cs (EvalConstantExpression): Move into ecore.cs
15568
15569         * enum.cs (Enum): Rename some members and make them public and readonly
15570         according to our convention.
15571
15572         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15573         nothing else.
15574
15575         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15576
15577         (Enum::Emit): Write a simple version for now which doesn't try to compute
15578         expressions. I shall modify this to be more robust in just a while.
15579
15580         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15581
15582         (TypeContainer::CloseType): Create the Enum types too.
15583
15584         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15585
15586         * expression.cs (EvalConstantExpression): Get rid of completely.
15587
15588         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15589         user-defined values and other cases.
15590
15591         (IsValidEnumLiteral): Helper function.
15592
15593         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15594         out there in the case we had a literal FieldExpr.
15595
15596         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15597
15598         (Literalize): Revamp a bit to take two arguments.
15599
15600         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15601
15602 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15603
15604         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15605
15606         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15607
15608         (Resolve): Use the above to ensure we have proper initializers.
15609
15610 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15611
15612         * expression.cs (Expression::EvalConstantExpression): New method to 
15613         evaluate constant expressions.
15614
15615         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15616
15617 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15618
15619         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15620         in an array.
15621
15622         (Binary.ResolveOperator): Handle operator != (object a, object b)
15623         and operator == (object a, object b);
15624
15625         (Binary.DoNumericPromotions): Indicate whether the numeric
15626         promotion was possible.
15627
15628         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15629         Implement.  
15630
15631         Made the ArrayAccess implement interface IAssignMethod instead of
15632         IStackStore as the order in which arguments are passed reflects
15633         this.
15634
15635         * assign.cs: Instead of using expr.ExprClass to select the way of
15636         assinging, probe for the IStackStore/IAssignMethod interfaces.
15637
15638         * typemanager.cs: Load InitializeArray definition.
15639
15640         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15641         static data that can be used to initialize arrays. 
15642
15643 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15644
15645         * expression.cs: Handle operator== and operator!= for booleans.
15646
15647         (Conditioal.Reduce): Implement reducer for the ?: operator.
15648
15649         (Conditional.Resolve): Implement dead code elimination.
15650
15651         (Binary.Resolve): Catch string literals and return a new
15652         concatenated string.
15653
15654         (Unary.Reduce): Implement reduction of unary expressions.
15655
15656         * ecore.cs: Split out the expression core handling here.
15657
15658         (Expression.Reduce): New method used to perform constant folding
15659         and CSE.  This is needed to support constant-expressions. 
15660
15661         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15662         targets, and optimize for !x.
15663
15664 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15665
15666         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15667         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15668         set custom atttributes.
15669
15670         * literal.cs (Literal::GetValue): New abstract method to return the actual
15671         value of the literal, cast as an object.
15672
15673         (*Literal): Implement GetValue method.
15674
15675         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15676         expressions to the arraylist but objects of type Argument.
15677
15678         * class.cs (TypeContainer::Emit): Emit our attributes too.
15679
15680         (Method::Emit, Constructor::Emit): Ditto.
15681
15682         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15683         to be ignoring earlier.
15684
15685 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15686
15687         * attribute.cs (AttributeSection::Define): Implement to do the business
15688         of constructing a CustomAttributeBuilder.
15689
15690         (Attribute): New trivial class. Increases readability of code.  
15691
15692         * cs-parser.jay : Update accordingly.
15693
15694         (positional_argument_list, named_argument_list, named_argument): New rules
15695
15696         (attribute_arguments): Use the above so that we are more correct.
15697
15698 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15699
15700         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15701         to perform all checks for a method with a params parameter.
15702
15703         (Invocation::OverloadResolve): Update to use the above method and therefore
15704         cope correctly with params method invocations.
15705
15706         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15707         params too.
15708
15709         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15710         constructors in our parent too because we can't afford to miss out on 
15711         protected ones ;-)
15712
15713         * attribute.cs (AttributeSection): New name for the class Attribute
15714
15715         Other trivial changes to improve readability.
15716
15717         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15718         use the new class names.
15719
15720 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15721
15722         * class.cs (Method::Define): Complete definition for params types too
15723
15724         (Indexer::Define): Ditto.
15725
15726         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15727         Cope everywhere with a request for info about the array parameter.
15728
15729 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15730
15731         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15732
15733         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15734         local_variable_type to extract the string corresponding to the type.
15735
15736         (local_variable_type): Fixup the action to use the new helper method.
15737
15738         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15739         go.
15740
15741         * expression.cs : Clean out code which uses the above.
15742
15743 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15744
15745         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15746         and bale out if necessary by returning a false.
15747
15748         (RegisterProperty): Ditto.
15749
15750         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15751         and print out appropriate error messages.
15752
15753         * interface.cs (everywhere): Ditto.
15754
15755         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15756         location to constructor.
15757
15758         * class.cs (Property, Event, Indexer): Update accordingly.
15759
15760         * ../errors/cs111.cs : Added.
15761
15762         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15763         of a method, as laid down by the spec.
15764
15765         (Invocation::OverloadResolve): Use the above method.
15766
15767 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15768
15769         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15770         now take a TypeContainer and a Parameters object.
15771
15772         (ParameterData): Modify return type of ParameterModifier method to be 
15773         Parameter.Modifier and not a string.
15774
15775         (ReflectionParameters, InternalParameters): Update accordingly.
15776
15777         * expression.cs (Argument::GetParameterModifier): Same here.
15778
15779         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15780         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15781         symbol in it at all so maybe this is only for now.
15782
15783 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15784
15785         * support.cs (InternalParameters): Constructor now takes an extra argument 
15786         which is the actual Parameters class.
15787
15788         (ParameterDesc): Update to provide info on ref/out modifiers.
15789
15790         * class.cs (everywhere): Update call to InternalParameters to pass in
15791         the second argument too.
15792
15793         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15794         to return the modifier info [ref/out etc]
15795
15796         (InternalParameters, ReflectionParameters): Implement the above.
15797
15798         * expression.cs (Argument::ParameterModifier): Similar function to return
15799         info about the argument's modifiers.
15800
15801         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15802         too.
15803
15804         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15805         a new SetFormalParameters object which we pass to InternalParameters.
15806
15807 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15808
15809         * expression.cs (NewArray): Merge into the ArrayCreation class.
15810
15811 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15812
15813         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15814         NewUserdefinedArray into one as there wasn't much of a use in having
15815         two separate ones.
15816
15817         * expression.cs (Argument): Change field's name to ArgType from Type.
15818
15819         (Type): New readonly property which returns the proper type, taking into 
15820         account ref/out modifiers.
15821
15822         (everywhere): Adjust code accordingly for the above.
15823
15824         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15825         whether we are emitting for a ref or out parameter.
15826
15827         * expression.cs (Argument::Emit): Use the above field to set the state.
15828
15829         (LocalVariableReference::Emit): Update to honour the flag and emit the
15830         right stuff.
15831
15832         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15833
15834         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15835
15836         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15837
15838         (ReflectionParameters, InternalParameters): Implement the above method.
15839
15840         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15841         reporting errors.
15842
15843         (Invocation::FullMethodDesc): Ditto. 
15844
15845 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15846
15847         * cs-parser.jay: Add extra production for the second form of array
15848         creation. 
15849
15850         * expression.cs (ArrayCreation): Update to reflect the above
15851         change. 
15852
15853         * Small changes to prepare for Array initialization.
15854
15855 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15856
15857         * typemanager.cs (ImplementsInterface): interface might be null;
15858         Deal with this problem;
15859
15860         Also, we do store negative hits on the cache (null values), so use
15861         this instead of calling t.GetInterfaces on the type everytime.
15862
15863 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15864
15865         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15866
15867         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15868         split functionality out into different classes.
15869
15870         (New::FormArrayType): Move into NewBuiltinArray.
15871
15872         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15873         quite useless.
15874
15875         (NewBuiltinArray): New class to handle creation of built-in arrays.
15876
15877         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15878         account creation of one-dimensional arrays.
15879
15880         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15881
15882         (NewUserdefinedArray::DoResolve): Implement.
15883
15884         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15885
15886         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15887         we maintain inside the TypeManager. This is necessary to perform lookups on the
15888         module builder.
15889
15890         (LookupType): Update to perform GetType on the module builders too.     
15891
15892         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15893
15894         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15895
15896 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15897
15898         * expression.cs (New::DoResolve): Implement guts of array creation.
15899
15900         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15901
15902 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15903
15904         * expression.cs: Fix bug I introduced lsat night that broke
15905         Delegates. 
15906
15907         (Expression.Resolve): Report a 246 error (can not resolve name)
15908         if we find a SimpleName in the stream.
15909
15910         (Expression.ResolveLValue): Ditto.
15911
15912         (Expression.ResolveWithSimpleName): This function is a variant of
15913         ResolveName, this one allows SimpleNames to be returned without a
15914         warning.  The only consumer of SimpleNames is MemberAccess
15915
15916 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15917
15918         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15919         might arrive here.  I have my doubts that this is correct.
15920
15921         * statement.cs (Lock): Implement lock statement.
15922
15923         * cs-parser.jay: Small fixes to support `lock' and `using'
15924
15925         * cs-tokenizer.cs: Remove extra space
15926
15927         * driver.cs: New flag --checked, allows to turn on integer math
15928         checking. 
15929
15930         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15931         Threading.Monitor.Exit 
15932
15933 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15934
15935         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15936         Expression Class to be IndexerAccess.
15937
15938         Notice that Indexer::DoResolve sets the eclass to Value.
15939
15940 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15941
15942         * class.cs (TypeContainer::Emit): Emit code for indexers.
15943
15944         * assign.cs (IAssignMethod): New interface implemented by Indexers
15945         and Properties for handling assignment.
15946
15947         (Assign::Emit): Simplify and reuse code. 
15948
15949         * expression.cs (IndexerAccess, PropertyExpr): Implement
15950         IAssignMethod, clean up old code. 
15951
15952 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15953
15954         * typemanager.cs (ImplementsInterface): New method to determine if a type
15955         implements a given interface. Provides a nice cache too.
15956
15957         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15958         method.
15959
15960         (ConvertReferenceExplicit): Ditto.
15961
15962         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15963         various methods, with correct names etc.
15964
15965         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15966         Operator.UnaryNegation.
15967
15968         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15969         we have a unary plus or minus operator.
15970
15971         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15972         UnaryMinus.
15973
15974         * everywhere : update accordingly.
15975
15976         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15977         respectively.
15978
15979         * class.cs (Method::Define): For the case where we are implementing a method
15980         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15981         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15982
15983 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15984
15985         * interface.cs (FindMembers): Implement to work around S.R.E
15986         lameness.
15987
15988         * typemanager.cs (IsInterfaceType): Implement.
15989
15990         (FindMembers): Update to handle interface types too.
15991
15992         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15993         use IsAssignableFrom as that is not correct - it doesn't work.
15994
15995         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15996         and accordingly override EmitStatement.
15997
15998         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15999         using the correct logic :-)
16000
16001 2001-10-19  Ravi Pratap  <ravi@ximian.com>
16002
16003         * ../errors/cs-11.cs : Add to demonstrate error -11 
16004
16005 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
16006
16007         * assign.cs (Assign::Resolve): Resolve right hand side first, and
16008         then pass this as a hint to ResolveLValue.
16009
16010         * expression.cs (FieldExpr): Add Location information
16011
16012         (FieldExpr::LValueResolve): Report assignment to readonly
16013         variable. 
16014
16015         (Expression::ExprClassFromMemberInfo): Pass location information.
16016
16017         (Expression::ResolveLValue): Add new method that resolves an
16018         LValue. 
16019
16020         (Expression::DoResolveLValue): Default invocation calls
16021         DoResolve. 
16022
16023         (Indexers): New class used to keep track of indexers in a given
16024         Type. 
16025
16026         (IStackStore): Renamed from LValue, as it did not really describe
16027         what this did.  Also ResolveLValue is gone from this interface and
16028         now is part of Expression.
16029
16030         (ElementAccess): Depending on the element access type
16031
16032         * typemanager.cs: Add `indexer_name_type' as a Core type
16033         (System.Runtime.CompilerServices.IndexerNameAttribute)
16034
16035         * statement.cs (Goto): Take a location.
16036
16037 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16038
16039         * delegate.cs (Delegate::VerifyDelegate): New method to verify
16040         if two delegates are compatible.
16041
16042         (NewDelegate::DoResolve): Update to take care of the case when
16043         we instantiate a delegate from another delegate.
16044
16045         * typemanager.cs (FindMembers): Don't even try to look up members
16046         of Delegate types for now.
16047
16048 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16049
16050         * delegate.cs (NewDelegate): New class to take care of delegate
16051         instantiation.
16052
16053         * expression.cs (New): Split the delegate related code out into 
16054         the NewDelegate class.
16055
16056         * delegate.cs (DelegateInvocation): New class to handle delegate 
16057         invocation.
16058
16059         * expression.cs (Invocation): Split out delegate related code into
16060         the DelegateInvocation class.
16061
16062 2001-10-17  Ravi Pratap  <ravi@ximian.com>
16063
16064         * expression.cs (New::DoResolve): Implement delegate creation fully
16065         and according to the spec.
16066
16067         (New::DoEmit): Update to handle delegates differently.
16068
16069         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
16070         because of which we were printing out arguments in reverse order !
16071
16072         * delegate.cs (VerifyMethod): Implement to check if the given method
16073         matches the delegate.
16074
16075         (FullDelegateDesc): Implement.
16076
16077         (VerifyApplicability): Implement.
16078
16079         * expression.cs (Invocation::DoResolve): Update to accordingly handle
16080         delegate invocations too.
16081
16082         (Invocation::Emit): Ditto.
16083
16084         * ../errors/cs1593.cs : Added.
16085
16086         * ../errors/cs1594.cs : Added.
16087
16088         * delegate.cs (InstanceExpression, TargetMethod): New properties.
16089
16090 2001-10-16  Ravi Pratap  <ravi@ximian.com>
16091
16092         * typemanager.cs (intptr_type): Core type for System.IntPtr
16093
16094         (InitCoreTypes): Update for the same.
16095
16096         (iasyncresult_type, asynccallback_type): Ditto.
16097
16098         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
16099         correct.
16100
16101         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
16102         too.
16103
16104         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
16105         the builders for the 4 members of a delegate type :-)
16106
16107         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
16108         type.
16109
16110         * expression.cs (New::DoResolve): Implement guts for delegate creation.
16111
16112         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
16113
16114 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
16115
16116         * statement.cs (Break::Emit): Implement.   
16117         (Continue::Emit): Implement.
16118
16119         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16120         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16121         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16122         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
16123         end loop
16124
16125         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
16126         properties that track the label for the current loop (begin of the
16127         loop and end of the loop).
16128
16129 2001-10-15  Ravi Pratap  <ravi@ximian.com>
16130
16131         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
16132         use of emitting anything at all.
16133
16134         * class.cs, rootcontext.cs : Get rid of calls to the same.
16135
16136         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
16137
16138         (Populate): Define the constructor correctly and set the implementation
16139         attributes.
16140
16141         * typemanager.cs (delegate_types): New hashtable to hold delegates that
16142         have been defined.
16143
16144         (AddDelegateType): Implement.
16145
16146         (IsDelegateType): Implement helper method.
16147
16148         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
16149
16150         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
16151         and accordingly handle it.
16152
16153         * delegate.cs (Populate): Take TypeContainer argument.
16154         Implement bits to define the Invoke method. However, I still haven't figured out
16155         how to take care of the native int bit :-(
16156
16157         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
16158         Qualify the name of the delegate, not its return type !
16159
16160         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
16161         conversion.
16162
16163         (StandardConversionExists): Checking for array types turns out to be recursive.
16164
16165         (ConvertReferenceExplicit): Implement array conversion.
16166
16167         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
16168
16169 2001-10-12  Ravi Pratap  <ravi@ximian.com>
16170
16171         * cs-parser.jay (delegate_declaration): Store the fully qualified
16172         name as it is a type declaration.
16173
16174         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
16175         readonly.
16176
16177         (DefineDelegate): Renamed from Define. Does the same thing essentially,
16178         as TypeContainer::DefineType.
16179
16180         (Populate): Method in which all the definition of the various methods (Invoke)
16181         etc is done.
16182
16183         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
16184         see.
16185
16186         (CloseDelegate): Finally creates the delegate.
16187
16188         * class.cs (TypeContainer::DefineType): Update to define delegates.
16189         (Populate, Emit and CloseType): Do the same thing here too.
16190
16191         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
16192         delegates in all these operations.
16193
16194 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
16195
16196         * expression.cs: LocalTemporary: a new expression used to
16197         reference a temporary that has been created.
16198
16199         * assign.cs: Handle PropertyAccess back here, so that we can
16200         provide the proper semantic access to properties.
16201
16202         * expression.cs (Expression::ConvertReferenceExplicit): Implement
16203         a few more explicit conversions. 
16204
16205         * modifiers.cs: `NEW' modifier maps to HideBySig.
16206
16207         * expression.cs (PropertyExpr): Make this into an
16208         ExpressionStatement, and support the EmitStatement code path. 
16209
16210         Perform get/set error checking, clean up the interface.
16211
16212         * assign.cs: recognize PropertyExprs as targets, and if so, turn
16213         them into toplevel access objects.
16214
16215 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
16216
16217         * expression.cs: PropertyExpr::PropertyExpr: use work around the
16218         SRE.
16219
16220         * typemanager.cs: Keep track here of our PropertyBuilders again to
16221         work around lameness in SRE.
16222
16223 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
16224
16225         * expression.cs (LValue::LValueResolve): New method in the
16226         interface, used to perform a second resolution pass for LValues. 
16227
16228         (This::DoResolve): Catch the use of this in static methods.
16229
16230         (This::LValueResolve): Implement.
16231
16232         (This::Store): Remove warning, assigning to `this' in structures
16233         is 
16234
16235         (Invocation::Emit): Deal with invocation of
16236         methods on value types.  We need to pass the address to structure
16237         methods rather than the object itself.  (The equivalent code to
16238         emit "this" for structures leaves the entire structure on the
16239         stack instead of a pointer to it). 
16240
16241         (ParameterReference::DoResolve): Compute the real index for the
16242         argument based on whether the method takes or not a `this' pointer
16243         (ie, the method is static).
16244
16245         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
16246         value types returned from functions when we need to invoke a
16247         method on the sturcture.
16248
16249
16250 2001-10-11  Ravi Pratap  <ravi@ximian.com>
16251
16252         * class.cs (TypeContainer::DefineType): Method to actually do the business of
16253         defining the type in the Modulebuilder or Typebuilder. This is to take
16254         care of nested types which need to be defined on the TypeBuilder using
16255         DefineNestedMethod.
16256
16257         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
16258         methods in RootContext, only ported to be part of TypeContainer.
16259
16260         (TypeContainer::GetInterfaceOrClass): Ditto.
16261
16262         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
16263
16264         * interface.cs (Interface::DefineInterface): New method. Does exactly
16265         what RootContext.CreateInterface did earlier, only it takes care of nested types 
16266         too.
16267
16268         (Interface::GetInterfaces): Move from RootContext here and port.
16269
16270         (Interface::GetInterfaceByName): Same here.
16271
16272         * rootcontext.cs (ResolveTree): Re-write.
16273
16274         (PopulateTypes): Re-write.
16275
16276         * class.cs (TypeContainer::Populate): Populate nested types too.
16277         (TypeContainer::Emit): Emit nested members too.
16278
16279         * typemanager.cs (AddUserType): Do not make use of the FullName property,
16280         instead just use the name argument passed in as it is already fully
16281         qualified.
16282
16283         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
16284         to TypeContainer mapping to see if a type is user-defined.
16285
16286         * class.cs (TypeContainer::CloseType): Implement. 
16287
16288         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
16289         the default constructor.
16290
16291         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
16292         twice.
16293
16294         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
16295
16296         * interface.cs (CloseType): Create the type here.
16297
16298         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
16299         the hierarchy.
16300
16301         Remove all the methods which are now in TypeContainer.
16302
16303 2001-10-10  Ravi Pratap  <ravi@ximian.com>
16304
16305         * delegate.cs (Define): Re-write bits to define the delegate
16306         correctly.
16307
16308 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
16309
16310         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
16311
16312         * expression.cs (ImplicitReferenceConversion): handle null as well
16313         as a source to convert to any reference type.
16314
16315         * statement.cs (Return): Perform any implicit conversions to
16316         expected return type.  
16317
16318         Validate use of return statement.  
16319
16320         * codegen.cs (EmitContext): Pass the expected return type here.
16321
16322         * class.cs (Method, Constructor, Property): Pass expected return
16323         type to EmitContext.
16324
16325 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
16326
16327         * expression.cs: Make DoResolve take an EmitContext instead of a
16328         TypeContainer.
16329
16330         Replaced `l' and `location' for `loc', for consistency.
16331
16332         (Error, Warning): Remove unneeded Tc argument.
16333
16334         * assign.cs, literal.cs, constant.cs: Update to new calling
16335         convention. 
16336
16337         * codegen.cs: EmitContext now contains a flag indicating whether
16338         code is being generated in a static method or not.
16339
16340         * cs-parser.jay: DecomposeQI, new function that replaces the old
16341         QualifiedIdentifier.  Now we always decompose the assembled
16342         strings from qualified_identifier productions into a group of
16343         memberaccesses.
16344
16345 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
16346
16347         * rootcontext.cs: Deal with field-less struct types correctly now
16348         by passing the size option to Define Type.
16349
16350         * class.cs: Removed hack that created one static field. 
16351
16352 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16353
16354         * statement.cs: Moved most of the code generation here. 
16355
16356 2001-10-09  Ravi Pratap  <ravi@ximian.com>
16357
16358         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
16359         seem very right.
16360
16361         (ElementAccess): Remove useless bits for now - keep checks as the spec
16362         says.
16363
16364 2001-10-08  Ravi Pratap  <ravi@ximian.com>
16365
16366         * expression.cs (ElementAccess::DoResolve): Remove my crap code
16367         and start performing checks according to the spec.
16368
16369 2001-10-07  Ravi Pratap  <ravi@ximian.com>
16370
16371         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
16372         rank_specifiers instead.
16373
16374         (rank_specifiers): Change the order in which the rank specifiers are stored
16375
16376         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
16377
16378         * expression.cs (ElementAccess): Implement the LValue interface too.
16379
16380 2001-10-06  Ravi Pratap  <ravi@ximian.com>
16381
16382         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
16383         except that user defined conversions are not included.
16384
16385         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
16386         perform the conversion of the return type, if necessary.
16387
16388         (New::DoResolve): Check whether we are creating an array or an object
16389         and accordingly do the needful.
16390
16391         (New::Emit): Same here.
16392
16393         (New::DoResolve): Implement guts of array creation.
16394
16395         (New::FormLookupType): Helper function.
16396
16397 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16398
16399         * codegen.cs: Removed most of the code generation here, and move the
16400         corresponding code generation bits to the statement classes. 
16401
16402         Added support for try/catch/finalize and throw.
16403
16404         * cs-parser.jay: Added support for try/catch/finalize.
16405
16406         * class.cs: Catch static methods having the flags override,
16407         virtual or abstract.
16408
16409         * expression.cs (UserCast): This user cast was not really doing
16410         what it was supposed to do.  Which is to be born in fully resolved
16411         state.  Parts of the resolution were being performed at Emit time! 
16412
16413         Fixed this code.
16414
16415 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16416
16417         * expression.cs: Implicity convert the result from UserCast.
16418
16419 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16420
16421         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
16422         prevented it from working correctly. 
16423
16424         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
16425         merely ConvertImplicit.
16426
16427 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16428
16429         * typemanager.cs: Make the LookupTypeContainer function static,
16430         and not per-instance.  
16431
16432         * class.cs: Make static FindMembers (the one that takes a Type
16433         argument). 
16434
16435         * codegen.cs: Add EmitForeach here.
16436
16437         * cs-parser.jay: Make foreach a toplevel object instead of the
16438         inline expansion, as we need to perform semantic analysis on it. 
16439
16440 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16441
16442         * expression.cs (Expression::ImplicitUserConversion): Rename to
16443         UserDefinedConversion.
16444
16445         (Expression::UserDefinedConversion): Take an extra argument specifying 
16446         whether we look for explicit user conversions too.
16447
16448         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
16449
16450         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
16451
16452         (ExplicitUserConversion): Make it a call to UserDefinedConversion
16453         with the appropriate arguments.
16454
16455         * cs-parser.jay (cast_expression): Record location too.
16456
16457         * expression.cs (Cast): Record location info.
16458
16459         (Expression::ConvertExplicit): Take location argument.
16460
16461         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
16462         to determine if we are doing explicit conversions.
16463
16464         (UserCast::Emit): Update accordingly.
16465
16466         (Expression::ConvertExplicit): Report an error if everything fails.
16467
16468         * ../errors/cs0030.cs : Add.
16469
16470 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
16471
16472         * modifiers.cs: If the ABSTRACT keyword is present, also set the
16473         virtual and newslot bits. 
16474
16475         * class.cs (TypeContainer::RegisterRequiredImplementations):
16476         Record methods we need.
16477
16478         (TypeContainer::MakeKey): Helper function to make keys for
16479         MethodBases, since the Methodbase key is useless.
16480
16481         (TypeContainer::Populate): Call RegisterRequiredImplementations
16482         before defining the methods.   
16483
16484         Create a mapping for method_builders_to_methods ahead of time
16485         instead of inside a tight loop.
16486
16487         (::RequireMethods):  Accept an object as the data to set into the
16488         hashtable so we can report interface vs abstract method mismatch.
16489
16490 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16491
16492         * report.cs: Make all of it static.
16493
16494         * rootcontext.cs: Drop object_type and value_type computations, as
16495         we have those in the TypeManager anyways.
16496
16497         Drop report instance variable too, now it is a global.
16498
16499         * driver.cs: Use try/catch on command line handling.
16500
16501         Add --probe option to debug the error reporting system with a test
16502         suite. 
16503
16504         * report.cs: Add support for exiting program when a probe
16505         condition is reached.
16506
16507 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16508
16509         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16510         we do a forcible conversion regardless of type, to check if 
16511         ForceConversion returns a null.
16512
16513         (Binary::error19): Use location to report error.
16514
16515         (Unary::error23): Use location here too.
16516
16517         * ../errors/cs0019.cs : Check in.
16518
16519         * ../errors/cs0023.cs : Check in.
16520
16521         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16522         case of a non-null MethodInfo object with a length of 0 !
16523
16524         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16525         an applicable member - according to the spec :-)
16526         Also fix logic to find members in base types.
16527
16528         (Unary::ResolveOperator): Same here.
16529
16530         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16531         as I was getting thoroughly confused between this and error19 :-)
16532
16533         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16534         (::FindMostEncompassedType): Implement.
16535         (::FindMostEncompassingType): Implement.
16536         (::StandardConversionExists): Implement.
16537
16538         (UserImplicitCast): Re-vamp. We now need info about most specific
16539         source and target types so that we can do the necessary conversions.
16540
16541         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16542         mathematical union with no duplicates.
16543
16544 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16545
16546         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16547         in order from base classes to child classes, so that we can in
16548         child classes look up in our parent for method names and
16549         attributes (required for handling abstract, virtual, new, override
16550         constructs: we need to instrospect our base class, and if we dont
16551         populate the classes in order, the introspection might be
16552         incorrect.  For example, a method could query its parent before
16553         the parent has any methods and would determine that the parent has
16554         no abstract methods (while it could have had them)).
16555
16556         (RootContext::CreateType): Record the order in which we define the
16557         classes.
16558
16559 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16560
16561         * class.cs (TypeContainer::Populate): Also method definitions can
16562         fail now, keep track of this.
16563
16564         (TypeContainer::FindMembers): Implement support for
16565         DeclaredOnly/noDeclaredOnly flag.
16566
16567         (Constructor::Emit) Return the ConstructorBuilder.
16568
16569         (Method::Emit) Return the MethodBuilder. 
16570         Check for abstract or virtual methods to be public.
16571
16572         * rootcontext.cs (RootContext::CreateType): Register all the
16573         abstract methods required for the class to be complete and the
16574         interface methods that must be implemented. 
16575
16576         * cs-parser.jay: Report error 501 (method requires body if it is
16577         not marked abstract or extern).
16578
16579         * expression.cs (TypeOf::Emit): Implement.
16580
16581         * typemanager.cs: runtime_handle_type, new global type.
16582
16583         * class.cs (Property::Emit): Generate code for properties.
16584
16585 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16586
16587         * expression.cs (Unary::ResolveOperator): Find operators on base type
16588         too - we now conform exactly to the spec.
16589
16590         (Binary::ResolveOperator): Same here.
16591
16592         * class.cs (Operator::Define): Fix minor quirk in the tests.
16593
16594         * ../errors/cs0215.cs : Added.
16595
16596         * ../errors/cs0556.cs : Added.
16597
16598         * ../errors/cs0555.cs : Added.
16599
16600 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16601
16602         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16603         single integer which is really efficient
16604
16605 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16606
16607         *  expression.cs (Expression::ImplicitUserConversion): Use location
16608         even in the case when we are examining True operators.
16609  
16610         * class.cs (Operator::Define): Perform extensive checks to conform
16611         with the rules for operator overloading in the spec.
16612
16613         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16614         some of the other conversions mentioned in the spec.
16615
16616         * typemanager.cs (array_type): New static member for the System.Array built-in
16617         type.
16618
16619         (cloneable_interface): For System.ICloneable interface.
16620
16621         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16622         we start resolving the tree and populating types.
16623
16624         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16625  
16626 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16627
16628         * expression.cs (Expression::ExprClassFromMemberInfo,
16629         Expression::Literalize): Create literal expressions from
16630         FieldInfos which are literals.
16631
16632         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16633         type casts, because they were wrong.  The test suite in tests
16634         caught these ones.
16635
16636         (ImplicitNumericConversion): ushort to ulong requires a widening
16637         cast. 
16638
16639         Int32 constant to long requires widening cast as well.
16640
16641         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16642         for integers because the type on the stack is not i4.
16643
16644 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16645
16646         * expression.cs (report118): require location argument. 
16647
16648         * parameter.cs: Do not dereference potential null value.
16649
16650         * class.cs: Catch methods that lack the `new' keyword when
16651         overriding a name.  Report warnings when `new' is used without
16652         anything being there to override.
16653
16654         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16655
16656         * class.cs: Only add constructor to hashtable if it is non-null
16657         (as now constructors can fail on define).
16658
16659         (TypeManager, Class, Struct): Take location arguments.
16660
16661         Catch field instance initialization in structs as errors.
16662
16663         accepting_filter: a new filter for FindMembers that is static so
16664         that we dont create an instance per invocation.
16665
16666         (Constructor::Define): Catch errors where a struct constructor is
16667         parameterless 
16668
16669         * cs-parser.jay: Pass location information for various new
16670         constructs. 
16671
16672         * delegate.cs (Delegate): take a location argument.
16673
16674         * driver.cs: Do not call EmitCode if there were problesm in the
16675         Definition of the types, as many Builders wont be there. 
16676
16677         * decl.cs (Decl::Decl): Require a location argument.
16678
16679         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16680         into integers, and find the most appropiate integer for it.
16681
16682         * literal.cs: Implement ULongLiteral.
16683
16684         * rootcontext.cs: Provide better information about the location of
16685         failure when CreateType fails.
16686
16687 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16688
16689         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16690         as well.
16691
16692         * expression.cs (Binary::CheckShiftArguments): Add missing type
16693         computation.
16694         (Binary::ResolveOperator): Add type to the logical and and logical
16695         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16696         before.
16697
16698         (Binary::DoNumericPromotions): In the case where either argument
16699         is ulong (and most signed types combined with ulong cause an
16700         error) perform implicit integer constant conversions as well.
16701
16702 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16703
16704         * expression.cs (UserImplicitCast): Method should always be
16705         non-null. 
16706         (Invocation::BetterConversion): Simplified test for IntLiteral.
16707
16708         (Expression::ImplicitNumericConversion): Split this routine out.
16709         Put the code that performs implicit constant integer conversions
16710         here. 
16711
16712         (Expression::Resolve): Become a wrapper around DoResolve so we can
16713         check eclass and type being set after resolve.
16714
16715         (Invocation::Badness): Remove this dead function
16716
16717         (Binary::ResolveOperator): Do not compute the expensive argumnets
16718         unless we have a union for it.
16719
16720         (Probe::Emit): Is needs to do an isinst and then
16721         compare against null.
16722
16723         (::CanConvert): Added Location argument.  If the Location argument
16724         is null (Location.Null), then we do not report errors.  This is
16725         used by the `probe' mechanism of the Explicit conversion.  We do
16726         not want to generate an error for something that the user
16727         explicitly requested to be casted.  But the pipeline for an
16728         explicit cast first tests for potential implicit casts.
16729
16730         So for now, if the Location is null, it means `Probe only' to
16731         avoid adding another argument.   Might have to revise this
16732         strategy later.
16733
16734         (ClassCast): New class used to type cast objects into arbitrary
16735         classes (used in Explicit Reference Conversions).
16736
16737         Implement `as' as well.
16738
16739         Reverted all the patches from Ravi below: they were broken:
16740
16741                 * The use of `level' as a mechanism to stop recursive
16742                   invocations is wrong.  That was there just to catch the
16743                   bug with a strack trace but not as a way of addressing
16744                   the problem.
16745
16746                   To fix the problem we have to *understand* what is going
16747                   on and the interactions and come up with a plan, not
16748                   just get things going.
16749
16750                 * The use of the type conversion cache that I proposed
16751                   last night had an open topic: How does this work across
16752                   protection domains.  A user defined conversion might not
16753                   be public in the location where we are applying the
16754                   conversion, a different conversion might be selected
16755                   (ie, private A->B (better) but public B->A (worse),
16756                   inside A, A->B applies, but outside it, B->A will
16757                   apply).
16758
16759                 * On top of that (ie, even if the above is solved),
16760                   conversions in a cache need to be abstract.  Ie, `To
16761                   convert from an Int to a Short use an OpcodeCast', not
16762                   `To convert from an Int to a Short use the OpcodeCast on
16763                   the variable 5' (which is what this patch was doing).
16764
16765 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16766
16767         * expression.cs (Invocation::ConversionExists): Re-write to use
16768         the conversion cache
16769
16770         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16771         cache all conversions done, not just user-defined ones.
16772
16773         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16774         to determine if a conversion exists instead of acutually trying to 
16775         perform the conversion. It's faster too.
16776
16777         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16778         and only then attempt the implicit conversion.
16779
16780 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16781
16782         * expression.cs (ConvertImplicit): Use a cache for conversions
16783         already found. Check level of recursion and bail out if necessary.
16784
16785 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16786
16787         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16788         Export standard methods that we expect for string operations.
16789
16790         * statement.cs (Block::UsageWarning): Track usage of variables and
16791         report the errors for not used variables.
16792
16793         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16794         operator. 
16795
16796 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16797
16798         * codegen.cs: remove unnneded code 
16799
16800         * expression.cs: Removed BuiltinTypeAccess class
16801
16802         Fix the order in which implicit conversions are
16803         done.  
16804
16805         The previous fixed dropped support for boxed conversions (adding a
16806         test to the test suite now)
16807
16808         (UserImplicitCast::CanConvert): Remove test for source being null,
16809         that code is broken.  We should not feed a null to begin with, if
16810         we do, then we should track the bug where the problem originates
16811         and not try to cover it up here.
16812
16813         Return a resolved expression of type UserImplicitCast on success
16814         rather than true/false.  Ravi: this is what I was talking about,
16815         the pattern is to use a static method as a "constructor" for
16816         objects. 
16817
16818         Also, do not create arguments until the very last minute,
16819         otherwise we always create the arguments even for lookups that
16820         will never be performed. 
16821
16822         (UserImplicitCast::Resolve): Eliminate, objects of type
16823         UserImplicitCast are born in a fully resolved state. 
16824
16825         * typemanager.cs (InitCoreTypes): Init also value_type
16826         (System.ValueType). 
16827
16828         * expression.cs (Cast::Resolve): First resolve the child expression.
16829
16830         (LValue): Add new method AddressOf to be used by
16831         the `&' operator.  
16832
16833         Change the argument of Store to take an EmitContext instead of an
16834         ILGenerator, because things like FieldExpr need to be able to call
16835         their children expression to generate the instance code. 
16836
16837         (Expression::Error, Expression::Warning): Sugar functions for
16838         reporting errors.
16839
16840         (Expression::MemberLookup): Accept a TypeContainer instead of a
16841         Report as the first argument.
16842
16843         (Expression::ResolvePrimary): Killed.  I still want to improve
16844         this as currently the code is just not right.
16845
16846         (Expression::ResolveMemberAccess): Simplify, but it is still
16847         wrong. 
16848
16849         (Unary::Resolve): Catch errors in AddressOf operators.
16850
16851         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16852         index to a byte for the short-version, or the compiler will choose
16853         the wrong Emit call, which generates the wrong data.
16854
16855         (ParameterReference::Emit, ::Store): same.
16856
16857         (FieldExpr::AddressOf): Implement.
16858
16859         * typemanager.cs: TypeManager: made public variable instead of
16860         property.
16861
16862         * driver.cs: document --fatal.
16863
16864         * report.cs (ErrorMessage, WarningMessage): new names for the old
16865         Error and Warning classes.
16866
16867         * cs-parser.jay (member_access): Turn built-in access to types
16868         into a normal simplename
16869
16870 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16871
16872         * expression.cs (Invocation::BetterConversion): Fix to cope
16873         with q being null, since this was introducing a bug.
16874
16875         * expression.cs (ConvertImplicit): Do built-in conversions first.
16876
16877 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16878
16879         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16880
16881 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16882
16883         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16884         I had introduced long ago (what's new ?).
16885
16886         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16887         the work of all the checking. 
16888         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16889         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16890
16891         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16892         that is the right way. 
16893
16894         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16895         overloading resolution. Use everywhere instead of cutting and pasting code.
16896
16897         (Binary::ResolveOperator): Use MakeUnionSet.
16898
16899         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16900         we have to convert to bool types. Not complete yet.
16901
16902 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16903
16904         * typemanager.cs (TypeManager::CSharpName): support ushort.
16905
16906         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16907         to provide an expression that performsn an implicit constant int
16908         conversion (section 6.1.6).
16909         (Expression::ConvertImplicitRequired): Reworked to include
16910         implicit constant expression conversions.
16911
16912         (Expression::ConvertNumericExplicit): Finished.
16913
16914         (Invocation::Emit): If InstanceExpression is null, then it means
16915         that we perform a call on this.
16916
16917 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16918
16919         * expression.cs (Unary::Emit): Remove some dead code.
16920         (Probe): Implement Resolve and Emit for `is'.
16921         (Expression::ConvertImplicitRequired): Attempt to do constant
16922         expression conversions here.  Maybe should be moved to
16923         ConvertImplicit, but I am not sure.
16924         (Expression::ImplicitLongConstantConversionPossible,
16925         Expression::ImplicitIntConstantConversionPossible): New functions
16926         that tell whether is it possible to apply an implicit constant
16927         expression conversion.
16928
16929         (ConvertNumericExplicit): Started work on explicit numeric
16930         conversions.
16931
16932         * cs-parser.jay: Update operator constants.
16933
16934         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16935         (Parameters::GetSignature): Hook up VerifyArgs here.
16936         (Parameters::VerifyArgs): Verifies that no two arguments have the
16937         same name. 
16938
16939         * class.cs (Operator): Update the operator names to reflect the
16940         ones that the spec expects (as we are just stringizing the
16941         operator names).
16942
16943         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16944         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16945         previous usage did only work for our methods.
16946         (Expression::ConvertImplicit): Handle decimal implicit numeric
16947         conversions as well.
16948         (Expression::InternalTypeConstructor): Used to invoke constructors
16949         on internal types for default promotions.
16950
16951         (Unary::Emit): Implement special handling for the pre/post
16952         increment/decrement for overloaded operators, as they need to have
16953         the same semantics as the other operators.
16954
16955         (Binary::ResolveOperator): ditto.
16956         (Invocation::ConversionExists): ditto.
16957         (UserImplicitCast::Resolve): ditto.
16958
16959 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16960
16961         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16962         operator, return after emitting body. Regression tests pass again !
16963
16964         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16965         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16966         (Invocation::OverloadResolve): Ditto.
16967         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16968
16969         * everywhere : update calls to the above methods accordingly.
16970
16971 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16972
16973         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16974
16975         * expression.cs (ExpressionStatement): New base class used for
16976         expressions that can appear in statements, so that we can provide
16977         an alternate path to generate expression that do not leave a value
16978         on the stack.
16979
16980         (Expression::Emit, and all the derivatives): We no longer return
16981         whether a value is left on the stack or not.  Every expression
16982         after being emitted leaves a single value on the stack.
16983
16984         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16985         facilties of ExpressionStatement if possible.
16986
16987         * cs-parser.jay: Update statement_expression.
16988
16989 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16990
16991         * driver.cs: Change the wording of message
16992
16993 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16994
16995         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16996         the type of the expression to the return type of the method if
16997         we have an overloaded operator match ! The regression tests pass again !
16998         (Unary::ResolveOperator): Ditto.
16999
17000         * expression.cs (Invocation::ConversionExists): Correct the member lookup
17001         to find "op_Implicit", not "implicit" ;-)
17002         (UserImplicitCast): New class to take care of user-defined implicit conversions.
17003         (ConvertImplicit, ForceConversion): Take TypeContainer argument
17004
17005         * everywhere : Correct calls to the above accordingly.
17006
17007         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
17008         (ConvertImplicit): Do user-defined conversion if it exists.
17009
17010 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
17011
17012         * assign.cs: track location.
17013         (Resolve): Use implicit conversions on assignment.
17014
17015         * literal.cs: Oops.  Not good, Emit of short access values should
17016         pass (Bytes) or the wrong argument will be selected.
17017
17018         * expression.cs (Unary::Emit): Emit code for -expr.
17019
17020         (Unary::ResolveOperator): Handle `Substract' for non-constants
17021         (substract from zero from the non-constants).
17022         Deal with Doubles as well. 
17023
17024         (Expression::ConvertImplicitRequired): New routine that reports an
17025         error if no implicit conversion exists. 
17026
17027         (Invocation::OverloadResolve): Store the converted implicit
17028         expressions if we make them
17029
17030 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17031
17032         * class.cs (ConstructorInitializer): Take a Location argument.
17033         (ConstructorBaseInitializer): Same here.
17034         (ConstructorThisInitializer): Same here.
17035
17036         * cs-parser.jay : Update all calls accordingly.
17037
17038         * expression.cs (Unary, Binary, New): Take location argument.
17039         Update accordingly everywhere.
17040
17041         * cs-parser.jay : Update all calls to the above to take a location
17042         argument.
17043
17044         * class.cs : Ditto.
17045
17046 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17047
17048         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
17049         (Invocation::BetterConversion): Same here
17050         (Invocation::ConversionExists): Ditto.
17051
17052         (Invocation::ConversionExists): Implement.
17053
17054 2001-09-22  Ravi Pratap  <ravi@ximian.com>
17055
17056         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
17057         Also take an additional TypeContainer argument.
17058
17059         * All over : Pass in TypeContainer as argument to OverloadResolve.
17060
17061         * typemanager.cs (CSharpName): Update to check for the string type and return
17062         that too.
17063
17064         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
17065         a given method.
17066
17067 2001-09-21  Ravi Pratap  <ravi@ximian.com>
17068
17069         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
17070         (Invocation::BetterFunction): Implement.
17071         (Invocation::BetterConversion): Implement.
17072         (Invocation::ConversionExists): Skeleton, no implementation yet.
17073
17074         Okay, things work fine !
17075
17076 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
17077
17078         * typemanager.cs: declare and load enum_type, delegate_type and
17079         void_type. 
17080
17081         * expression.cs (Expression::Emit): Now emit returns a value that
17082         tells whether a value is left on the stack or not.  This strategy
17083         might be reveted tomorrow with a mechanism that would address
17084         multiple assignments.
17085         (Expression::report118): Utility routine to report mismatches on
17086         the ExprClass.
17087
17088         (Unary::Report23): Report impossible type/operator combination
17089         utility function.
17090
17091         (Unary::IsIncrementableNumber): Whether the type can be
17092         incremented or decremented with add.
17093         (Unary::ResolveOperator): Also allow enumerations to be bitwise
17094         complemented. 
17095         (Unary::ResolveOperator): Implement ++, !, ~,
17096
17097         (Invocation::Emit): Deal with new Emit convetion.
17098
17099         * All Expression derivatives: Updated their Emit method to return
17100         whether they leave values on the stack or not.
17101
17102         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
17103         stack for expressions that are statements. 
17104
17105 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17106
17107         * expression.cs (LValue): New interface.  Must be implemented by
17108         LValue objects.
17109         (LocalVariableReference, ParameterReference, FieldExpr): Implement
17110         LValue interface.
17111
17112         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
17113         interface for generating code, simplifies the code.
17114
17115 2001-09-20  Ravi Pratap  <ravi@ximian.com>
17116
17117         * expression.cs (everywhere): Comment out return statements in ::Resolve
17118         methods to avoid the warnings.
17119
17120 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17121
17122         * driver.cs (parse): Report error 2001 if we can not open the
17123         source file.
17124
17125         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
17126         not resolve it.
17127
17128         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
17129         object. 
17130
17131         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
17132         otherwise nested blocks end up with the same index.
17133
17134         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
17135
17136         * expression.cs:  Instead of having FIXMEs in the Resolve
17137         functions, throw exceptions so it is obvious that we are facing a
17138         bug. 
17139
17140         * cs-parser.jay (invocation_expression): Pass Location information.
17141
17142         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
17143         Use a basename for those routines because .NET does not like paths
17144         on them. 
17145
17146         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
17147         already defined.
17148
17149 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
17150
17151         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
17152         are loading the correct data types (throws an exception if not).
17153         (TypeManager::InitCoreTypes): Use CoreLookupType
17154
17155         * expression.cs (Unary::ResolveOperator): return the child
17156         expression for expressions which are just +expr.
17157         (Unary::ResolveOperator): Return negative literals for -LITERAL
17158         expressions (otherwise they are Unary {Literal}).
17159         (Invocation::Badness): Take into account `Implicit constant
17160         expression conversions'.
17161
17162         * literal.cs (LongLiteral): Implement long literal class.
17163         (IntLiteral): export the `Value' of the intliteral. 
17164
17165 2001-09-19  Ravi Pratap  <ravi@ximian.com>
17166
17167         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
17168
17169         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
17170         instead of 'Operator'
17171
17172         * expression.cs (Binary::ResolveOperator): Update accordingly.
17173         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
17174         and 'Minus'
17175
17176         * cs-parser.jay (unary_expression): Update to use the new names.
17177
17178         * gen-treedump.cs (GetUnary): Same here.
17179
17180         * expression.cs (Unary::Resolve): Implement.
17181         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
17182         operators are found instead of making noise ;-)
17183         (Unary::ResolveOperator): New method to do precisely the same thing which
17184         Binary::ResolveOperator does for Binary expressions.
17185         (Unary.method, .Arguments): Add.
17186         (Unary::OperName): Implement.   
17187         (Unary::ForceConversion): Copy and Paste !
17188
17189         * class.cs (Operator::Define): Fix a small bug for the case when we have 
17190         a unary operator.
17191
17192         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
17193         for the inbuilt operators. Only overloading works for now ;-)
17194
17195 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
17196
17197         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
17198         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
17199
17200         * expression.cs (This::Emit): Implement. 
17201         (This::Resolve): Implement.
17202         (TypeOf:Resolve): Implement.
17203         (Expression::ResolveSimpleName): Add an implicit this to instance
17204         field references. 
17205         (MemberAccess::Resolve): Deal with Parameters and Fields. 
17206         Bind instance variable to Field expressions.
17207         (FieldExpr::Instance): New field used to track the expression that
17208         represents the object instance.
17209         (FieldExpr::Resolve): Track potential errors from MemberLookup not
17210         binding 
17211         (FieldExpr::Emit): Implement.
17212
17213         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
17214         the last instruction contains a return opcode to avoid generating
17215         the last `ret' instruction (this generates correct code, and it is
17216         nice to pass the peverify output).
17217
17218         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
17219         initializer for static and instance variables.
17220         (Constructor::Emit): Allow initializer to be null in the case of
17221         static constructors.  Only emit initializer for instance
17222         constructors. 
17223
17224         (TypeContainer::FindMembers): Return a null array if there are no
17225         matches.
17226
17227         Also fix the code for the MemberTypes.Method branch, as it was not
17228         scanning that for operators (or tried to access null variables before).
17229
17230         * assign.cs (Assign::Emit): Handle instance and static fields. 
17231
17232         * TODO: Updated.
17233
17234         * driver.cs: Stop compilation if there are parse errors.
17235
17236         * cs-parser.jay (constructor_declaration): Provide default base
17237         initializer for non-static constructors.
17238         (constructor_declarator): Do not provide a default base
17239         initializers if none was specified.
17240         Catch the fact that constructors should not have parameters.
17241
17242         * class.cs: Do not emit parent class initializers for static
17243         constructors, that should be flagged as an error.
17244
17245 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17246
17247         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
17248         Move back code into TypeContainer::Populate.
17249
17250 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17251
17252         * class.cs (TypeContainer::AddConstructor): Fix the check to
17253         compare against Name, not Basename. 
17254         (Operator::OpType): Change Plus and Minus to Add and Subtract.
17255
17256         * cs-parser.jay : Update accordingly.
17257
17258         * class.cs (TypeContainer::FindMembers): For the case where we are searching
17259         for methods, don't forget to look into the operators too.
17260         (RegisterMethodBuilder): Helper method to take care of this for
17261         methods, constructors and operators.
17262         (Operator::Define): Completely revamp.
17263         (Operator.OperatorMethod, MethodName): New fields.
17264         (TypeContainer::Populate): Move the registering of builders into
17265         RegisterMethodBuilder.
17266         (Operator::Emit): Re-write.
17267
17268         * expression.cs (Binary::Emit): Comment out code path to emit method
17269         invocation stuff for the case when we have a user defined operator. I am
17270         just not able to get it right !
17271
17272 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17273
17274         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
17275         argument. 
17276
17277         (Expression::MemberLookup): Provide a version that allows to
17278         specify the MemberTypes and BindingFlags. 
17279
17280         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
17281         so it was not fetching variable information from outer blocks.
17282
17283         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
17284         Beforefieldinit as it was buggy.
17285
17286         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
17287         that Ravi put here.  
17288
17289         * class.cs (Constructor::Emit): Only emit if block is not null.
17290         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
17291         deal with this by semantically definining it as if the user had
17292         done it.
17293
17294         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
17295         constructors as we now "emit" them at a higher level.
17296
17297         (TypeContainer::DefineDefaultConstructor): Used to define the
17298         default constructors if none was provided.
17299
17300         (ConstructorInitializer): Add methods Resolve and Emit. 
17301
17302         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
17303
17304 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17305
17306         * class.cs (TypeContainer::EmitDefaultConstructor): Register
17307         the default constructor builder with our hashtable for methodbuilders
17308         to methodcores.
17309
17310         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
17311         and argument_count is 0 in which case we have a match.
17312         (Binary::ResolveOperator): More null checking and miscellaneous coding
17313         style cleanup.
17314
17315 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17316
17317         * rootcontext.cs (IsNameSpace): Compare against null.
17318
17319         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
17320
17321         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
17322         and Unary::Operator.
17323
17324         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
17325         accordingly.
17326
17327         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
17328         we have overloaded operators.
17329         (Binary::ResolveOperator): Implement the part which does the operator overload
17330         resolution.
17331
17332         * class.cs (Operator::Emit): Implement.
17333         (TypeContainer::Emit): Emit the operators we have too.
17334
17335         * expression.cs (Binary::Emit): Update to emit the appropriate code for
17336         the case when we have a user-defined operator.
17337
17338 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17339
17340         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
17341
17342 2001-09-16  Ravi Pratap  <ravi@ximian.com>
17343
17344         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
17345         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
17346         (Constructor::Emit): Implement.
17347         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
17348         if we have no work to do. 
17349         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
17350         Emit method.
17351
17352         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
17353         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
17354
17355         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
17356         of parent.parent.
17357
17358 2001-09-15  Ravi Pratap  <ravi@ximian.com>
17359
17360         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
17361         in the source.
17362         (Tree::RecordNamespace): Method to do what the name says ;-)
17363         (Tree::Namespaces): Property to get at the namespaces hashtable.
17364
17365         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
17366         keep track.
17367
17368         * rootcontext.cs (IsNamespace): Fixed it :-)
17369
17370 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17371
17372         * class.cs (TypeContainer::FindMembers): Add support for
17373         constructors. 
17374         (MethodCore): New class that encapsulates both the shared aspects
17375         of a Constructor and a Method.  
17376         (Method, Constructor): Factored pieces into MethodCore.
17377
17378         * driver.cs: Added --fatal which makes errors throw exceptions.
17379         Load System assembly as well as part of the standard library.
17380
17381         * report.cs: Allow throwing exceptions on errors for debugging.
17382
17383         * modifiers.cs: Do not use `parent', instead use the real type
17384         container to evaluate permission settings.
17385
17386         * class.cs: Put Ravi's patch back in.  He is right, and we will
17387         have to cope with the
17388
17389 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17390
17391         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
17392         FamORAssem, not FamANDAssem.
17393
17394 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17395
17396         * driver.cs: Added --parse option that only parses its input files
17397         and terminates.
17398
17399         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
17400         incorrect.  IsTopLevel is not used to tell whether an object is
17401         root_types or not (that can be achieved by testing this ==
17402         root_types).  But to see if this is a top-level *class* (not
17403         necessarly our "toplevel" container). 
17404
17405 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17406
17407         * enum.cs (Enum::Define): Modify to call the Lookup method on the
17408         parent instead of a direct call to GetType.
17409
17410 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17411
17412         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
17413         Modifiers.TypeAttr. This should just be a call to that method.
17414
17415         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
17416         object so that we can determine if we are top-level or not.
17417
17418         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
17419         TypeContainer too.
17420
17421         * enum.cs (Enum::Define): Ditto.
17422
17423         * modifiers.cs (FieldAttr): Re-write.
17424
17425         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
17426         (TypeContainer::HaveStaticConstructor): New property to provide access
17427         to precisely that info.
17428
17429         * modifiers.cs (MethodAttr): Re-write.
17430         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
17431
17432         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
17433         of top-level types as claimed.
17434
17435 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17436
17437         * expression.cs (MemberLookup): Fruitless attempt to lookup
17438         constructors.  Maybe I need to emit default constructors?  That
17439         might be it (currently .NET emits this for me automatically).
17440         (Invocation::OverloadResolve): Cope with Arguments == null.
17441         (Invocation::EmitArguments): new function, shared by the new
17442         constructor and us.
17443         (Invocation::Emit): Handle static and instance methods.  Emit
17444         proper call instruction for virtual or non-virtual invocations.
17445         (New::Emit): Implement.
17446         (New::Resolve): Implement.
17447         (MemberAccess:Resolve): Implement.
17448         (MethodGroupExpr::InstanceExpression): used conforming to the spec
17449         to track instances.
17450         (FieldExpr::Resolve): Set type.
17451
17452         * support.cs: Handle empty arguments.
17453                 
17454         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
17455         SimpleLookup): Auxiliary routines to help parse a qualifier
17456         identifier.  
17457
17458         Update qualifier_identifier rule.
17459
17460         * codegen.cs: Removed debugging messages.
17461
17462         * class.cs: Make this a global thing, this acts just as a "key" to
17463         objects that we might have around.
17464
17465         (Populate): Only initialize method_builders_to_methods once.
17466
17467         * expression.cs (PropertyExpr): Initialize type from the
17468         PropertyType. 
17469
17470         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
17471         Resolve pattern.  Attempt to implicitly convert value to boolean.
17472         Emit code.
17473
17474         * expression.cs: Set the type for the int32/int32 argument case.
17475         (Binary::ResolveOperator): Set the return type to boolean for
17476         comparission operators
17477
17478         * typemanager.cs: Remove debugging print code.
17479
17480         (Invocation::Resolve): resolve type.
17481
17482         * class.cs: Allocate a MemberInfo of the correct size, as the code
17483         elsewhere depends on the test to reflect the correct contents.
17484
17485         (Method::) Keep track of parameters, due to System.Reflection holes
17486
17487         (TypeContainer::Populate): Keep track of MethodBuilders to Method
17488         mapping here.
17489
17490         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17491         of the exact size and return that.
17492
17493         (Class::LookupMethodByBuilder): New function that maps
17494         MethodBuilders to its methods.  Required to locate the information
17495         on methods because System.Reflection bit us again.
17496
17497         * support.cs: New file, contains an interface ParameterData and
17498         two implementations: ReflectionParameters and InternalParameters
17499         used to access Parameter information.  We will need to grow this
17500         as required.
17501
17502         * expression.cs (Invocation::GetParameterData): implement a cache
17503         and a wrapper around the ParameterData creation for methods. 
17504         (Invocation::OverloadResolve): Use new code.
17505
17506 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17507
17508         * class.cs (TypeContainer::EmitField): Remove and move into 
17509         (Field::Define): here and modify accordingly.
17510         (Field.FieldBuilder): New member.
17511         (TypeContainer::Populate): Update accordingly.
17512         (TypeContainer::FindMembers): Implement.
17513
17514 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17515
17516         * statement.cs: (VariableInfo::VariableType): New field to be
17517         initialized with the full type once it is resolved. 
17518
17519 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17520
17521         * parameter.cs (GetParameterInfo): Use a type cache to compute
17522         things only once, and to reuse this information
17523
17524         * expression.cs (LocalVariableReference::Emit): Implement.
17525         (OpcodeCast::Emit): fix.
17526
17527         (ParameterReference::Resolve): Implement.
17528         (ParameterReference::Emit): Implement.
17529
17530         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17531         that are expressions need to stay as Expressions.
17532
17533         * typemanager.cs (CSharpName): Returns the C# name of a type if
17534         possible. 
17535
17536         * expression.cs (Expression::ConvertImplicit): New function that
17537         implements implicit type conversions.
17538
17539         (Expression::ImplicitReferenceConversion): Implements implicit
17540         reference conversions.
17541
17542         (EmptyCast): New type for transparent casts.
17543
17544         (OpcodeCast): New type for casts of types that are performed with
17545         a sequence of bytecodes.
17546
17547         (BoxedCast): New type used for casting value types into reference
17548         types.  Emits a box opcode.
17549
17550         (Binary::DoNumericPromotions): Implements numeric promotions of
17551         and computation of the Binary::Type.
17552
17553         (Binary::EmitBranchable): Optimization.
17554
17555         (Binary::Emit): Implement code emission for expressions.
17556
17557         * typemanager.cs (TypeManager): Added two new core types: sbyte
17558         and byte.
17559
17560 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17561
17562         * class.cs (TypeContainer::FindMembers): Method which does exactly
17563         what Type.FindMembers does, only we don't have to use reflection. No
17564         implementation yet.
17565
17566         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17567         typecontainer objects as we need to get at them.
17568         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17569
17570         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17571         typecontainer object.
17572
17573         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17574         of just a Report object.
17575
17576 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17577
17578         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17579         "remove_"
17580         (TypeContainer::Populate): Now define the delegates of the type too.
17581         (TypeContainer.Delegates): Property to access the list of delegates defined
17582         in the type.
17583
17584         * delegates.cs (Delegate::Define): Implement partially.
17585
17586         * modifiers.cs (TypeAttr): Handle more flags.
17587
17588 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17589
17590         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17591         and not <=
17592         (Operator::Define): Re-write logic to get types by using the LookupType method
17593         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17594         (Indexer::Define): Ditto.
17595         (Event::Define): Ditto.
17596         (Property::Define): Ditto.
17597
17598 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17599
17600         * class.cs (TypeContainer::Populate): Now define operators too. 
17601         (TypeContainer.Operators): New property to access the list of operators
17602         in a type.
17603         (Operator.OperatorMethodBuilder): New member to hold the method builder
17604         for the operator we are defining.
17605         (Operator::Define): Implement.
17606
17607 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17608
17609         * class.cs (Event::Define): Make the prefixes of the accessor methods
17610         addOn_ and removeOn_ 
17611
17612         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17613         of the location being passed in too. Ideally, this should go later since all
17614         error reporting should be done through the Report object.
17615
17616         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17617         (Populate): Iterate thru the indexers we have and define them too.
17618         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17619         for the get and set accessors.
17620         (Indexer::Define): Implement.
17621
17622 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17623
17624         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17625         my previous implementation, did not work.
17626
17627         * typemanager.cs: Add a couple of missing types (the longs).
17628
17629         * literal.cs: Use TypeManager.bool_type instead of getting it.
17630
17631         * expression.cs (EventExpr): New kind of expressions.
17632         (Expressio::ExprClassFromMemberInfo): finish
17633
17634 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17635
17636         * assign.cs: Emit stores to static fields differently.
17637
17638 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17639
17640         * Merge in changes and adjust code to tackle conflicts. Backed out my
17641         code in Assign::Resolve ;-) 
17642
17643 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17644
17645         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17646         instead Report.Error and also pass in the location.
17647         (CSharpParser::Lexer): New readonly property to return the reference
17648         to the Tokenizer object.
17649         (declare_local_variables): Use Report.Error with location instead of plain 
17650         old error.
17651         (CheckDef): Ditto.
17652
17653         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17654         (Operator.CheckBinaryOperator): Ditto.
17655
17656         * cs-parser.jay (operator_declarator): Update accordingly.
17657
17658         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17659         (CheckBinaryOperator): Same here.
17660
17661         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17662         on the name without any prefixes of namespace names etc. This is because we
17663         already might have something already fully qualified like 
17664         'System.Console.WriteLine'
17665
17666         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17667
17668 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17669
17670         * cs-tokenizer.cs (location): Return a string which also contains
17671         the file name.
17672
17673         * expression.cs (ElementAccess): New class for expressions of the
17674         type 'element access.'
17675         (BaseAccess): New class for expressions of the type 'base access.'
17676         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17677         respectively.
17678
17679         * cs-parser.jay (element_access): Implement action.
17680         (base_access): Implement actions.
17681         (checked_expression, unchecked_expression): Implement.
17682
17683         * cs-parser.jay (local_variable_type): Correct and implement.
17684         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17685
17686         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17687
17688         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17689         name and the specifiers.
17690
17691         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17692
17693         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17694         making them all public ;-)
17695
17696         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17697         class anyways.
17698
17699 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17700
17701         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17702         PropertyExprs.
17703         (FieldExpr, PropertyExprs): New resolved expressions.
17704         (SimpleName::MemberStaticCheck): Perform static checks for access
17705         to non-static fields on static methods. Maybe this should be
17706         generalized for MemberAccesses. 
17707         (SimpleName::ResolveSimpleName): More work on simple name
17708         resolution. 
17709
17710         * cs-parser.jay (primary_expression/qualified_identifier): track
17711         the parameter index.
17712
17713         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17714         (EmitContext::EmitBoolExpression): Chain to expression generation
17715         instead of temporary hack.
17716         (::EmitStatementExpression): Put generic expression code generation.
17717
17718         * assign.cs (Assign::Emit): Implement variable assignments to
17719         local variables, parameters and fields.
17720
17721 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17722
17723         * statement.cs (Block::GetVariableInfo): New method, returns the
17724         VariableInfo for a variable name in a block.
17725         (Block::GetVariableType): Implement in terms of GetVariableInfo
17726
17727         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17728         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17729
17730 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17731
17732         * cs-parser.jay (operator_declaration): Continue on my quest : update
17733         to take attributes argument.
17734         (event_declaration): Ditto.
17735         (enum_declaration): Ditto.
17736         (indexer_declaration): Ditto.
17737
17738         * class.cs (Operator::Operator): Update constructor accordingly.
17739         (Event::Event): Ditto.
17740
17741         * delegate.cs (Delegate::Delegate): Same here.
17742
17743         * enum.cs (Enum::Enum): Same here.
17744
17745 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17746
17747         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17748
17749         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17750
17751         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17752         being passed around as an arraylist.
17753         (Attributes::AddAttribute): Method to add attribute sections.
17754
17755         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17756         (struct_declaration): Update accordingly.
17757         (constant_declaration): Update.
17758         (field_declaration): Update.
17759         (method_header): Update.
17760         (fixed_parameter): Update.
17761         (parameter_array): Ditto.
17762         (property_declaration): Ditto.
17763         (destructor_declaration): Ditto.
17764
17765         * class.cs (Struct::Struct): Update constructors accordingly.
17766         (Class::Class): Ditto.
17767         (Field::Field): Ditto.
17768         (Method::Method): Ditto.
17769         (Property::Property): Ditto.
17770         (TypeContainer::OptAttribute): update property's return type.
17771
17772         * interface.cs (Interface.opt_attributes): New member.
17773         (Interface::Interface): Update to take the extra Attributes argument.
17774
17775         * parameter.cs (Parameter::Parameter): Ditto.
17776
17777         * constant.cs (Constant::Constant): Ditto.
17778
17779         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17780         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17781         the attributes as a parameter.
17782         (InterfaceProperty): Update constructor call.
17783         (InterfaceEvent): Ditto.
17784         (InterfaceMethod): Ditto.
17785         (InterfaceIndexer): Ditto.
17786
17787         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17788         pass the attributes too.
17789         (interface_event_declaration): Ditto.
17790         (interface_property_declaration): Ditto.
17791         (interface_method_declaration): Ditto.
17792         (interface_declaration): Ditto.
17793
17794 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17795
17796         * class.cs (Method::Define): Track the "static Main" definition to
17797         create an entry point. 
17798
17799         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17800         EntryPoint if we find it. 
17801
17802         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17803         (EmitContext::ig): Make this variable public.
17804
17805         * driver.cs: Make the default output file be the first file name
17806         with the .exe extension.  
17807
17808         Detect empty compilations
17809
17810         Handle various kinds of output targets.  Handle --target and
17811         rename -t to --dumper.
17812
17813         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17814         methods inherited from Expression return now an Expression.  This
17815         will is used during the tree rewriting as we resolve them during
17816         semantic analysis.
17817
17818         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17819         the spec.  Missing entirely is the information about
17820         accessability of elements of it.
17821
17822         (Expression::ExprClassFromMemberInfo): New constructor for
17823         Expressions that creates a fully initialized Expression based on
17824         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17825         a Type.
17826
17827         (Invocation::Resolve): Begin implementing resolution of invocations.
17828
17829         * literal.cs (StringLiteral):  Implement Emit.
17830
17831 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17832
17833         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17834         member.
17835
17836 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17837
17838         * cs-parser.jay (attribute_arguments): Implement actions.
17839         (attribute): Fix bug in production. Implement action.
17840         (attribute_list): Implement.
17841         (attribute_target): Implement.
17842         (attribute_target_specifier, opt_target_specifier): Implement
17843         (CheckAttributeTarget): New method to check if the attribute target
17844         is valid.
17845         (attribute_section): Implement.
17846         (opt_attributes): Implement.
17847
17848         * attribute.cs : New file to handle attributes.
17849         (Attribute): Class to hold attribute info.
17850
17851         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17852         (attribute_section): Modify production to use 2 different rules to 
17853         achieve the same thing. 1 s/r conflict down !
17854         Clean out commented, useless, non-reducing dimension_separator rules.
17855
17856         * class.cs (TypeContainer.attributes): New member to hold list
17857         of attributes for a type.
17858         (Struct::Struct): Modify to take one more argument, the attribute list.
17859         (Class::Class): Ditto.
17860         (Field::Field): Ditto.
17861         (Method::Method): Ditto.
17862         (Property::Property): Ditto.
17863
17864         * cs-parser.jay (struct_declaration): Update constructor call to
17865         pass in the attributes too.
17866         (class_declaration): Ditto.
17867         (constant_declaration): Ditto.
17868         (field_declaration): Ditto.
17869         (method_header): Ditto.
17870         (fixed_parameter): Ditto.
17871         (parameter_array): Ditto.
17872         (property_declaration): Ditto.
17873
17874         * constant.cs (Constant::Constant): Update constructor similarly.
17875         Use System.Collections.
17876
17877         * parameter.cs (Parameter::Parameter): Update as above.
17878
17879 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17880
17881         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17882         (TypeContainer.delegates): New member to hold list of delegates.
17883
17884         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17885         this time as I seem to be on crack ;-)
17886
17887 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17888
17889         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17890         tell whether an identifier represents a namespace.
17891
17892         * expression.cs (NamespaceExpr): A namespace expression, used only
17893         temporarly during expression resolution.
17894         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17895         utility functions to resolve names on expressions.
17896
17897 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17898
17899         * codegen.cs: Add hook for StatementExpressions. 
17900
17901         * class.cs: Fix inverted test for static flag in methods.
17902
17903 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17904
17905         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17906         to make it coincide with MS' number.
17907         (Operator::CheckBinaryOperator): Ditto.
17908
17909         * ../errors/errors.txt : Remove error numbers added earlier.
17910
17911         * ../errors/cs1019.cs : Test case for error # 1019
17912
17913         * ../errros/cs1020.cs : Test case for error # 1020
17914
17915         * cs-parser.jay : Clean out commented cruft.
17916         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17917         used anywhere - non-reducing rule.
17918         (namespace_declarations): Non-reducing rule - comment out.
17919
17920         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17921         with TypeContainer::AddEnum.
17922
17923         * delegate.cs : New file for delegate handling classes.
17924         (Delegate): Class for declaring delegates.
17925
17926         * makefile : Update.
17927
17928         * cs-parser.jay (delegate_declaration): Implement.
17929
17930 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17931
17932         * class.cs (Event::Define): Implement.
17933         (Event.EventBuilder): New member.
17934
17935         * class.cs (TypeContainer::Populate): Update to define all enums and events
17936         we have.
17937         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17938         readonly fields for all these cases ?
17939
17940 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17941
17942         * class.cs (Property): Revamp to use the convention of making fields readonly.
17943         Accordingly modify code elsewhere.
17944
17945         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17946         the Define method of the Property class.
17947
17948         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17949         trivial bug.
17950         (TypeContainer::Populate): Update to define all the properties we have. Also
17951         define all enumerations.
17952
17953         * enum.cs (Define): Implement.
17954
17955 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17956
17957         * cs-parser.jay (overloadable_operator): The semantic value is an
17958         enum of the Operator class.
17959         (operator_declarator): Implement actions.
17960         (operator_declaration): Implement.
17961
17962         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17963         validity of definitions.
17964         (Operator::CheckBinaryOperator): Static method to check for binary operators
17965         (TypeContainer::AddOperator): New method to add an operator to a type.
17966
17967         * cs-parser.jay (indexer_declaration): Added line to actually call the
17968         AddIndexer method so it gets added ;-)
17969
17970         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17971         already taken care of by the MS compiler ?  
17972
17973 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17974
17975         * class.cs (Operator): New class for operator declarations.
17976         (Operator::OpType): Enum for the various operators.
17977
17978 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17979
17980         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17981         ostensibly handle this in semantic analysis.
17982
17983         * cs-parser.jay (general_catch_clause): Comment out
17984         (specific_catch_clauses, specific_catch_clause): Ditto.
17985         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17986         (catch_args, opt_catch_args): New productions.
17987         (catch_clause): Rewrite to use the new productions above
17988         (catch_clauses): Modify accordingly.
17989         (opt_catch_clauses): New production to use in try_statement
17990         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17991         and re-write the code in the actions to extract the specific and
17992         general catch clauses by being a little smart ;-)
17993
17994         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17995         Hooray, try and catch statements parse fine !
17996
17997 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17998
17999         * statement.cs (Block::GetVariableType): Fix logic to extract the type
18000         string from the hashtable of variables.
18001
18002         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
18003         I end up making that mistake ;-)
18004         (catch_clauses): Fixed gross error which made Key and Value of the 
18005         DictionaryEntry the same : $1 !!
18006
18007 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18008
18009         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
18010
18011         * cs-parser.jay (event_declaration): Correct to remove the semicolon
18012         when the add and remove accessors are specified. 
18013
18014 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18015
18016         * cs-parser.jay (IndexerDeclaration): New helper class to hold
18017         information about indexer_declarator.
18018         (indexer_declarator): Implement actions.
18019         (parsing_indexer): New local boolean used to keep track of whether
18020         we are parsing indexers or properties. This is necessary because 
18021         implicit_parameters come into picture even for the get accessor in the 
18022         case of an indexer.
18023         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
18024
18025         * class.cs (Indexer): New class for indexer declarations.
18026         (TypeContainer::AddIndexer): New method to add an indexer to a type.
18027         (TypeContainer::indexers): New member to hold list of indexers for the
18028         type.
18029
18030 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18031
18032         * cs-parser.jay (add_accessor_declaration): Implement action.
18033         (remove_accessor_declaration): Implement action.
18034         (event_accessors_declaration): Implement
18035         (variable_declarators): swap statements for first rule - trivial.
18036
18037         * class.cs (Event): New class to hold information about event
18038         declarations.
18039         (TypeContainer::AddEvent): New method to add an event to a type
18040         (TypeContainer::events): New member to hold list of events.
18041
18042         * cs-parser.jay (event_declaration): Implement actions.
18043
18044 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18045
18046         * cs-parser.jay (dim_separators): Implement. Make it a string
18047         concatenating all the commas together, just as they appear.
18048         (opt_dim_separators): Modify accordingly
18049         (rank_specifiers): Update accordingly. Basically do the same
18050         thing - instead, collect the brackets here.
18051         (opt_rank_sepcifiers): Modify accordingly.
18052         (array_type): Modify to actually return the complete type string
18053         instead of ignoring the rank_specifiers.
18054         (expression_list): Implement to collect the expressions
18055         (variable_initializer): Implement. We make it a list of expressions
18056         essentially so that we can handle the array_initializer case neatly too.
18057         (variable_initializer_list): Implement.
18058         (array_initializer): Make it a list of variable_initializers
18059         (opt_array_initializer): Modify accordingly.
18060
18061         * expression.cs (New::NType): Add enumeration to help us
18062         keep track of whether we have an object/delegate creation
18063         or an array creation.
18064         (New:NewType, New::Rank, New::Indices, New::Initializers): New
18065         members to hold data about array creation.
18066         (New:New): Modify to update NewType
18067         (New:New): New Overloaded contructor for the array creation
18068         case.
18069
18070         * cs-parser.jay (array_creation_expression): Implement to call
18071         the overloaded New constructor.
18072
18073 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
18074
18075         * class.cs (TypeContainer::Constructors): Return member
18076         constructors instead of returning null.
18077
18078 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
18079
18080         * typemanager.cs (InitCoreTypes): Initialize the various core
18081         types after we have populated the type manager with the user
18082         defined types (this distinction will be important later while
18083         compiling corlib.dll)
18084
18085         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
18086         on Expression Classification.  Now all expressions have a method
18087         `Resolve' and a method `Emit'.
18088
18089         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
18090         generation from working.     Also add some temporary debugging
18091         code. 
18092
18093 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
18094
18095         * codegen.cs: Lots of code generation pieces.  This is only the
18096         beginning, will continue tomorrow with more touches of polish.  We
18097         handle the fundamentals of if, while, do, for, return.  Others are
18098         trickier and I need to start working on invocations soon.
18099
18100         * gen-treedump.cs: Bug fix, use s.Increment here instead of
18101         s.InitStatement. 
18102
18103         * codegen.cs (EmitContext): New struct, used during code
18104         emission to keep a context.   Most of the code generation will be
18105         here. 
18106
18107         * cs-parser.jay: Add embedded blocks to the list of statements of
18108         this block.  So code generation proceeds in a top down fashion.
18109
18110 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
18111
18112         * statement.cs: Add support for multiple child blocks.
18113
18114 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
18115
18116         * codegen.cs (EmitCode): New function, will emit the code for a
18117         Block of code given a TypeContainer and its ILGenerator. 
18118
18119         * statement.cs (Block): Standard public readonly optimization.
18120         (Block::Block constructors): Link children. 
18121         (Block::Child): Child Linker.
18122         (Block::EmitVariables): Emits IL variable declarations.
18123
18124         * class.cs: Drop support for MethodGroups here, delay until
18125         Semantic Analysis.
18126         (Method::): Applied the same simplification that I did before, and
18127         move from Properties to public readonly fields.
18128         (Method::ParameterTypes): Returns the parameter types for the
18129         function, and implements a cache that will be useful later when I
18130         do error checking and the semantic analysis on the methods is
18131         performed.
18132         (Constructor::GetCallingConvention): Renamed from CallingConvetion
18133         and made a method, optional argument tells whether this is a class
18134         or a structure to apply the `has-this' bit.
18135         (Method::GetCallingConvention): Implement, returns the calling
18136         convention. 
18137         (Method::Define): Defines the type, a second pass is performed
18138         later to populate the methods.
18139
18140         (Constructor::ParameterTypes): implement a cache similar to the
18141         one on Method::ParameterTypes, useful later when we do semantic
18142         analysis. 
18143
18144         (TypeContainer::EmitMethod):  New method.  Emits methods.
18145
18146         * expression.cs: Removed MethodGroup class from here.
18147
18148         * parameter.cs (Parameters::GetCallingConvention): new method.
18149
18150 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
18151
18152         * class.cs (TypeContainer::Populate): Drop RootContext from the
18153         argument. 
18154
18155         (Constructor::CallingConvention): Returns the calling convention.
18156         (Constructor::ParameterTypes): Returns the constructor parameter
18157         types. 
18158
18159         (TypeContainer::AddConstructor): Keep track of default constructor
18160         and the default static constructor.
18161
18162         (Constructor::) Another class that starts using `public readonly'
18163         instead of properties. 
18164
18165         (Constructor::IsDefault): Whether this is a default constructor. 
18166
18167         (Field::) use readonly public fields instead of properties also.
18168
18169         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
18170         track of static constructors;  If none is used, turn on
18171         BeforeFieldInit in the TypeAttributes. 
18172
18173         * cs-parser.jay (opt_argument_list): now the return can be null
18174         for the cases where there are no arguments. 
18175
18176         (constructor_declarator): If there is no implicit `base' or
18177         `this', then invoke the default parent constructor. 
18178
18179         * modifiers.cs (MethodAttr): New static function maps a set of
18180         modifiers flags into a MethodAttributes enum
18181         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
18182         MethodAttr, TypeAttr to represent the various mappings where the
18183         modifiers are used.
18184         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
18185
18186 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
18187
18188         * parameter.cs (GetParameterInfo): Fix bug where there would be no
18189         method arguments.
18190
18191         * interface.cs (PopulateIndexer): Implemented the code generator
18192         for interface indexers.
18193
18194 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
18195
18196         * interface.cs (InterfaceMemberBase): Now we track the new status
18197         here.  
18198
18199         (PopulateProperty): Implement property population.  Woohoo!  Got
18200         Methods and Properties going today. 
18201
18202         Removed all the properties for interfaces, and replaced them with
18203         `public readonly' fields. 
18204
18205 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
18206
18207         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
18208         initialize their hashtables/arraylists only when they are needed
18209         instead of doing this always.
18210
18211         * parameter.cs: Handle refs and out parameters.
18212
18213         * cs-parser.jay: Use an ArrayList to construct the arguments
18214         instead of the ParameterCollection, and then cast that to a
18215         Parameter[] array.
18216
18217         * parameter.cs: Drop the use of ParameterCollection and use
18218         instead arrays of Parameters.
18219
18220         (GetParameterInfo): Use the Type, not the Name when resolving
18221         types. 
18222
18223 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
18224
18225         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
18226         and instead use public readonly fields.
18227
18228         * class.cs: Put back walking code for type containers.
18229
18230 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
18231
18232         * class.cs (MakeConstant): Code to define constants.
18233
18234         * rootcontext.cs (LookupType): New function.  Used to locate types 
18235
18236
18237 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
18238
18239         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
18240         this System.Reflection code is.  Kudos to Microsoft
18241
18242         * typemanager.cs: Implement a type cache and avoid loading all
18243         types at boot time.  Wrap in LookupType the internals.  This made
18244         the compiler so much faster.  Wow.  I rule!
18245
18246         * driver.cs: Make sure we always load mscorlib first (for
18247         debugging purposes, nothing really important).
18248
18249         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
18250         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
18251
18252         * rootcontext.cs: Lookup types on their namespace;  Lookup types
18253         on namespaces that have been imported using the `using' keyword.
18254
18255         * class.cs (TypeContainer::TypeAttr): Virtualize.
18256         (Class::TypeAttr): Return attributes suitable for this bad boy.
18257         (Struct::TypeAttr): ditto.
18258         Handle nested classes.
18259         (TypeContainer::) Remove all the type visiting code, it is now
18260         replaced with the rootcontext.cs code
18261
18262         * rootcontext.cs (GetClassBases): Added support for structs. 
18263
18264 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
18265
18266         * interface.cs, statement.cs, class.cs, parameter.cs,
18267         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
18268         Drop use of TypeRefs, and use strings instead.
18269
18270 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
18271
18272         * rootcontext.cs: 
18273
18274         * class.cs (Struct::Struct): set the SEALED flags after
18275         checking the modifiers.
18276         (TypeContainer::TypeAttr): new property, returns the
18277         TypeAttributes for a class.  
18278
18279         * cs-parser.jay (type_list): Oops, list production was creating a
18280         new list of base types.
18281
18282         * rootcontext.cs (StdLib): New property.
18283         (GetInterfaceTypeByName): returns an interface by type name, and
18284         encapsulates error handling here.
18285         (GetInterfaces): simplified.
18286         (ResolveTree): Encapsulated all the tree resolution here.
18287         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
18288         types. 
18289
18290         * driver.cs: Add support for --nostdlib, to avoid loading the
18291         default assemblies.
18292         (Main): Do not put tree resolution here. 
18293
18294         * rootcontext.cs: Beginning of the class resolution.
18295
18296 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
18297
18298         * rootcontext.cs: Provide better error reporting. 
18299
18300         * cs-parser.jay (interface_base): set our $$ to be interfaces.
18301
18302         * rootcontext.cs (CreateInterface): Handle the case where there
18303         are no parent interfaces.
18304
18305         (CloseTypes): Routine to flush types at the end.
18306         (CreateInterface): Track types.
18307         (GetInterfaces): Returns an array of Types from the list of
18308         defined interfaces.
18309
18310         * typemanager.c (AddUserType): Mechanism to track user types (puts
18311         the type on the global type hash, and allows us to close it at the
18312         end). 
18313
18314 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
18315
18316         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
18317         RecordInterface instead.
18318
18319         * cs-parser.jay: Updated to reflect changes above.
18320
18321         * decl.cs (Definition): Keep track of the TypeBuilder type that
18322         represents this type here.  Not sure we will use it in the long
18323         run, but wont hurt for now.
18324
18325         * driver.cs: Smaller changes to accomodate the new code.
18326
18327         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
18328         when done. 
18329
18330         * rootcontext.cs (CreateInterface):  New method, used to create
18331         the System.TypeBuilder type for interfaces.
18332         (ResolveInterfaces): new entry point to resolve the interface
18333         hierarchy. 
18334         (CodeGen): Property, used to keep track of the code generator.
18335
18336 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
18337
18338         * cs-parser.jay: Add a second production for delegate_declaration
18339         with `VOID'.
18340
18341         (enum_body): Put an opt_comma here instead of putting it on
18342         enum_body or enum_member_declarations so we can handle trailing
18343         commas on enumeration members.  Gets rid of a shift/reduce.
18344
18345         (type_list): Need a COMMA in the middle.
18346
18347         (indexer_declaration): Tell tokenizer to recognize get/set
18348
18349         * Remove old targets.
18350
18351         * Re-add the parser target.
18352
18353 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18354
18355         * cs-parser.jay: Add precendence rules for a number of operators
18356         ot reduce the number of shift/reduce conflicts in the grammar.
18357
18358 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
18359
18360         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
18361         and put it here.
18362
18363         Get rid of old crufty code.
18364
18365         * rootcontext.cs: Use this to keep track of the parsed
18366         representation and the defined types available to the program. 
18367
18368         * gen-treedump.cs: adjust for new convention.
18369
18370         * type.cs: Split out the type manager, and the assembly builder
18371         from here. 
18372
18373         * typemanager.cs: the type manager will live here now.
18374
18375         * cil-codegen.cs: And the code generator here. 
18376
18377 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
18378
18379         * makefile: Fixed up for easy making.
18380
18381 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18382
18383         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
18384         the 
18385
18386         (unary_expression): Expand pre_increment_expression and
18387         post_decrement_expression to reduce a shift/reduce.
18388
18389 2001-07-11  Simon Cozens
18390
18391         * cs-tokenizer.cs: Hex numbers should begin with a 0.
18392
18393         Improve allow_keyword_as_indent name.
18394
18395 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
18396
18397         * Adjustments for Beta2. 
18398
18399 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
18400
18401         * decl.cs: Added `Define' abstract method.
18402         (InTransit): new property, used to catch recursive definitions. 
18403
18404         * interface.cs: Implement `Define'. 
18405
18406         * modifiers.cs: Map Modifiers.constants to
18407         System.Reflection.TypeAttribute flags.
18408
18409         * class.cs: Keep track of types and user-defined types.
18410         (BuilderInit): New method for creating an assembly
18411         (ResolveType): New function to launch the resolution process, only
18412         used by interfaces for now.
18413
18414         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
18415         that are inserted into the name space. 
18416
18417 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
18418
18419         * ARGH.  I have screwed up my tree so many times due to the use of
18420         rsync rather than using CVS.  Going to fix this at once. 
18421
18422         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
18423         load types.
18424
18425 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
18426
18427         * Experiment successful: Use System.Type rather that our own
18428         version of Type.  
18429
18430 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
18431
18432         * cs-parser.jay: Removed nsAliases from here.
18433
18434         Use new namespaces, handle `using XXX;' 
18435
18436         * namespace.cs: Reimplemented namespace handling, use a recursive
18437         definition of the class.  Now we can keep track of using clauses
18438         and catch invalid using clauses.
18439
18440 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
18441
18442         * gen-treedump.cs: Adapted for all the renaming.
18443
18444         * expression.cs (Expression): this class now has a Type property
18445         which returns an expression Type.
18446
18447         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
18448         `Type', as this has a different meaning now in the base
18449
18450 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
18451
18452         * interface.cs, class.cs: Removed from all the sources the
18453         references to signature computation, as we can not do method
18454         signature computation during the parsing time, as we are not
18455         trying to solve at that point distinguishing:
18456
18457         class X {
18458                 void a (Blah x) {}
18459                 void a (NS.Blah x) {}
18460         }
18461
18462         Which depending on the context might be valid or not, as we do not
18463         know if Blah is the same thing as NS.Blah at that point.
18464
18465         * Redid everything so the code uses TypeRefs now instead of
18466         Types.  TypeRefs are just temporary type placeholders, that need
18467         to be resolved.  They initially have a pointer to a string and the
18468         current scope in which they are used.  This is used later by the
18469         compiler to resolve the reference to an actual Type. 
18470
18471         * DeclSpace is no longer a CIR.Type, and neither are
18472         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
18473         are all DeclSpaces, but no Types. 
18474
18475         * type.cs (TypeRefManager): This implements the TypeRef manager,
18476         which keeps track of all the types that need to be resolved after
18477         the parsing has finished. 
18478
18479 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
18480
18481         * ARGH.  We are going to have to store `foreach' as a class rather
18482         than resolving it, as we need to verify error 1579 after name
18483         resolution.   *OR* we could keep a flag that says `This request to
18484         IEnumerator comes from a foreach statement' which we can then use
18485         to generate the error.
18486
18487 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
18488
18489         * class.cs (TypeContainer.AddMethod): we now add methods to the
18490         MethodGroup instead of the method hashtable.  
18491
18492         * expression.cs: Add MethodGroup abstraction, which gets us one
18493         step closer to the specification in the way we handle method
18494         declarations.  
18495
18496         * cs-parser.jay (primary_expression): qualified_identifier now
18497         tried to match up an identifier to a local variable reference or
18498         to a parameter reference.
18499
18500         current_local_parameters is now a parser global variable that
18501         points to the current parameters for the block, used during name
18502         lookup.
18503
18504         (property_declaration): Now creates an implicit `value' argument to
18505         the set accessor.
18506
18507 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18508
18509         * parameter.cs: Do not use `param' arguments as part of the
18510         signature, per the spec.
18511
18512 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18513
18514         * decl.cs: Base class for classes, structs and interfaces.  This
18515         is the "Declaration Space" 
18516
18517         * cs-parser.jay: Use CheckDef for checking declaration errors
18518         instead of having one on each function.
18519
18520         * class.cs: Factor out some code for handling error handling in
18521         accordance to the "Declarations" section in the "Basic Concepts"
18522         chapter in the ECMA C# spec.
18523
18524         * interface.cs: Make all interface member classes derive from
18525         InterfaceMemberBase.
18526
18527 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18528
18529         * Many things: all interfaces are parsed and generated in
18530         gen-treedump.  Support for member variables, constructors,
18531         destructors, properties, constants is there.
18532
18533         Beginning of the IL backend, but very little done, just there for
18534         testing purposes. 
18535
18536 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18537
18538         * cs-parser.jay: Fix labeled statement.
18539
18540         * cs-tokenizer.cs (escape): Escape " and ' always.
18541         ref_line, ref_name: keep track of the line/filename as instructed
18542         by #line by the compiler.
18543         Parse #line.
18544
18545 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18546
18547         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18548         to match the values in System.CodeDOM.
18549
18550         Divid renamed to Divide.
18551
18552         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18553         statements. 
18554         (Statements.set): remove.
18555
18556         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18557         statements. 
18558
18559         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18560         falseStatements always have valid values. 
18561
18562         * cs-parser.jay: Use System.CodeDOM now.
18563