**** Merged r36189 from MCS ****
[mono.git] / mcs / gmcs / ChangeLog
1 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
2
3         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
4         routine that is used to report the use of a captured variable
5         whose address has been taken.
6
7         There are two checks: one when variables are being captured and
8         the other check is when the address of a variable is taken. 
9         
10         (because an anonymous methods might be resolved before *or* after
11         the address has been taken) and 
12
13         * expression.cs (Conditional.DoResolve): Remove the special
14         casing that Martin added to trueExpr and falseExpr being both
15         NullLiteral.  We get the right behavior now just by introducing
16         the null_type into the compiler. 
17
18         * convert.cs (ExplicitConversion): Change the code to use
19         null_type instead of testing `expr is NullLiteral'.
20         (ImplicitConversionStandard): use null_type too.
21         (ImplicitReferenceConversionExists): use null_type too.
22         (ImplicitReferenceConversion): use null_type too.
23
24         * literal.cs: The type of `NullLiteral' is now null_type instead
25         of object_type. 
26         (Resolve): Set the type here.
27
28         * typemanager.cs: Introduce null_type.
29
30 2004-11-18  Martin Baulig  <martin@ximian.com>
31
32         * rootcontext.cs
33         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
34
35 2004-11-18  Martin Baulig  <martin@ximian.com>
36
37         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
38
39 2004-11-18  Martin Baulig  <martin@ximian.com>
40
41         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
42         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
43         call ResolveConstructedType() on it to resolve it without checking
44         constraints.
45         (Constraints.ResolveTypes): Check them here.
46         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
47         but don't check constraints.
48         (ConstructedType.ResolveAsTypeTerminal): Override this and also
49         check constraints here.
50         (ConstructedType.ResolveConstructedType): New public method.  This
51         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
52         resolve ourselves without checking constraints.
53
54         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
55
56 2004-11-18  Martin Baulig  <martin@ximian.com>
57
58         * decl.cs
59         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
60
61         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
62
63 2004-11-18  Martin Baulig  <martin@ximian.com>
64
65         * ecore.cs (TypeExpr.ResolveType): Removed.
66         (Expression.ResolveAsTypeTerminal): We always return a fully
67         resolved `TypeExpr', so we can just access its `Type'.
68
69         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
70
71 2004-11-17  Martin Baulig  <martin@ximian.com>
72
73         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
74         sure we don't return any unresolved TypeExpr's.
75         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
76         a `TypeExpr'.
77         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
78
79         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
80         unresolved `ConstructedType's.
81
82 2004-11-17  Martin Baulig  <martin@ximian.com>
83
84         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
85
86 2004-11-17  Martin Baulig  <martin@ximian.com>
87
88         * ecore.cs
89         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
90
91         * decl.cs (DeclSpace.ResolveType): Removed.
92         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
93
94 2004-11-17  Martin Baulig  <martin@ximian.com>
95
96         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
97         direction, like FindMembers() does.  Fixes #69546, testcase is in
98         test-315.cs.    
99
100 2004-11-16  Martin Baulig  <martin@ximian.com>
101
102         This is based on a patch from Marek Safar, see bug #69082.
103         Fixes bugs #63705 and #67130.
104
105         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
106         method; create a MemberCache for an interface type and cache the
107         result.
108
109         * decl.cs (IMemberContainer.ParentContainer): Removed.
110         (IMemberContainer.ParentCache): New property.
111         (MemberCache.SetupCacheForInterface): Removed.
112         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
113         to create a cache for an interface's "parent".
114
115         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
116         interfaces too.
117
118 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
119
120         * statement.cs: Avoid adding bools to a hashtable.
121
122 2004-11-15  Martin Baulig  <martin@ximian.com>
123
124         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
125
126 2004-11-11  Martin Baulig  <martin@ximian.com>
127
128         * typemanager.cs (TypeManager.GetMethodName): New method.
129
130         * class.cs (MethodData.Define): Include the generic arity in the
131         name of an explicit interface; also add it to the method name.
132
133         * pending.cs (PendingImplementation.InterfaceMethod): The method
134         name now includes the generic arity.
135
136 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
137
138         * expression.cs (Invocation.OverloadResolve): Flag error if we are
139         calling an unsafe method from a safe location.
140
141 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
142
143         Fix #69167
144         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
145
146 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
147
148         * namespace.cs (VerifyUsing): use GetPartialName instead of
149         ToString. 
150
151 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
152
153         * statement.cs (Return.Resolve): Fix regression in typo: if
154         `in_exc', we have to request a NeedReturnLabel, this was a typo
155         introduced in the anonymous method check-in.  Fixes #69131.
156
157         * Indexers were using the ShortName when defining themselves,
158         causing a regression in the compiler bootstrap when applying the
159         patch from 2004-11-02 (first part), now they use their full name
160         and the bug is gone.
161
162 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
163
164         * driver.cs: Strip the path from the names of embedded resources. Fixes
165         #68519.
166
167 2004-11-04  Raja R Harinath  <rharinath@novell.com>
168
169         Fix error message regression: cs0104-2.cs.
170         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
171         (AliasEntry.Resolve): Update.
172         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
173         'silent' flag.
174         (RootContext.LookupType): Update.
175
176 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
177
178         * cs-parser.jay: Add support for handling accessor modifiers
179         * class: Add support port accessor modifiers and error checking,
180         define PropertyMethod.Define as virtual (not abstract anymore)
181         * ecore.cs: Add checking for proeprties access with access modifiers
182         * iterators.cs: Modify Accessor constructor call based in the modified
183         constructor
184 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
185
186         * expression.cs (StringConcat): Handle being called twice,
187         as when we have a concat in a field init with more than two
188         ctors in the class
189
190 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
191
192         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
193         special case explicit implementations, we should always produce
194         the .property or .event declaration.
195         
196         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
197         since it will not return correct data if people use this
198         unresolved in the presence of using statements (see test-313).
199
200         * class.cs (MethodData.Define): If we are an explicit interface
201         implementation, set the method name to the full name of the
202         interface plus the name of the method.  
203
204         Notice that using the method.MethodName.GetFullName() does not
205         work, as it will only contain the name as declared on the source
206         file (it can be a shorthand in the presence of using statements)
207         and not the fully qualifed type name, for example:
208
209         using System;
210
211         class D : ICloneable {
212                 object ICloneable.Clone ()  {
213                 }
214         }
215
216         Would produce a method called `ICloneable.Clone' instead of
217         `System.ICloneable.Clone'.
218
219         * namespace.cs (Alias.Resolve): Use GetPartialName.
220         
221 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
222
223         * cs-parser.jay: Add error 1055 report.
224
225 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
226
227         * assign.cs (Assign.DoResolve): Only do the transform of
228         assignment into a New if the types are compatible, if not, fall
229         through and let the implicit code deal with the errors and with
230         the necessary conversions. 
231
232 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
233
234         * cs-parser.jay: Add error 1031 report.
235
236         * cs-tokenizer.cs: Add location for error 1038.
237
238 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
239
240         * cs-parser.jay: Add error 1016 report.
241
242 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
243
244         * cs-parser.jay: Add errors 1575,1611 report.
245
246 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
247
248         * cs-parser.jay: Add error 1001 report.
249
250 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
251
252         Fix #68850
253         * attribute.cs (GetMarshal): Add method argument for
254         caller identification.
255
256         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
257         agument for GetMarshal and RuntimeMissingSupport.
258
259 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
260
261         * attribute.cs (ExtractSecurityPermissionSet): Removed
262         TypeManager.code_access_permission_type.
263
264         * typemanager.cs: Removed TypeManager.code_access_permission_type.
265
266 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
267
268         * expression.cs (LocalVariableReference.DoResolveLValue): Check
269         for obsolete use of a variable here.   Fixes regression on errors
270         cs0619-25 and cs0619-26.
271
272 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
273
274         Fix #62358, implemented security attribute encoding.
275
276         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
277         Tests permitted SecurityAction for assembly or other types.
278         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
279         data from SecurityPermissionAttribute to PermisionSet class.
280
281         * class.cs (ApplyAttributeBuilder): Added special handling
282         for System.Security.Permissions.SecurityAttribute based types.
283
284         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
285         special handling for System.Security.Permissions.SecurityAttribute
286         based types.
287
288         * enum.cs (ApplyAttributeBuilder): Added special handling
289         for System.Security.Permissions.SecurityAttribute based types.
290
291         * parameter.cs (ApplyAttributeBuilder): Added special handling
292         for System.Security.Permissions.SecurityAttribute based types.
293
294         * rootcontext.cs: Next 2 core types.
295
296         * typemanager.cs (TypeManager.security_permission_attr_type):
297         Built in type for the SecurityPermission Attribute.
298         (code_access_permission_type): Build in type.
299
300 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
301
302         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
303         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
304         all of this information into
305         EmitContext.EmitCapturedVariableInstance.
306         
307         * codegen.cs (EmitCapturedVariableInstance): move here the
308         funcionality of emitting an ldarg.0 in the presence of a
309         remapping.   This centralizes the instance emit code.
310
311         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
312         then emit a load of this: it means that we have reached the
313         topmost ScopeInfo: the one that contains the pointer to the
314         instance of the class hosting the anonymous method.
315
316         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
317         captures to the topmost CaptureContext.
318
319 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
320
321         * expression.cs (LocalVariableReference): Move the knowledge about
322         the iterators into codegen's EmitCapturedVariableInstance.
323
324 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
325
326         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
327         all code paths return a value from an anonymous method (it is the
328         same as the 161 error, but for anonymous methods).
329
330 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
331
332         The introduction of anonymous methods in the compiler changed
333         various ways of doing things in the compiler.  The most
334         significant one is the hard split between the resolution phase
335         and the emission phases of the compiler.
336
337         For instance, routines that referenced local variables no
338         longer can safely create temporary variables during the
339         resolution phase: they must do so from the emission phase,
340         since the variable might have been "captured", hence access to
341         it can not be done with the local-variable operations from the runtime.
342         
343         * statement.cs 
344
345         (Block.Flags): New flag `IsTopLevel' to indicate that this block
346         is a toplevel block.
347
348         (ToplevelBlock): A new kind of Block, these are the blocks that
349         are created by the parser for all toplevel method bodies.  These
350         include methods, accessors and anonymous methods.
351
352         These contain some extra information not found in regular blocks:
353         A pointer to an optional CaptureContext (for tracking captured
354         local variables and parameters).  A pointer to the parent
355         ToplevelBlock.
356         
357         (Return.Resolve): Catch missmatches when returning a value from an
358         anonymous method (error 1662).
359         Invoke NeedReturnLabel from the Resolve phase instead of the emit
360         phase.
361
362         (Break.Resolve): ditto.
363
364         (SwitchLabel): instead of defining the labels during the
365         resolution phase, we now turned the public ILLabel and ILLabelCode
366         labels into methods called GetILLabelCode() and GetILLabel() that
367         only define the label during the Emit phase.
368
369         (GotoCase): Track the SwitchLabel instead of the computed label
370         (its contained therein).  Emit the code by using
371         SwitchLabel.GetILLabelCode ().
372
373         (LocalInfo.Flags.Captured): A new flag has been introduce to track
374         whether the Local has been captured or not.
375
376         (LocalInfo.IsCaptured): New property, used to tell whether the
377         local has been captured.
378         
379         * anonymous.cs: Vastly updated to contain the anonymous method
380         support.
381
382         The main classes here are: CaptureContext which tracks any
383         captured information for a toplevel block and ScopeInfo used to
384         track the activation frames for various local variables.   
385
386         Each toplevel block has an optional capture context associated
387         with it.  When a method contains an anonymous method both the
388         toplevel method and the anonymous method will create a capture
389         context.   When variables or parameters are captured, they are
390         recorded on the CaptureContext that owns them, for example:
391
392         void Demo () {
393              int a;
394              MyDelegate d = delegate {
395                  a = 1;
396              }
397         }
398
399         Here `a' will be recorded as captured on the toplevel
400         CapturedContext, the inner captured context will not have anything
401         (it will only have data if local variables or parameters from it
402         are captured in a nested anonymous method.
403
404         The ScopeInfo is used to track the activation frames for local
405         variables, for example:
406
407         for (int i = 0; i < 10; i++)
408                 for (int j = 0; j < 10; j++){
409                    MyDelegate d = delegate {
410                         call (i, j);
411                    }
412                 }
413
414         At runtime this captures a single captured variable `i', but it
415         captures 10 different versions of the variable `j'.  The variable
416         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
417         recorded on a child.  
418
419         The toplevel ScopeInfo will also track information like the `this'
420         pointer if instance variables were referenced (this is necessary
421         as the anonymous method lives inside a nested class in the host
422         type of the method). 
423
424         (AnonymousMethod): Expanded to track the Toplevel, implement
425         `AnonymousMethod.Compatible' to tell whether an anonymous method
426         can be converted to a target delegate type. 
427
428         The routine now also produces the anonymous method content
429
430         (AnonymousDelegate): A helper class that derives from
431         DelegateCreation, this is used to generate the code necessary to
432         produce the delegate for the anonymous method that was created. 
433
434         * assign.cs: API adjustments for new changes in
435         Convert.ImplicitStandardConversionExists.
436
437         * class.cs: Adjustments to cope with the fact that now toplevel
438         blocks are of type `ToplevelBlock'. 
439
440         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
441         insteda of standard blocks.
442
443         Flag errors if params arguments are passed to anonymous methods.
444
445         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
446         `CurrentAnonymousMethod' which points to the current Anonymous
447         Method.  The variable points to the AnonymousMethod class that
448         holds the code being compiled.  It is set in the new EmitContext
449         created for the anonymous method.
450
451         (EmitContext.Phase): Introduce a variable and an enumeration to
452         assist in enforcing some rules about when and where we are allowed
453         to invoke certain methods (EmitContext.NeedsReturnLabel is the
454         only one that enfonces this right now).
455
456         (EmitContext.HaveCaptureInfo): new helper method that returns
457         whether we have a CapturedContext initialized.
458
459         (EmitContext.CaptureVariable): New method used to register that a
460         LocalInfo must be flagged for capturing. 
461
462         (EmitContext.CapturedParameter): New method used to register that a
463         parameters must be flagged for capturing. 
464         
465         (EmitContext.CapturedField): New method used to register that a
466         field must be flagged for capturing. 
467
468         (EmitContext.HaveCapturedVariables,
469         EmitContext.HaveCapturedFields): Return whether there are captured
470         variables or fields. 
471
472         (EmitContext.EmitMethodHostInstance): This is used to emit the
473         instance for the anonymous method.  The instance might be null
474         (static methods), this (for anonymous methods that capture nothing
475         and happen to live side-by-side with the current method body) or a
476         more complicated expression if the method has a CaptureContext.
477
478         (EmitContext.EmitTopBlock): Routine that drives the emission of
479         code: it will first resolve the top block, then emit any metadata
480         and then emit the code.  The split is done so that we can extract
481         any anonymous methods and flag any captured variables/parameters.
482         
483         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
484         during this phase, the ILGenerator should not be used as labels
485         and local variables declared here might not be accessible to any
486         code that is part of an anonymous method.  
487
488         Exceptions to this include the temporary variables that are
489         created by some statements internally for holding temporary
490         variables. 
491         
492         (EmitContext.EmitMeta): New routine, in charge of emitting all the
493         metadata for a cb
494
495         (EmitContext.TemporaryReturn): This method is typically called
496         from the Emit phase, and its the only place where we allow the
497         ReturnLabel to be defined other than the EmitMeta.  The reason is
498         that otherwise we would have to duplicate a lot of logic in the
499         Resolve phases of various methods that today is on the Emit
500         phase. 
501
502         (EmitContext.NeedReturnLabel): This no longer creates the label,
503         as the ILGenerator is not valid during the resolve phase.
504
505         (EmitContext.EmitThis): Extended the knowledge in this class to
506         work in anonymous methods in addition to iterators. 
507
508         (EmitContext.EmitCapturedVariableInstance): This emits whatever
509         code is necessary on the stack to access the instance to a local
510         variable (the variable will be accessed as a field).
511
512         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
513         EmitContext.EmitAddressOfParameter): Routines to support
514         parameters (not completed at this point). 
515         
516         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
517         will also remove the parameters.
518
519         * convert.cs (Convert): Define a `ConstantEC' which points to a
520         null.  This is just to prefity some code that uses
521         ImplicitStandardConversion code and do not have an EmitContext
522         handy.
523
524         The idea is to flag explicitly that at that point in time, it is
525         known that the conversion will not trigger the delegate checking
526         code in implicit conversions (which requires a valid
527         EmitContext). 
528
529         Everywhere: pass new EmitContext parameter since
530         ImplicitStandardConversionExists now requires it to check for
531         anonymous method conversions. 
532
533         (Convert.ImplicitStandardConversionExists): If the type of an
534         expression is the anonymous_method_type, and the type is a
535         delegate, we invoke the AnonymousMethod.Compatible method to check
536         whether an implicit conversion is possible. 
537
538         (Convert.ImplicitConversionStandard): Only do implicit method
539         group conversions if the language level is not ISO_1.
540
541         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
542         MethodInfo for the Invoke method.  used by Delegate and
543         AnonymousDelegate.
544
545         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
546         method conversions if the target type is a delegate.
547
548         Removed extra debugging nops.
549
550         (LocalVariableReference): Turn the `local_info' into a public
551         field. 
552
553         Add `prepared' field, the same hack used for FieldExprs to cope
554         with composed assignments, as Local variables do not necessarily
555         operate purely on the stack as they used to: they can be captured
556         fields. 
557
558         Add `temp' for a temporary result, like fields.
559
560         Refactor DoResolve and DoResolveLValue into DoResolveBase.
561
562         It now copes with Local variables that are captured and emits the
563         proper instance variable to load it from a field in the captured
564         case. 
565
566         (ParameterReference.DoResolveBase): During the resolve phase,
567         capture parameters if we are in an anonymous method.
568
569         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
570         anonymous method, use the EmitContext helper routines to emit the
571         parameter reference.
572
573         * iterators.cs: Set RemapToProxy to true/false during the
574         EmitDispose class.
575
576         * parameters.cs (GetParameterByName): New helper method. 
577
578         * typemanager.cs (anonymous_method_type) a new type that
579         represents an anonyous method.  This is always an internal type,
580         used as a fencepost to test against the anonymous-methodness of an
581         expression. 
582         
583 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
584
585         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
586         561 report.
587         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
588
589 2004-11-10  Martin Baulig  <martin@ximian.com>
590
591         * expression.cs (Invocation.BetterFunction): If two methods have
592         equal parameter types, but only one of them is generic, the
593         non-generic one wins.
594         (New.DoResolve): Don't set `is_struct' to false if we're a generic
595         instance; just use `Type.IsValueType' to determine whether
596         something is a struct or not.
597         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
598         so we can be called multiple times.
599
600 2004-11-10  Martin Baulig  <martin@ximian.com>
601
602         * generic.cs (TypeParameter.DefineConstraints): New public method.
603         (TypeParameter.CheckAccessLevel): Override this and return true.
604         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
605         override ResolveType() anymore.
606         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
607
608 2004-11-10  Martin Baulig  <martin@ximian.com>
609
610         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
611         call DeclSpace.ResolveNestedType() on it.
612
613 2004-11-10  Martin Baulig  <martin@ximian.com>
614
615         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
616         non-null, call ParameterModifier() on it.
617
618 2004-11-10  Martin Baulig  <martin@ximian.com>
619
620         * iterators.cs
621         (Iterators): Added `current_type' and `this_type' fields.
622         (Iterators.DefineIterator): Create a new EmitContext and store it
623         in `ec'; compute `this_type'.
624
625 2004-11-10  Martin Baulig  <martin@ximian.com>
626
627         * typemanager.cs
628         (TypeManager.IsPrivateAccessible): New public method.
629         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
630
631 2004-11-10  Martin Baulig  <martin@ximian.com>
632
633         * class.cs (TypeContainer.DefineType): Call
634         TypeBuilder.DefineGenericParameters() before resolving the type
635         parameters.
636         (MethodData.parent_method): New protected field.
637         (MethodData..ctor): Added `MethodInfo parent_method' argument.
638         (MethodData.Define): Compute `parent_method'.
639
640         * decl.cs
641         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
642         (MemberCore.GetClsCompliantAttributeValue): Likewise.
643         (DeclSpace.ec): New protected field; store the EmitContext here.
644         (DeclSpace.EmitContext): New public property.
645         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
646         (DeclSpace.ResolveNestedType): New public method.
647         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
648         (DeclSpace.NestedAccessible): Added `Type tb' argument.
649         (DeclSpace.FamilyAccessible): Likewise.
650         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
651         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
652         EmitContext.
653
654         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
655         field.
656
657         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
658         (Enum.Emit): Don't create a new EmitContext.
659
660 2004-10-18  Martin Baulig  <martin@ximian.com>
661
662         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
663         `Type' directly, but call ResolveType() on it.
664         (Catch.Resolve): Likewise.
665         (Foreach.Resolve): Likewise.
666
667 2004-10-18  Martin Baulig  <martin@ximian.com>
668
669         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
670         `Type' directly, but call ResolveType() on it.
671         (Probe.DoResolve): Likewise.
672         (ArrayCreation.LookupType): Likewise.
673         (TypeOf.DoResolve): Likewise.
674         (SizeOf.DoResolve): Likewise.
675
676 2004-10-18  Raja R Harinath  <rharinath@novell.com>
677
678         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
679         the ResolveType.
680
681 2004-10-17  John Luke  <john.luke@gmail.com>
682
683         * class.cs (Operator.GetSignatureForError): use CSharpName
684
685         * parameter.cs (Parameter.GetSignatureForError): Returns
686         correct name even if was not defined.
687
688 2004-10-13  Raja R Harinath  <rharinath@novell.com>
689
690         Fix #65816.
691         * class.cs (TypeContainer.EmitContext): New property.
692         (DefineNestedTypes): Create an emitcontext for each part.
693         (MethodCore.DoDefineParameters): Use container's emitcontext.
694         Pass type array to InternalParameters.
695         (MemberBase.DoDefine): Use container's emitcontext.
696         (FieldMember.Define): Likewise.
697         (Event.Define): Likewise.
698         (SetMethod.GetParameterInfo): Change argument to EmitContext.
699         Pass type array to InternalParameters.
700         (SetIndexerMethod.GetParameterInfo): Likewise.
701         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
702         * delegate.cs (Define): Pass emitcontext to
703         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
704         array to InternalParameters.
705         * expression.cs (ParameterReference.DoResolveBase): Pass
706         emitcontext to GetParameterInfo.
707         (ComposedCast.DoResolveAsTypeStep): Remove check on
708         ec.ResolvingTypeTree.
709         * parameter.cs (Parameter.Resolve): Change argument to
710         EmitContext.  Use ResolveAsTypeTerminal.
711         (Parameter.GetSignature): Change argument to EmitContext.
712         (Parameters.ComputeSignature): Likewise.
713         (Parameters.ComputeParameterTypes): Likewise.
714         (Parameters.GetParameterInfo): Likewise.
715         (Parameters.ComputeAndDefineParameterTypes): Likewise.
716         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
717         * support.cs (InternalParameters..ctor): Remove variant that takes
718         a DeclSpace.
719         * typemanager.cs (system_intptr_expr): New.
720         (InitExpressionTypes): Initialize it.
721
722 2004-10-12  Chris Toshok  <toshok@ximian.com>
723
724         * cs-parser.jay: fix location for try_statement and catch_clause.
725
726 2004-10-18  Martin Baulig  <martin@ximian.com>
727
728         * class.cs (FieldMember.Define): Don't access the TypeExpr's
729         `Type' directly, but call ResolveType() on it.
730         (MemberBase.DoDefine): Likewise.
731
732         * expression.cs (New.DoResolve): Don't access the TypeExpr's
733         `Type' directly, but call ResolveType() on it.
734         (ComposedCast.DoResolveAsTypeStep): Likewise.
735
736         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
737         `Type' directly, but call ResolveType() on it.
738
739 2004-10-17  John Luke  <john.luke@gmail.com>
740
741         * class.cs (Operator.GetSignatureForError): use CSharpName
742
743         * parameter.cs (Parameter.GetSignatureForError): Returns
744         correct name even if was not defined.
745
746 2004-10-13  Raja R Harinath  <rharinath@novell.com>
747
748         Fix #65816.
749         * class.cs (TypeContainer.EmitContext): New property.
750         (DefineNestedTypes): Create an emitcontext for each part.
751         (MethodCore.DoDefineParameters): Use container's emitcontext.
752         Pass type array to InternalParameters.
753         (MemberBase.DoDefine): Use container's emitcontext.
754         (FieldMember.Define): Likewise.
755         (Event.Define): Likewise.
756         (SetMethod.GetParameterInfo): Change argument to EmitContext.
757         Pass type array to InternalParameters.
758         (SetIndexerMethod.GetParameterInfo): Likewise.
759         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
760         * delegate.cs (Define): Pass emitcontext to
761         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
762         array to InternalParameters.
763         * expression.cs (ParameterReference.DoResolveBase): Pass
764         emitcontext to GetParameterInfo.
765         (ComposedCast.DoResolveAsTypeStep): Remove check on
766         ec.ResolvingTypeTree.
767         * parameter.cs (Parameter.Resolve): Change argument to
768         EmitContext.  Use ResolveAsTypeTerminal.
769         (Parameter.GetSignature): Change argument to EmitContext.
770         (Parameters.ComputeSignature): Likewise.
771         (Parameters.ComputeParameterTypes): Likewise.
772         (Parameters.GetParameterInfo): Likewise.
773         (Parameters.ComputeAndDefineParameterTypes): Likewise.
774         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
775         * support.cs (InternalParameters..ctor): Remove variant that takes
776         a DeclSpace.
777         * typemanager.cs (system_intptr_expr): New.
778         (InitExpressionTypes): Initialize it.
779
780 2004-10-12  Chris Toshok  <toshok@ximian.com>
781
782         * cs-parser.jay: fix location for try_statement and catch_clause.
783
784 2004-10-07  Raja R Harinath  <rharinath@novell.com>
785
786         More DeclSpace.ResolveType avoidance.
787         * decl.cs (MemberCore.InUnsafe): New property.
788         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
789         with newly created EmitContext.
790         (FieldMember.Define): Likewise.
791         * delegate.cs (Delegate.Define): Likewise.
792         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
793         only if normal name-lookup fails.
794         (TypeExpr.DoResolve): Enable error-checking.
795         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
796         (SizeOf.DoResolve): Likewise.
797         (ComposedCast.DoResolveAsTypeStep): Likewise.
798         (StackAlloc.DoResolve): Likewise.
799         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
800         (Block.Unsafe): New property.
801         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
802         (Unsafe): Set 'unsafe' flag of contained block.
803         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
804         (Fixed.Resolve): Likewise.
805         (Catch.Resolve): Likewise.
806         (Using.ResolveLocalVariableDecls): Likewise.
807         (Foreach.Resolve): Likewise.
808
809 2004-10-05  John Luke <john.luke@gmail.com>
810
811         * cs-parser.jay: add location to error CS0175
812
813 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
814
815         * ecore.cs (Expression.Constantity): Add support for turning null
816         into a constant.
817
818         * const.cs (Const.Define): Allow constants to be reference types
819         as long as the value is Null.
820
821 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
822
823         * namespace.cs (NamespaceEntry.Using): No matter which warning
824         level is set, check if this namespace name has already been added.
825
826 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
827
828         * expression.cs: reftype [!=]= null should always use br[true,false].
829         # 67410
830
831 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
832
833         Fix #67108
834         * attribute.cs: Enum conversion moved to 
835         GetAttributeArgumentExpression to be applied to the all
836         expressions.
837
838 2004-10-01  Raja R Harinath  <rharinath@novell.com>
839
840         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
841         * class.c (TypeContainer.DefineType): Flag error if
842         base types aren't accessible due to access permissions.
843         * decl.cs (DeclSpace.ResolveType): Move logic to
844         Expression.ResolveAsTypeTerminal.
845         (DeclSpace.ResolveTypeExpr): Thin layer over
846         Expression.ResolveAsTypeTerminal.
847         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
848         Refactor code into NestedAccess.  Use it.
849         (DeclSpace.NestedAccess): New.
850         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
851         argument to silence errors.  Check access permissions.
852         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
853         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
854         (Cast.DoResolve): Likewise.
855         (New.DoResolve): Likewise.
856         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
857         (TypeOf.DoResolve): Likewise.
858
859         * expression.cs (Invocation.BetterConversion): Return the Type of
860         the better conversion.  Implement section 14.4.2.3 more faithfully.
861         (Invocation.BetterFunction): Make boolean.  Make correspondence to
862         section 14.4.2.2 explicit.
863         (Invocation.OverloadResolve): Update.
864         (Invocation): Remove is_base field.
865         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
866         (Invocation.Emit): Likewise.
867
868 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
869
870         * cs-parser.jay: Reverted 642 warning fix.
871
872 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
873
874         Fix bug #66615
875         * decl.cs (FindMemberWithSameName): Indexer can have more than
876         1 argument.
877
878 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
879
880         * expression.cs (LocalVariableReference.DoResolveLValue):
881         Do not report warning 219 for out values.
882         (EmptyExpression.Null): New member to avoid extra allocations.
883
884 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
885
886         * cs-parser.jay: Fix wrong warning 642 report.
887
888         * cs-tokenizer.cs (CheckNextToken): New helper;
889         Inspect next character if is same as expected.
890
891 2004-09-23  Martin Baulig  <martin@ximian.com>
892
893         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
894         (Convert.ImplicitReferenceConversionExists): Likewise.
895
896 2004-11-09  Raja R Harinath  <rharinath@novell.com>
897
898         * Makefile (DISTFILES): Comment out a few missing files.
899
900 2004-10-29  Raja R Harinath  <rharinath@novell.com>
901
902         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
903         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
904         (gmcs.exe): Invoke bootstrap-libs.
905         (clean-local): Clean the net_2_0_bootstrap profile too.
906         (PROGRAM_INSTALL_DIR): New.
907         (install-local): Use it.
908
909 2004-10-13  Martin Baulig  <martin@ximian.com>
910
911         * generic.cs (TypeManager.InflatedConstraints): New nested class.
912         (TypeParameter.DefineType): If we're a method type parameter and
913         that method is overriding something, "inflate" its constraints.
914
915 2004-10-12  Martin Baulig  <martin@ximian.com>
916
917         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
918         and have type arguments, create and resolve a ConstructedType.
919
920 2004-10-12  Martin Baulig  <martin@ximian.com>
921
922         * decl.cs (MemberCache.FindMemberToOverride): Use
923         TypeManager.IsEqual() to compare the parameters and Type.Equals()
924         to compare the invocationType.
925
926         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
927         When comparing two type parameters, only do the signature-only
928         comparision for method type parameters.
929
930 2004-10-11  Martin Baulig  <martin@ximian.com>
931
932         * report.cs: Don't make --fatal abort on warnings, we have
933         -warnaserror for that.
934
935 2004-10-11  Martin Baulig  <martin@ximian.com>
936
937         * typemanager.cs
938         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
939         (TypeManager.IsEqual): Call ourself recursively instead of using
940         Type.IsEqual(). 
941
942 2004-10-11  Martin Baulig  <martin@ximian.com>
943
944         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
945         on our own type parameters, not on the ones we inherit from a containing
946         class.
947
948         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
949         the comparision.
950
951         * generic.cs (TypeParameter.Define): We may only be called once.
952
953         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
954         instead of TypeManager.IsEqual().
955
956 2004-09-28  Martin Baulig  <martin@ximian.com>
957
958         * generic.cs
959         (GenericConstraints.EffectiveBaseClass): New public property.
960         (TypeParameter.GenericConstraints): New public property.
961         (ConstructedType.CheckConstraints): Improved.
962
963         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
964         (Convert.TypeParameterConversion): New private method; use this in
965         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
966         for all conversions related to type parameters.
967
968 2004-09-24  Martin Baulig  <martin@ximian.com>
969
970         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
971         type parameter conversions for type parameters which are known to
972         be reference types.
973
974 2004-09-24  Martin Baulig  <martin@ximian.com>
975
976         * generic.cs (GenericConstraints): Added `IsReferenceType' and
977         `IsValueType' properties.
978
979         * support.cs (ReflectionConstraints): Use
980         Type.GetGenericParameterConstraints() instead of the old hack.
981
982 2004-09-24  Martin Baulig  <martin@ximian.com>
983
984         * generic.cs (GenericConstraints): Moved here and made it an
985         abstract class.
986
987         * support.cs (GenericConstraints): Moved to generic.cs.
988
989 2004-09-24  Martin Baulig  <martin@ximian.com>
990
991         * support.cs
992         (ReflectionConstraints): Un-nested this class and made it public.
993
994         * typemanager.cs
995         (TypeManager.GetTypeParameterConstraints): New public method.
996         (TypeManager.HasConstructorConstraint): Use the attributes.
997
998 2004-09-24  Martin Baulig  <martin@ximian.com>
999
1000         * support.cs (GenericConstraints): Replaced `HasConstructor',
1001         `IsReferenceType' and `IsValueType' with `Attributes'.
1002         (ReflectionParameters.ReflectionConstraints): Removed the Create()
1003         method and made the .ctor public.
1004
1005         * generic.cs (Constraints.Attributes): New public property.
1006         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
1007         `IsReferenceType' -> `HasReferenceTypeConstraint' and
1008         `IsValueType' -> `HasValueTypeConstraint'.
1009
1010 2004-09-23  Martin Baulig  <martin@ximian.com>
1011
1012         * generic.cs (Constraints): Reflect latest runtime changes.
1013
1014 2004-09-23  Martin Baulig  <martin@ximian.com>
1015
1016         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1017         (Convert.ImplicitReferenceConversionExists): Likewise.
1018
1019 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1020
1021         * class.cs (Operator.Define): Add error 448 and 559 report.
1022         
1023 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1024
1025         * class.cs (MemberBase.IsTypePermitted): New protected
1026         method for checking error CS0610.
1027
1028 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1029
1030         * class.cs (TypeContainer.HasExplicitLayout): New property
1031         Returns whether container has StructLayout attribute set Explicit.
1032         (FieldMember): New abstract class for consts and fields.
1033         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1034         (Field): Reuse FieldMember.
1035
1036         * const.cs (Const): Reuse FieldMember.
1037
1038         * rootcontext.cs: EmitConstants call moved to class.
1039
1040 2004-09-22  Martin Baulig  <martin@ximian.com>
1041
1042         Marek and me just fixed one of our oldest bugs: #28562 :-)
1043
1044         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1045
1046         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1047         we're an EnumConstant, just return that.
1048         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1049         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1050         to get the value which'll actually be written into the attribute.
1051         However, we have to use GetValue() to access the attribute's value
1052         in the compiler.        
1053
1054 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1055
1056         * constant.cs (Constant.IsNegative): New abstract property
1057         IsNegative.
1058
1059         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1060         (StackAlloc.DoResolve): Reused IsNegative.
1061
1062 2004-09-22  Martin Baulig  <martin@ximian.com>
1063
1064         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
1065         public method; like LookupTypeContainer, but also works for
1066         generic instances.
1067
1068         * report.cs (Report.SymbolRelatedToPreviousError): Use
1069         TypeManager.LookupGenericTypeContainer().       
1070
1071 2004-09-22  Martin Baulig  <martin@ximian.com>
1072
1073         Thanks to Peter Sestoft for this bug report.
1074
1075         * expression.cs (Conditional): If both the `trueExpr' and the
1076         `falseExpr' is a NullLiteral, return a NullLiteral.
1077
1078 2004-09-22  Martin Baulig  <martin@ximian.com>
1079
1080         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1081         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1082         for the "get_Current" call.
1083
1084 2004-09-21  Martin Baulig  <martin@ximian.com>
1085
1086         * convert.cs (Convert.ImplicitReferenceConversion): When
1087         converting to an interface type, first check whether we're
1088         converting from a reference type.
1089
1090 2004-09-14  Martin Baulig  <martin@ximian.com>
1091
1092         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1093
1094 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1095
1096         Fixed bug #61902
1097         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1098         called and is obsolete then this member suppress message
1099         when call is inside next [Obsolete] method or type.
1100
1101         * expression.cs: Use TestObsoleteMethodUsage member.
1102
1103 2004-09-14  Martin Baulig  <martin@ximian.com>
1104
1105         * genericparser.cs: Removed.
1106
1107 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1108
1109         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1110
1111 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1112
1113         * attribute.cs (Attribute.Resolve): Add error 653 report.
1114
1115         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1116         report.
1117         (Method.ApplyAttributeBuilder): Add error 685 report.
1118         (Operator.Define): Add error 564 report.
1119
1120         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1121
1122         * expression.cs (Invocation.DoResolve): Add error
1123         245 and 250 report.
1124
1125         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1126         error 674 report.
1127
1128 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1129
1130         * class.cs (ConstructorInitializer.Resolve):
1131         Wrong error number (515->516).
1132
1133 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1134
1135         * class.cs (Indexer.Define): Add error 631 report.
1136
1137 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1138
1139         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1140
1141 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1142
1143         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1144
1145 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1146
1147         * cs-parser.jay: Added error CS0241 report.
1148
1149 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1150
1151         * cs-parser.jay (fixed_statement): Introduce a scope for the
1152         declaration in the 'fixed' statement.
1153
1154 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1155
1156         * cs-parser.jay: Added CS0230 error report.
1157
1158 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1159
1160         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1161
1162 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1163
1164         * expression.cs (Argument.Resolve): Added error CS0192 and
1165         CS0199 report.
1166
1167 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1168
1169         C# 2.0 #pragma warning feature
1170
1171         * cs-tokenizer.cs (PreProcessPragma): New method; 
1172         Handles #pragma directive.
1173
1174         * report.cs (WarningRegions): New class; Support
1175         class for #pragma warning directive. It tests whether
1176         warning is enabled for a given line.
1177
1178 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1179
1180         * const.cs: Add more descriptive error report, tahnks to
1181         Sebastien. 
1182
1183 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1184
1185         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1186
1187 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1188
1189         * expression.cs: Apply patch from Ben: Remove dead code from
1190         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1191         as that code just threw an exception anwyays.
1192
1193         * const.cs: Remove the call to the turnintoconstant, for details
1194         see bug: #63144
1195         
1196         * literal.cs: The type of the null-literal is the null type;  So
1197         we use a placeholder type (literal.cs:System.Null, defined here)
1198         for it.
1199
1200         * expression.cs (Conditional.DoResolve): Remove some old code that
1201         is no longer needed, conversions have been fixed.
1202
1203         (ArrayCreationExpression.DoResolve): Return false if we fail to
1204         resolve the inner expression.
1205
1206 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1207
1208         Fix test-290.cs.
1209         * cs-parser.jay (delegate_declaration): Record a delegate
1210         declaration as a type declaration.
1211         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1212
1213 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1214
1215         * parameter.cs: Do not crash if the type can not be resolved. 
1216
1217         * expression.cs: Report errors with unsafe pointers, fixes #64896
1218
1219 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1220
1221         * expression.cs: Pointer arith always needs to do a conv.i
1222         if the operand is a long. fix 65320
1223
1224 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1225
1226         Fixed cs0619-37.cs, cs0619-38.cs
1227
1228         * enum.cs (GetObsoleteAttribute): Removed.
1229
1230         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1231         on Enum member is double staged. The first is tested member
1232         and then enum.
1233
1234 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1235
1236         Fixed #56986, #63631, #65231
1237
1238         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1239         adds member to name container.
1240         (TypeContainer.AddToTypeContainer): New method, adds type to
1241         name container.
1242         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1243         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1244         AddOperator): Simplified by reusing AddToMemberContainer.
1245         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1246         instead of field.
1247         (Method.CheckForDuplications): Fixed implementation to test all
1248         possibilities.
1249         (MemberBase): Detection whether member is explicit interface
1250         implementation is now in constructor.
1251         (MemberBase.UpdateMemberName): Handles IndexerName.
1252         (Accessor): Changed to keep also location information.
1253         (AbstractPropertyEventMethod): Is derived from MemberCore.
1254         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1255         will be emited or not.
1256         (PropertyBase.AreAccessorsDuplicateImplementation):
1257         Tests whether accessors are not in collision with some method.
1258         (Operator): Is derived from MethodCore to simplify common
1259         operations.
1260
1261         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1262         must be performed.
1263         (DeclSpace.AddToContainer): Adds the member to defined_names
1264         table. It tests for duplications and enclosing name conflicts.
1265
1266         * enum.cs (EnumMember): Clean up to reuse the base structures
1267
1268 2004-09-03  Martin Baulig  <martin@ximian.com>
1269
1270         Merged latest changes into gmcs.  Please keep this comment in
1271         here, it makes it easier for me to see what changed in MCS since
1272         the last time I merged.
1273
1274 2004-09-03  Martin Baulig  <martin@ximian.com>
1275
1276         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1277         into TypeContainer, to make partial classes work again.
1278
1279 2004-09-03  Martin Baulig  <martin@ximian.com>
1280
1281         * rootcontext.cs (RootContext.V2): Removed.
1282
1283 2004-03-23  Martin Baulig  <martin@ximian.com>
1284
1285         * expression.cs (Invocation.OverloadResolve): Added `bool
1286         may_fail' argument and use it instead of the Location.IsNull() hack.
1287
1288 2004-09-09  Martin Baulig  <martin@ximian.com>
1289
1290         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
1291
1292 2004-09-09  Martin Baulig  <martin@ximian.com>
1293
1294         * generic.cs (TypeParameter.DefineType): Added support for
1295         explicit interface methods.
1296
1297 2004-09-09  Martin Baulig  <martin@ximian.com>
1298
1299         * README.Changes: New document.  Started to list important changes
1300         between MCS and GMCS here.
1301
1302 2004-09-08  Martin Baulig  <martin@ximian.com>
1303
1304         * class.cs
1305         (TypeContainer.CheckRecursiveDefinition): New protected method.
1306         (TypeContainer.DefineType): Move the CS0146 check into
1307         CheckRecursiveDefinition().     
1308
1309 2004-09-06  Martin Baulig  <martin@ximian.com>
1310
1311         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
1312         types for the constructor constraint.
1313
1314 2004-09-03  Martin Baulig  <martin@ximian.com>
1315
1316         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1317         into TypeContainer, to make partial classes work again.
1318
1319 2004-09-03  Martin Baulig  <martin@ximian.com>
1320
1321         * rootcontext.cs (RootContext.V2): Removed.
1322
1323 2004-03-23  Martin Baulig  <martin@ximian.com>
1324
1325         * expression.cs (Invocation.OverloadResolve): Added `bool
1326         may_fail' argument and use it instead of the Location.IsNull() hack.
1327
1328 2004-09-03  Martin Baulig  <martin@ximian.com>
1329
1330         Merged latest changes into gmcs.  Please keep this comment in
1331         here, it makes it easier for me to see what changed in MCS since
1332         the last time I merged.
1333
1334 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1335
1336         Fix #61128.
1337         * expression.cs (BetterConversion): Don't allow either conversion 
1338         to be null.  Remove redundant implicit conversion test when 'q ==
1339         null' -- when this function is invoked, we already know that the
1340         implicit conversion exists.
1341         (BetterFunction): Assume that 'best' is non-null.  Remove
1342         redundant reimplementation of IsApplicable when 'best' is null.
1343         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1344         number of arguments.
1345         (IsAncestralType): Extract from OverloadResolve.
1346         (OverloadResolve): Make robust to the MethodGroupExpr being
1347         unsorted.  Implement all the logic of Section 14.5.5.1, and
1348         support overloading of methods from multiple applicable types.
1349         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1350
1351         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1352         (RealError, Warning): Append type of report to related symbol.
1353
1354 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1355
1356         * enum.cs: Fixed CLS-Compliance checks for enum members.
1357         Error tests cs3008-8.cs, cs3014-8.cs
1358
1359 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1360
1361         Fixed bug #62342, #63102
1362         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1363         like ImplementMethod.
1364
1365 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1366
1367         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1368         Fixed bug #65170.
1369
1370 2004-09-02  Martin Baulig  <martin@ximian.com>
1371
1372         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1373         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1374         on the MethodBase.
1375
1376 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1377
1378         C# 2.0 Static classes implemented
1379
1380         * class.cs (TypeContainer): instance_constructors,
1381         initialized_fields, initialized_static_fields,
1382         default_constructor, base_inteface_types are protected to be
1383         accessible from StaticClass.
1384         (TypeContainer.DefineDefaultConstructor): New virtual method
1385         for custom default constructor generating
1386         (StaticClass): New class to handle "Static classes" feature.
1387
1388         * cs-parser.jay: Handle static keyword on class like instance
1389         of StaticClass.
1390
1391         * driver.cs: Added "/langversion" command line switch with two
1392         options (iso-1, default).
1393
1394 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1395
1396         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1397
1398 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1399
1400         * delegate.cs: Style.
1401
1402 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1403
1404         * delegate.cs: Add seperate instance expr field for miguel.
1405
1406 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1407
1408         * PointerArithmetic (Resolve): make sure we are not doing
1409         pointer arith on void*. Also, make sure we are resolved
1410         by not setting eclass until resolve.
1411
1412         All callers: Make sure that PointerArithmetic gets resolved.
1413
1414 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1415
1416         * ArrayCreation (LookupType): If the type does not resolve 
1417         to an array, give an error.
1418
1419 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1420
1421         * statement.cs (Try.Resolve): Fixed bug #64222
1422
1423 2004-08-27  Martin Baulig  <martin@ximian.com>
1424
1425         * class.cs
1426         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1427         crash here.     
1428
1429 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1430
1431         * ecore.cs (Constantify): Get underlying type via
1432         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1433         Windows in special cases.
1434
1435 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1436
1437         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1438         for obtaining also private methods.
1439         (GetRemoveMethod): Used GetRemoveMethod (true)
1440         for obtaining also private methods.
1441
1442 2004-09-02  Martin Baulig  <martin@ximian.com>
1443
1444         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1445         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1446         on the MethodBase.
1447
1448 2004-08-27  Martin Baulig  <martin@ximian.com>
1449
1450         * class.cs
1451         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1452         crash here.     
1453
1454 2004-08-25  Martin Baulig  <martin@ximian.com>
1455
1456         * support.cs (ReflectionParameters..ctor): If this is a generic
1457         method, retrieve and store its type parameters.
1458         (InternalParameters..ctor): Added `TypeParameter[]' argument.
1459         (ReflectionParameters.GenericConstraints): The argument specifies
1460         the type parameter, not the method parameter.
1461         (InternalParameters.GenericConstraints): Likewise.
1462
1463         * generic.cs (TypeParameter.DefineType): Correctly handle
1464         constraints wrt. generic methods in interfaces and their
1465         implementations.        
1466
1467 2004-08-24  Martin Baulig  <martin@ximian.com>
1468
1469         * generic.cs (TypeParameter.IsSubclassOf): New public method.
1470         (Constraints.IsSubclassOf): New internal method.
1471
1472         * typemanager.cs (TypeManager.FindMembers): Added special support
1473         for GenericTypeParameterBuilder's.      
1474         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
1475         type parameters.
1476
1477 2004-08-24  Martin Baulig  <martin@ximian.com>
1478
1479         * typemanager.cs
1480         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
1481         this for accessibility checks.
1482         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
1483         IsNestedFamilyAccessible.
1484         (TypeManager.IsSubclassOf): New method, do what the name actually
1485         says.   
1486
1487 2004-08-24  Martin Baulig  <martin@ximian.com>
1488
1489         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
1490         as a SimpleName, include the generic arity.
1491
1492 2004-08-24  Martin Baulig  <martin@ximian.com>
1493
1494         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1495         MethodAttributes.HideBySig for operators.
1496
1497 2004-08-23  Martin Baulig  <martin@ximian.com>
1498
1499         Back to the old error reporting system :-)
1500
1501         * report.cs (Message): Removed.
1502         (Report.MessageData, ErrorData, WarningData): Removed.
1503         (Report.Error, Warning): Back to the old system.
1504
1505 2004-08-23  Martin Baulig  <martin@ximian.com>
1506
1507         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1508
1509         * class.cs (TypeContainer.ParentContainer): New public virtual
1510         method; replaces the explicit interface implementation.
1511         (ClassPart.ParentContainer): Override.
1512
1513 2004-08-23  Martin Baulig  <martin@ximian.com>
1514
1515         * statement.cs (Switch): Added support for constant switches; see
1516         #59428 or test-285.cs.
1517
1518 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1519
1520         Fixed bug #62740.
1521         * statement.cs (GetEnumeratorFilter): Removed useless
1522         logic because C# specs is strict. GetEnumerator must be
1523         public.
1524
1525 2004-08-22  Martin Baulig  <martin@ximian.com>
1526
1527         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1528         a switch and may break, reset the barrier.  Fixes #59867.
1529
1530 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1531
1532         CLS-Compliance speed up (~5% for corlib)
1533
1534         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1535         New method. Tests container for CLS-Compliant names
1536
1537         * class.cs (TypeContainer.VerifyClsName): New method.
1538         Checks whether container name is CLS Compliant.
1539         (Constructor): Implements IMethodData.
1540
1541         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1542         low-case table for CLS Compliance test.
1543         (MemberCache.VerifyClsParameterConflict): New method.
1544         Checks method parameters for CS3006 error.
1545
1546         * enum.cs (EnumMember): Is derived from MemberCore.
1547         (Enum.VerifyClsName): Optimized for better performance.
1548
1549 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1550
1551         * report.cs: Renamed Error_T to Error and changed all
1552         references.
1553
1554 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1555
1556         * class.cs (TypeContainer.IndexerArrayList): New inner class
1557         container for indexers.
1558         (TypeContainer.DefaultIndexerName): New constant for default
1559         indexer name. Replaced all "Item" with this constant.
1560         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1561
1562         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1563         DefaultMemberAttribute constructor.
1564
1565 2004-08-05  Martin Baulig  <martin@ximian.com>
1566
1567         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1568         Fix bug #59429.
1569
1570 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1571
1572         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1573         multi platforms problem.
1574
1575         * compiler.csproj: Included shared files.
1576
1577 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1578
1579         Fix bug 60333, 55971 in the more general way
1580         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1581         Added arg_type argument for constant conversion.
1582         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1583
1584 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1585
1586         Fix bug #59760
1587         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1588         OperatorArrayList, MethodCoreArrayList for typecontainer
1589         containers. Changed class member types to these new types.
1590         (MethodArrayList.DefineMembers): Added test for CS0659.
1591
1592 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1593
1594         * cfold.cs: Synchronize the folding with the code in expression.cs
1595         Binary.DoNumericPromotions for uint operands.
1596
1597         * attribute.cs: Revert patch from Raja, it introduced a regression
1598         while building Blam-1.2.1 (hard to isolate a test case).
1599
1600 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1601
1602         Fix for #55382
1603         * class.cs:
1604         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1605         name collision.
1606         (MethodCore.parent_method): New member. The method we're overriding
1607         if this is an override method.
1608         (MethodCore.CheckBase): Moved from Method class and made common.
1609         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1610         private.
1611         (MethodCore.CheckForDuplications): New abstract method. For custom
1612         member duplication search in a container
1613         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1614         method and its return type.
1615         (Event.conflict_symbol): New member. Symbol with same name in the
1616         parent class.
1617
1618         * decl.cs:
1619         (MemberCache.FindMemberWithSameName): New method. The method
1620         is looking for conflict with inherited symbols.
1621
1622 2004-08-04  Martin Baulig  <martin@ximian.com>
1623
1624         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1625
1626         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1627
1628 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1629
1630         * report.cs (Message): New enum for better error, warning reference in
1631         the code.
1632         (MessageData): New inner abstract class. It generally handles printing of
1633         error and warning messages.
1634         Removed unused Error, Warning, Message methods.
1635
1636 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1637
1638         Fix for cs0592-8.cs test
1639         * attribute.cs
1640         (Attributable.ValidAttributeTargets): Made public.
1641         (Attribute.ExplicitTarget): New member for explicit target value.
1642         (Attribute.CheckTargets): Now we translate explicit attribute
1643         target to Target here.
1644
1645 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1646
1647         * ecore.cs (MethodGroupExpr): new IsBase property.
1648
1649         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1650
1651         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1652         rather than an instance expr.
1653
1654         (DelegateCreation.Emit): Use the method group rather than
1655         the instance expression. Also, if you have base.Foo as the
1656         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1657
1658         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1659
1660         (NewDelegate.DoResolve): Only check for the existance of Invoke
1661         if the method is going to be needed. Use MethodGroupExpr.
1662
1663         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1664
1665         * expression.cs: For pointer arith., make sure to use
1666         the size of the type, not the size of the pointer to
1667         the type.
1668
1669 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1670
1671         Fix for #60722
1672         * class.cs (Class): Added error CS0502 test.
1673
1674 2004-08-03  John Luke  <jluke@cfl.rr.com>
1675             Raja R Harinath  <rharinath@novell.com>
1676
1677         Fix for #60997.
1678         * attribute.cs (Attribute.complained_before): New flag.
1679         (Attribute.ResolveType, Attribute.Resolve),
1680         (Attribute.DefinePInvokeMethod): Set it.
1681         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1682         
1683 2004-08-03  Martin Baulig  <martin@ximian.com>
1684
1685         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1686         use a user-defined operator; we still need to do numeric
1687         promotions in case one argument is a builtin type and the other
1688         one has an implicit conversion to that type.  Fixes #62322.
1689
1690 2004-08-18  Martin Baulig  <martin@ximian.com>
1691
1692         * class.cs (Method.Define): Use the correct method name when
1693         creating the MethodBuilder for a generic method.
1694
1695 2004-08-17  Martin Baulig  <martin@ximian.com>
1696
1697         * generic.cs (Constraints): Support type parameter constraints.
1698
1699 2004-08-16  Martin Baulig  <martin@ximian.com>
1700
1701         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
1702         (Token.GENERIC_DIMENSION): New token; this is returned if we
1703         encounter an unbound generic type in a typeof() expression.
1704
1705         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
1706         this token is only generated while parsing a typeof() expression.
1707         (typeof_expression): Removed the old unbound_type hack.
1708
1709         * generic.cs (TypeArguments.IsUnbound): New public property.
1710
1711         * decl.cs (MemberName): Added support for unbound types.
1712
1713 2004-08-14  Martin Baulig  <martin@ximian.com>
1714
1715         * typemanager.cs
1716         (TypeManager.IsEqualGenericInstance): New static method.
1717         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
1718         just used to check accessibility, so follow the rules of 26.1.6.        
1719
1720         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
1721         ConstructedType instead of a TypeExpression if we have type arguments.
1722
1723         * cs-parser.jay (typeof_expression): Support unbound generic types.
1724
1725         * ecore.cs (UnboundTypeExpression): New public class.
1726
1727 2004-08-12  Martin Baulig  <martin@ximian.com>
1728
1729         * typemanager.cs (TypeManager.IsNestedChildOf): Use
1730         TypeManager.IsEqual() rather than `=='.
1731
1732         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
1733         generic instances as well.
1734
1735 2004-08-12  Martin Baulig  <martin@ximian.com>
1736
1737         * expression.cs (Invocation.InferType): We can only infer method
1738         type parameters.  Fixes #62647.
1739
1740 2004-08-11  Martin Baulig  <martin@ximian.com>
1741
1742         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
1743         before resolving the base classes.
1744
1745 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
1746
1747         * Makefile: install .mdb file too.
1748
1749 2004-08-05  Martin Baulig  <martin@ximian.com>
1750
1751         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
1752         initializer, the current type is just the TypeBuilder, not the
1753         instantiated generic type.
1754         (FieldExpr.IsFieldInitializer): New public property.
1755
1756 2004-08-04  Martin Baulig  <martin@ximian.com>
1757
1758         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1759
1760         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1761
1762 2004-08-03  Martin Baulig  <martin@ximian.com>
1763
1764         * class.cs (MethodData.Define): If we're an explicit
1765         implementation, remove the generic arity from the type name.
1766
1767 2004-08-03  Martin Baulig  <martin@ximian.com>
1768
1769         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1770         use a user-defined operator; we still need to do numeric
1771         promotions in case one argument is a builtin type and the other
1772         one has an implicit conversion to that type.  Fixes #62322.
1773
1774 2004-08-02  Martin Baulig  <martin@ximian.com>
1775
1776         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
1777         `TypeExpr[]' array.
1778         (TypeContainer.GetClassBases): Return the unexpanded list of
1779         interfaces; we expand them later.
1780         (TypeContainer.DefineType): After creating the TypeBuilder, call
1781         TypeManager.ExpandInterfaces() to get an expanded and resolved
1782         list of interfaces.
1783
1784         * ecore.cs (TypeExpr.GetInterfaces): Removed
1785
1786         * generics.cs (Constraints.InterfaceConstraints): Remove.
1787         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
1788         register the interface constraints.
1789
1790         * typemanager.cs
1791         (TypeManager.AddUserType): Removed the `ifaces' argument.
1792         (TypeManager.AddTypeParameter): Likewise.
1793         (TypeManager.AddUserInterface): Removed, was unused.
1794         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
1795         `TypeExpr[]' array for the interfaces.
1796         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
1797         has been defined, returns a list of the resolved interfaces types.
1798         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
1799         (TypeManager.GetExplicitInterfaces): Likewise.  
1800
1801 2004-08-02  Martin Baulig  <martin@ximian.com>
1802
1803         * expression.cs (Invocation.EmitCall): If we're invoking a method
1804         on a type parameter, use the new `Constrained' prefix opcode.
1805
1806 2004-08-02  Martin Baulig  <martin@ximian.com>
1807
1808         * statement.cs (LocalInfo.Flags): Added `IsThis'.
1809         (LocalInfo.IsThis): New public property.
1810         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
1811
1812 2004-08-01  Martin Baulig  <martin@ximian.com>
1813
1814         * class.cs (TypeContainer.GetClassBases): Don't set the default
1815         here since we may get called from GetPartialBases().
1816         (TypeContainer.DefineType): If GetClassBases() didn't return a
1817         parent, use the default one.
1818
1819 2004-07-30  Martin Baulig  <martin@ximian.com>
1820
1821         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
1822
1823         * class.cs (SourceMethod): New public class, derive from the
1824         symbol writer's ISourceMethod.
1825         (Method): Use the new symbol writer API.
1826
1827         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
1828         as argument and use the new symbol writer.
1829
1830         * location.cs
1831         (SourceFile): Implement the symbol writer's ISourceFile.
1832         (Location.SymbolDocument): Removed.
1833         (Location.SourceFile): New public property.
1834
1835         * symbolwriter.cs: Use the new symbol writer API.
1836
1837 2004-07-30  Raja R Harinath  <rharinath@novell.com>
1838
1839         * Makefile (install-local): Remove.  Functionality moved to
1840         executable.make.
1841
1842 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
1843
1844         * Makefile: Install mcs.exe.config file together with mcs.exe.
1845         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
1846         correct runtime version.
1847         
1848 2004-07-25  Martin Baulig  <martin@ximian.com>
1849
1850         * class.cs
1851         (TypeContainer.RegisterOrder): Removed, this was unused.
1852         (TypeContainer, interface_order): Removed.
1853         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
1854         TypeContainer as argument since we can also be called with a
1855         `PartialContainer' for a partial class/struct/interface.
1856         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
1857         of checking whether we're an `Interface' - we could be a
1858         `PartialContainer'.
1859         (PartialContainer.Register): Override; call
1860         AddClass()/AddStruct()/AddInterface() on our parent.
1861
1862         * cs-parser.jay (interface_member_declaration): Add things to the
1863         `current_container', not the `current_class'.
1864
1865         * rootcontext.cs (RegisterOrder): The overloaded version which
1866         takes an `Interface' was unused, removed.
1867
1868         * typemanager.cs (TypeManager.LookupInterface): Return a
1869         `TypeContainer', not an `Interface'.
1870         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
1871         contain a `PartialContainer' for an interface, so check it's
1872         `Kind' to figure out what it is.
1873
1874 2004-07-25  Martin Baulig  <martin@ximian.com>
1875
1876         * class.cs (Class.DefaultTypeAttributes): New public constant.
1877         (Struct.DefaultTypeAttributes): Likewise.
1878         (Interface.DefaultTypeAttributes): Likewise.
1879         (PartialContainer.TypeAttr): Override this and add the
1880         DefaultTypeAttributes.
1881
1882 2004-07-25  Martin Baulig  <martin@ximian.com>
1883
1884         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
1885         we can just use the `Parent' field instead.
1886
1887 2004-07-25  Martin Baulig  <martin@ximian.com>
1888
1889         * class.cs (TypeContainer.Emit): Renamed to EmitType().
1890
1891 2004-07-25  Martin Baulig  <martin@ximian.com>
1892
1893         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
1894         our parts before defining any methods.
1895         (TypeContainer.VerifyImplements): Make this virtual.
1896         (ClassPart.VerifyImplements): Override and call VerifyImplements()
1897         on our PartialContainer.
1898
1899 2004-07-25  Martin Baulig  <martin@ximian.com>
1900
1901         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1902
1903         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1904         argument, we can just use the `Parent' field instead.
1905
1906         * class.cs
1907         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1908         (MemberBase.DoDefine): Likewise.
1909
1910 2004-07-24  Martin Baulig  <martin@ximian.com>
1911
1912         * decl.cs (MemberCore.Parent): New public field.
1913         (DeclSpace.Parent): Moved to MemberCore.
1914
1915         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1916         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1917         parent's .ctor.
1918         (FieldBase, Field, Operator): Likewise.
1919         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1920         (EventField, Event): Likewise.
1921
1922 2004-07-23  Martin Baulig  <martin@ximian.com>
1923
1924         * class.cs (PartialContainer): New public class.
1925         (ClassPart): New public class.
1926         (TypeContainer): Added support for partial classes.
1927         (TypeContainer.GetClassBases): Splitted some of the functionality
1928         out into GetNormalBases() and GetPartialBases().
1929
1930         * cs-tokenizer.cs (Token.PARTIAL): New token.
1931         (Tokenizer.consume_identifier): Added some hacks to recognize
1932         `partial', but only if it's immediately followed by `class',
1933         `struct' or `interface'.
1934
1935         * cs-parser.jay: Added support for partial clases.
1936
1937 2004-07-23  Martin Baulig  <martin@ximian.com>
1938
1939         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1940         a `DeclSpace' and also made it readonly.
1941         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1942         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1943         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1944
1945         * cs-parser.jay: Pass the `current_class', not the
1946         `current_container' (at the moment, this is still the same thing)
1947         to a new Method, Property, Event, Indexer or Constructor.
1948
1949 2004-07-23  Martin Baulig  <martin@ximian.com>
1950
1951         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1952         and removed the `current_interface' one.
1953         (struct_declaration, class_declaration, interface_declaration):
1954         Set `current_class' to the newly created class/struct/interface;
1955         set their `Bases' and call Register() before parsing their body.
1956
1957 2004-07-23  Martin Baulig  <martin@ximian.com>
1958
1959         * class.cs (Kind): New public enum.
1960         (TypeContainer): Made this class abstract.
1961         (TypeContainer.Kind): New public readonly field.
1962         (TypeContainer.CheckDef): New public method; moved here from
1963         cs-parser.jay.
1964         (TypeContainer.Register): New public abstract method.
1965         (TypeContainer.GetPendingImplementations): New public abstract
1966         method.
1967         (TypeContainer.GetClassBases): Removed the `is_class' and
1968         `is_iface' parameters.
1969         (TypeContainer.DefineNestedTypes): Formerly known as
1970         DoDefineType().
1971         (ClassOrStruct): Made this class abstract.
1972
1973         * tree.cs (RootTypes): New public type. 
1974
1975 2004-07-20  Martin Baulig  <martin@ximian.com>
1976
1977         * tree.cs (Tree.RecordNamespace): Removed.
1978         (Tree.Namespaces): Removed.
1979
1980         * rootcontext.cs (RootContext.IsNamespace): Removed.
1981
1982         * cs-parser.jay (namespace_declaration): Just create a new
1983         NamespaceEntry here.
1984
1985 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
1986
1987         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
1988         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
1989         entry to make sure it runs in the correct runtime version.
1990         
1991 2004-07-18  Martin Baulig  <martin@ximian.com>
1992
1993         * generic.cs (ConstructedType.CheckConstraints): Improved
1994         constraints checking.
1995
1996 2004-07-18  Martin Baulig  <martin@ximian.com>
1997
1998         * expression.cs (Invocation.BetterMethod): Call
1999         TypeManager.TypeToCoreType() on all types and removed my previous
2000         hack; we're already doig the right thing here.
2001
2002 2004-07-17  Martin Baulig  <martin@ximian.com>
2003
2004         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
2005
2006 2004-07-16  Martin Baulig  <martin@ximian.com>
2007
2008         * iterators.cs: Added generics support.
2009
2010 2004-07-16  Martin Baulig  <martin@ximian.com>
2011
2012         * iterators.cs: Rewrote this.  We're now using one single Proxy
2013         class for both the IEnumerable and the IEnumerator interface and
2014         `Iterator' derives from Class so we can use the high-level API.
2015
2016         * class.cs (TypeContainer.AddIterator): New method.
2017         (TypeContainer.DoDefineType): New protected virtual method, which
2018         is called from DefineType().
2019         (TypeContainer.DoDefineMembers): Call DefineType() and
2020         DefineMembers() on all our iterators.
2021         (TypeContainer.Emit): Call Emit() on all our iterators.
2022         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2023
2024         * codegen.cs (EmitContext.CurrentIterator): New public field.
2025
2026 2004-07-15  Martin Baulig  <martin@ximian.com>
2027
2028         * typemanager.cs
2029         (TypeManager.not_supported_exception_type): New type.   
2030
2031 2004-07-14  Martin Baulig  <martin@ximian.com>
2032
2033         * typemanager.cs
2034         (TypeManager.generic_ienumerable_type): New type.
2035         (TypeManager.generic_ienumerator_type): New type.
2036
2037         * rootcontext.cs
2038         (RootContext.interfaces_first_stage): Added
2039         "System.Collections.Generic.IEnumerator`1" and
2040         "System.Collections.Generic.IEnumerable`1".     
2041
2042 2004-07-14  Martin Baulig  <martin@ximian.com>
2043
2044         * iterators.cs: Use real error numbers.
2045
2046 2004-07-14  Martin Baulig  <martin@ximian.com>
2047
2048         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2049         requires this to be a System.Collection.IEnumerable and not a
2050         class implementing that interface.
2051         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2052
2053 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2054
2055         * class.cs: Fixed previous fix, it broke some error tests.
2056
2057 2004-07-12  Martin Baulig  <martin@ximian.com>
2058
2059         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2060         Fixes #61293.
2061
2062 2004-07-14  Martin Baulig  <martin@ximian.com>
2063
2064         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
2065         an exclamation mark (!) for the generic arity to reflect the
2066         latest spec changes; ie. use "System.Collections.Generic.IList`1".
2067
2068 2004-07-13  Martin Baulig  <martin@ximian.com>
2069
2070         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
2071         specifiers being part of a type argument.
2072
2073 2004-07-13  Martin Baulig  <martin@ximian.com>
2074
2075         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
2076         name for generic types.
2077
2078 2004-07-13  Martin Baulig  <martin@ximian.com>
2079
2080         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
2081         bit to fix #60119.
2082
2083 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2084
2085         * assign.cs (LocalTemporary): Add new argument: is_address,If
2086         `is_address' is true, then the value that we store is the address
2087         to the real value, and not the value itself.
2088         
2089         * ecore.cs (PropertyExpr): use the new local temporary
2090         stuff to allow us to handle X.Y += z (where X is a struct)
2091
2092 2004-07-08  Martin Baulig  <martin@ximian.com>
2093
2094         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2095         not always return, just like we're doing in Using.Resolve().
2096
2097 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2098
2099         * cs-parser.jay (fixed_statement): flag this as Pinned.
2100
2101 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2102
2103         * typemanager.cs (TypeManager): Removed MakePinned method, this
2104         mechanism is replaced with the .NET 2.x compatible mechanism of
2105         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2106
2107         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2108         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2109         `IsFixed' property which has a different meaning.
2110
2111 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2112
2113         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2114         visible from inside a nested class, not just the names of the
2115         immediately enclosing class.
2116         Fix for bug #60730.
2117
2118 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2119
2120         * expression.cs (BetterConversion): Remove buggy special-case
2121         handling of "implicit constant expression conversions".  At this
2122         point, we already know that the conversion is possible -- we're
2123         only checking to see which is better.
2124
2125 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2126
2127         * cs-parser.jay: Added error CS0210 test.
2128
2129 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2130
2131         * cs-parser.jay: Added error CS0134 test.
2132
2133 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2134
2135         Fix bug #52507
2136         * cs-parser.jay: Added error CS0145 test.
2137
2138 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2139
2140         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2141
2142 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2143         
2144         * expression.cs (StackAlloc.Resolve): The argument may not
2145         be a constant; deal with this case.
2146         
2147 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2148
2149         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2150         GetIndexerAttributeValue.
2151         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2152
2153         * class.cs (Indexer.Define): Added error tests for CS0415,
2154         CS0609.
2155
2156 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2157
2158         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2159         property code.
2160
2161 2004-06-23  Martin Baulig  <martin@ximian.com>
2162
2163         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2164         neither return nor throw, reset the barrier as well.  Fixes #60457.
2165
2166 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2167
2168         * class.cs : EventAttributes is now set to None by default.
2169           This fixes bug #60459.
2170
2171 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2172
2173         Fix bug #60219
2174         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2175         Don't throw exception but return null (it's sufficient now).
2176
2177 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2178
2179         * typemanager.cs (GetArgumentTypes): Faster implementation.
2180
2181 2004-06-18  Martin Baulig  <martin@ximian.com>
2182
2183         * attribute.cs (Attribute.Resolve): Check whether we're an
2184         EmptyCast which a Constant child.  Fixes #60333.
2185
2186 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2187
2188         * statement.cs (EmitCollectionForeach): Account for the fact that
2189         not all valuetypes are in areas which we can take the address of.
2190         For these variables, we store to a temporary variable. Also, make
2191         sure that we dont emit a `callvirt' on a valuetype method.
2192
2193 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2194
2195         * expression.cs (StackAlloc.DoReSolve): Added test for
2196         negative parameter (CS0247).
2197
2198 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2199
2200         Fix bug #59792
2201         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2202
2203 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2204
2205         Fix bug #59781
2206         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2207         ulong.
2208
2209 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2210
2211         Fix bug #58254 & cs1555.cs, cs1556.cs
2212         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2213
2214 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2215
2216         * cs-parser.jay: Added error CS1669 test for indexers.
2217
2218 2004-06-18  Martin Baulig  <martin@ximian.com>
2219
2220         * generics.cs (GenericMethod.ctor): Don't take an Attributes
2221         argument.  Fixes #60441.
2222
2223 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
2224         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
2225         The name needs to have the actual name of the method in order
2226         for other tests (such as the one in OverloadResolve for Invoke
2227         on a delegate) to work. As well, it does not really help
2228         error reporting because the method group had multiple methods.
2229         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
2230         Make profiling work.
2231         
2232 2004-06-13  Martin Baulig  <martin@ximian.com>
2233
2234         * cs-parser.jay: Don't allow generic attributes.
2235
2236 2004-06-13  Martin Baulig  <martin@ximian.com>
2237
2238         * class.cs (MemberBase.DoDefineBase): New protected method.
2239         (MemberBase.DoDefine): Compute the `flags' in the new
2240         DoDefineBase() which must be called first.
2241         (Method.Define): Call DoDefineBase() first so we have the flags
2242         when defining the generic method.
2243
2244         * cs-parser.jay (interface_method_declaration): Support generic methods.
2245
2246 2004-06-13  Martin Baulig  <martin@ximian.com>
2247
2248         * decl.cs (TypeName): Removed.
2249         (MemberName): Removed TypeName and MemberNow; now we just have
2250         MemberName.
2251
2252         * cs-parser.jay: Don't distinguish between type arguments and type
2253         parameters in the grammar and simplified the rules a bit.  The
2254         reduce/reduce conflicts are now gone (except the one we inherited
2255         from mcs).
2256
2257 2004-06-11  Martin Baulig  <martin@ximian.com>
2258
2259         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2260         call this twice: for params and varargs methods.
2261
2262 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2263
2264         * class.cs:
2265         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2266
2267 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2268
2269         * attribute.cs (Attribute.GetValidTargets): Made public.
2270
2271         * class.cs: 
2272         (AbstractPropertyEventMethod): New class for better code sharing.
2273         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2274         CS1667 report.
2275         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2276
2277 2004-06-09  Martin Baulig  <martin@ximian.com>
2278
2279         * cs-parser.jay: Removed a reduce/reduce conflict.
2280
2281 2004-06-03  Martin Baulig  <martin@ximian.com>
2282
2283         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
2284         GetSimpleName() and return a SimpleName.
2285
2286         * ecore.cs (SimpleName.Arguments): New public field.
2287         (SimpleName): Added overloaded ctor which takes an additional
2288         TypeArguments argument.
2289         (SimpleName.SimpleNameResolve): Added support for generic methods.
2290         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
2291         formerly in MemberAccess.DoResolve(), but we also need it in
2292         SimpleNameResolve().
2293
2294         * expression.cs (MemberAccess.DoResolve): Use the new
2295         MethodGroupExpr.ResolveGeneric().       
2296
2297 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2298
2299         * decl.cs: If possible, use lookuptypedirect here. We can only do
2300         this if there is no `.' after the namespace. Avoids using
2301         LookupType, which does lots of slow processing.
2302         (FindNestedType) New method, does what it says :-).
2303         * namespace.cs: use LookupTypeDirect.
2304         * rootcontext.cs: use membercache, if possible.
2305         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2306
2307 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2308
2309         * expression.cs:
2310         According to the spec, 
2311
2312         In a member access of the form E.I, if E is a single identifier,
2313         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2314         field, property, localvariable, or parameter with the same type as
2315         the meaning of E as a type-name (§3.8), then both possible
2316         meanings of E are permitted.
2317
2318         We did not check that E as a simple-name had the same type as E as
2319         a type name.
2320
2321         This trivial check gives us 5-7% on bootstrap time.
2322
2323 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2324
2325         * expression.cs (Invocation.OverloadResolve): Avoid the
2326         use of hashtables and boxing here by allocating on demand.
2327
2328 2004-05-30  Martin Baulig  <martin@ximian.com>
2329
2330         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2331         we're doing a silent lookup.  Don't try to lookup nested types in
2332         TypeManager.object_type (thanks to Ben Maurer).
2333
2334 2004-05-30  Martin Baulig  <martin@ximian.com>
2335
2336         Committing a patch from Ben Maurer.
2337
2338         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2339
2340 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2341
2342         * convert.cs: add a trivial cache for overload operator resolution.
2343
2344 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
2345
2346         * attribute.cs
2347         (AttributeTester.GetObsoleteAttribute): Returns instance of
2348         ObsoleteAttribute when type is obsolete.
2349
2350         * class.cs
2351         (TypeContainer.VerifyObsoleteAttribute): Override.
2352         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2353         (MethodCode.VerifyObsoleteAttribute): Override.
2354         (MemberBase.VerifyObsoleteAttribute): Override.
2355
2356         * decl.cs
2357         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2358         and report proper error.
2359
2360         *delegate.cs
2361         (Delegate.VerifyObsoleteAttribute): Override.
2362
2363         * ecore.cs
2364         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2365         and report proper error.
2366         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2367
2368         * enum.cs
2369         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2370         and enum member.
2371
2372         * expression.cs
2373         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2374         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2375         Added test for ObsoleteAttribute.
2376
2377         * statement.cs
2378         (Catch): Derived from Statement.
2379
2380 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2381
2382         * decl.cs: If possible, use lookuptypedirect here. We can only do
2383         this if there is no `.' after the namespace. Avoids using
2384         LookupType, which does lots of slow processing.
2385         (FindNestedType) New method, does what it says :-).
2386         * namespace.cs: use LookupTypeDirect.
2387         * rootcontext.cs: use membercache, if possible.
2388         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2389
2390 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2391
2392         * expression.cs:
2393         According to the spec, 
2394
2395         In a member access of the form E.I, if E is a single identifier,
2396         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2397         field, property, localvariable, or parameter with the same type as
2398         the meaning of E as a type-name (§3.8), then both possible
2399         meanings of E are permitted.
2400
2401         We did not check that E as a simple-name had the same type as E as
2402         a type name.
2403
2404         This trivial check gives us 5-7% on bootstrap time.
2405
2406 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2407
2408         Fixed bug #59071 & cs0160.cs
2409         * statement.cs (Try.Resolve): Check here whether order of catch
2410         clauses matches their dependencies.
2411
2412 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2413
2414         Fixed bug #58624
2415         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
2416         unsafe type.
2417
2418 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2419
2420         * expression.cs (Invocation.OverloadResolve): Avoid the
2421         use of hashtables and boxing here by allocating on demand.
2422
2423 2004-05-30  Martin Baulig  <martin@ximian.com>
2424
2425         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2426         we're doing a silent lookup.  Don't try to lookup nested types in
2427         TypeManager.object_type (thanks to Ben Maurer).
2428
2429 2004-05-30  Martin Baulig  <martin@ximian.com>
2430
2431         Committing a patch from Ben Maurer.
2432
2433         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
2434
2435 2004-05-29  Martin Baulig  <martin@ximian.com>
2436
2437         * class.cs (IMethodData.ShouldIgnore): New method.
2438
2439         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2440         `Location' argument, we don't need it anywhere.  Use
2441         `IMethodData.ShouldIgnore ()' instead of
2442         `MethodData.GetMethodFlags ()'.
2443         (TypeManager.AddMethod): Removed.
2444         (TypeManager.AddMethod2): Renamed to AddMethod.
2445
2446 2004-05-29  Martin Baulig  <martin@ximian.com>
2447
2448         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2449
2450         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2451         converting from a class type S to an interface type and we already
2452         have an object on the stack, don't box it again.  Fixes #52578.
2453
2454 2004-05-29  Martin Baulig  <martin@ximian.com>
2455
2456         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2457         Added support for `params' parameters.  Fixes #59267.
2458
2459 2004-05-29  Martin Baulig  <martin@ximian.com>
2460
2461         * literal.cs (NullPointer): Provide a private .ctor which sets
2462         `type' to TypeManager.object_type.  Fixes #59048.
2463
2464 2004-05-29  Martin Baulig  <martin@ximian.com>
2465
2466         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2467         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2468
2469         * ecore.cs (EventExpr.instance_expr): Make the field private.
2470
2471 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2472
2473         Fixed bug #50080 & cs0214-2.cs
2474         * expression.cs (Cast.DoResolve): Check unsafe context here.
2475         
2476         * statement.cs (Resolve.DoResolve): Likewise.
2477
2478 2004-05-26  Martin Baulig  <martin@ximian.com>
2479
2480         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2481
2482         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2483         (RootContext.LookupType): Pass down the `silent' flag.
2484
2485 2004-05-25  Martin Baulig  <martin@ximian.com>
2486
2487         * expression.cs
2488         (MethodGroupExpr.IdenticalTypeName): New public property.
2489         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2490         expression actually refers to a type.
2491
2492 2004-05-25  Martin Baulig  <martin@ximian.com>
2493
2494         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2495         for #56176 and made it actually work.
2496
2497 2004-05-25  Martin Baulig  <martin@ximian.com>
2498
2499         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2500         (FieldExpr, PropertyExpr): Override and implement
2501         CacheTemporaries.  Fixes #52279.
2502
2503 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2504
2505         * location.cs: In the new compiler listing a file twice is a
2506         warning, not an error.
2507
2508 2004-05-24  Martin Baulig  <martin@ximian.com>
2509
2510         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2511         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2512
2513 2004-05-24  Martin Baulig  <martin@ximian.com>
2514
2515         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2516         walking the `using' list.  Fixes #53921.
2517
2518 2004-05-24  Martin Baulig  <martin@ximian.com>
2519
2520         * const.cs (Const.LookupConstantValue): Added support for
2521         EmptyCast's; fixes #55251.
2522
2523 2004-05-24  Martin Baulig  <martin@ximian.com>
2524
2525         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2526         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2527         which does the CS0135 check.  The reason is that we first need to
2528         check whether the variable actually exists.
2529
2530 2004-05-24  Martin Baulig  <martin@ximian.com>
2531
2532         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2533         than RootContext.LookupType() to find the explicit interface
2534         type.  Fixes #58584.
2535
2536 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2537
2538         * Makefile: Simplify.  Use executable.make.
2539         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2540
2541 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2542
2543         * decl.cs:
2544         * enum.cs:
2545         Use the invariant culture when doing String.Compare for CLS case
2546         sensitivity.
2547         
2548 2004-05-23  Martin Baulig  <martin@ximian.com>
2549
2550         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2551         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2552
2553         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2554
2555 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2556
2557         * class.cs (MemberBase.Define): Reuse MemberType member for 
2558         resolved type. Other methods can use it too.
2559
2560 2004-05-23  Martin Baulig  <martin@ximian.com>
2561
2562         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2563         the variable also exists in the current block (otherwise, we need
2564         to report a CS0103).  Fixes #58670.
2565
2566 2004-05-23  Martin Baulig  <martin@ximian.com>
2567
2568         * flowanalysis.cs (Reachability.Reachable): Compute this
2569         on-the-fly rather than storing it as a field.
2570
2571 2004-05-23  Martin Baulig  <martin@ximian.com>
2572
2573         * flowanalysis.cs (Reachability.And): Manually compute the
2574         resulting `barrier' from the reachability.      
2575        
2576 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2577
2578         Fix bug #57835
2579         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2580         instance of ObsoleteAttribute when symbol is obsolete.
2581
2582         * class.cs
2583         (IMethodData): Extended interface for ObsoleteAttribute support.
2584
2585 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2586
2587         * attribute.cs: Fix bug #55970
2588
2589 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2590
2591         Fix bug #52705
2592         * attribute.cs
2593         (GetObsoleteAttribute): New method. Creates the instance of
2594         ObsoleteAttribute.
2595         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2596         ObsoleteAttribute when member is obsolete.
2597         (AttributeTester.Report_ObsoleteMessage): Common method for
2598         Obsolete error/warning reporting.
2599
2600         * class.cs
2601         (TypeContainer.base_classs_type): New member for storing parent type.
2602
2603         * decl.cs
2604         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2605         for this MemberCore.
2606
2607 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2608
2609         * attribute.cs, const.cs: Fix bug #58590
2610
2611 2004-05-21  Martin Baulig  <martin@ximian.com>
2612
2613         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2614         out parameters if the end of the method is unreachable.  Fixes
2615         #58098. 
2616
2617 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2618
2619         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2620         Hari was right, why extra method.
2621
2622 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2623
2624         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2625
2626 2004-05-20  Martin Baulig  <martin@ximian.com>
2627
2628         * delegate.cs: Convert this file to Unix mode - like the original
2629         version in mcs is.
2630
2631 2004-05-20  Martin Baulig  <martin@ximian.com>
2632
2633         * attribute.cs: Convert this file to Unix mode - like the original
2634         version in mcs is.
2635
2636 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2637
2638        Fix bug #58688 (MCS does not report error when the same attribute
2639        is assigned twice)
2640
2641        * attribute.cs (Attribute.Emit): Distinction between null and default.
2642
2643 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2644
2645        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2646        of a top-level attribute without an attribute target.
2647        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2648        Make non-static.
2649        (Attribute.Conditional_GetConditionName), 
2650        (Attribute.Obsolete_GetObsoleteMessage): Update.
2651        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2652        part of ScanForIndexerName.
2653        (Attribute.CanIgnoreInvalidAttribute): New function.
2654        (Attribute.ScanForIndexerName): Move to ...
2655        (Attributes.ScanForIndexerName): ... here.
2656        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2657        (Attributes.Search): New internal variant that can choose not to
2658        complain if types aren't resolved.  The original signature now
2659        complains.
2660        (Attributes.GetClsCompliantAttribute): Use internal variant, with
2661        complaints suppressed.
2662        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2663        only if it not useful.
2664        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2665        top-level for attributes that are shared between the assembly
2666        and a top-level class.
2667        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2668        * class.cs: Update to reflect changes.
2669        (DefineIndexers): Fuse loops.
2670        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2671        a couple more variants of attribute names.
2672
2673 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2674
2675         Fix bug #52585 (Implemented explicit attribute declaration)
2676
2677         * attribute.cs:
2678         (Attributable.ValidAttributeTargets): New abstract method. It gets
2679         list of valid attribute targets for explicit target declaration.
2680         (Attribute.Target): It holds target itself.
2681         (AttributeSection): Removed.
2682         (Attribute.CheckTargets): New method. It checks whether attribute
2683         target is valid for the current element.
2684
2685         * class.cs:
2686         (EventProperty): New class. For events that are declared like
2687         property (with add and remove accessors).
2688         (EventField): New class. For events that are declared like field.
2689         class.cs
2690
2691         * cs-parser.jay: Implemented explicit attribute target declaration.
2692
2693         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2694         Override ValidAttributeTargets.
2695
2696         * parameter.cs:
2697         (ReturnParameter): Class for applying custom attributes on 
2698         the return type.
2699         (ParameterAtribute): New class. Class for applying custom
2700         attributes on the parameter type.
2701
2702 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
2703
2704         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
2705         definitions. 
2706
2707         (Method): Allow UNSAFE here.
2708
2709         * modifiers.cs: Support unsafe reporting.
2710
2711 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
2712
2713         * decl.cs: Fix bug #58478.
2714
2715 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2716
2717         * statement.cs: When checking for unreachable code on an EmptyStatement,
2718         set the location. Fixes bug #58488.
2719
2720 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
2721
2722         * driver.cs: Add -pkg handling.
2723
2724         From Gonzalo: UseShelLExecute=false
2725
2726 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
2727
2728         * attribute.cs:
2729         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
2730         for attribute.
2731         (Attribute.IsClsCompliaceRequired): Moved to base for better
2732         accesibility.
2733         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
2734         when attribute is AttributeUsageAttribute.
2735         (Attribute.GetValidTargets): Simplified.
2736         (Attribute.GetAttributeUsage): New method returns AttributeUsage
2737         attribute for this type.
2738         (Attribute.ApplyAttributes): Method renamed to Emit and make
2739         non-static.
2740         (GlobalAttributeSection): New class for special handling of global
2741         attributes (assembly, module).
2742         (AttributeSection.Emit): New method.
2743
2744         * class.cs: Implemented Attributable abstract methods.
2745         (MethodCore.LabelParameters): Moved to Parameter class.
2746         (Accessor): Is back simple class.
2747         (PropertyMethod): Implemented Attributable abstract class.
2748         (DelegateMethod): Implemented Attributable abstract class.
2749         (Event): New constructor for disctintion between normal Event
2750         and Event with accessors.
2751
2752         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
2753
2754         * codegen.cs, const.cs, decl.cs, delegate.cs:
2755         (CommonAssemblyModulClass): Implemented Attributable abstract class
2756         and simplified.
2757
2758         * enum.cs: Implement IAttributeSupport interface.
2759         (EnumMember): New class for emum members. Implemented Attributable
2760         abstract class
2761
2762         * parameter.cs:
2763         (ParameterBase): Is abstract.
2764         (ReturnParameter): New class for easier [return:] attribute handling.
2765
2766         * typemanager.cs: Removed builder_to_attr.
2767
2768 2004-05-11  Raja R Harinath  <rharinath@novell.com>
2769
2770         Fix bug #57151.
2771         * attribute.cs (Attribute.GetPositionalValue): New function.
2772         * class.cs (TypeContainer.VerifyMembers): New function.
2773         (TypeContainer.Emit): Use it.
2774         (ClassOrStruct): New base class for Class and Struct.
2775         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
2776         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
2777         class.
2778         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
2779         then each non-static field should have a FieldOffset attribute.
2780         Otherwise, none of the fields should have a FieldOffset attribute.
2781         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
2782         and FieldOffset attributes.
2783         * typemanager.cs (TypeManager.struct_layout_attribute_type)
2784         (TypeManager.field_offset_attribute_type): New core types.
2785         (TypeManager.InitCoreTypes): Initialize them.
2786
2787 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
2788
2789         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
2790         Return correct type.
2791         From bug #58270.
2792
2793 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
2794
2795         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
2796         be implicitly converted to ulong.
2797         
2798         * expression.cs: The logic for allowing operator &, | and ^ worked
2799         was wrong, it worked before because we did not report an error in
2800         an else branch.  Fixes 57895.
2801
2802         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
2803         allow volatile fields to be reference types.
2804
2805 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
2806
2807         * driver.cs: Add support for /debug-
2808
2809 2004-05-07  Raja R Harinath  <rharinath@novell.com>
2810
2811         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
2812         Add a 'complain' parameter to silence errors.
2813         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
2814         silently overlooked type-resolutions.
2815         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
2816         to reflect changes.
2817         (Attributes.Search): New function.
2818         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
2819         (Attributes.GetAttributeFullName): Remove hack.
2820         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
2821         Update to reflect changes.
2822         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
2823         Use Attributes.Search instead of nested loops.
2824
2825 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
2826
2827         * decl.cs:
2828         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
2829         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
2830         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
2831
2832         * report.cs: (Report.Warning): Renamed to Warning_T because of
2833         parameter collision.
2834
2835 2004-05-05  Raja R Harinath  <rharinath@novell.com>
2836
2837         * expression.cs (MemberAccess.ResolveMemberAccess):
2838         Exit with non-zero status after Report.Error.
2839         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
2840         Likewise.
2841         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
2842
2843 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2844
2845         * support.cs: Don't hang when the file is empty.
2846
2847 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2848
2849         * support.cs: In SeekableStreamReader, compute the preamble size of the
2850           underlying stream. Position changes should take into account that initial
2851           count of bytes.
2852
2853 2004-05-03  Todd Berman  <tberman@sevenl.net>
2854
2855         * driver.cs: remove unused GetSysVersion function.
2856
2857 2004-05-03  Todd Berman  <tberman@sevenl.net>
2858
2859         * driver.cs: Remove the hack from saturday, as well as the hack
2860         from jackson (LoadAssemblyFromGac), also adds the CWD to the
2861         link_paths to get that bit proper.
2862
2863 2004-05-01  Todd Berman  <tberman@sevenl.net>
2864
2865         * driver.cs: Try a LoadFrom before a Load, this checks the current
2866         path. This is currently a bug in mono that is be fixed, however, this
2867         provides a workaround for now. This will be removed when the bug
2868         is fixed.
2869
2870 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
2871
2872         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2873         incomplete key pairs (#57941).
2874
2875 2004-05-01  Todd Berman  <tberman@sevenl.net>
2876
2877         * driver.cs: Remove '.' from path_chars, now System.* loads properly
2878         from the GAC
2879
2880 2004-04-30  Jackson Harper  <jackson@ximian.com>
2881
2882         * codegen.cs: Open keys readonly.
2883         
2884 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2885
2886         * typemanager.cs: don't report cyclic struct layout when a struct
2887         contains 2 or more fields of the same type. Failed for Pango.AttrShape
2888         which has 2 Pango.Rectangle fields.
2889
2890 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2891
2892         * expression.cs: Handle IntPtr comparisons with IL code
2893         rather than a method call.
2894
2895 2004-04-29  Martin Baulig  <martin@ximian.com>
2896
2897         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
2898         the list of PropertyInfo's in class hierarchy and find the
2899         accessor.  Fixes #56013.
2900
2901 2004-04-29  Martin Baulig  <martin@ximian.com>
2902
2903         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2904
2905 2004-04-29  Martin Baulig  <martin@ximian.com>
2906
2907         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2908
2909         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2910
2911 2004-04-29  Martin Baulig  <martin@ximian.com>
2912
2913         * class.cs (ConstructorInitializer.Resolve): Check whether the
2914         parent .ctor is accessible.  Fixes #52146.
2915
2916 2004-04-29  Martin Baulig  <martin@ximian.com>
2917
2918         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2919
2920         * statement.cs (Using.EmitLocalVariableDecls): Use
2921         TypeManager.idisposable_type, not typeof (IDisposable).
2922         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2923
2924 2004-04-29  Martin Baulig  <martin@ximian.com>
2925
2926         * class.cs (Event.Define): Don't emit the field and don't set
2927         RTSpecialName and SpecialName for events on interfaces.  Fixes
2928         #57703. 
2929
2930 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2931
2932         Refactor Attribute.ApplyAttributes.
2933         * attribute.cs (Attributable): New base class for objects that can
2934         have Attributes applied on them.
2935         (Attribute): Make AttributeUsage fields public.
2936         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2937         (Attribute.IsInternalCall): New property.
2938         (Attribute.UsageAttr): Convert to a public read-only property.
2939         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2940         (Attribute.ResolveType, Attribute.Resolve)
2941         (Attribute.ScanForIndexerName): Update to reflect changes.
2942         (Attribute.CheckAttributeTarget): Re-format.
2943         (Attribute.ApplyAttributes): Refactor, to various
2944         Attributable.ApplyAttributeBuilder methods.
2945         * decl.cs (MemberCore): Make Attributable.
2946         * class.cs (Accessor): Make Attributable.
2947         (MethodData.ApplyAttributes): Use proper attribute types, not
2948         attribute names.
2949         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2950         (TypeContainer.ApplyAttributeBuilder)
2951         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2952         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2953         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2954         (Operator.ApplyAttributeBuilder): New factored-out methods.
2955         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2956         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2957         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2958         * parameter.cs (ParameterBase): New Attributable base class
2959         that can also represent Return types.
2960         (Parameter): Update to the changes.
2961
2962 2004-04-29  Jackson Harper  <jackson@ximian.com>
2963
2964         * driver.cs: Prefer the corlib system version when looking for
2965         assemblies in the GAC. This is still a hack, but its a better hack
2966         now.
2967         
2968 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2969
2970         * decl.cs, enum.cs: Improved error 3005 reporting.
2971   
2972         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2973         (related_symbols): New private member for list of symbols
2974         related to reported error/warning.
2975         
2976         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2977
2978 2004-04-29  Martin Baulig  <martin@ximian.com>
2979
2980         * ecore.cs (Expression.Constantify): If we're an enum and
2981         TypeManager.TypeToCoreType() doesn't give us another type, use
2982         t.UnderlyingSystemType.  Fixes #56178.  
2983
2984 2004-04-29  Martin Baulig  <martin@ximian.com>
2985
2986         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2987         interfaces and for each interface, only add members directly
2988         declared in that interface.  Fixes #53255.
2989
2990 2004-04-28  Martin Baulig  <martin@ximian.com>
2991
2992         * expression.cs (ConditionalLogicalOperator): Use a temporary
2993         variable for `left' to avoid that we evaluate it more than once;
2994         bug #52588.
2995
2996 2004-04-28  Martin Baulig  <martin@ximian.com>
2997
2998         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2999         `void[]' (CS1547).
3000
3001 2004-04-28  Martin Baulig  <martin@ximian.com>
3002
3003         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3004         void (CS1547).
3005
3006         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3007         whether the type is not void (CS1547).
3008
3009 2004-04-28  Martin Baulig  <martin@ximian.com>
3010
3011         * expression.cs (Unary.DoResolveLValue): Override this and report
3012         CS0131 for anything but Operator.Indirection.
3013
3014 2004-04-28  Martin Baulig  <martin@ximian.com>
3015
3016         Committing a patch from Ben Maurer; see bug #50820.
3017
3018         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3019         check for classes.
3020
3021         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3022         classes.        
3023
3024 2004-04-28  Martin Baulig  <martin@ximian.com>
3025
3026         Committing a patch from Ben Maurer; see bug #50820.
3027
3028         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3029         check for classes.
3030
3031         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3032         classes.        
3033
3034 2004-04-28  Martin Baulig  <martin@ximian.com>
3035
3036         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3037         (Block.AddLabel): Call DoLookupLabel() to only search in the
3038         current block.
3039
3040 2004-04-28  Martin Baulig  <martin@ximian.com>
3041
3042         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3043         comparing StringConstants and NullLiterals in Equality and Inequality.
3044
3045 2004-04-28  Jackson Harper  <jackson@ximian.com>
3046
3047         * driver.cs: Attempt to load referenced assemblies from the
3048         GAC. This is the quick and dirty version of this method that
3049         doesnt take into account versions and just takes the first
3050         canidate found. Will be good enough for now as we will not have more
3051         then one version installed into the GAC until I update this method.
3052
3053 2004-04-28  Martin Baulig  <martin@ximian.com>
3054
3055         * typemanager.cs (TypeManager.CheckStructCycles): New public
3056         static method to check for cycles in the struct layout.
3057
3058         * rootcontext.cs (RootContext.PopulateTypes): Call
3059         TypeManager.CheckStructCycles() for each TypeContainer.
3060         [Note: We only need to visit each type once.]
3061
3062 2004-04-28  Martin Baulig  <martin@ximian.com>
3063
3064         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3065
3066         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3067         success and added `out object value'.  Use a `bool resolved' field
3068         to check whether we've already been called rather than
3069         `ConstantValue != null' since this breaks for NullLiterals.
3070
3071 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3072
3073         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3074         setting of this flag, since the 'set' method may be non-public.
3075
3076 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3077
3078         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3079         check on current_vector.Block.
3080
3081 2004-04-27  Martin Baulig  <martin@ximian.com>
3082
3083         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3084         a field initializer.  Fixes #56459.
3085
3086 2004-04-27  Martin Baulig  <martin@ximian.com>
3087
3088         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3089         we're not attempting to use an indexer.  Fixes #52154.
3090
3091 2004-04-27  Martin Baulig  <martin@ximian.com>
3092
3093         * statement.cs (Return): Don't create a return label if we don't
3094         need it; reverts my change from January 20th.  Thanks to Ben
3095         Maurer for this.
3096
3097 2004-04-27  Martin Baulig  <martin@ximian.com>
3098
3099         According to the spec, `goto' can only leave a nested scope, but
3100         never enter it.
3101
3102         * statement.cs (Block.LookupLabel): Only lookup in the current
3103         block, don't recurse into parent or child blocks.
3104         (Block.AddLabel): Check in parent and child blocks, report
3105         CS0140/CS0158 if we find a duplicate.
3106         (Block): Removed this indexer for label lookups.
3107         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3108         this already does the error reporting for us.
3109
3110         * flowanalysis.cs
3111         (FlowBranching.UsageVector.Block): New public variable; may be null.
3112         (FlowBranching.CreateSibling): Added `Block' argument.
3113         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3114         label for the target of a `goto' and check whether we're not
3115         leaving a `finally'.
3116
3117 2004-04-27  Martin Baulig  <martin@ximian.com>
3118
3119         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3120         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3121         just for returns).
3122
3123 2004-04-27  Martin Baulig  <martin@ximian.com>
3124
3125         * statement.cs (Block.AddLabel): Also check for implicit blocks
3126         and added a CS0158 check.
3127
3128 2004-04-27  Martin Baulig  <martin@ximian.com>
3129
3130         * flowanalysis.cs (FlowBranchingLoop): New class.
3131         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3132         UsageVector's instead of an ArrayList.
3133         (FlowBranching.Label): Likewise.
3134         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3135         (FlowBranching.AddBreakVector): New method.
3136
3137 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3138
3139         * attribute.cs: Small regression fix: only convert the type if we
3140         the type is different, fixes System.Drawing build.
3141
3142 2004-04-27  Martin Baulig  <martin@ximian.com>
3143
3144         * attribute.cs (Attribute.Resolve): If we have a constant value
3145         for a named field or property, implicity convert it to the correct
3146         type.
3147
3148 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3149
3150         * statement.cs (Block.Block): Implicit blocks share
3151         'child_variable_names' fields with parent blocks.
3152         (Block.AddChildVariableNames): Remove.
3153         (Block.AddVariable): Mark variable as "used by a child block" in
3154         every surrounding block.
3155         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3156         been used in a child block, complain about violation of "Invariant
3157         meaning in blocks" rule.
3158         * cs-parser.jay (declare_local_variables): Don't use
3159         AddChildVariableNames.
3160         (foreach_statement): Don't create an implicit block: 'foreach'
3161         introduces a scope.
3162
3163 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3164
3165         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3166         converting from 0L to ulong.  Fixes 57522.
3167
3168 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3169
3170         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3171         derived class hides via 'new' keyword field from base class (test-242.cs).
3172         TODO: Handle this in the more general way.
3173         
3174         * class.cs (CheckBase): Ditto.
3175
3176 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3177
3178         * decl.cs (caching_flags): New member for storing cached values
3179         as bit flags.
3180         (MemberCore.Flags): New enum where bit flags for caching_flags
3181         are defined.
3182         (MemberCore.cls_compliance): Moved to caching_flags.
3183         (DeclSpace.Created): Moved to caching_flags.
3184
3185         * class.cs: Use caching_flags instead of DeclSpace.Created
3186         
3187 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3188
3189         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3190         if we are only a derived class, not a nested class.
3191
3192         * typemanager.cs: Same as above, but do this at the MemberLookup
3193         level (used by field and methods, properties are handled in
3194         PropertyExpr).   Allow for the qualified access if we are a nested
3195         method. 
3196
3197 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3198
3199         * class.cs: Refactoring.
3200         (IMethodData): New inteface; Holds links to parent members
3201         to avoid member duplication (reduced memory allocation).
3202         (Method): Implemented IMethodData interface.
3203         (PropertyBase): New inner classes for get/set methods.
3204         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3205         (Event): New inner classes for add/remove methods.
3206         (Event.DelegateMethod): Implemented IMethodData interface.
3207
3208         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3209         EmitContext (related to class.cs refactoring).
3210
3211 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3212
3213         * delegate.cs (Delegate.VerifyApplicability): If the number of
3214         arguments are the same as the number of parameters, first try to
3215         verify applicability ignoring  any 'params' modifier on the last
3216         parameter.
3217         Fixes #56442.
3218
3219 2004-04-08  Martin Baulig  <martin@ximian.com>
3220
3221         Merged latest changes into gmcs.  Please keep this comment in
3222         here, it makes it easier for me to see what changed in MCS since
3223         the last time I merged.
3224
3225 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3226
3227         * class.cs (TypeContainer.AddIndexer): Use
3228         'ExplicitInterfaceName' to determine if interface name was
3229         explicitly specified.  'InterfaceType' is not initialized at this time.
3230         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3231         Indexers array is already in the required order.  Initialize
3232         'IndexerName' only if there are normal indexers.
3233         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3234         (TypeContainer.Emit): Emit DefaultMember attribute only if
3235         IndexerName is initialized.
3236         Fixes #56300.
3237
3238 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3239
3240         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3241         Fixes #57007
3242
3243 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3244
3245         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3246         attributes.
3247         Fix for #56456.
3248
3249         * attribute.cs (Attribute.Resolve): Check for duplicate named
3250         attributes.
3251         Fix for #56463.
3252
3253 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3254
3255         * iterators.cs (MarkYield): track whether we are in an exception,
3256         and generate code accordingly.  Use a temporary value to store the
3257         result for our state.
3258
3259         I had ignored a bit the interaction of try/catch with iterators
3260         since their behavior was not entirely obvious, but now it is
3261         possible to verify that our behavior is the same as MS .NET 2.0
3262
3263         Fixes 54814
3264
3265 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3266
3267         * iterators.cs: Avoid creating temporaries if there is no work to
3268         do. 
3269
3270         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3271         Enumerations, use TypeManager.EnumToUnderlying and call
3272         recursively. 
3273
3274         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3275         bug #57013
3276
3277         (This.Emit): Use EmitContext.EmitThis to emit our
3278         instance variable.
3279
3280         (This.EmitAssign): Ditto.
3281
3282         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3283         codepaths, we will move all the functionality into
3284         Mono.CSharp.This 
3285
3286         (FieldExpr.EmitAssign): Ditto.
3287
3288         This fixes several hidden bugs that I uncovered while doing a code
3289         review of this today.
3290
3291         * codegen.cs (EmitThis): reworked so the semantics are more clear
3292         and also support value types "this" instances.
3293
3294         * iterators.cs: Changed so that for iterators in value types, we
3295         do not pass the value type as a parameter.  
3296
3297         Initialization of the enumerator helpers is now done in the caller
3298         instead of passing the parameters to the constructors and having
3299         the constructor set the fields.
3300
3301         The fields have now `assembly' visibility instead of private.
3302
3303 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3304
3305         * expression.cs (Argument.Resolve): Check if fields passed as ref
3306         or out are contained in a MarshalByRefObject.
3307
3308         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3309         another compiler type.
3310
3311 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3312
3313         * class.cs (Indexer.Define): use the new name checking method.
3314         Also, return false on an error.
3315         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3316         (is_identifier_[start/part]_character): make static.
3317
3318 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3319
3320         * expression.cs (Binary.ResolveOperator): Do no append strings
3321         twice: since we can be invoked more than once (array evaluation)
3322         on the same concatenation, take care of this here.  Based on a fix
3323         from Ben (bug #56454)
3324
3325 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3326
3327         * codegen.cs: Fix another case where CS1548 must be reported (when 
3328         delay-sign isn't specified and no private is available #56564). Fix
3329         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3330         error when MCS is used on the MS runtime and we need to delay-sign 
3331         (which seems unsupported by AssemblyBuilder - see #56621).
3332
3333 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3334
3335         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3336         (TypeManager.ComputeNamespaces): Faster implementation for
3337         Microsoft runtime.
3338
3339         * compiler.csproj: Updated AssemblyName to mcs.
3340
3341 2004-05-11  Jackson Harper  <jackson@ximian.com>
3342
3343         * Makefile: Preserve MONO_PATH
3344         
3345 2004-05-11  Jackson Harper  <jackson@ximian.com>
3346
3347         * Makefile: Use mono and mcs to build gmcs
3348         
3349 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
3350
3351         * codegen.cs: Add patch from Robert Shade
3352         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
3353         sync with mcs.
3354
3355 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
3356
3357         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3358         incomplete key pairs (#57941).
3359
3360 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3361
3362         * codegen.cs: Fix another case where CS1548 must be reported (when 
3363         delay-sign isn't specified and no private is available #56564). Fix
3364         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3365         error when MCS is used on the MS runtime and we need to delay-sign 
3366         (which seems unsupported by AssemblyBuilder - see #56621).
3367
3368 2004-04-29  Jackson Harper  <jackson@ximian.com>
3369
3370         * Makefile: Set MONO_PATH to use the bootstrap corlib
3371         * driver.cs: Check the GAC for referenced assemblies.
3372                 
3373 2004-04-29  Martin Baulig  <martin@ximian.com>
3374
3375         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
3376
3377 2004-04-07  Martin Baulig  <martin@ximian.com>
3378
3379         * expression.cs (Binary.ResolveOperator): Added special case for
3380         Equality/Inequality between a type parameter and a null literal.
3381
3382 2004-04-07  Martin Baulig  <martin@ximian.com>
3383
3384         * convert.cs: Check null literal -> type parameter conversions.
3385
3386 2004-04-07  Martin Baulig  <martin@ximian.com>
3387
3388         * generic.cs (ConstructedType.CheckConstraints): Enforce the
3389         `class' and `struct' constraints.
3390
3391 2004-04-07  Martin Baulig  <martin@ximian.com>
3392
3393         * generic.cs (SpecialConstraint): New public enum.
3394         (Constraints.Resolve): Added support for the `class' and `struct'
3395         constraints.
3396
3397         * cs-parser.jay (type_parameter_constraint): Added support for the
3398         `class' and `struct' constraints.
3399
3400 2004-04-07  Martin Baulig  <martin@ximian.com>
3401
3402         * support.cs (GenericConstraints): Replaced `Types' by
3403         `ClassConstraint' and `InterfaceConstraints'; added
3404         `HasClassConstraint'.   
3405
3406 2004-04-07  Martin Baulig  <martin@ximian.com>
3407
3408         * generic.cs
3409         (Constraints.InterfaceConstraints): New public property.
3410         (Constraints.Types): Make this property public
3411         (TypeParameter): Implement IMemberContainer.
3412         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
3413         instead of a TypeBuilder/MethodBuilder; pass the interface
3414         constraints to TypeManager.AddTypeParameter().
3415         (TypeParameter.DefineType): Just take an EmitContext and no
3416         TypeBuilder/MethodBuilder.  Use the new public API.
3417
3418         * typemanager.cs (TypeManager.AddTypeParameter): Added
3419         `TypeExpr[]' argument; add the interfaces to the
3420         `builder_to_ifaces' hash.
3421         (TypeManager.LookupMemberContainer): For
3422         GenericTypeParameterBuilders, get the TypeParameter from the
3423         `builder_to_type_param'.
3424         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
3425         the TypeParameter and call FindMembers on it.
3426
3427 2004-04-07  Martin Baulig  <martin@ximian.com>
3428
3429         * class.cs
3430         (MethodCore.GenericMethod): Moved this field here from Method.
3431         (MethodCore.IsDuplicateImplementation): Take the number of type
3432         parameters into account if we're a generic method.
3433
3434         * expression.cs (Invocation.InferTypeArguments): Don't return true
3435         if `arguments' is null; we still need to check whether we actually
3436         don't need to infer anything in this case.
3437         (MemberAccess): Merged the functionality from GenericMemberAccess
3438         into this class.
3439
3440         * generic.cs (GenericMemberAccess): Removed.
3441
3442 2004-04-05  Martin Baulig  <martin@ximian.com>
3443
3444         * decl.cs (MemberCore): For generic classes, interfaces and
3445         structs, `Name' now includes the number of type parameters
3446         ("Stack!1.Node!1").
3447         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
3448         encode the number of type arguments in the type name.
3449
3450         * expression.cs (Expression.MemberLookup): Removed the
3451         `num_type_args' argument; we now encode the number of type
3452         arguments in the type name.
3453
3454         * ecore.cs (SimpleName): Encode the number of type arguments in
3455         the type name itself.
3456
3457         * generic.cs (ConstructedType): Likewise.
3458
3459         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
3460         `MemberName'; we now include the number of type parameters in the
3461         type name.
3462
3463         * typemanager.cs (TypeManager.CheckGeneric): Removed.
3464         (TypeManager.MemberLookup): Removed the
3465         `num_type_args' argument; we now encode the number of type
3466         arguments in the type name.     
3467
3468 2004-04-03  Martin Baulig  <martin@ximian.com>
3469
3470         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
3471         (MemberCore.MemberName): Moved here from MemberBase.
3472         (DeclSpace.SetParameterInfo): Just take the constraints as an
3473         ArrayList; we already have the type parameters in our
3474         `MemberName'; also do the CS0080 reporting here.
3475
3476         * cs-parser.jay (struct_declaration): Use `member_name' instead of
3477         `IDENTIFIER opt_type_parameter_list'; when constructing our
3478         `MemberName', it'll already include our type parameters.
3479         (class_declaration, interface_declaration): Likewise.
3480         (delegate_declaration): Likewise.
3481         (MakeName): Take a MemberName and return a MemberName.
3482         The following two changes are required to avoid shift/reduce conflicts:
3483         (member_name): Don't include a TypeName anymore; ie. this is now
3484         just 'IDENTIFIER opt_type_parameter_list'.
3485         (property_declaration, event_declaration): Use a
3486         `namespace_or_type_name' instead of a `member_name'.            
3487
3488 2004-04-03  Martin Baulig  <martin@ximian.com>
3489
3490         * decl.cs (MemberName): Renamed to `TypeName' and created a new
3491         `MemberName' class.
3492         (TypeName): Formerly known as MemberName.
3493
3494         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
3495         instead of a `MemberName'.
3496
3497         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
3498         (member_name): New rule; create a MemberName.
3499
3500 2004-04-02  Martin Baulig  <martin@ximian.com>
3501
3502         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
3503         (CS0305 and CS0308).
3504
3505 2004-04-02  Martin Baulig  <martin@ximian.com>
3506
3507         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
3508         support for nested types.
3509
3510 2004-04-02  Martin Baulig  <martin@ximian.com>
3511
3512         * ecore.cs (IAlias): New public interface.
3513         (TypeExpr, TypeExpression): Implement IAlias.
3514         (TypeAliasExpression): New public class.
3515
3516         * namespace.cs (Namespace): Implement IAlias.
3517         (Namespace.Lookup): Return an IAlias instead on an object.
3518         (Namespace.DefineName): Take an IAlias instead of an object.
3519         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
3520         an object.
3521         (NamespaceEntry.UsingAlias): Take a Membername instead of an
3522         Expression.
3523         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
3524         object.
3525         (NamespaceEntry.Lookup): Likewise.
3526
3527         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
3528         instead of a Type.      
3529
3530         * decl.cs (DeclSpace): Implement IAlias.
3531         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
3532
3533         * generic.cs (ConstructedType): Improved error checking.
3534
3535 2004-04-02  Martin Baulig  <martin@ximian.com>
3536
3537         * convert.cs: Added type parameter conversions.
3538
3539         * ecore.cs
3540         (UnboxCast.Emit): Emit an `unbox.any' for type params.
3541         (ClassCast.Emit): If the source type is a type parameter, box it.
3542         If the target type is a type parameter, emit an `unbox.any'
3543         instead of a `classcast'.1      
3544
3545 2004-04-01  Martin Baulig  <martin@ximian.com>
3546
3547         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
3548
3549 2004-04-01  Martin Baulig  <martin@ximian.com>
3550
3551         * generic.cs (ConstructedType.CheckConstraints): Use
3552         Convert.ImplicitStandardConversionExists(); user-defined implicit
3553         conversions are not allowed according to the spec.
3554
3555 2004-03-30  Martin Baulig  <martin@ximian.com>
3556
3557         * expression.cs (New): Added support for type parameters.
3558
3559         * typemanager.cs
3560         (TypeManager.activator_type): New public static field.
3561         (TypeManager.activator_create_instance): Likewise.
3562
3563 2004-03-30  Martin Baulig  <martin@ximian.com>
3564
3565         * typemanager.cs (TypeManager.HasConstructorConstraint): New
3566         public method.
3567
3568 2004-03-30  Martin Baulig  <martin@ximian.com>
3569
3570         * generic.cs (ConstructedType.CheckConstraints): Actually follow
3571         the spec here: the argument type must be convertible to the
3572         constraints.
3573
3574 2004-03-30  Martin Baulig  <martin@ximian.com>
3575
3576         * generic.cs
3577         (TypeParameter.Define, TypeParameter.DefineMethod): Call
3578         TypeManager.AddTypeParameter().
3579         (ConstructedType.CheckConstraints): Re-enable this and actually
3580         check whether we have a constructor constraint.
3581
3582         * typemanager.cs
3583         (TypeManager.builder_to_type_param): New static field.
3584         (TypeManager.AddTypeParameter): New static method.
3585         (TypeManager.LookupTypeParameter): New public method.
3586
3587 2004-03-30  Martin Baulig  <martin@ximian.com>
3588
3589         * generic.cs (TypeParameter.DefineType): Return a boolean and use
3590         the new API to actually define the constructor constraint.
3591
3592         * typemanager.cs
3593         (TypeManager.new_constraint_attr_type): New static field.
3594         (TypeManager.InitCoreTypes): Initialize it.
3595
3596 2004-03-30  Martin Baulig  <martin@ximian.com>
3597
3598         * generic.cs (Constraints): Completed error checking, use correct
3599         error numbers.
3600
3601 2004-03-29  Martin Baulig  <martin@ximian.com>
3602
3603         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
3604
3605         * expression.cs (Invocation.InferTypeArguments): Added overloaded
3606         public version which takes a `ParameterData pd' instead of an
3607         `ArrayList args'.
3608
3609 2004-03-29  Martin Baulig  <martin@ximian.com>
3610
3611         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
3612         not a MethodInfo.       
3613
3614 2004-03-29  Martin Baulig  <martin@ximian.com>
3615
3616         * expression.cs (Argument.ResolveMethodGroup): If we're a
3617         ConstructedType, call GetMemberAccess() on it.  
3618
3619 2004-03-29  Martin Baulig  <martin@ximian.com>
3620
3621         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
3622         (MethodCore.CheckGenericOverride): When overriding a generic
3623         method, check whether the constraints match.
3624
3625         * support.cs (GenericConstraints): New public interface.
3626         (ParameterData.GenericConstraints): New public method.
3627
3628         * parameter.cs (Parameter.Resolve): Check whether we're a generic
3629         method parameter and compute our constraints if appropriate.
3630         (Parameter.GenericConstraints): New public property.
3631
3632         * generic.cs (Constraints): Implement GenericConstraints.
3633
3634 2004-03-29  Martin Baulig  <martin@ximian.com>
3635
3636         * decl.cs (MemberCache.FindMemberToOverride): Use
3637         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
3638
3639 2004-03-29  Martin Baulig  <martin@ximian.com>
3640
3641         * generic.cs (GenericMethod.Define): Resolve our type parameters.
3642
3643 2004-03-29  Martin Baulig  <martin@ximian.com>
3644
3645         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
3646         not allowed on non-generic declarations").
3647
3648 2004-03-29  Martin Baulig  <martin@ximian.com>
3649
3650         * expression.cs (Invocation.InferTypeArguments): Added overloaded
3651         public version of this method.
3652
3653         * class.cs (MethodCore.IsDuplicateImplementation): Use
3654         Invocation.InferTypeArguments() to check this.
3655
3656 2004-03-29  Martin Baulig  <martin@ximian.com>
3657
3658         * convert.cs: Use TypeManager.IsDelegateType() instead of
3659         comparing types correctly.
3660
3661 2004-03-29  Martin Baulig  <martin@ximian.com>
3662
3663         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
3664         types directly to make it work for generic instances.
3665
3666         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
3667
3668 2004-03-29  Martin Baulig  <martin@ximian.com>
3669
3670         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
3671         support for arrays.     
3672
3673 2004-03-24  Martin Baulig  <martin@ximian.com>
3674
3675         * decl.cs (DeclSpace.FindType): Also use
3676         TypeManager.CheckGeneric() for types from the using clauses.
3677
3678 2004-03-23  Martin Baulig  <martin@ximian.com>
3679
3680         * expression.cs (Invocation.OverloadResolve): Added `bool
3681         may_fail' argument and use it instead of the Location.IsNull() hack.
3682
3683 2004-03-23  Martin Baulig  <martin@ximian.com>
3684
3685         * expression.cs (Invocation.InferType): Use correct type inference
3686         rules here.     
3687
3688 2004-03-23  Martin Baulig  <martin@ximian.com>
3689
3690         * ecore.cs (MethodGroupExpr.Name): Use
3691         TypeManager.CSharpSignature() instead of just the name.
3692
3693         * expression.cs (Invocation.OverloadResolve): Provide better error
3694         reporting.
3695         (Invocation.DoResolve): OverloadResolve() never returns null
3696         without reporting an error, so removed the error -6 reporting here.
3697
3698 2004-03-23  Martin Baulig  <martin@ximian.com>
3699
3700         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
3701         generic methods.
3702
3703         * cs-parser.jay (delegate_declaration): Support generic delegates.
3704
3705         * delegate.cs: Support generic delegates.
3706
3707 2004-03-22  Martin Baulig  <martin@ximian.com>
3708
3709         * expression.cs (Invocation.InferParamsTypeArguments): New static
3710         method; does type inference for params arguments.
3711
3712 2004-03-21  Martin Baulig  <martin@ximian.com>
3713
3714         * typemanager.cs (TypeManager.IsGenericMethod): New public static
3715         method; checks whether a method is a generic method.    
3716
3717         * expression.cs (Invocation.InferTypeArguments): New static method;
3718         infer type arguments for generic method invocation.
3719
3720         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
3721         property; we set this to true if we're resolving a generic method
3722         invocation and the user specified type arguments, ie. we're not
3723         doing type inference.
3724
3725 2004-03-20  Martin Baulig  <martin@ximian.com>
3726
3727         * class.cs (MethodData.DeclaringType): New public property.
3728         (MethodData.Define): Set DeclaringType here.
3729         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
3730         instead of OperatorMethodBuilder.DeclaringType.
3731
3732 2004-03-20  Martin Baulig  <martin@ximian.com>
3733
3734         * cs-tokenizer.cs (xtoken): Return a special
3735         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
3736
3737         * cs-parser.jay (default_value_expression): Switch to the new
3738         syntax (14.5.13).
3739
3740 2004-03-19  Martin Baulig  <martin@ximian.com>
3741
3742         * decl.cs (MemberName): New class.  We use this to "construct"
3743         namespace_or_type_name's.
3744
3745         * generics.cs (TypeArguments.GetDeclarations): New public method;
3746         returns the type arguments as a string[] and reports a CS0081 if
3747         one of them is not an identifier.
3748
3749         * class.cs (MemberBase): The .ctor now takes the name as a
3750         MemberName instead of a string.
3751         (MemberBase.ExplicitInterfaceName): Changed type from string to
3752         Expression.
3753         (MemberBase.DoDefine): If we're an explicit implementation, the
3754         InterfaceType may be a generic instance.
3755
3756         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
3757         (namespace_name): Call MemberName.GetName () to transform the
3758         MemberName into a string and ensure we don't have any type
3759         arguments.
3760         (type_name): Call MemberName.GetTypeExpression() to transfrom the
3761         MemberName into an expression.
3762         (method_header): Use namespace_or_type_name instead of member_name.     
3763
3764 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3765
3766         * rootcontext.cs: Add new types to the boot resolution.
3767
3768         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3769         MulticastDelegate is not allowed.
3770
3771         * typemanager.cs: Add new types to lookup: System.TypedReference
3772         and ArgIterator.
3773
3774         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3775         check for TypedReference or ArgIterator, they are not allowed. 
3776
3777         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3778         makes us properly catch 1510 in some conditions (see bug 56016 for
3779         details). 
3780
3781 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3782
3783         * CryptoConvert.cs: update from corlib version
3784         with endian fixes.
3785
3786 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3787
3788         * class.cs (Indexer.Define): Check indexername declaration
3789
3790 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3791
3792         * attribute.cs (IsClsCompliant): Fixed problem with handling
3793         all three states (compliant, not-compliant, undetected).
3794
3795 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3796
3797         * attribute.cs (Attribute): Location is now public.
3798         (Resolve): Store resolved arguments (pos_values) in attribute class.
3799         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3800         (GetClsCompliantAttributeValue): New method that gets
3801         CLSCompliantAttribute value.
3802         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3803         if exists else null.
3804         (AttributeTester): New class for CLS-Compliant verification routines.
3805
3806         * class.cs (Emit): Add CLS-Compliant verification.
3807         (Method.GetSignatureForError): Implemented.
3808         (Constructor.GetSignatureForError): Implemented
3809         (Constructor.HasCompliantArgs): Returns if constructor has
3810         CLS-Compliant arguments.
3811         (Constructor.Emit): Override.
3812         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3813         is needed to test only parameters.
3814         (FieldBase.GetSignatureForError): Implemented.
3815         (TypeContainer): New member for storing base interfaces.
3816         (TypeContainer.FindMembers): Search in base interfaces too.
3817
3818         * codegen.cs (GetClsComplianceAttribute): New method that gets
3819         assembly or module CLSCompliantAttribute value.
3820         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3821         for assembly.
3822         (ModuleClass.Emit): Add error 3012 test.
3823
3824         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3825
3826         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3827         state for all decl types.
3828         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3829         if CLS-Compliant tests are required.
3830         (IsClsCompliaceRequired): New method. Analyze whether code
3831         must be CLS-Compliant.
3832         (IsExposedFromAssembly): New method. Returns true when MemberCore
3833         is exposed from assembly.
3834         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3835         value or gets cached value.
3836         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3837         is explicitly marked with CLSCompliantAttribute.
3838         (IsIdentifierClsCompliant): New abstract method. This method is
3839         used to testing error 3005.
3840         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3841         for identifier and parameters CLS-Compliant testing.
3842         (VerifyClsCompliance): New method. The main virtual method for
3843         CLS-Compliant verifications.
3844         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3845         null. I don't know why is null (too many public members !).
3846         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3847         and get value of first CLSCompliantAttribute that found.
3848
3849         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3850         (VerifyClsCompliance): Override and add extra tests.
3851
3852         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3853         clscheck- disable CLS-Compliant verification event if assembly is has
3854         CLSCompliantAttribute(true).
3855
3856         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3857         ApllyAttribute is now called in emit section as in the other cases.
3858         Possible future Emit integration.
3859         (IsIdentifierClsCompliant): New override.
3860         (VerifyClsCompliance): New override.
3861         (GetEnumeratorName): Returns full enum name.
3862
3863         * parameter.cs (GetSignatureForError): Implemented.
3864
3865         * report.cs (WarningData): New struct for Warning message information.
3866         (LocationOfPreviousError): New method.
3867         (Warning): New method. Reports warning based on the warning table.
3868         (Error_T): New method. Reports error based on the error table.
3869
3870         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3871         verifications are done here.
3872
3873         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3874
3875         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3876         CLSCompliantAttribute.
3877         (all_imported_types): New member holds all imported types from other
3878         assemblies.
3879         (LoadAllImportedTypes): New method fills static table with exported types
3880         from all referenced assemblies.
3881         (Modules): New property returns all assembly modules.
3882
3883 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3884
3885         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3886         throwing a parser error.
3887
3888         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3889         which removes the hardcoded get_/set_ prefixes for properties, as
3890         IL allows for the properties to be named something else.  
3891
3892         Bug #56013
3893
3894         * expression.cs: Do not override operand before we know if it is
3895         non-null.  Fix 56207
3896
3897 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3898
3899         * typemanager.cs: support for pinned variables.
3900
3901 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3902
3903         * decl.cs, typemanager.cs: Avoid using an arraylist
3904         as a buffer if there is only one result set.
3905
3906 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3907
3908         * expression.cs: Make sure you cant call a static method
3909         with an instance expression, bug #56174.
3910
3911 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3912
3913         * class.cs (IsDuplicateImplementation): Improve error reporting to
3914         flag 663 (method only differs in parameter modifier).
3915
3916         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3917         in preprocessor directives.
3918
3919         * location.cs (LookupFile): Allow for the empty path.
3920
3921         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3922         better approach for some of that patch, but its failing with the
3923         CharSet enumeration.  For now try/catch will do.
3924
3925         * typemanager.cs: Do not crash if a struct does not have fields.
3926         Fixes 56150.
3927
3928 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3929
3930         * expression.cs: cs0213, cant fix a fixed expression.
3931         fixes 50231.
3932
3933 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3934
3935         * cs-parser.jay: detect invalid embeded statements gracefully.
3936         bug #51113.
3937
3938 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3939
3940         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3941         As a regex:
3942         s/
3943         the invocation type may not be a subclass of the tye of the item/
3944         The type of the item must be a subclass of the invocation item.
3945         /g
3946
3947         Fixes bug #50820.
3948
3949 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3950
3951         * attribute.cs: Added methods to get a string and a bool from an
3952         attribute. Required to information from AssemblyKeyFileAttribute,
3953         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3954         * codegen.cs: Modified AssemblyName creation to include support for
3955         strongnames. Catch additional exceptions to report them as CS1548.
3956         * compiler.csproj: Updated include CryptoConvert.cs.
3957         * compiler.csproj.user: Removed file - user specific configuration.
3958         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3959         Mono.Security assembly. The original class is maintained and tested in
3960         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3961         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3962         like CSC 8.0 (C# v2) supports.
3963         * Makefile: Added CryptoConvert.cs to mcs sources.
3964         * rootcontext.cs: Added new options for strongnames.
3965
3966 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3967
3968         * driver.cs: For --expect-error, report error code `2'
3969         if the program compiled with no errors, error code `1' if
3970         it compiled with an error other than the one expected.
3971
3972 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3973
3974         * compiler.csproj: Updated for Visual Studio .NET 2003.
3975         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3976         * compiler.sln: Updated for Visual Studio .NET 2003.
3977
3978 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3979
3980         * expression.cs: Fix bug #47234. We basically need to apply the
3981         rule that we prefer the conversion of null to a reference type
3982         when faced with a conversion to 'object' (csc behaviour).
3983
3984 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3985
3986         * statement.cs: Shorter form for foreach, eliminates
3987         a local variable. r=Martin.
3988
3989 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3990
3991         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3992         checks if we can use brtrue/brfalse to test for 0.
3993         * expression.cs: use the above in the test for using brtrue/brfalse.
3994         cleanup code a bit.
3995
3996 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3997
3998         * expression.cs: Rewrite string concat stuff. Benefits:
3999
4000         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4001         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4002         rather than a concat chain.
4003
4004         * typemanager.cs: Add lookups for more concat overloads.
4005
4006 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4007
4008         * expression.cs: Emit shorter il code for array init.
4009
4010         newarr
4011         dup
4012         // set 1
4013
4014         // set 2
4015
4016         newarr
4017         stloc.x
4018
4019         ldloc.x
4020         // set 1
4021
4022         ldloc.x
4023         // set 2
4024
4025 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4026
4027         * statement.cs: Before, two switch blocks would be merged if the
4028         total size of the blocks (end_item - begin_item + 1) was less than
4029         two times the combined sizes of the blocks.
4030
4031         Now, it will only merge if after the merge at least half of the
4032         slots are filled.
4033
4034         fixes 55885.
4035
4036 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4037
4038         * class.cs : csc build fix for GetMethods(). See bug #52503.
4039
4040 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4041
4042         * expression.cs: Make sure fp comparisons work with NaN.
4043         This fixes bug #54303. Mig approved this patch a long
4044         time ago, but we were not able to test b/c the runtime
4045         had a related bug.
4046
4047 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4048
4049         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4050
4051 2004-03-19  Martin Baulig  <martin@ximian.com>
4052
4053         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
4054         two overloads may unify for some type parameter substitutions and
4055         report a CS0408 if appropriate.
4056
4057 2004-03-19  Martin Baulig  <martin@ximian.com>
4058
4059         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4060         error here and not in our caller.
4061
4062 2004-03-19  Martin Baulig  <martin@ximian.com>
4063
4064         * interface.cs: Completely killed this file.
4065         (Interface): We're now a TypeContainer and live in class.cs.
4066
4067         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4068         argument; we're now also called for interfaces.
4069         (TypeContainer.DefineMembers): Allow this method being called
4070         multiple times.
4071         (TypeContainer.GetMethods): New public method; formerly known as
4072         Interface.GetMethod().  This is used by PendingImplementation.
4073         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4074         it's now private and non-static.
4075         (Interface): Moved this here; it's now implemented similar to
4076         Class and Struct.
4077         (Method, Property, Event, Indexer): Added `bool is_interface'
4078         argument to their .ctor's.
4079         (MemberBase.IsInterface): New public field.
4080
4081         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4082         instances instead of InterfaceMethod, InterfaceProperty, etc.
4083         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4084         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4085
4086 2004-03-19  Martin Baulig  <martin@ximian.com>
4087
4088         * class.cs (MethodCore.IsDuplicateImplementation): New private
4089         method which does the CS0111 checking.
4090         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4091         Use IsDuplicateImplementation().
4092
4093 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4094
4095         * decl.cs (FindMemberToOverride): New method to find the correct
4096         method or property to override in the base class.
4097         * class.cs
4098             - Make Method/Property use the above method to find the
4099               version in the base class.
4100             - Remove the InheritableMemberSignatureCompare as it is now
4101               dead code.
4102
4103         This patch makes large code bases much faster to compile, as it is
4104         O(n) rather than O(n^2) to do this validation.
4105
4106         Also, it fixes bug 52458 which is that nested classes are not
4107         taken into account when finding the base class member.
4108
4109         Reviewed/Approved by Martin.
4110
4111 2004-03-17  Martin Baulig  <martin@ximian.com>
4112
4113         * expression.cs (MemberAccess.DoResolve): Take the parent's number
4114         of type arguments into account; use the `real_num_type_args'
4115         approach like in DoResolveAsTypeStep().
4116
4117         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
4118         nested types.
4119
4120 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4121
4122         * interface.cs: In all interface classes removed redundant
4123         member initialization.
4124
4125 2004-03-16  Martin Baulig  <martin@ximian.com>
4126
4127         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4128
4129 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4130
4131         * decl.cs (DefineTypeAndParents): New helper method to define a
4132         type's containers before the type itself is defined;  This is a
4133         bug exposed by the recent changes to Windows.Forms when an
4134         implemented interface was defined inside a class that had not been
4135         built yet.   
4136
4137         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4138
4139         (Check): Loop correctly to report errors modifiers
4140         (UNSAFE was not in the loop, since it was the same as TOP).
4141
4142         * interface.cs: Every interface member now takes a ModFlags,
4143         instead of a "is_new" bool, which we set on the base MemberCore. 
4144
4145         Every place where we called "UnsafeOk" in the interface, now we
4146         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4147         the unsafe settings from the member declaration instead of the
4148         container interface. 
4149
4150         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4151
4152         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4153         `set_indexer_name' to the pending bits (one per type).
4154
4155         We fixed a bug today that was picking the wrong method to
4156         override, since for properties the existing InterfaceMethod code
4157         basically ignored the method name.  Now we make sure that the
4158         method name is one of the valid indexer names.
4159
4160 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4161  
4162         * support.cs (SeekableStreamReader): Keep track of stream byte
4163         positions and don't mix them with character offsets to the buffer.
4164
4165         Patch from Gustavo Giráldez
4166
4167 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4168
4169         * interface.cs (InterfaceSetGetBase): Removed double member
4170         initialization, base class does it as well.
4171
4172 2004-03-13  Martin Baulig  <martin@ximian.com>
4173
4174         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4175         when compiling corlib.
4176
4177 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4178
4179         * convert.cs (ExplicitConversion): We were reporting an error on
4180         certain conversions (object_type source to a value type, when the
4181         expression was `null') before we had a chance to pass it through
4182         the user defined conversions.
4183
4184         * driver.cs: Replace / and \ in resource specifications to dots.
4185         Fixes 50752
4186
4187         * class.cs: Add check for duplicate operators.  Fixes 52477
4188
4189 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4190
4191         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4192         that are in the middle of the statements, not only at the end.
4193         Fixes #54987
4194
4195         * class.cs (TypeContainer.AddField): No longer set the
4196         `HaveStaticConstructor' flag, now we call it
4197         `UserDefineStaticConstructor' to diferentiate the slightly
4198         semantic difference.
4199
4200         The situation is that we were not adding BeforeFieldInit (from
4201         Modifiers.TypeAttr) to classes that could have it.
4202         BeforeFieldInit should be set to classes that have no static
4203         constructor. 
4204
4205         See:
4206
4207         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4208
4209         And most importantly Zoltan's comment:
4210
4211         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4212
4213         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4214          before its static fields are used', i.e. initialization does not need
4215          to be triggered by the first access to the type. Setting this flag
4216          helps the JIT to compile better code, since it can run the static
4217          constructor at JIT time, and does not need to generate code to call it
4218          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4219          this flag for lots of classes like String. 
4220          
4221          csc sets this flag if the type does not have an explicit static 
4222          constructor. The reasoning seems to be that if there are only static
4223          initalizers for a type, and no static constructor, then the programmer
4224          does not care when this initialization happens, so beforefieldinit
4225          can be used.
4226          
4227          This bug prevents the AOT compiler from being usable, since it 
4228          generates so many calls to mono_runtime_class_init that the AOT code
4229          is much slower than the JITted code. The JITted code is faster, 
4230          because it does not generate these calls if the vtable is type is
4231          already initialized, which is true in the majority of cases. But the
4232          AOT compiler can't do this."
4233
4234 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4235
4236         * class.cs (MethodData.Emit): Refactor the code so symbolic
4237         information is generated for destructors;  For some reasons we
4238         were taking a code path that did not generate symbolic information
4239         before. 
4240
4241 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4242
4243         * class.cs: Create a Constructor.CheckBase method that
4244         takes care of all validation type code. The method
4245         contains some code that was moved from Define.
4246
4247         It also includes new code that checks for duplicate ctors.
4248         This fixes bug #55148.
4249
4250 2004-03-09  Joshua Tauberer <tauberer@for.net>
4251
4252         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4253         a { ... }-style array creation invokes EmitStaticInitializers
4254         which is not good for reference-type arrays.  String, decimal
4255         and now null constants (NullCast) are not counted toward
4256         static initializers.
4257
4258 2004-03-05  Martin Baulig  <martin@ximian.com>
4259
4260         * location.cs (SourceFile.HasLineDirective): New public field;
4261         specifies whether the file contains or is referenced by a "#line"
4262         directive.
4263         (Location.DefineSymbolDocuments): Ignore source files which
4264         either contain or are referenced by a "#line" directive.        
4265
4266 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4267
4268         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4269         direct access to our parent, so check the method inline there.
4270
4271 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4272
4273         * expression.cs (Invocation.EmitCall): Miguel's last commit
4274         caused a regression. If you had:
4275
4276             T t = null;
4277             t.Foo ();
4278
4279         In Foo the implict this would be null.
4280
4281 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4282
4283         * expression.cs (Invocation.EmitCall): If the method is not
4284         virtual, do not emit a CallVirt to it, use Call.
4285
4286         * typemanager.cs (GetFullNameSignature): Improve the method to
4287         cope with ".ctor" and replace it with the type name.
4288
4289         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4290         as an argument the ConstructorBuilder where it is being defined,
4291         to catch the recursive constructor invocations.
4292
4293 2004-03-16  Martin Baulig  <martin@ximian.com>
4294
4295         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
4296         ConstructedType, call ResolveType() on it to get the type rather
4297         than just using `expr.Type'.
4298
4299 2004-03-16  Martin Baulig  <martin@ximian.com>
4300
4301         * generics.cs (ConstructedType.GetMemberAccess): Take the
4302         EmitContext instead on the TypeExpr and use
4303         ec.TypeContainer.CurrentType/ec.ContainerType.
4304
4305 2004-03-16  Martin Baulig  <martin@ximian.com>
4306
4307         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
4308         parameters before aliases.
4309
4310 2004-03-16  Martin Baulig  <martin@ximian.com>
4311
4312         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
4313         New oublic function; checks whether two generic instances may become
4314         equal under some instantiations (26.3.1).
4315
4316         * class.cs (TypeContainer.Define): Call
4317         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
4318         error.
4319
4320 2004-03-16  Martin Baulig  <martin@ximian.com>
4321
4322         * class.cs (TypeContainer.GetClassBases): Moved
4323         Error_TypeParameterAsBase() here and also check whether the base
4324         class is not an attribute.
4325
4326 2004-03-16  Martin Baulig  <martin@ximian.com>
4327
4328         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4329
4330 2004-03-16  Martin Baulig  <martin@ximian.com>
4331
4332         * class.cs (Error_TypeParameterAsBase): Use correct error number
4333         here (CS0689).  
4334
4335 2004-03-16  Martin Baulig  <martin@ximian.com>
4336
4337         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
4338         for generics.
4339
4340         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
4341         error reporting.
4342
4343 2004-03-15  Martin Baulig  <martin@ximian.com>
4344
4345         * typemanager.cs (TypeManager.GetFullName): New public method.
4346         (TypeManager.MemberLookup): Added `int_num_type_arguments'
4347         argument; only return members with the correct number of type
4348         arguments.
4349         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
4350         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
4351         whether the number of type arguments matches.
4352
4353         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
4354         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
4355
4356         * expression.cs (MemberAccess): Added public `NumTypeArguments'
4357         field; it's set by the protected .ctor when we're actually a
4358         GenericMemberAccess.
4359         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
4360         arguments and pass it to MemberLookupFinal ().
4361
4362         * ecore.cs (Expression.MemberLookup): Added `int
4363         num_type_arguments' argument; only return members with the correct
4364         number of type arguments.
4365         (Expression.MemberLookupFailed): Check whether the MemberLookup
4366         failed because we did not have the correct number of type
4367         arguments; report CS0305 in this case.
4368
4369         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
4370         `e.ResolveAsTypeTerminal()' already did so.
4371
4372 2004-03-15  Martin Baulig  <martin@ximian.com>
4373
4374         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
4375         we're a ConstructedType; in this case, the caller must report an
4376         error (for instance CS0131).
4377
4378         * generic.cs (TypeArguments): Added Location argument to the .ctor.
4379         (TypeArguments.Resolve): Actually report errors here.
4380
4381 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4382
4383         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4384         `set_indexer_name' to the pending bits (one per type).
4385
4386         We fixed a bug today that was picking the wrong method to
4387         override, since for properties the existing InterfaceMethod code
4388         basically ignored the method name.  Now we make sure that the
4389         method name is one of the valid indexer names.
4390
4391 2004-03-15  Martin Baulig  <martin@ximian.com>
4392
4393         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
4394         for generic instances.
4395
4396 2004-03-13  Martin Baulig  <martin@ximian.com>
4397
4398         * class.cs (TypeContainer.DefineType): Call
4399         TypeManager.AddUserType() immediately after creating the
4400         TypeBuilder; pass all type parameters when creating the
4401         CurrentType.
4402
4403         * decl.cs (DeclSpace.FindNestedType): New public method.
4404         (DeclSpace.FindType): Added `int num_type_args' argument; only
4405         return types with the correct number of type parameters.
4406         (DeclSpace.CountTypeParams): New public property.
4407
4408         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
4409         the number of type parameters; defaults to zero.
4410
4411         * generic.cs (TypeArguments.Count): New public property.
4412         (ConstructedType.DoResolveAsTypeStep): First call
4413         ds.FindNestedType() to find out whether we're nested in the
4414         current generic type; in this case, we inherit all type parameters
4415         from the current class.
4416
4417         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
4418         num_type_args' argument.
4419         (RootContext.LookupType): Added overloaded version which takes the
4420         number of type arguments; only return types with the correct
4421         number of type arguments.
4422
4423         * typemanager.cs (TypeManager.CheckGeneric): New public function;
4424         checks whether `Type t' has `int num_type_args'.
4425
4426 2004-03-13  Martin Baulig  <martin@ximian.com>
4427
4428         * generic.cs (GenericMethod.DefineType): New method; calls
4429         DefineType() on all the type parameters.
4430
4431         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
4432         (MethodData.Define): If we're a generic method, call
4433         GenericMethod.DefineType() to define the type parameters.       
4434
4435 2004-03-10  Martin Baulig  <martin@ximian.com>
4436
4437         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
4438         instead of IsAssignableFrom.    
4439
4440 2004-03-10  Martin Baulig  <martin@ximian.com>
4441
4442         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
4443
4444         * support.cs (ParameterData.HasArrayParameter): New property.
4445         (ReflectionParameters.ctor): Take a MethodBase instead of a
4446         ParameterInfo[].  If we have any type parameters, get the generic
4447         method definition and ask it whether we have variable arguments.
4448
4449 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4450
4451         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4452         routines to check if a type is an enumerable/enumerator allow
4453         classes that implement the IEnumerable or IEnumerator interfaces.
4454
4455         * class.cs (Property, Operator): Implement IIteratorContainer, and
4456         implement SetYields.
4457
4458         (Property.Define): Do the block swapping for get_methods in the
4459         context of iterators.   We need to check if Properties also
4460         include indexers or not.
4461
4462         (Operator): Assign the Block before invoking the
4463         OperatorMethod.Define, so we can trigger the Iterator code
4464         replacement. 
4465
4466         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4467         Property and Operator classes are not created when we parse the
4468         declarator but until we have the block completed, so we use a
4469         singleton SimpleIteratorContainer.Simple to flag whether the
4470         SetYields has been invoked.
4471
4472         We propagate this setting then to the Property or the Operator to
4473         allow the `yield' to function.
4474
4475 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4476
4477         * codegen.cs: Implemented attribute support for modules.
4478         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4479         Assembly/Module functionality.
4480
4481         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4482         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4483         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4484
4485 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4486
4487         * interface.cs (FindMembers): The operation is performed on all base
4488         interfaces and not only on the first. It is required for future CLS Compliance patch.
4489
4490 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4491
4492         * statement.cs, codegen.cs:
4493         This patch deals with patterns such as:
4494
4495         public class List : IEnumerable {
4496
4497                 public MyEnumerator GetEnumerator () {
4498                         return new MyEnumerator(this);
4499                 }
4500
4501                 IEnumerator IEnumerable.GetEnumerator () {
4502                         ...
4503                 }
4504                 
4505                 public struct MyEnumerator : IEnumerator {
4506                         ...
4507                 }
4508         }
4509
4510         Before, there were a few things we did wrong:
4511         1) we would emit callvirt on a struct, which is illegal
4512         2) we emited ldarg when we needed to emit ldarga
4513         3) we would mistakenly call the interface methods on an enumerator
4514         type that derived from IEnumerator and was in another assembly. For example:
4515
4516         public class MyEnumerator : IEnumerator
4517
4518         Would have the interface methods called, even if there were public impls of the
4519         method. In a struct, this lead to invalid IL code.
4520
4521 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4522
4523         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4524           renamed to Emit.
4525
4526         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4527
4528 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4529
4530         * cs-parser.jay: Fix small regression: we were not testing V2
4531         compiler features correctly.
4532
4533         * interface.cs: If the emit context is null, then create one
4534
4535 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4536
4537         * decl.cs (GetSignatureForError): New virtual method to get full name
4538           for error messages.
4539
4540         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4541           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4542
4543         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4544           Duplicated members and code in these classes has been removed.
4545           Better encapsulation in these classes.
4546
4547 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4548
4549         * assign.cs (Assign.DoResolve): When dealing with compound
4550         assignments, there is a new rule in ECMA C# 2.4 (might have been
4551         there before, but it is documented here) that states that in:
4552
4553         a op= b;
4554
4555         If b is of type int, and the `op' is a shift-operator, then the
4556         above is evaluated as:
4557
4558         a = (int) a op b 
4559
4560         * expression.cs (Binary.ResolveOperator): Instead of testing for
4561         int/uint/long/ulong, try to implicitly convert to any of those
4562         types and use that in pointer arithmetic.
4563
4564         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4565         method to print information for from the type, not from the
4566         null-method we were given.
4567
4568 2004-02-01  Duncan Mak  <duncan@ximian.com>
4569
4570         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4571         parsing for cmd, fixes bug #53694.
4572
4573 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4574
4575         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4576         in the member name duplication tests. Property and operator name duplication
4577         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4578
4579 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4580
4581         * interface.cs (PopulateMethod): Fixed crash when interface method
4582         returns not existing type (error test cs0246-3.cs).
4583
4584 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4585
4586         * cs-parser.jay (interface_accessors): Re-write actions to also
4587         store attributes attached to get and set methods. Fix spelling
4588         while at it.
4589
4590         (inteface_property_declaration): Modify accordingly.
4591
4592         (InterfaceAccessorInfo): New helper class to store information to pass
4593         around between rules that use interface_accessors.
4594
4595         * interface.cs (Emit): Apply attributes on the get and set
4596         accessors of properties and indexers too.
4597
4598         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4599         right MethodBuilder when applying attributes to the get and set accessors.
4600
4601 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4602
4603         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4604
4605 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4606
4607         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4608
4609 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4610
4611         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4612         changes that treat `yield' specially when present before `break'
4613         or `return' tokens.
4614
4615         * cs-tokenizer.cs: yield is no longer a keyword.
4616
4617 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4618
4619         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4620         setting for default constructors.
4621         For default constructors are almost every time set wrong Modifier. The
4622         generated IL code has been alright. But inside mcs this values was
4623         wrong and this was reason why several of my CLS Compliance tests
4624         failed.
4625
4626 2004-02-27  Martin Baulig  <martin@ximian.com>
4627
4628         * generics.cs (ConstructedType.ResolveType): Make the nested type
4629         stuff actually work.
4630
4631 2004-02-25  Martin Baulig  <martin@ximian.com>
4632
4633         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
4634         property; returns the type parameters just from the current type,
4635         ie. with the ones from outer classes.
4636         (DeclSpace.LookupGeneric): First search in the current class, then
4637         in outer classes.
4638         (DeclSpace.initialize_type_params): When hiding a type parameter
4639         from an outer class, put it into the `type_param_list' anyways.
4640
4641         * expression.cs (MemberAccess.expr): Made this field protected.
4642
4643         * class.cs (TypeContainer.Define): The `CurrentType' just contains
4644         the type parameters from the current class.
4645
4646         * generic.cs (ConstructedType.ResolveType): Support nested generic
4647         types by taking the type parameters which we inherit from outer
4648         classes into account.
4649         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
4650         support for nested generic types.
4651
4652 2004-02-23  Martin Baulig  <martin@ximian.com>
4653
4654         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
4655         field and check whether we're nested inside a generic type.
4656         (DeclSpace.ResolveType): If we're resolving to a generic type
4657         definition, create a ConstructedType and return its resolved type.
4658         (DeclSpace.initialize_type_params): New private method;
4659         initializes the `type_param_list' field from the type parameters
4660         from this and all enclosing classes.
4661         (DeclSpace.TypeParameters): Call initialize_type_params() unless
4662         we're already initialized.
4663
4664 2004-02-23  Martin Baulig  <martin@ximian.com>
4665
4666         * class.cs (Method.Define): Create the generic method before
4667         calling DoDefine().
4668         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
4669         the TypeContainer one); we use this for generic methods.
4670
4671         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
4672         parent's TypeBuilder.
4673
4674 2004-02-18  Martin Baulig  <martin@ximian.com>
4675
4676         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
4677         to check for equality.
4678
4679 2004-02-05  Martin Baulig  <martin@ximian.com>
4680
4681         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
4682         `ec.TypeContainer.CurrentType', use it instead of
4683         `ec.ContainerType' to check whether we're in the type's ctor.
4684
4685 2004-01-29  Martin Baulig  <martin@ximian.com>
4686
4687         * expression.cs (Invocation.DoResolve): If we're a
4688         `ConstructedType', then we're actually a generic method, so
4689         rewrite the expr as a GenericMemberAccess.
4690
4691         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
4692         here; manually parse it into a string.
4693
4694 2004-01-28  Martin Baulig  <martin@ximian.com>
4695
4696         * typemanager.cs (TypeManager.IsEqual): New static method.
4697         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
4698         check for equality instead of using `=='.
4699
4700 2004-01-26  Martin Baulig  <martin@ximian.com>
4701
4702         * decl.cs (DeclSpace.CurrentType): New public field.
4703
4704         * expression.cs (This.ResolveBase): If we have an
4705         `ec.TypeContainer.CurrentType', use it instead of
4706         `ec.ContainerType'.
4707
4708         * class.cs (TypeContainer.DefineType): If we're a generic type,
4709         create the `CurrentType' (unresolved).
4710         (TypeContainer.GenericType): New private field.
4711         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
4712         it and store it in `GenericType' before creating the MemberCache.
4713         (TypeContainer.GetMembers): If we have a `GenericType', call
4714         TypeManager.FindMembers() on it.
4715
4716         * interface.cs (Interface.GenericType): New private field.
4717         (Interface.DefineType): If we're a generic type, create the
4718         `CurrentType' (unresolved).
4719         (Interface.DefineMembers): If we have a `CurrentType', resolve it
4720         and store it in `GenericType' before creating the MemberCache.
4721         (Interface.GetMembers): If we have a `GenericType', call
4722         TypeManager.FindMembers() on it.
4723
4724 2004-01-22  Martin Baulig  <martin@ximian.com>
4725
4726         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4727         not a QualifiedIdentifier.  This is what `type_name_expression'
4728         was previously doing.
4729         (type_name_expression): Removed; the code is now in
4730         `namespace_or_type_name'.
4731         (qualified_identifier): Removed, use `namespace_or_type_name'
4732         instead.
4733         (QualifiedIdentifier): Removed this class.      
4734
4735 2004-01-22  Martin Baulig  <martin@ximian.com>
4736
4737         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4738         not a string as alias name.
4739
4740 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4741
4742         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4743         #52730 bug, and instead compute correctly the need to use a
4744         temporary variable when requesting an address based on the
4745         static/instace modified of the field and the constructor.
4746  
4747 2004-01-21  Martin Baulig  <martin@ximian.com>
4748
4749         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4750         class and namespace before looking up aliases.  Fixes #52517.
4751
4752 2004-01-21  Martin Baulig  <martin@ximian.com>
4753
4754         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4755         assinged in a 'try'; fixes exception4.cs.
4756
4757 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4758         * class.cs : Implemented parameter-less constructor for TypeContainer
4759
4760         * decl.cs: Attributes are now stored here. New property OptAttributes
4761
4762         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4763
4764         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4765
4766 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4767
4768         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4769           (CSharpSignature): New method for indexer and property signature.
4770
4771 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4772
4773         * pending.cs (IsVirtualFilter): Faster implementation.
4774
4775 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4776
4777         * typemanager.cs: Avoid inclusion of same assembly more than once.
4778
4779 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4780
4781         * cs-parser.jay: Fixed problem where the last assembly attribute
4782           has been applied also to following declaration (class, struct, etc.)
4783           
4784 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4785
4786         * class.cs: Added error CS0538, CS0539 reporting.
4787         Fixed crash on Microsoft runtime when field type is void.
4788
4789         * cs-parser.jay: Added error CS0537 reporting.
4790
4791         * pending.cs: Added error CS0535 reporting.
4792         Improved error report for errors CS0536, CS0534.
4793
4794 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4795
4796         Merge a few bits from the Anonymous Method MCS tree.
4797
4798         * statement.cs (ToplevelBlock): New class for toplevel methods,
4799         will hold anonymous methods, lifted variables.
4800
4801         * cs-parser.jay: Create toplevel blocks for delegates and for
4802         regular blocks of code. 
4803
4804 2004-01-20  Martin Baulig  <martin@ximian.com>
4805
4806         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4807         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4808         and `NeedExplicitReturn'; added `IsLastStatement'.
4809         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4810         have a `ReturnLabel' or we're not unreachable.
4811
4812         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4813         child's reachability; don't just override ours with it.  Fixes
4814         #58058 (lluis's example).
4815         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4816         InFinally(), InLoop(), InSwitch() and
4817         BreakCrossesTryCatchBoundary() methods.
4818
4819         * statement.cs (Return): Do all error checking in Resolve().
4820         Unless we are the last statement in a top-level block, always
4821         create a return label and jump to it.
4822         (Break, Continue): Do all error checking in Resolve(); also make
4823         sure we aren't leaving a `finally'.
4824         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4825         statement in a top-level block.
4826         (Block.Flags): Added `IsDestructor'.
4827         (Block.IsDestructor): New public property.
4828
4829 2004-01-20  Martin Baulig  <martin@ximian.com>
4830
4831         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4832
4833 2004-01-20  Martin Baulig  <martin@ximian.com>
4834
4835         * statement.cs (Statement.ResolveUnreachable): New public method.
4836         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4837         (Block.Resolve): Resolve unreachable statements.
4838
4839 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4840
4841         * expression.cs: We need to fix the case where we do
4842         not have a temp variable here.
4843
4844         * assign.cs: Only expression compound assignments need
4845         temporary variables.
4846
4847 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4848
4849         * flowanalysis.cs: Reduce memory allocation in a few ways:
4850           - A block with no variables should not allocate a bit
4851             vector for itself.
4852           - A method with no out parameters does not need any tracking
4853             for assignment of the parameters, so we need not allocate
4854             any data for it.
4855           - The arrays:
4856                 public readonly Type[] VariableTypes;
4857                 public readonly string[] VariableNames;
4858             Are redundant. The data is already stored in the variable
4859             map, so we need not allocate another array for it.
4860           - We need to add alot of checks for if (params | locals) == null
4861             due to the first two changes.
4862
4863 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4864
4865         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4866         implement IMemoryLocation, we store a copy on a local variable and
4867         take the address of it.  Patch from Benjamin Jemlich
4868
4869         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4870         to use a special "type_name_expression" rule which reduces the
4871         number of "QualifiedIdentifier" classes created, and instead
4872         directly creates MemberAccess expressions.
4873
4874 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4875
4876         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4877         that fixes #52853.  Null literal assignment to ValueType
4878
4879         * class.cs (MethodData.Emit): Instead of checking the name of the
4880         method to determine if its a destructor, create a new derived
4881         class from Method called Destructor, and test for that.  
4882
4883         * cs-parser.jay: Create a Destructor object instead of a Method.  
4884
4885         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4886
4887         Fixes: 52933
4888
4889 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4890
4891         * expression.cs (Binary.ResolveOperator): Perform an implicit
4892         conversion from MethodGroups to their delegate types on the
4893         Addition operation.
4894
4895         * delegate.cs: Introduce a new class DelegateCreation that is the
4896         base class for `NewDelegate' and `ImplicitDelegateCreation',
4897         factor some code in here.
4898
4899         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4900         conversion from MethodGroups to compatible delegate types. 
4901
4902         * ecore.cs (Expression.Resolve): Do not flag error 654
4903         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4904         we allow conversions from MethodGroups to delegate types now.
4905
4906         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4907         assignments in v2 either.
4908
4909 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4910
4911         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4912         static read-only fields in ctors.
4913
4914         Applied patch from Benjamin Jemlich 
4915
4916         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4917
4918 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4919
4920         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4921         here to return true, as they can be used like this:
4922
4923                 (XXX) int.MEMBER ()
4924
4925         Fixed 49836 and all the other dups
4926
4927 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4928
4929         * driver.cs: Implement /win32res and /win32icon.
4930
4931 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4932
4933         * cs-parser.jay: Add a rule to improve error handling for the
4934         common mistake of placing modifiers after the type.
4935
4936 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4937
4938         * cs-parser.jay (interface_event_declaration): Catch
4939         initialization of events on interfaces, and report cs0068
4940
4941         * cs-parser.jay (interface_event_declaration): Catch
4942         initialization of events. 
4943
4944         * ecore.cs: Better report missing constructors.
4945
4946         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4947         the error reporting done in the wrong place.  Fix.
4948
4949         * expression.cs (Binary.ResolveOperator): Catch the 
4950         operator + (E x, E y) error earlier, and later allow for implicit
4951         conversions in operator +/- (E e, U x) from U to the underlying
4952         type of E.
4953
4954         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4955         52596, if the container class is abstract, the default constructor
4956         is protected otherwise its public (before, we were always public).
4957
4958         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4959         fixed statement.
4960
4961         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4962         Jemlich that fixes bug #52597, MCS was generating invalid code for
4963         idisposable structs.   Thanks to Ben for following up with this
4964         bug as well.
4965
4966 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4967
4968         * driver.cs: Allow assemblies without code to be generated, fixes
4969         52230.
4970
4971 2004-01-07  Nick Drochak <ndrochak@gol.com>
4972
4973         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4974
4975 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4976
4977         * cs-parser.jay: Add rules to improve error reporting if fields or
4978         methods are declared at the namespace level (error 116)
4979
4980         * Add rules to catch event add/remove
4981
4982 2004-01-04  David Sheldon <dave-mono@earth.li>
4983
4984   * expression.cs: Added matching ")" to error message for 
4985   CS0077
4986
4987 2004-01-03 Todd Berman <tberman@gentoo.org>
4988
4989         * ecore.cs, attribute.cs:
4990         Applying fix from #52429.
4991
4992 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4993
4994         * ecore.cs, expression.cs, statement.cs:
4995         Total rewrite of how we handle branching. We
4996         now handle complex boolean expressions with fewer
4997         jumps. As well if (x == 0) no longer emits a ceq.
4998
4999         if (x is Foo) is much faster now, because we generate
5000         better code.
5001
5002         Overall, we get a pretty big improvement on our benchmark
5003         tests. The code we generate is smaller and more readable.
5004
5005         I did a full two-stage bootstrap. The patch was reviewed
5006         by Martin and Miguel.
5007
5008 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5009
5010         * cs-parser.jay: Make primary_expression not take a QI.
5011         we dont need this because the member_access rule covers
5012         us here. So we replace the rule with just IDENTIFIER.
5013
5014         This has two good effects. First, we remove a s/r conflict.
5015         Second, we allocate many fewer QualifiedIdentifier objects.
5016
5017 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5018
5019         * attribute.cs: Handle MarshalAs attributes as pseudo, and
5020         set the correct information via SRE. This prevents
5021         hanging on the MS runtime. Fixes #29374.
5022
5023 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5024
5025         * convert.cs: correctly handle conversions to value types
5026         from Enum and ValueType as unboxing conversions.
5027
5028         Fixes bug #52569. Patch by Benjamin Jemlich.
5029
5030 2004-01-02  Ravi Pratap  <ravi@ximian.com>
5031
5032         * expression.cs (BetterConversion): Prefer int -> uint
5033         over int -> ulong (csc's behaviour). This fixed bug #52046.
5034
5035 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5036
5037         * decl.cs (MemberCache.FindMembers): now returns a
5038         MemberInfo [].
5039
5040         * typemanager.cs: In general, go with with ^^.
5041         (CopyNewMethods): take an IList.
5042         (RealMemberLookup): Only allocate an arraylist
5043         if we copy from two sets of methods.
5044
5045         This change basically does two things:
5046         1) Fewer array lists allocated due to CopyNewMethods.
5047         2) the explicit cast in MemberList costed ALOT.
5048
5049 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
5050
5051         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
5052         a hashtable to avoid needless string allocations when an identifier is
5053         used more than once (the common case).
5054
5055 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5056
5057         * pending.cs: MS's TypeBuilder.GetInterfaces ()
5058         is broken, it will not return anything. So, we
5059         have to use the information we have in mcs to
5060         do the task.
5061
5062         * typemanager.cs: Add a cache for GetInterfaces,
5063         since this will now be used more often (due to ^^)
5064
5065         (GetExplicitInterfaces) New method that gets the
5066         declared, not effective, interfaces on a type
5067         builder (eg, if you have interface IFoo, interface
5068         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
5069         { IBar }.
5070
5071         This patch makes MCS able to bootstrap itself on
5072         Windows again.
5073
5074 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5075
5076         * expression.cs: Remove the Nop's that Miguel put
5077         in by mistake.
5078
5079 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5080
5081         * report.cs, codegen.cs: Give the real stack trace to
5082         the error when an exception is thrown.
5083
5084 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5085
5086         * decl.cs: only allocate hashtables for ifaces if 
5087         it is an iface!
5088
5089 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5090
5091         * expression.cs: fix the error from cs0121-2.cs
5092         (a parent interface has two child interfaces that
5093         have a function with the same name and 0 params
5094         and the function is called through the parent).
5095
5096 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
5097
5098         * class.cs, rootcontext.cs, typmanager.cs: do not
5099         leak pointers.
5100
5101 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5102
5103         * codegen.cs: remove stack for the ec flow branching.
5104         It is already a linked list, so no need.
5105
5106 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5107
5108         * Makefile: Allow custom profiler here.
5109
5110 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5111
5112         * typemanager.cs (LookupType):
5113           - Use a static char [], because split takes
5114             a param array for args, so it was allocating
5115             every time.
5116           - Do not store true in a hashtable, it boxes.
5117
5118 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5119
5120         * flowanalysis.cs: bytify common enums.
5121
5122 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5123
5124         * modifiers.cs: Add a new set of flags for the
5125         flags allowed on explicit interface impls.
5126         * cs-parser.jay: catch the use of modifiers in
5127         interfaces correctly.
5128         * class.cs: catch private void IFoo.Blah ().
5129
5130         All related to bug #50572.
5131
5132 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5133
5134         * decl.cs: Rewrite the consistant accessability checking.
5135         Accessability is not linear, it must be implemented in
5136         a tableish way. Fixes #49704.
5137
5138 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5139
5140         * expression.cs: Handle negation in a checked context.
5141         We must use subtraction from zero. Fixes #38674.
5142
5143 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5144
5145         * class.cs: Ignore static void main in DLLs.
5146         * rootcontext.cs: Handle the target type here,
5147         since we are have to access it from class.cs
5148         * driver.cs: account for the above.
5149
5150 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5151
5152         * report.cs: Give line numbers and files if available.
5153
5154 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
5155
5156         * driver.cs: Implement /addmodule.
5157
5158         * typemanager.cs:  Change 'modules' field so it now contains Modules not
5159         ModuleBuilders.
5160
5161 2003-12-20  Martin Baulig  <martin@ximian.com>
5162
5163         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
5164         (FieldBase.IsAssigned): Removed this field.
5165         (FieldBase.SetAssigned): New public method.
5166         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
5167
5168 2003-12-20  Martin Baulig  <martin@ximian.com>
5169
5170         * expression.cs (LocalVariableReference.DoResolve): Don't set
5171         `vi.Used' if we're called from DoResolveLValue().
5172
5173         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
5174         returns the usage vector it just merged into the current one -
5175         pass this one to UsageWarning().
5176         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
5177         of the `EmitContext', don't call this recursively on our children.
5178
5179 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
5180
5181         * driver.cs: Implement /target:module.
5182
5183 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
5184
5185         * support.cs (CharArrayHashtable): New helper class.
5186
5187         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
5188         char arrays, not strings, so we can avoid creating a string in
5189         consume_identifier if the identifier is a keyword.
5190
5191 2003-12-16  Martin Baulig  <martin@ximian.com>
5192
5193         * statement.cs (LocalInfo.Assigned): Removed this property.
5194         (LocalInfo.Flags): Removed `Assigned'.
5195         (LocalInfo.IsAssigned): New public method; takes the EmitContext
5196         and uses flow analysis.
5197         (Block.UsageWarning): Made this method private.
5198         (Block.Resolve): Call UsageWarning() if appropriate.
5199
5200         * expression.cs (LocalVariableReference.DoResolve): Always set
5201         LocalInfo.Used here.
5202
5203 2003-12-13  Martin Baulig  <martin@ximian.com>
5204
5205         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
5206         any value here; we're now using flow analysis to figure out
5207         whether a statement/block returns a value.
5208
5209 2003-12-13  Martin Baulig  <martin@ximian.com>
5210
5211         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
5212         working again.
5213         (FlowBranching.MergeFinally): Don't call
5214         `branching.CheckOutParameters()' here, this is called in
5215         MergeTopBlock().
5216         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5217         when adding the `finally' vector.       
5218
5219 2003-12-13  Martin Baulig  <martin@ximian.com>
5220
5221         * flowanalysis.cs
5222         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5223         actually work and also fix #48962.
5224
5225 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5226
5227         * decl.cs: Do not check System.Object for nested types,
5228         since we know it does not have any. Big bang for buck:
5229
5230         BEFORE:
5231            Run 1:   8.35 seconds
5232            Run 2:   8.32 seconds
5233            corlib:  17.99 seconds
5234         AFTER:
5235            Run 1:   8.17 seconds
5236            Run 2:   8.17 seconds
5237            corlib:  17.39 seconds
5238
5239 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5240
5241         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5242         time we are returning 0 members, so we save alot here.
5243
5244 2003-12-11  Martin Baulig  <martin@ximian.com>
5245
5246         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5247         `MergeChild()', also just take the `FlowBranching' as argument;
5248         call Merge() on it and return the result.
5249         (FlowBranching.Merge): We don't need to do anything if we just
5250         have one sibling.
5251
5252 2003-12-11  Martin Baulig  <martin@ximian.com>
5253
5254         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5255         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5256         Maurer for this idea.
5257
5258 2003-12-11  Martin Baulig  <martin@ximian.com>
5259
5260         * flowanalysis.cs (MergeResult): This class is now gone; we now
5261         use the `UsageVector' for this.  The reason for this is that if a
5262         branching just has one sibling, we don't need to "merge" them at
5263         all - that's the next step to do.
5264         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5265         `MergeResult'.
5266
5267 2003-12-11  Martin Baulig  <martin@ximian.com>
5268
5269         Reworked flow analyis and made it more precise and bug-free.  The
5270         most important change is that we're now using a special `Reachability'
5271         class instead of having "magic" meanings of `FlowReturns'.  I'll
5272         do some more cleanups and optimizations and also add some more
5273         documentation this week.
5274
5275         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5276         largely reworked this class.
5277         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5278         the new `Reachability' class instead of having "magic" values here.
5279         (FlowBranching): We're now using an instance of `Reachability'
5280         instead of having separate `Returns', `Breaks' etc. fields.
5281
5282         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5283         based on flow analysis; ignore the return value of block.Emit ().
5284
5285 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5286
5287         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5288         if they are private.
5289
5290 2003-12-09  Martin Baulig  <martin@ximian.com>
5291
5292         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5293         call them directly on the UsageVector.
5294
5295 2003-12-09  Martin Baulig  <martin@ximian.com>
5296
5297         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5298         Changed return type from `FlowReturns' to `Reachability'.
5299
5300 2003-12-09  Martin Baulig  <martin@ximian.com>
5301
5302         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5303         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5304         `Reachable' fields with a single `Reachability' one.
5305
5306 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5307
5308         * class.cs (FindMembers): Remove foreach's.
5309
5310         Bootstrap times:
5311
5312         BEFORE
5313                 Run 1:   8.74 seconds
5314                 Run 2:   8.71 seconds
5315
5316         AFTER
5317                 Run 1:   8.64 seconds
5318                 Run 2:   8.58 seconds
5319
5320
5321 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5322
5323         * cs-parser.jay:
5324         * gen-treedump.cs:
5325         * statement.cs:
5326         This patch does a few things:
5327                 1. EmptyStatement is now a singleton, so it is never reallocated.
5328                 2. All blah is EmptyStatement constructs have been changed to
5329                    blah == EmptyStatement.Value, which is much faster and valid
5330                    now that EmptyStatement is a singleton.
5331                 3. When resolving a block, rather than allocating a new array for
5332                    the non-empty statements, empty statements are replaced with
5333                    EmptyStatement.Value
5334                 4. Some recursive functions have been made non-recursive.
5335         Mainly the performance impact is from (3), however (1) and (2) are needed for
5336         this to work. (4) does not make a big difference in normal situations, however
5337         it makes the profile look saner.
5338
5339         Bootstrap times:
5340
5341         BEFORE
5342         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5343         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5344         Total memory allocated: 56397 KB
5345
5346         AFTER
5347         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5348         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5349         Total memory allocated: 55666 KB
5350
5351 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5352
5353         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5354         than the hashtable in a hashtable version
5355
5356         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5357         we always end up concating a string. This results in a huge perf
5358         loss, because many strings have to be tracked by the GC. In this
5359         patch, we first use a hashtable that works with two keys, so that
5360         the strings do not need to be concat'ed.
5361
5362         Bootstrap times:
5363         BEFORE
5364                 Run 1:   8.74 seconds
5365                 Run 2:   8.71 seconds
5366
5367         AFTER
5368                 Run 1:   8.65 seconds
5369                 Run 2:   8.56 seconds
5370
5371 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5372
5373         * Makefile: Add a new target `do-time' that does a quick and simple
5374         profile, leaving easy to parse output.
5375
5376 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5377
5378         * codegen.cs (Init): Create the dynamic assembly with 
5379         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5380
5381 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5382
5383         * support.cs: Make the PtrHashtable use only one
5384         instance of its comparer.
5385
5386 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5387
5388         * typemanager.cs: Fix lookup of GetNamespaces.
5389
5390 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5391
5392         * expression.cs: Removed redundant line.
5393
5394         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5395         ArrayLists, use for loops with bounds.  
5396
5397         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5398         arraylist.
5399
5400         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5401         arraylists, use for loop with bounds.
5402
5403         The above three changes give us a 0.071 second performance
5404         improvement out of 3.294 seconds down to 3.223.  On my machine
5405         the above changes reduced the memory usage by 1,387 KB during
5406         compiler bootstrap.
5407
5408         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5409         QualifiedIdentifiers.  Before we created a new string through
5410         concatenation, and mostly later on, the result would be
5411         manipulated by DecomposeQI through string manipulation.
5412
5413         This reduced the compiler memory usage for bootstrapping from
5414         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5415         compile times in 0.05 seconds.
5416
5417 2003-11-28  Dick Porter  <dick@ximian.com>
5418
5419         * support.cs: Do string compares with the Invariant culture.
5420
5421         * rootcontext.cs: 
5422         * gen-treedump.cs: 
5423         * expression.cs: 
5424         * driver.cs: 
5425         * decl.cs: 
5426         * codegen.cs: 
5427         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5428         the comparison is done with the Invariant culture.
5429
5430 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5431
5432         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5433         GetEnumerator method.
5434
5435         (ProbeCollectionType): Iterate starting at the most specific type
5436         upwards looking for a GetEnumerator
5437
5438         * expression.cs: Shift count can be up to 31 for int/uint and 63
5439         for long/ulong.
5440
5441 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5442
5443         * statement.cs (Block.LookupLabel): Also look for the label on the
5444         children blocks.  Use a hash table to keep track of visited
5445         nodes. 
5446
5447         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5448         we actually did transform the other operand, otherwise fall back
5449         to the common codepath that casts to long.
5450
5451         * cs-tokenizer.cs: Use the same code pattern as the int case.
5452         Maybe I should do the parsing myself, and avoid depending on the
5453         Parse routines to get this done.
5454
5455 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5456
5457         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5458         which fixes bug 51347.  This time test it.
5459
5460         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5461         attributes for example can not tell the difference between these.
5462         The difference was only a syntax feature of the language. 
5463
5464         * attribute.cs: Apply attributes to delegates.
5465
5466         * delegate.cs: Call the apply attributes method.
5467
5468 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5469
5470         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5471         comparing 0 vs Byte.MinValue, not the value
5472
5473         (ImplicitConversionRequired): When reporting a conversion error,
5474         use error 31 to print out the constant error instead of the
5475         simpler 29.
5476
5477         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5478         which fixes bug 51347.
5479
5480 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5481
5482         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5483         which fixes the -warnaserror command line option.
5484
5485 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5486
5487         * cfold.cs (DoNumericPromotions): During constant folding of
5488         additions on UIntConstant, special case intconstants with
5489         IntConstants like we do on the expression binary operator. 
5490
5491 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5492
5493         * convert.cs (ImplicitReferenceConversion): We were missing a case
5494         (System.Enum are not value types or class types, so we need to
5495         classify them separatedly).
5496
5497         * driver.cs: We do not support error 2007.
5498
5499 2003-11-12 Jackson Harper <jackson@ximian.com>
5500
5501         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5502         system directory. Also use the full file name so users can
5503         libraries names mscorlib-o-tron.dll in a non system dir.
5504         
5505 2004-01-04  David Sheldon <dave-mono@earth.li>
5506
5507         * expression.cs: Added matching ")" to error message for CS0077.
5508
5509 2003-12-19  Martin Baulig  <martin@ximian.com>
5510
5511         * typemanager.cs (TypeManager.IsEqualGenericType): New public
5512         static method; see documentation in the method.
5513         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
5514
5515         * convert.cs (Convert.ImplicitReferenceConversion,
5516         Convert.ImplicitReferenceConversionExists): Add support for
5517         generic type declarations; see gen-36.cs.
5518
5519 2003-12-19  Martin Baulig  <martin@ximian.com>
5520
5521         * pending.cs (Pending.InterfaceMethod): Use
5522         `Type.IsAssignableFrom()' instead of `=='.
5523
5524 2003-12-18  Martin Baulig  <martin@ximian.com>
5525
5526         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
5527         byref types first.
5528
5529         * convert.cs (Convert.ImplicitStandardConversionExists): Use
5530         `expr_type.Equals (target_type)' instead of `=='.
5531
5532 2003-12-08  Martin Baulig  <martin@ximian.com>
5533
5534         * generics.cs (Constraints.Types): Removed.
5535         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
5536         to Type's.
5537         (Constraints.ResolveTypes): New public method; resolves the
5538         TypeExpr's to Type's.
5539         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
5540         longer takes the constraints.
5541         (TypeParameter.DefineMethod): Likewise.
5542         (TypeParameter.DefineType): New public method.  Calls
5543         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
5544         the constraints.
5545
5546 2003-12-08  Martin Baulig  <martin@ximian.com>
5547
5548         * convert.cs (Convert.ImplicitConversionStandard): Use
5549         `expr_type.Equals (target_type)' instead of `=='.
5550
5551 2003-12-08  Martin Baulig  <martin@ximian.com>
5552
5553         * typemanager.cs (TypeManager.GetReferenceType): Call
5554         `Type.MakeByRefType ()'.
5555
5556 2003-12-08  Martin Baulig  <martin@ximian.com>
5557
5558         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
5559         just has some special meaning in some situations.  For instance,
5560         it is allowed to use `where' as the name of a variable etc.
5561
5562 2003-12-04  Martin Baulig  <martin@ximian.com>
5563
5564         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
5565         `Type.MakeArrayType()' for array types.
5566
5567 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
5568
5569         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
5570         debugging message.
5571
5572         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
5573         corlib to compile.
5574
5575 2003-11-16  Martin Baulig  <martin@ximian.com>
5576
5577         * codegen.cs (EmitContext.IsGeneric): Removed.
5578
5579         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
5580         ResolveGeneric() on the DeclSpace.
5581
5582 2003-11-16  Martin Baulig  <martin@ximian.com>
5583
5584         * generic.cs (TypeArguments.Resolve):
5585         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
5586         `ResolveType()' on it to get the Type.
5587
5588 2003-11-15  Martin Baulig  <martin@ximian.com>
5589
5590         * generic.cs (ConstructedType.GetInterfaces): Override this.
5591
5592 2003-11-14  Martin Baulig  <martin@ximian.com>
5593
5594         * interface.cs (Interface.DefineType): Define all type parameters
5595         before adding the interfaces we inherit.
5596
5597 2003-11-11  Martin Baulig  <martin@ximian.com>
5598
5599         * generic.cs (ConstructedType.ResolveType): Always call
5600         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
5601
5602 2003-11-10  Martin Baulig  <martin@ximian.com>
5603
5604         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5605         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5606         calling `ResolveType()' on them, directly assign their `Type'.
5607
5608 2003-11-08  Martin Baulig  <martin@ximian.com>
5609
5610         * generic.cs (ConstructedType): Override `IsClass' etc.
5611
5612 2003-11-08  Martin Baulig  <martin@ximian.com>
5613
5614         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5615         return value and the `out parent' parameter.
5616         (TypeContainer.DefineType): Moved the CS0644 check into
5617         GetClassBases().  Don't pass the interface types to the
5618         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5619         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5620
5621         * ecore.cs (TypeExpr.IsAttribute): New property.
5622         (TypeExpr.GetInterfaces): New method.
5623
5624         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5625         TypeExpr instead of a Type.
5626         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5627         (Interface.DefineType): Don't pass the interface types to the
5628         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5629         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5630
5631         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5632         instead of a `Type[]'.
5633         (TypeManager.RegisterBuilder): Likewise.
5634         (TypeManager.AddUserInterface): Likewise.
5635         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5636         `Type[]' and also return a `TypeExpr[]'.
5637         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5638
5639 2003-11-08  Martin Baulig  <martin@ximian.com>
5640
5641         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5642         Expression.     
5643
5644 2003-11-08  Martin Baulig  <martin@ximian.com>
5645
5646         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5647         TypeManager.ResolveExpressionTypes().
5648
5649         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5650         instead of an Expression.
5651         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5652         (TypeExpression): New public class; formerly known as `TypeExpr'.
5653
5654         * expression.cs (ComposedCast): Derive from TypeExpr.
5655
5656         * typemanager.cs (TypeManager.system_*_expr): These are now
5657         TypExpr's instead of Expression's.
5658         (TypeManager.ResolveExpressionTypes): New public static function;
5659         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5660         of them.        
5661
5662 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5663
5664         * expression.cs (New.DoResolve): Do not dereference value that
5665         might be a null return.
5666
5667         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5668         sure that the constant value has the right type.  Fixes an
5669         unreported bug, similar to 50425.
5670
5671         * const.cs (Const.LookupConstantValue): Call
5672         ImplicitStandardConversionExists before doing a conversion to
5673         avoid havng the TypeManager.ChangeType do conversions.
5674
5675         Reduced the number of casts used
5676
5677         (Const.ChangeType): New routine to enable reuse of the constant
5678         type changing code from statement.
5679
5680         * typemanager.cs (ChangeType): Move common initialization to
5681         static global variables.
5682
5683         Fixes #50425.
5684
5685         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5686         every value type to go through, even if it was void.  Fix that. 
5687
5688         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5689         character of the define, and the is_identifier_part_character for
5690         the rest of the string.
5691
5692 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5693
5694         * expression.cs (UnaryMutator.EmitCode): When I updated
5695         LocalVariableReference.DoResolve, I overdid it, and dropped an
5696         optimization done on local variable references.
5697
5698 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5699
5700         * ecore.cs: Convert the return from Ldlen into an int.
5701
5702 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5703
5704         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5705         the accessibility, this is a special case for toplevel non-public
5706         classes (internal for instance).
5707
5708 2003-10-20  Nick Drochak <ndrochak@gol.com>
5709
5710         * ecore.cs: Fix typo and build.  Needed another right paren.
5711
5712 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5713
5714         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5715         `internal' case regular and protected, but not allowing protected
5716         to be evaluated later.  Bug 49840
5717
5718 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5719
5720         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5721         to kb.Nlast, and not the kb.nFirst to isolate the switch
5722         statement.
5723
5724         Extract the underlying type, so enumerations of long/ulong are
5725         treated like long/ulong.
5726
5727 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5728
5729         * expression.cs (New): Overload the meaning of RequestedType to
5730         track the possible creation of the NewDelegate type, since
5731         DoResolve is invoked more than once for new constructors on field
5732         initialization.
5733
5734         See bugs: #48800 and #37014
5735
5736         * cs-parser.jay (declare_local_constants): Take an arraylist
5737         instead of a single constant.
5738
5739         (local_constant_declaration): It should take a
5740         constant_declarators, not a constant_declarator.  Fixes 49487
5741
5742         * convert.cs: Fix error report.
5743
5744 2003-10-13 Jackson Harper <jackson@ximian.com>
5745
5746         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5747         bug #49611
5748         
5749 2003-11-03  Martin Baulig  <martin@ximian.com>
5750
5751         * expression.cs (ArrayAccess.GetStoreOpcode): Added
5752         `out bool has_type_arg'; if set, we need to pass the type to
5753         ig.Emit().
5754         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
5755         Stelem_Any/Ldelem_Any for generic parameters.   
5756
5757 2003-11-02  Martin Baulig  <martin@ximian.com>
5758
5759         * expression.cs (Invocation.EmitCall): Use
5760         `TypeManager.IsValueType()' to check whether it's a value type.
5761         Don't set `struct_call' when calling a method on a type parameter.
5762
5763 2003-11-02  Martin Baulig  <martin@ximian.com>
5764
5765         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
5766         and removed the TypeBuilder argument.
5767
5768         * typemanager.cs (TypeManager.IsValueType): Return
5769         `t.IsGenericParameter || t.IsValueType'.
5770
5771 2003-10-25  Martin Baulig  <martin@ximian.com>
5772
5773         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
5774         call ConstructedType.Resolve() on it.
5775
5776         * generic.cs (ConstructedType.Resolve): Set `type' on success.
5777
5778 2003-10-25  Martin Baulig  <martin@ximian.com>
5779
5780         * class.cs (TypeContainer.GetClassBases): Changed
5781         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
5782         CS8214 reporting here.
5783         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
5784         instead of a `Type' for our parent.  In case of a recursive
5785         declaration (see tests/gen-23.cs for an example), our parent is a
5786         ConstructedType and it doesn't have its type set.  So, first
5787         create our own TypeBuilder, then call constructed.Resolve() to get
5788         the parent's type and finally TypeBuilder.SetParent() it.
5789
5790         * ecore.cs (TypeExpr.Name): New public virtual property.
5791
5792         * generic.cs
5793         (ConstructedType): We're now a TypeExpr and not just an Expression.
5794         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
5795         arguments here; this is done later.
5796         (ConstructedType.Resolve): New public method to resolve the type
5797         arguments and bind them.
5798
5799 2003-10-21  Martin Baulig  <martin@ximian.com>
5800
5801         * convert.cs: Use `TypeManager.IsValueType' instead of
5802         'type.IsValueType' everywhere.
5803
5804         * typemanager.cs (TypeManager.IsValueType): Return true for type
5805         parameters.  The reason for this is that we need to box a type
5806         parameter when converting it to a reference type.
5807
5808         * cs-parser.jay: Added support for default value expressions.
5809
5810         * generics.cs (DefaultValueExpression): New public class.       
5811
5812 2003-10-17  Martin Baulig  <martin@ximian.com>
5813
5814         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
5815         TypeContainer so we can also use this for Interfaces.
5816         (TypeParameter.Resolve): Likewise.
5817
5818         * interface.cs (Interface.DefineType): Added support for generic
5819         interfaces.
5820
5821         * cs-parser.jay: Added support for generic structs and interfaces.
5822
5823 2003-10-17  Martin Baulig  <martin@ximian.com>
5824
5825         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
5826         call generic methods :-)
5827
5828 2003-10-16  Martin Baulig  <martin@ximian.com>
5829
5830         * cs-parser.jay (namespace_or_type_name): Only create a
5831         GenericMemberAccess if we actually have type arguments.
5832
5833 2003-10-13  Martin Baulig  <martin@ximian.com>
5834
5835         * class.cs (Method.Define): If we're a generic method, call
5836         TypeBuilder.DefineGenericMethod () before resolving
5837         the parameters.
5838         (MethodData): Added .ctor which takes an additional MethodBuilder
5839         argument; this is used for generic methods.
5840         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
5841         we already have a MethodBuilder.
5842
5843 2003-10-10  Martin Baulig  <martin@ximian.com>
5844
5845         * class.cs (Method): Added .ctor which takes a `GenericMethod'
5846         instead of a `DeclSpace'.  This is used for generic methods.
5847
5848         * cs-parser.jay (method_header): Added support for generic
5849         methods; create a `GenericMethod' instance and pass it to the
5850         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
5851         parameters and locals.
5852
5853         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
5854         since we already have the location.  Check whether we're a generic
5855         type declaration or a generic method and create the correct type
5856         parameter.
5857
5858         * generic.cs (TypeParameter.DefineMethod): New public method.
5859         (GenericMethod): New public class; derives from DeclSpace and is
5860         used for generic methods.       
5861
5862 2003-10-09  Martin Baulig  <martin@ximian.com>
5863
5864         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5865         to the .ctor.
5866         (MethodCore.DoDefineParameters): Removed the TypeContainer
5867         argument; use the DeclSpace which was passed to the .ctor instead.
5868         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5869         TypeContainer; we only need a DeclSpace here.
5870
5871 2003-10-09  Martin Baulig  <martin@ximian.com>
5872
5873         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5874         to the .ctor.
5875         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5876         EmitContext's .ctor.    
5877
5878 2003-10-09  Martin Baulig  <martin@ximian.com>
5879
5880         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5881         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5882         AsAccessible(), moved them as well.
5883
5884         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5885
5886 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5887
5888         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5889         generation for >=, as spotted by Paolo, bug 48679.  
5890         Patch from David Waite.
5891
5892         * cs-tokenizer.cs: Add handling for #pragma.
5893
5894         * cs-parser.jay: Allow for both yield and yield return in the
5895         syntax.  The anti-cobolization of C# fight will go on!
5896
5897         * class.cs (TypeBuilder.DefineType): Catch error condition here
5898         (Parent.DefineType erroring out and returning null).
5899
5900         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5901         coping with enumerations variables, we were mistakenly processing
5902         them as a regular value type instead of built-in types.  Fixes the
5903         bug #48063
5904
5905         * typemanager.cs (IsBuiltinOrEnum): New method.
5906
5907 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5908
5909         * cs-parser.jay: Upgrade: yield now needs the return clause.
5910
5911 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5912
5913         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5914
5915 2003-09-29  Martin Baulig  <martin@ximian.com>
5916
5917         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
5918         inflated generic methods.
5919
5920         * generics.cs (ConstructedType): Distinguish between open and
5921         closed constructed types; correctly resolve the arguments.
5922
5923 2003-09-22  Martin Baulig  <martin@ximian.com>
5924
5925         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
5926         all type arguments meet their constraints.
5927
5928 2003-09-19  Martin Baulig  <martin@ximian.com>
5929
5930         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5931         `MemberCache parent' argument.  Normally, an interface doesn't
5932         have a parent type except System.Object, but we use this in gmcs
5933         for generic type parameters.
5934
5935 2003-09-18  Martin Baulig  <martin@ximian.com>
5936
5937         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5938         on `type.IsInterface'; don't check whether the type has a parent
5939         to determine whether it's an interface.
5940
5941 2003-09-17  Martin Baulig  <martin@ximian.com>
5942
5943         * generic.cs (ConstructedType.ToString): Always use `name' as the
5944         type name.
5945
5946 2003-09-15  Martin Baulig  <martin@ximian.com>
5947
5948         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
5949
5950         * generic.cs (Constraints.Resolve): New public method; this is
5951         called to resolve the constraint types and to check whether all
5952         the constraints are correct.
5953         (Constraints.Types): New public property.
5954         (TypeParameter.Resolve): New public method; resolves all the
5955         type's constraints.
5956
5957         * class.cs (TypeContainer.DefineType): Call
5958         TypeParameter.Resolve() before actually defining the type.
5959
5960 2003-09-15  Martin Baulig  <martin@ximian.com>
5961
5962         * class.cs (TypeContainer.DefineType): Added an error flag to
5963         avoid reporting duplicate CS0146's ("class definition is
5964         circular.").
5965
5966         * driver.cs (Driver.MainDriver): Abort if
5967         RootContext.ResolveTree() reported any errors.
5968
5969 2003-09-07  Martin Baulig  <martin@ximian.com>
5970
5971         * report.cs (Error, Warning): Added overloaded versions which take
5972         a `params object[] args' and call String.Format().
5973
5974 2003-09-07  Martin Baulig  <martin@ximian.com>
5975
5976         * decl.cs (DeclSpace..ctor): Don't call
5977         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5978         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5979         (DeclSpace.RecordDecl): New method.
5980
5981         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5982
5983 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5984
5985         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5986         value attributes to be applied to ParameterBuilders.
5987
5988         * class.cs (MethodCore.LabelParameters): Make static and more
5989         generic so that it can be used from other places - like interface
5990         methods, for instance.
5991
5992         * interface.cs (Interface.Emit): Call LabelParameters before
5993         emitting attributes on the InterfaceMethod.
5994
5995 2003-09-07  Martin Baulig  <martin@ximian.com>
5996
5997         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
5998         if the number of type parameters doesn't match.
5999
6000 2003-09-04  Martin Baulig  <martin@ximian.com>
6001
6002         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
6003         for arrays of generic type params (ie. `!0[]').
6004
6005 2003-09-04  Martin Baulig  <martin@ximian.com>
6006
6007         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
6008         for the moment.
6009
6010 2003-09-04  Martin Baulig  <martin@ximian.com>
6011
6012         * decl.cs (DeclSpace.LookupGeneric): New method.
6013         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
6014         moment.
6015
6016         * generic.cs (TypeParameterExpr): Take a TypeParameter as
6017         argument, not just a string.
6018         (TypeParameter.Define): New public method; this is called to
6019         actually define the generic parameter; after this, you can use the
6020         new `Type' property to get the type.
6021
6022 2003-09-04  Martin Baulig  <martin@ximian.com>
6023
6024         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
6025         is now an ArrayList; initialize the result of the `TypeParameters'
6026         property here.
6027         (DeclSpace.GetGenericData): Removed.
6028         (DeclSpace.LookupGeneric): Temporarily removed; we need to
6029         implement this in a different way.
6030         (DeclSpace.GetTypeParameters): Removed; there's now a
6031         `TypeParameters' property.
6032         (DeclSpace.TypeParameters): New public property.
6033
6034         * generic.cs (Constraints): Make this class public.
6035         (TypeParameter): New public class.
6036
6037 2003-09-04  Martin Baulig  <martin@ximian.com>
6038
6039         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
6040         generic parameters.
6041
6042         * class.cs (TypeContainer.DefineType): Call
6043         TypeBuilder.DefineGenericParameter () on all generic parameters if
6044         this is a generic type.
6045
6046 2003-08-28  Martin Baulig  <martin@ximian.com>
6047
6048         * sample-stack.il: Compile this with ilasm: "ilasm /dll
6049         sample-stack.il".
6050
6051         * sample-hello.cs: Compile this with gmcs: "gmcs
6052         /r:sample-stack.dll sample-hello.cs".
6053
6054 2003-08-28  Martin Baulig  <martin@ximian.com>
6055
6056         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
6057         the parameters to the generic type.
6058
6059 2003-08-28  Martin Baulig  <martin@ximian.com>
6060
6061         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
6062
6063 2003-08-28  Martin Baulig  <martin@ximian.com>
6064
6065         * cs-parser.jay (opt_type_argument_list): Use
6066         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
6067         (primary_expression): Replace `qualified_identifier' with `type_name'.
6068         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
6069
6070         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
6071         parser to check whether it is syntactically a type parameter list;
6072         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
6073         this case.
6074
6075 2003-08-26  Martin Baulig  <martin@ximian.com>
6076
6077         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
6078         resolving aliases; fixes #47927.
6079
6080 2003-08-26  Martin Baulig  <martin@ximian.com>
6081
6082         * statement.cs (Using.DoResolve): This is internally emitting a
6083         try/finally clause, so we need to set ec.NeedExplicitReturn if we
6084         do not always return.  Fixes #47681.
6085
6086 2003-08-26  Martin Baulig  <martin@ximian.com>
6087
6088         * decl.cs (MemberCore): Moved WarningNotHiding(),
6089         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
6090         into MemberBase.
6091         (AdditionResult): Make this nested in DeclSpace.
6092         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
6093         argument; call NamespaceEntry.Define() unless we're nested in a
6094         class or struct.
6095
6096         * namespace.cs (Namespace.DefineName): New public function.  This
6097         is called from DeclSpace's .ctor to add 
6098         (Namespace.Lookup): Include DeclSpaces in the lookup.
6099
6100         * class.cs (Operator): Derive from MemberBase, not MemberCore.
6101
6102         * const.cs (Const): Derive from MemberBase, not MemberCore.     
6103
6104 2003-08-25  Martin Baulig  <martin@ximian.com>
6105
6106         * convert.cs (Convert.ExplicitReferenceConversion): When
6107         converting from an interface type to a class, unbox if the target
6108         type is a struct type.  Fixes #47822.
6109
6110 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6111
6112         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
6113         #47854.
6114
6115 2003-08-22  Martin Baulig  <martin@ximian.com>
6116
6117         * class.cs (TypeManager.DefineType): When defining a nested type,
6118         call DefineType() on our parent; fixes #47801.
6119
6120 2003-08-22  Martin Baulig  <martin@ximian.com>
6121
6122         * class.cs (MethodData.Define): While checking if a method is an
6123         interface implementation, improve the test a bit more to fix #47654.
6124
6125 2003-08-22  Martin Baulig  <martin@ximian.com>
6126
6127         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
6128         correctly; fixes #47722.
6129
6130 2003-08-22  Martin Baulig  <martin@ximian.com>
6131
6132         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
6133         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
6134
6135         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
6136
6137 2003-08-22  Martin Baulig  <martin@ximian.com>
6138
6139         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
6140         can only be assigned in static constructors.  Fixes #47161.
6141
6142 2003-08-22  Martin Baulig  <martin@ximian.com>
6143
6144         Rewrote and improved the flow analysis code.
6145
6146         * flowbranching.cs (FlowBranching): Make this class abstract.
6147         (FlowBranching.CreateBranching): New static function to create a
6148         new flow branching.
6149         (FlowBranchingBlock, FlowBranchingException): New classes.
6150         (FlowBranching.UsageVector.Type): New public readonly field.
6151         (FlowBranching.UsageVector.Breaks): Removed the setter.
6152         (FlowBranching.UsageVector.Returns): Removed the setter.
6153         (FlowBranching.UsageVector): Added Break(), Return(),
6154         NeverReachable() and Throw() methods to modify the reachability.
6155         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
6156         done by FlowBranching.Merge().
6157         (FlowBranching.UsageVector.MergeChild): New method; merges the
6158         merge result into the current vector.
6159         (FlowBranching.Merge): New abstract method to merge a branching.
6160
6161 2003-08-12  Martin Baulig  <martin@ximian.com>
6162
6163         * expression.cs (Indirection.CacheTemporaries): Create the
6164         LocalTemporary with the pointer type, not its element type.
6165
6166 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
6167
6168         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
6169         token was a keyword or not.
6170
6171         Add `error' options where an IDENTIFIER was expected;  Provide
6172         CheckToken and CheckIdentifierToken convenience error reporting
6173         functions. 
6174
6175         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
6176
6177         * decl.cs: Rename `NamespaceEntry Namespace' public field into
6178         NameSpaceEntry NameSpaceEntry.
6179
6180         (LookupInterfaceOrClass): Avoid creating a full qualified name
6181         from namespace and name: avoid doing lookups when we know the
6182         namespace is non-existant.   Use new Tree.LookupByNamespace which
6183         looks up DeclSpaces based on their namespace, name pair.
6184
6185         * driver.cs: Provide a new `parser verbose' to display the
6186         exception thrown during parsing.  This is turned off by default
6187         now, so the output of a failure from mcs is more graceful.
6188
6189         * namespace.cs: Track all the namespaces defined in a hashtable
6190         for quick lookup.
6191
6192         (IsNamespace): New method
6193
6194 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
6195
6196         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
6197         we know that we need to concatenate (full typename can never be
6198         null). 
6199
6200         * class.cs: ditto.
6201
6202         * statement.cs: Use a bitfield;  Do not initialize to null things
6203         which are done by the constructor by default.
6204
6205         * cs-parser.jay: bug fix, parameter was 4, not 3.
6206
6207         * expression.cs: Just use the property;
6208
6209         * statement.cs: No need for GetVariableInfo method.
6210
6211 2003-08-08  Martin Baulig  <martin@ximian.com>
6212
6213         * flowanalysis.cs (FlowReturns): This is now nested in the
6214         `FlowBranching' class.
6215         (MyBitVector): Moved this here from statement.cs.
6216         (FlowBranching.SiblingType): New enum type.
6217         (FlowBranching.CreateSibling): Added `SiblingType' argument.
6218
6219 2003-08-07  Martin Baulig  <martin@ximian.com>
6220
6221         * flowanalysis.cs (FlowBranchingType): This is now nested in the
6222         `FlowBranching' class and called `BranchingType'.
6223
6224 2003-08-07  Martin Baulig  <martin@ximian.com>
6225
6226         * flowanalysis.cs: Moved all the control flow analysis code into
6227         its own file.
6228
6229 2003-08-07  Martin Baulig  <martin@ximian.com>
6230
6231         * assign.cs (Assign.DoResolve): `target' must either be an
6232         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
6233         #37319.
6234
6235 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
6236
6237         * expression.cs (BinaryMethod): This kind of expression is created by the
6238         Binary class if it determines that the operator has to be handled
6239         by a method.
6240
6241         (BinaryDelegate): This kind of expression is created if we are
6242         dealing with a + or - operator on delegates.
6243
6244         (Binary): remove method, argumetns, and DelegateOperator: when
6245         dealing with methods, 
6246
6247         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
6248
6249         * statement.cs (Block): use bitfields for the three extra booleans
6250         we had in use.   Remove unused topblock parameter.
6251
6252         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
6253
6254         * assign.cs: Drop extra unneeded tests.
6255
6256 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
6257
6258         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
6259
6260         * statement.cs (Foreach): Use VariableStorage instead of
6261         LocalBuilders.   
6262
6263         * codegen.cs (VariableStorage): New class used by clients that
6264         require a variable stored: locals or fields for variables that
6265         need to live across yield.
6266
6267         Maybe provide a convenience api for EmitThis+EmitLoad?
6268
6269         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
6270         these bad boys.
6271
6272 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
6273
6274         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
6275         RemapParameterLValue): New methods that are used to turn a
6276         precomputed FieldInfo into an expression like this:
6277
6278                 instance.FieldInfo
6279
6280         The idea is to use this instead of making LocalVariableReference
6281         have more than one meaning.
6282
6283         * cs-parser.jay: Add error production to BASE.
6284
6285         * ecore.cs: Deal with TypeManager.GetField returning null, which
6286         is now a valid return value.
6287
6288         (FieldExprNoAddress): New expression for Fields whose address can
6289         not be taken.
6290
6291         * expression.cs (LocalVariableReference): During the resolve
6292         phases, create new expressions if we are in a remapping context.
6293         Remove code that dealt with remapping here.
6294
6295         (ParameterReference): same.
6296
6297         (ProxyInstance): New expression, like the `This' expression, but
6298         it is born fully resolved.  We know what we are doing, so remove
6299         the errors that are targeted to user-provided uses of `this'.
6300
6301         * statement.cs (Foreach): our variable is now stored as an
6302         Expression;  During resolution, follow the protocol, dont just
6303         assume it will return this.
6304
6305 2003-08-06  Martin Baulig  <martin@ximian.com>
6306
6307         * support.cs (SeekableStreamReader.cs): New public class.
6308
6309         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
6310         SeekableStreamReader instead of the normal StreamReader.
6311
6312 2003-08-04  Martin Baulig  <martin@ximian.com>
6313
6314         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
6315         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
6316         deambiguate casts and delegate invocations.
6317         (parenthesized_expression): Use the new tokens to ensure this is
6318         not a cast of method invocation.
6319
6320         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
6321         when reading a `)' and Deambiguate_CloseParens () was previously
6322         called.
6323
6324         * expression.cs (ParenthesizedExpression): New class.  This is
6325         just used for the CS0075 test.
6326         (Binary.DoResolve): Check for CS0075.   
6327
6328 2003-07-29  Ravi Pratap  <ravi@ximian.com>
6329
6330         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
6331         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
6332         reference comparison.
6333
6334         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
6335         examine the ReturnType for equality - this is necessary in the
6336         cases of implicit and explicit operators whose signature also
6337         includes the return type.
6338
6339 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
6340
6341         * namespace.cs: Cache the result of the namespace computation,
6342         instead of computing it every time.
6343
6344 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6345
6346         * decl.cs: Use a global arraylist that we reuse over invocations
6347         to avoid excesive memory consumption.  Reduces memory usage on an
6348         mcs compile by one meg (45 average).
6349
6350         * typemanager.cs (LookupTypeReflection): In .NET pointers are
6351         private, work around that.
6352
6353 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
6354
6355         * literal.cs (IntLiteral): Define Zero and One static literals. 
6356
6357         * cs-parser.jay (integer_literal): use static literals to reduce
6358         memory usage for the most used literals (0, 1 and -1).  211kb
6359         reduced in memory usage.
6360
6361         Replace all calls to `new ArrayList' with `new
6362         ArrayList(4)' which is a good average number for most allocations,
6363         and also requires only 16 bytes of memory for its buffer by
6364         default. 
6365
6366         This reduced MCS memory usage in seven megabytes for the RSS after
6367         bootstrapping.
6368
6369 2003-07-28  Ravi Pratap  <ravi@ximian.com>
6370
6371         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
6372         handle params methods the correct way by forming only one
6373         applicable set with params and normal methods in them. Earlier we
6374         were looking at params methods only if we found no normal methods
6375         which was not the correct thing to do.
6376
6377         (Invocation.BetterFunction): Take separate arguments indicating
6378         when candidate and the best method are params methods in their
6379         expanded form.
6380
6381         This fixes bugs #43367 and #46199.
6382
6383         * attribute.cs: Documentation updates.
6384
6385         (CheckAttribute): Rename to CheckAttributeTarget.
6386         (GetValidPlaces): Rename to GetValidTargets.
6387
6388         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
6389         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
6390
6391         Fixes bug #44468.
6392
6393 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
6394
6395         * codegen.cs: Compute IsGeneric correctly.
6396
6397         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
6398         resolution. 
6399
6400         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
6401         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
6402         regressions, and I was chasing more bugs than I required.
6403
6404         * interface.cs: Use expressions for base type names (like classes
6405         and structs have been doing for a while now), and resolve that.
6406         This patch should probably go into head as well.
6407
6408         This makes it one less user of FindType.
6409
6410 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6411
6412         This compiler can not self host currently.  Need to fix that.
6413         
6414         * Makefile: compile to `gmcs.exe'
6415
6416         * driver.cs: Turn on v2 by default on gmcs.
6417
6418         * generic.cs (ConstructedType): Does no longer take a container
6419         type argument;  That will be taken care of later.
6420
6421         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
6422         Use SimpleName to resolve for now, so we can continue the work on
6423         the parser, until we get Type.GetType that understands generics.
6424
6425         (ConstructedType.ToString): Implement
6426
6427         (TypeArguments.Resolve): Resolve the child expressions as types. 
6428         
6429         * cs-parser.jay: Rename interface_constraints to
6430         type_parameter_constraints
6431
6432         (namespace_or_type_name): Only use constructed types for the basic
6433         construction, we will deal with identifier<...> later.
6434
6435         (type/type_name): No longer call DecomposeQI, as
6436         namespace_or_type_name is always decoded now.
6437         
6438 2003-07-22  Ravi Pratap  <ravi@ximian.com>
6439
6440         * expression.cs (Invocation.OverloadResolve): Follow the spec more
6441         closely: we eliminate methods in base types when we have an
6442         applicable method in a top-level type.
6443
6444         Please see section 14.5.5.1 for an exact description of what goes
6445         on. 
6446
6447         This fixes bug #45127 and a host of other related to corlib compilation.
6448
6449         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
6450         array is the method corresponding to the top-level type (this is
6451         because of the changes made to icall.c) so we change this
6452         accordingly.
6453
6454         (MethodGroupExpr.Name): This too.
6455
6456         * typemanager.cs (GetElementType): New method which does the right
6457         thing when compiling corlib. 
6458
6459         * everywhere: Make use of the above in the relevant places.
6460
6461 2003-07-22  Martin Baulig  <martin@ximian.com>
6462
6463         * cs-parser.jay (invocation_expression): Moved
6464         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
6465         `cast_expression', but create a InvocationOrCast which later
6466         resolves to either an Invocation or a Cast.
6467
6468         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
6469         method; call this before EmitStatement() to make sure that this
6470         expression can be used as a statement.
6471
6472         * expression.cs (InvocationOrCast): New class; resolves to either
6473         an Invocation or a Cast.
6474
6475         * statement.cs (StatementExpression): Call ResolveStatement() on
6476         the ExpressionStatement before emitting it.
6477
6478 2003-07-21  Martin Baulig  <martin@ximian.com>
6479
6480         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
6481         `ref' and `out' attributes match; fixes #46220.
6482         (MemberAccess.ResolveMemberAccess): You can't reference a type
6483         through an expression; fixes #33180.
6484         (Indexers.GetIndexersForType): Don't return the indexers from
6485         interfaces the class implements; fixes #46502.
6486
6487 2003-07-21  Martin Baulig  <martin@ximian.com>
6488
6489         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
6490         CS0661 checks; fixes bug #30442.
6491
6492 2003-07-21  Martin Baulig  <martin@ximian.com>
6493
6494         * decl.cs (AdditionResult): Added `Error'.
6495
6496         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
6497
6498         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
6499         cs0031.cs actually work.
6500
6501  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6502  
6503         * cs-parser.jay (namespace_name): do not use
6504         namespace_or_type_name, use qualified_identifier, because
6505         namespace_or_type_name will soon return a composed expression
6506         instead of a string.
6507  
6508         (namespace_or_type_name): Instead of returning a string, now this
6509         production returns an expression.
6510  
6511         * codegen.cs (EmitContext): Setup IsGeneric property based on
6512         whether our DeclSpace is generic, our the method is generic.
6513  
6514         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
6515         the method is generic.
6516  
6517         * cs-parser.jay (type_arguments, opt_type_argument_list,
6518         type_parameters, type_parameter_list, opt_type_parameter_list,
6519         type_parameter,, opt_type_parameter_constraints_clauses,
6520         type_parameter_constraints_clauses,
6521         type_parameter_constraint_clause, type_parameter_constraint,
6522         interface_constraints): Add new production
6523  
6524         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
6525         DeclSpace is generic or not.
6526  
6527         (DeclSpace.SetParameterInfo): New routine, used to set the
6528         parameter info for a type.
6529  
6530         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
6531         returns a GenericTypeExpr
6532  
6533         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
6534         generic, lookup the generic argument.
6535  
6536         * attribute.cs: Do not allow TypeParameterExpressions in
6537         Attributes.
6538  
6539         * class.cs: Do not allow the Main method to be defined in a
6540         Generic container.
6541  
6542         * expression.cs (SizeOf): Do not allow generic types to be used as
6543         arguments to sizeof.
6544  
6545         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
6546         it: whether a type is generic or not.  Only works for types we are
6547         currently building for now.
6548         
6549 2003-07-20  Martin Baulig  <martin@ximian.com>
6550
6551         * namespace.cs: Fixed that bug which caused a crash when compiling
6552         the debugger's GUI.
6553
6554 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6555
6556         * typemanager.cs (LookupTypeReflection): Never expose types which
6557         are NotPublic, NestedPrivate, NestedAssembly, or
6558         NestedFamANDAssem.  We used to return these, and later do a check
6559         that would report a meaningful error, but the problem is that we
6560         would not get the real match, if there was a name override.
6561
6562 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
6563
6564         * namespace.cs (Namespace, Name): Do not compute the namespace
6565         name dynamically, compute it in the constructor.  This reduced
6566         memory usage by 1697 KB.
6567
6568         * driver.cs: Use --pause to pause at the end.
6569
6570 2003-07-17  Peter Williams  <peter@newton.cx>
6571
6572         * Makefile: Change the name of the test target so that it doesn't
6573         conflict with the recursive test target.
6574
6575 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
6576
6577         * expression.cs (LocalVariableReference.Emit, EmitAssign,
6578         AddressOf): Do not use EmitThis, that was wrong, use the actual
6579         this pointer.
6580
6581 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
6582
6583         * class.cs (MethodData.Define): While checking if a method is an
6584         interface implementation, improve the test: If we are not public
6585         (use new test here: use the computed MethodAttributes directly,
6586         instead of the parsed modifier flags) check if the `implementing'
6587         method comes from an interface or not.
6588
6589         * pending.cs (VerifyPendingMethods): Slightly better error
6590         message.
6591
6592         * makefile: add test target that does the mcs bootstrap.
6593
6594 2003-07-16  Ravi Pratap  <ravi@ximian.com>
6595
6596         * interface.cs (Define): Do nothing here since there are no
6597         members to populate etc. Move the attribute emission out of here
6598         since this was just totally the wrong place to put it. Attribute
6599         application happens during the 'Emit' phase, not in the 'Define'
6600         phase.
6601
6602         (Emit): Add this method and move the attribute emission here
6603
6604         * rootcontext.cs (EmitCode): Call the Emit method on interface
6605         types too.
6606
6607 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6608
6609         * expression.cs (OverloadResolve): Report error only if Location
6610         is not 'Null' which means that there was a probe going on.
6611
6612 2003-07-14  Martin Baulig  <martin@ximian.com>
6613
6614         * expression.cs (ConditionalLogicalOperator): New public class to
6615         implement user defined conditional logical operators.
6616         This is section 14.11.2 in the spec and bug #40505.
6617
6618 2003-07-14  Martin Baulig  <martin@ximian.com>
6619
6620         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6621
6622 2003-07-14  Martin Baulig  <martin@ximian.com>
6623
6624         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6625
6626         * ecore.cs (IVariable.VerifyFixed): New interface method.
6627
6628         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6629         operator, check whether the variable is actually fixed.  Fixes bug
6630         #36055.  Set a variable definitely assigned when taking its
6631         address as required by the spec.
6632
6633         * statement.cs (LocalInfo.IsFixed): New field.
6634         (LocalInfo.MakePinned): Set `IsFixed' to true.
6635
6636 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6637
6638         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6639         for .ctors, ensure that we only ask for members declared in the
6640         attribute type (BindingFlags.DeclaredOnly).
6641
6642         Fixes bug #43632.
6643
6644         * expression.cs (Error_WrongNumArguments): Report error 1501
6645         correctly the way CSC does.
6646
6647 2003-07-13  Martin Baulig  <martin@ximian.com>
6648
6649         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6650         lookup on the fully qualified name, to make things like "X.X" work
6651         where "X.X" is a fully qualified type name, but we also have a
6652         namespace "X" in the using list.  Fixes #41975.
6653
6654 2003-07-13  Martin Baulig  <martin@ximian.com>
6655
6656         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6657         function. If we're a CompoundAssign, we need to create an embedded
6658         CompoundAssign, not an embedded Assign.
6659         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6660         Fixes #45854.
6661
6662 2003-07-13  Martin Baulig  <martin@ximian.com>
6663
6664         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6665         work to fix bug #46088.
6666
6667 2003-07-13  Ravi Pratap <ravi@ximian.com>
6668
6669         * class.cs (Operator.Emit): Do not emit attributes here - it is
6670         taken care of by the Method class that we delegate too. This takes
6671         care of bug #45876.
6672
6673 2003-07-10  Martin Baulig  <martin@ximian.com>
6674
6675         * expression.cs (TypeOfVoid): New class.
6676         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6677
6678 2003-07-10  Martin Baulig  <martin@ximian.com>
6679
6680         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6681         bug #35957.
6682
6683 2003-07-10  Martin Baulig  <martin@ximian.com>
6684
6685         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6686         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6687
6688         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6689
6690         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6691
6692 2003-07-10  Martin Baulig  <martin@ximian.com>
6693
6694         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6695         of decimal.  Fixes #42850.
6696
6697         NOTE: I also fixed the created byte blob, but this doesn't work on
6698         the MS runtime and csc never produces any byte blobs for decimal
6699         arrays.
6700
6701 2003-07-10  Martin Baulig  <martin@ximian.com>
6702
6703         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6704         structs; fixes #32068.
6705         (Block.AddChildVariableNames): Fixed #44302.
6706
6707 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6708
6709         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6710
6711 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6712
6713         * attribute.cs: And this test is onger needed.
6714
6715 2003-07-08  Martin Baulig  <martin@ximian.com>
6716
6717         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6718         inaccessible types.  Fixes #36313.
6719
6720         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6721
6722         * namespace.cs (NamespaceEntry): Create implicit entries for all
6723         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6724         implicit entries for N1.N2 and N1.
6725
6726 2003-07-08  Martin Baulig  <martin@ximian.com>
6727
6728         Rewrote the handling of namespaces to fix a lot of the issues
6729         wrt. `using' aliases etc.
6730
6731         * namespace.cs (Namespace): Splitted this class into a
6732         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6733
6734         * typemanager.cs (TypeManager.IsNamespace): Removed.
6735         (TypeManager.ComputeNamespaces): Only compute namespaces from
6736         loaded assemblies here, not the namespaces from the assembly we're
6737         currently compiling.
6738
6739 2003-07-08  Martin Baulig  <martin@ximian.com>
6740
6741         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6742
6743 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6744
6745         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6746         already fixed it.  
6747
6748         I thought about the memory savings here, but LookupTypeReflection
6749         is used under already very constrained scenarios.  Compiling
6750         corlib or mcs only exposes one hit, so it would not really reduce
6751         any memory consumption.
6752
6753 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6754
6755         * typemanager.cs: fixes bug #45889 by only adding public types from
6756         other assemblies to the list of known types.
6757
6758 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6759
6760         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6761         on the type we resolved.
6762
6763 2003-07-05  Martin Baulig  <martin@ximian.com>
6764
6765         * pending.cs (PendingImplementation.ParentImplements): Don't
6766         create the proxy if the parent is abstract.
6767
6768         * class.cs (TypeContainer.DefineIndexers): Process explicit
6769         interface implementations first.  Fixes #37714.
6770
6771 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6772
6773         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6774         defined recursively;  but since we modify the input parameters
6775         (left is set to `this' temporarily), we reset this value if the
6776         left_is_explicit is false, which gives the original semantics to
6777         the code.  
6778
6779         * literal.cs (NullPointer): new class used to represent a null
6780         literal in a pointer context.
6781
6782         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6783         type is a pointer, use a NullPointer object instead of a
6784         NullLiteral.   Closes 43687
6785
6786         (ExplicitConversion): Convert pointer values using
6787         the conv opcode to the proper type.
6788
6789         * ecore.cs (New): change ValueTypeVariable property into a method,
6790         that returns whether the valuetype is suitable for being used.
6791
6792         * expression.cs (Binary.DoNumericPromotions): Only return if we
6793         the int constant was a valid uint, and we can return both left and
6794         right as uints.  If not, we continue processing, to trigger the
6795         type conversion.  This fixes 39018.
6796
6797         * statement.cs (Block.EmitMeta): During constant resolution, set
6798         the CurrentBlock property on the emitcontext, so that we resolve
6799         constants propertly.
6800
6801 2003-07-02  Martin Baulig  <martin@ximian.com>
6802
6803         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6804         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6805
6806         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6807         than emitting it here.
6808
6809         * statement.cs: Fixed some more flow analysis bugs.
6810
6811 2003-07-02  Martin Baulig  <martin@ximian.com>
6812
6813         * class.cs (MethodData.Define): When implementing interface
6814         methods, set Final unless we're Virtual.
6815
6816         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6817         check work for interface methods.
6818
6819 2003-07-01  Martin Baulig  <martin@ximian.com>
6820
6821         * ecore.cs (EmitContext.This): Replaced this property with a
6822         GetThis() method which takes a Location argument.  This ensures
6823         that we get the correct error location for a CS0188.
6824
6825 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6826
6827         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6828         ImplicitStandardConversion.
6829
6830         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6831
6832 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6833
6834         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6835         optimization.
6836
6837 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6838
6839         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6840         constructors.
6841
6842         (MethodData.Define): Turn off initlocals for unsafe methods.
6843
6844 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6845
6846         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6847         complete;  Fixes #37521.
6848
6849         * delegate.cs: Use Modifiers.TypeAttr to compute the
6850         TypeAttributes, instead of rolling our own.  This makes the flags
6851         correct for the delegates.
6852
6853 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6854
6855         * class.cs (Constructor.Define): Set the private flag for static
6856         constructors as well.
6857
6858         * cs-parser.jay (statement_expression): Set the return value to
6859         null, to avoid a crash when we catch an error.
6860
6861 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6862
6863         * cs-parser.jay: Applied patch from Jackson that adds support for
6864         extern and unsafe modifiers to destructor declarations.
6865
6866         * expression.cs: Report error 21 if the user is trying to index a
6867         System.Array.
6868
6869         * driver.cs: Add an error message, suggested by the bug report.
6870
6871         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6872         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6873
6874 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6875
6876         * namespace.cs: Add some information to reduce FAQs.
6877
6878 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6879
6880         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6881         underlying enumeration types.  Fixes #43915.
6882
6883         * expression.cs: Treat ushort/short as legal values to be used in
6884         bitwise operations.
6885
6886 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6887
6888         * delegate.cs: transfer custom attributes for paramenters from
6889         the delegate declaration to Invoke and BeginInvoke.
6890
6891 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6892
6893         * attribute.cs: handle custom marshalers and emit marshal info
6894         for fields, too.
6895
6896 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6897
6898         * makefile.gnu: Added anonymous.cs to the compiler sources.
6899
6900 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6901
6902         * iterators.cs: Change the name of the proxy class to include two
6903         underscores.
6904
6905         * cs-parser.jay: Update grammar to include anonymous methods.
6906
6907         * anonymous.cs: new file.
6908
6909 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6910
6911         * class.cs (Field.Define): Add missing test for pointers and
6912         safety. 
6913
6914 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6915
6916         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6917         we use the stobj opcode.
6918
6919         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6920         since it wasn't the correct fix. 
6921
6922         It still is puzzling that we are required to use stobj for IntPtr
6923         which seems to be a ValueType.
6924
6925 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6926
6927         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6928         during regular simple name resolution.   Now, the trick is that
6929         instead of returning for processing the simplename, we do a
6930         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6931         contextual lookup type).   If a match is found, return that, if
6932         not, return for further composition.
6933
6934         This fixes long-standing 30485.
6935
6936         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6937         using the address to initialize an object, do an Stobj instead of
6938         using the regular Stelem.
6939
6940         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6941         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6942         Because if we are a BaseIndexerAccess that value will be true.
6943         Fixes 43643.
6944
6945         * statement.cs (GotoCase.Resolve): Return after reporting an
6946         error, do not attempt to continue. 
6947
6948         * expression.cs (PointerArithmetic.Emit): If our operand is a
6949         long, convert our constants to match the operand before
6950         multiplying.  Convert to I type before adding.   Fixes 43670.
6951
6952 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6953
6954         * enum.cs (ImplicitConversionExists) : Rename to
6955         ImplicitEnumConversionExists to remove ambiguity. 
6956
6957         * ecore.cs (NullCast): New type of cast expression class which
6958         basically is very similar to EmptyCast with the difference being
6959         it still is a constant since it is used only to cast a null to
6960         something else
6961         (eg. (string) null)
6962
6963         * convert.cs (ImplicitReferenceConversion): When casting a null
6964         literal, we return a NullCast.
6965
6966         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6967         should be around anymore.
6968
6969         The renaming (reported was slightly wrong). Corrections:
6970
6971         ConvertImplicitStandard -> ImplicitConversionStandard
6972         ConvertExplicitStandard -> ExplicitConversionStandard
6973
6974         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6975         before passing them in !
6976
6977         * convert.cs (ImplicitConversionStandard): When comparing for
6978         equal expr and target types, ensure that expr is not a
6979         NullLiteral.
6980
6981         In general, we must not be checking (expr_type ==
6982         target_type) in the top level conversion methods
6983         (ImplicitConversion, ExplicitConversion etc). This checking is
6984         done in the methods that they delegate to.
6985
6986 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6987
6988         * convert.cs: Move Error_CannotConvertType,
6989         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6990         ImplicitNumericConversion, ImplicitConversionExists,
6991         ImplicitUserConversionExists, StandardConversionExists,
6992         FindMostEncompassedType, FindMostSpecificSource,
6993         FindMostSpecificTarget, ImplicitUserConversion,
6994         ExplicitUserConversion, GetConversionOperators,
6995         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6996         TryImplicitIntConversion, Error_CannotConvertImplicit,
6997         ConvertImplicitRequired, ConvertNumericExplicit,
6998         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6999         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
7000         its own file.
7001
7002         Perform the following renames:
7003
7004         StandardConversionExists -> ImplicitStandardConversionExists
7005         ConvertImplicit -> ImplicitConversion
7006         ConvertImplicitStandard -> ImplicitStandardConversion
7007         TryImplicitIntConversion -> ImplicitIntConversion
7008         ConvertImplicitRequired -> ImplicitConversionRequired
7009         ConvertNumericExplicit -> ExplicitNumericConversion
7010         ConvertReferenceExplicit -> ExplicitReferenceConversion
7011         ConvertExplicit -> ExplicitConversion
7012         ConvertExplicitStandard -> ExplicitStandardConversion
7013
7014 2003-05-19  Martin Baulig  <martin@ximian.com>
7015
7016         * statement.cs (TypeInfo.StructInfo): Made this type protected.
7017         (TypeInfo): Added support for structs having structs as fields.
7018
7019         * ecore.cs (FieldExpr): Implement IVariable.
7020         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
7021         VariableInfo for the field.
7022
7023 2003-05-18  Martin Baulig  <martin@ximian.com>
7024
7025         * expression.cs (This.DoResolve): Report a CS0027 if we're
7026         emitting a field initializer.
7027
7028 2003-05-18  Martin Baulig  <martin@ximian.com>
7029
7030         * expression.cs (This.ResolveBase): New public function.
7031         (This.DoResolve): Check for CS0188.
7032
7033         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
7034         This.Resolve().
7035
7036         * ecore.cs (MethodGroupExpr.DoResolve): Set the
7037         `instance_expression' to null if we don't have any non-static
7038         methods.
7039
7040 2003-05-18  Martin Baulig  <martin@ximian.com>
7041
7042         Reworked the way how local variables and parameters are handled by
7043         the flow analysis code.
7044
7045         * statement.cs (TypeInfo, VariableMap): New public classes.
7046         (VariableInfo): New public class.  This is now responsible for
7047         checking whether a variable has been assigned.  It is used for
7048         parameters and local variables.
7049         (Block.EmitMeta): Take the InternalParameters as argument; compute
7050         the layout of the flow vectors here.
7051         (Block.LocalMap, Block.ParameterMap): New public properties.
7052         (FlowBranching): The .ctor doesn't get the InternalParameters
7053         anymore since Block.EmitMeta() now computes the layout of the flow
7054         vector.
7055         (MyStructInfo): This class is now known as `StructInfo' and nested
7056         in `TypeInfo'; we don't access this directly anymore.
7057
7058         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
7059         property and removed IsAssigned(), IsFieldAssigned(),
7060         SetAssigned() and SetFieldAssigned(); we now call them on the
7061         VariableInfo so we don't need to duplicate this code everywhere.
7062
7063         * expression.cs (ParameterReference): Added `Block block' argument
7064         to the .ctor.
7065         (LocalVariableReference, ParameterReference, This): The new
7066         VariableInfo class is now responsible for all the definite
7067         assignment stuff.
7068
7069         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
7070         IsParameterAssigned, SetParameterAssigned): Removed.
7071
7072 2003-05-18  Martin Baulig  <martin@ximian.com>
7073
7074         * typemanager.cs (InitCoreTypes): Try calling
7075         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
7076         the 3-args-version.  Corlib now also needs our `void_type'.
7077         (GetMethod): Added overloaded version which takes an optional
7078         `bool report_errors' to allow lookups of optional methods.
7079
7080 2003-05-12  Martin Baulig  <martin@ximian.com>
7081
7082         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
7083         only used for locals and not for parameters.
7084
7085 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
7086
7087         * support.cs (InternalParameters.ParameterType): Return the
7088         ExternalType of the parameter.
7089
7090         * parameter.cs (Parameter.ExternalType): drop the two arguments,
7091         they were unused.
7092
7093 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
7094
7095         * class.cs (MethodData.Define): Do not set the `newslot' on
7096         interface members, if they are also flagged as "override".
7097
7098         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
7099         better code for ++i and i++.  This only works for static fields
7100         and local variables.
7101
7102         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
7103         want to pull the DeclSpace out of the builder_to_declspace instead
7104         of the TypeBuilder (like in TypeContainer.FindMembers).
7105
7106         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
7107         instead of LookupTypeContainer.  Fixes the crash on .NET for
7108         looking up interface members.
7109
7110         * const.cs: Create our own emit context during the Definition
7111         stage, so that constants are evaluated in the proper context, when
7112         a recursive definition happens.
7113
7114 2003-05-11  Martin Baulig  <martin@ximian.com>
7115
7116         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
7117         new block for a switch section.
7118         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
7119         the adding/lookup in the switch block.  Fixes #39828.
7120
7121 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
7122
7123         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
7124         functionality: I needed to convert the data after I had performed
7125         the add/sub operation into the operands type size.
7126
7127         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
7128         pass the type for the box operation, otherwise the resulting
7129         object would have been of type object.
7130
7131         (BoxedCast): Add constructor to specify the type to box as.
7132
7133 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
7134
7135         * iterators.cs: I was reusing the `count' variable inadvertently,
7136         take steps to not allow this to happen.
7137
7138 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
7139
7140         * attribute.cs (Attribute.Resolve): Params attributes are encoded
7141         by creating an array at the point where the params starts and
7142         putting all those arguments there, then adjusting the size of the
7143         array.
7144
7145 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
7146
7147         * expression.cs (New.AddressOf): Implement interface
7148         IMemoryLocation.  This is used when the `new' operator is used in
7149         the context of an invocation to a method on a value type.
7150
7151         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
7152         example. 
7153
7154         * namespace.cs: Also check the using aliases here.
7155
7156         * driver.cs: Move the test for using validity after the types have
7157         been entered, so we do a single pass that also includes the using
7158         aliases. 
7159
7160         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
7161         in the regular case.   CreateSiblingForFinally is doing extra
7162         error checking.
7163
7164         * attribute.cs (GetAttributeArgumentExpression): Store the result
7165         on an out value, and use the return value to indicate failure
7166         instead of using null (which is a valid return for Constant.GetValue).
7167
7168         * statement.cs: Perform the analysis flow for the increment
7169         portion after the statement, because this will be the real flow of
7170         execution.  Fixes #42385
7171
7172         * codegen.cs (EmitContext.EmitArgument,
7173         EmitContext.EmitStoreArgument): New helper functions when the
7174         RemapToProxy flag is set.
7175
7176         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
7177         function.
7178
7179         Add support for remapping parameters. 
7180
7181         * iterators.cs: Propagate parameter values;  Store parameter
7182         values in the proxy classes.
7183
7184 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
7185
7186         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
7187         need a proxy reference;  I do not know what I was thinking
7188
7189         * cs-parser.jay (constructor_initializer): catch another error,
7190         and display nice message.
7191
7192         (field_declaration): catch void field declaration
7193         to flag a better error. 
7194
7195         * class.cs (MemberBase.CheckBase): Report an error instead of a
7196         warning if a new protected member is declared in a struct. 
7197         (Field.Define): catch the error of readonly/volatile.
7198
7199         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
7200
7201         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
7202         volatile variable is taken
7203
7204 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
7205
7206         * statement.cs (Fixed.Resolve): Report an error if we are not in
7207         an unsafe context.
7208
7209 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
7210
7211         * typemanager.cs: reuse the code that handles type clashes for
7212         delegates and enumerations.
7213
7214         * class.cs (Report28): Always report.
7215
7216         * expression.cs (EncodeAsAttribute): Allow nulls here.
7217
7218 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
7219
7220         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
7221         the functionality for testing whether an expression is valid for
7222         an attribute here.  Also handle the case of arrays of elements
7223         being stored. 
7224
7225         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
7226         encoding a linear array into an array of objects that are suitable
7227         to be passed to an CustomAttributeBuilder.
7228
7229         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
7230
7231         * ecore.cs: (FieldExpr): Handle field remapping here.
7232
7233         * iteratators.cs: Pass the instance variable (if the method is an
7234         instance method) to the constructors, so we can access the field
7235         variables on the class.
7236
7237         TODO: Test this with structs.  I think the THIS variable on
7238         structs might have to be a pointer, and not a refenrece
7239
7240 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
7241
7242         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
7243         local variables to fields in a proxy class.
7244
7245         * iterators.cs (PopulateProxy): Rename our internal fields to
7246         <XXX>.  
7247         Create a <THIS> field if we are an instance method, so we can
7248         reference our parent container variables.
7249         (MapVariable): Called back from the EmitContext code to enter a
7250         new variable to field mapping into the proxy class (we just create
7251         a FieldBuilder).
7252
7253         * expression.cs
7254         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
7255         for using the remapped locals to fields.
7256
7257         I placed the code here, because that gives the same semantics to
7258         local variables, and only changes the Emit code.
7259
7260         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
7261         statements inside iterators.
7262         (VariableInfo): Add a FieldBuilder for the cases when we are
7263         remapping local variables to fields in a proxy class
7264
7265         * ecore.cs (SimpleNameResolve): Avoid testing two times for
7266         current_block != null.
7267
7268         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
7269         not cope with strings, as it has been moved to the
7270         TableSwitchEmit.  Fixed bug in switch generation.
7271
7272         * expression.cs (New.DoResolve): Provide more context for the user
7273         when reporting an error.
7274
7275         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
7276         pointers. 
7277
7278         * expression.cs (MemberAccess.DoResolve): When we get a type back,
7279         check the permissions for it.  Note than in a type-resolution
7280         context the check was already present in DeclSpace.ResolveType,
7281         but was missing from the MemberAccess.
7282
7283         (ArrayCreation.CheckIndices): warn if the user has
7284         more nested levels of expressions, but there are no more
7285         dimensions specified.  Avoids crash on bug 41906.
7286
7287 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
7288
7289         * statement.cs (Block): replace Implicit bool, for a generic
7290         flags.   
7291         New flag: `Unchecked'.  This is used during the EmitMeta phase
7292         (which is out-of-line with the regular Resolve/Emit process for a
7293         statement, as this is done ahead of time, but still gets a chance
7294         to call constant resolve).
7295
7296         (Block.Flags): new enum for adding a new flag.
7297
7298         (Block.EmitMeta): track the state of unchecked.
7299
7300         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
7301         to enable constant resolution to work there as well.
7302
7303 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
7304
7305         * typemanager.cs (ienumerable_type): Also look up
7306         System.Collections.IEnumerable. 
7307
7308 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
7309
7310         TODO: Test more than one conditional per method.
7311
7312         * class.cs (Indexer.Define): Report the location where the user is
7313         referencing the unsupported feature.
7314
7315         (MethodData): Overload the use of `conditionals' to
7316         minimize the creation of needless ArrayLists.   This saves roughly
7317         212kb on my machine.
7318
7319         (Method): Implement the new IIteratorContainer interface.
7320         (Method.SetYields): Implement the method by setting the ModFlags
7321         to contain METHOD_YIELDS.
7322
7323         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
7324         which just got set to null.
7325
7326         * iterators.cs: New file.
7327
7328         (Yield, YieldBreak): New statements.
7329
7330         * statement.cs (Return.Resolve): Flag an error if we are used in
7331         an iterator method.
7332
7333         * codegen.cs (InIterator): New flag set if the code is being
7334         compiled in an iterator method.
7335
7336         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
7337         internal modifier, and we just use it to avoid adding extra
7338         fields, as this is seldom used.  
7339
7340         * cs-parser.jay: Add yield_statement (yield and yield break).
7341
7342         * driver.cs: New flag -v2 to turn on version 2 features. 
7343
7344         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
7345         hashtable when v2 is enabled.
7346
7347 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
7348
7349         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
7350         there is already a namespace defined with this name.
7351
7352         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
7353         people upgraded their corlibs.
7354
7355         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
7356         always use fully qualified types, no need to use the compiler
7357         front end.
7358
7359         (TypeManager.IsNamespace): Use binarysearch.
7360
7361         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
7362         AddDelegate): I did not quite use the new IsValid API properly: I
7363         have to pass the short-name and the fullname.  I was passing only
7364         the basename instead of the fullname sometimes. 
7365
7366         (TypeContainer.DefineType): call NamespaceClash.
7367
7368         * interface.cs (Interface.DefineType): use NamespaceClash before
7369         defining the type.
7370
7371         * delegate.cs (Delegate.DefineType): use NamespaceClash before
7372         defining the type.
7373
7374         * enum.cs: (Enum.DefineType): use NamespaceClash before
7375         defining the type.
7376
7377         * typemanager.cs (: 3-line patch that gives us some tasty 11%
7378         speed increase.  First, use the negative_hits cache when we get a
7379         negative.  Second, add the type with its full original name
7380         instead of the new . and + encoded name (reflection uses + to
7381         separate type from a nested type).  Use LookupTypeReflection
7382         directly which bypasses the type->name hashtable (that we already
7383         know does not contain the type.
7384
7385         * decl.cs (DeclSpace.ResolveTypeExpr): track the
7386         location/container type. 
7387
7388         * driver.cs: When passing utf8, use directly the UTF8Encoding.
7389
7390 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
7391
7392         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
7393
7394         * delegate.cs (NewDelegate.Resolve): Test whether an instance
7395         method is being referenced in the method group from a static
7396         context, and report error 120 if so.
7397
7398         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
7399         Error118. 
7400
7401         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
7402         is created, we create the A namespace).
7403
7404         * cs-parser.jay: A namespace also introduces a DeclarationFound.
7405         Fixes #41591
7406
7407 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
7408
7409         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
7410         invocation to ModuleBuilder.GetType with the same values will
7411         return a new type instance, so we need to cache its return
7412         values. 
7413
7414         * expression.cs (Binary.ResolveOperator): Only allow the compare
7415         operators on enums if they are of the same type.
7416
7417         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
7418         types of ValueType on their own case.  Before we were giving them
7419         the same treatment as objects.
7420
7421         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
7422         fullname.  Short name is used to compare against container name.
7423         Fullname is used to check against defined namespace names.
7424
7425         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
7426         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
7427
7428         (Method.CheckBase): Call parent.
7429         (MemberBase.CheckBase): Check for protected members on sealed
7430         classes.
7431         (PropertyBase.CheckBase): Call parent.
7432         (Field.Define): Call parent.
7433
7434         * report.cs: Negative error codes are now mapped to 8000 - code,
7435         so that the display is render more nicely.
7436
7437         * typemanager.cs: Do not use try/catch, instead report a regular
7438         error. 
7439
7440         (GetPointerType, GetReferenceType): These methods provide
7441         mechanisms to obtain the T* and T& from a T.  We had the code
7442         previously scattered around the code base, and it also used
7443         TypeManager.LookupType that would go through plenty of caches.
7444         This one goes directly to the type source.
7445
7446         In some places we did the Type.GetType followed by
7447         ModuleBuilder.GetType, but not in others, so this unifies the
7448         processing as well.
7449
7450         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
7451         statements now that we have namespace information.
7452
7453         * typemanager.cs (IsNamespace): New method, returns whether the
7454         string presented is a namespace or not.
7455
7456         (ComputeNamespaces): New public entry point, computes the list of
7457         available namespaces, using the GetNamespaces API call in Mono, or
7458         the slower version in MS.NET.   
7459
7460         Now before we start the semantic analysis phase, we have a
7461         complete list of namespaces including everything that the user has
7462         provided.
7463
7464         Deleted old code to cache namespaces in .nsc files.
7465
7466 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
7467
7468         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
7469         class/struct location definition Location for the implicit
7470         constructor location.
7471
7472         (Operator.Define): Use the location of the operator for the
7473         implicit Method definition.
7474
7475         (Constructor.Emit): use the constructor location for the implicit
7476         base initializer constructor.
7477
7478         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
7479         and the Expression class now contains two new methods:
7480
7481         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
7482         isolate type lookup from the rest of the resolution process.
7483
7484         Since we use Expressions to hold type definitions due to the way
7485         we parse the input we have historically overloaded Resolve to
7486         perform the Type lookups if a special flag is passed.  Now this is
7487         eliminated and two methods take their place. 
7488
7489         The differences in the two methods between xStep and xTerminal is
7490         that xStep is involved in our current lookup system that uses
7491         SimpleNames to compose a name, while xTerminal is used just to
7492         catch the case where the simplename lookup failed.
7493
7494 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
7495
7496         * expression.cs (ResolveMemberAccess): Remove redundant code.
7497         TypeExpr expressions are always born fully resolved.
7498
7499         * interface.cs (PopulateMethod): Do not lookup the types twice.
7500         We were doing it once during SemanticAnalysis and once during
7501         PopulateMethod.
7502
7503         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
7504         in local variable type definitions, were being returned as a
7505         SimpleName (we decomposed everything into a string), that is
7506         because primary_expression was being used instead of a type in the
7507         grammar (reduce/reduce conflicts).
7508
7509         The part that was wrong is that we converted the expression into a
7510         string (an oversimplification in one hand, compounded with primary
7511         expressions doing string concatenation).
7512
7513         So things like:
7514
7515         A.B.C [] x;
7516
7517         Would return "A.B.C[]" as a SimpleName.  This stopped things like
7518         using clauses from working on this particular context.  And a type
7519         was being matched directly against "A.B.C[]".
7520
7521         We now use the correct approach, and allow for ComposedCast to be
7522         part of the unary expression.  So the "A.B.C []" become a composed
7523         cast of "A.B.C" (as a nested group of MemberAccess with a
7524         SimpleName at the end) plus the rank composition "[]". 
7525
7526         Also fixes 35567
7527
7528 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
7529
7530         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
7531         for the access level checking.
7532
7533         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
7534         `TypeContainer container', because I kept getting confused when I
7535         was debugging this code.
7536
7537         * expression.cs (Indexers): Instead of tracking getters/setters,
7538         we now track them in parallel.  We create one arraylist less, but
7539         most importantly it is possible now for the LValue code to find a
7540         matching get for a set.
7541
7542         (IndexerAccess.DoResolveLValue): Update the code.
7543         GetIndexersForType has been modified already to extract all the
7544         indexers from a type.  The code assumed it did not.
7545
7546         Also make the code set the correct return type for the indexer.
7547         This was fixed a long time ago for properties, but was missing for
7548         indexers.  It used to be void_type.
7549
7550         (Binary.Emit): Test first for doubles instead of
7551         floats, as they are more common.
7552
7553         (Binary.EmitBranchable): Use the .un version of the branch opcodes
7554         when dealing with floats and the <=, >= operators.  This fixes bug
7555         #39314 
7556
7557         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
7558         to load the array value by emitting a load on the foreach variable
7559         type.  This was incorrect.  
7560
7561         We now emit the code to load an element using the the array
7562         variable type, and then we emit the conversion operator.
7563
7564         Fixed #40176
7565
7566 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
7567
7568         * attribute.cs: Avoid allocation of ArrayLists in the common case.
7569
7570 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
7571
7572         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
7573         test for protection before we test for signatures. 
7574
7575         (MethodSignature.ToString): implement.
7576
7577         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
7578         to the case where we reduced into a LongConstant.
7579
7580         * decl.cs (CheckAccessLevel): If the type is an array, we can not
7581         depend on whether the information is acurrate, because the
7582         Microsoft runtime will always claim that the array type is public,
7583         regardless of the real state.
7584
7585         If the type is a pointer, another problem happens: the type is
7586         reported as non-public in Microsoft.  
7587
7588         In both cases we have to call CheckAccessLevel recursively with
7589         the underlying type as the argument to be tested.
7590
7591 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
7592
7593         * assign.cs (Assign.Emit): If we are dealing with a compound
7594         assignment expression, we should use the code path that stores the
7595         intermediate result in a temporary value.  This fixes #40903.
7596
7597         *expression.cs (Indirection.ToString): Provide ToString method for
7598         debugging. 
7599
7600 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7601
7602         * class.cs: Null out fields holding references to Block objects so
7603         they can be garbage collected.
7604
7605         * expression.cs (OverloadResolve): Remove unused local.
7606
7607 2003-04-07  Martin Baulig  <martin@ximian.com>
7608
7609         * codegen.cs (EmitContext.CurrentFile): New public field.
7610         (EmitContext.Mark): Use the CurrentFile to check whether the
7611         location is in the correct file.
7612         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7613
7614 2003-04-07  Martin Baulig  <martin@ximian.com>
7615
7616         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7617
7618         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7619         location.  [FIXME: The location argument which gets passed to this
7620         method is sometimes wrong!]
7621
7622 2003-04-07  Nick Drochak <ndrochak@gol.com>
7623
7624         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7625
7626 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7627
7628         * expression.cs (Indirection.EmitAssign): We were using the
7629         temporary, but returning immediately instead of continuing the
7630         EmitAssing flow.
7631
7632 2003-04-06  Martin Baulig  <martin@ximian.com>
7633
7634         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7635         if it's a nested child, but also deriving from the outer class.
7636         See test 190.cs.
7637
7638         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7639         nested child, but also deriving from the outer class.  See
7640         test-190.cs.
7641         (FilterWithClosure): We may access private members of the outer
7642         class if we're a nested child and deriving from the outer class.
7643         (RealMemberLookup): Only set `closure_private_ok' if the
7644         `original_bf' contained BindingFlags.NonPublic.
7645
7646 2003-04-05  Martin Baulig  <martin@ximian.com>
7647
7648         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
7649         probe if its a type parameter, and if so, flag an error.
7650
7651         * decl.cs: Move here the SetParameterInfo code from class.cs.
7652         Handle IsGeneric here.
7653
7654         Handle a variety of errors in the parameter info definition.
7655
7656         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
7657         type parameters here.
7658
7659         * cs-parser.jay (class_declaration): report errors for parameters
7660         here as well.
7661
7662 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
7663
7664         * generic.cs: New file, contains support code for generics.
7665
7666         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
7667         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
7668
7669         Update parser for the above removals.
7670
7671         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
7672         now taken care of in the parser.
7673
7674 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7675
7676         * class.cs (Event.Define): Do not allow abstract events to have
7677         initializers. 
7678
7679 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7680
7681         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7682         block in event declarations.
7683
7684         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7685         value type, get its address.
7686
7687         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7688         leaving a class on the stack instead of a boolean value (int
7689         0/1).  Change the code so we compare against null, and then the
7690         result against zero.
7691
7692         * class.cs (TypeContainer.GetClassBases): We were checking for the
7693         parent class being sealed too late.
7694
7695         * expression.cs (Binary.Emit): For <= and >= when dealing with
7696         floating point values, use cgt.un and clt.un instead of cgt and
7697         clt alone.
7698
7699 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7700
7701         * statement.cs: Apply the same optimization as MS: skip the 
7702         GetEnumerator returning an IEnumerator, and use the one returning a 
7703         CharEnumerator instead. This allows us to avoid the try-finally block 
7704         and the boxing.
7705
7706 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7707
7708         * cs-parser.jay: Attributes cannot be applied to
7709                          namespaces. Fixes #40473
7710
7711 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7712
7713         * class.cs:
7714         (Add*): check if the name is valid using the full name for constants,
7715         fields, properties and events.
7716
7717 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7718
7719         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7720         char constants to be part of the enumeration.
7721
7722         * expression.cs (Conditional.DoResolve): Add support for operator
7723         true. Implements the missing functionality from 14.12
7724
7725         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7726         operator true/false as required by the spec.
7727
7728         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7729         implicit conversion to boolean.
7730
7731         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7732         also one where the type implements `operator true'. 
7733
7734         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7735         get an expression that will invoke operator true based on an
7736         expression.  
7737
7738         (GetConversionOperators): Removed the hack that called op_True
7739         here.  
7740
7741         (Expression.ResolveBoolean): Move this from Statement.
7742
7743 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7744
7745         * ecore.cs (FieldExpr): do not allow initialization of initonly
7746         fields on derived classes
7747
7748 2003-03-13  Martin Baulig  <martin@ximian.com>
7749
7750         * statement.cs (Block.Emit): Call ig.BeginScope() and
7751         ig.EndScope() when compiling with debugging info; call
7752         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7753
7754 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7755
7756         * expression.cs (Indexers): Do not construct immediately, allow
7757         for new members to be appended as we go.  Fixes 38143
7758
7759 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7760
7761         * expression.cs: save/restore context when resolving an unchecked
7762         expression.
7763
7764 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7765
7766         * cfold.cs: Catch division by zero in modulus operator during
7767         constant folding.
7768
7769 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7770
7771         * interface.cs (Interface.DefineMembers): Avoid defining members
7772         twice. 
7773
7774 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7775
7776         * driver.cs: handle the +/- options for -noconfig
7777
7778         * statement.cs (Unckeched.Resolve): Also track the state of
7779         unchecked in the Resolve phase.
7780
7781 2003-02-27  Martin Baulig  <martin@ximian.com>
7782
7783         * ecore.cs (Expression.MemberLookup): Don't create a
7784         MethodGroupExpr for something which is not a method.  Fixes #38291.
7785
7786 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7787
7788         * class.cs (MemberBase.CheckParameters): Also check that the type
7789         is unmanaged if it is a pointer.
7790
7791         * expression.cs (SizeOf.Resolve): Add location information.
7792
7793         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7794         a managed type is declared.
7795
7796         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7797         parameter modifiers as well.  Fixes bug 38606
7798
7799         * class.cs: Very sad.  Am backing out the speed up changes
7800         introduced by the ArrayList -> Array in the TypeContainer, as they
7801         were not actually that much faster, and introduced a bug (no error
7802         reports on duplicated methods).
7803
7804         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7805         source first, this will guarantee that we have a valid expression
7806         before calling in lower levels functions that will require a
7807         resolved object.  Then use this original_source in the
7808         target.ResolveLValue instead of the original source that was
7809         passed to us.
7810
7811         Another change.  Use target.Resolve instead of LValueResolve.
7812         Although we are resolving for LValues, we will let the Assign code
7813         take care of that (it will be called again from Resolve).  This
7814         basically allows code like this:
7815
7816         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7817         class Y { void A (X x) { x [0] += o; }
7818
7819         The problem was that the indexer was trying to resolve for
7820         set_Item (idx, object o) and never finding one.  The real set_Item
7821         was set_Item (idx, X).  By delaying the process we get the right
7822         semantics. 
7823
7824         Fixes bug 36505
7825
7826 2003-02-23  Martin Baulig  <martin@ximian.com>
7827
7828         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7829         while calling DoEmit ().
7830
7831         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7832         source files; if you use the #line directive inside a method, the
7833         compiler stops emitting line numbers for the debugger until it
7834         reaches the end of the method or another #line directive which
7835         restores the original file.
7836
7837 2003-02-23  Martin Baulig  <martin@ximian.com>
7838
7839         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7840
7841 2003-02-23  Martin Baulig  <martin@ximian.com>
7842
7843         * statement.cs (Block.AddChildVariableNames): We need to call this
7844         recursively, not just for our immediate children.
7845
7846 2003-02-23  Martin Baulig  <martin@ximian.com>
7847
7848         * class.cs (Event.Define): Always make the field private, like csc does.
7849
7850         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7851         actually work, fixes bug #37521.
7852
7853 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7854
7855         * delegate.cs: When creating the various temporary "Parameters"
7856         classes, make sure that we call the ComputeAndDefineParameterTypes
7857         on those new parameters (just like we do with the formal ones), to
7858         allow them to be resolved in the context of the DeclSpace.
7859
7860         This fixes the bug that Dick observed in Bugzilla #38530.
7861
7862 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7863
7864         * expression.cs (ResolveMemberAccess): When resolving a constant,
7865         do not attempt to pull a constant if the value was not able to
7866         generate a valid constant.
7867
7868         * const.cs (LookupConstantValue): Do not report more errors than required.
7869
7870 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7871
7872         * expression.cs: fixes bug #38328.
7873
7874 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7875
7876         * class.cs: Changed all the various members that can be part of a
7877         class from being an ArrayList to be an Array of the right type.
7878         During the DefineType type_list, interface_list, delegate_list and
7879         enum_list are turned into types, interfaces, delegates and enums
7880         arrays.  
7881
7882         And during the member population, indexer_list, event_list,
7883         constant_list, field_list, instance_constructor_list, method_list,
7884         operator_list and property_list are turned into their real arrays.
7885
7886         Although we could probably perform this operation earlier, for
7887         good error reporting we need to keep the lists and remove the
7888         lists for longer than required.
7889
7890         This optimization was triggered by Paolo profiling the compiler
7891         speed on the output of `gen-sample-program.pl' perl script. 
7892
7893         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7894         not crash in methods like MemberLookupFailed that use this field.  
7895
7896         This problem arises when the compiler fails to resolve a type
7897         during interface type definition for example.
7898
7899 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7900
7901         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7902         inherit from System.Object, so we have to stop at null, not only
7903         when reaching System.Object.
7904
7905 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7906
7907         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7908         DeclaredOnly because the parent indexer might have had a different
7909         name, but did not loop until the top of the hierarchy was reached.
7910
7911         The problem this one fixes is 35492: when a class implemented an
7912         indexer from an interface, we were getting the interface method
7913         (which was abstract) and we were flagging an error (can not invoke
7914         abstract method).
7915
7916         This also keeps bug 33089 functioning, and test-148 functioning.
7917
7918         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7919         out if a method is special is to see if it is declared in a
7920         property or event, or whether it is one of the predefined operator
7921         names.   This should fix correctly #36804.
7922
7923 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7924
7925         The goal here is to remove the dependency on EmptyCast.Peel ().
7926         Killing it completely.
7927
7928         The problem is that currently in a number of places where
7929         constants are expected, we have to "probe" for an EmptyCast, and
7930         Peel, which is not the correct thing to do, as this will be
7931         repetitive and will likely lead to errors. 
7932
7933         The idea is to remove any EmptyCasts that are used in casts that
7934         can be reduced to constants, so we only have to cope with
7935         constants. 
7936
7937         This bug hunt was triggered by Bug 37363 and the desire to remove
7938         the duplicate pattern where we were "peeling" emptycasts to check
7939         whether they were constants.  Now constants will always be
7940         constants.
7941
7942         * ecore.cs: Use an enumconstant here instead of wrapping with
7943         EmptyCast.  
7944
7945         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7946         throwing me off.  By handling this we can get rid of a few hacks.
7947
7948         * statement.cs (Switch): Removed Peel() code.
7949
7950 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7951
7952         * class.cs: Location information for error 508
7953
7954         * expression.cs (New.DoResolve): Add a guard against double
7955         resolution of an expression.  
7956
7957         The New DoResolve might be called twice when initializing field
7958         expressions (see EmitFieldInitializers, the call to
7959         GetInitializerExpression will perform a resolve on the expression,
7960         and later the assign will trigger another resolution
7961
7962         This leads to bugs (#37014)
7963
7964         * delegate.cs: The signature for EndInvoke should contain any ref
7965         or out parameters as well.  We were not doing this in the past. 
7966
7967         * class.cs (Field.Define): Do not overwrite the type definition
7968         inside the `volatile' group.  Turns out that volatile enumerations
7969         were changing the type here to perform a validity test, which
7970         broke conversions. 
7971
7972 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7973
7974         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7975         and structs, we do not want to load the instance variable
7976
7977         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7978         enum_type has to be handled like an object reference (implicit
7979         conversions exists from this to object), but the regular IsClass
7980         and IsValueType tests will never return true for this one.
7981
7982         Also we use TypeManager.IsValueType instead of type.IsValueType,
7983         just for consistency with the rest of the code (this is only
7984         needed if we ever use the construct exposed by test-180.cs inside
7985         corlib, which we dont today).
7986
7987 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7988
7989         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7990         just InternalCall.
7991
7992 2003-02-09  Martin Baulig  <martin@ximian.com>
7993
7994         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7995         (Namespace.DefineNamespaces): New static public method; this is
7996         called when we're compiling with debugging to add all namespaces
7997         to the symbol file.
7998
7999         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
8000         pass it to the Namespace's .ctor.
8001
8002         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
8003         and MethodBase arguments; pass the namespace ID to the symwriter;
8004         pass the MethodBase instead of the token to the symwriter.
8005         (SymbolWriter.DefineNamespace): New method to add a namespace to
8006         the symbol file.
8007
8008 2003-02-09  Martin Baulig  <martin@ximian.com>
8009
8010         * symbolwriter.cs: New file.  This is a wrapper around
8011         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
8012         methods here in near future.
8013
8014 2003-02-09  Martin Baulig  <martin@ximian.com>
8015
8016         * codegen.cs (EmitContext.Mark): Just pass the arguments to
8017         ILGenerator.MarkSequencePoint() which are actually used by the
8018         symbol writer.
8019
8020 2003-02-09  Martin Baulig  <martin@ximian.com>
8021
8022         * location.cs (SourceFile): New public sealed class.  This
8023         contains the name and an index which is used in the location's token.
8024         (Location): Reserve an appropriate number of bits in the token for
8025         the source file instead of walking over that list, this gives us a
8026         really huge performance improvement when compiling with debugging.
8027
8028         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
8029         `SourceFile' argument instead of a string.
8030         (Driver.ProcessFile): Add all the files via Location.AddFile(),
8031         but don't parse/tokenize here, we need to generate the list of all
8032         source files before we do that.
8033         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
8034         the files.
8035
8036         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
8037         instead of a string.
8038
8039         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
8040         of a string.
8041
8042 2003-02-09  Martin Baulig  <martin@ximian.com>
8043
8044         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
8045         filename on `#line default'.
8046
8047 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
8048
8049         * statement.cs: don't clear the pinned var when the fixed statement
8050         returns from the method (fixes bug#37752).
8051
8052 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
8053
8054         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
8055         to IsValueType.
8056
8057 2003-02-07  Martin Baulig  <martin@ximian.com>
8058
8059         * driver.cs: Removed the `--debug-args' command line argument.
8060
8061         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
8062         automatically by the AsssemblyBuilder.
8063         (CodeGen.InitializeSymbolWriter): We don't need to call any
8064         initialization function on the symbol writer anymore.  This method
8065         doesn't take any arguments.
8066
8067 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
8068
8069         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
8070         from referenced assemblies as well.
8071
8072 2003-02-02  Martin Baulig  <martin@ximian.com>
8073
8074         * class.cs (MethodData.Emit): Generate debugging info for external methods.
8075
8076 2003-02-02  Martin Baulig  <martin@ximian.com>
8077
8078         * class.cs (Constructor.Emit): Open the symbol writer before
8079         emitting the constructor initializer.
8080         (ConstructorInitializer.Emit): Call ec.Mark() to allow
8081         single-stepping through constructor initializers.
8082
8083 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
8084
8085         * class.cs: Handle error 549: do not allow virtual methods in
8086         sealed classes. 
8087
8088 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
8089
8090         * decl.cs: Check access levels when resolving types
8091
8092 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
8093
8094         * statement.cs: Add parameters and locals set in catch blocks that might 
8095         return to set vector
8096
8097 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
8098
8099         * class.cs (Operator): Set the SpecialName flags for operators.
8100
8101         * expression.cs (Invocation.DoResolve): Only block calls to
8102         accessors and operators on SpecialName methods.
8103
8104         (Cast.TryReduce): Handle conversions from char constants.
8105
8106
8107 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
8108
8109         * statement.cs: small memory and time optimization in FlowBranching.
8110
8111 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
8112
8113         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
8114         problem that the last fix but in the other sid (Set).
8115
8116         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
8117         access when there is no indexer in the hierarchy.
8118
8119 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
8120
8121         * class.cs: Combine some if statements.
8122
8123 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8124
8125         * driver.cs: fixed bug #37187.
8126
8127 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
8128
8129         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
8130         any indexer, it's needed to build a list with all the indexers in the
8131         hierarchy (AllGetters), else we have problems. Fixes #35653.
8132
8133 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
8134
8135         * class.cs (MethodData.Define): It is wrong for an interface
8136         implementation to be static in both cases: explicit and implicit.
8137         We were only handling this in one case.
8138
8139         Improve the if situation there to not have negations.
8140
8141         * class.cs (Field.Define): Turns out that we do not need to check
8142         the unsafe bit on field definition, only on usage.  Remove the test.
8143
8144 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8145
8146         * driver.cs: use assembly.Location instead of Codebase (the latest
8147         patch made mcs fail when using MS assemblies).
8148
8149 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
8150
8151         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
8152         get the path to *corlib.dll.
8153
8154 2003-01-21  Nick Drochak <ndrochak@gol.com>
8155
8156         * cs-tokenizer.cs:
8157         * pending.cs:
8158         * typemanager.cs: Remove compiler warnings
8159
8160 2003-01-20  Duncan Mak  <duncan@ximian.com>
8161
8162         * AssemblyInfo.cs: Bump the version number to 0.19.
8163
8164 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8165
8166         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
8167
8168 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
8169
8170         * class.cs (Constructor::Emit): Emit debugging info for constructors.
8171
8172 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
8173
8174         * cs-parser.jay: Small fix: we were not comparing the constructor
8175         name correctly.   Thanks to Zoltan for the initial pointer.
8176
8177 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
8178
8179         * cs-tokenizer.cs: Set file name when specified with #line
8180
8181 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
8182
8183         * cs-parser.jay: Only perform the constructor checks here if we
8184         are named like the class;  This will help provider a better
8185         error.  The constructor path is taken when a type definition is
8186         not found, but most likely the user forgot to add the type, so
8187         report that rather than the constructor error.
8188
8189 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
8190
8191         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
8192         allocations.
8193
8194 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8195
8196         * cs-parser.jay: Add cleanup call.
8197
8198 2003-01-13  Duncan Mak  <duncan@ximian.com>
8199
8200         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
8201         consistent with other methods.
8202
8203 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8204
8205         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
8206
8207 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
8208
8209         * attribute.cs: only set GuidAttr to true when we have a
8210         GuidAttribute.
8211
8212 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8213
8214         * ecore.cs:
8215         * expression.cs:
8216         * typemanager.cs: fixes to allow mcs compile corlib with the new
8217         Type.IsSubclassOf fix.
8218
8219 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
8220
8221         * expression.cs (LocalVariableReference.DoResolve): Classify a
8222         constant as a value, not as a variable.   Also, set the type for
8223         the variable.
8224
8225         * cs-parser.jay (fixed_statement): take a type instead of a
8226         pointer_type, so we can produce a better error message later.
8227
8228         * statement.cs (Fixed.Resolve): Flag types that are not pointers
8229         as an error.  
8230
8231         (For.DoEmit): Make inifinite loops have a
8232         non-conditional branch back.
8233
8234         (Fixed.DoEmit): First populate the pinned variables, then emit the
8235         statement, then clear the variables.  Before I was emitting the
8236         code once for each fixed piece.
8237
8238
8239 2003-01-08  Martin Baulig  <martin@ximian.com>
8240
8241         * statement.cs (FlowBranching.MergeChild): A break in a
8242         SWITCH_SECTION does not leave a loop.  Fixes #36155.
8243
8244 2003-01-08  Martin Baulig  <martin@ximian.com>
8245
8246         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
8247         lives in the same number space than `param_map'.  Fixes #36154.
8248
8249 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
8250
8251         * cs-parser.jay (constructor_declaration): Set the
8252         Constructor.ModFlags before probing for it.  This makes the
8253         compiler report 514, 515 and 132 (the code was there, but got
8254         broken). 
8255
8256         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
8257         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
8258         (GotoCase.Resolve): Set `Returns' to ALWAYS.
8259
8260 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
8261
8262         * enum.cs: create the enum static fields using the enum type.
8263
8264 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
8265
8266         * class.cs: don't try to create the ParamBuilder for the return
8267         type if it's not needed (and handle it breaking for the ms runtime
8268         anyway).
8269
8270 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
8271
8272         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
8273
8274 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
8275
8276         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
8277         the command.   This showed up while compiling the JANET source
8278         code, which used \r as its only newline separator.
8279
8280 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
8281
8282         * class.cs (Method.Define): If we are an operator (because it
8283         reuses our code), then set the SpecialName and HideBySig.  #36128
8284
8285 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
8286
8287         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
8288         exception, report error 120 `object reference required'.
8289
8290         * driver.cs: Add --pause option, used during to measure the size
8291         of the process as it goes with --timestamp.
8292
8293         * expression.cs (Invocation.DoResolve): Do not allow methods with
8294         SpecialName to be invoked.
8295
8296 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
8297
8298         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
8299         number before adding it.
8300
8301 2002-12-21  Ravi Pratap  <ravi@ximian.com>
8302
8303         * ecore.cs (StandardImplicitConversion): When in an unsafe
8304         context, we allow conversion between void * to any other pointer
8305         type. This fixes bug #35973.
8306
8307 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
8308
8309         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
8310         is not thrown when extensionless outputs are used 
8311
8312 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8313
8314         * rootcontext.cs: fixed compilation of corlib.
8315
8316 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
8317
8318         * attribute.cs (Attributes.Contains): Add new method.
8319
8320         * class.cs (MethodCore.LabelParameters): if the parameter is an
8321         `out' parameter, check that no attribute `[In]' has been passed.
8322
8323         * enum.cs: Handle the `value__' name in an enumeration.
8324
8325 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
8326
8327         * decl.cs: Added special case to allow overrides on "protected
8328         internal" methods
8329
8330 2002-12-18  Ravi Pratap  <ravi@ximian.com>
8331
8332         * attribute.cs (Attributes.AddAttributeSection): Rename to this
8333         since it makes much more sense.
8334
8335         (Attributes.ctor): Don't require a Location parameter.
8336
8337         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
8338
8339         * attribute.cs (ApplyAttributes): Remove extra Location parameters
8340         since we already have that information per attribute.
8341
8342         * everywhere : make appropriate changes.
8343
8344         * class.cs (LabelParameters): Write the code which actually
8345         applies attributes to the return type. We can't do this on the MS
8346         .NET runtime so we flag a warning in the case an exception is
8347         thrown.
8348
8349 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
8350
8351         * const.cs: Handle implicit null conversions here too.
8352
8353 2002-12-17  Ravi Pratap  <ravi@ximian.com>
8354
8355         * class.cs (MethodCore.LabelParameters): Remove the extra
8356         Type [] parameter since it is completely unnecessary. Instead
8357         pass in the method's attributes so that we can extract
8358         the "return" attribute.
8359
8360 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
8361
8362         * cs-parser.jay (parse): Use Report.Error to flag errors instead
8363         of ignoring it and letting the compile continue.
8364
8365         * typemanager.cs (ChangeType): use an extra argument to return an
8366         error condition instead of throwing an exception.
8367
8368 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
8369
8370         * expression.cs (Unary.TryReduce): mimic the code for the regular
8371         code path.  Perform an implicit cast in the cases where we can
8372         implicitly convert to one of the integral types, and then reduce
8373         based on that constant.   This fixes bug #35483.
8374
8375 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8376
8377         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
8378
8379 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8380
8381         * namespace.cs: fixed bug #35489.
8382
8383 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
8384
8385         * class.cs: Remove some dead code.
8386
8387         * cs-parser.jay: Estimate the number of methods needed
8388         (RootContext.MethodCount);
8389
8390         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
8391         numbers instead of StringBuilders.
8392
8393         * support.cs (PtrHashtable): Add constructor with initial size;
8394         We can now reduce reallocations of the method table.
8395
8396 2002-12-10  Ravi Pratap  <ravi@ximian.com>
8397
8398         * attribute.cs (ApplyAttributes): Keep track of the emitted
8399         attributes on a per-target basis. This fixes bug #35413.
8400
8401 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
8402
8403         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
8404         default to the Windows 1252 encoding.
8405
8406         (UnixParseOption): Support version, thanks to Alp for the missing
8407         pointer. 
8408
8409         * AssemblyInfo.cs: Add nice assembly information.
8410
8411         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
8412         (bug 35169).
8413
8414         * cs-parser.jay: Allow a trailing comma before the close bracked
8415         in the attribute_section production.
8416
8417         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
8418         address of the instance was being taken, I will take this out,
8419         because we take the address of the object immediately here.
8420
8421 2002-12-09  Ravi Pratap  <ravi@ximian.com>
8422
8423         * typemanager.cs (AreMultipleAllowed): Take care of the most
8424         obvious case where attribute type is not in the current assembly -
8425         stupid me ;-)
8426
8427 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
8428
8429         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
8430         definitions, instead of doing that afterwards.  
8431
8432         Also we use a nice little hack, depending on the constructor, we
8433         know if we are a "composed" name or a simple name.  Hence, we
8434         avoid the IndexOf test, and we avoid 
8435
8436         * codegen.cs: Add code to assist in a bug reporter to track down
8437         the source of a compiler crash. 
8438
8439 2002-12-07  Ravi Pratap  <ravi@ximian.com>
8440
8441         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
8442         types have been emitted for a given element and flag an error
8443         if something which does not have AllowMultiple set is used more
8444         than once.
8445
8446         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
8447         attribute types and their corresponding AllowMultiple properties
8448
8449         (AreMultipleAllowed): Check the property for a given type.
8450
8451         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
8452         property in the case we have a TypeContainer.
8453
8454         (Attributes.AddAttribute): Detect duplicates and just skip on
8455         adding them. This trivial fix catches a pretty gross error in our
8456         attribute emission - global attributes were being emitted twice!
8457
8458         Bugzilla bug #33187 is now fixed.
8459
8460 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
8461
8462         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
8463         instead of pp_and).
8464
8465         * expression.cs (Binary.ResolveOperator): I can only use the
8466         Concat (string, string, string) and Concat (string, string,
8467         string, string) if the child is actually a concatenation of
8468         strings. 
8469
8470 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
8471
8472         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
8473         context where we need a 2-character lookahead.
8474
8475         * pending.cs (PendingImplementation): Rework so we can keep track
8476         of interface types all the time, and flag those which were
8477         implemented by parents as optional.
8478
8479 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
8480
8481         * expression.cs (Binary.ResolveOperator): Use
8482         String.Concat(string,string,string) or
8483         String.Concat(string,string,string,string) when possible. 
8484
8485         * typemanager: More helper methods.
8486
8487
8488 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
8489
8490         * pending.cs: remove the bogus return from GetMissingInterfaces()
8491         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
8492
8493 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8494
8495         * namespace.cs: avoid duplicated 'using xxx' being added to
8496         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
8497         when we get more than one 'using' statement for the same namespace.
8498         Report a CS0105 warning for it.
8499
8500 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
8501
8502         * cs-tokenizer.cs (consume_identifier): use read directly, instead
8503         of calling getChar/putback, uses internal knowledge of it.    
8504
8505         (xtoken): Reorder tokenizer so most common patterns are checked
8506         first.  This reduces the compilation time in another 5% (from 8.11s
8507         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
8508
8509         The parsing time is 22% of the compilation in mcs, and from that
8510         64% is spent on the tokenization process.  
8511
8512         I tried using a binary search for keywords, but this is slower
8513         than the hashtable.  Another option would be to do a couple of
8514         things:
8515
8516                 * Not use a StringBuilder, instead use an array of chars,
8517                   with a set value.  Notice that this way we could catch
8518                   the 645 error without having to do it *afterwards*.
8519
8520                 * We could write a hand-parser to avoid the hashtable
8521                   compares altogether.
8522
8523         The identifier consumption process takes 37% of the tokenization
8524         time.  Another 15% is spent on is_number.  56% of the time spent
8525         on is_number is spent on Int64.Parse:
8526
8527                 * We could probably choose based on the string length to
8528                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
8529                   computations. 
8530
8531         Another 3% is spend on wrapping `xtoken' in the `token' function.
8532
8533         Handle 0xa0 as whitespace (#34752)
8534
8535 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
8536
8537         * typemanager.cs (IsCLRType): New routine to tell whether a type
8538         is one of the builtin types.  
8539
8540         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
8541         typecode in more places instead of doing pointer comparissions.
8542         We could leverage some knowledge about the way the typecodes are
8543         laid out.
8544
8545         New code to cache namespaces in assemblies, it is currently not
8546         invoked, to be used soon.
8547
8548         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
8549
8550         * expression.cs (Binary.ResolveOperator): specially handle
8551         strings, and do not perform user-defined operator overloading for
8552         built-in types.
8553
8554 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
8555
8556         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
8557         internalcall as it is a pretty simple operation;  Avoid whenever
8558         possible to call Char.IsLetter.
8559
8560         (consume_identifier): Cut by half the number of
8561         hashtable calls by merging the is_keyword and GetKeyword behavior.
8562
8563         Do not short-circuit, because if we do, we
8564         report errors (ie, #if false && true would produce an invalid
8565         directive error);
8566
8567
8568 2002-11-24  Martin Baulig  <martin@ximian.com>
8569
8570         * expression.cs (Cast.TryReduce): If we're in checked syntax,
8571         check constant ranges and report a CS0221.  Fixes #33186.
8572
8573 2002-11-24  Martin Baulig  <martin@ximian.com>
8574
8575         * cs-parser.jay: Make this work for uninitialized variable
8576         declarations in the `for' initializer.  Fixes #32416.
8577
8578 2002-11-24  Martin Baulig  <martin@ximian.com>
8579
8580         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
8581         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
8582
8583 2002-11-24  Martin Baulig  <martin@ximian.com>
8584
8585         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
8586         argument; if true, we also check for user-defined conversions.
8587         This is only needed if both arguments are of a user-defined type.
8588         Fixes #30443, added test-175.cs.
8589         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
8590
8591         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
8592
8593 2002-11-24  Martin Baulig  <martin@ximian.com>
8594
8595         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
8596         function to get the store opcode.
8597         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
8598         only emit the Ldelema if the store opcode is Stobj.  You must run
8599         both test-34 and test-167 to test this.  Fixes #34529.
8600
8601 2002-11-23  Martin Baulig  <martin@ximian.com>
8602
8603         * ecore.cs (Expression.MemberLookup): Added additional
8604         `qualifier_type' argument which is used when we're being called
8605         from MemberAccess.DoResolve() and null if we're called from a
8606         SimpleName lookup.
8607         (Expression.MemberLookupFailed): New method to report errors; this
8608         does the CS1540 check and reports the correct error message.
8609
8610         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
8611         argument for the CS1540 check and redone the way how we're dealing
8612         with private members.  See the comment in the source code for details.
8613         (FilterWithClosure): Reverted this back to revision 1.197; renamed
8614         `closure_start_type' to `closure_qualifier_type' and check whether
8615         it's not null.  It was not this filter being broken, it was just
8616         being called with the wrong arguments.
8617
8618         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
8619         and pass it the correct `qualifier_type'; this also does the error
8620         handling for us.
8621
8622 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
8623
8624         * expression.cs (Invocation.EmitParams): If the we are dealing
8625         with a non-built-in value type, load its address as well.
8626
8627         (ArrayCreation): Use a a pretty constant instead
8628         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8629         static initializers.  
8630
8631         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8632         because they are not really value types, just glorified integers. 
8633
8634         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8635
8636         * ecore.cs: Remove redundant code for enumerations, make them use
8637         the same code path as everything else, fixes the casting issue
8638         with enumerations in Windows.Forms.
8639
8640         * attribute.cs: Do only cast to string if it is a string, the
8641         validation happens later.
8642
8643         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8644         people upgrade their corlibs.
8645
8646         * ecore.cs: Oops, enumerations were not following the entire code path
8647
8648 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8649
8650         * typemanager.cs (FilterWithClosure): Commented out the test for
8651         1540 in typemanager.cs, as it has problems when accessing
8652         protected methods from a parent class (see test-174.cs). 
8653
8654         * attribute.cs (Attribute.ValidateGuid): new method.
8655         (Attribute.Resolve): Use above.
8656
8657 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8658
8659         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8660
8661         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8662         handling for enumerations, as we only needed the TypeContainer
8663         functionality to begin with (this is required for the fix below to
8664         work for enums that reference constants in a container class for
8665         example). 
8666
8667         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8668
8669         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8670         a valid TypeBuilder to perform lookups on.o
8671
8672         * class.cs (InheritableMemberSignatureCompare): Use true in the
8673         call to GetGetMethod and GetSetMethod, because we are comparing
8674         the signature, and we need to get the methods *even* if they are
8675         private. 
8676
8677         (PropertyBase.CheckBase): ditto.
8678
8679         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8680         GotoCase.Resolve): Use Peel on EmpytCasts.
8681
8682         * ecore.cs (EmptyCast): drop child, add Peel method.
8683
8684 2002-11-17  Martin Baulig  <martin@ximian.com>
8685
8686         * ecore.cs (EmptyCast.Child): New public property.
8687
8688         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8689         label resolved to an EmptyCast.  Fixes #34162.
8690         (GotoCase.Resolve): Likewise.
8691         (Block.EmitMeta): Likewise.
8692
8693 2002-11-17  Martin Baulig  <martin@ximian.com>
8694
8695         * expression.cs (Invocation.BetterConversion): Prefer int over
8696         uint; short over ushort; long over ulong for integer literals.
8697         Use ImplicitConversionExists instead of StandardConversionExists
8698         since we also need to check for user-defined implicit conversions.
8699         Fixes #34165.  Added test-173.cs.
8700
8701 2002-11-16  Martin Baulig  <martin@ximian.com>
8702
8703         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8704         with the `true' and `false' literals.  Fixes #33151.
8705
8706 2002-11-16  Martin Baulig  <martin@ximian.com>
8707
8708         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8709         October 22nd; don't do the cs1540 check for static members.
8710
8711         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8712         now using our own filter here and doing the cs1540 check again.
8713
8714 2002-11-16  Martin Baulig  <martin@ximian.com>
8715
8716         * support.cs (InternalParameters): Don't crash if we don't have
8717         any fixed parameters.  Fixes #33532.
8718
8719 2002-11-16  Martin Baulig  <martin@ximian.com>
8720
8721         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8722         when looking up static methods to make this work on Windows.
8723         Fixes #33773.
8724
8725 2002-11-16  Martin Baulig  <martin@ximian.com>
8726
8727         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8728         a setter rather than using PropertyInfo.CanWrite.
8729
8730 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8731
8732         * class.cs: Allow acces to block member by subclasses. Fixes build
8733         breaker.
8734
8735 2002-11-14  Martin Baulig  <martin@ximian.com>
8736
8737         * class.cs (Constructor.Emit): Added the extern/block check.
8738         Fixes bug #33678.
8739
8740 2002-11-14  Martin Baulig  <martin@ximian.com>
8741
8742         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8743         iteration while looking for indexers, this is needed because the
8744         indexer may have a different name in our base classes.  Fixed the
8745         error reporting (no indexers at all, not get accessor, no
8746         overloaded match).  Fixes bug #33089.
8747         (IndexerAccess.DoResolveLValue): Likewise.
8748
8749 2002-11-14  Martin Baulig  <martin@ximian.com>
8750
8751         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8752         indexers.  Fixes the first part of bug #33089.
8753         (MethodSignature.InheritableMemberSignatureCompare): Added support
8754         for properties.
8755
8756 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8757
8758         * attribute.cs (Attribute.Resolve): Catch the
8759         NullReferenceException and report it since it isn't supposed to
8760         happen. 
8761
8762 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8763
8764         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8765         LogicalOr and LogicalAnd that can benefit from recursively
8766         handling EmitBranchable.  The code now should be nice for Paolo.
8767
8768 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8769
8770         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8771         the Type lookups, as we perform quite a number of lookups on
8772         non-Types.  This can be removed once we can deterministically tell
8773         whether we have a type or a namespace in advance.
8774
8775         But this might require special hacks from our corlib.
8776
8777         * TODO: updated.
8778
8779         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8780         and double which avoids a conversion from an integer to a double.
8781
8782         * expression.cs: tiny optimization, avoid calling IsConstant,
8783         because it effectively performs the lookup twice.
8784
8785 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8786
8787         But a bogus return here to keep the semantics of the old code
8788         until the Mono runtime is fixed.
8789
8790         * pending.cs (GetMissingInterfaces): New method used to remove all
8791         the interfaces that are already implemented by our parent
8792         classes from the list of pending methods. 
8793
8794         * interface.cs: Add checks for calls after ResolveTypeExpr.
8795
8796 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8797
8798         * class.cs (Class.Emit): Report warning 67: event not used if the
8799         warning level is beyond 3.
8800
8801         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8802         being a NullLiteral.
8803
8804         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8805         specifiers. 
8806
8807         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8808         path that might fail if a type can not be resolved.
8809
8810         * expression.cs (Binary.Emit): Emit unsigned versions of the
8811         operators. 
8812
8813         * driver.cs: use error 5.
8814
8815 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8816
8817         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8818
8819 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8820
8821         * cs-parser.jay (switch_section): A beautiful patch from Martin
8822         Baulig that fixed 33094.
8823
8824 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8825
8826         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8827         Check whether the base is abstract and report an error if so.
8828
8829         * expression.cs (IndexerAccess.DoResolveLValue,
8830         IndexerAccess.DoResolve): ditto. 
8831
8832         (Invocation.DoResolve): ditto.
8833
8834         (Invocation.FullMethodDesc): Improve the report string.
8835
8836         * statement.cs (Block): Eliminate IsVariableDefined as it is
8837         basically just a wrapper for GetVariableInfo.
8838
8839         * ecore.cs (SimpleName): Use new 
8840
8841         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8842         type, as we return the actual parameter ref/unref state on a
8843         different call.
8844
8845 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8846
8847         * support.cs: Return proper flags REF/OUT fixing the previous
8848         commit.  
8849
8850         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8851         not used to mean `ref' but `ref or out' in ParameterReference
8852
8853         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8854         full type signature instead of calling TypeManger.CSharpName
8855         ourselves. 
8856
8857         * support.cs (InternalParameters.ParameterDesc): Do not compare
8858         directly to the modflags, because REF/OUT will actually be bitsets
8859         if set. 
8860
8861         * delegate.cs (VerifyMethod): Check also the modifiers.
8862
8863         * cs-tokenizer.cs: Fix bug where floating point values with an
8864         exponent where a sign was missing was ignored.
8865
8866         * driver.cs: Allow multiple assemblies to be specified in a single
8867         /r: argument
8868
8869 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8870
8871         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8872         because identifiers after a parenthesis would end up in this kind
8873         of production, and we needed to desamiguate it for having casts
8874         like:
8875
8876                 (UserDefinedType *) xxx
8877
8878 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8879
8880         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8881         we should set on the Bindingflags.NonPublic, but not turn on
8882         private_ok.  private_ok controls whether a Private member is
8883         returned (this is chekced on the filter routine), while the
8884         BindingFlags.NonPublic just controls whether private/protected
8885         will be allowed.   This fixes the problem part of the problem of
8886         private properties being allowed to be used in derived classes.
8887
8888         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8889         so we can call the children DoResolveLValue method (this will
8890         properly signal errors on lvalue assignments to base properties)
8891
8892         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8893         getter are null, and we have a property info, we know that this
8894         happened because the lookup failed, so we report an error 122 for
8895         protection level violation.
8896
8897         We also silently return if setter and getter are null in the
8898         resolve functions, this condition only happens if we have flagged
8899         the error before.  This is the other half of the problem. 
8900
8901         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8902         not have accessibility information, that is why we were returning
8903         true in the filter function in typemanager.cs.
8904
8905         To properly report 122 (property is inaccessible because of its
8906         protection level) correctly, we report this error in ResolveAccess
8907         by failing if both the setter and the getter are lacking (ie, the
8908         lookup failed). 
8909
8910         DoResolve and DoLResolve have been modified to check for both
8911         setter/getter being null and returning silently, the reason being
8912         that I did not want to put the knowledge about this error in upper
8913         layers, like:
8914
8915         int old = Report.Errors;
8916         x = new PropertyExpr (...);
8917         if (old != Report.Errors)
8918                 return null;
8919         else
8920                 return x;
8921
8922         So the property expr is returned, but it is invalid, so the error
8923         will be flagged during the resolve process. 
8924
8925         * class.cs: Remove InheritablePropertySignatureCompare from the
8926         class, as we no longer depend on the property signature to compute
8927         whether it is possible to implement a method or not.
8928
8929         The reason is that calling PropertyInfo.GetGetMethod will return
8930         null (in .NET, in Mono it works, and we should change this), in
8931         cases where the Get Method does not exist in that particular
8932         class.
8933
8934         So this code:
8935
8936         class X { public virtual int A { get { return 1; } } }
8937         class Y : X { }
8938         class Z : Y { public override int A { get { return 2; } } }
8939
8940         Would fail in Z because the parent (Y) would not have the property
8941         defined.  So we avoid this completely now (because the alternative
8942         fix was ugly and slow), and we now depend exclusively on the
8943         method names.
8944
8945         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8946         reference method, instead of using the property.
8947
8948         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8949         routines are gone now.
8950
8951         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8952         names, they were incorrectly named.
8953
8954         * cs-tokenizer.cs: Return are more gentle token on failure. 
8955
8956         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8957         had an out-of-sync index variable, which caused it to remove from
8958         the list of pending methods the wrong method sometimes.
8959
8960 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8961
8962         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8963         CanWrite, because those refer to this particular instance of the
8964         property, and do not take into account the fact that we can
8965         override single members of a property.
8966
8967         Constructor requires an EmitContext.  The resolution process does
8968         not happen here, but we need to compute the accessors before,
8969         because the resolution does not always happen for properties.
8970
8971         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8972         subclass, before we did not update this flag, but we did update
8973         bindingflags. 
8974
8975         (GetAccessors): Drop this routine, as it did not work in the
8976         presence of partially overwritten set/get methods. 
8977
8978         Notice that this broke the cs1540 detection, but that will require
8979         more thinking. 
8980
8981 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8982
8983         * class.cs:
8984         * codegen.cs:
8985         * driver.cs: issue a warning instead of an error if we don't support
8986         debugging for the platform. Also ignore a couple of errors that may
8987         arise when trying to write the symbols. Undo my previous patch.
8988
8989 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8990
8991         * driver.cs: ignore /debug switch except for Unix platforms.
8992
8993 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8994
8995         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8996
8997 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8998
8999         * driver.cs: Do not make mcs-debug conditional, so we do not break
9000         builds that use it.
9001
9002         * statement.cs (UsageVector.MergeChildren): I would like Martin to
9003         review this patch.  But basically after all the children variables
9004         have been merged, the value of "Breaks" was not being set to
9005         new_breaks for Switch blocks.  I think that it should be set after
9006         it has executed.  Currently I set this to the value of new_breaks,
9007         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
9008         conservative, but I do not understand this code very well.
9009
9010         I did not break anything in the build, so that is good ;-)
9011
9012         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
9013
9014 2002-10-20  Mark Crichton  <crichton@gimp.org>
9015
9016         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
9017
9018 2002-10-20  Nick Drochak  <ndrochak@gol.com>
9019
9020         * cfold.cs: Fixed compile blocker.
9021
9022 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
9023
9024         * driver.cs: I was chekcing the key, not the file.
9025
9026 2002-10-19  Ravi Pratap  <ravi@ximian.com>
9027
9028         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
9029         message that we were generating - we just need to silently return
9030         a null.
9031
9032 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
9033
9034         * class.cs (Event.Define): Change my previous commit, as this
9035         breaks the debugger.  This is a temporary hack, as it seems like
9036         the compiler is generating events incorrectly to begin with.
9037
9038         * expression.cs (Binary.ResolveOperator): Added support for 
9039         "U operator - (E x, E y)"
9040
9041         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
9042         y)".
9043
9044         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
9045         init-only variables, but this path did not take into account that
9046         there might be also instance readonly variables.  Correct this
9047         problem. 
9048
9049         This fixes bug 32253
9050
9051         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
9052         delegates as well.
9053
9054         * driver.cs: Change the extension for modules to `netmodule'
9055
9056         * cs-parser.jay: Improved slightly the location tracking for
9057         the debugger symbols.
9058
9059         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
9060         modifiers that were specified instead of the hardcoded value
9061         (FamAndAssem).  This was basically ignoring the static modifier,
9062         and others.  Fixes 32429.
9063
9064         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
9065         fixed a bug in the process (32476)
9066
9067         * expression.cs (ArrayAccess.EmitAssign): Patch from
9068         hwang_rob@yahoo.ca that fixes bug 31834.3
9069
9070 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
9071
9072         * driver.cs: Make the module extension .netmodule.
9073
9074 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
9075
9076         * driver.cs: Report an error if the resource file is not found
9077         instead of crashing.
9078
9079         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
9080         false, like Emit does.
9081
9082 2002-10-16  Nick Drochak  <ndrochak@gol.com>
9083
9084         * typemanager.cs: Remove unused private member.  Also reported mcs
9085         bug to report this as a warning like csc.
9086
9087 2002-10-15  Martin Baulig  <martin@gnome.org>
9088
9089         * statement.cs (Statement.Emit): Made this a virtual method; emits
9090         the line number info and calls DoEmit().
9091         (Statement.DoEmit): New protected abstract method, formerly knows
9092         as Statement.Emit().
9093
9094         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
9095
9096 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
9097
9098         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
9099         have fixed a remaining problem: not every AddXXXX was adding a
9100         fully qualified name.  
9101
9102         Now everyone registers a fully qualified name in the DeclSpace as
9103         being defined instead of the partial name.  
9104
9105         Downsides: we are slower than we need to be due to the excess
9106         copies and the names being registered this way.  
9107
9108         The reason for this is that we currently depend (on the corlib
9109         bootstrap for instance) that types are fully qualified, because
9110         we dump all the types in the namespace, and we should really have
9111         types inserted into the proper namespace, so we can only store the
9112         basenames in the defined_names array.
9113
9114 2002-10-10  Martin Baulig  <martin@gnome.org>
9115
9116         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
9117         from bug #31834, see the bug report for a testcase which is
9118         miscompiled.
9119
9120 2002-10-10  Martin Baulig  <martin@gnome.org>
9121
9122         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
9123         flow analysis code for this.
9124
9125         * statement.cs (Do, While, For): Tell the flow analysis code about
9126         infinite loops.
9127         (FlowBranching.UsageVector): Added support for infinite loops.
9128         (Block.Resolve): Moved the dead code elimination here and use flow
9129         analysis to do it.
9130
9131 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
9132
9133         * class.cs (Field.Define): Catch cycles on struct type
9134         definitions. 
9135
9136         * typemanager.cs (IsUnmanagedtype): Do not recursively check
9137         fields if the fields are static.  We only need to check instance
9138         fields. 
9139
9140         * expression.cs (As.DoResolve): Test for reference type.
9141
9142         * statement.cs (Using.ResolveExpression): Use
9143         ConvertImplicitRequired, not ConvertImplicit which reports an
9144         error on failture
9145         (Using.ResolveLocalVariableDecls): ditto.
9146
9147         * expression.cs (Binary.ResolveOperator): Report errors in a few
9148         places where we had to.
9149
9150         * typemanager.cs (IsUnmanagedtype): Finish implementation.
9151
9152 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
9153
9154         * expression.cs: Use StoreFromPtr instead of extracting the type
9155         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
9156
9157         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
9158         an enumeration value to a System.Enum, but System.Enum is not a
9159         value type, but an class type, so we need to box.
9160
9161         (Expression.ConvertExplicit): One codepath could return
9162         errors but not flag them.  Fix this.  Fixes #31853
9163
9164         * parameter.cs (Resolve): Do not allow void as a parameter type.
9165
9166 2002-10-06  Martin Baulig  <martin@gnome.org>
9167
9168         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
9169         if it's a class type and not a struct.  Fixes #31815.
9170
9171 2002-10-06  Martin Baulig  <martin@gnome.org>
9172
9173         * statement.cs: Reworked the flow analysis code a bit to make it
9174         usable for dead code elimination.
9175
9176 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9177
9178         * cs-parser.jay: allow empty source files. Fixes bug #31781.
9179
9180 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9181
9182         * expression.cs (ComposedCast.DoResolveType): A quick workaround
9183         to fix the test 165, will investigate deeper.
9184
9185 2002-10-04  Martin Baulig  <martin@gnome.org>
9186
9187         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
9188         finally blocks actually work.
9189         (Try.Resolve): We don't need to create a sibling for `finally' if
9190         there is no finally block.
9191
9192 2002-10-04  Martin Baulig  <martin@gnome.org>
9193
9194         * class.cs (Constructor.Define): The default accessibility for a
9195         non-default constructor is private, not public.
9196
9197 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9198
9199         * class.cs (Constructor): Make AllowedModifiers public, add
9200         EXTERN.
9201
9202         * cs-parser.jay: Perform the modifiers test here, as the
9203         constructor for the Constructor class usually receives a zero
9204         because of the way we create it (first we create, later we
9205         customize, and we were never checking the modifiers).
9206
9207         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
9208         is a version of LookupTypeReflection that includes the type-name
9209         cache.  This can be used as a fast path for functions that know
9210         the fully qualified name and are only calling into *.GetType() to
9211         obtain a composed type.
9212
9213         This is also used by TypeManager.LookupType during its type
9214         composition.
9215
9216         (LookupType): We now also track the real type name, as sometimes
9217         we can get a quey for the real type name from things like
9218         ComposedCast.  This fixes bug 31422.
9219
9220         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
9221         complete type fullname, it does not have to go through the type
9222         resolution system to obtain the composed version of the type (for
9223         obtaining arrays or pointers).
9224
9225         (Conditional.Emit): Use the EmitBoolExpression to
9226         generate nicer code, as requested by Paolo.
9227
9228         (ArrayCreation.CheckIndices): Use the patch from
9229         hwang_rob@yahoo.ca to validate the array initializers. 
9230
9231 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
9232
9233         * class.cs (ConstructorInitializer.Emit): simplify code by using
9234         Invocation.EmitCall, and at the same time, fix the bugs in calling
9235         parent constructors that took variable arguments. 
9236
9237         * ecore.cs (Expression.ConvertNumericExplicit,
9238         Expression.ImplicitNumericConversion): Remove the code that
9239         manually wrapped decimal (InternalTypeConstructor call is now gone
9240         as well).
9241
9242         * expression.cs (Cast.TryReduce): Also handle decimal types when
9243         trying to perform a constant fold on the type.
9244
9245         * typemanager.cs (IsUnmanagedtype): Partially implemented.
9246
9247         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
9248         that only turned off an error report, and did nothing else. 
9249
9250 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
9251
9252         * driver.cs: Handle and ignore /fullpaths
9253
9254 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
9255
9256         * expression.cs (Binary.ResolveOperator): Catch the case where
9257         DoNumericPromotions returns true, 
9258
9259         (Binary.DoNumericPromotions): Simplify the code, and the tests.
9260
9261 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
9262
9263         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
9264         report error 70.
9265
9266 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
9267
9268         * ecore.cs (ConvertNumericExplicit): It is not enough that the
9269         conversion exists, but it is also required that the conversion be
9270         performed.  This manifested in "(Type64Enum) 2".  
9271
9272         * class.cs (TypeManager.AddMethod): The fix is not to change
9273         AddEnum, because that one was using a fully qualified name (every
9274         DeclSpace derivative does), but to change the AddMethod routine
9275         that was using an un-namespaced name.  This now correctly reports
9276         the duplicated name.
9277
9278         Revert patch until I can properly fix it.  The issue
9279         is that we have a shared Type space across all namespaces
9280         currently, which is wrong.
9281
9282         Options include making the Namespace a DeclSpace, and merge
9283         current_namespace/current_container in the parser.
9284
9285 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
9286
9287         * cs-parser.jay: Improve error reporting when we get a different
9288         kind of expression in local_variable_type and
9289         local_variable_pointer_type. 
9290
9291         Propagate this to avoid missleading errors being reported.
9292
9293         * ecore.cs (ImplicitReferenceConversion): treat
9294         TypeManager.value_type as a target just like object_type.   As
9295         code like this:
9296
9297         ValueType v = 1;
9298
9299         Is valid, and needs to result in the int 1 being boxed before it
9300         is assigned to the value type v.
9301
9302         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
9303         to validate the enumeration name.
9304
9305         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
9306         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
9307         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
9308
9309         * ecore.cs (TryImplicitIntConversion): When doing an
9310         implicit-enumeration-conversion, check if the type is 64-bits and
9311         perform a conversion before passing to EnumConstant.
9312
9313 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
9314
9315         * decl.cs (Error_AmbiguousTypeReference); New routine used to
9316         report ambiguous type references.  Unlike the MS version, we
9317         report what the ambiguity is.   Innovation at work ;-)
9318
9319         (DeclSpace.FindType): Require a location argument to
9320         display when we display an ambiguous error.
9321
9322         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
9323
9324         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
9325
9326         * expression.cs (EmitDynamicInitializers): Apply patch from
9327         hwang_rob@yahoo.ca that fixes the order in which we emit our
9328         initializers. 
9329
9330 2002-09-21  Martin Baulig  <martin@gnome.org>
9331
9332         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
9333         delegate takes no arguments.
9334
9335 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
9336
9337         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
9338         from integers.
9339
9340         * expression.cs: Extract the underlying type.
9341
9342         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
9343
9344         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
9345
9346 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
9347
9348         * class.cs (TypeContainer.DefineType): We can not use the nice
9349         PackingSize with the size set to 1 DefineType method, because it
9350         will not allow us to define the interfaces that the struct
9351         implements.
9352
9353         This completes the fixing of bug 27287
9354
9355         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
9356         means also structs.  This fixes part of the problem. 
9357         (Expresion.ImplicitReferenceConversionExists): ditto.
9358
9359         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
9360         error if there were no errors reported during the type lookup
9361         process, to avoid duplicates or redundant errors.  Without this
9362         you would get an ambiguous errors plus a type not found.  We have
9363         beaten the user enough with the first error.  
9364
9365         (DeclSparce.FindType): Emit a warning if we have an ambiguous
9366         reference. 
9367
9368         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
9369         during the resolution process, stop the lookup, this avoids
9370         repeated error reports (same error twice).
9371
9372         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
9373
9374         * typemanager.cs (LookupType): Redo the type lookup code to match
9375         the needs of System.Reflection.  
9376
9377         The issue is that System.Reflection requires references to nested
9378         types to begin with a "+" sign instead of a dot.  So toplevel
9379         types look like: "NameSpace.TopLevelClass", and nested ones look
9380         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
9381         levels. 
9382
9383 2002-09-19  Martin Baulig  <martin@gnome.org>
9384
9385         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
9386         says that a method always returns or always throws an exception,
9387         don't report the CS0161.
9388
9389         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
9390         set `Returns = new_returns'.
9391
9392 2002-09-19  Martin Baulig  <martin@gnome.org>
9393
9394         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
9395         to an enum constant, check for a CS0176.
9396
9397 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
9398
9399         * class.cs (TypeContainer.CheckPairedOperators): Now we check
9400         for operators that must be in pairs and report errors.
9401
9402         * ecore.cs (SimpleName.DoResolveType): During the initial type
9403         resolution process, when we define types recursively, we must
9404         check first for types in our current scope before we perform
9405         lookups in the enclosing scopes.
9406
9407         * expression.cs (MakeByteBlob): Handle Decimal blobs.
9408
9409         (Invocation.VerifyArgumentsCompat): Call
9410         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
9411         I thought we were supposed to always call this, but there are a
9412         few places in the code where we dont do it.
9413
9414 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
9415
9416         * driver.cs: Add support in -linkres and -resource to specify the
9417         name of the identifier.
9418
9419 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9420
9421         * ecore.cs (StandardConversionExists): Sync with the conversion
9422         code: allow anything-* to void* conversions.
9423
9424         (FindMostSpecificSource): Use an Expression argument
9425         instead of a Type, because we might be handed over a Literal which
9426         gets a few more implicit conversions that plain types do not.  So
9427         this information was being lost.
9428
9429         Also, we drop the temporary type-holder expression when not
9430         required.
9431
9432 2002-09-17  Martin Baulig  <martin@gnome.org>
9433
9434         * class.cs (PropertyBase.CheckBase): Don't check the base class if
9435         this is an explicit interface implementation.
9436
9437 2002-09-17  Martin Baulig  <martin@gnome.org>
9438
9439         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
9440         different `IndexerName' attributes.
9441
9442         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
9443         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
9444         virtual CommonResolve().
9445
9446 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9447
9448         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
9449         and convert that to the UnderlyingType.
9450
9451         * statement.cs (Foreach.Resolve): Indexers are just like variables
9452         or PropertyAccesses.
9453
9454         * cs-tokenizer.cs (consume_string): Track line numbers and columns
9455         inside quoted strings, we were not doing this before.
9456
9457 2002-09-16  Martin Baulig  <martin@gnome.org>
9458
9459         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
9460         resolve it.  This is needed for the definite assignment check of the
9461         instance expression, fixes bug #29846.
9462         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
9463
9464 2002-09-16  Nick Drochak  <ndrochak@gol.com>
9465
9466         * parameter.cs: Fix compile error.  Cannot reference static member
9467         from an instance object.  Is this an mcs bug?
9468
9469 2002-09-14  Martin Baulig  <martin@gnome.org>
9470
9471         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
9472         multiple times.  Fixes bug #30295, added test-166.cs.
9473
9474 2002-09-14  Martin Baulig  <martin@gnome.org>
9475
9476         * statement.cs (Block.Emit): Don't emit unreachable code.
9477         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
9478         `break' statements.
9479         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
9480
9481 2002-09-14  Martin Baulig  <martin@gnome.org>
9482
9483         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
9484         is set.
9485
9486 2002-09-14  Martin Baulig  <martin@gnome.org>
9487
9488         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
9489         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
9490         be false on the ms runtime.
9491
9492 2002-09-13  Martin Baulig  <martin@gnome.org>
9493
9494         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
9495         the CS0038 error message.
9496
9497 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
9498
9499         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
9500         constant inside, return it.
9501
9502 2002-09-12  Martin Baulig  <martin@gnome.org>
9503
9504         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
9505         implicit conversion can be done between enum types.
9506
9507         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
9508         check whether an implicit conversion to the current enum's UnderlyingType
9509         exists and report an error if not.
9510
9511         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
9512         without debugging support.
9513
9514         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
9515         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
9516
9517 2002-09-12  Martin Baulig  <martin@gnome.org>
9518
9519         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
9520
9521         * ecore.cs (IMemberExpr.DeclaringType): New property.
9522         (SimpleName.SimpleNameResolve): Check whether we're accessing a
9523         nonstatic member of an outer type (CS0038).
9524
9525 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
9526
9527         * driver.cs: Activate the using-error detector at warning level
9528         4 (at least for MS-compatible APIs).
9529
9530         * namespace.cs (VerifyUsing): Small buglett fix.
9531
9532         * pending.cs (PendingImplementation): pass the container pointer. 
9533
9534         * interface.cs (GetMethods): Allow for recursive definition.  Long
9535         term, I would like to move every type to support recursive
9536         definitions, not the current ordering mechanism that we have right
9537         now.
9538
9539         The situation is this: Attributes are handled before interfaces,
9540         so we can apply attributes to interfaces.  But some attributes
9541         implement interfaces, we will now handle the simple cases
9542         (recursive definitions will just get an error).  
9543
9544         * parameter.cs: Only invalidate types at the end if we fail to
9545         lookup all types.  
9546
9547 2002-09-09  Martin Baulig  <martin@gnome.org>
9548
9549         * ecore.cs (PropertyExpr.Emit): Also check for
9550         TypeManager.system_int_array_get_length so this'll also work when
9551         compiling corlib.  Fixes #30003.
9552
9553 2002-09-09  Martin Baulig  <martin@gnome.org>
9554
9555         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
9556         and throw an exception if we can't get the type's size.  Fixed #30040,
9557         added test-165.cs.
9558
9559 2002-09-09  Martin Baulig  <martin@gnome.org>
9560
9561         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
9562
9563         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
9564         context.  Fixes bug #30027.
9565
9566         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
9567         virtual functions.  Fixes bug #30043, added test-164.cs.
9568
9569 2002-09-08  Ravi Pratap  <ravi@ximian.com>
9570
9571         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
9572
9573 2002-09-08  Nick Drochak  <ndrochak@gol.com>
9574
9575         * driver.cs: Use an object to get the windows codepage since it's not a
9576         static property.
9577
9578 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
9579
9580         * statement.cs (For.Emit): for infinite loops (test == null)
9581         return whether there is a break inside, not always "true".
9582
9583         * namespace.cs (UsingEntry): New struct to hold the name of the
9584         using definition, the location where it is defined, and whether it
9585         has been used in a successful type lookup.
9586
9587         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
9588         strings.
9589
9590         * decl.cs: ditto.
9591
9592 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9593
9594         * attribute.cs : Fix incorrect code which relied on catching
9595         a NullReferenceException to detect a null being passed in
9596         where an object was expected.
9597
9598 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
9599
9600         * statement.cs (Try): flag the catch variable as assigned
9601
9602         * expression.cs (Cast): Simplified by using ResolveType instead of
9603         manually resolving.
9604
9605         * statement.cs (Catch): Fix bug by using ResolveType.
9606
9607 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9608
9609         * expression.cs (BetterConversion): Special case for when we have
9610         a NullLiteral as the argument and we have to choose between string
9611         and object types - we choose string the way csc does.
9612
9613         * attribute.cs (Attribute.Resolve): Catch the
9614         NullReferenceException and report error #182 since the Mono
9615         runtime no more has the bug and having this exception raised means
9616         we tried to select a constructor which takes an object and is
9617         passed a null.
9618
9619 2002-09-05  Ravi Pratap  <ravi@ximian.com>
9620
9621         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
9622         message (1502, 1503) when we can't locate a method after overload
9623         resolution. This is much more informative and closes the bug
9624         Miguel reported.
9625
9626         * interface.cs (PopulateMethod): Return if there are no argument
9627         types. Fixes a NullReferenceException bug.
9628
9629         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9630         expressions too. Previously we were checking only in one place for
9631         positional arguments leaving out named arguments.
9632
9633         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9634         type to the enum type is not allowed. Remove code corresponding to
9635         that.
9636
9637         (ConvertNumericExplicit): Allow explicit conversions from
9638         the underlying type to enum type. This precisely follows the spec
9639         and closes a bug filed by Gonzalo.
9640
9641 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9642
9643         * compiler.csproj:
9644         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9645
9646 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9647
9648         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9649         it was important that we stored the right value after the
9650         reduction in `converted'.
9651
9652 2002-09-04  Martin Baulig  <martin@gnome.org>
9653
9654         * location.cs (Location.SymbolDocument): Use full pathnames for the
9655         source files.
9656
9657 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9658
9659         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9660         of the expression resolve mechanism, because that will catch the
9661         SimpleName error failures.
9662
9663         (Conditional): If we can not resolve the
9664         expression, return, do not crash.
9665
9666 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9667
9668         * cs-tokenizer.cs:
9669         (location): display token name instead of its number.
9670
9671 2002-08-28  Martin Baulig  <martin@gnome.org>
9672
9673         * expression.cs (Binary.ResolveOperator): Don't silently return
9674         but return an error if an operator cannot be applied between two
9675         enum types.
9676
9677 2002-08-28  Martin Baulig  <martin@gnome.org>
9678
9679         * class.cs (Constructor.Define): Set the permission attributes
9680         correctly instead of making all constructors public.
9681
9682 2002-08-28  Martin Baulig  <martin@gnome.org>
9683
9684         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9685         for private members before reporting a CS0103; if we find anything,
9686         it's a CS0122.
9687
9688 2002-08-28  Martin Baulig  <martin@gnome.org>
9689
9690         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9691         to check whether `closure_start_type == closure_invocation_type',
9692         we also need to check whether `m.DeclaringType == closure_invocation_type'
9693         before bypassing the permission checks.  We might be accessing
9694         protected/private members from the base class.
9695         (TypeManager.RealMemberLookup): Only set private_ok if private
9696         members were requested via BindingFlags.NonPublic.
9697
9698         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9699
9700         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9701         MethodGroupExpr.IsExplicitImpl if appropriate.
9702         (Invocation.DoResolve): Don't report the CS0120 for explicit
9703         interface implementations.
9704
9705 2002-08-27  Martin Baulig  <martin@gnome.org>
9706
9707         * expression.cs (Invocation.DoResolve): If this is a static
9708         method and we don't have an InstanceExpression, we must report
9709         a CS0120.
9710
9711 2002-08-25  Martin Baulig  <martin@gnome.org>
9712
9713         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9714         `==' between a valuetype and an object.
9715
9716 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9717
9718         * ecore.cs (TypeExpr): Provide a ToString method.
9719
9720 2002-08-24  Martin Baulig  <martin@gnome.org>
9721
9722         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9723         now called proggie.dbg and it's a binary file.
9724
9725 2002-08-23  Martin Baulig  <martin@gnome.org>
9726
9727         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9728
9729 2002-08-23  Martin Baulig  <martin@gnome.org>
9730
9731         * struct.cs (MyStructInfo.ctor): Make this work with empty
9732         structs; it's not allowed to use foreach() on null.
9733
9734 2002-08-23  Martin Baulig  <martin@gnome.org>
9735
9736         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9737         writer the full pathname of the generated assembly.
9738
9739 2002-08-23  Martin Baulig  <martin@gnome.org>
9740
9741         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9742         A `finally' block never returns or breaks; improved handling of
9743         unreachable code.
9744
9745 2002-08-23  Martin Baulig  <martin@gnome.org>
9746
9747         * statement.cs (Throw.Resolve): Allow `throw null'.
9748
9749 2002-08-23  Martin Baulig  <martin@gnome.org>
9750
9751         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9752         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9753         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9754         MemberLookup would return a wrong event if this is an explicit
9755         interface implementation and the class has an event with the same
9756         name.
9757
9758 2002-08-23  Martin Baulig  <martin@gnome.org>
9759
9760         * statement.cs (Block.AddChildVariableNames): New public method.
9761         (Block.AddChildVariableName): Likewise.
9762         (Block.IsVariableNameUsedInChildBlock): Likewise.
9763         (Block.AddVariable): Check whether a variable name has already
9764         been used in a child block.
9765
9766         * cs-parser.jay (declare_local_variables): Mark all variable names
9767         from the current block as being used in a child block in the
9768         implicit block.
9769
9770 2002-08-23  Martin Baulig  <martin@gnome.org>
9771
9772         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9773         find the symbol writer.
9774
9775         * driver.cs: csc also allows the arguments to /define being
9776         separated by commas, not only by semicolons.
9777
9778 2002-08-23  Martin Baulig  <martin@gnome.org>
9779
9780         * interface.cs (Interface.GetMembers): Added static check for events.
9781
9782 2002-08-15  Martin Baulig  <martin@gnome.org>
9783
9784         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9785         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9786
9787         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9788         why the MethodData.EmitDestructor() change was necessary.
9789
9790 2002-08-20  Martin Baulig  <martin@gnome.org>
9791
9792         * class.cs (TypeContainer.FindMembers): Added static check for events.
9793
9794         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9795
9796         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9797         use Type.GetEvents(), not Type.FindMembers().
9798
9799 2002-08-20  Martin Baulig  <martin@gnome.org>
9800
9801         * decl.cs (MemberCache): Added a special method cache which will
9802         be used for method-only searched.  This ensures that a method
9803         search will return a MethodInfo with the correct ReflectedType for
9804         inherited methods.      
9805
9806 2002-08-20  Martin Baulig  <martin@gnome.org>
9807
9808         * decl.cs (DeclSpace.FindMembers): Made this public.
9809
9810 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9811
9812         * delegate.cs: fixed build on windows.
9813         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9814
9815 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9816
9817         * ecore.cs (StandardConversionExists): Return a false
9818         if we are trying to convert the void type to anything else
9819         since that is not allowed.
9820
9821         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9822         we flag error 70 in the event an event is trying to be accessed
9823         directly from outside the declaring type.
9824
9825 2002-08-20  Martin Baulig  <martin@gnome.org>
9826
9827         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9828         MemberCache from typemanager.cs to decl.cs.
9829
9830 2002-08-19  Martin Baulig  <martin@gnome.org>
9831
9832         * class.cs (TypeContainer): Implement IMemberContainer.
9833         (TypeContainer.DefineMembers): Create the MemberCache.
9834         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9835         return public members if BindingFlags.Public was given, check
9836         whether members are static.
9837
9838 2002-08-16  Martin Baulig  <martin@gnome.org>
9839
9840         * decl.cs (DeclSpace.Define): Splitted this in Define and
9841         DefineMembers.  DefineMembers is called first and initializes the
9842         MemberCache.
9843
9844         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9845         DefineMembers() on all our DeclSpaces.
9846
9847         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9848         but call DefineMembers() on all nested interfaces.  We call their
9849         Define() in our new Define() function.
9850
9851         * interface.cs (Interface): Implement IMemberContainer.
9852         (Interface.Define): Moved all code except the attribute stuf to
9853         DefineMembers().
9854         (Interface.DefineMembers): Initialize the member cache.
9855
9856         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9857         need this anymore since we can use MemberCache.FindMembers directly.
9858
9859 2002-08-19  Martin Baulig  <martin@gnome.org>
9860
9861         * typemanager.cs (MemberCache): When creating the cache for an
9862         interface type, add all inherited members.
9863         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9864         to `out bool used_cache' and documented it.
9865         (TypeManager.MemberLookup): If we already used the cache in the first
9866         iteration, we don't need to do the interfaces check.
9867
9868 2002-08-19  Martin Baulig  <martin@gnome.org>
9869
9870         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9871         here from IMemberFinder and don't implement this interface anymore.
9872         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9873
9874         * typemanager.cs (IMemberFinder): This interface is now only used by
9875         classes which actually support the member cache.
9876         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9877         since we only put DeclSpaces into this Hashtable.
9878         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9879         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9880
9881 2002-08-16  Martin Baulig  <martin@gnome.org>
9882
9883         * typemanager.cs (ICachingMemberFinder): Removed.
9884         (IMemberFinder.MemberCache): New property.
9885         (TypeManager.FindMembers): Merged this with RealFindMembers().
9886         This function will never be called from TypeManager.MemberLookup()
9887         so we can't use the cache here, just the IMemberFinder.
9888         (TypeManager.MemberLookup_FindMembers): Check whether the
9889         IMemberFinder has a MemberCache and call the cache's FindMembers
9890         function.
9891         (MemberCache): Rewrote larger parts of this yet another time and
9892         cleaned it up a bit.
9893
9894 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9895
9896         * driver.cs (LoadArgs): Support quoting.
9897
9898         (Usage): Show the CSC-like command line arguments.
9899
9900         Improved a few error messages.
9901
9902 2002-08-15  Martin Baulig  <martin@gnome.org>
9903
9904         * typemanager.cs (IMemberContainer.Type): New property.
9905         (IMemberContainer.IsInterface): New property.
9906
9907         The following changes are conditional to BROKEN_RUNTIME, which is
9908         defined at the top of the file.
9909
9910         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9911         class'es members, but add all members from TypeHandle.ObjectType
9912         if we're an interface.
9913         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9914         is the current type.
9915         (MemberCache.CacheEntry.Container): Removed this field.
9916         (TypeHandle.GetMembers): Include inherited members.
9917
9918 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9919
9920         * typemanager.cs: fixed compilation and added a comment on a field that
9921         is never used.
9922
9923 2002-08-15  Martin Baulig  <martin@gnome.org>
9924
9925         * class.cs (ConstructorInitializer.Resolve): In the
9926         Expression.MemberLookup call, use the queried_type as
9927         invocation_type.
9928
9929         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9930         declared' attribute, it's always true.
9931         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9932         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9933         temporary wrapper for FindMembers which tells MemberLookup whether
9934         members from the base classes are included in the return value.
9935         This will go away soon.
9936         (TypeManager.MemberLookup): Use this temporary hack here; once the
9937         new MemberCache is completed, we don't need to do the DeclaredOnly
9938         looping here anymore since the MemberCache will take care of this.
9939         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9940         (MemberCache): When creating the MemberCache for a class, get
9941         members from the current class and all its base classes.
9942         (MemberCache.CacheEntry.Container): New field.  This is a
9943         temporary hack until the Mono runtime is fixed to distinguish
9944         between ReflectedType and DeclaringType.  It allows us to use MCS
9945         with both the MS runtime and the unfixed Mono runtime without
9946         problems and without accecting performance.
9947         (MemberCache.SearchMembers): The DeclaredOnly looping from
9948         TypeManager.MemberLookup is now done here.      
9949
9950 2002-08-14  Martin Baulig  <martin@gnome.org>
9951
9952         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9953         Type.GetFields on dynamic types but get the fields from the
9954         corresponding TypeContainer.
9955         (MyStructInfo.GetStructInfo): Added check for enum types.
9956
9957         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9958         (MemberList.SyncRoot): Implemented.
9959         (TypeManager.FilterWithClosure): No need to check permissions if
9960         closure_start_type == closure_invocation_type, don't crash if
9961         closure_invocation_type is null.
9962
9963 2002-08-13  Martin Baulig  <martin@gnome.org>
9964
9965         Rewrote TypeContainer.FindMembers to use a member cache.  This
9966         gives us a speed increase of about 35% for the self-hosting MCS
9967         build and of about 15-20% for the class libs (both on GNU/Linux).
9968
9969         * report.cs (Timer): New class to get enhanced profiling.  This
9970         whole class is "TIMER" conditional since it remarkably slows down
9971         compilation speed.
9972
9973         * class.cs (MemberList): New class.  This is an IList wrapper
9974         which we're now using instead of passing MemberInfo[]'s around to
9975         avoid copying this array unnecessarily.
9976         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9977         (ICachingMemberFinder, IMemberContainer): New interface.
9978         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9979         has already been checked, otherwise use it for the name comparision.
9980         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9981         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9982         if possible.  Returns a MemberList, not a MemberInfo [].
9983         (TypeHandle): New class, implements IMemberContainer.  We create
9984         one instance of this class per type, it contains a MemberCache
9985         which is used to do the member lookups.
9986         (MemberCache): New class.  Each instance of this class contains
9987         all members of a type and a name-based hash table.
9988         (MemberCache.FindMembers): This is our new member lookup
9989         function.  First, it looks up all members of the requested name in
9990         the hash table.  Then, it walks this list and sorts out all
9991         applicable members and returns them.
9992
9993 2002-08-13  Martin Baulig  <martin@gnome.org>
9994
9995         In addition to a nice code cleanup, this gives us a performance
9996         increase of about 1.4% on GNU/Linux - not much, but it's already
9997         half a second for the self-hosting MCS compilation.
9998
9999         * typemanager.cs (IMemberFinder): New interface.  It is used by
10000         TypeManager.FindMembers to call FindMembers on a TypeContainer,
10001         Enum, Delegate or Interface.
10002         (TypeManager.finder_to_member_finder): New PtrHashtable.
10003         (TypeManager.finder_to_container): Removed.
10004         (TypeManager.finder_to_delegate): Removed.
10005         (TypeManager.finder_to_interface): Removed.
10006         (TypeManager.finder_to_enum): Removed.
10007
10008         * interface.cs (Interface): Implement IMemberFinder.
10009
10010         * delegate.cs (Delegate): Implement IMemberFinder.
10011
10012         * enum.cs (Enum): Implement IMemberFinder.
10013
10014         * class.cs (TypeContainer): Implement IMemberFinder.
10015
10016 2002-08-12  Martin Baulig  <martin@gnome.org>
10017
10018         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
10019
10020 2002-08-12  Martin Baulig  <martin@gnome.org>
10021
10022         * ecore.cs (ITypeExpression): New interface for expressions which
10023         resolve to a type.
10024         (TypeExpression): Renamed to TypeLookupExpression.
10025         (Expression.DoResolve): If we're doing a types-only lookup, the
10026         expression must implement the ITypeExpression interface and we
10027         call DoResolveType() on it.
10028         (SimpleName): Implement the new ITypeExpression interface.
10029         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
10030         hack, the situation that we're only looking up types can't happen
10031         anymore when this method is called.  Moved the type lookup code to
10032         DoResolveType() and call it.
10033         (SimpleName.DoResolveType): This ITypeExpression interface method
10034         is now doing the types-only lookup.
10035         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
10036         (ResolveFlags): Added MaskExprClass.
10037
10038         * expression.cs (MemberAccess): Implement the ITypeExpression
10039         interface.
10040         (MemberAccess.DoResolve): Added support for a types-only lookup
10041         when we're called via ITypeExpression.DoResolveType().
10042         (ComposedCast): Implement the ITypeExpression interface.
10043
10044         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
10045         Expression.Resolve() with ResolveFlags.Type instead.
10046
10047 2002-08-12  Martin Baulig  <martin@gnome.org>
10048
10049         * interface.cs (Interface.Define): Apply attributes.
10050
10051         * attribute.cs (Attribute.ApplyAttributes): Added support for
10052         interface attributes.
10053
10054 2002-08-11  Martin Baulig  <martin@gnome.org>
10055
10056         * statement.cs (Block.Emit): Only check the "this" variable if we
10057         do not always throw an exception.
10058
10059         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
10060         whether the property has a set accessor.
10061
10062 2002-08-11  Martin Baulig  <martin@gnome.org>
10063
10064         Added control flow analysis support for structs.
10065
10066         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
10067         with control flow analysis turned off.
10068         (IVariable): New interface.
10069         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
10070         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
10071         (FieldExpr.DoResolve): Resolve the instance expression with flow
10072         analysis turned off and do the definite assignment check after the
10073         resolving when we know what the expression will resolve to.
10074
10075         * expression.cs (LocalVariableReference, ParameterReference):
10076         Implement the new IVariable interface, only call the flow analysis
10077         code if ec.DoFlowAnalysis is true.
10078         (This): Added constructor which takes a Block argument.  Implement
10079         the new IVariable interface.
10080         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
10081         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
10082         This does the definite assignment checks for struct members.
10083
10084         * class.cs (Constructor.Emit): If this is a non-static `struct'
10085         constructor which doesn't have any initializer, call
10086         Block.AddThisVariable() to tell the flow analysis code that all
10087         struct elements must be initialized before control returns from
10088         the constructor.
10089
10090         * statement.cs (MyStructInfo): New public class.
10091         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
10092         argument to this indexer.  If non-zero, check an individual struct
10093         member, not the whole struct.
10094         (FlowBranching.CheckOutParameters): Check struct members.
10095         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
10096         overloaded versions of these methods which take an additional
10097         `int field_idx' argument to check struct members.
10098         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
10099         overloaded versions of these methods which take an additional
10100         `string field_name' argument to check struct member.s
10101         (VariableInfo): Implement the IVariable interface.
10102         (VariableInfo.StructInfo): New public property.  Returns the
10103         MyStructInfo instance of the variable if it's a struct or null.
10104         (Block.AddThisVariable): New public method.  This is called from
10105         Constructor.Emit() for non-static `struct' constructor which do
10106         not have any initializer.  It creates a special variable for the
10107         "this" instance variable which will be checked by the flow
10108         analysis code to ensure that all of the struct's fields are
10109         initialized before control returns from the constructor.
10110         (UsageVector): Added support for struct members.  If a
10111         variable/parameter is a struct with N members, we reserve a slot
10112         in the usage vector for each member.  A struct is considered fully
10113         initialized if either the struct itself (slot 0) or all its
10114         members are initialized.
10115
10116 2002-08-08  Martin Baulig  <martin@gnome.org>
10117
10118         * driver.cs (Driver.MainDriver): Only report an error CS5001
10119         if there were no compilation errors.
10120
10121         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
10122         `UnsafeContext' property to determine whether the parent is in
10123         unsafe context rather than checking the parent's ModFlags:
10124         classes nested in an unsafe class are unsafe as well.
10125
10126 2002-08-08  Martin Baulig  <martin@gnome.org>
10127
10128         * statement.cs (UsageVector.MergeChildren): Distinguish between
10129         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
10130         we return.  Added test17() and test18() to test-154.cs.
10131
10132 2002-08-08  Martin Baulig  <martin@gnome.org>
10133
10134         * typemanager.cs (TypeManager.FilterWithClosure): If we have
10135         Family access, make sure the invoking type isn't a subclass of the
10136         queried type (that'd be a CS1540).
10137
10138         * ecore.cs (Expression.MemberLookup): Added overloaded version of
10139         this method which takes an additional `Type invocation_type'.
10140
10141         * expression.cs (BaseAccess.DoResolve): Use the base type as
10142         invocation and query type.
10143         (MemberAccess.DoResolve): If the lookup failed and we're about to
10144         report a CS0122, try a lookup with the ec.ContainerType - if this
10145         succeeds, we must report a CS1540.
10146
10147 2002-08-08  Martin Baulig  <martin@gnome.org>
10148
10149         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
10150         (MethodGroupExpr): Implement the IMemberExpr interface.
10151
10152         * expression (MemberAccess.ResolveMemberAccess): No need to have
10153         any special code for MethodGroupExprs anymore, they're now
10154         IMemberExprs.   
10155
10156 2002-08-08  Martin Baulig  <martin@gnome.org>
10157
10158         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
10159         Family, FamANDAssem and FamORAssem permissions.
10160         (TypeManager.IsSubclassOrNestedChildOf): New public method.
10161
10162 2002-08-08  Martin Baulig  <martin@gnome.org>
10163
10164         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
10165         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
10166         or loop block.
10167
10168 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
10169
10170         * driver.cs: implemented /resource option to embed managed resources.
10171
10172 2002-08-07  Martin Baulig  <martin@gnome.org>
10173
10174         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
10175         (FieldBase.HasFieldInitializer): New public property.
10176         (FieldBase.GetInitializerExpression): New public method.  Resolves and
10177         returns the field initializer and makes sure it is only resolved once.
10178         (TypeContainer.EmitFieldInitializers): Call
10179         FieldBase.GetInitializerExpression to get the initializer, this ensures
10180         that it isn't resolved multiple times.
10181
10182         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
10183         the resolving process (SimpleName/MemberLookup) that we're currently
10184         emitting a field initializer (which must not access any instance members,
10185         this is an error CS0236).
10186
10187         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
10188         argument, if the `IsFieldInitializer' flag is set, we must report and
10189         error CS0236 and not an error CS0120.   
10190
10191 2002-08-07  Martin Baulig  <martin@gnome.org>
10192
10193         * ecore.cs (IMemberExpr): New public interface.
10194         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
10195         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
10196         if the expression is an IMemberExpr.
10197
10198         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
10199         to be null, implicitly default to `this' if we're non-static in
10200         this case.  Simplified the code a lot by using the new IMemberExpr
10201         interface.  Also fixed bug #28176 here.
10202
10203 2002-08-06  Martin Baulig  <martin@gnome.org>
10204
10205         * cs-parser.jay (SimpleLookup): Removed.  We need to create
10206         ParameterReferences during semantic analysis so that we can do a
10207         type-only search when resolving Cast, TypeOf and SizeOf.
10208         (block): Pass the `current_local_parameters' to the Block's
10209         constructor.
10210
10211         * class.cs (ConstructorInitializer): Added `Parameters parameters'
10212         argument to the constructor.
10213         (ConstructorInitializer.Resolve): Create a temporary implicit
10214         block with the parameters.
10215
10216         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
10217         references here if we aren't doing a type-only search.
10218
10219         * statement.cs (Block): Added constructor which takes a
10220         `Parameters parameters' argument.
10221         (Block.Parameters): New public property.
10222
10223         * support.cs (InternalParameters.Parameters): Renamed `parameters'
10224         to `Parameters' and made it public readonly.
10225
10226 2002-08-06  Martin Baulig  <martin@gnome.org>
10227
10228         * ecore.cs (Expression.Warning): Made this public as well.
10229
10230         * report.cs (Report.Debug): Print the contents of collections.
10231
10232 2002-08-06  Martin Baulig  <martin@gnome.org>
10233
10234         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
10235         used to tell Resolve() which kinds of expressions it may return.
10236         (Expression.Resolve): Added overloaded version of this method which
10237         takes a `ResolveFlags flags' argument.  This can be used to tell
10238         Resolve() which kinds of expressions it may return.  Reports a
10239         CS0118 on error.
10240         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
10241         ResolveFlags.SimpleName.
10242         (Expression.Error118): Added overloaded version of this method which
10243         takes a `ResolveFlags flags' argument.  It uses the flags to determine
10244         which kinds of expressions are allowed.
10245
10246         * expression.cs (Argument.ResolveMethodGroup): New public method.
10247         Resolves an argument, but allows a MethodGroup to be returned.
10248         This is used when invoking a delegate.
10249
10250         * TODO: Updated a bit.
10251
10252 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10253
10254         Fixed compilation with csc.
10255
10256         * ecore.cs: Expression.Error made public. Is this correct? Should
10257         Warning be made public too?
10258
10259         * expression.cs: use ea.Location instead of ea.loc.
10260         [FIXME:  Filed as bug #28607: MCS must report these errors.]
10261
10262 2002-08-06  Martin Baulig  <martin@gnome.org>
10263
10264         * ecore.cs (Expression.loc): Moved the location here instead of
10265         duplicating it in all derived classes.
10266         (Expression.Location): New public property.
10267         (Expression.Error, Expression.Warning): Made them non-static and
10268         removed the location argument.
10269         (Expression.Warning): Added overloaded version which takes an
10270         `int level' argument.
10271         (Expression.Error118): Make this non-static and removed the
10272         expression and location arguments.
10273         (TypeExpr): Added location argument to the constructor.
10274
10275         * expression.cs (StaticCallExpr): Added location argument to
10276         the constructor.
10277         (Indirection, PointerArithmetic): Likewise.
10278         (CheckedExpr, UnCheckedExpr): Likewise.
10279         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
10280         (StringPtr): Likewise.
10281
10282
10283 2002-08-05  Martin Baulig  <martin@gnome.org>
10284
10285         * expression.cs (BaseAccess.DoResolve): Actually report errors.
10286
10287         * assign.cs (Assign.DoResolve): Check whether the source
10288         expression is a value or variable.
10289
10290         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
10291         while resolving the corresponding blocks.
10292
10293         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
10294         an error, don't silently return null.
10295
10296         * statement.cs (Block.AddVariable): Do the error reporting here
10297         and distinguish between CS0128 and CS0136.
10298         (Block.DoResolve): Report all unused labels (warning CS0164).
10299         (LabeledStatement): Pass the location to the constructor.
10300         (LabeledStatement.HasBeenReferenced): New property.
10301         (LabeledStatement.Resolve): Set it to true here.
10302
10303         * statement.cs (Return.Emit): Return success even after reporting
10304         a type mismatch error (CS0126 or CS0127), this is what csc does and
10305         it avoids confusing the users with any consecutive errors.
10306
10307 2002-08-05  Martin Baulig  <martin@gnome.org>
10308
10309         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
10310
10311         * const.cs (Const.LookupConstantValue): Catch circular definitions.
10312
10313         * expression.cs (MemberAccess.DoResolve): Silently return if an
10314         error has already been reported.
10315
10316         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
10317         error has already been reported.
10318
10319 2002-08-05  Martin Baulig  <martin@gnome.org>
10320
10321         * statement.cs (UsageVector): Only initialize the `parameters'
10322         vector if we actually have any "out" parameters.
10323
10324 2002-08-05  Martin Baulig  <martin@gnome.org>
10325
10326         * expression.cs (Binary.ResolveOperator): When combining delegates,
10327         they must have the same type.
10328
10329 2002-08-05  Martin Baulig  <martin@gnome.org>
10330
10331         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
10332         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
10333         work with the ms runtime and we also don't need it: if we're a
10334         PropertyBuilder and not in the `indexer_arguments' hash, then we
10335         are a property and not an indexer.
10336
10337         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
10338         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
10339         since the latter one doesn't work with the ms runtime.
10340
10341 2002-08-03  Martin Baulig  <martin@gnome.org>
10342
10343         Fixed bugs #27998 and #22735.
10344
10345         * class.cs (Method.IsOperator): New public field.
10346         (Method.CheckBase): Report CS0111 if there's already a method
10347         with the same parameters in the current class.  Report CS0508 when
10348         attempting to change the return type of an inherited method.
10349         (MethodData.Emit): Report CS0179 if a method doesn't have a body
10350         and it's not marked abstract or extern.
10351         (PropertyBase): New abstract base class for Property and Indexer.
10352         (PropertyBase.CheckBase): Moved here from Property and made it work
10353         for indexers.
10354         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
10355         the same so we can reuse it there.
10356         (Property, Indexer): Derive from PropertyBase.
10357         (MethodSignature.inheritable_property_signature_filter): New delegate
10358         to find properties and indexers.
10359
10360         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
10361         argument and improved error reporting.
10362
10363         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
10364         EmptyReadOnlyParameters and made it a property.
10365
10366         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
10367         version of this method which takes a `PropertyInfo indexer'.
10368         (TypeManager.RegisterIndexer): New method.
10369
10370         * class.cs: Added myself as author of this file :-)
10371
10372 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10373
10374         * class.cs: fixed compilation on windoze.
10375
10376 2002-08-03  Martin Baulig  <martin@gnome.org>
10377
10378         * interface.cs (Interface.GetInterfaceBases): Check whether all
10379         base interfaces are at least as accessible than the current one.
10380
10381         * class.cs (TypeContainer.GetClassBases): Check whether base types
10382         are at least as accessible than the current type.
10383         (TypeContainer.AsAccessible): Implemented and made non-static.
10384         (MemberBase.CheckParameters): Report errors if the accessibility
10385         checks fail.
10386
10387         * delegate.cs (Delegate.Delegate): The default visibility is
10388         internal for top-level types and private for nested types.
10389         (Delegate.Define): Report errors if the accessibility checks fail.
10390
10391         * enum.cs (Enum.Enum): The default visibility is internal for
10392         top-level types and private for nested types.
10393         (Enum.DefineType): Compute the correct visibility.
10394
10395         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
10396         function which takes a `bool is_toplevel' instead of a TypeContainer.
10397
10398         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
10399         builtin type.
10400
10401 2002-08-02  Martin Baulig  <martin@gnome.org>
10402
10403         * expression.cs (LocalVariableReferenc): Added constructor which
10404         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
10405         (LocalVariableReference.IsReadOnly): New property.
10406         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
10407         variable is readonly, use our own readonly flag to do this; you can
10408         use the new constructor to get a writable reference to a read-only
10409         variable.
10410
10411         * cs-parser.jay (foreach_statement, using_statement): Get a writable
10412         reference to the local variable.
10413
10414 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
10415
10416         * rootcontext.cs (ResolveCore): Also include System.Exception
10417
10418         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
10419         we reach an EmptyStatement.
10420
10421         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
10422         is also fine.
10423
10424         * expression.cs (Binary.ResolveOperator): Check error result in
10425         two places.
10426
10427         use brtrue/brfalse directly and avoid compares to null.
10428
10429 2002-08-02  Martin Baulig  <martin@gnome.org>
10430
10431         * class.cs (TypeContainer.Define): Define all nested interfaces here.
10432         Fixes bug #28407, added test-155.cs.
10433
10434 2002-08-01  Martin Baulig  <martin@gnome.org>
10435
10436         * class.cs (Event.EmitDefaultMethod): Make this work with static
10437         events.  Fixes #28311, added verify-3.cs.
10438
10439 2002-08-01  Martin Baulig  <martin@gnome.org>
10440
10441         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
10442         `is_disposable' fields.
10443         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
10444         `hm.is_disposable' if we're using the collection pattern.
10445         (Foreach.EmitCollectionForeach): Use the correct type for the
10446         enumerator's local variable, only emit the try/finally block if
10447         necessary (fixes #27713).
10448
10449 2002-08-01  Martin Baulig  <martin@gnome.org>
10450
10451         * ecore.cs (Expression.report118): Renamed to Error118 and made
10452         it public static.
10453
10454         * statement.cs (Throw.Resolve): Check whether the expression is of
10455         the correct type (CS0118) and whether the type derives from
10456         System.Exception (CS0155).
10457         (Catch.Resolve): New method.  Do the type lookup here and check
10458         whether it derives from System.Exception (CS0155).
10459         (Catch.CatchType, Catch.IsGeneral): New public properties.
10460
10461         * typemanager.cs (TypeManager.exception_type): Added.
10462
10463 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
10464
10465         * driver.cs: Updated About function.
10466
10467 2002-07-31  Martin Baulig  <martin@gnome.org>
10468
10469         Implemented Control Flow Analysis.
10470
10471         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
10472         (EmitContext.CurrentBranching): Added.
10473         (EmitContext.StartFlowBranching): Added.
10474         (EmitContext.EndFlowBranching): Added.
10475         (EmitContext.KillFlowBranching): Added.
10476         (EmitContext.IsVariableAssigned): Added.
10477         (EmitContext.SetVariableAssigned): Added.
10478         (EmitContext.IsParameterAssigned): Added.
10479         (EmitContext.SetParameterAssigned): Added.
10480         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
10481         Added control flow analysis stuff here.
10482
10483         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
10484         resolve the expression as lvalue.
10485         (LocalVariableReference.DoResolve): Check whether the variable has
10486         already been assigned.
10487         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
10488         the parameter as assigned here.
10489         (ParameterReference.DoResolve): Check whether the parameter has already
10490         been assigned.
10491         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
10492         expression as lvalue.
10493
10494         * statement.cs (FlowBranching): New class for the flow analysis code.
10495         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
10496         (LabeledStatement.IsDefined): New public property.
10497         (LabeledStatement.AddUsageVector): New public method to tell flow
10498         analyis that the label may be reached via a forward jump.
10499         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
10500         flow analysis.
10501         (VariableInfo.Number): New public field.  This is used by flow analysis
10502         to number all locals of a block.
10503         (Block.CountVariables): New public property.  This is the number of
10504         local variables in this block (including the locals from all parent
10505         blocks).
10506         (Block.EmitMeta): Number all the variables.
10507
10508         * statement.cs: Added flow analysis support to all classes.
10509
10510 2002-07-31  Martin Baulig  <martin@gnome.org>
10511
10512         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
10513         To get debugging messages, compile mcs with /define:MCS_DEBUG and
10514         then use this argument.
10515
10516         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
10517
10518         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
10519         use this to specify /define options.
10520
10521 2002-07-29  Martin Baulig  <martin@gnome.org>
10522
10523         * statement.cs (Fixed): Moved all code that does variable lookups
10524         and resolvings from Emit to Resolve.
10525
10526         * statement.cs (For): Moved all code that does variable lookups
10527         and resolvings from Emit to Resolve.
10528
10529         * statement.cs (Using): Moved all code that does variable lookups
10530         and resolvings from Emit to Resolve.
10531
10532 2002-07-29  Martin Baulig  <martin@gnome.org>
10533
10534         * attribute.cs (Attribute.Resolve): Explicitly catch a
10535         System.NullReferenceException when creating the
10536         CustromAttributeBuilder and report a different warning message.
10537
10538 2002-07-29  Martin Baulig  <martin@gnome.org>
10539
10540         * support.cs (ParameterData.ParameterName): Added method to
10541         get the name of a parameter.
10542
10543         * typemanager.cs (TypeManager.IsValueType): New public method.
10544
10545 2002-07-29  Martin Baulig  <martin@gnome.org>
10546
10547         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
10548         is a flag which specifies that it's either ref or out.
10549         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
10550         the out parameter to `out Parameter.Modifier mod', also set the
10551         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
10552
10553         * support.cs (InternalParameters.ParameterModifier): Distinguish
10554         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10555         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10556
10557         * expression.cs (Argument.GetParameterModifier): Distinguish
10558         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10559         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10560
10561 2002-07-29  Martin Baulig  <martin@gnome.org>
10562
10563         * expression.cs (ParameterReference.ParameterReference): Added
10564         `Location loc' argument to the constructor.
10565
10566         * cs-parser.jay: Pass location to ParameterReference.
10567
10568 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
10569
10570         * statement.cs (Try): Initialize the location.
10571
10572         * cs-parser.jay: pass location to Try.
10573
10574         * expression.cs (Unary.Reduce): Change the prototype to return
10575         whether a constant fold could be performed or not.  The result is
10576         returned in an out parameters.  In the case of Indirection and
10577         AddressOf, we want to perform the full tests.
10578
10579 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
10580
10581         * statement.cs (Statement.Emit): Flag dead code.
10582
10583 2002-07-27  Andrew Birkett  <andy@nobugs.org>
10584
10585         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
10586
10587 2002-07-27  Martin Baulig  <martin@gnome.org>
10588
10589         * class.cs (MethodData.Define): Put back call to
10590         TypeManager.AddMethod(), accidentally commented this out.
10591
10592         * report.cs (Debug): New public method to print debugging information,
10593         this is `[Conditional ("DEBUG")]'.
10594
10595 2002-07-26  Martin Baulig  <martin@gnome.org>
10596
10597         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
10598         (switch_statement): Push the current_block to the switch_stack and
10599         pop it again when we're done with the switch.
10600         (switch_section): The new block is a child of the current_block.
10601         Fixes bug #24007, added test-152.cs.
10602
10603 2002-07-27  Martin Baulig  <martin@gnome.org>
10604
10605         * expression.cs (Invocation.EmitArguments): When calling a varargs
10606         function with only its fixed arguments, we need to pass an empty
10607         array.
10608
10609 2002-07-27  Martin Baulig  <martin@gnome.org>
10610
10611         Mono 0.13 has been released.
10612
10613 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
10614
10615         * driver.cs: Rename --resource to --linkres, because that is what
10616         we do currently, we dont support --resource yet.
10617
10618         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
10619
10620 2002-07-25  Martin Baulig  <martin@gnome.org>
10621
10622         * class.cs (MethodData): New public class.  This is a `method builder'
10623         class for a method or one accessor of a Property/Indexer/Event.
10624         (MethodData.GetMethodFlags): Moved here from MemberBase.
10625         (MethodData.ApplyAttributes): Likewise.
10626         (MethodData.ApplyObsoleteAttribute): Likewise.
10627         (MethodData.ApplyConditionalAttribute): Likewise.
10628         (MethodData.ApplyDllImportAttribute): Likewise.
10629         (MethodData.CheckAbstractAndExternal): Likewise.
10630         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10631         (MethodData.Emit): Formerly known as Method.Emit().
10632         (MemberBase): Moved everything which was specific to a single
10633         accessor/method to MethodData.
10634         (Method): Create a new MethodData and call Define() and Emit() on it.
10635         (Property, Indexer, Event): Create a new MethodData objects for each
10636         accessor and call Define() and Emit() on them.
10637
10638 2002-07-25  Martin Baulig  <martin@gnome.org>
10639
10640         Made MethodCore derive from MemberBase to reuse the code from there.
10641         MemberBase now also checks for attributes.
10642
10643         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10644         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10645         as virtual.
10646         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10647         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10648         (MemberBase.ApplyAttributes): New virtual method; applies the
10649         attributes to a method or accessor.
10650         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10651         (MemberBase.ApplyConditionalAttribute): Likewise.
10652         (MemberBase.ApplyDllImportAttribute): Likewise.
10653         (MemberBase.CheckAbstractAndExternal): Likewise.
10654         (MethodCore.ParameterTypes): This is now a property instead of a
10655         method, it's initialized from DoDefineParameters().
10656         (MethodCore.ParameterInfo): Removed the set accessor.
10657         (MethodCore.DoDefineParameters): New protected virtual method to
10658         initialize ParameterTypes and ParameterInfo.
10659         (Method.GetReturnType): We can now simply return the MemberType.
10660         (Method.GetMethodFlags): Override the MemberBase version and add
10661         the conditional flags.
10662         (Method.CheckBase): Moved some code from Define() here, call
10663         DoDefineParameters() here.
10664         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10665         here to avoid some larger code duplication.
10666         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10667         ensure that abstract and external accessors don't declare a body.
10668
10669         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10670         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10671         lookup in the attribute's parent classes, so we need to abort as soon
10672         as we found the first match.
10673         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10674         the attribute has no arguments.
10675
10676         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10677         of a Method.
10678
10679 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10680
10681         * cs-parser.jay: reverted previous patch.
10682
10683 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10684
10685         * cs-parser.jay: fixed bug #22119.
10686
10687 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10688
10689         * attribute.cs: fixed compilation. The error was:
10690         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10691         be assigned to before control leaves the current method."
10692         [FIXME:  Filed as bug #28186: MCS must report this error.]
10693
10694 2002-07-25  Martin Baulig  <martin@gnome.org>
10695
10696         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10697         method to pull the condition name ouf of a Conditional attribute.
10698         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10699         the obsolete message and error flag out of an Obsolete attribute.
10700
10701         * class.cs (Method.GetMethodFlags): New public method to get the
10702         TypeManager.MethodFlags for this method.
10703         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10704         private methods.
10705         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10706         if we're overriding a virtual function, set the new private variable
10707         `parent_method'; call the new TypeManager.AddMethod().
10708
10709         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10710         the MethodBuilder and the Method in a PtrHashtable.
10711         (TypeManager.builder_to_method): Added for this purpose.
10712         (TypeManager.MethodFlags): Added IsObsoleteError.
10713         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10714         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10715         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10716         the message from the attribute.
10717
10718 2002-07-24  Martin Baulig  <martin@gnome.org>
10719
10720         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10721         preprocessor directives, ensure that the argument to #define/#undef is
10722         exactly one identifier and that it's actually an identifier.
10723
10724         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10725         did not work ....
10726
10727 2002-07-24  Martin Baulig  <martin@gnome.org>
10728
10729         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10730         initialize it to TypeManager.object_type in the constructor.
10731         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10732         of the `hm.get_current' method if we're using the collection pattern.
10733         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10734         for the explicit conversion to make it work when we're using the collection
10735         pattern and the `Current' property has a different return type than `object'.
10736         Fixes #27713.
10737
10738 2002-07-24  Martin Baulig  <martin@gnome.org>
10739
10740         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10741         does not match, but don't report any errors.  This method is called in
10742         order for all methods in a MethodGroupExpr until a matching method is
10743         found, so we don't want to bail out if the first method doesn't match.
10744         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10745         matches, report the 123.  Fixes #28070.
10746
10747 2002-07-24  Martin Baulig  <martin@gnome.org>
10748
10749         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10750         TypeManager.TypeToCoreType() to the top of the method so the
10751         following equality checks will work.  Fixes #28107.
10752
10753 2002-07-24  Martin Baulig  <martin@gnome.org>
10754
10755         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10756         operand is of type uint, and the other operand is of type sbyte,
10757         short or int, the operands are converted to type long." -
10758         Actually do what this comment already told us.  Fixes bug #28106,
10759         added test-150.cs.
10760
10761 2002-07-24  Martin Baulig  <martin@gnome.org>
10762
10763         * class.cs (MethodBase): New abstract class.  This is now a base
10764         class for Property, Indexer and Event to avoid some code duplication
10765         in their Define() and DefineMethods() methods.
10766         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10767         generic methods for Define() and DefineMethods().
10768         (FieldBase): Derive from MemberBase, not MemberCore.
10769         (Property): Derive from MemberBase, not MemberCore.
10770         (Property.DefineMethod): Moved all the code from this method to the
10771         new MethodBase.DefineAccessor(), just call it with appropriate
10772         argumetnts.
10773         (Property.Define): Call the new Property.DoDefine(), this does some
10774         sanity checks and we don't need to duplicate the code everywhere.
10775         (Event): Derive from MemberBase, not MemberCore.
10776         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10777         accessors, this will also make them work with interface events.
10778         (Indexer): Derive from MemberBase, not MemberCore.
10779         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10780         (Indexer.Define): Use the new MethodBase functions.
10781
10782         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10783         argument to the constructor.
10784         (Interface.FindMembers): Added support for interface events.
10785         (Interface.PopluateEvent): Implemented.
10786
10787         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10788
10789 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10790
10791         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10792         but this is required to check for a method name being the same as
10793         the containing class.  
10794
10795         Handle this now.
10796
10797 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10798
10799         * interface.cs: initialize variable.
10800
10801 2002-07-23  Martin Baulig  <martin@gnome.org>
10802
10803         Implemented the IndexerName attribute in interfaces.
10804
10805         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10806         name if this is an explicit interface implementation.
10807         (Indexer.InterfaceIndexerName): New public variable.  If we're
10808         implementing an interface indexer, this is the IndexerName in that
10809         interface.  Otherwise, it's the IndexerName.
10810         (Indexer.DefineMethod): If we're implementing interface indexer,
10811         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10812         and Pending.ImplementIndexer methods.
10813         (Indexer.Define): Also define the PropertyBuilder if we're
10814         implementing an interface indexer and this is neither an explicit
10815         interface implementation nor do the IndexerName match the one in
10816         the interface.
10817
10818         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10819         If a method is defined here, then we always need to create a proxy
10820         for it.  This is used when implementing interface indexers.
10821         (Pending.IsInterfaceIndexer): New public method.
10822         (Pending.ImplementIndexer): New public method.
10823         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10824         This is used when implementing interface indexers to define a proxy
10825         if necessary.
10826         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10827         define a proxy if necessary.
10828
10829         * interface.cs (Interface.IndexerName): New public variable.
10830         (Interface.PopulateIndexer): Set the IndexerName.
10831         (Interface.DefineIndexers): New private method.  Populate all the
10832         indexers and make sure their IndexerNames match.
10833
10834         * typemanager.cs (IndexerPropertyName): Added support for interface
10835         indexers.
10836
10837 2002-07-22  Martin Baulig  <martin@gnome.org>
10838
10839         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10840         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10841         ret if HasReturnLabel.
10842         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10843         variables.
10844
10845         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10846         and set the ec.LoopBeginTryCatchLevel.
10847         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10848         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10849         the current ec.TryCatchLevel, the branch goes out of an exception
10850         block.  In this case, we need to use Leave and not Br.
10851
10852 2002-07-22  Martin Baulig  <martin@gnome.org>
10853
10854         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10855         block unless the block does not always return or it is contained in
10856         another try { ... } catch { ... } block.  Fixes bug #26506.
10857         Added verify-1.cs to the test suite.
10858
10859 2002-07-22  Martin Baulig  <martin@gnome.org>
10860
10861         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10862         then we do not always return.  Fixes bug #24985.
10863
10864 2002-07-22  Martin Baulig  <martin@gnome.org>
10865
10866         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10867         lookup on a per-class level; ie. walk up the class hierarchy until we
10868         found at least one applicable method, then choose the best among them.
10869         Fixes bug #24463 and test-29.cs.
10870
10871 2002-07-22  Martin Baulig  <martin@gnome.org>
10872
10873         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10874         return types of the methods.  The return type is not part of the
10875         signature and we must not check it to make the `new' modifier work.
10876         Fixes bug #27999, also added test-147.cs.
10877         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10878
10879         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10880         on the method's return type.
10881
10882 2002-07-21  Martin Baulig  <martin@gnome.org>
10883
10884         * assign.cs: Make this work if the rightmost source is a constant and
10885         we need to do an implicit type conversion.  Also adding a few more tests
10886         to test-38.cs which should have caught this.
10887
10888         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10889         target in the makefile for this.  The makefile.gnu is primarily intended
10890         for end-users who don't want to debug the compiler.
10891
10892 2002-07-21  Martin Baulig  <martin@gnome.org>
10893
10894         * assign.cs: Improved the Assign class so it can now handle embedded
10895         assignments (X = Y = Z = something).  As a side-effect this'll now also
10896         consume less local variables.  test-38.cs now passes with MCS, added
10897         a few new test cases to that test.
10898
10899 2002-07-20  Martin Baulig  <martin@gnome.org>
10900
10901         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10902         instructions.  Fixes bug #27977, also added test-146.cs.
10903
10904 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10905
10906         * cs-tokenizer.cs: fixed getHex ().
10907
10908 2002-07-19  Martin Baulig  <martin@gnome.org>
10909
10910         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10911         not Type.GetType() to lookup the array type.  This is needed when
10912         we're constructing an array of a user-defined type.
10913         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10914         single-dimensional arrays, but also for single-dimensial arrays of
10915         type decimal.
10916
10917 2002-07-19  Martin Baulig  <martin@gnome.org>
10918
10919         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10920         this function is called, it's not allowed to share LocalBuilders
10921         among ILGenerators.
10922
10923 2002-07-19  Martin Baulig  <martin@gnome.org>
10924
10925         * expression.cs (Argument.Resolve): Report an error 118 when trying
10926         to pass a type as argument.
10927
10928 2002-07-18  Martin Baulig  <martin@gnome.org>
10929
10930         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10931         Conv_R_Un for the signed `long' type.
10932
10933 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10934
10935         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10936         `expr' for the temporary result, as that will fail if we do
10937         multiple resolves on the same expression.
10938
10939 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10940
10941         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10942         ec.TypeContainer for looking up aliases. 
10943
10944         * class.cs (TypeContainer): Remove LookupAlias from here.
10945
10946         * decl.cs (DeclSpace); Move here.
10947
10948 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10949
10950         * class.cs (FindMembers): Only call filter if the constructor
10951         bulider is not null.
10952
10953         Also handle delegates in `NestedTypes' now.  Now we will perform
10954         type lookups using the standard resolution process.  This also
10955         fixes a bug.
10956
10957         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10958         This uses Expressions (the limited kind that can be parsed by the
10959         tree) instead of strings.
10960
10961         * expression.cs (ComposedCast.ToString): Implement, used to flag
10962         errors since now we have to render expressions.
10963
10964         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10965         FormArrayType. 
10966
10967         * ecore.cs (SimpleName.ToString): ditto.
10968
10969         * cs-parser.jay: Instead of using strings to assemble types, use
10970         Expressions to assemble the type (using SimpleName, ComposedCast,
10971         MemberAccess).  This should fix the type lookups in declarations,
10972         because we were using a different code path for this.
10973
10974         * statement.cs (Block.Resolve): Continue processing statements
10975         even when there is an error.
10976
10977 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10978
10979         * class.cs (Event.Define): Also remove the `remove' method from
10980         the list of pending items.
10981
10982         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10983         generate more compact code. 
10984
10985 2002-07-17  Martin Baulig  <martin@gnome.org>
10986
10987         * const.cs (Const.LookupConstantValue): Add support for constant
10988         `unchecked' and `checked' expressions.
10989         Also adding test case test-140.cs for this.
10990
10991 2002-07-17  Martin Baulig  <martin@gnome.org>
10992
10993         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10994         check whether mi.ReturnType implements the IEnumerator interface; the
10995         `==' and the IsAssignableFrom() will fail in this situation.
10996
10997 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10998
10999         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
11000         here too.
11001
11002 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11003
11004         * expression.cs: fixed bug #27811.
11005
11006 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
11007
11008         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
11009         Molaro: when we are a ref, the value already contains a pointer
11010         value, do not take the address of it.
11011
11012 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
11013         * removed mb-parser.jay and mb-tokenizer.cs
11014
11015 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11016
11017         * expression.cs: check against the building corlib void type.
11018
11019 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
11020
11021         * ecore.cs: fix for valuetype static readonly fields: when 
11022         initializing them, we need their address, not the address of a copy.
11023
11024 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
11025
11026         * typemanager.cs: register also enum_type in corlib.
11027
11028 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11029
11030         * class.cs: allow calling this (but not base) initializers in structs.
11031
11032 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
11033
11034         * ecore.cs: make sure we compare against the building base types
11035         in GetTypeSize ().
11036
11037 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
11038
11039         * typemanager.cs: fix TypeToCoreType() to handle void and object
11040         (corlib gets no more typerefs after this change).
11041
11042 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
11043
11044         * expression.cs (ArrayCreation.EmitArrayArguments): use
11045         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
11046
11047         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
11048         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
11049         array indexes, the runtime actually forbids them.
11050
11051         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
11052         for array arguments here.
11053
11054         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
11055         instead of the default for ValueTypes.
11056
11057         (New.DoEmit): Use IsValueType instead of
11058         IsSubclassOf (value_type)
11059         (New.DoResolve): ditto.
11060         (Invocation.EmitCall): ditto.
11061
11062         * assign.cs (Assign): ditto.
11063
11064         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
11065         Statements *are* currently doing part of their resolution during
11066         Emit.  
11067
11068         Expressions do always resolve during resolve, but statements are
11069         only required to propagate resolution to their children.
11070
11071 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
11072
11073         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
11074
11075         (LoadAssembly): Do not add the dll if it is already specified
11076
11077         (MainDriver): Add the System directory to the link path at the end,
11078         after all the other -L arguments. 
11079
11080         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
11081         wrong opcode for loading bytes and bools (ldelem.i1 instead of
11082         ldelem.u1) and using the opposite for sbytes.
11083
11084         This fixes Digger, and we can finally run it.
11085
11086         * driver.cs (UnixParseOption): Move the option parsing here.  
11087         (CSCParseOption): Implement CSC-like parsing of options.
11088
11089         We now support both modes of operation, the old Unix way, and the
11090         new CSC-like way.  This should help those who wanted to make cross
11091         platform makefiles.
11092
11093         The only thing broken is that /r:, /reference: and /lib: are not
11094         implemented, because I want to make those have the same semantics
11095         as the CSC compiler has, and kill once and for all the confussion
11096         around this.   Will be doing this tomorrow.
11097
11098         * statement.cs (Unsafe.Resolve): The state is checked during
11099         resolve, not emit, so we have to set the flags for IsUnsfe here.
11100
11101 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11102
11103         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
11104         not catch the Error_ObjectRefRequired in SimpleName (as it is
11105         possible to have a class/instance variable name that later gets
11106         deambiguated), we have to check this here.      
11107
11108 2002-07-10  Ravi Pratap  <ravi@ximian.com>
11109
11110         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
11111         make static and put into Expression.
11112
11113         (Event.Define): Register the private field of the event with the 
11114         TypeManager so that GetFieldFromEvent can get at it.
11115
11116         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
11117         keep track of the private field associated with an event which
11118         has no accessors.
11119
11120         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
11121         private field.
11122
11123         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
11124
11125 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11126
11127         * expression.cs (Binary.EmitBranchable): this routine emits the
11128         Binary expression in a branchable context.  This basically means:
11129         we need to branch somewhere, not just get the value on the stack.
11130
11131         This works together with Statement.EmitBoolExpression.
11132
11133         * statement.cs (Statement.EmitBoolExpression): Use
11134         EmitBranchable. 
11135
11136 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
11137
11138         * statement.cs (For): Reduce the number of jumps in loops.
11139
11140         (For): Implement loop inversion for the For statement.
11141
11142         (Break): We can be breaking out of a Try/Catch controlled section
11143         (foreach might have an implicit try/catch clause), so we need to
11144         use Leave instead of Br.
11145
11146         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
11147         now).  If the instace expression supports IMemoryLocation, we use
11148         the AddressOf method from the IMemoryLocation to extract the
11149         address instead of emitting the instance.
11150
11151         This showed up with `This', as we were emitting the instance
11152         always (Emit) instead of the Address of This.  Particularly
11153         interesting when This is a value type, as we dont want the Emit
11154         effect (which was to load the object).
11155
11156 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
11157
11158         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
11159
11160         * statement.cs (Checked): Set the CheckedState during the resolve
11161         process too, as the ConvCast operations track the checked state on
11162         the resolve process, and not emit.
11163
11164         * cs-parser.jay (namespace_member_declaration): Flag that we have
11165         found a declaration when we do.  This is used to flag error 1529
11166
11167         * driver.cs: Report ok when we display the help only.
11168
11169 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
11170
11171         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
11172
11173 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
11174
11175         * cs-tokenizer.cs (define): We also have to track locally the
11176         defines.  AllDefines is just used for the Conditional Attribute,
11177         but we also need the local defines for the current source code. 
11178
11179 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
11180
11181         * statement.cs (While, For, Do): These loops can exit through a
11182         Break statement, use this information to tell whether the
11183         statement is the last piece of code.
11184
11185         (Break): Flag that we break.
11186
11187         * codegen.cs (EmitContexts): New `Breaks' state variable.
11188
11189 2002-07-03  Martin Baulig  <martin@gnome.org>
11190
11191         * class.cs (TypeContainer.MethodModifiersValid): Allow override
11192         modifiers in method declarations in structs.  Otherwise, you won't
11193         be able to override things like Object.Equals().
11194
11195 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11196
11197         * class.cs (Method, Property, Indexer): Do not allow the public
11198         modifier to be used in explicit interface implementations.
11199
11200         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
11201         override modifiers in method declarations in structs
11202
11203 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
11204
11205         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
11206         integer or real overflow, report an error
11207
11208 2002-07-02  Martin Baulig  <martin@gnome.org>
11209
11210         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
11211         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
11212         to tell the runtime about our newly created System.Object and
11213         System.ValueType types.
11214
11215 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11216
11217         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
11218         struct instead of Ldarg/Starg.
11219
11220 2002-07-02  Martin Baulig  <martin@gnome.org>
11221
11222         * expression.cs (Indirection.Indirection): Call
11223         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
11224
11225 2002-07-02  Martin Baulig  <martin@gnome.org>
11226
11227         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
11228         ValueType, call TypeManager.TypeToCoreType() on it.
11229         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
11230         the OpCodes.Newarr argument.
11231
11232 2002-07-02  Martin Baulig  <martin@gnome.org>
11233
11234         * expression.cs (Invocation.EmitCall): When compiling corlib,
11235         replace all calls to the system's System.Array type to calls to
11236         the newly created one.
11237
11238         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
11239         System.Array methods.
11240         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
11241         from the system's System.Array type which must be replaced.
11242
11243 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
11244
11245         * typemanager.cs: load unverifiable_code_ctor so we can build
11246         corlib using the correct type. Avoid using GetTypeCode() with
11247         TypeBuilders.
11248         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
11249         TypeManager.object_type to allow building corlib.
11250
11251 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
11252
11253         * ecore.cs: handle System.Enum separately in LoadFromPtr().
11254
11255 2002-07-01  Martin Baulig  <martin@gnome.org>
11256
11257         * class.cs: Make the last change actually work, we need to check
11258         whether `ifaces != null' to avoid a crash.
11259
11260 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11261
11262         * class.cs: when we build structs without fields that implement
11263         interfaces, we need to add the interfaces separately, since there is
11264         no API to both set the size and add the interfaces at type creation
11265         time.
11266
11267 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11268
11269         * expression.cs: the dimension arguments to the array constructors
11270         need to be converted if they are a long.
11271
11272 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
11273
11274         * class.cs: don't emit ldarg.0 if there is no parent constructor
11275         (fixes showstopper for corlib).
11276
11277 2002-06-29  Martin Baulig  <martin@gnome.org>
11278
11279         MCS now compiles corlib on GNU/Linux :-)
11280
11281         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
11282         ie. check for MethodImplOptions.InternalCall.
11283
11284         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
11285         and TypeManager.attribute_type are null, so we must explicitly check
11286         whether parent is not null to find out whether it's an attribute type.
11287         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
11288         and SetBuilder, not only if the property is neither abstract nor external.
11289         This is necessary to set the MethodImplOptions on the accessor methods.
11290         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
11291         SetBuilder, see Property.Emit().
11292
11293         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
11294         populate "System.Object", "System.ValueType" and "System.Attribute" since
11295         they've already been populated from BootCorlib_PopulateCoreTypes().
11296
11297 2002-06-29  Martin Baulig  <martin@gnome.org>
11298
11299         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
11300         is the NullLiteral, we also need to make sure that target_type is not
11301         an enum type.   
11302
11303 2002-06-29  Martin Baulig  <martin@gnome.org>
11304
11305         * rootcontext.cs (RootContext.ResolveCore): We must initialize
11306         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
11307         before calling BootstrapCorlib_ResolveDelegate ().
11308
11309 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11310
11311         * statement.cs: fixed build-breaker. All tests passed ok.
11312
11313 2002-06-27  Martin Baulig  <martin@gnome.org>
11314
11315         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
11316         for System.Decimal when compiling corlib.
11317
11318 2002-06-27  Martin Baulig  <martin@gnome.org>
11319
11320         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
11321         switch blocks which contain nothing but a default clause.
11322
11323 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
11324
11325        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
11326
11327 2002-06-27  Martin Baulig  <martin@gnome.org>
11328
11329         * ecore.cs (PropertyExpr.PropertyExpr): Call
11330         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
11331
11332         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
11333         is already a TypeBuilder.
11334
11335 2002-06-27  Martin Baulig  <martin@gnome.org>
11336
11337         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
11338         `target_type == TypeManager.array_type', not IsAssignableFrom() in
11339         the "from an array-type to System.Array" case.  This makes it work
11340         when compiling corlib.
11341
11342 2002-06-27  Martin Baulig  <martin@gnome.org>
11343
11344         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
11345         non-static PropertyExpr, set its InstanceExpression.  This makes
11346         the `ICollection.Count' property work in System/Array.cs.
11347
11348 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
11349
11350         * driver.cs: Made error handling more consistent.  Errors now
11351         tracked by Report class, so many methods which used to return int
11352         now return void.  Main() now prints success/failure and 
11353         errors/warnings message.
11354
11355         Renamed '--probe' compiler argument to '--expect-error'.  Removed
11356         the magic number return values (123 and 124).  Now, if the
11357         expected error occurs, the compiler exits with success (exit value
11358         0).  If the compilation completes without seeing that particular
11359         error, the compiler exits with failure (exit value 1).  The
11360         makefile in mcs/errors has been changed to handle the new behaviour.
11361
11362         * report.cs: Made 'expected error' number a property and renamed
11363         it from 'Probe' to 'ExpectedError'.
11364
11365         * genericparser.cs: Removed error handling support, since it is
11366         now all done by Report class.
11367
11368         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
11369         class, so parse() no longer returns an int.
11370
11371         * namespace.cs: Use Report.Error instead of GenericParser.error
11372
11373 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
11374
11375         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
11376         TypeContainer.AddOperator): At the front of the list put the
11377         explicit implementations, so they get resolved/defined first. 
11378
11379 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
11380
11381         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
11382         interface type is implemented by this TypeContainer.  Used during
11383         explicit interface implementation.
11384
11385         (Property.Define, Indexer.Define, Method.Define): Validate that
11386         the given interface in the explicit implementation is one of the
11387         base classes for the containing type.
11388
11389         Also if we are explicitly implementing an interface, but there is
11390         no match in the pending implementation table, report an error.
11391
11392         (Property.Define): Only define the property if we are
11393         not explicitly implementing a property from an interface.  Use the
11394         correct name also for those properties (the same CSC uses,
11395         although that is really not needed).
11396
11397         (Property.Emit): Do not emit attributes for explicitly implemented
11398         properties, as there is no TypeBuilder.
11399
11400         (Indexer.Emit): ditto.
11401
11402         Hiding then means that we do not really *implement* a pending
11403         implementation, which makes code fail.
11404
11405 2002-06-22  Martin Baulig  <martin@gnome.org>
11406
11407         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
11408         the return value of Object.GetType().  [FIXME: we need to do this whenever
11409         we get a type back from the reflection library].
11410
11411 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
11412
11413         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
11414
11415 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
11416
11417         * attribute.cs: Return null if we can not look up the type.
11418
11419         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
11420         the interface types found.
11421
11422         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
11423         interface types found.
11424
11425         * typemanager.cs (GetInterfaces): Make this routine returns alll
11426         the interfaces and work around the lame differences between
11427         System.Type and System.Reflection.Emit.TypeBuilder in the results
11428         result for GetInterfaces.
11429
11430         (ExpandInterfaces): Given an array of interface types, expand and
11431         eliminate repeated ocurrences of an interface.  This expands in
11432         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
11433         be IA, IB, IC.
11434
11435 2002-06-21  Martin Baulig  <martin@gnome.org>
11436
11437         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
11438         on System.Enum.
11439
11440 2002-06-21  Martin Baulig  <martin@gnome.org>
11441
11442         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
11443         and called with one of the core types, return the corresponding typebuilder for
11444         that type.
11445
11446         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
11447         element type.
11448
11449 2002-06-21  Martin Baulig  <martin@gnome.org>
11450
11451         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
11452         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
11453         (Expression.ConvertReferenceExplicit): Likewise.
11454
11455         * expression.cs (ElementAccess.DoResolve): Likewise.
11456         (ElementAccess.DoResolveLValue): Likewise.
11457
11458 2002-06-10  Martin Baulig  <martin@gnome.org>
11459
11460         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
11461         add the "value" parameter to the parameter list.
11462
11463         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
11464         to our caller.
11465
11466 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
11467
11468         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
11469         the argument to an int, uint, long or ulong, per the spec.  Also
11470         catch negative constants in array creation.
11471
11472 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
11473
11474         * class.cs: do not allow the same interface to appear twice in
11475         the definition list.
11476
11477 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
11478
11479         * ecore.cs: don't use ldlen with System.Array.
11480
11481 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
11482
11483         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
11484
11485 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
11486
11487         * modifiers.cs: produce correct field attributes for protected
11488         internal. Easy fix so miguel can work on ther harder stuff:-)
11489
11490 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
11491
11492         * pending.cs: New file.  Move the code from class.cs here.
11493         Support clearning the pending flag for all methods (when not doing
11494         explicit interface implementation).
11495
11496 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
11497
11498         * rootcontext.cs: added a couple more types needed to bootstrap.
11499
11500 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
11501
11502         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
11503         constructor in the type, instead of any constructor in the type
11504         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
11505         a bug in the Mono runtime when applying the params attribute). 
11506
11507 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
11508         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
11509
11510 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
11511
11512         * expression.cs (Unary.ResolveOperator): Use TypeManager
11513         to resolve the type.
11514
11515 2002-06-13  Ravi Pratap  <ravi@ximian.com>
11516
11517         * cs-parser.jay (enum_member_declaration): Pass in the attributes
11518         attached.
11519
11520         * enum.cs (AddEnumMember): Add support to store the attributes associated 
11521         with each member too.
11522
11523         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
11524         field builders too - this takes care of the enum member case.
11525
11526 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
11527
11528         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
11529         address-of operator on both value types and pointers.
11530
11531 2002-06-10  Martin Baulig  <martin@gnome.org>
11532
11533         * interface.cs (Interface.PopulateIndexer): Add the indexer's
11534         PropertyBuilder to the `property_builders' list.
11535
11536         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
11537         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
11538         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
11539         find any indexers which are inherited from an interface.
11540
11541 2002-06-09  Martin Baulig  <martin@gnome.org>
11542
11543         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
11544         the same type as the constant if necessary.  There's also a test-130.cs
11545         for this.
11546
11547         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
11548
11549         * typemanager.cs (TypeManager.ChangeType): Previously known as
11550         Enum.ChangeEnumType().
11551
11552 2002-06-09  Martin Baulig  <martin@gnome.org>
11553
11554         * expression.cs (Cast.TryReduce): Added support for consts.
11555
11556 2002-06-08  Ravi Pratap  <ravi@ximian.com>
11557
11558         * class.cs (Accessor): Hold attributes information so we can pass
11559         it along.
11560
11561         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
11562         Modify to pass in attributes attached to the methods.
11563
11564         (add_accessor_declaration, remove_accessor_declaration): Ditto.
11565
11566         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
11567         to handle the Accessor kind :-)
11568
11569         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
11570
11571 2002-06-08  Martin Baulig  <martin@gnome.org>
11572
11573         * expression.cs (Unary.TryReduceNegative): Added support for
11574         ULongConstants.
11575
11576 2002-06-08  Martin Baulig  <martin@gnome.org>
11577
11578         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
11579         name can't be found in the `defined_names' - the caller will do a
11580         MemberLookup in this case and thus find methods in System.Enum
11581         such as Enum.IsDefined().
11582
11583 2002-06-08  Martin Baulig  <martin@gnome.org>
11584
11585         * enum.cs (Enum.ChangeEnumType): This is a custom version of
11586         Convert.ChangeType() which works with TypeBuilder created types.
11587         (Enum.LookupEnumValue, Enum.Define): Use it here.
11588
11589         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
11590         `TypeBuilder.BaseType != null' check.
11591         (TypeContainer.FindMembers): Only lookup parent members if we
11592         actually have a parent.
11593         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
11594         (ConstructorInitializer.Resolve): Likewise.
11595
11596         * interface.cs (Interface.FindMembers): Added
11597         `TypeBuilder.BaseType != null' check.
11598
11599         * rootcontext.cs (RootContext.ResolveCore): Added
11600         "System.Runtime.CompilerServices.IndexerNameAttribute" to
11601         classes_second_stage.
11602
11603         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
11604         debug_type and trace_type when compiling with --nostdlib.       
11605
11606 2002-06-07  Martin Baulig  <martin@gnome.org>
11607
11608         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
11609         (AddField): Set it to true when adding a non-static field.
11610         (DefineType): Use `have_nonstatic_fields' to find out whether we
11611         have non-static fields, not `Fields != null'.
11612
11613 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
11614
11615         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
11616         dereferencing a null on the static-field code path)
11617
11618 2002-05-30  Martin Baulig  <martin@gnome.org>
11619
11620         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
11621         to take command line arguments.  Use reflection to call the new
11622         custom `Initialize' function on the symbol writer and pass it the
11623         command line arguments.
11624
11625         * driver.cs (--debug-args): New command line argument to pass command
11626         line arguments to the symbol writer.
11627
11628 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11629
11630         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11631         the target type for indexers and properties.  Thanks to Joe for
11632         catching this.
11633
11634 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11635
11636         * typemanager.cs (MethodFlags): returns the method flags
11637         (Obsolete/ShouldIgnore) that control warning emission and whether
11638         the invocation should be made, or ignored. 
11639
11640         * expression.cs (Invocation.Emit): Remove previous hack, we should
11641         not do this on matching a base type, we should do this based on an attribute
11642
11643         Only emit calls to System.Diagnostics.Debug and
11644         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11645         on the command line.
11646
11647         * rootcontext.cs: Global settings for tracing and debugging.
11648
11649         * cs-tokenizer.cs (define): New utility function to track
11650         defines.   Set the global settings for TRACE and DEBUG if found.
11651
11652 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11653
11654         * interface.cs (Populate*): Pass in the TypeContainer as well as
11655         the DeclSpace as parameters so that we can create EmitContexts and
11656         then use that to apply attributes etc.
11657
11658         (PopulateMethod, PopulateEvent, PopulateProperty)
11659         (PopulateIndexer): Apply attributes everywhere.
11660
11661         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11662         etc.
11663
11664         (ApplyAttributes): Update accordingly.
11665
11666         We now apply interface attributes for all members too.
11667
11668 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11669
11670         * class.cs (Indexer.Define); Correctly check if we are explicit
11671         implementation (instead of checking the Name for a ".", we
11672         directly look up if the InterfaceType was specified).
11673
11674         Delay the creation of the PropertyBuilder.
11675
11676         Only create the PropertyBuilder if we are not an explicit
11677         interface implementation.   This means that explicit interface
11678         implementation members do not participate in regular function
11679         lookups, and hence fixes another major ambiguity problem in
11680         overload resolution (that was the visible effect).
11681
11682         (DefineMethod): Return whether we are doing an interface
11683         implementation. 
11684
11685         * typemanager.cs: Temporary hack until we get attributes in
11686         interfaces (Ravi is working on that) and we get IndexerName
11687         support in interfaces.
11688
11689         * interface.cs: Register the indexers as properties.
11690
11691         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11692         warning, I have verified that this is a bug in the .NET runtime
11693         (JavaScript suffers of the same problem).
11694
11695         * typemanager.cs (MemberLookup): When looking up members for
11696         interfaces, the parent of an interface is the implicit
11697         System.Object (so we succeed in searches of Object methods in an
11698         interface method invocation.  Example:  IEnumerable x;  x.ToString
11699         ()) 
11700
11701 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11702
11703         * class.cs (Event): Events should also register if they do
11704         implement the methods that an interface requires.
11705
11706         * typemanager.cs (MemberLookup); use the new GetInterfaces
11707         method. 
11708
11709         (GetInterfaces): The code used to lookup interfaces for a type is
11710         used in more than one place, factor it here. 
11711
11712         * driver.cs: Track the errors at the bottom of the file, we kept
11713         on going.
11714
11715         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11716         instance if the method we are calling is static!
11717
11718 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11719
11720         * attribute.cs (ApplyAttributes): Make this function filter out
11721         the IndexerName attribute (as that attribute in reality is never
11722         applied) and return the string constant for the IndexerName
11723         attribute. 
11724
11725         * class.cs (TypeContainer.Emit): Validate that all the indexers
11726         have the same IndexerName attribute, and if so, set the
11727         DefaultName attribute on the class. 
11728
11729         * typemanager.cs: The return value might contain other stuff (not
11730         only methods).  For instance, consider a method with an "Item"
11731         property and an Item method.
11732
11733         * class.cs: If there is a problem with the parameter types,
11734         return. 
11735
11736 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11737
11738         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11739         looks at user defined conversion after making a call to 
11740         StandardConversionExists - we need this for overload resolution.
11741
11742         * expression.cs : Update accordingly the various method calls.
11743
11744         This fixes 2 bugs filed against implicit user defined conversions 
11745
11746 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11747
11748         * statement.cs: Track the result of the assignment.
11749
11750 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11751
11752         * expression.cs (MemberAccess): Improved error reporting for
11753         inaccessible members.
11754
11755 2002-05-22  Martin Baulig  <martin@gnome.org>
11756
11757         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11758         itself with debugging support.
11759
11760 2002-05-22  Martin Baulig  <martin@gnome.org>
11761
11762         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11763         Removed, this isn't needed anymore.
11764
11765 2002-05-20  Martin Baulig  <martin@gnome.org>
11766
11767         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11768         be underlying type for an enum.
11769
11770 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11771
11772         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11773         that splits out the loading of just the core types.
11774
11775         * rootcontext.cs (ResolveCore): Split the struct resolution in
11776         two, so we can load the enumeration underlying types before any
11777         enums are used.
11778
11779         * expression.cs (Is): Bandaid until we fix properly Switch (see
11780         bug #24985 for details).
11781
11782         * typemanager.cs (ImplementsInterface): The hashtable will contain
11783         a null if there are no interfaces implemented.
11784
11785 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11786
11787         * cs-parser.jay (indexer_declarator): It is fine to have array
11788         parameters
11789
11790 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11791
11792         * typemanager.cs: (RegisterBuilder): New function used to register
11793         TypeBuilders that implement interfaces.  Since
11794         TypeBuilder.GetInterfaces (as usual) does not work with lame
11795         Reflection.Emit. 
11796         (AddUserType): register interfaces.
11797
11798         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11799         dealing with TypeBuilder.  Also, arrays are showing up as
11800         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11801         methods can not be invoked on them!
11802
11803         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11804         (ImplicitReferenceConversionExists): Split out from
11805         StandardConversionExists. 
11806
11807         * expression.cs (As): We were only implementing one of the three
11808         cases for the as operator.  We now implement them all.
11809         (Is): Implement the various other cases for Is as well.
11810
11811         * typemanager.cs (CACHE): New define used to control if we want or
11812         not the FindMembers cache.  Seems to have a negative impact on
11813         performance currently
11814
11815         (MemberLookup): Nested types have full acess to
11816         enclosing type members
11817
11818         Remove code that coped with instance/static returns for events, we
11819         now catch this in RealFindMembers.
11820
11821         (RealFindMembers): only perform static lookup if the instance
11822         lookup did not return a type or an event.  
11823
11824 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11825
11826         * assign.cs (CompoundAssign): We pass more semantic information
11827         now to Compound Assignments than we did before: now we have all
11828         the information at hand, and now we resolve the target *before* we
11829         do the expression expansion, which allows the "CacheValue" method
11830         to have the effect we intended (before, a [x] += 1 would generate
11831         two differen ArrayAccess expressions from the ElementAccess,
11832         during the resolution process).
11833
11834         (CompoundAssign.DoResolve): Resolve target and original_source here.
11835
11836 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11837
11838         * expression.cs (ArrayAccess): dropped debugging information. 
11839
11840         * typemanager.cs: Small bug fix: I was always returning i_members,
11841         instead of one of i_members or s_members (depending on which had
11842         the content).
11843
11844         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11845         method is invoked before any code generation takes place, and it
11846         is a mechanism to inform that the expression will be invoked more
11847         than once, and that the method should use temporary values to
11848         avoid having side effects
11849
11850         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11851
11852         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11853         implementation.
11854
11855         * expression.cs (Indirection, ArrayAccess): Add support for
11856         CacheTemporaries in these two bad boys. 
11857
11858         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11859         ldobj or ldind_ref.  
11860         (StoreFromPtr): Handle stobj as well.
11861
11862         * expression.cs (UnaryMutator): Share more code.
11863
11864         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11865         down: I was not tracking the Filter function as well, which
11866         was affecting the results of the cache.
11867
11868 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11869
11870         * attribute.cs: Remove the hack to handle the CharSet property on
11871         StructLayouts. 
11872
11873 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11874
11875         * attribute.cs (DoResolve): More uglyness, we now only try to
11876         resolve the attribute partially, to extract the CharSet
11877         information (only if we are a StructLayout attribute).  Otherwise 
11878
11879         (GetExtraTypeInfo): Add some code to conditionally kill in the
11880         future this.   I am more and more convinced that the .NET
11881         framework has special code to handle the attribute setting on
11882         certain elements.
11883
11884         * expression.cs (IsParamsMethodApplicable): Revert my previous
11885         foreach change here, it was wrong.
11886
11887 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11888
11889         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11890         (pp_expr): do not abort on unknown input, just return.
11891         (eval): abort if there are pending chars.
11892
11893         * attribute.cs (Attribute.Resolve): Positional parameters are
11894         optional.  Deal with that case.
11895
11896         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11897         the Ansi/Unicode/Auto information for the type.
11898
11899         (TypeContainer.DefineType): instantiate the EmitContext here, as
11900         we will be using it during the type definition (to resolve
11901         attributes) and during the emit phase.
11902
11903         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11904         to pull type information out of the attributes
11905
11906         (Attribute.Resolve): track the constructor builder, and allow for
11907         multiple invocations (structs and classes will use this).
11908
11909         * ecore.cs (MemberLookupFinal): new version with all the
11910         parameters customizable.
11911
11912         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11913         constructors.  Return if the result value is null (as the error
11914         would have been flagged already by MemberLookupFinal)
11915
11916         Do not allow instances of abstract classes or interfaces to be
11917         created.
11918
11919         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11920         We have to compare the assembly property here when dealing with
11921         FamANDAssem and Assembly access modifiers, because we might be
11922         creating an assembly from *modules* (that means that we are not
11923         getting TypeBuilders for types defined in other modules that are
11924         part of this assembly).
11925
11926         (Method.Emit): If the method is marked abstract and has a body,
11927         emit an error. 
11928
11929         (TypeContainer.DefineMembers): If both the defined member and the
11930         parent name match are methods, then do not emit any warnings: let
11931         the Method.Define routine take care of flagging warnings.  But if
11932         there is a mismatch (method overrides something else, or method is
11933         overriwritten by something, then emit warning).
11934
11935         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11936         set to null, this means `do not check for the return type on the
11937         signature'. 
11938
11939         (Method.Define): set the return type for the method signature to
11940         null, so that we get methods with the same name and parameters and
11941         different return types.  This is used to flag warning 114 (you are
11942         hiding a method, and you probably want to use the new/override
11943         keywords instead).
11944
11945         * typemanager.cs (MemberLookup): Implemented proper access
11946         control, closing a long standing set of bug reports.  The problem
11947         was that the Framework only has two bits: Public and NonPublic,
11948         and NonPublic includes private and protected methods, but we need
11949         to enforce the FamANDAssem, FamOrAssem and Family. 
11950
11951 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11952
11953         * statement.cs (GotoCase): Return true: Ammounts to giving up
11954         knowledge on whether we return or not, and letting the other case
11955         be responsible for it.
11956
11957 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11958
11959         * driver.cs: Do not load directories for each file processed, only
11960         do it if there is a pattern.
11961
11962         * ecore.cs: Report readonly assigns here as well, as we might have
11963         been resolved only by MemberAccess.
11964
11965         (SimpleName.SimpleNameResolve): Also be useful for LValue
11966         resolution.   We need this to propagate assign to local readonly variables
11967
11968         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11969         do not want to reuse potential criteria memory.
11970
11971         * class.cs (MyEventBuilder): Set reflected_type;
11972
11973         * ecore.cs (Constantify): Added support for constifying bools.
11974
11975         (RootContext.LookupType): Added a cache for values looked up in
11976         the declaration space.
11977
11978         * typemanager.cs (FindMembers): Now is a front-end to
11979         RealFindMembers, and provides a two-level hashtable-based cache to
11980         the request.  
11981
11982         15% performance improvement: from 22.5 to 19.2 seconds.
11983
11984         * expression.cs (IsParamsMethodApplicable): use foreach.
11985         (Invocation.DoResolve): ditto.
11986         (New.DoResolve): ditto.
11987         (ArrayCreation.DoResolve): ditto.
11988
11989         * ecore.cs (FindMostEncompassingType): use foreach.
11990
11991         * delegate.cs (NewDelegate.DoResolve): Use foreach
11992
11993         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11994         (RemoveMethods): use foreach.
11995
11996         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11997         nested foreach statements instead of for, and also break out of
11998         the inner loop once a match is found.
11999
12000         (Invocation.OverloadResolve): Use foreach, simplify the code. 
12001
12002 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
12003
12004         * cfold.cs (BinaryFold): During an enumeration evaluation context,
12005         we actually unwrap the expression to allow for extra information
12006         to be extracted. 
12007
12008         * expression.cs: Use Shr_Un on unsigned operations. 
12009
12010 2002-05-08  Ravi Pratap  <ravi@ximian.com>
12011
12012         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
12013         applicable operators was not being considered correctly. This closes
12014         the bug Miguel reported.
12015
12016 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
12017
12018         * attribute.cs: check that the type derives from System.Attribute
12019         and report the correct error in that case (moved the duplicate code to
12020         its own method, too).
12021
12022 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
12023
12024         * attribute.cs: lookup attribute type name as the spec says: first the
12025         bare attribute name and then name + "Attribute" (nant compiles with
12026         mcs after this fix).
12027
12028 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
12029
12030         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
12031         Because of the way we parse things, we should try to see if a
12032         UIntConstant can fit in an integer.
12033
12034 2002-05-07  Ravi Pratap  <ravi@ximian.com>
12035
12036         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
12037         when we are in an explicit context.
12038
12039         (ConvertReferenceExplicit): When converting from Iface type S to Class
12040         T make sure the rules are implemented as an OR.
12041
12042         * parameter.cs (ParameterType): Make it a property for now although the
12043         purpose really isn't anything immediate.
12044
12045         * expression.cs (Is*Applicable): Do better checking on the parameter type
12046         of a ref/out parameter. The ones from the system assemblies are already 
12047         marked with the correct type so we don't need to do any correction.
12048
12049         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
12050         the object type is standard too so include that.
12051
12052 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12053
12054         * ecore.cs (StandardConversionExists): Augment with missing code:
12055         deal with IntConstant, LongConstants and Enumerations.
12056
12057         * assign.cs: Report the error, instead of failing silently
12058
12059         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
12060         typecontainer that they are declared, because the
12061         typecontainer/namespace will have the list of using clauses that
12062         need to be applied.
12063
12064         Assembly Attributes were escaping the normal registration
12065         mechanism. 
12066
12067         (EmitCode): Apply attributes within an EmitContext that represents
12068         the container they were declared on.
12069
12070         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
12071
12072 2002-05-06  Ravi Pratap  <ravi@ximian.com>
12073
12074         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
12075         Revamp completely - make much cleaner as we now operate only
12076         on a set of Types.
12077
12078         (FindMostSpecificSource, FindMostSpecificTarget): New methods
12079         to implement the logic detailed in the spec more correctly.
12080
12081         (UserDefinedConversion): Update accordingly.
12082
12083 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12084
12085         * statement.cs: Return flow analysis information up.
12086
12087         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
12088         and the default.
12089
12090         (token): Do not consume an extra character before calling
12091         decimal_digits.
12092
12093 2002-05-06  Piers Haken <piersh@friskit.com>
12094
12095         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
12096
12097 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12098
12099         * class.cs (Constructor.Emit): Set the IsStatic flag in the
12100         EmitContext during the instance constructor initializer
12101         resolution, to stop access to instance variables.
12102
12103         This is mandated by the spec, last paragraph of the `constructor
12104         initializers' section. 
12105
12106 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
12107
12108         * cs-parser.jay, class.cs (Accessor): new class used to represent
12109         an accessor (get or set).  In the past we used `null' to represent
12110         a missing accessor.  But this is ambiguous because there was no
12111         way to tell in abstract indexers/properties if one of them was
12112         specified.
12113
12114         Now there is a way of addressing that.
12115
12116         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
12117         instead of FindMembers.
12118
12119         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
12120         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
12121
12122         * attribute.cs: Treat indexers and properties as the same in terms
12123         of applying attributes
12124
12125         * ecore.cs (FindMostEncompassedType): Use statically initialized
12126         EmptyExpressions()s like we do elsewhere to avoid creating useless
12127         objects (and we take this out of the tight loop).
12128
12129         (GetConversionOperators): Move the code to extract the actual
12130         operators to a separate routine to clean things up.
12131
12132 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
12133
12134         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
12135         events are always registered FieldBuilders.
12136
12137         * class.cs (FieldBase): New class shared by Fields 
12138
12139         * delegate.cs: If we are a toplevel delegate, use our full name.
12140         If we are a nested delegate, then only use our tail name.
12141
12142 2002-05-02  Ravi Pratap  <ravi@ximian.com>
12143
12144         * expression.cs (IsApplicable): Ensure that we add the "&" to
12145         ref/out types before comparing it with the type of the argument.
12146
12147         (IsParamsMethodApplicable): Ditto.
12148
12149         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
12150         silly me ;-)
12151
12152         * delegate.cs : Handle the case when we have more than one applicable
12153         method. Flag an error only when we finish checking all.
12154
12155 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
12156
12157         * expression.cs: Add support for boolean static initializers.
12158
12159 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
12160
12161         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
12162
12163         * parameter.cs (ComputeParameterTypes,
12164         ComputeAndDefineParameterTypes): Better error handling: now we
12165         clear the `types' cache if we fail during any of the type lookups.
12166         We also return the status code correctly to our caller
12167
12168         * delegate.cs: If we fail to define a delegate, abort the extra
12169         steps. 
12170
12171         * expression.cs (Binary.ResolveOperator): for
12172         operator==(object,object) and operator !=(object, object) we also
12173         have to verify that there is an implicit conversion from one to
12174         the other.
12175
12176         (ArrayAccess.DoResolve): Array Access can operate on
12177         non-variables. 
12178
12179 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
12180
12181         * assign.cs (CompoundAssign): A new class used as a "flag" that
12182         the assignment actually is happening as part of a compound
12183         assignment operator.
12184
12185         During compound assignment, a few new rules exist to enable things
12186         like:
12187
12188         byte b |= 1 + 2
12189
12190         From the spec:
12191
12192         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
12193         to the type of x) if y is implicitly convertible to the type of x,
12194         and the operator is a builtin operator and the return type of the
12195         operator is explicitly convertible to the type of x. 
12196
12197         * rootcontext.cs: Reset warning level to 2.  4 catches various
12198         "interesting" features in mcs, we must clean this up at some
12199         point, but currently am trying to kill other bugs ;-)
12200
12201         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
12202         in container classes as well.  
12203
12204         * expression.cs (Binary.ResolveOperator): Handle string case
12205         before anything else (as operator overloading does emit an error
12206         before doing anything else).
12207
12208         This code could go away when we move to a table driven model, but
12209         i could not come up with a good plan last night.
12210
12211 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
12212
12213         * typemanager.cs (CSharpName): reimplementation using regex.
12214         * class.cs: added null check for fields in Emit
12215         * rootcontext.cs: set warninglevel to 4
12216
12217 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
12218
12219         * typemanager.cs (CSharpName): reimplemented with Lupus
12220         suggestion.
12221
12222 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
12223
12224         * statement.cs (If): correclty implement Resolve, because we were
12225         not catching sem errors in there.  The same process is needed
12226         everywhere else. 
12227         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
12228
12229
12230         (Statement.Warning_DeadCodeFound): Factorize code.
12231         (While): Report dead code here too.
12232
12233         (Statement): Added Resolve virtual method to allow
12234         for resolution split from the emit code.
12235
12236 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12237
12238         * statement.cs (EmitBoolExpression): No longer try to resolve the
12239         expression here.    
12240         (MakeBoolean): New utility function that resolve, implicitly
12241         converts to boolean and tags the expression. 
12242
12243
12244         (If, Do): Implement dead code elimination.
12245         (While): Implement loop inversion
12246
12247         (Do, While, For, If): Resolve the expression prior to calling our
12248         code generation.
12249
12250 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
12251
12252         * class.cs:
12253           - added method Report28 (warning: program has more than one entry point)
12254           - added method IsEntryPoint, implements paragraph 10.1 of the spec
12255           - modified method Method.Define, the part at the end of the method
12256
12257         * rootcontext.cs: added static public Location EntryPointLocation;
12258           
12259         * ../errors/cs0028.cs : Add test case for the above warning.              
12260
12261         * typemanager.cs:
12262           - modified method CSharpName to allow arrays of primitive type to
12263             be printed nicely (e.g. instead of System.Int32[][] it now prints
12264             int[][])
12265           - added method CSharpSignature: returns the signature of a method
12266             in string format to be used in reporting errors, warnings, etc.
12267
12268         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
12269         with String.Empty.
12270
12271 2002-04-26  Ravi Pratap  <ravi@ximian.com>
12272
12273         * delegate.cs (Define): Fix extremely silly bug where I was
12274         setting the type of the 'object' parameter of the BeginInvoke
12275         method to System.IAsyncResult instead of System.Object ;-)
12276
12277 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12278
12279         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
12280         here. 
12281
12282         (Constructor.Emit): return if we fail to initialize the
12283         constructor.  Another door closed!  
12284
12285         * expression.cs (New.DoResolve): Improve error message (from -6 to
12286         1501).  Use DeclaredOnly lookup to find the exact constructor.
12287
12288         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
12289         loop.  This is useful.
12290
12291         * cs-parser.jay: Adjust the default parameters so that destructors
12292         have the proper signature.
12293
12294 2002-04-26  Martin Baulig  <martin@gnome.org>
12295
12296         * driver.cs (LoadAssembly): If `assembly' contains any characters
12297         which are only valid in path names and not in assembly names
12298         (currently slash, backslash and point), use Assembly.LoadFrom ()
12299         instead of Assembly.Load () on the `assembly' (before iteration
12300         over the link_paths).
12301
12302 2002-04-26  Martin Baulig  <martin@gnome.org>
12303
12304         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
12305
12306 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
12307
12308         * class.cs (Property): use the new typemanager.MemberLookup
12309
12310         (TypeContainer.MemberLookup): Implement using the
12311         TypeManager.MemberLookup now. 
12312
12313         * typemanager.cs: Make MemberLookup a function of the TypeManager,
12314         and return MemberInfos, so that these can be used without an
12315         EmitContext (what we had before).
12316
12317 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
12318
12319         * expression.cs: Fix the case where the argument to params if the
12320         type of the params.  I omitted handling this before.   Fixed
12321
12322 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12323
12324         * driver.cs: Call BootCorlib_PopulateCoreType
12325
12326         * class.cs (Property.CheckBase): Check for properties only, not
12327         for all members. 
12328
12329         * interface.cs: Temporary hack: try/catch around the
12330         CustomAttributeBuilder, because I am getting an exception that I
12331         do not understand.
12332
12333         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
12334         types whose definitions are required to be there (attributes are
12335         defined before standard types).
12336
12337         Compute definitions as we boot the various types, as they are used
12338         immediately (value_type class will need object_type, but if we do
12339         not initialize object_type, we will pass a null, which will let
12340         the runtime pick the System.Object from the existing corlib, which
12341         is not what we want).
12342
12343 2002-04-22  Patrik Torstensson <totte@labs2.com>
12344
12345         * cs-tokenizer.cs: fixed a number of trim() issues.
12346
12347 2002-04-22  Ravi Pratap  <ravi@ximian.com>
12348
12349         * expression.cs (Argument.Type): Ensure that we return the correct
12350         type when we have out or ref parameters [in which case we 
12351         append a "&"].
12352
12353 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12354
12355         * class.cs (Property, Indexer): Allow extern modifier in there. 
12356
12357         * typemanager.cs (InitBaseTypes): Initializes object_type and
12358         value_type, since those will be used early on during the bootstrap
12359         process to compile corlib.
12360
12361         (InitCoreTypes): Move code from here to InitBaseTypes.
12362
12363 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
12364
12365         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
12366         single-dimension arrays as using the ldlen opcode.  
12367
12368         Daniel Lewis discovered this optimization.  
12369
12370         * typemanager.cs: Add signature for System.Array::get_Length
12371
12372 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12373
12374         * statement.cs: report the error when the foreach does not apply to an
12375         array nor a collection.
12376
12377 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
12378
12379         * expression.cs: Add implicit conversions to the operator ~.
12380
12381         * constant.cs (DecimalConstant.Emit): Emit decimal value.
12382
12383         * typemanager.cs: Locate the decimal constructor.
12384
12385 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12386
12387         * attribute.cs: use the new property of TypeOf.
12388         * expression.cs: added 'get' property around typearg.
12389
12390         These changes fix a build breaker reported by NickD. Is this the
12391         correct way to fix?  If not, please, revert my changes and make it
12392         work :-).
12393
12394 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
12395
12396         * attribute.cs: Add support for typeof in attribute invocations.
12397         I am not sure that this is right though.
12398
12399 2002-04-14  Duncan Mak  <duncan@ximian.com>
12400
12401         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
12402         Binary.Operator.Division case.
12403
12404 2002-04-13  Ravi Pratap  <ravi@ximian.com>
12405
12406         * class.cs (DefineType): Ensure that we do a proper check on
12407         attribute types and also register it with the TypeManager.
12408
12409         (TypeContainer.Targets): The default for attribute types is
12410         AttributeTargets.All.
12411
12412         * attribute.cs (ApplyAttributes): Registering the attribute type
12413         is done elsewhere, not when we discover we have a Usage attribute.
12414
12415 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12416
12417         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
12418         and get rid of is_delegate parameter.
12419
12420         * everywhere : update.
12421
12422 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12423
12424         * cs-parser.jay (compilation_unit): Revamp completely to use
12425         some new ideas that I got from Rhys' grammar to solve the problems
12426         with assembly level attributes.
12427
12428         (outer_declaration): New grammar production.
12429
12430         (attribute_sections): Add.
12431
12432         (opt_attributes): Base on attribute_sections
12433
12434         (namespace_declaration): Allow opt_attributes to tackle the case
12435         when we have assembly level attributes - we are clever in this
12436         regard now ;-)
12437
12438         * attribute.cs (ApplyAttributes): Do not worry about assembly 
12439         attributes in the non-global context.
12440
12441         * rootcontext.cs (AddGlobalAttributes): Go back to using this
12442         instead of SetGlobalAttributes.
12443
12444         * class.cs, rootcontext.cs : Ensure we define and generate 
12445         attribute types before anything else.
12446
12447         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
12448         and flag the new error -20 for the case when the attribute type
12449         does not have valid targets specified. csc does not catch this.
12450
12451         * ../errors/errors.txt : update for error # -20
12452
12453 2002-04-11  Ravi Pratap  <ravi@ximian.com>
12454
12455         * support.cs (InternalParameters.ParameterModifier): Do some null
12456         checking and return sane values.
12457
12458         * class.cs (Method.Define): If we are a PInvoke method, ensure
12459         that we are static and extern. Report error # 601
12460
12461         * ../errors/cs0601.cs : Add test case for the above error.
12462
12463 2002-04-07  Ravi Pratap  <ravi@ximian.com>
12464
12465         * rootcontext.cs (attribute_types): We need to keep type of
12466         all attribute types separately and emit code for them first.
12467
12468         (RegisterAttribute) : Implement.
12469
12470         * class.cs (DefineType): Check if the current Type is a custom
12471         attribute type and register it accordingly.
12472
12473         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
12474         adding the first attribute twice and rename to
12475
12476         (SetGlobalAttributes): this.
12477
12478         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
12479         lookups.
12480
12481         * attribute.cs (ApplyAttributes): Take an additional argument telling us
12482         if we are processing global arguments. Hmm, I am unsure of this.
12483
12484 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12485
12486         * expression.cs: added static array of strings to avoid calling
12487         Enum.ToString () for Operator in Binary. Significant recover of
12488         performance.
12489
12490 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
12491
12492         * class.cs (FindMembers): Allow the Builders of the various
12493         members to be null.  If they are skip them.  This only happens
12494         during the PInvoke declaration.
12495
12496 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
12497
12498         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
12499         failure, so we do not keep going afterwards.
12500
12501         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
12502         wanted to pass `false' as the `is_delegate' argument.  If this is
12503         the case, why not use delegate_type == null to mean `is_delegate =
12504         false' and anything else as is_delegate = true.
12505
12506 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
12507
12508         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
12509         code for the section, not the beginning of the tests.
12510
12511 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
12512
12513         * cfold.cs: Handle operator + (Enum x, Underlying x) 
12514
12515         * expression.cs (Binary): same.  Warn about errors where we have
12516         Enum/Enum in operator + as well.
12517
12518 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
12519
12520         * statement.cs:
12521                 - added support for switch(bool)
12522                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
12523                 - add TableSwitchEmit() to handle table-based switch statements
12524
12525 2002-04-05  Ravi Pratap  <ravi@ximian.com>
12526
12527         * expression.cs (Invocation.OverloadResolve): Factor out code which
12528         does parameter compatibility checking with arguments so that we can 
12529         re-use the code even from Delegate.VerifyApplicability
12530
12531         (VerifyArgumentsCompat): Move above code here.
12532
12533         * delegate.cs (VerifyApplicability): Get rid of duplicate code
12534         and instead make a call to the above method.
12535
12536 2002-03-31  Ravi Pratap  <ravi@ximian.com>
12537
12538         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
12539         We use it to keep track of classes which are attribute types.
12540
12541 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
12542
12543         * delegate.cs (Delegate.Define): Correctly define the types in the
12544         presence of fixed and array parameters.
12545
12546         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
12547         doing FindMembers.
12548
12549         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
12550         include NonPublic after the first iteration.
12551
12552         * class.cs (Indexer.CheckBase): Only check if both parents are
12553         non-null. 
12554
12555         * cs-parser.jay (accessor_body): If empty, set to null.
12556
12557         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
12558         same code path here to resolve constants names that we did have in
12559         MemberAccess.DoResolve.  There is too much code duplicated here.
12560
12561 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
12562
12563         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
12564
12565         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
12566         to MakeUnionSet.
12567
12568         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
12569         tokens, numbers and strings.
12570
12571         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
12572         parenthesis.
12573
12574         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
12575         asyncronous parameters and the regular parameters.  
12576
12577         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
12578         specify the target directory.
12579
12580         * expression.cs: (This.DoResolve): Simplify
12581         (As.Emit): Optimize, do not generate IsInst if the expression is
12582         always of the given type.
12583
12584         (Is.DoResolve): Bug fix, we were reporting both always/never for
12585         the is expression.
12586
12587         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
12588         creating too many unnecessary arrays.
12589
12590 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
12591
12592         * class.cs (EmitFieldInitializer): Use Assign expression to assign
12593         fields instead of rolling our own initializer.   Takes care of all
12594         implicit conversions, and drops unnecessary static checks/argument.
12595
12596 2002-03-31  Dick Porter  <dick@ximian.com>
12597
12598         * driver.cs: use the GetDirectories() return values properly, and
12599         use "/" as path separator.
12600
12601 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
12602
12603         * expression.cs (Unary): Optimize - - expr into expr.
12604         (Binary): Optimize a + (-b) into a -b.
12605
12606         * codegen.cs (CodeGen): Made all methods static.
12607
12608 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
12609
12610         * rootcontext.cs: 
12611
12612         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
12613         TypeBuilder property.
12614
12615         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
12616         instead. 
12617
12618         * tree.cs: Removed the various RecordXXXX, and replaced with a
12619         single RecordDecl.  Removed all the accessor methods, and just
12620         left a single access point Type 
12621
12622         * enum.cs: Rename DefineEnum to DefineType.
12623
12624         * decl.cs: New abstract method `DefineType' used to unify the
12625         Defines for Enumerations, Interfaces, TypeContainers and
12626         Delegates.
12627
12628         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12629         LookupBaseClasses method that used to live in class.cs and
12630         interface.cs here, and renamed to FindType.
12631
12632         * delegate.cs: Implement DefineType.  Take advantage of the
12633         refactored pattern for locating the parent builder without taking
12634         the parent_builder argument (which we know does not work if we are
12635         nested, and triggering a toplevel definition).
12636
12637 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12638
12639         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12640         accessibility of a member has changed during override and report
12641         an error if so.
12642
12643         * class.cs (Method.Define, Property.Define): Only complain on
12644         overrides if the method is private, any other accessibility is
12645         fine (and since we just checked the permission is the same, we are
12646         good to go).
12647
12648         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12649         and elif are processed always.  The other pre-processing
12650         directives are only processed if we are "taking" the path
12651
12652 2002-03-29  Martin Baulig  <martin@gnome.org>
12653
12654         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12655         current location is not Null.
12656
12657         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12658         a separate method so we can profile it.
12659
12660         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12661         `span.Seconds' are just seconds, but no minutes or hours.
12662         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12663
12664 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12665
12666         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12667         Remove the gratuitous set of Final:
12668
12669                                 // If an interface implementation, then we can set Final.
12670                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12671                                     implementing.DeclaringType.IsInterface)
12672                                         flags |= MethodAttributes.Final;
12673
12674         I do not know what I was smoking when I used that.
12675
12676
12677         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12678         step into fixing the name resolution issues for delegates and
12679         unifying the toplevel name resolution.
12680
12681 2002-03-28  Martin Baulig  <martin@gnome.org>
12682
12683         * class.cs (Method.Emit): If we have a symbol writer, call its
12684         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12685         tell it about the current method.
12686
12687         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12688         writer that we're going to emit the first byte of IL code for a new
12689         statement (a new source line).
12690         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12691         EmitContext.Mark() before emitting any code.
12692
12693         * location.cs (SymbolDocument): Return null when we're Null.
12694
12695         * statement.cs (Statement): Moved the `Location loc' variable here.
12696         (Statement.EmitBoolExpression): If we have a symbol writer, call
12697         ec.Mark() before emitting any code to tell it that we're at the
12698         beginning of a new statement.
12699         (StatementExpression): Added `Location' argument to the constructor.
12700         (Block): Added public readonly variable `StartLocation' and public
12701         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12702         (Block): Added constructor which takes a start and end location.
12703         (Block.SetEndLocation): New method. This sets the end location.
12704         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12705         local variables we create.
12706         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12707         each statement and do also mark the begin and end of the block.
12708
12709         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12710         tell it the current lexer.Location, use Location.Null for the end of the
12711         block.
12712         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12713         current block, set its end location using SetEndLocation().
12714         (statement_expression): StatementExpression constructor now takes the
12715         lexer.Location as additional argument.
12716         (for_statement, declare_local_variables): Likewise.
12717         (declare_local_variables): When creating a new implicit block, use the
12718         new Block constructor and pass it the lexer.Location.
12719
12720 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12721
12722         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12723         members also on the parent interfaces recursively.
12724
12725 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12726
12727         * report.cs: Use new formats, since Gonzalo finished the missing
12728         bits. 
12729
12730         * expression.cs (Binary.ResolveOperator): added missing operator|
12731         operator& and operator^ for bool/bool.
12732
12733         * cs-parser.jay: CheckDef now takes a Location argument that is
12734         used to report errors more precisly (instead of reporting the end
12735         of a definition, we try to track something which is a lot closer
12736         to the source of the problem).
12737
12738         * cs-tokenizer.cs: Track global token use, so we can properly flag
12739         the use of #define/#undef after the first token has been seen.
12740
12741         Also, rename the reportXXXX to Error_DescriptiveName
12742
12743         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12744         TypeContainer, so that Enum and Interface can use this too.
12745
12746         * class.cs (TypeContainer.LookupInterfaceOrClass,
12747         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12748         `builder' argument.  Typically this was used to pass the parent
12749         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12750         the definition).  
12751
12752         The problem is that a nested class could trigger the definition of
12753         a toplevel class, and the builder would be obviously wrong in that
12754         case. 
12755
12756         So we drop this argument, and we compute dynamically the
12757         TypeBuilder/ModuleBuilder (the correct information was available
12758         to us anyways from DeclSpace.Parent)
12759
12760         * interface.cs (Interface.DefineInterface): Drop builder
12761         parameter cleanup like class.cs
12762
12763         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12764         like class.cs
12765
12766         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12767         values. 
12768
12769         (Try.Emit): Propagate the returns value from the statement.
12770
12771         (Return.Emit): Even if we are leavning 
12772
12773         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12774
12775         * modifiers.cs: Fix the computation of MethodAttributes flags.
12776
12777 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12778
12779         * driver.cs: allow compilation of files that start with '/'.
12780         Add a default case when checking the argument of --target.
12781
12782 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12783
12784         * interface.cs: Implement the same search algorithm for types in
12785         the interface code.
12786
12787         * delegate.cs: Do not allow multiple definition.
12788
12789         * Recovered ChangeLog that got accidentally amputated
12790
12791         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12792
12793         * rootcontext.cs: Load manually enum to allow core classes to
12794         contain enumerations.
12795
12796         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12797         Update to new static methods in TypeManager.
12798
12799         * typemanager.cs (GetMethod, GetConstructor): Use our
12800         implementation of FindMembers to find the members, since during
12801         corlib compilation, the types are TypeBuilders and GetMethod and
12802         GetConstructor do not work.
12803
12804         Make all methods in TypeManager static.
12805
12806         (InitCodeHelpers): Split the functionality from
12807         the InitCodeTypes function.
12808
12809         * driver.cs: Call InitCodeHelpers after we have populated the
12810         types. 
12811
12812         * cs-parser.jay (delegate_declaration): we did not used to compute
12813         the delegate name correctly for void delegates.
12814
12815 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12816
12817         * rootcontext.cs (RootContext): Init the interface_resolve_order
12818         and type_container_resolve_order always.
12819
12820         (ResolveCore, BootstrapCorlib_ResolveClass,
12821         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12822         compiler when compiling with --nostdlib
12823
12824         * class.cs (TypeContainer.DefineType): Check that our parent is
12825         not null.  This test is most important when we are bootstraping
12826         the core types.
12827
12828         * codegen.cs: Split out the symbol writing code.
12829
12830 2002-03-25  Martin Baulig  <martin@gnome.org>
12831
12832         * driver.cs (-g): Made -g an alias for --debug.
12833
12834 2002-03-24  Martin Baulig  <martin@gnome.org>
12835
12836         * codegen.cs (SymbolWriter): New public variable. Returns the
12837         current symbol writer.
12838         (CodeGen): Added `bool want_debugging_support' argument to the
12839          constructor. If true, tell the ModuleBuild that we want debugging
12840         support and ask it for the ISymbolWriter.
12841         (Save): If we have a symbol writer, call it's Close() method after
12842         saving the assembly.
12843
12844         * driver.c (--debug): New command line argument to create a
12845         debugger information file.
12846
12847         * location.cs (SymbolDocument): New public property. Returns an
12848         ISymbolDocumentWriter object for the current source file or null
12849         if we don't have a symbol writer.
12850
12851 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12852
12853         * driver.cs (LoadAssembly): Correctly return when all the paths
12854         have been tried and not before.
12855
12856         * statement.cs (Switch.Emit): return the actual coverage for this
12857         statement (returns/not-returns)
12858
12859         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12860         switch of the statement if we are the last switch section.  That
12861         kills two problems: try/catch problems (we used to emit an empty
12862         nop at the end) and switch statements where all branches would
12863         return. 
12864
12865 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12866
12867         * driver.cs: Add default assemblies (the equivalent to the
12868         Microsoft CSC.RSP file)
12869
12870         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12871         also update tokens_seen and set it to false.
12872
12873         * driver.cs: Implement --recurse for Mike.
12874
12875         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12876         correctly splitting out the paths.
12877
12878 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12879
12880         * interface.cs (Interface.PopulateProperty): Instead of using
12881         `parent' as the declaration space for the set parameters, use
12882         `this' 
12883
12884         * support.cs (InternalParameters): InternalParameters constructor
12885         takes a DeclSpace instead of a TypeContainer.
12886
12887         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12888         types are being initialized, load the address of it before calling
12889         the function.  
12890
12891         (New): Provide a mechanism to disable the generation of local
12892         value type temporaries when the caller will be providing us with
12893         an address to store it.
12894
12895         (ArrayCreation.EmitDynamicInitializers): Use it.
12896
12897 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12898
12899         * expression.cs (Invocation.EmitArguments): Only probe for array
12900         property if there is more than one argument.  Sorry about that.
12901
12902         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12903         empty param arrays.
12904
12905         * class.cs (Method.LabelParameters): Fix incorrect code path that
12906         prevented the `ParamArrayAttribute' from being applied to the
12907         params attribute.
12908
12909 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12910
12911         * support.cs (ReflectionParameters): Correctly compute whether the
12912         last argument is a params array.  Fixes the problem with
12913         string.Split ('a')
12914
12915         * typemanager.cs: Make the assemblies array always be non-null
12916         (empty, but non-null)
12917
12918         * tree.cs (RecordDecl): New function that abstracts the recording
12919         of names.  This reports error 101, and provides a pointer to the
12920         previous declaration.  Fixes a crash in the compiler.
12921
12922         * cs-parser.jay (constructor_declaration): Update to new grammar,
12923         and provide a constructor_body that can be empty.
12924
12925 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12926
12927         * driver.cs: Add support for --resources.
12928
12929         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12930         Make all types for the various array helper methods be integer.
12931
12932         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12933         CheckState to ConvCast.
12934
12935         (ConvCast): Now it takes a `checked' state argument, to avoid
12936         depending on the emit context for the conversion, and just using
12937         the resolve time setting.
12938
12939         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12940         instead of Invocation.EmitArguments.  We do not emit the original
12941         arguments, instead we emit those which have been converted to
12942         unsigned int expressions.
12943
12944         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12945
12946         * codegen.cs: ditto.
12947
12948         * expression.cs (LocalVariableReference): Drop the use of the
12949         Store function that depended on the variable index.
12950
12951         * statement.cs (VariableInfo): Drop the `Idx' property from this
12952         class, as this is not taking into account the indexes for
12953         temporaries tat we generate during the execution, getting the
12954         indexes wrong.
12955
12956         * class.cs: First emit class initializers, then call the parent
12957         constructor. 
12958
12959         * expression.cs (Binary): Fix opcode emision.
12960         (UnaryMutator.EmitCode): Support checked code generation
12961
12962         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12963         matches for events for both the Static and Instance scans,
12964         pointing to the same element.   Fix that.
12965
12966 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12967
12968         * rootcontext.cs (ResolveTree): Always set the
12969         interface_resolve_order, because nested interfaces will be calling
12970         into us.
12971
12972         * class.cs (GetInterfaceOrClass): Track the same resolution
12973         process used by TypeManager.LookupType.  This fixes the nested
12974         type lookups in class declarations (separate path from
12975         LookupType). 
12976
12977         (TypeContainer.DefineType): Also define nested interfaces.
12978         (TypeContainer.RegisterOrder): New public function used to
12979         register the order in which child interfaces need to be closed.
12980
12981         Nested interfaces need to be closed after their parents have been
12982         created. 
12983
12984         * interface.cs (InterfaceAttr): Put all the logic for computing
12985         the interface attribute here. 
12986
12987         (DefineInterface): Register our interface order with the
12988         RootContext or with the TypeContainer depending on the case.
12989
12990 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12991
12992         * cs-parser.jay: rework foreach statement to work with the new
12993         changes to the policy on SimpleNames.
12994
12995         * report.cs: support Stacktrace on warnings as well.
12996
12997         * makefile: drop --unsafe and /unsafe from the compile.
12998
12999 2002-03-13  Ravi Pratap  <ravi@ximian.com>
13000
13001         * ecore.cs (StandardConversionExists): Modify to take an Expression
13002         as the first parameter. Ensure we do null -> reference type conversion
13003         checking.
13004
13005         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
13006         temporary Expression objects.
13007
13008 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
13009
13010         * interface.cs: workaround bug in method overloading resolution
13011         (there is already a bugzilla bug for it).
13012
13013 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
13014
13015         We could also solve this problem by having a separate path for
13016         performing type lookups, instead of DoResolve, we could have a
13017         ResolveType entry point, and only participating pieces of the
13018         production (simplename, deref, array) would implement this. 
13019
13020         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
13021         signal SimpleName to only resolve type names and not attempt to
13022         resolve anything else.
13023
13024         * expression.cs (Cast): Set the flag.
13025
13026         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
13027
13028         * class.cs: Only report 108 if there is no `new' modifier.
13029
13030         * cs-parser.jay: rework foreach statement to work with the new
13031         changes to the policy on SimpleNames.
13032         
13033         * report.cs: support Stacktrace on warnings as well.
13034
13035         * makefile: drop --unsafe and /unsafe from the compile.
13036
13037 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
13038
13039         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
13040         lookups here, instead of doing that at parse time.  This means
13041         that our grammar will not introduce `LocalVariableReferences' as
13042         expressions at this point.  That solves the problem of code like
13043         this:
13044
13045         class X {
13046            static void Main ()
13047            { int X = 1;
13048             { X x = null }}}
13049
13050         This is only half the fix.  The full fix requires parameters to
13051         also be handled in this way.
13052
13053         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
13054         makes the use more obvious of the DeclSpace.  The
13055         ec.TypeContainer.TypeBuilder is now only used to pull the
13056         TypeBuilder for it.
13057
13058         My theory is that I can get rid of the TypeBuilder completely from
13059         the EmitContext, and have typecasts where it is used (from
13060         DeclSpace to where it matters).  
13061
13062         The only pending problem is that the code that implements Aliases
13063         is on TypeContainer, and probably should go in DeclSpace.
13064
13065         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
13066         lookups here, instead of doing that at parse time.  This means
13067         that our grammar will not introduce `LocalVariableReferences' as
13068         expressions at this point.  That solves the problem of code like
13069         this:
13070
13071         class X {
13072            static void Main ()
13073            { int X = 1;
13074             { X x = null }}}
13075
13076         This is only half the fix.  The full fix requires parameters to
13077         also be handled in this way.
13078
13079         * class.cs (Property.DefineMethod): When implementing an interface
13080         method, set newslot, when implementing an abstract method, do not
13081         set the flag (before we tried never setting it, or always setting
13082         it, which is the difference).
13083         (Indexer.DefineMethod): same.
13084         (Method.DefineMethod): same.
13085
13086         * ecore.cs: Only set the status used flag if we get back a Field.
13087
13088         * attribute.cs: Temporary hack, so Paolo can keep working.
13089
13090 2002-03-08  Ravi Pratap  <ravi@ximian.com>
13091
13092         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
13093         the unmanaged type in the case we have a MarshalAs attribute.
13094
13095         (Resolve): Handle the case when we are parsing the special MarshalAs
13096         attribute [we need to store the unmanaged type to use later]
13097
13098         * typemanager.cs (marshal_as_attr_type): Built in type for the 
13099         MarshalAs Attribute.
13100
13101         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
13102         on parameters and accordingly set the marshalling info.
13103
13104 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
13105
13106         * class.cs: Optimizing slightly by removing redundant code after
13107         we switched to the `NoTypes' return value.
13108         (Property.DefineMethod): use NoTypes here too.
13109
13110         This fixes the bug I introduced in my last batch of changes.
13111
13112 2002-03-05  Ravi Pratap  <ravi@ximian.com>
13113
13114         * tree.cs (RecordEnum): Add. We now keep track of enums too.
13115
13116         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
13117         Enums since those are types too. 
13118
13119         * cs-parser.jay (enum_declaration): Record enums as we parse them.
13120
13121         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
13122         thanks to a call during the lookup process.
13123
13124 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
13125
13126         * statement.cs (Foreach): Lots of work to accomodate a particular
13127         kind of foreach statement that I had not kept in mind.  It is
13128         possible to have foreachs on classes that provide a GetEnumerator
13129         method that return objects that implement the "pattern" for using
13130         a foreach, there is no need to support GetEnumerator
13131         specifically. 
13132
13133         This is needed to compile nant.
13134
13135         * decl.cs: Only report 114 if the member is not `Finalize' and if
13136         the warning level is at least 2.
13137
13138         * class.cs: Moved the compare function from Method to
13139         MethodSignature. 
13140
13141         (MethodSignature.InheritableMemberSignatureCompare): Add new
13142         filter function that is used to extract inheritable methods from a
13143         class. 
13144
13145         (Method.Define): Use the new `inheritable_method_signature_filter'
13146         delegate
13147
13148         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
13149         command. 
13150
13151 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
13152
13153         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
13154
13155         * cs-parser.jay: Add opt_semicolon to the interface declaration.
13156
13157         * expression.cs: Pass location information to
13158         ConvertImplicitStandard. 
13159
13160         * class.cs: Added debugging code to track return values from
13161         interfaces. 
13162
13163 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
13164
13165         * expression.cs (Is.DoResolve): If either side of the `is' is an
13166         interface, do not flag the warning.
13167
13168         * ecore.cs (ImplicitReferenceConversion): We need a separate test
13169         for interfaces
13170
13171         * report.cs: Allow for --fatal to be used with --probe.
13172
13173         * typemanager.cs (NoTypes): Move the definition for the empty Type
13174         array here. 
13175
13176         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
13177         properties. 
13178         (TypeContainer.DefineProxy): New function used to proxy to parent
13179         implementations when implementing interfaces.
13180         (TypeContainer.ParentImplements): used to lookup if our parent
13181         implements a public function that is required by an interface.
13182         (TypeContainer.VerifyPendingMethods): Hook this up.
13183
13184         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
13185         `modules' and `assemblies' arraylists into arrays.  We only grow
13186         these are the very early start up of the program, so this improves
13187         the speedof LookupType (nicely measured).
13188
13189         * expression.cs (MakeByteBlob): Replaced unsafe code with
13190         BitConverter, as suggested by Paolo.
13191
13192         * cfold.cs (ConstantFold.Binary): Special case: perform constant
13193         folding of string concatenation, but if either side is a string,
13194         and the other is not, then return null, and let the runtime use
13195         the concatenation on the string plus the object (using
13196         `Object.ToString'). 
13197
13198 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
13199
13200         Constant Folding has been implemented now.
13201
13202         * expression.cs (Unary.Reduce): Do not throw an exception, catch
13203         the error instead on types that are not supported in one's
13204         complement. 
13205
13206         * constant.cs (Constant and all children): New set of functions to
13207         perform implict and explicit conversions.
13208
13209         * ecore.cs (EnumConstant): Implement the new functions to perform
13210         conversion by proxying to the child expression.
13211
13212         * codegen.cs: (ConstantCheckState): Constant evaluation has its
13213         own separate setting that can not be turned off from the command
13214         line using --unchecked or --checked and is only controlled using
13215         the checked/unchecked statements and expressions.  This setting is
13216         used by the constant folder to flag errors.
13217
13218         * expression.cs (CheckedExpr, UncheckedExpr): Set the
13219         ConstantCheckState as well.   
13220
13221         During Resolve, they also have to flag the state, because the
13222         constant folder runs completely in the Resolve phase.
13223
13224         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
13225         well.
13226
13227 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13228
13229         * cfold.cs: New file, this file contains the constant folder.
13230
13231         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
13232         argument to track whether we are using the resulting address to
13233         load or store a value and provide better error messages. 
13234
13235         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
13236         new AddressOf arguments.
13237
13238         * statement.cs (Foreach.EmitCollectionForeach): Update
13239
13240         * expression.cs (Argument.Emit): Call AddressOf with proper
13241         arguments to track usage.
13242
13243         (New.DoEmit): Call AddressOf with new arguments.
13244
13245         (Unary.Emit): Adjust AddressOf call.
13246
13247 2002-03-01  Ravi Pratap  <ravi@ximian.com>
13248
13249         * cs-parser.jay (member_access): Change the case for pre-defined types
13250         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
13251         this suggestion.
13252
13253         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
13254         a method body.
13255
13256         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
13257         essentially like methods and apply attributes like MethodImplOptions to them too.
13258
13259         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
13260         not being null.
13261
13262         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
13263         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
13264         is the DeclSpace.
13265
13266         * Update code everywhere accordingly.
13267
13268         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
13269
13270         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
13271
13272 2002-02-28  Ravi Pratap  <ravi@ximian.com>
13273
13274         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
13275         try performing lookups against those instead of jumping straight into using
13276         the 'using' clauses.
13277
13278         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
13279
13280         (LookupType): Perform lookups in implicit parents too.
13281
13282         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
13283         sequence as RootContext.LookupType. 
13284
13285         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
13286         the various cases of namespace lookups into this method.
13287
13288 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13289
13290         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
13291         in positional arguments)
13292
13293         * class.cs (Operator): Update the AllowedModifiers to contain
13294         extern. 
13295
13296         * cs-parser.jay: Update operator declaration to allow for the
13297         operator body to be empty.
13298
13299         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
13300         values. 
13301
13302 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
13303
13304         * class.cs (Method.Emit): Label parameters.
13305
13306         * driver.cs: Return 1 or 0 as the program exit code.
13307
13308 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
13309
13310         * expression.cs: Special case the `null' object when trying to
13311         auto-compute the type, as anything can be explicitly converted to
13312         that. 
13313
13314         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
13315         spotting this Paolo.
13316
13317         (Expression.ImplicitNumericConversion): Perform comparissions of
13318         the type using the underlying type in the case of an enumeration
13319         rather than using the enumeration type for the compare.
13320
13321         Cope with the underlying == type case, which is not possible to
13322         catch before. 
13323
13324         (Expression.ConvertNumericExplicit): Perform comparissions of
13325         the type using the underlying type in the case of an enumeration
13326         rather than using the enumeration type for the compare.
13327
13328         * driver.cs: If the user does not supply an extension, assume .exe
13329
13330         * cs-parser.jay (if_statement): Rewrote so that we can track the
13331         location for the if statement.
13332
13333         * expression.cs (Binary.ConstantFold): Only concat strings when
13334         the operation is "+", not everything ;-)
13335
13336         * statement.cs (Statement.EmitBoolExpression): Take a location
13337         argument. 
13338         (If, While, Do): Track location.
13339
13340         * expression.cs (Binary.ResolveOperator): In the object + string
13341         case, I was missing a call to ConvertImplicit
13342
13343 2002-02-25  Ravi Pratap  <ravi@ximian.com>
13344
13345         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
13346         Location arguments. Ensure we use RootContext.LookupType to do our work
13347         and not try to do a direct Type.GetType and ModuleBuilder.GetType
13348
13349         * interface.cs (PopulateMethod): Handle the type of the parameter being
13350         null gracefully.
13351
13352         * expression.cs (Invocation.BetterFunction): Handle the case when we 
13353         have a params method with no fixed arguments and a call is made with no
13354         arguments.
13355
13356 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
13357
13358         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
13359         the verbatim-string-literal
13360
13361         * support.cs (InternalParameters.ParameterModifier): handle null
13362         fixed parameters.
13363         (InternalParameters.ParameterType): ditto.
13364
13365         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
13366         duplicating the name of the variable parameter.
13367         (GetParameterByName): Fix bug where we were not looking up array
13368         paramters if they were the only present (thanks Paolo!).
13369         (GetParameterInfo): We only have an empty set of types if both
13370         fixed and array are set to null.
13371         (GetParameterInfo-idx): Handle FixedParameter == null
13372
13373         * cs-parser.jay: Handle the case where there is no catch
13374         statements (missing null test).
13375
13376 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
13377
13378         * driver.cs (MainDriver): Be conservative on our command line
13379         handling.
13380
13381         Catch DirectoryNotFoundException when calling GetFiles.
13382
13383         (SplitPathAndPattern): Used to split the input specification into
13384         a path and a pattern that we can feed to Directory.GetFiles.
13385
13386 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
13387
13388         * statement.cs (Fixed): Implement the last case of the Fixed
13389         statement (string handling).
13390
13391         * expression.cs (StringPtr): New class used to return a char * to
13392         a string;  Used by the Fixed statement.
13393
13394         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
13395
13396         * expression.cs (Binary.ResolveOperator): Remove redundant
13397         MemberLookup pn parent type.
13398         Optimize union call, we do not need a union if the types are the same.
13399         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
13400         type.
13401
13402         Specialize the use of MemberLookup everywhere, instead of using
13403         the default settings. 
13404
13405         (StackAlloc): Implement stackalloc keyword.
13406
13407         * cs-parser.jay: Add rule to parse stackalloc.
13408
13409         * driver.cs: Handle /h, /help, /?
13410
13411         * expression.cs (MakeByteBlob): Removed the hacks we had in place
13412         before we supported unsafe code.
13413
13414         * makefile: add --unsafe to the self compilation of mcs.
13415
13416 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
13417
13418         * expression.cs (PointerArithmetic): New class that is used to
13419         perform pointer arithmetic.
13420         (Binary.Resolve): Handle pointer arithmetic
13421         Handle pointer comparission.
13422         (ArrayPtr): Utility expression class that is used to take the
13423         address of an array.
13424
13425         (ElementAccess): Implement array access for pointers
13426
13427         * statement.cs (Fixed): Implement fixed statement for arrays, we
13428         are missing one more case before we are done.
13429
13430         * expression.cs (Indirection): Implement EmitAssign and set the
13431         ExprClass to Variable.  This allows pointer dereferences to be
13432         treated as variables, and to have values assigned to them.
13433
13434         * ecore.cs (Expression.StoreFromPtr): New utility function to
13435         store values dereferencing.
13436
13437 2002-02-20  Ravi Pratap  <ravi@ximian.com>
13438
13439         * expression.cs (Binary.ResolveOperator): Ensure that we are
13440         not trying to operate on a void type - this fixes the reported
13441         bug.
13442
13443         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
13444         the parent implementation is sealed.
13445
13446         * ../errors/cs0239.cs : Add.
13447
13448         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
13449
13450         * typemanager.cs (unverifiable_code_type): Corresponds to 
13451         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
13452         which have unsafe code in them.
13453
13454         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
13455         unsafe context.
13456
13457 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
13458
13459         * cs-tokenizer.cs: Add support for @"litreal strings"
13460
13461         Make tokenizer accept pre-processor directives
13462         on any column (remove the old C-like limitation). 
13463
13464         * rootcontext.cs (EmitCode): Emit any global attributes.
13465         (AddGlobalAttributes): Used to keep track of assembly attributes. 
13466
13467         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
13468
13469         * cs-parser.jay: Add support for global attributes.  
13470
13471 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
13472
13473         * expression.cs (Indirection): New helper class.  Unary will
13474         create Indirection classes to be able to implement the
13475         IMemoryLocation interface on it.
13476
13477 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
13478
13479         * cs-parser.jay (fixed_statement): reference the right statement.
13480
13481         * statement.cs (Fixed.Emit): Finish implementing the fixed
13482         statement for the &x case.
13483
13484 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
13485
13486         * class.cs (Property.Define, Method.Define): Remove newslot when
13487         `implementing'.  
13488
13489         * modifiers.cs: My use of NewSlot when `Abstract' was set was
13490         wrong.  NewSlot should only be used if the `new' keyword is present.
13491
13492         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
13493         locating our system dir.  Sorry about this.
13494
13495 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13496
13497         * driver.cs (GetSystemDir): Compute correctly the location of our
13498         system assemblies.  I was using the compiler directory instead of
13499         the library directory.
13500
13501 2002-02-13  Ravi Pratap  <ravi@ximian.com>
13502
13503         * expression.cs (BetterFunction): Put back in what Miguel commented out
13504         since it is the correct fix. The problem is elsewhere ;-)
13505
13506         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
13507         parameters of the parms method are themselves compatible or not !
13508
13509         (StandardConversionExists): Fix very dangerous bug where we were forgetting
13510         to check that a class implements an interface before saying that an implicit
13511         conversion was allowed. Use ImplementsInterface to do the checking.
13512
13513 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13514
13515         * class.cs (Method.Define): Track whether we are an explicit
13516         implementation or not.  And only call DefineMethodOverride if we
13517         are an explicit implementation.
13518
13519         (Property.DefineMethod): Ditto.
13520
13521 2002-02-11  Ravi Pratap  <ravi@ximian.com>
13522
13523         * expression.cs (BetterFunction): Catch hideous bug which was
13524          preventing us from detecting ambiguous calls due to implicit casts i.e
13525         cs0121.
13526
13527 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
13528
13529         * support.cs (Pair): Remove un-needed method.  I figured why I was
13530         getting the error in cs-parser.jay, the variable in a foreach loop
13531         is readonly, and the compiler does not really treat this as a variable.
13532
13533         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
13534         instead of EQUALS in grammar.  
13535
13536         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
13537
13538         * expression.cs (Unary.DoResolve): Check whether the argument is
13539         managed or not.
13540
13541 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
13542
13543         * support.cs: Api for Pair to set a value.  Despite the fact that
13544         the variables are public the MS C# compiler refuses to compile
13545         code that accesses the field if the variable is part of a foreach
13546         statement. 
13547
13548         * statement.cs (Fixed): Begin implementation of the fixed
13549         statement.
13550
13551         (Block.AddVariable): Return the VariableInfo on success and null
13552         on failure instead of true/false. 
13553
13554         * cs-parser.jay (foreach): Catch errors on variables already
13555         defined (we were ignoring this value before) and properly unwind
13556         the block hierarchy
13557
13558         (fixed_statement): grammar for the fixed statement.
13559
13560 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
13561
13562         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
13563         pointer types to be incretemented.
13564
13565         (SizeOf): Implement.
13566
13567         * cs-parser.jay (pointer_member_access): Implement
13568         expr->IDENTIFIER production.
13569
13570         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
13571         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
13572         on safe contexts.
13573
13574         (Unary): Implement indirection.
13575
13576         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
13577         use in non-unsafe context).
13578
13579         (SimpleName.DoResolve): Check for pointers in field access on safe
13580         contexts. 
13581
13582         (Expression.LoadFromPtr): Factor the load-indirect code in this
13583         function.  This was duplicated in UnboxCast and ParameterReference
13584
13585 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
13586
13587         * expression.cs (ComposedCast): report an error if a pointer cast
13588         is used in a safe region.
13589
13590         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
13591         pointer type casts in unsafe context.
13592
13593         * codegen.cs (EmitContext): Set up IsUnsafe.
13594
13595         * cs-parser.jay (non_expression_type): Add productions for pointer
13596         casts. 
13597
13598         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
13599         code.  We should not use force into static mode if the method is
13600         not virtual.  Fixes bug in MIS
13601
13602         * statement.cs (Do.Emit, While.Emit, For.Emit,
13603         Statement.EmitBoolExpression): Add support to Do and While to
13604         propagate infinite loop as `I do return' semantics.
13605
13606         Improve the For case to also test for boolean constants.
13607
13608         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
13609         to the list of attributes we can add.
13610
13611         Remove `EmitContext' argument.
13612
13613         * class.cs (Method.Define): Apply parameter attributes.
13614         (Constructor.Define): Apply parameter attributes.
13615         (MethodCore.LabelParameters): Move here the core of labeling
13616         parameters. 
13617
13618         * support.cs (ReflectionParameters.ParameterModifier,
13619         InternalParameters.ParameterModifier): Use IsByRef on the type and
13620         only return the OUT bit for these parameters instead of in/out/ref
13621         flags.
13622
13623         This is because I miss-understood things.  The ParameterInfo.IsIn
13624         and IsOut represent whether the parameter has the [In] and [Out]
13625         attributes set.  
13626
13627 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13628
13629         * ecore.cs (FieldExpr.Emit): Release temporaries.
13630
13631         * assign.cs (LocalTemporary.Release): new function.
13632
13633         * codegen.cs (EmitContext.GetTemporaryStorage,
13634         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13635         temporary storage.  Now we can "put back" localbuilders when we
13636         are done with them
13637
13638 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13639
13640         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13641         need to make a copy of the variable to generate verifiable code.
13642
13643 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13644
13645         * driver.cs: Compute dynamically the system directory.
13646
13647         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13648         Slower, but more generally useful.  Used by the abstract
13649         registering implementation. 
13650
13651         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13652         the rules for the special rule on Type/instances.  First check if
13653         we have the same name, and if so, try that special static path
13654         rather than the instance path.
13655
13656 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13657
13658         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13659         for, while and if.
13660
13661         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13662         Enum, ValueType, Delegate or Array for non-corlib compiles.
13663
13664         * cs-tokenizer.cs: Catch long identifiers (645)
13665
13666         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13667         piece of code.
13668
13669         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13670         fix, we were returning too early, so we were not registering
13671         pending methods from abstract classes.
13672
13673         Do not register pending methods if the class is abstract.
13674
13675         * expression.cs (Conditional.DoResolve): Report circular implicit
13676         conversions when we neecd to compute it for conditional
13677         expressions. 
13678
13679         (Is.DoResolve): If the expression is always of the provided type,
13680         flag warning 183.  If the expression can not ever be of the
13681         provided type flag warning 184.
13682
13683         * class.cs: Catch 169 as well.
13684
13685         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13686         read. 
13687
13688 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13689
13690         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13691
13692 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13693
13694         * interface.cs: (PopulateMethod): Check for pointers being defined
13695         only if the unsafe context is active.
13696         (PopulateProperty): ditto.
13697         (PopulateIndexer): ditto.
13698
13699         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13700         specified.  If pointers are present, make sure that they are
13701         present in an unsafe context.
13702         (Constructor, Constructor.Define): ditto.
13703         (Field, Field.Define): ditto.
13704         (Property, Property.Define): ditto.
13705         (Event, Event.Define): ditto.
13706
13707         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13708         hashtable if there are classes or structs defined.
13709
13710         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13711         code, as the constant resolution moved.
13712
13713         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13714         the metadata, so we can flag error 133. 
13715
13716         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13717         pointer is being declared in an unsafe context.
13718
13719 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13720
13721         * modifiers.cs (Modifiers.Check): Require a Location argument.
13722         Report error 227 for Unsafe use.
13723
13724         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13725
13726         * statement.cs (For.Emit): If the test is null, then report that
13727         we do `return', as we wont reach anything afterwards.
13728
13729         (Switch.SwitchGoverningType): Track the expression that matched
13730         the conversion.
13731
13732         * driver.cs: Allow negative numbers as an error code to flag.
13733
13734         * cs-parser.jay: Handle 1551.
13735
13736         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13737
13738 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13739
13740         * cs-parser.jay: Report 1518 (type declaration can only contain
13741         class, struct, interface, enum or delegate)
13742
13743         (switch_label): Report 1523 (keywords `case' or `default' must
13744         preced code)
13745
13746         (opt_switch_sections): Report 1522 (empty switch)
13747
13748         * driver.cs: Report 1515 (response file specified multiple times)
13749         Report 1516 (Source file specified multiple times).
13750
13751         * expression.cs (Argument.Resolve): Signal 1510
13752
13753         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13754         access not allowed in static code)
13755
13756 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13757
13758         * typemanager.cs (IsPointerType): Utility method which we are going
13759         to need a lot.
13760
13761         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13762         the object type, so we take care of that.
13763
13764         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13765
13766         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13767         added to non-params parameters :-)
13768
13769         * typemanager.cs (CSharpName): Include 'void' type too. 
13770
13771         (void_ptr_type): Include in the set of core types.
13772
13773         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13774         duplicating code.
13775
13776         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13777         an unsafe context.
13778
13779         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13780         completely forgotten about it.
13781
13782 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13783
13784         * cs-parser.jay (pointer_type): Add. This begins our implementation
13785         of parsing rules for unsafe code.
13786
13787         (unsafe_statement): Implement.
13788
13789         (embedded_statement): Modify to include the above.
13790
13791         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13792
13793         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13794         if the current context is an unsafe one.
13795
13796         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13797         are handled differently, we need separate rules for them.
13798
13799         (local_variable_declaration): Update to use local_variable_pointer_type
13800         to allow variable declarations of unmanaged pointer types.
13801
13802         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13803         in unsafe contexts.
13804
13805         * ../errors/cs0214.cs : Add.
13806
13807 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13808
13809         * makefile: remove 'response' file when cleaning.
13810
13811 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13812
13813         * cs-parser.jay: Report 1524.
13814
13815 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13816
13817         * typemanager.cs (RegisterMethod): drop checking if we have
13818         registered this from here
13819
13820 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13821
13822         * class.cs (Method.EmitDestructor): Implement calling our base
13823         destructor. 
13824
13825         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13826         value of InFinally.
13827
13828         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13829         this routine and will wrap the call in a try/catch block.  Deal
13830         with the case.
13831
13832 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13833
13834         * ecore.cs (Expression.MemberLookup): instead of taking a
13835         parameter `same_type' that was used to tell whether we could
13836         access private members we compute our containing type from the
13837         EmitContext.
13838
13839         (FieldExpr): Added partial support for volatile fields.  This does
13840         not work for volatile fields exposed from assemblies, as I can not
13841         figure out how to extract the modreq from it.
13842
13843         Updated all the source files to use this.
13844
13845         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13846         because it is referenced by MemberLookup very often. 
13847
13848 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13849
13850         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13851         TypeBuilder.GetCustomAttributes to retrieve what we need.
13852
13853         Get rid of redundant default_member_attr_type as this is the same as
13854         default_member_type which already exists.
13855
13856         * interface.cs, attribute.cs : Update accordingly.
13857
13858 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13859
13860         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13861         work for TYpeBuilders though.  Ravi, can you please fix this?
13862
13863         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13864
13865         * expression.cs (Argument.Emit): Handle the case of ref objects
13866         being passed to ref functions;  
13867
13868         (ParameterReference.EmitLoad): Loads the content of the pointer
13869         without dereferencing.
13870
13871 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13872
13873         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13874
13875 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13876
13877         * class.cs (Indexer.DefineMethod): Incorporate the interface
13878         type in the name of the method if we are doing explicit interface
13879         implementation.
13880
13881         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13882
13883         (BetterConversion): Fix extremely trivial bug where we were referring to
13884         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13885         again !
13886
13887         * ../errors/bug16.cs : Add although we have fixed it.
13888
13889 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13890
13891         * expression.cs (BaseIndexer): Begin implementation.
13892
13893         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13894
13895         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13896         production directly to remove a shift/reduce, and implement
13897         explicit interface implementation.
13898
13899         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13900         after a floating point suffix.
13901
13902         * expression.cs (DoNumericPromotions): Improved the conversion for
13903         uint/uint.  If we have a constant, we avoid doing a typecast to a
13904         larger type.
13905
13906         * class.cs (Indexer): Implement explicit interface implementation
13907         for indexers.
13908
13909 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13910
13911         * class.cs: make the default instance constructor public and hidebysig.
13912
13913 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13914
13915         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13916         so we can call it from elsewhere.
13917
13918         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13919         we emit it internally if the class has a defined indexer; otherwise the user
13920         emits it by decorating the class definition with the DefaultMemberAttribute.
13921
13922         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13923         attribute is not used on a type which defines an indexer.
13924
13925         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13926         character when we skip whitespace.
13927
13928         * ../errors/cs0646.cs : Add.
13929
13930 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13931
13932         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13933         again. 
13934
13935         * makefile: Add practical target `mcs3.exe' which builds the third
13936         generation compiler. 
13937
13938         * expression.cs (New): Fix structures constructor calling.
13939
13940         * class.cs (Property, Method, Indexer): Emit Final flag on the
13941         method if we are an interface implementation and we are not
13942         abstract. 
13943
13944         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13945         whether this property is referencing a `base' method.
13946
13947         * expression.cs (Invocation.EmitCall): take an extra argument:
13948         is_base, this is used to determine whether the `call' or
13949         `callvirt' opcode should be used.
13950
13951
13952         * delegate.cs: update EmitCall.
13953
13954         * class.cs (Method.Define): Set NewSlot for the cases where we are
13955         not implementing an interface method.
13956
13957         (Property.Define): ditto.
13958
13959 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13960
13961         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13962         'r'.  Allows mcs to parse itself fully.
13963
13964 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13965
13966         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13967         of the number of initializers that require the InitializeArray method.
13968
13969         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13970         update the above field where necessary.
13971
13972         (MakeByteBlob): Update accordingly.
13973
13974         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13975         greater than 2.
13976
13977         (EmitDynamicInitializers): Update in accordance with the new optimization.
13978
13979         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13980         same OpCode applies.
13981
13982         * cs-parser.jay : Fix some glaring errors I introduced.
13983
13984 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13985
13986         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13987         so that we can check for name clashes there too.
13988
13989         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13990         for interface indexers.
13991
13992         * interfaces.cs (Define): Emit the default member attribute.
13993
13994         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13995         variable was being referred to while setting the value ;-)
13996
13997 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13998
13999         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
14000         byte-by-byte information when we know the data is zero.
14001
14002         Make the block always a multiple of 4, because
14003         DefineInitializedData has a bug.
14004
14005         * assign.cs: Fix, we should assign from the temporary, not from
14006         the source. 
14007
14008         * expression.cs (MakeByteBlob): Fix my incorrect code.
14009
14010 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
14011
14012         * typemanager.cs (EnumToUnderlying): This function is used to get
14013         the underlying type from an enumeration, because it does not
14014         always work. 
14015
14016         * constant.cs: Use the I4_S form for values between -128 and 127.
14017
14018         * statement.cs (Block.LookupLabel): Looks up a label.
14019         (Block): Drop support for labeled blocks.
14020
14021         (LabeledStatement): New kind of statement that represents a label
14022         only.
14023
14024         (Goto): Finally implement this bad boy.
14025
14026         * cs-parser.jay: Update to reflect new mechanism to implement
14027         labels.
14028
14029 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
14030
14031         * codegen.cs (EmitContext.This): a codegen property that keeps the
14032         a single instance of this instead of creating many different this
14033         instances. 
14034
14035         * delegate.cs (Delegate.DoResolve): Update to use the property;
14036
14037         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
14038
14039         * expression.cs (BaseAccess.DoResolve): Ditto.
14040
14041 2001-12-29  Ravi Pratap  <ravi@ximian.com>
14042
14043         * typemanager.cs (methodimpl_attr_type): Add to hold the type
14044         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
14045
14046         (InitCoreTypes): Update accordingly.
14047
14048         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
14049         so we can quickly store the state.
14050
14051         (ApplyAttributes): Set the correct implementation flags
14052         for InternalCall methods.
14053
14054 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
14055
14056         * expression.cs (EmitCall): if a method is not virtual, then do
14057         not use callvirt on it.
14058
14059         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
14060         user defined stuff) requires the use of stobj, which takes an
14061         address on the stack instead of an array and an index.  So emit
14062         the Ldelema operation for it.
14063
14064         (EmitStoreOpcode): Use stobj for valuetypes.
14065
14066         (UnaryMutator.EmitCode): Use the right 1 value depending on
14067         whether we are dealing with int64/uint64, float or doubles.
14068
14069         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
14070         constructors that I implemented last night.
14071
14072         (Constructor.IsDefault): Fix to work properly for static
14073         constructors.
14074
14075         * cs-parser.jay (CheckDef): report method signature errors.
14076         Update error number 103 to be 132.
14077
14078         * decl.cs: New AdditionResult enumeration value: MethodExists.
14079         Although we do this check for methods later on in the semantic
14080         analysis, catching repeated default constructors is so easy that
14081         we catch these here. 
14082
14083         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
14084         promotions code.
14085
14086         (ParameterReference.EmitAssign, Emit): handle
14087         bools as bytes.
14088
14089         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
14090         (ArrayAccess.EmitStoreOpcode): ditto.
14091
14092         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
14093
14094         * expression.cs (MakeByteBlob): Complete all the missing types
14095         (uint, short, ushort, byte, sbyte)
14096
14097         * class.cs: Only init instance field initializers on instance
14098         constructors. 
14099
14100         Rename `constructors' to instance_constructors. 
14101
14102         (TypeContainer.AddConstructor): Only add constructors to the list
14103         if it is not static.
14104
14105         Make sure that we handle default_static_constructor independently
14106         everywhere where we handle instance_constructors
14107
14108 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
14109
14110         * class.cs: Do not lookup or create a base initializer for a
14111         static constructor.
14112
14113         (ConstructorInitializer.Resolve): use the proper type to lookup
14114         for constructors.
14115
14116         * cs-parser.jay: Report error 1585 (modifiers between type and name).
14117
14118         * enum.cs, interface.cs: Remove CloseType, this is taken care by
14119         in DeclSpace. 
14120
14121         * decl.cs: CloseType is now an virtual method, the default
14122         implementation just closes this type.
14123
14124 2001-12-28  Ravi Pratap  <ravi@ximian.com>
14125
14126         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
14127         to PreserveSig by default. Also emit HideBySig on such methods.
14128
14129         Basically, set the defaults to standard values.
14130
14131         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
14132         argument, if candidate is better, it can't be worse than the best !
14133
14134         (Invocation): Re-write bits to differentiate between methods being
14135         applicable in their expanded form and their normal form - for params
14136         methods of course.
14137
14138         Get rid of use_standard everywhere as only standard conversions are allowed
14139         in overload resolution. 
14140
14141         More spec conformance.
14142
14143 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14144
14145         * driver.cs: Add --timestamp, to see where the compiler spends
14146         most of its time.
14147
14148         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
14149         `this' in static code.
14150
14151         (SimpleName.DoResolve): Implement in terms of a helper function
14152         that allows static-references to be passed upstream to
14153         MemberAccess.
14154
14155         (Expression.ResolveWithSimpleName): Resolve specially simple
14156         names when called by MemberAccess to implement the special
14157         semantics. 
14158
14159         (Expression.ImplicitReferenceConversion): Handle conversions from
14160         Null to reference types before others, as Null's type is
14161         System.Object. 
14162
14163         * expression.cs (Invocation.EmitCall): Handle the special case of
14164         calling methods declared on a reference type from a ValueType
14165         (Base classes System.Object and System.Enum)
14166
14167         (MemberAccess.Resolve): Only perform lookups on Enumerations if
14168         the left hand side is a TypeExpr, not on every enumeration. 
14169
14170         (Binary.Resolve): If types are reference types, then do a cast to
14171         object on operators != and == of both arguments.
14172
14173         * typemanager.cs (FindMembers): Extract instance and static
14174         members if requested.
14175
14176         * interface.cs (PopulateProperty): Use void_type instead of null
14177         as the return type for the setter method.
14178
14179         (PopulateIndexer): ditto.
14180
14181 2001-12-27  Ravi Pratap  <ravi@ximian.com>
14182
14183         * support.cs (ReflectionParameters): Fix minor bug where we
14184         were examining the wrong parameter for the ParamArray attribute.
14185
14186         Cope with requests for the type of the parameter at position
14187         greater than the params parameter's. We now return the element
14188         type of the params array as that makes more sense.
14189
14190         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
14191         accordingly as we no longer have to extract the element type
14192         ourselves.
14193
14194         (Invocation.OverloadResolve): Update.
14195
14196 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14197
14198         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
14199         against IEnumerator, test whether the return value is a descendant
14200         of the IEnumerator interface.
14201
14202         * class.cs (Indexer.Define): Use an auxiliary method to implement
14203         the other bits of the method definition.  Begin support for
14204         explicit interface implementation.
14205
14206         (Property.DefineMethod): Use TypeManager.void_type instead of null
14207         for an empty return value.
14208
14209 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
14210
14211         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
14212         dealing with a FieldExpr which is composed of a FieldBuilder, in
14213         the code path we did extract the constant, but we should have
14214         obtained the underlying value to be able to cast it (otherwise we
14215         end up in an infinite loop, this is what Ravi was running into).
14216
14217         (ArrayCreation.UpdateIndices): Arrays might be empty.
14218
14219         (MemberAccess.ResolveMemberAccess): Add support for section
14220         14.5.4.1 that deals with the special case of E.I when E is a type
14221         and something else, that I can be a reference to a static member.
14222
14223         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
14224         handle a particular array type to create byte blobs, it is just
14225         something we dont generate byteblobs for.
14226
14227         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
14228         arguments. 
14229
14230         * location.cs (Push): remove the key from the hashtable that we
14231         are about to add.   This happens for empty files.
14232
14233         * driver.cs: Dispose files after we have parsed them.
14234
14235         (tokenize): new function that only runs the tokenizer on its
14236         input, for speed testing.
14237
14238 2001-12-26  Ravi Pratap  <ravi@ximian.com>
14239
14240         * class.cs (Event.Define): Define the private field only if there
14241         are no accessors defined.
14242
14243         * expression.cs (ResolveMemberAccess): If there is no associated
14244         field with the event, that means we have an event defined with its
14245         own accessors and we should flag error cs0070 since transforming
14246         ourselves into a field is not valid in that case.
14247
14248         * ecore.cs (SimpleName.DoResolve): Same as above.
14249
14250         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
14251         and charset to sane values.
14252
14253 2001-12-25  Ravi Pratap  <ravi@ximian.com>
14254
14255         * assign.cs (DoResolve): Perform check on events only if they 
14256         are being accessed outside the declaring type.
14257
14258         * cs-parser.jay (event_declarations): Update rules to correctly
14259         set the type of the implicit parameter etc.
14260
14261         (add_accessor, remove_accessor): Set current local parameters.
14262
14263         * expression.cs (Binary): For delegate addition and subtraction,
14264         cast the return value from the method into the appropriate delegate
14265         type.
14266
14267 2001-12-24  Ravi Pratap  <ravi@ximian.com>
14268
14269         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
14270         of these as the workaround is unnecessary.
14271
14272         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
14273         delegate data - none of that is needed at all.
14274
14275         Re-write bits to extract the instance expression and the delegate method
14276         correctly.
14277
14278         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
14279         on delegates too.
14280
14281         * attribute.cs (ApplyAttributes): New method to take care of common tasks
14282         of attaching attributes instead of duplicating code everywhere.
14283
14284         * everywhere : Update code to do attribute emission using the above method.
14285
14286 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14287
14288         * expression.cs (IsParamsMethodApplicable): if there are not
14289         parameters, return immediately.
14290
14291         * ecore.cs: The 0 literal can be implicity converted to an enum
14292         type. 
14293
14294         (SimpleName.DoResolve): First lookup the type, then lookup the
14295         members. 
14296
14297         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
14298         want to get its address.  If the InstanceExpression is not
14299         addressable, store the result in a temporary variable, then get
14300         the address of it.
14301
14302         * codegen.cs: Only display 219 errors on warning level or above. 
14303
14304         * expression.cs (ArrayAccess): Make it implement the
14305         IMemoryLocation interface.
14306
14307         (Binary.DoResolve): handle the operator == (object a, object b)
14308         and operator != (object a, object b) without incurring into a
14309         BoxedCast (because 5 != o should never be performed).
14310
14311         Handle binary enumerator operators.
14312
14313         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
14314         value type, otherwise use Ldelem_ref.
14315
14316         Use precomputed names;
14317
14318         (AddressOf): Implement address of
14319
14320         * cs-parser.jay (labeled_statement): Fix recursive block
14321         addition by reworking the production.
14322
14323         * expression.cs (New.DoEmit): New has a special case:
14324                 
14325                  If we are dealing with a ValueType, we have a few
14326                  situations to deal with:
14327                 
14328                     * The target of New is a ValueType variable, that is
14329                       easy, we just pass this as the variable reference
14330                 
14331                     * The target of New is being passed as an argument,
14332                       to a boxing operation or a function that takes a
14333                       ValueType.
14334                 
14335                       In this case, we need to create a temporary variable
14336                       that is the argument of New.
14337
14338
14339 2001-12-23  Ravi Pratap  <ravi@ximian.com>
14340
14341         * rootcontext.cs (LookupType): Check that current_type is not null before
14342         going about looking at nested types.
14343
14344         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
14345         not implement the IAssignMethod interface any more.
14346
14347         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
14348         where we tranform them into FieldExprs if they are being resolved from within
14349         the declaring type.
14350
14351         * ecore.cs (SimpleName.DoResolve): Do the same here.
14352
14353         * assign.cs (DoResolve, Emit): Clean up code considerably. 
14354
14355         * ../errors/bug10.cs : Add.
14356
14357         * ../errors/cs0070.cs : Add.
14358
14359         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
14360
14361         * assign.cs : Get rid of EventIsLocal everywhere.
14362
14363 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14364
14365         * ecore.cs (ConvertIntLiteral): finished the implementation.
14366
14367         * statement.cs (SwitchLabel): Convert the value we are using as a
14368         key before looking up the table.
14369
14370 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14371
14372         * codegen.cs (EmitTopBlock): Require a Location argument now.
14373
14374         * cs-parser.jay (constructor_declarator): We need to setup
14375         current_local_parameters before we parse the
14376         opt_constructor_initializer, to allow the variables to be bound
14377         to the constructor arguments.
14378
14379         * rootcontext.cs (LookupType): First lookup nested classes in our
14380         class and our parents before we go looking outside our class.
14381
14382         * expression.cs (ConstantFold): Extract/debox the values at the
14383         beginnning. 
14384
14385         * rootcontext.cs (EmitCode): Resolve the constants first before we
14386         resolve the types.  This is not really needed, but it helps debugging.
14387
14388         * statement.cs: report location.
14389
14390         * cs-parser.jay: pass location to throw statement.
14391
14392         * driver.cs: Small bug fix.
14393
14394         * report.cs: Updated format to be 4-zero filled digits.
14395
14396 2001-12-22  Ravi Pratap  <ravi@ximian.com>
14397
14398         * expression.cs (CheckIndices): Fix minor bug where the wrong
14399         variable was being referred to ;-)
14400
14401         (DoEmit): Do not call EmitStaticInitializers when the 
14402         underlying type is System.Object.
14403
14404 2001-12-21  Ravi Pratap  <ravi@ximian.com>
14405
14406         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
14407         and do the usual workaround for SRE.
14408
14409         * class.cs (MyEventBuilder.EventType): New member to get at the type
14410         of the event, quickly.
14411
14412         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
14413
14414         * assign.cs (Assign.DoResolve): Handle the case when the target
14415         is an EventExpr and perform the necessary checks.
14416
14417         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
14418         interface.
14419
14420         (SimpleName.MemberStaticCheck): Include check for EventExpr.
14421
14422         (EventExpr): Set the type in the constructor itself since we 
14423         are meant to be born fully resolved.
14424
14425         (EventExpr.Define): Revert code I wrote earlier.
14426                 
14427         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
14428         instance expression is null. The instance expression is a This in that case
14429         or a null, depending on whether it is a static method or not.
14430
14431         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
14432         refers to more than one method.
14433
14434         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
14435         and accordingly flag errors.
14436
14437 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14438
14439         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
14440
14441 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14442
14443         * location.cs (ToString): Provide useful rutine.
14444
14445 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14446
14447         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
14448         objects, return the actual integral boxed.
14449
14450         * statement.cs (SwitchLabel): define an ILLabel for each
14451         SwitchLabel. 
14452
14453         (Switch.CheckSwitch): If the value is a Literal, extract
14454         the underlying literal.
14455
14456         Also in the unused hashtable we had, add the SwitchLabel so we can
14457         quickly look this value up.
14458
14459         * constant.cs: Implement a bunch of new constants.  Rewrite
14460         Literal based on this.  Made changes everywhere to adapt to this.
14461
14462         * expression.cs (Expression.MakeByteBlob): Optimize routine by
14463         dereferencing array only once, and also copes with enumrations.
14464
14465         bytes are two bytes wide, not one.
14466
14467         (Cast): Perform constant conversions.
14468
14469         * ecore.cs (TryImplicitIntConversion): Return literals instead of
14470         wrappers to the literals here.
14471
14472         * expression.cs (DoNumericPromotions): long literals can converted
14473         to ulong implicity (this is taken care of elsewhere, but I was
14474         missing this spot).
14475
14476         * ecore.cs (Expression.Literalize): Make the return type Literal,
14477         to improve type checking.
14478
14479         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
14480
14481 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14482
14483         * literal.cs: Revert code from ravi that checked the bounds.  The
14484         bounds are sane by the definition of the type itself. 
14485
14486         * typemanager.cs: Fix implementation of ImplementsInterface.  We
14487         need to actually look up in our parent hierarchy for interfaces
14488         implemented. 
14489
14490         * const.cs: Use the underlying type for enumerations
14491
14492         * delegate.cs: Compute the basename for the delegate creation,
14493         that should fix the delegate test case, and restore the correct
14494         Type Lookup semantics in rootcontext
14495
14496         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
14497         referencing a nested type with the Reflection API is using the "+"
14498         sign. 
14499
14500         * cs-parser.jay: Do not require EOF token at the end.
14501
14502 2001-12-20  Ravi Pratap  <ravi@ximian.com>
14503
14504         * rootcontext.cs (LookupType): Concatenate type names with
14505         a '.' instead of a '+' The test suite passes again.
14506
14507         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
14508         field of the enumeration.
14509
14510         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
14511         the case when the member is an EventExpr.
14512
14513         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
14514         static has an associated instance expression.
14515
14516         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
14517
14518         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
14519
14520         * class.cs (Event.Define): Register event and perform appropriate checks
14521         for error #111.
14522
14523         We define the Add and Remove methods even if the use provides none because
14524         in that case, we provide default implementations ourselves.
14525
14526         Define a private field of the type of the event. This is done by the CSC compiler
14527         and we should be doing it too ;-)
14528
14529         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
14530         More methods we use in code we generate.
14531
14532         (multicast_delegate_type, delegate_type): Two separate types since the distinction
14533         is important.
14534
14535         (InitCoreTypes): Update accordingly for the above.
14536
14537         * class.cs (Event.Emit): Generate code for default accessors that we provide
14538
14539         (EmitDefaultMethod): Do the job in the above.
14540
14541         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
14542         appropriate place.
14543
14544 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14545
14546         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
14547         builders even if we were missing one.
14548
14549         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
14550         pass the Basename as our class name instead of the Name.  The
14551         basename will be correctly composed for us.
14552
14553         * parameter.cs (Paramters): Now takes a Location argument.
14554
14555         * decl.cs (DeclSpace.LookupType): Removed convenience function and
14556         make all the code call directly LookupType in RootContext and take
14557         this chance to pass the Location information everywhere.
14558
14559         * Everywhere: pass Location information.
14560
14561 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
14562
14563         * class.cs (Constructor.Define): Updated way of detecting the
14564         length of the parameters.
14565
14566         (TypeContainer.DefineType): Use basename as the type name for
14567         nested types.
14568
14569         (TypeContainer.Define): Do not recursively define types here, as
14570         definition is taken care in order by the RootContext.
14571
14572         * tree.cs: Keep track of namespaces in a per-file basis.
14573
14574         * parameter.cs (Parameter.ComputeSignature): Update to use
14575         DeclSpace. 
14576
14577         (Parameters.GetSignature): ditto.
14578
14579         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
14580         instead of a TypeContainer.
14581
14582         (Interface.SemanticAnalysis): Use `this' instead of our parent to
14583         resolve names.  Because we need to be resolve in our context, not
14584         our parents.
14585
14586         * driver.cs: Implement response files.
14587
14588         * class.cs (TypeContainer.DefineType): If we are defined, do not
14589         redefine ourselves.
14590
14591         (Event.Emit): Emit the code for add/remove handlers.
14592         (Event.Define): Save the MethodBuilders for add/remove.
14593
14594         * typemanager.cs: Use pair here too.
14595
14596         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
14597         DictionaryEntry requires the first argument to be non-null.  
14598
14599         (enum_declaration): Compute full name for registering the
14600         enumeration.
14601
14602         (delegate_declaration): Instead of using
14603         formal_parameter_list, use opt_formal_parameter_list as the list
14604         can be empty.
14605
14606         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
14607         (EventParsing): New property that controls whether `add' and
14608         `remove' are returned as tokens or identifiers (for events);
14609
14610 2001-12-19  Ravi Pratap  <ravi@ximian.com>
14611
14612         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
14613         use MyEventBuilder only and let it wrap the real builder for us.
14614
14615         (MyEventBuilder): Revamp constructor etc.
14616
14617         Implement all operations that we perform on EventBuilder in precisely the same
14618         way here too.
14619
14620         (FindMembers): Update to use the EventBuilder member.
14621
14622         (Event.Emit): Update accordingly.
14623
14624 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14625
14626         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14627         by calling the appropriate methods.
14628
14629         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14630         useful.
14631
14632         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14633
14634 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14635
14636         * delegate.cs (Delegate.Populate): Check that the return type
14637         and various parameters types are indeed accessible.
14638
14639         * class.cs (Constructor.Define): Same here.
14640
14641         (Field.Define): Ditto.
14642
14643         (Event.Define): Ditto.
14644
14645         (Operator.Define): Check that the underlying Method defined itself
14646         correctly - so it's MethodBuilder should not be null.
14647
14648         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14649         expression happens to be null.
14650
14651         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14652         members but as of now we don't seem to be able to do anything really useful with it.
14653
14654         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14655         not the EventBuilder.
14656
14657 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14658
14659         * cs-tokenizer.cs: Add support for defines.
14660         Add support for #if, #elif, #else, #endif
14661
14662         (eval_var): evaluates a variable.
14663         (eval): stubbed for evaluating functions.
14664
14665         * cs-parser.jay: Pass the defines information
14666
14667         * driver.cs: Add --define command line option.
14668
14669         * decl.cs: Move MemberCore here.
14670
14671         Make it the base class for DeclSpace.  This allows us to catch and
14672         report 108 and 109 for everything now.
14673
14674         * class.cs (TypeContainer.Define): Extract all the members
14675         before populating and emit the warning 108 (new keyword required
14676         to override) instead of having each member implement this.
14677
14678         (MemberCore.Define): New abstract method, we will be using this in
14679         the warning reporting engine in Populate.
14680
14681         (Operator.Define): Adjust to new MemberCore protocol. 
14682
14683         * const.cs (Const): This does not derive from Expression, it is a
14684         temporary object we use to create fields, it is a MemberCore. 
14685
14686         * class.cs (Method.Define): Allow the entry point to be in a
14687         specific class.
14688
14689         * driver.cs: Rewrite the argument handler to clean it up a bit.
14690
14691         * rootcontext.cs: Made it just an auxiliary namespace feature by
14692         making everything static.
14693
14694         * driver.cs: Adapt code to use RootContext type name instead of
14695         instance variable.
14696
14697         * delegate.cs: Remove RootContext argument.
14698
14699         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14700         argument. 
14701
14702         * class.cs (Event.Define): The lookup can fail.
14703
14704         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14705
14706         * expression.cs: Resolve the this instance before invoking the code.
14707
14708 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14709
14710         * cs-parser.jay: Add a production in element_access that allows
14711         the thing to become a "type" reference.  This way we can parse
14712         things like "(string [])" as a type.
14713
14714         Note that this still does not handle the more complex rules of
14715         casts. 
14716
14717
14718         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14719
14720         * ecore.cs: (CopyNewMethods): new utility function used to
14721         assemble the list of methods from running FindMembers.
14722
14723         (MemberLookup): Rework FindMembers so that 
14724
14725 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14726
14727         * class.cs (TypeContainer): Remove Delegates who fail to be
14728         defined.
14729
14730         * delegate.cs (Populate): Verify that we dont get null return
14731         values.   TODO: Check for AsAccessible.
14732
14733         * cs-parser.jay: Use basename to emit error 574 (destructor should
14734         have the same name as container class), not the full name.
14735
14736         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14737         possible representation.  
14738
14739         Also implements integer type suffixes U and L.
14740
14741 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14742
14743         * expression.cs (ArrayCreation.DoResolve): We need to do the
14744         argument resolution *always*.
14745
14746         * decl.cs: Make this hold the namespace.  Hold the root context as
14747         well.
14748         (LookupType): Move here.
14749
14750         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14751
14752         * location.cs (Row, Name): Fixed the code, it was always returning
14753         references to the first file.
14754
14755         * interface.cs: Register properties defined through interfaces.
14756
14757         * driver.cs: Add support for globbing on the command line
14758
14759         * class.cs (Field): Make it derive from MemberCore as well.
14760         (Event): ditto.
14761
14762 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14763
14764         * class.cs (Event::Define): Check that the type of the event is a delegate
14765         type else flag error #66.
14766
14767         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14768         same.
14769
14770         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14771         values of EntryPoint, CharSet etc etc.
14772
14773         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14774
14775         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14776         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14777         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14778         which needs this to do its work.
14779
14780         * ../errors/cs0066.cs : Add.
14781
14782 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14783
14784         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14785         helper functions.
14786
14787         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14788         clears out the parameters field.
14789         (MemberSignatureCompare): Cleanup
14790
14791         (MemberCore): New base class used to share code between MethodCore
14792         and Property.
14793
14794         (RegisterRequiredImplementations) BindingFlags.Public requires
14795         either BindingFlags.Instace or Static.  Use instance here.
14796
14797         (Property): Refactored code to cope better with the full spec.
14798
14799         * parameter.cs (GetParameterInfo): Return an empty array instead
14800         of null on error.
14801
14802         * class.cs (Property): Abstract or extern properties have no bodies.
14803
14804         * parameter.cs (GetParameterInfo): return a zero-sized array.
14805
14806         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14807         method modifier validation to the typecontainer so we can reuse
14808         this on properties.
14809
14810         (MethodCore.ParameterTypes): return an empty sized array of types.
14811
14812         (Property.Define): Test property modifier validity.
14813
14814         Add tests for sealed/override too.
14815
14816         (Method.Emit): abstract or extern methods have no bodies.
14817
14818 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14819
14820         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14821         thing.
14822
14823         (Method::Define, ::Emit): Modify accordingly.
14824
14825         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14826
14827         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14828
14829         * makefile: Pass in /unsafe.
14830
14831 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14832
14833         * class.cs (MakeKey): Kill routine.
14834
14835         * class.cs (TypeContainer.Define): Correctly define explicit
14836         method implementations (they require the full interface name plus
14837         the method name).
14838
14839         * typemanager.cs: Deply the PtrHashtable here and stop using the
14840         lame keys.  Things work so much better.
14841
14842         This of course broke everyone who depended on `RegisterMethod' to
14843         do the `test for existance' test.  This has to be done elsewhere.
14844
14845         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14846         the object stupid Equals method (because, that like fails all over
14847         the place).  We still do not use it.
14848
14849         * class.cs (TypeContainer.SetRequiredInterface,
14850         TypeContainer.RequireMethods): Killed these two routines and moved
14851         all the functionality to RegisterRequiredImplementations.
14852
14853         (TypeContainer.RegisterRequiredImplementations): This routine now
14854         registers all the implementations required in an array for the
14855         interfaces and abstract methods.  We use an array of structures
14856         which can be computed ahead of time to reduce memory usage and we
14857         also assume that lookups are cheap as most classes will not
14858         implement too many interfaces.
14859
14860         We also avoid creating too many MethodSignatures.
14861
14862         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14863         clear the "pending" bit if we find that there are problems with
14864         the declaration.
14865
14866         (TypeContainer.VerifyPendingMethods): Update to report errors of
14867         methods that look like implementations but are not.
14868
14869         (TypeContainer.Define): Add support for explicit interface method
14870         implementation. 
14871
14872 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14873
14874         * typemanager.cs: Keep track of the parameters here instead of
14875         being a feature of the TypeContainer.
14876
14877         * class.cs: Drop the registration of parameters here, as
14878         InterfaceMethods are also interface declarations.
14879
14880         * delegate.cs: Register methods with the TypeManager not only with
14881         the TypeContainer.  This code was buggy.
14882
14883         * interface.cs: Full registation here.
14884
14885 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14886
14887         * expression.cs: Remove reducer for binary expressions, it can not
14888         be done this way.
14889
14890         * const.cs: Put here the code that used to go into constant.cs
14891
14892         * constant.cs: Put here the code for constants, this is a new base
14893         class for Literals.
14894
14895         * literal.cs: Make Literal derive from Constant.
14896
14897 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14898
14899         * statement.cs (Return.Emit): Report error 157 if the user
14900         attempts to return from a finally block.
14901
14902         (Return.Emit): Instead of emitting a return, jump to the end of
14903         the function.
14904
14905         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14906         LocalBuilder to store the result of the function.  ReturnLabel is
14907         the target where we jump.
14908
14909
14910 2001-12-09  Radek Doulik  <rodo@ximian.com>
14911
14912         * cs-parser.jay: remember alias in current namespace
14913
14914         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14915         namespaces
14916
14917         * class.cs (LookupAlias): lookup alias in my_namespace
14918
14919         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14920         aliases hashtable
14921         (LookupAlias): lookup alias in this and if needed in parent
14922         namespaces
14923
14924 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14925
14926         * support.cs: 
14927
14928         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14929         making things static.  I need this to avoid passing the
14930         TypeContainer when calling ParameterType.
14931
14932         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14933         that did string manipulation to compute the type and then call
14934         GetType.  Use Parameter.ParameterType instead.
14935
14936         * cs-tokenizer.cs: Consume the suffix for floating values.
14937
14938         * expression.cs (ParameterReference): figure out whether this is a
14939         reference parameter or not.  Kill an extra variable by computing
14940         the arg_idx during emission.
14941
14942         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14943         function that returns whether a parameter is an out/ref value or not.
14944
14945         (Parameter.ParameterType): The type of the parameter (base,
14946         without ref/out applied).
14947
14948         (Parameter.Resolve): Perform resolution here.
14949         (Parameter.ExternalType): The full type (with ref/out applied).
14950
14951         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14952         support for expressions on the using statement.
14953
14954 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14955
14956         * statement.cs (Using.EmitLocalVariableDecls): Split the
14957         localvariable handling of the using statement.
14958
14959         (Block.EmitMeta): Keep track of variable count across blocks.  We
14960         were reusing slots on separate branches of blocks.
14961
14962         (Try.Emit): Emit the general code block, we were not emitting it. 
14963
14964         Check the type of the declaration to be an IDisposable or
14965         something that can be implicity converted to it. 
14966
14967         Emit conversions if required.
14968
14969         * ecore.cs (EmptyExpression): New utility class.
14970         (Expression.ImplicitConversionExists): New utility function.
14971
14972 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14973
14974         * statement.cs (Using): Implement.
14975
14976         * expression.cs (LocalVariableReference): Support read only variables.
14977
14978         * statement.cs: Remove the explicit emit for the Leave opcode.
14979         (VariableInfo): Add a readonly field.
14980
14981 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14982
14983         * ecore.cs (ConvCast): new class used to encapsulate the various
14984         explicit integer conversions that works in both checked and
14985         unchecked contexts.
14986
14987         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14988         properly generate the overflow opcodes.
14989
14990 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14991
14992         * statement.cs: The correct type for the EmptyExpression is the
14993         element_type, not the variable type.  Ravi pointed this out.
14994
14995 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14996
14997         * class.cs (Method::Define): Handle PInvoke methods specially
14998         by using DefinePInvokeMethod instead of the usual one.
14999
15000         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
15001         above to do the task of extracting information and defining the method.
15002
15003 2001-12-04  Ravi Pratap  <ravi@ximian.com>
15004
15005         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
15006         of the condition for string type.
15007
15008         (Emit): Move that here. 
15009
15010         (ArrayCreation::CheckIndices): Keep string literals in their expression
15011         form.
15012
15013         (EmitDynamicInitializers): Handle strings appropriately.
15014
15015 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
15016
15017         * codegen.cs (EmitContext): Replace multiple variables with a
15018         single pointer to the current Switch statement.
15019
15020         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
15021         EmitContext.
15022
15023 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
15024
15025         * statement.cs 
15026
15027         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
15028         default'.
15029
15030         (Foreach.Emit): Foreach on arrays was not setting
15031         up the loop variables (for break/continue).
15032
15033         (GotoCase): Semi-implented.
15034
15035 2001-12-03  Ravi Pratap  <ravi@ximian.com>
15036
15037         * attribute.cs (CheckAttribute): Handle system attributes by using
15038         Attribute.GetAttributes to examine information we need.
15039
15040         (GetValidPlaces): Same here.
15041
15042         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
15043
15044         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
15045
15046         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
15047
15048         (Method::Define): Set appropriate flags if we have a DllImport attribute.
15049
15050         (Method::Emit): Handle the case when we are a PInvoke method.
15051
15052 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
15053
15054         * expression.cs: Use ResolveWithSimpleName on compound names.
15055
15056 2001-12-02  Ravi Pratap  <ravi@ximian.com>
15057
15058         * constant.cs (EmitConstant): Make sure we resolve the associated expression
15059         before trying to reduce it.
15060
15061         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
15062
15063         * constant.cs (LookupConstantValue): Implement.
15064
15065         (EmitConstant): Use the above in emitting the constant.
15066
15067         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
15068         that are user-defined by doing a LookupConstantValue on them.
15069
15070         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
15071         too, like above.
15072
15073 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
15074
15075         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
15076
15077         (BaseAccess.DoResolve): Implement.
15078
15079         (MemberAccess.DoResolve): Split this routine into a
15080         ResolveMemberAccess routine that can be used independently
15081
15082 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
15083
15084         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
15085         As that share bits of the implementation.  Is returns a boolean,
15086         while As returns the Type that is being probed.
15087
15088 2001-12-01  Ravi Pratap  <ravi@ximian.com>
15089
15090         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
15091         instead of a Literal - much easier.
15092
15093         (EnumInTransit): Remove - utterly useless :-)
15094
15095         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
15096
15097         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
15098
15099         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
15100         chain when we have no associated expression.
15101
15102 2001-11-30  Ravi Pratap  <ravi@ximian.com>
15103
15104         * constant.cs (Define): Use Location while reporting the errror.
15105
15106         Also emit a warning when 'new' is used and there is no inherited
15107         member to hide.
15108
15109         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
15110         populated.
15111
15112         (LookupEnumValue): Implement to lookup an enum member's value and define it
15113         if necessary.
15114
15115         (Populate): Re-write accordingly to use the above routine.
15116
15117 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
15118
15119         * expression.cs (This): Fix prototype for DoResolveLValue to
15120         override the base class DoResolveLValue.
15121
15122         * cs-parser.cs: Report errors cs574 and cs575 (destructor
15123         declarations) 
15124
15125         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
15126         (we need to load the address of the field here).  This fixes
15127         test-22. 
15128
15129         (FieldExpr.DoResolveLValue): Call the DoResolve
15130         function to initialize the Instance expression.
15131
15132         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
15133         correctly the GetEnumerator operation on a value type.
15134
15135         * cs-parser.jay: Add more simple parsing error catches.
15136
15137         * statement.cs (Switch): Add support for string switches.
15138         Handle null specially.
15139
15140         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
15141
15142 2001-11-28  Ravi Pratap  <ravi@ximian.com>
15143
15144         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
15145
15146         (declare_local_constant): New helper function.
15147
15148         * statement.cs (AddConstant): Keep a separate record of constants
15149
15150         (IsConstant): Implement to determine if a variable is a constant.
15151
15152         (GetConstantExpression): Implement.
15153
15154         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
15155
15156         * statement.cs (IsVariableDefined): Re-write.
15157
15158 2001-11-27  Ravi Pratap  <ravi@ximian.com>
15159
15160         * class.cs (TypeContainer::FindMembers): Look for constants
15161         in the case when we are looking for MemberTypes.Field
15162
15163         * expression.cs (MemberAccess::DoResolve): Check that in the
15164         case we are a FieldExpr and a Literal, we are not being accessed
15165         by an instance reference.
15166
15167         * cs-parser.jay (local_constant_declaration): Implement.
15168
15169         (declaration_statement): Implement for constant declarations.
15170
15171 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
15172
15173         * statement.cs (Switch): Catch double defaults.
15174
15175         (Switch): More work on the switch() statement
15176         implementation.  It works for integral values now, need to finish
15177         string support.
15178
15179
15180 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15181
15182         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
15183         integer literals into other integer literals.  To be used by
15184         switch. 
15185
15186 2001-11-24  Ravi Pratap  <ravi@ximian.com>
15187
15188         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
15189         some memory.
15190
15191         (EmitDynamicInitializers): Cope with the above since we extract data
15192         directly from ArrayData now.
15193
15194         (ExpectInitializers): Keep track of whether initializers are mandatory
15195         or not.
15196
15197         (Bounds): Make it a hashtable to prevent the same dimension being 
15198         recorded for every element in that dimension.
15199
15200         (EmitDynamicInitializers): Fix bug which prevented the Set array method
15201         from being found.
15202
15203         Also fix bug which was causing the indices to be emitted in the reverse
15204         order.
15205
15206 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15207
15208         * expression.cs (ArrayCreation): Implement the bits that Ravi left
15209         unfinished.  They do not work, because the underlying code is
15210         sloppy.
15211
15212 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15213
15214         * cs-parser.jay: Remove bogus fixme.
15215
15216         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
15217         on Switch statement.
15218
15219 2001-11-23  Ravi Pratap  <ravi@ximian.com>
15220
15221         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
15222         the same. 
15223
15224         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
15225         parameter. Apparently, any expression is allowed. 
15226
15227         (ValidateInitializers): Update accordingly.
15228
15229         (CheckIndices): Fix some tricky bugs thanks to recursion.
15230
15231         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
15232         I was being completely brain-dead.
15233
15234         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
15235         and re-write acordingly.
15236
15237         (DelegateInvocation): Re-write accordingly.
15238
15239         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
15240
15241         (MakeByteBlob): Handle types more correctly.
15242
15243         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
15244         initialization from expressions but it is incomplete because I am a complete
15245         Dodo :-|
15246
15247 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15248
15249         * statement.cs (If.Emit): Fix a bug that generated incorrect code
15250         on If.  Basically, we have to return `true' (ie, we do return to
15251         our caller) only if both branches of the if return.
15252
15253         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
15254         short-circuit operators, handle them as short circuit operators. 
15255
15256         (Cast.DoResolve): Resolve type.
15257         (Cast.Cast): Take an expression as the target type.
15258
15259         * cs-parser.jay (cast_expression): Remove old hack that only
15260         allowed a limited set of types to be handled.  Now we take a
15261         unary_expression and we resolve to a type during semantic
15262         analysis.
15263
15264         Use the grammar productions from Rhys to handle casts (this is
15265         not complete like Rhys syntax yet, we fail to handle that corner
15266         case that C# has regarding (-x), but we will get there.
15267
15268 2001-11-22  Ravi Pratap  <ravi@ximian.com>
15269
15270         * class.cs (EmitFieldInitializer): Take care of the case when we have a
15271         field which is an array type.
15272
15273         * cs-parser.jay (declare_local_variables): Support array initialization too.
15274
15275         * typemanager.cs (MakeKey): Implement.
15276
15277         (everywhere): Use the above appropriately.
15278
15279         * cs-parser.jay (for_statement): Update for array initialization while
15280         declaring variables.
15281
15282         * ecore.cs : The error message was correct, it's the variable's names that
15283         were misleading ;-) Make the code more readable.
15284
15285         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
15286         the correct type etc.
15287
15288         (ConvertExplicit): Handle Enum types by examining the underlying type.
15289
15290 2001-11-21  Ravi Pratap  <ravi@ximian.com>
15291
15292         * parameter.cs (GetCallingConvention): Always return
15293         CallingConventions.Standard for now.
15294
15295 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15296
15297         * expression.cs (Binary.ResolveOperator): Update the values of `l'
15298         and `r' after calling DoNumericPromotions.
15299
15300         * ecore.cs: Fix error message (the types were in the wrong order).
15301
15302         * statement.cs (Foreach.ProbeCollectionType): Need to pass
15303         BindingFlags.Instance as well 
15304
15305         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
15306         implicit int literal conversion in an empty cast so that we
15307         propagate the right type upstream.
15308
15309         (UnboxCast): new class used to unbox value types.
15310         (Expression.ConvertExplicit): Add explicit type conversions done
15311         by unboxing.
15312
15313         (Expression.ImplicitNumericConversion): Oops, forgot to test for
15314         the target type before applying the implicit LongLiterals to ULong
15315         literal cast.
15316
15317 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
15318
15319         * cs-parser.jay (for_statement): Reworked the way For works: now
15320         we declare manually any variables that are introduced in
15321         for_initializer to solve the problem of having out-of-band code
15322         emition (that is what got for broken).
15323
15324         (declaration_statement): Perform the actual variable declaration
15325         that used to be done in local_variable_declaration here.
15326
15327         (local_variable_declaration): Do not declare anything, just pass
15328         the information on a DictionaryEntry
15329
15330 2001-11-20  Ravi Pratap  <ravi@ximian.com>
15331
15332         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
15333         re-write of the logic to now make it recursive.
15334
15335         (UpdateIndices): Re-write accordingly.
15336
15337         Store element data in a separate ArrayData list in the above methods.
15338
15339         (MakeByteBlob): Implement to dump the array data into a byte array.
15340
15341 2001-11-19  Ravi Pratap  <ravi@ximian.com>
15342
15343         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
15344         into CheckIndices.
15345
15346         * constant.cs (Define): Implement.
15347
15348         (EmitConstant): Re-write fully.
15349
15350         Pass in location info.
15351
15352         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
15353         respectively.
15354
15355         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
15356         DictionaryEntry since we need location info too.
15357
15358         (constant_declaration): Update accordingly.
15359
15360         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
15361         code into another method : UpdateIndices.
15362
15363 2001-11-18  Ravi Pratap  <ravi@ximian.com>
15364
15365         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
15366         some type checking etc.
15367
15368 2001-11-17  Ravi Pratap  <ravi@ximian.com>
15369
15370         * expression.cs (ArrayCreation::ValidateInitializers): Implement
15371         bits to provide dimension info if the user skips doing that.
15372
15373         Update second constructor to store the rank correctly.
15374
15375 2001-11-16  Ravi Pratap  <ravi@ximian.com>
15376
15377         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
15378         and try to implement.
15379
15380         * ../errors/cs0150.cs : Add.
15381
15382         * ../errors/cs0178.cs : Add.
15383
15384 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
15385
15386         * statement.cs: Implement foreach on multi-dimensional arrays. 
15387
15388         * parameter.cs (Parameters.GetParameterByName): Also lookup the
15389         name of the params argument.
15390
15391         * expression.cs: Use EmitStoreOpcode to get the right opcode while
15392         initializing the array.
15393
15394         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
15395         we can use this elsewhere.
15396
15397         * statement.cs: Finish implementation of foreach for single
15398         dimension arrays.
15399
15400         * cs-parser.jay: Use an out-of-band stack to pass information
15401         around, I wonder why I need this.
15402
15403         foreach_block: Make the new foreach_block the current_block.
15404
15405         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
15406         function used to return a static Parameters structure.  Used for
15407         empty parameters, as those are created very frequently.
15408
15409         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
15410
15411 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15412
15413         * interface.cs : Default modifier is private, not public. The
15414         make verify test passes again.
15415
15416 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15417
15418         * support.cs (ReflectionParameters): Fix logic to determine
15419         whether the last parameter is a params one. Test 9 passes again.
15420
15421         * delegate.cs (Populate): Register the builders we define with
15422         RegisterParameterForBuilder. Test 19 passes again.
15423
15424         * cs-parser.jay (property_declaration): Reference $6 instead
15425         of $$ to get at the location.
15426
15427         (indexer_declaration): Similar stuff.
15428
15429         (attribute): Ditto.
15430
15431         * class.cs (Property): Register parameters for the Get and Set methods
15432         if they exist. Test 23 passes again.
15433
15434         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
15435         call to EmitArguments as we are sure there aren't any params arguments. 
15436         Test 32 passes again.
15437
15438         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
15439         IndexOutOfRangeException. 
15440
15441         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
15442         Test 33 now passes again.
15443
15444 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
15445
15446         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
15447         broke a bunch of things.  Will have to come up with a better way
15448         of tracking locations.
15449
15450         * statement.cs: Implemented foreach for single dimension arrays.
15451
15452 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15453
15454         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
15455         an error.  This removes the lookup from the critical path.
15456
15457         * cs-parser.jay: Removed use of temporary_loc, which is completely
15458         broken. 
15459
15460 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
15461
15462         * support.cs (ReflectionParameters.ParameterModifier): Report
15463         whether the argument is a PARAMS argument or not.
15464
15465         * class.cs: Set the attribute `ParamArrayAttribute' on the
15466         parameter argument.
15467
15468         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
15469         and cons_param_array_attribute (ConstructorInfo for
15470         ParamArrayAttribute)., 
15471
15472         * codegen.cs: Emit the return using the `Return' statement, that
15473         way we can report the error correctly for missing return values. 
15474
15475         * class.cs (Method.Emit): Clean up.
15476
15477         * expression.cs (Argument.Resolve): Take another argument: the
15478         location where this argument is used.  Notice that this is not
15479         part of the "Argument" class as to reduce the size of the
15480         structure (we know the approximate location anyways).
15481
15482         Test if the argument is a variable-reference, if not, then
15483         complain with a 206.
15484
15485         (Argument.Emit): Emit addresses of variables.
15486
15487         (Argument.FullDesc): Simplify.
15488
15489         (Invocation.DoResolve): Update for Argument.Resolve.
15490
15491         (ElementAccess.DoResolve): ditto.
15492
15493         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
15494         method should be virtual, as this method is always virtual.
15495
15496         (NewDelegate.DoResolve): Update for Argument.Resolve.
15497
15498         * class.cs (ConstructorInitializer.DoResolve): ditto.
15499
15500         * attribute.cs (Attribute.Resolve): ditto.
15501
15502 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
15503
15504         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
15505
15506         * expression.cs (ParameterReference): Drop IStackStorage and implement
15507         IAssignMethod instead. 
15508
15509         (LocalVariableReference): ditto.
15510
15511         * ecore.cs (FieldExpr): Drop IStackStorage and implement
15512         IAssignMethod instead. 
15513
15514 2001-11-13  Miguel de Icaza <miguel@ximian.com>
15515
15516         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
15517         enumerations that are used in heavily used structures derive from
15518         byte in a laughable and pathetic attempt to reduce memory usage.
15519         This is the kind of pre-optimzations that you should not do at
15520         home without adult supervision.
15521
15522         * expression.cs (UnaryMutator): New class, used to handle ++ and
15523         -- separatedly from the other unary operators.  Cleans up the
15524         code, and kills the ExpressionStatement dependency in Unary.
15525
15526         (Unary): Removed `method' and `Arguments' from this class, making
15527         it smaller, and moving it all to SimpleCall, so I can reuse this
15528         code in other locations and avoid creating a lot of transient data
15529         strucutres when not required.
15530
15531         * cs-parser.jay: Adjust for new changes.
15532
15533 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
15534
15535         * enum.cs (Enum.Populate): If there is a failure during
15536         definition, return
15537
15538         * cs-parser.jay (opt_enum_base): we used to catch type errors
15539         here, but this is really incorrect.  The type error should be
15540         catched during semantic analysis.
15541
15542 2001-12-11  Ravi Pratap  <ravi@ximian.com>
15543
15544         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
15545         current_local_parameters as expected since I, in my stupidity, had forgotten
15546         to do this :-)
15547
15548         * attribute.cs (GetValidPlaces): Fix stupid bug.
15549
15550         * class.cs (Method::Emit): Perform check on applicability of attributes.
15551
15552         (Constructor::Emit): Ditto.
15553
15554         (Field::Emit): Ditto.
15555
15556         (Field.Location): Store location information.
15557
15558         (Property, Event, Indexer, Operator): Ditto.
15559
15560         * cs-parser.jay (field_declaration): Pass in location for each field.
15561
15562         * ../errors/cs0592.cs : Add.
15563
15564 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15565
15566         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
15567
15568         (InitCoreTypes): Update accordingly.
15569
15570         (RegisterAttrType, LookupAttr): Implement.
15571
15572         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
15573         info about the same.
15574
15575         (Resolve): Update to populate the above as necessary.
15576
15577         (Error592): Helper.
15578
15579         (GetValidPlaces): Helper to the above.
15580
15581         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
15582
15583         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
15584
15585 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15586
15587         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
15588
15589         * ../errors/cs0617.cs : Add.
15590
15591 2001-11-11  Ravi Pratap  <ravi@ximian.com>
15592
15593         * enum.cs (Emit): Rename to Populate to be more consistent with what
15594         we expect it to do and when exactly it is called.
15595
15596         * class.cs, rootcontext.cs : Update accordingly.
15597
15598         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
15599         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
15600
15601         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
15602
15603         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
15604         of a fieldinfo using the above, when dealing with a FieldBuilder.
15605
15606 2001-11-10  Ravi Pratap  <ravi@ximian.com>
15607
15608         * ../errors/cs0031.cs : Add.
15609
15610         * ../errors/cs1008.cs : Add.
15611
15612         * ../errrors/cs0543.cs : Add.
15613
15614         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
15615         enum type.
15616
15617         (FindMembers): Implement.
15618
15619         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
15620         enums and delegates too.
15621
15622         (enum_types): Rename to builder_to_enum.
15623
15624         (delegate_types): Rename to builder_to_delegate.
15625
15626         * delegate.cs (FindMembers): Implement.
15627
15628 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15629
15630         * typemanager.cs (IsEnumType): Implement.
15631
15632         * enum.cs (Emit): Re-write parts to account for the underlying type
15633         better and perform checking etc.
15634
15635         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15636         of the underlying type.
15637
15638         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15639         value
15640
15641         * enum.cs (error31): Helper to report error #31.
15642
15643         * cs-parser.jay (enum_declaration): Store location of each member too.
15644
15645         * enum.cs (member_to_location): New hashtable. 
15646
15647         (AddEnumMember): Update location hashtable.
15648
15649         (Emit): Use the location of each member while reporting errors.
15650
15651 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15652
15653         * cs-parser.jay: A for_initializer if is a
15654         local_variable_declaration really ammount to have an implicit
15655         block with the variable declaration and no initializer for for.
15656
15657         * statement.cs (For.Emit): Cope with null initializers.
15658
15659         This fixes the infinite loop on for initializers.
15660
15661 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15662
15663         * enum.cs: More cleanup.
15664
15665         * ecore.cs: Remove dead code.
15666
15667         * class.cs (Property.Emit): More simplification.
15668         (Event.Emit): ditto.
15669
15670         Reworked to have less levels of indentation.
15671
15672 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15673
15674         * class.cs (Property): Emit attributes.
15675
15676         (Field): Ditto.
15677
15678         (Event): Ditto.
15679
15680         (Indexer): Ditto.
15681
15682         (Operator): Ditto.
15683
15684         * enum.cs (Emit): Ditto.
15685
15686         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15687         Enums too.
15688
15689         * class.cs (Field, Event, etc.): Move attribute generation into the
15690         Emit method everywhere.
15691
15692         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15693         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15694         as we had no way of defining nested enums !
15695
15696         * rootcontext.cs : Adjust code accordingly.
15697
15698         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15699
15700 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15701
15702         * expression.cs (EvalConstantExpression): Move into ecore.cs
15703
15704         * enum.cs (Enum): Rename some members and make them public and readonly
15705         according to our convention.
15706
15707         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15708         nothing else.
15709
15710         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15711
15712         (Enum::Emit): Write a simple version for now which doesn't try to compute
15713         expressions. I shall modify this to be more robust in just a while.
15714
15715         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15716
15717         (TypeContainer::CloseType): Create the Enum types too.
15718
15719         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15720
15721         * expression.cs (EvalConstantExpression): Get rid of completely.
15722
15723         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15724         user-defined values and other cases.
15725
15726         (IsValidEnumLiteral): Helper function.
15727
15728         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15729         out there in the case we had a literal FieldExpr.
15730
15731         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15732
15733         (Literalize): Revamp a bit to take two arguments.
15734
15735         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15736
15737 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15738
15739         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15740
15741         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15742
15743         (Resolve): Use the above to ensure we have proper initializers.
15744
15745 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15746
15747         * expression.cs (Expression::EvalConstantExpression): New method to 
15748         evaluate constant expressions.
15749
15750         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15751
15752 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15753
15754         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15755         in an array.
15756
15757         (Binary.ResolveOperator): Handle operator != (object a, object b)
15758         and operator == (object a, object b);
15759
15760         (Binary.DoNumericPromotions): Indicate whether the numeric
15761         promotion was possible.
15762
15763         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15764         Implement.  
15765
15766         Made the ArrayAccess implement interface IAssignMethod instead of
15767         IStackStore as the order in which arguments are passed reflects
15768         this.
15769
15770         * assign.cs: Instead of using expr.ExprClass to select the way of
15771         assinging, probe for the IStackStore/IAssignMethod interfaces.
15772
15773         * typemanager.cs: Load InitializeArray definition.
15774
15775         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15776         static data that can be used to initialize arrays. 
15777
15778 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15779
15780         * expression.cs: Handle operator== and operator!= for booleans.
15781
15782         (Conditioal.Reduce): Implement reducer for the ?: operator.
15783
15784         (Conditional.Resolve): Implement dead code elimination.
15785
15786         (Binary.Resolve): Catch string literals and return a new
15787         concatenated string.
15788
15789         (Unary.Reduce): Implement reduction of unary expressions.
15790
15791         * ecore.cs: Split out the expression core handling here.
15792
15793         (Expression.Reduce): New method used to perform constant folding
15794         and CSE.  This is needed to support constant-expressions. 
15795
15796         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15797         targets, and optimize for !x.
15798
15799 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15800
15801         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15802         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15803         set custom atttributes.
15804
15805         * literal.cs (Literal::GetValue): New abstract method to return the actual
15806         value of the literal, cast as an object.
15807
15808         (*Literal): Implement GetValue method.
15809
15810         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15811         expressions to the arraylist but objects of type Argument.
15812
15813         * class.cs (TypeContainer::Emit): Emit our attributes too.
15814
15815         (Method::Emit, Constructor::Emit): Ditto.
15816
15817         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15818         to be ignoring earlier.
15819
15820 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15821
15822         * attribute.cs (AttributeSection::Define): Implement to do the business
15823         of constructing a CustomAttributeBuilder.
15824
15825         (Attribute): New trivial class. Increases readability of code.  
15826
15827         * cs-parser.jay : Update accordingly.
15828
15829         (positional_argument_list, named_argument_list, named_argument): New rules
15830
15831         (attribute_arguments): Use the above so that we are more correct.
15832
15833 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15834
15835         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15836         to perform all checks for a method with a params parameter.
15837
15838         (Invocation::OverloadResolve): Update to use the above method and therefore
15839         cope correctly with params method invocations.
15840
15841         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15842         params too.
15843
15844         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15845         constructors in our parent too because we can't afford to miss out on 
15846         protected ones ;-)
15847
15848         * attribute.cs (AttributeSection): New name for the class Attribute
15849
15850         Other trivial changes to improve readability.
15851
15852         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15853         use the new class names.
15854
15855 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15856
15857         * class.cs (Method::Define): Complete definition for params types too
15858
15859         (Indexer::Define): Ditto.
15860
15861         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15862         Cope everywhere with a request for info about the array parameter.
15863
15864 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15865
15866         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15867
15868         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15869         local_variable_type to extract the string corresponding to the type.
15870
15871         (local_variable_type): Fixup the action to use the new helper method.
15872
15873         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15874         go.
15875
15876         * expression.cs : Clean out code which uses the above.
15877
15878 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15879
15880         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15881         and bale out if necessary by returning a false.
15882
15883         (RegisterProperty): Ditto.
15884
15885         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15886         and print out appropriate error messages.
15887
15888         * interface.cs (everywhere): Ditto.
15889
15890         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15891         location to constructor.
15892
15893         * class.cs (Property, Event, Indexer): Update accordingly.
15894
15895         * ../errors/cs111.cs : Added.
15896
15897         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15898         of a method, as laid down by the spec.
15899
15900         (Invocation::OverloadResolve): Use the above method.
15901
15902 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15903
15904         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15905         now take a TypeContainer and a Parameters object.
15906
15907         (ParameterData): Modify return type of ParameterModifier method to be 
15908         Parameter.Modifier and not a string.
15909
15910         (ReflectionParameters, InternalParameters): Update accordingly.
15911
15912         * expression.cs (Argument::GetParameterModifier): Same here.
15913
15914         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15915         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15916         symbol in it at all so maybe this is only for now.
15917
15918 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15919
15920         * support.cs (InternalParameters): Constructor now takes an extra argument 
15921         which is the actual Parameters class.
15922
15923         (ParameterDesc): Update to provide info on ref/out modifiers.
15924
15925         * class.cs (everywhere): Update call to InternalParameters to pass in
15926         the second argument too.
15927
15928         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15929         to return the modifier info [ref/out etc]
15930
15931         (InternalParameters, ReflectionParameters): Implement the above.
15932
15933         * expression.cs (Argument::ParameterModifier): Similar function to return
15934         info about the argument's modifiers.
15935
15936         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15937         too.
15938
15939         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15940         a new SetFormalParameters object which we pass to InternalParameters.
15941
15942 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15943
15944         * expression.cs (NewArray): Merge into the ArrayCreation class.
15945
15946 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15947
15948         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15949         NewUserdefinedArray into one as there wasn't much of a use in having
15950         two separate ones.
15951
15952         * expression.cs (Argument): Change field's name to ArgType from Type.
15953
15954         (Type): New readonly property which returns the proper type, taking into 
15955         account ref/out modifiers.
15956
15957         (everywhere): Adjust code accordingly for the above.
15958
15959         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15960         whether we are emitting for a ref or out parameter.
15961
15962         * expression.cs (Argument::Emit): Use the above field to set the state.
15963
15964         (LocalVariableReference::Emit): Update to honour the flag and emit the
15965         right stuff.
15966
15967         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15968
15969         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15970
15971         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15972
15973         (ReflectionParameters, InternalParameters): Implement the above method.
15974
15975         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15976         reporting errors.
15977
15978         (Invocation::FullMethodDesc): Ditto. 
15979
15980 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15981
15982         * cs-parser.jay: Add extra production for the second form of array
15983         creation. 
15984
15985         * expression.cs (ArrayCreation): Update to reflect the above
15986         change. 
15987
15988         * Small changes to prepare for Array initialization.
15989
15990 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15991
15992         * typemanager.cs (ImplementsInterface): interface might be null;
15993         Deal with this problem;
15994
15995         Also, we do store negative hits on the cache (null values), so use
15996         this instead of calling t.GetInterfaces on the type everytime.
15997
15998 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15999
16000         * typemanager.cs (IsBuiltinType): New method to help determine the same.
16001
16002         * expression.cs (New::DoResolve): Get rid of array creation code and instead
16003         split functionality out into different classes.
16004
16005         (New::FormArrayType): Move into NewBuiltinArray.
16006
16007         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
16008         quite useless.
16009
16010         (NewBuiltinArray): New class to handle creation of built-in arrays.
16011
16012         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
16013         account creation of one-dimensional arrays.
16014
16015         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
16016
16017         (NewUserdefinedArray::DoResolve): Implement.
16018
16019         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
16020
16021         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
16022         we maintain inside the TypeManager. This is necessary to perform lookups on the
16023         module builder.
16024
16025         (LookupType): Update to perform GetType on the module builders too.     
16026
16027         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
16028
16029         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
16030
16031 2001-10-23  Ravi Pratap  <ravi@ximian.com>
16032
16033         * expression.cs (New::DoResolve): Implement guts of array creation.
16034
16035         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
16036
16037 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
16038
16039         * expression.cs: Fix bug I introduced lsat night that broke
16040         Delegates. 
16041
16042         (Expression.Resolve): Report a 246 error (can not resolve name)
16043         if we find a SimpleName in the stream.
16044
16045         (Expression.ResolveLValue): Ditto.
16046
16047         (Expression.ResolveWithSimpleName): This function is a variant of
16048         ResolveName, this one allows SimpleNames to be returned without a
16049         warning.  The only consumer of SimpleNames is MemberAccess
16050
16051 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
16052
16053         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
16054         might arrive here.  I have my doubts that this is correct.
16055
16056         * statement.cs (Lock): Implement lock statement.
16057
16058         * cs-parser.jay: Small fixes to support `lock' and `using'
16059
16060         * cs-tokenizer.cs: Remove extra space
16061
16062         * driver.cs: New flag --checked, allows to turn on integer math
16063         checking. 
16064
16065         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
16066         Threading.Monitor.Exit 
16067
16068 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
16069
16070         * expression.cs (IndexerAccess::DoResolveLValue): Set the
16071         Expression Class to be IndexerAccess.
16072
16073         Notice that Indexer::DoResolve sets the eclass to Value.
16074
16075 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
16076
16077         * class.cs (TypeContainer::Emit): Emit code for indexers.
16078
16079         * assign.cs (IAssignMethod): New interface implemented by Indexers
16080         and Properties for handling assignment.
16081
16082         (Assign::Emit): Simplify and reuse code. 
16083
16084         * expression.cs (IndexerAccess, PropertyExpr): Implement
16085         IAssignMethod, clean up old code. 
16086
16087 2001-10-22  Ravi Pratap  <ravi@ximian.com>
16088
16089         * typemanager.cs (ImplementsInterface): New method to determine if a type
16090         implements a given interface. Provides a nice cache too.
16091
16092         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
16093         method.
16094
16095         (ConvertReferenceExplicit): Ditto.
16096
16097         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
16098         various methods, with correct names etc.
16099
16100         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
16101         Operator.UnaryNegation.
16102
16103         * cs-parser.jay (operator_declarator): Be a little clever in the case where
16104         we have a unary plus or minus operator.
16105
16106         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
16107         UnaryMinus.
16108
16109         * everywhere : update accordingly.
16110
16111         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
16112         respectively.
16113
16114         * class.cs (Method::Define): For the case where we are implementing a method
16115         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
16116         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
16117
16118 2001-10-21  Ravi Pratap  <ravi@ximian.com>
16119
16120         * interface.cs (FindMembers): Implement to work around S.R.E
16121         lameness.
16122
16123         * typemanager.cs (IsInterfaceType): Implement.
16124
16125         (FindMembers): Update to handle interface types too.
16126
16127         * expression.cs (ImplicitReferenceConversion): Re-write bits which
16128         use IsAssignableFrom as that is not correct - it doesn't work.
16129
16130         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
16131         and accordingly override EmitStatement.
16132
16133         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
16134         using the correct logic :-)
16135
16136 2001-10-19  Ravi Pratap  <ravi@ximian.com>
16137
16138         * ../errors/cs-11.cs : Add to demonstrate error -11 
16139
16140 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
16141
16142         * assign.cs (Assign::Resolve): Resolve right hand side first, and
16143         then pass this as a hint to ResolveLValue.
16144
16145         * expression.cs (FieldExpr): Add Location information
16146
16147         (FieldExpr::LValueResolve): Report assignment to readonly
16148         variable. 
16149
16150         (Expression::ExprClassFromMemberInfo): Pass location information.
16151
16152         (Expression::ResolveLValue): Add new method that resolves an
16153         LValue. 
16154
16155         (Expression::DoResolveLValue): Default invocation calls
16156         DoResolve. 
16157
16158         (Indexers): New class used to keep track of indexers in a given
16159         Type. 
16160
16161         (IStackStore): Renamed from LValue, as it did not really describe
16162         what this did.  Also ResolveLValue is gone from this interface and
16163         now is part of Expression.
16164
16165         (ElementAccess): Depending on the element access type
16166
16167         * typemanager.cs: Add `indexer_name_type' as a Core type
16168         (System.Runtime.CompilerServices.IndexerNameAttribute)
16169
16170         * statement.cs (Goto): Take a location.
16171
16172 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16173
16174         * delegate.cs (Delegate::VerifyDelegate): New method to verify
16175         if two delegates are compatible.
16176
16177         (NewDelegate::DoResolve): Update to take care of the case when
16178         we instantiate a delegate from another delegate.
16179
16180         * typemanager.cs (FindMembers): Don't even try to look up members
16181         of Delegate types for now.
16182
16183 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16184
16185         * delegate.cs (NewDelegate): New class to take care of delegate
16186         instantiation.
16187
16188         * expression.cs (New): Split the delegate related code out into 
16189         the NewDelegate class.
16190
16191         * delegate.cs (DelegateInvocation): New class to handle delegate 
16192         invocation.
16193
16194         * expression.cs (Invocation): Split out delegate related code into
16195         the DelegateInvocation class.
16196
16197 2001-10-17  Ravi Pratap  <ravi@ximian.com>
16198
16199         * expression.cs (New::DoResolve): Implement delegate creation fully
16200         and according to the spec.
16201
16202         (New::DoEmit): Update to handle delegates differently.
16203
16204         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
16205         because of which we were printing out arguments in reverse order !
16206
16207         * delegate.cs (VerifyMethod): Implement to check if the given method
16208         matches the delegate.
16209
16210         (FullDelegateDesc): Implement.
16211
16212         (VerifyApplicability): Implement.
16213
16214         * expression.cs (Invocation::DoResolve): Update to accordingly handle
16215         delegate invocations too.
16216
16217         (Invocation::Emit): Ditto.
16218
16219         * ../errors/cs1593.cs : Added.
16220
16221         * ../errors/cs1594.cs : Added.
16222
16223         * delegate.cs (InstanceExpression, TargetMethod): New properties.
16224
16225 2001-10-16  Ravi Pratap  <ravi@ximian.com>
16226
16227         * typemanager.cs (intptr_type): Core type for System.IntPtr
16228
16229         (InitCoreTypes): Update for the same.
16230
16231         (iasyncresult_type, asynccallback_type): Ditto.
16232
16233         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
16234         correct.
16235
16236         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
16237         too.
16238
16239         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
16240         the builders for the 4 members of a delegate type :-)
16241
16242         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
16243         type.
16244
16245         * expression.cs (New::DoResolve): Implement guts for delegate creation.
16246
16247         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
16248
16249 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
16250
16251         * statement.cs (Break::Emit): Implement.   
16252         (Continue::Emit): Implement.
16253
16254         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16255         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16256         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16257         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
16258         end loop
16259
16260         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
16261         properties that track the label for the current loop (begin of the
16262         loop and end of the loop).
16263
16264 2001-10-15  Ravi Pratap  <ravi@ximian.com>
16265
16266         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
16267         use of emitting anything at all.
16268
16269         * class.cs, rootcontext.cs : Get rid of calls to the same.
16270
16271         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
16272
16273         (Populate): Define the constructor correctly and set the implementation
16274         attributes.
16275
16276         * typemanager.cs (delegate_types): New hashtable to hold delegates that
16277         have been defined.
16278
16279         (AddDelegateType): Implement.
16280
16281         (IsDelegateType): Implement helper method.
16282
16283         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
16284
16285         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
16286         and accordingly handle it.
16287
16288         * delegate.cs (Populate): Take TypeContainer argument.
16289         Implement bits to define the Invoke method. However, I still haven't figured out
16290         how to take care of the native int bit :-(
16291
16292         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
16293         Qualify the name of the delegate, not its return type !
16294
16295         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
16296         conversion.
16297
16298         (StandardConversionExists): Checking for array types turns out to be recursive.
16299
16300         (ConvertReferenceExplicit): Implement array conversion.
16301
16302         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
16303
16304 2001-10-12  Ravi Pratap  <ravi@ximian.com>
16305
16306         * cs-parser.jay (delegate_declaration): Store the fully qualified
16307         name as it is a type declaration.
16308
16309         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
16310         readonly.
16311
16312         (DefineDelegate): Renamed from Define. Does the same thing essentially,
16313         as TypeContainer::DefineType.
16314
16315         (Populate): Method in which all the definition of the various methods (Invoke)
16316         etc is done.
16317
16318         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
16319         see.
16320
16321         (CloseDelegate): Finally creates the delegate.
16322
16323         * class.cs (TypeContainer::DefineType): Update to define delegates.
16324         (Populate, Emit and CloseType): Do the same thing here too.
16325
16326         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
16327         delegates in all these operations.
16328
16329 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
16330
16331         * expression.cs: LocalTemporary: a new expression used to
16332         reference a temporary that has been created.
16333
16334         * assign.cs: Handle PropertyAccess back here, so that we can
16335         provide the proper semantic access to properties.
16336
16337         * expression.cs (Expression::ConvertReferenceExplicit): Implement
16338         a few more explicit conversions. 
16339
16340         * modifiers.cs: `NEW' modifier maps to HideBySig.
16341
16342         * expression.cs (PropertyExpr): Make this into an
16343         ExpressionStatement, and support the EmitStatement code path. 
16344
16345         Perform get/set error checking, clean up the interface.
16346
16347         * assign.cs: recognize PropertyExprs as targets, and if so, turn
16348         them into toplevel access objects.
16349
16350 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
16351
16352         * expression.cs: PropertyExpr::PropertyExpr: use work around the
16353         SRE.
16354
16355         * typemanager.cs: Keep track here of our PropertyBuilders again to
16356         work around lameness in SRE.
16357
16358 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
16359
16360         * expression.cs (LValue::LValueResolve): New method in the
16361         interface, used to perform a second resolution pass for LValues. 
16362
16363         (This::DoResolve): Catch the use of this in static methods.
16364
16365         (This::LValueResolve): Implement.
16366
16367         (This::Store): Remove warning, assigning to `this' in structures
16368         is 
16369
16370         (Invocation::Emit): Deal with invocation of
16371         methods on value types.  We need to pass the address to structure
16372         methods rather than the object itself.  (The equivalent code to
16373         emit "this" for structures leaves the entire structure on the
16374         stack instead of a pointer to it). 
16375
16376         (ParameterReference::DoResolve): Compute the real index for the
16377         argument based on whether the method takes or not a `this' pointer
16378         (ie, the method is static).
16379
16380         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
16381         value types returned from functions when we need to invoke a
16382         method on the sturcture.
16383
16384
16385 2001-10-11  Ravi Pratap  <ravi@ximian.com>
16386
16387         * class.cs (TypeContainer::DefineType): Method to actually do the business of
16388         defining the type in the Modulebuilder or Typebuilder. This is to take
16389         care of nested types which need to be defined on the TypeBuilder using
16390         DefineNestedMethod.
16391
16392         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
16393         methods in RootContext, only ported to be part of TypeContainer.
16394
16395         (TypeContainer::GetInterfaceOrClass): Ditto.
16396
16397         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
16398
16399         * interface.cs (Interface::DefineInterface): New method. Does exactly
16400         what RootContext.CreateInterface did earlier, only it takes care of nested types 
16401         too.
16402
16403         (Interface::GetInterfaces): Move from RootContext here and port.
16404
16405         (Interface::GetInterfaceByName): Same here.
16406
16407         * rootcontext.cs (ResolveTree): Re-write.
16408
16409         (PopulateTypes): Re-write.
16410
16411         * class.cs (TypeContainer::Populate): Populate nested types too.
16412         (TypeContainer::Emit): Emit nested members too.
16413
16414         * typemanager.cs (AddUserType): Do not make use of the FullName property,
16415         instead just use the name argument passed in as it is already fully
16416         qualified.
16417
16418         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
16419         to TypeContainer mapping to see if a type is user-defined.
16420
16421         * class.cs (TypeContainer::CloseType): Implement. 
16422
16423         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
16424         the default constructor.
16425
16426         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
16427         twice.
16428
16429         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
16430
16431         * interface.cs (CloseType): Create the type here.
16432
16433         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
16434         the hierarchy.
16435
16436         Remove all the methods which are now in TypeContainer.
16437
16438 2001-10-10  Ravi Pratap  <ravi@ximian.com>
16439
16440         * delegate.cs (Define): Re-write bits to define the delegate
16441         correctly.
16442
16443 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
16444
16445         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
16446
16447         * expression.cs (ImplicitReferenceConversion): handle null as well
16448         as a source to convert to any reference type.
16449
16450         * statement.cs (Return): Perform any implicit conversions to
16451         expected return type.  
16452
16453         Validate use of return statement.  
16454
16455         * codegen.cs (EmitContext): Pass the expected return type here.
16456
16457         * class.cs (Method, Constructor, Property): Pass expected return
16458         type to EmitContext.
16459
16460 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
16461
16462         * expression.cs: Make DoResolve take an EmitContext instead of a
16463         TypeContainer.
16464
16465         Replaced `l' and `location' for `loc', for consistency.
16466
16467         (Error, Warning): Remove unneeded Tc argument.
16468
16469         * assign.cs, literal.cs, constant.cs: Update to new calling
16470         convention. 
16471
16472         * codegen.cs: EmitContext now contains a flag indicating whether
16473         code is being generated in a static method or not.
16474
16475         * cs-parser.jay: DecomposeQI, new function that replaces the old
16476         QualifiedIdentifier.  Now we always decompose the assembled
16477         strings from qualified_identifier productions into a group of
16478         memberaccesses.
16479
16480 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
16481
16482         * rootcontext.cs: Deal with field-less struct types correctly now
16483         by passing the size option to Define Type.
16484
16485         * class.cs: Removed hack that created one static field. 
16486
16487 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16488
16489         * statement.cs: Moved most of the code generation here. 
16490
16491 2001-10-09  Ravi Pratap  <ravi@ximian.com>
16492
16493         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
16494         seem very right.
16495
16496         (ElementAccess): Remove useless bits for now - keep checks as the spec
16497         says.
16498
16499 2001-10-08  Ravi Pratap  <ravi@ximian.com>
16500
16501         * expression.cs (ElementAccess::DoResolve): Remove my crap code
16502         and start performing checks according to the spec.
16503
16504 2001-10-07  Ravi Pratap  <ravi@ximian.com>
16505
16506         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
16507         rank_specifiers instead.
16508
16509         (rank_specifiers): Change the order in which the rank specifiers are stored
16510
16511         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
16512
16513         * expression.cs (ElementAccess): Implement the LValue interface too.
16514
16515 2001-10-06  Ravi Pratap  <ravi@ximian.com>
16516
16517         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
16518         except that user defined conversions are not included.
16519
16520         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
16521         perform the conversion of the return type, if necessary.
16522
16523         (New::DoResolve): Check whether we are creating an array or an object
16524         and accordingly do the needful.
16525
16526         (New::Emit): Same here.
16527
16528         (New::DoResolve): Implement guts of array creation.
16529
16530         (New::FormLookupType): Helper function.
16531
16532 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16533
16534         * codegen.cs: Removed most of the code generation here, and move the
16535         corresponding code generation bits to the statement classes. 
16536
16537         Added support for try/catch/finalize and throw.
16538
16539         * cs-parser.jay: Added support for try/catch/finalize.
16540
16541         * class.cs: Catch static methods having the flags override,
16542         virtual or abstract.
16543
16544         * expression.cs (UserCast): This user cast was not really doing
16545         what it was supposed to do.  Which is to be born in fully resolved
16546         state.  Parts of the resolution were being performed at Emit time! 
16547
16548         Fixed this code.
16549
16550 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16551
16552         * expression.cs: Implicity convert the result from UserCast.
16553
16554 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16555
16556         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
16557         prevented it from working correctly. 
16558
16559         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
16560         merely ConvertImplicit.
16561
16562 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16563
16564         * typemanager.cs: Make the LookupTypeContainer function static,
16565         and not per-instance.  
16566
16567         * class.cs: Make static FindMembers (the one that takes a Type
16568         argument). 
16569
16570         * codegen.cs: Add EmitForeach here.
16571
16572         * cs-parser.jay: Make foreach a toplevel object instead of the
16573         inline expansion, as we need to perform semantic analysis on it. 
16574
16575 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16576
16577         * expression.cs (Expression::ImplicitUserConversion): Rename to
16578         UserDefinedConversion.
16579
16580         (Expression::UserDefinedConversion): Take an extra argument specifying 
16581         whether we look for explicit user conversions too.
16582
16583         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
16584
16585         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
16586
16587         (ExplicitUserConversion): Make it a call to UserDefinedConversion
16588         with the appropriate arguments.
16589
16590         * cs-parser.jay (cast_expression): Record location too.
16591
16592         * expression.cs (Cast): Record location info.
16593
16594         (Expression::ConvertExplicit): Take location argument.
16595
16596         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
16597         to determine if we are doing explicit conversions.
16598
16599         (UserCast::Emit): Update accordingly.
16600
16601         (Expression::ConvertExplicit): Report an error if everything fails.
16602
16603         * ../errors/cs0030.cs : Add.
16604
16605 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
16606
16607         * modifiers.cs: If the ABSTRACT keyword is present, also set the
16608         virtual and newslot bits. 
16609
16610         * class.cs (TypeContainer::RegisterRequiredImplementations):
16611         Record methods we need.
16612
16613         (TypeContainer::MakeKey): Helper function to make keys for
16614         MethodBases, since the Methodbase key is useless.
16615
16616         (TypeContainer::Populate): Call RegisterRequiredImplementations
16617         before defining the methods.   
16618
16619         Create a mapping for method_builders_to_methods ahead of time
16620         instead of inside a tight loop.
16621
16622         (::RequireMethods):  Accept an object as the data to set into the
16623         hashtable so we can report interface vs abstract method mismatch.
16624
16625 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16626
16627         * report.cs: Make all of it static.
16628
16629         * rootcontext.cs: Drop object_type and value_type computations, as
16630         we have those in the TypeManager anyways.
16631
16632         Drop report instance variable too, now it is a global.
16633
16634         * driver.cs: Use try/catch on command line handling.
16635
16636         Add --probe option to debug the error reporting system with a test
16637         suite. 
16638
16639         * report.cs: Add support for exiting program when a probe
16640         condition is reached.
16641
16642 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16643
16644         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16645         we do a forcible conversion regardless of type, to check if 
16646         ForceConversion returns a null.
16647
16648         (Binary::error19): Use location to report error.
16649
16650         (Unary::error23): Use location here too.
16651
16652         * ../errors/cs0019.cs : Check in.
16653
16654         * ../errors/cs0023.cs : Check in.
16655
16656         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16657         case of a non-null MethodInfo object with a length of 0 !
16658
16659         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16660         an applicable member - according to the spec :-)
16661         Also fix logic to find members in base types.
16662
16663         (Unary::ResolveOperator): Same here.
16664
16665         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16666         as I was getting thoroughly confused between this and error19 :-)
16667
16668         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16669         (::FindMostEncompassedType): Implement.
16670         (::FindMostEncompassingType): Implement.
16671         (::StandardConversionExists): Implement.
16672
16673         (UserImplicitCast): Re-vamp. We now need info about most specific
16674         source and target types so that we can do the necessary conversions.
16675
16676         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16677         mathematical union with no duplicates.
16678
16679 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16680
16681         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16682         in order from base classes to child classes, so that we can in
16683         child classes look up in our parent for method names and
16684         attributes (required for handling abstract, virtual, new, override
16685         constructs: we need to instrospect our base class, and if we dont
16686         populate the classes in order, the introspection might be
16687         incorrect.  For example, a method could query its parent before
16688         the parent has any methods and would determine that the parent has
16689         no abstract methods (while it could have had them)).
16690
16691         (RootContext::CreateType): Record the order in which we define the
16692         classes.
16693
16694 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16695
16696         * class.cs (TypeContainer::Populate): Also method definitions can
16697         fail now, keep track of this.
16698
16699         (TypeContainer::FindMembers): Implement support for
16700         DeclaredOnly/noDeclaredOnly flag.
16701
16702         (Constructor::Emit) Return the ConstructorBuilder.
16703
16704         (Method::Emit) Return the MethodBuilder. 
16705         Check for abstract or virtual methods to be public.
16706
16707         * rootcontext.cs (RootContext::CreateType): Register all the
16708         abstract methods required for the class to be complete and the
16709         interface methods that must be implemented. 
16710
16711         * cs-parser.jay: Report error 501 (method requires body if it is
16712         not marked abstract or extern).
16713
16714         * expression.cs (TypeOf::Emit): Implement.
16715
16716         * typemanager.cs: runtime_handle_type, new global type.
16717
16718         * class.cs (Property::Emit): Generate code for properties.
16719
16720 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16721
16722         * expression.cs (Unary::ResolveOperator): Find operators on base type
16723         too - we now conform exactly to the spec.
16724
16725         (Binary::ResolveOperator): Same here.
16726
16727         * class.cs (Operator::Define): Fix minor quirk in the tests.
16728
16729         * ../errors/cs0215.cs : Added.
16730
16731         * ../errors/cs0556.cs : Added.
16732
16733         * ../errors/cs0555.cs : Added.
16734
16735 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16736
16737         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16738         single integer which is really efficient
16739
16740 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16741
16742         *  expression.cs (Expression::ImplicitUserConversion): Use location
16743         even in the case when we are examining True operators.
16744  
16745         * class.cs (Operator::Define): Perform extensive checks to conform
16746         with the rules for operator overloading in the spec.
16747
16748         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16749         some of the other conversions mentioned in the spec.
16750
16751         * typemanager.cs (array_type): New static member for the System.Array built-in
16752         type.
16753
16754         (cloneable_interface): For System.ICloneable interface.
16755
16756         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16757         we start resolving the tree and populating types.
16758
16759         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16760  
16761 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16762
16763         * expression.cs (Expression::ExprClassFromMemberInfo,
16764         Expression::Literalize): Create literal expressions from
16765         FieldInfos which are literals.
16766
16767         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16768         type casts, because they were wrong.  The test suite in tests
16769         caught these ones.
16770
16771         (ImplicitNumericConversion): ushort to ulong requires a widening
16772         cast. 
16773
16774         Int32 constant to long requires widening cast as well.
16775
16776         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16777         for integers because the type on the stack is not i4.
16778
16779 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16780
16781         * expression.cs (report118): require location argument. 
16782
16783         * parameter.cs: Do not dereference potential null value.
16784
16785         * class.cs: Catch methods that lack the `new' keyword when
16786         overriding a name.  Report warnings when `new' is used without
16787         anything being there to override.
16788
16789         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16790
16791         * class.cs: Only add constructor to hashtable if it is non-null
16792         (as now constructors can fail on define).
16793
16794         (TypeManager, Class, Struct): Take location arguments.
16795
16796         Catch field instance initialization in structs as errors.
16797
16798         accepting_filter: a new filter for FindMembers that is static so
16799         that we dont create an instance per invocation.
16800
16801         (Constructor::Define): Catch errors where a struct constructor is
16802         parameterless 
16803
16804         * cs-parser.jay: Pass location information for various new
16805         constructs. 
16806
16807         * delegate.cs (Delegate): take a location argument.
16808
16809         * driver.cs: Do not call EmitCode if there were problesm in the
16810         Definition of the types, as many Builders wont be there. 
16811
16812         * decl.cs (Decl::Decl): Require a location argument.
16813
16814         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16815         into integers, and find the most appropiate integer for it.
16816
16817         * literal.cs: Implement ULongLiteral.
16818
16819         * rootcontext.cs: Provide better information about the location of
16820         failure when CreateType fails.
16821
16822 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16823
16824         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16825         as well.
16826
16827         * expression.cs (Binary::CheckShiftArguments): Add missing type
16828         computation.
16829         (Binary::ResolveOperator): Add type to the logical and and logical
16830         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16831         before.
16832
16833         (Binary::DoNumericPromotions): In the case where either argument
16834         is ulong (and most signed types combined with ulong cause an
16835         error) perform implicit integer constant conversions as well.
16836
16837 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16838
16839         * expression.cs (UserImplicitCast): Method should always be
16840         non-null. 
16841         (Invocation::BetterConversion): Simplified test for IntLiteral.
16842
16843         (Expression::ImplicitNumericConversion): Split this routine out.
16844         Put the code that performs implicit constant integer conversions
16845         here. 
16846
16847         (Expression::Resolve): Become a wrapper around DoResolve so we can
16848         check eclass and type being set after resolve.
16849
16850         (Invocation::Badness): Remove this dead function
16851
16852         (Binary::ResolveOperator): Do not compute the expensive argumnets
16853         unless we have a union for it.
16854
16855         (Probe::Emit): Is needs to do an isinst and then
16856         compare against null.
16857
16858         (::CanConvert): Added Location argument.  If the Location argument
16859         is null (Location.Null), then we do not report errors.  This is
16860         used by the `probe' mechanism of the Explicit conversion.  We do
16861         not want to generate an error for something that the user
16862         explicitly requested to be casted.  But the pipeline for an
16863         explicit cast first tests for potential implicit casts.
16864
16865         So for now, if the Location is null, it means `Probe only' to
16866         avoid adding another argument.   Might have to revise this
16867         strategy later.
16868
16869         (ClassCast): New class used to type cast objects into arbitrary
16870         classes (used in Explicit Reference Conversions).
16871
16872         Implement `as' as well.
16873
16874         Reverted all the patches from Ravi below: they were broken:
16875
16876                 * The use of `level' as a mechanism to stop recursive
16877                   invocations is wrong.  That was there just to catch the
16878                   bug with a strack trace but not as a way of addressing
16879                   the problem.
16880
16881                   To fix the problem we have to *understand* what is going
16882                   on and the interactions and come up with a plan, not
16883                   just get things going.
16884
16885                 * The use of the type conversion cache that I proposed
16886                   last night had an open topic: How does this work across
16887                   protection domains.  A user defined conversion might not
16888                   be public in the location where we are applying the
16889                   conversion, a different conversion might be selected
16890                   (ie, private A->B (better) but public B->A (worse),
16891                   inside A, A->B applies, but outside it, B->A will
16892                   apply).
16893
16894                 * On top of that (ie, even if the above is solved),
16895                   conversions in a cache need to be abstract.  Ie, `To
16896                   convert from an Int to a Short use an OpcodeCast', not
16897                   `To convert from an Int to a Short use the OpcodeCast on
16898                   the variable 5' (which is what this patch was doing).
16899
16900 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16901
16902         * expression.cs (Invocation::ConversionExists): Re-write to use
16903         the conversion cache
16904
16905         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16906         cache all conversions done, not just user-defined ones.
16907
16908         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16909         to determine if a conversion exists instead of acutually trying to 
16910         perform the conversion. It's faster too.
16911
16912         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16913         and only then attempt the implicit conversion.
16914
16915 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16916
16917         * expression.cs (ConvertImplicit): Use a cache for conversions
16918         already found. Check level of recursion and bail out if necessary.
16919
16920 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16921
16922         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16923         Export standard methods that we expect for string operations.
16924
16925         * statement.cs (Block::UsageWarning): Track usage of variables and
16926         report the errors for not used variables.
16927
16928         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16929         operator. 
16930
16931 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16932
16933         * codegen.cs: remove unnneded code 
16934
16935         * expression.cs: Removed BuiltinTypeAccess class
16936
16937         Fix the order in which implicit conversions are
16938         done.  
16939
16940         The previous fixed dropped support for boxed conversions (adding a
16941         test to the test suite now)
16942
16943         (UserImplicitCast::CanConvert): Remove test for source being null,
16944         that code is broken.  We should not feed a null to begin with, if
16945         we do, then we should track the bug where the problem originates
16946         and not try to cover it up here.
16947
16948         Return a resolved expression of type UserImplicitCast on success
16949         rather than true/false.  Ravi: this is what I was talking about,
16950         the pattern is to use a static method as a "constructor" for
16951         objects. 
16952
16953         Also, do not create arguments until the very last minute,
16954         otherwise we always create the arguments even for lookups that
16955         will never be performed. 
16956
16957         (UserImplicitCast::Resolve): Eliminate, objects of type
16958         UserImplicitCast are born in a fully resolved state. 
16959
16960         * typemanager.cs (InitCoreTypes): Init also value_type
16961         (System.ValueType). 
16962
16963         * expression.cs (Cast::Resolve): First resolve the child expression.
16964
16965         (LValue): Add new method AddressOf to be used by
16966         the `&' operator.  
16967
16968         Change the argument of Store to take an EmitContext instead of an
16969         ILGenerator, because things like FieldExpr need to be able to call
16970         their children expression to generate the instance code. 
16971
16972         (Expression::Error, Expression::Warning): Sugar functions for
16973         reporting errors.
16974
16975         (Expression::MemberLookup): Accept a TypeContainer instead of a
16976         Report as the first argument.
16977
16978         (Expression::ResolvePrimary): Killed.  I still want to improve
16979         this as currently the code is just not right.
16980
16981         (Expression::ResolveMemberAccess): Simplify, but it is still
16982         wrong. 
16983
16984         (Unary::Resolve): Catch errors in AddressOf operators.
16985
16986         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16987         index to a byte for the short-version, or the compiler will choose
16988         the wrong Emit call, which generates the wrong data.
16989
16990         (ParameterReference::Emit, ::Store): same.
16991
16992         (FieldExpr::AddressOf): Implement.
16993
16994         * typemanager.cs: TypeManager: made public variable instead of
16995         property.
16996
16997         * driver.cs: document --fatal.
16998
16999         * report.cs (ErrorMessage, WarningMessage): new names for the old
17000         Error and Warning classes.
17001
17002         * cs-parser.jay (member_access): Turn built-in access to types
17003         into a normal simplename
17004
17005 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17006
17007         * expression.cs (Invocation::BetterConversion): Fix to cope
17008         with q being null, since this was introducing a bug.
17009
17010         * expression.cs (ConvertImplicit): Do built-in conversions first.
17011
17012 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17013
17014         * expression.cs (UserImplicitCast::Resolve): Fix bug.
17015
17016 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17017
17018         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
17019         I had introduced long ago (what's new ?).
17020
17021         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
17022         the work of all the checking. 
17023         (ConvertImplicit): Call CanConvert and only then create object if necessary.
17024         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
17025
17026         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
17027         that is the right way. 
17028
17029         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
17030         overloading resolution. Use everywhere instead of cutting and pasting code.
17031
17032         (Binary::ResolveOperator): Use MakeUnionSet.
17033
17034         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
17035         we have to convert to bool types. Not complete yet.
17036
17037 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17038
17039         * typemanager.cs (TypeManager::CSharpName): support ushort.
17040
17041         * expression.cs (Expression::TryImplicitIntConversion): Attempts
17042         to provide an expression that performsn an implicit constant int
17043         conversion (section 6.1.6).
17044         (Expression::ConvertImplicitRequired): Reworked to include
17045         implicit constant expression conversions.
17046
17047         (Expression::ConvertNumericExplicit): Finished.
17048
17049         (Invocation::Emit): If InstanceExpression is null, then it means
17050         that we perform a call on this.
17051
17052 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
17053
17054         * expression.cs (Unary::Emit): Remove some dead code.
17055         (Probe): Implement Resolve and Emit for `is'.
17056         (Expression::ConvertImplicitRequired): Attempt to do constant
17057         expression conversions here.  Maybe should be moved to
17058         ConvertImplicit, but I am not sure.
17059         (Expression::ImplicitLongConstantConversionPossible,
17060         Expression::ImplicitIntConstantConversionPossible): New functions
17061         that tell whether is it possible to apply an implicit constant
17062         expression conversion.
17063
17064         (ConvertNumericExplicit): Started work on explicit numeric
17065         conversions.
17066
17067         * cs-parser.jay: Update operator constants.
17068
17069         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
17070         (Parameters::GetSignature): Hook up VerifyArgs here.
17071         (Parameters::VerifyArgs): Verifies that no two arguments have the
17072         same name. 
17073
17074         * class.cs (Operator): Update the operator names to reflect the
17075         ones that the spec expects (as we are just stringizing the
17076         operator names).
17077
17078         * expression.cs (Unary::ResolveOperator): Fix bug: Use
17079         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
17080         previous usage did only work for our methods.
17081         (Expression::ConvertImplicit): Handle decimal implicit numeric
17082         conversions as well.
17083         (Expression::InternalTypeConstructor): Used to invoke constructors
17084         on internal types for default promotions.
17085
17086         (Unary::Emit): Implement special handling for the pre/post
17087         increment/decrement for overloaded operators, as they need to have
17088         the same semantics as the other operators.
17089
17090         (Binary::ResolveOperator): ditto.
17091         (Invocation::ConversionExists): ditto.
17092         (UserImplicitCast::Resolve): ditto.
17093
17094 2001-09-26  Ravi Pratap  <ravi@ximian.com>
17095
17096         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
17097         operator, return after emitting body. Regression tests pass again !
17098
17099         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
17100         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
17101         (Invocation::OverloadResolve): Ditto.
17102         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
17103
17104         * everywhere : update calls to the above methods accordingly.
17105
17106 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
17107
17108         * assign.cs (Assign): Make it inherit from ExpressionStatement.
17109
17110         * expression.cs (ExpressionStatement): New base class used for
17111         expressions that can appear in statements, so that we can provide
17112         an alternate path to generate expression that do not leave a value
17113         on the stack.
17114
17115         (Expression::Emit, and all the derivatives): We no longer return
17116         whether a value is left on the stack or not.  Every expression
17117         after being emitted leaves a single value on the stack.
17118
17119         * codegen.cs (EmitContext::EmitStatementExpression): Use the
17120         facilties of ExpressionStatement if possible.
17121
17122         * cs-parser.jay: Update statement_expression.
17123
17124 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
17125
17126         * driver.cs: Change the wording of message
17127
17128 2001-09-25  Ravi Pratap  <ravi@ximian.com>
17129
17130         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
17131         the type of the expression to the return type of the method if
17132         we have an overloaded operator match ! The regression tests pass again !
17133         (Unary::ResolveOperator): Ditto.
17134
17135         * expression.cs (Invocation::ConversionExists): Correct the member lookup
17136         to find "op_Implicit", not "implicit" ;-)
17137         (UserImplicitCast): New class to take care of user-defined implicit conversions.
17138         (ConvertImplicit, ForceConversion): Take TypeContainer argument
17139
17140         * everywhere : Correct calls to the above accordingly.
17141
17142         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
17143         (ConvertImplicit): Do user-defined conversion if it exists.
17144
17145 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
17146
17147         * assign.cs: track location.
17148         (Resolve): Use implicit conversions on assignment.
17149
17150         * literal.cs: Oops.  Not good, Emit of short access values should
17151         pass (Bytes) or the wrong argument will be selected.
17152
17153         * expression.cs (Unary::Emit): Emit code for -expr.
17154
17155         (Unary::ResolveOperator): Handle `Substract' for non-constants
17156         (substract from zero from the non-constants).
17157         Deal with Doubles as well. 
17158
17159         (Expression::ConvertImplicitRequired): New routine that reports an
17160         error if no implicit conversion exists. 
17161
17162         (Invocation::OverloadResolve): Store the converted implicit
17163         expressions if we make them
17164
17165 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17166
17167         * class.cs (ConstructorInitializer): Take a Location argument.
17168         (ConstructorBaseInitializer): Same here.
17169         (ConstructorThisInitializer): Same here.
17170
17171         * cs-parser.jay : Update all calls accordingly.
17172
17173         * expression.cs (Unary, Binary, New): Take location argument.
17174         Update accordingly everywhere.
17175
17176         * cs-parser.jay : Update all calls to the above to take a location
17177         argument.
17178
17179         * class.cs : Ditto.
17180
17181 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17182
17183         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
17184         (Invocation::BetterConversion): Same here
17185         (Invocation::ConversionExists): Ditto.
17186
17187         (Invocation::ConversionExists): Implement.
17188
17189 2001-09-22  Ravi Pratap  <ravi@ximian.com>
17190
17191         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
17192         Also take an additional TypeContainer argument.
17193
17194         * All over : Pass in TypeContainer as argument to OverloadResolve.
17195
17196         * typemanager.cs (CSharpName): Update to check for the string type and return
17197         that too.
17198
17199         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
17200         a given method.
17201
17202 2001-09-21  Ravi Pratap  <ravi@ximian.com>
17203
17204         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
17205         (Invocation::BetterFunction): Implement.
17206         (Invocation::BetterConversion): Implement.
17207         (Invocation::ConversionExists): Skeleton, no implementation yet.
17208
17209         Okay, things work fine !
17210
17211 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
17212
17213         * typemanager.cs: declare and load enum_type, delegate_type and
17214         void_type. 
17215
17216         * expression.cs (Expression::Emit): Now emit returns a value that
17217         tells whether a value is left on the stack or not.  This strategy
17218         might be reveted tomorrow with a mechanism that would address
17219         multiple assignments.
17220         (Expression::report118): Utility routine to report mismatches on
17221         the ExprClass.
17222
17223         (Unary::Report23): Report impossible type/operator combination
17224         utility function.
17225
17226         (Unary::IsIncrementableNumber): Whether the type can be
17227         incremented or decremented with add.
17228         (Unary::ResolveOperator): Also allow enumerations to be bitwise
17229         complemented. 
17230         (Unary::ResolveOperator): Implement ++, !, ~,
17231
17232         (Invocation::Emit): Deal with new Emit convetion.
17233
17234         * All Expression derivatives: Updated their Emit method to return
17235         whether they leave values on the stack or not.
17236
17237         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
17238         stack for expressions that are statements. 
17239
17240 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17241
17242         * expression.cs (LValue): New interface.  Must be implemented by
17243         LValue objects.
17244         (LocalVariableReference, ParameterReference, FieldExpr): Implement
17245         LValue interface.
17246
17247         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
17248         interface for generating code, simplifies the code.
17249
17250 2001-09-20  Ravi Pratap  <ravi@ximian.com>
17251
17252         * expression.cs (everywhere): Comment out return statements in ::Resolve
17253         methods to avoid the warnings.
17254
17255 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17256
17257         * driver.cs (parse): Report error 2001 if we can not open the
17258         source file.
17259
17260         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
17261         not resolve it.
17262
17263         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
17264         object. 
17265
17266         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
17267         otherwise nested blocks end up with the same index.
17268
17269         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
17270
17271         * expression.cs:  Instead of having FIXMEs in the Resolve
17272         functions, throw exceptions so it is obvious that we are facing a
17273         bug. 
17274
17275         * cs-parser.jay (invocation_expression): Pass Location information.
17276
17277         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
17278         Use a basename for those routines because .NET does not like paths
17279         on them. 
17280
17281         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
17282         already defined.
17283
17284 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
17285
17286         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
17287         are loading the correct data types (throws an exception if not).
17288         (TypeManager::InitCoreTypes): Use CoreLookupType
17289
17290         * expression.cs (Unary::ResolveOperator): return the child
17291         expression for expressions which are just +expr.
17292         (Unary::ResolveOperator): Return negative literals for -LITERAL
17293         expressions (otherwise they are Unary {Literal}).
17294         (Invocation::Badness): Take into account `Implicit constant
17295         expression conversions'.
17296
17297         * literal.cs (LongLiteral): Implement long literal class.
17298         (IntLiteral): export the `Value' of the intliteral. 
17299
17300 2001-09-19  Ravi Pratap  <ravi@ximian.com>
17301
17302         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
17303
17304         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
17305         instead of 'Operator'
17306
17307         * expression.cs (Binary::ResolveOperator): Update accordingly.
17308         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
17309         and 'Minus'
17310
17311         * cs-parser.jay (unary_expression): Update to use the new names.
17312
17313         * gen-treedump.cs (GetUnary): Same here.
17314
17315         * expression.cs (Unary::Resolve): Implement.
17316         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
17317         operators are found instead of making noise ;-)
17318         (Unary::ResolveOperator): New method to do precisely the same thing which
17319         Binary::ResolveOperator does for Binary expressions.
17320         (Unary.method, .Arguments): Add.
17321         (Unary::OperName): Implement.   
17322         (Unary::ForceConversion): Copy and Paste !
17323
17324         * class.cs (Operator::Define): Fix a small bug for the case when we have 
17325         a unary operator.
17326
17327         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
17328         for the inbuilt operators. Only overloading works for now ;-)
17329
17330 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
17331
17332         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
17333         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
17334
17335         * expression.cs (This::Emit): Implement. 
17336         (This::Resolve): Implement.
17337         (TypeOf:Resolve): Implement.
17338         (Expression::ResolveSimpleName): Add an implicit this to instance
17339         field references. 
17340         (MemberAccess::Resolve): Deal with Parameters and Fields. 
17341         Bind instance variable to Field expressions.
17342         (FieldExpr::Instance): New field used to track the expression that
17343         represents the object instance.
17344         (FieldExpr::Resolve): Track potential errors from MemberLookup not
17345         binding 
17346         (FieldExpr::Emit): Implement.
17347
17348         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
17349         the last instruction contains a return opcode to avoid generating
17350         the last `ret' instruction (this generates correct code, and it is
17351         nice to pass the peverify output).
17352
17353         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
17354         initializer for static and instance variables.
17355         (Constructor::Emit): Allow initializer to be null in the case of
17356         static constructors.  Only emit initializer for instance
17357         constructors. 
17358
17359         (TypeContainer::FindMembers): Return a null array if there are no
17360         matches.
17361
17362         Also fix the code for the MemberTypes.Method branch, as it was not
17363         scanning that for operators (or tried to access null variables before).
17364
17365         * assign.cs (Assign::Emit): Handle instance and static fields. 
17366
17367         * TODO: Updated.
17368
17369         * driver.cs: Stop compilation if there are parse errors.
17370
17371         * cs-parser.jay (constructor_declaration): Provide default base
17372         initializer for non-static constructors.
17373         (constructor_declarator): Do not provide a default base
17374         initializers if none was specified.
17375         Catch the fact that constructors should not have parameters.
17376
17377         * class.cs: Do not emit parent class initializers for static
17378         constructors, that should be flagged as an error.
17379
17380 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17381
17382         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
17383         Move back code into TypeContainer::Populate.
17384
17385 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17386
17387         * class.cs (TypeContainer::AddConstructor): Fix the check to
17388         compare against Name, not Basename. 
17389         (Operator::OpType): Change Plus and Minus to Add and Subtract.
17390
17391         * cs-parser.jay : Update accordingly.
17392
17393         * class.cs (TypeContainer::FindMembers): For the case where we are searching
17394         for methods, don't forget to look into the operators too.
17395         (RegisterMethodBuilder): Helper method to take care of this for
17396         methods, constructors and operators.
17397         (Operator::Define): Completely revamp.
17398         (Operator.OperatorMethod, MethodName): New fields.
17399         (TypeContainer::Populate): Move the registering of builders into
17400         RegisterMethodBuilder.
17401         (Operator::Emit): Re-write.
17402
17403         * expression.cs (Binary::Emit): Comment out code path to emit method
17404         invocation stuff for the case when we have a user defined operator. I am
17405         just not able to get it right !
17406
17407 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17408
17409         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
17410         argument. 
17411
17412         (Expression::MemberLookup): Provide a version that allows to
17413         specify the MemberTypes and BindingFlags. 
17414
17415         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
17416         so it was not fetching variable information from outer blocks.
17417
17418         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
17419         Beforefieldinit as it was buggy.
17420
17421         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
17422         that Ravi put here.  
17423
17424         * class.cs (Constructor::Emit): Only emit if block is not null.
17425         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
17426         deal with this by semantically definining it as if the user had
17427         done it.
17428
17429         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
17430         constructors as we now "emit" them at a higher level.
17431
17432         (TypeContainer::DefineDefaultConstructor): Used to define the
17433         default constructors if none was provided.
17434
17435         (ConstructorInitializer): Add methods Resolve and Emit. 
17436
17437         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
17438
17439 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17440
17441         * class.cs (TypeContainer::EmitDefaultConstructor): Register
17442         the default constructor builder with our hashtable for methodbuilders
17443         to methodcores.
17444
17445         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
17446         and argument_count is 0 in which case we have a match.
17447         (Binary::ResolveOperator): More null checking and miscellaneous coding
17448         style cleanup.
17449
17450 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17451
17452         * rootcontext.cs (IsNameSpace): Compare against null.
17453
17454         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
17455
17456         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
17457         and Unary::Operator.
17458
17459         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
17460         accordingly.
17461
17462         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
17463         we have overloaded operators.
17464         (Binary::ResolveOperator): Implement the part which does the operator overload
17465         resolution.
17466
17467         * class.cs (Operator::Emit): Implement.
17468         (TypeContainer::Emit): Emit the operators we have too.
17469
17470         * expression.cs (Binary::Emit): Update to emit the appropriate code for
17471         the case when we have a user-defined operator.
17472
17473 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17474
17475         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
17476
17477 2001-09-16  Ravi Pratap  <ravi@ximian.com>
17478
17479         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
17480         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
17481         (Constructor::Emit): Implement.
17482         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
17483         if we have no work to do. 
17484         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
17485         Emit method.
17486
17487         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
17488         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
17489
17490         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
17491         of parent.parent.
17492
17493 2001-09-15  Ravi Pratap  <ravi@ximian.com>
17494
17495         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
17496         in the source.
17497         (Tree::RecordNamespace): Method to do what the name says ;-)
17498         (Tree::Namespaces): Property to get at the namespaces hashtable.
17499
17500         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
17501         keep track.
17502
17503         * rootcontext.cs (IsNamespace): Fixed it :-)
17504
17505 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17506
17507         * class.cs (TypeContainer::FindMembers): Add support for
17508         constructors. 
17509         (MethodCore): New class that encapsulates both the shared aspects
17510         of a Constructor and a Method.  
17511         (Method, Constructor): Factored pieces into MethodCore.
17512
17513         * driver.cs: Added --fatal which makes errors throw exceptions.
17514         Load System assembly as well as part of the standard library.
17515
17516         * report.cs: Allow throwing exceptions on errors for debugging.
17517
17518         * modifiers.cs: Do not use `parent', instead use the real type
17519         container to evaluate permission settings.
17520
17521         * class.cs: Put Ravi's patch back in.  He is right, and we will
17522         have to cope with the
17523
17524 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17525
17526         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
17527         FamORAssem, not FamANDAssem.
17528
17529 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17530
17531         * driver.cs: Added --parse option that only parses its input files
17532         and terminates.
17533
17534         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
17535         incorrect.  IsTopLevel is not used to tell whether an object is
17536         root_types or not (that can be achieved by testing this ==
17537         root_types).  But to see if this is a top-level *class* (not
17538         necessarly our "toplevel" container). 
17539
17540 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17541
17542         * enum.cs (Enum::Define): Modify to call the Lookup method on the
17543         parent instead of a direct call to GetType.
17544
17545 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17546
17547         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
17548         Modifiers.TypeAttr. This should just be a call to that method.
17549
17550         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
17551         object so that we can determine if we are top-level or not.
17552
17553         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
17554         TypeContainer too.
17555
17556         * enum.cs (Enum::Define): Ditto.
17557
17558         * modifiers.cs (FieldAttr): Re-write.
17559
17560         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
17561         (TypeContainer::HaveStaticConstructor): New property to provide access
17562         to precisely that info.
17563
17564         * modifiers.cs (MethodAttr): Re-write.
17565         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
17566
17567         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
17568         of top-level types as claimed.
17569
17570 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17571
17572         * expression.cs (MemberLookup): Fruitless attempt to lookup
17573         constructors.  Maybe I need to emit default constructors?  That
17574         might be it (currently .NET emits this for me automatically).
17575         (Invocation::OverloadResolve): Cope with Arguments == null.
17576         (Invocation::EmitArguments): new function, shared by the new
17577         constructor and us.
17578         (Invocation::Emit): Handle static and instance methods.  Emit
17579         proper call instruction for virtual or non-virtual invocations.
17580         (New::Emit): Implement.
17581         (New::Resolve): Implement.
17582         (MemberAccess:Resolve): Implement.
17583         (MethodGroupExpr::InstanceExpression): used conforming to the spec
17584         to track instances.
17585         (FieldExpr::Resolve): Set type.
17586
17587         * support.cs: Handle empty arguments.
17588                 
17589         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
17590         SimpleLookup): Auxiliary routines to help parse a qualifier
17591         identifier.  
17592
17593         Update qualifier_identifier rule.
17594
17595         * codegen.cs: Removed debugging messages.
17596
17597         * class.cs: Make this a global thing, this acts just as a "key" to
17598         objects that we might have around.
17599
17600         (Populate): Only initialize method_builders_to_methods once.
17601
17602         * expression.cs (PropertyExpr): Initialize type from the
17603         PropertyType. 
17604
17605         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
17606         Resolve pattern.  Attempt to implicitly convert value to boolean.
17607         Emit code.
17608
17609         * expression.cs: Set the type for the int32/int32 argument case.
17610         (Binary::ResolveOperator): Set the return type to boolean for
17611         comparission operators
17612
17613         * typemanager.cs: Remove debugging print code.
17614
17615         (Invocation::Resolve): resolve type.
17616
17617         * class.cs: Allocate a MemberInfo of the correct size, as the code
17618         elsewhere depends on the test to reflect the correct contents.
17619
17620         (Method::) Keep track of parameters, due to System.Reflection holes
17621
17622         (TypeContainer::Populate): Keep track of MethodBuilders to Method
17623         mapping here.
17624
17625         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17626         of the exact size and return that.
17627
17628         (Class::LookupMethodByBuilder): New function that maps
17629         MethodBuilders to its methods.  Required to locate the information
17630         on methods because System.Reflection bit us again.
17631
17632         * support.cs: New file, contains an interface ParameterData and
17633         two implementations: ReflectionParameters and InternalParameters
17634         used to access Parameter information.  We will need to grow this
17635         as required.
17636
17637         * expression.cs (Invocation::GetParameterData): implement a cache
17638         and a wrapper around the ParameterData creation for methods. 
17639         (Invocation::OverloadResolve): Use new code.
17640
17641 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17642
17643         * class.cs (TypeContainer::EmitField): Remove and move into 
17644         (Field::Define): here and modify accordingly.
17645         (Field.FieldBuilder): New member.
17646         (TypeContainer::Populate): Update accordingly.
17647         (TypeContainer::FindMembers): Implement.
17648
17649 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17650
17651         * statement.cs: (VariableInfo::VariableType): New field to be
17652         initialized with the full type once it is resolved. 
17653
17654 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17655
17656         * parameter.cs (GetParameterInfo): Use a type cache to compute
17657         things only once, and to reuse this information
17658
17659         * expression.cs (LocalVariableReference::Emit): Implement.
17660         (OpcodeCast::Emit): fix.
17661
17662         (ParameterReference::Resolve): Implement.
17663         (ParameterReference::Emit): Implement.
17664
17665         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17666         that are expressions need to stay as Expressions.
17667
17668         * typemanager.cs (CSharpName): Returns the C# name of a type if
17669         possible. 
17670
17671         * expression.cs (Expression::ConvertImplicit): New function that
17672         implements implicit type conversions.
17673
17674         (Expression::ImplicitReferenceConversion): Implements implicit
17675         reference conversions.
17676
17677         (EmptyCast): New type for transparent casts.
17678
17679         (OpcodeCast): New type for casts of types that are performed with
17680         a sequence of bytecodes.
17681
17682         (BoxedCast): New type used for casting value types into reference
17683         types.  Emits a box opcode.
17684
17685         (Binary::DoNumericPromotions): Implements numeric promotions of
17686         and computation of the Binary::Type.
17687
17688         (Binary::EmitBranchable): Optimization.
17689
17690         (Binary::Emit): Implement code emission for expressions.
17691
17692         * typemanager.cs (TypeManager): Added two new core types: sbyte
17693         and byte.
17694
17695 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17696
17697         * class.cs (TypeContainer::FindMembers): Method which does exactly
17698         what Type.FindMembers does, only we don't have to use reflection. No
17699         implementation yet.
17700
17701         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17702         typecontainer objects as we need to get at them.
17703         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17704
17705         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17706         typecontainer object.
17707
17708         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17709         of just a Report object.
17710
17711 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17712
17713         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17714         "remove_"
17715         (TypeContainer::Populate): Now define the delegates of the type too.
17716         (TypeContainer.Delegates): Property to access the list of delegates defined
17717         in the type.
17718
17719         * delegates.cs (Delegate::Define): Implement partially.
17720
17721         * modifiers.cs (TypeAttr): Handle more flags.
17722
17723 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17724
17725         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17726         and not <=
17727         (Operator::Define): Re-write logic to get types by using the LookupType method
17728         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17729         (Indexer::Define): Ditto.
17730         (Event::Define): Ditto.
17731         (Property::Define): Ditto.
17732
17733 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17734
17735         * class.cs (TypeContainer::Populate): Now define operators too. 
17736         (TypeContainer.Operators): New property to access the list of operators
17737         in a type.
17738         (Operator.OperatorMethodBuilder): New member to hold the method builder
17739         for the operator we are defining.
17740         (Operator::Define): Implement.
17741
17742 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17743
17744         * class.cs (Event::Define): Make the prefixes of the accessor methods
17745         addOn_ and removeOn_ 
17746
17747         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17748         of the location being passed in too. Ideally, this should go later since all
17749         error reporting should be done through the Report object.
17750
17751         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17752         (Populate): Iterate thru the indexers we have and define them too.
17753         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17754         for the get and set accessors.
17755         (Indexer::Define): Implement.
17756
17757 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17758
17759         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17760         my previous implementation, did not work.
17761
17762         * typemanager.cs: Add a couple of missing types (the longs).
17763
17764         * literal.cs: Use TypeManager.bool_type instead of getting it.
17765
17766         * expression.cs (EventExpr): New kind of expressions.
17767         (Expressio::ExprClassFromMemberInfo): finish
17768
17769 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17770
17771         * assign.cs: Emit stores to static fields differently.
17772
17773 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17774
17775         * Merge in changes and adjust code to tackle conflicts. Backed out my
17776         code in Assign::Resolve ;-) 
17777
17778 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17779
17780         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17781         instead Report.Error and also pass in the location.
17782         (CSharpParser::Lexer): New readonly property to return the reference
17783         to the Tokenizer object.
17784         (declare_local_variables): Use Report.Error with location instead of plain 
17785         old error.
17786         (CheckDef): Ditto.
17787
17788         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17789         (Operator.CheckBinaryOperator): Ditto.
17790
17791         * cs-parser.jay (operator_declarator): Update accordingly.
17792
17793         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17794         (CheckBinaryOperator): Same here.
17795
17796         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17797         on the name without any prefixes of namespace names etc. This is because we
17798         already might have something already fully qualified like 
17799         'System.Console.WriteLine'
17800
17801         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17802
17803 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17804
17805         * cs-tokenizer.cs (location): Return a string which also contains
17806         the file name.
17807
17808         * expression.cs (ElementAccess): New class for expressions of the
17809         type 'element access.'
17810         (BaseAccess): New class for expressions of the type 'base access.'
17811         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17812         respectively.
17813
17814         * cs-parser.jay (element_access): Implement action.
17815         (base_access): Implement actions.
17816         (checked_expression, unchecked_expression): Implement.
17817
17818         * cs-parser.jay (local_variable_type): Correct and implement.
17819         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17820
17821         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17822
17823         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17824         name and the specifiers.
17825
17826         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17827
17828         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17829         making them all public ;-)
17830
17831         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17832         class anyways.
17833
17834 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17835
17836         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17837         PropertyExprs.
17838         (FieldExpr, PropertyExprs): New resolved expressions.
17839         (SimpleName::MemberStaticCheck): Perform static checks for access
17840         to non-static fields on static methods. Maybe this should be
17841         generalized for MemberAccesses. 
17842         (SimpleName::ResolveSimpleName): More work on simple name
17843         resolution. 
17844
17845         * cs-parser.jay (primary_expression/qualified_identifier): track
17846         the parameter index.
17847
17848         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17849         (EmitContext::EmitBoolExpression): Chain to expression generation
17850         instead of temporary hack.
17851         (::EmitStatementExpression): Put generic expression code generation.
17852
17853         * assign.cs (Assign::Emit): Implement variable assignments to
17854         local variables, parameters and fields.
17855
17856 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17857
17858         * statement.cs (Block::GetVariableInfo): New method, returns the
17859         VariableInfo for a variable name in a block.
17860         (Block::GetVariableType): Implement in terms of GetVariableInfo
17861
17862         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17863         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17864
17865 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17866
17867         * cs-parser.jay (operator_declaration): Continue on my quest : update
17868         to take attributes argument.
17869         (event_declaration): Ditto.
17870         (enum_declaration): Ditto.
17871         (indexer_declaration): Ditto.
17872
17873         * class.cs (Operator::Operator): Update constructor accordingly.
17874         (Event::Event): Ditto.
17875
17876         * delegate.cs (Delegate::Delegate): Same here.
17877
17878         * enum.cs (Enum::Enum): Same here.
17879
17880 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17881
17882         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17883
17884         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17885
17886         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17887         being passed around as an arraylist.
17888         (Attributes::AddAttribute): Method to add attribute sections.
17889
17890         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17891         (struct_declaration): Update accordingly.
17892         (constant_declaration): Update.
17893         (field_declaration): Update.
17894         (method_header): Update.
17895         (fixed_parameter): Update.
17896         (parameter_array): Ditto.
17897         (property_declaration): Ditto.
17898         (destructor_declaration): Ditto.
17899
17900         * class.cs (Struct::Struct): Update constructors accordingly.
17901         (Class::Class): Ditto.
17902         (Field::Field): Ditto.
17903         (Method::Method): Ditto.
17904         (Property::Property): Ditto.
17905         (TypeContainer::OptAttribute): update property's return type.
17906
17907         * interface.cs (Interface.opt_attributes): New member.
17908         (Interface::Interface): Update to take the extra Attributes argument.
17909
17910         * parameter.cs (Parameter::Parameter): Ditto.
17911
17912         * constant.cs (Constant::Constant): Ditto.
17913
17914         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17915         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17916         the attributes as a parameter.
17917         (InterfaceProperty): Update constructor call.
17918         (InterfaceEvent): Ditto.
17919         (InterfaceMethod): Ditto.
17920         (InterfaceIndexer): Ditto.
17921
17922         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17923         pass the attributes too.
17924         (interface_event_declaration): Ditto.
17925         (interface_property_declaration): Ditto.
17926         (interface_method_declaration): Ditto.
17927         (interface_declaration): Ditto.
17928
17929 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17930
17931         * class.cs (Method::Define): Track the "static Main" definition to
17932         create an entry point. 
17933
17934         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17935         EntryPoint if we find it. 
17936
17937         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17938         (EmitContext::ig): Make this variable public.
17939
17940         * driver.cs: Make the default output file be the first file name
17941         with the .exe extension.  
17942
17943         Detect empty compilations
17944
17945         Handle various kinds of output targets.  Handle --target and
17946         rename -t to --dumper.
17947
17948         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17949         methods inherited from Expression return now an Expression.  This
17950         will is used during the tree rewriting as we resolve them during
17951         semantic analysis.
17952
17953         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17954         the spec.  Missing entirely is the information about
17955         accessability of elements of it.
17956
17957         (Expression::ExprClassFromMemberInfo): New constructor for
17958         Expressions that creates a fully initialized Expression based on
17959         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17960         a Type.
17961
17962         (Invocation::Resolve): Begin implementing resolution of invocations.
17963
17964         * literal.cs (StringLiteral):  Implement Emit.
17965
17966 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17967
17968         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17969         member.
17970
17971 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17972
17973         * cs-parser.jay (attribute_arguments): Implement actions.
17974         (attribute): Fix bug in production. Implement action.
17975         (attribute_list): Implement.
17976         (attribute_target): Implement.
17977         (attribute_target_specifier, opt_target_specifier): Implement
17978         (CheckAttributeTarget): New method to check if the attribute target
17979         is valid.
17980         (attribute_section): Implement.
17981         (opt_attributes): Implement.
17982
17983         * attribute.cs : New file to handle attributes.
17984         (Attribute): Class to hold attribute info.
17985
17986         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17987         (attribute_section): Modify production to use 2 different rules to 
17988         achieve the same thing. 1 s/r conflict down !
17989         Clean out commented, useless, non-reducing dimension_separator rules.
17990
17991         * class.cs (TypeContainer.attributes): New member to hold list
17992         of attributes for a type.
17993         (Struct::Struct): Modify to take one more argument, the attribute list.
17994         (Class::Class): Ditto.
17995         (Field::Field): Ditto.
17996         (Method::Method): Ditto.
17997         (Property::Property): Ditto.
17998
17999         * cs-parser.jay (struct_declaration): Update constructor call to
18000         pass in the attributes too.
18001         (class_declaration): Ditto.
18002         (constant_declaration): Ditto.
18003         (field_declaration): Ditto.
18004         (method_header): Ditto.
18005         (fixed_parameter): Ditto.
18006         (parameter_array): Ditto.
18007         (property_declaration): Ditto.
18008
18009         * constant.cs (Constant::Constant): Update constructor similarly.
18010         Use System.Collections.
18011
18012         * parameter.cs (Parameter::Parameter): Update as above.
18013
18014 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18015
18016         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
18017         (TypeContainer.delegates): New member to hold list of delegates.
18018
18019         * cs-parser.jay (delegate_declaration): Implement the action correctly 
18020         this time as I seem to be on crack ;-)
18021
18022 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
18023
18024         * rootcontext.cs (RootContext::IsNamespace): new function, used to
18025         tell whether an identifier represents a namespace.
18026
18027         * expression.cs (NamespaceExpr): A namespace expression, used only
18028         temporarly during expression resolution.
18029         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
18030         utility functions to resolve names on expressions.
18031
18032 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
18033
18034         * codegen.cs: Add hook for StatementExpressions. 
18035
18036         * class.cs: Fix inverted test for static flag in methods.
18037
18038 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18039
18040         * class.cs (Operator::CheckUnaryOperator): Correct error number used
18041         to make it coincide with MS' number.
18042         (Operator::CheckBinaryOperator): Ditto.
18043
18044         * ../errors/errors.txt : Remove error numbers added earlier.
18045
18046         * ../errors/cs1019.cs : Test case for error # 1019
18047
18048         * ../errros/cs1020.cs : Test case for error # 1020
18049
18050         * cs-parser.jay : Clean out commented cruft.
18051         (dimension_separators, dimension_separator): Comment out. Ostensibly not
18052         used anywhere - non-reducing rule.
18053         (namespace_declarations): Non-reducing rule - comment out.
18054
18055         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
18056         with TypeContainer::AddEnum.
18057
18058         * delegate.cs : New file for delegate handling classes.
18059         (Delegate): Class for declaring delegates.
18060
18061         * makefile : Update.
18062
18063         * cs-parser.jay (delegate_declaration): Implement.
18064
18065 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
18066
18067         * class.cs (Event::Define): Implement.
18068         (Event.EventBuilder): New member.
18069
18070         * class.cs (TypeContainer::Populate): Update to define all enums and events
18071         we have.
18072         (Events): New property for the events arraylist we hold. Shouldn't we move to using
18073         readonly fields for all these cases ?
18074
18075 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
18076
18077         * class.cs (Property): Revamp to use the convention of making fields readonly.
18078         Accordingly modify code elsewhere.
18079
18080         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
18081         the Define method of the Property class.
18082
18083         * class.cs : Clean up applied patch and update references to variables etc. Fix 
18084         trivial bug.
18085         (TypeContainer::Populate): Update to define all the properties we have. Also
18086         define all enumerations.
18087
18088         * enum.cs (Define): Implement.
18089
18090 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
18091
18092         * cs-parser.jay (overloadable_operator): The semantic value is an
18093         enum of the Operator class.
18094         (operator_declarator): Implement actions.
18095         (operator_declaration): Implement.
18096
18097         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
18098         validity of definitions.
18099         (Operator::CheckBinaryOperator): Static method to check for binary operators
18100         (TypeContainer::AddOperator): New method to add an operator to a type.
18101
18102         * cs-parser.jay (indexer_declaration): Added line to actually call the
18103         AddIndexer method so it gets added ;-)
18104
18105         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
18106         already taken care of by the MS compiler ?  
18107
18108 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18109
18110         * class.cs (Operator): New class for operator declarations.
18111         (Operator::OpType): Enum for the various operators.
18112
18113 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18114
18115         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
18116         ostensibly handle this in semantic analysis.
18117
18118         * cs-parser.jay (general_catch_clause): Comment out
18119         (specific_catch_clauses, specific_catch_clause): Ditto.
18120         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
18121         (catch_args, opt_catch_args): New productions.
18122         (catch_clause): Rewrite to use the new productions above
18123         (catch_clauses): Modify accordingly.
18124         (opt_catch_clauses): New production to use in try_statement
18125         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
18126         and re-write the code in the actions to extract the specific and
18127         general catch clauses by being a little smart ;-)
18128
18129         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
18130         Hooray, try and catch statements parse fine !
18131
18132 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18133
18134         * statement.cs (Block::GetVariableType): Fix logic to extract the type
18135         string from the hashtable of variables.
18136
18137         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
18138         I end up making that mistake ;-)
18139         (catch_clauses): Fixed gross error which made Key and Value of the 
18140         DictionaryEntry the same : $1 !!
18141
18142 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18143
18144         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
18145
18146         * cs-parser.jay (event_declaration): Correct to remove the semicolon
18147         when the add and remove accessors are specified. 
18148
18149 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18150
18151         * cs-parser.jay (IndexerDeclaration): New helper class to hold
18152         information about indexer_declarator.
18153         (indexer_declarator): Implement actions.
18154         (parsing_indexer): New local boolean used to keep track of whether
18155         we are parsing indexers or properties. This is necessary because 
18156         implicit_parameters come into picture even for the get accessor in the 
18157         case of an indexer.
18158         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
18159
18160         * class.cs (Indexer): New class for indexer declarations.
18161         (TypeContainer::AddIndexer): New method to add an indexer to a type.
18162         (TypeContainer::indexers): New member to hold list of indexers for the
18163         type.
18164
18165 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18166
18167         * cs-parser.jay (add_accessor_declaration): Implement action.
18168         (remove_accessor_declaration): Implement action.
18169         (event_accessors_declaration): Implement
18170         (variable_declarators): swap statements for first rule - trivial.
18171
18172         * class.cs (Event): New class to hold information about event
18173         declarations.
18174         (TypeContainer::AddEvent): New method to add an event to a type
18175         (TypeContainer::events): New member to hold list of events.
18176
18177         * cs-parser.jay (event_declaration): Implement actions.
18178
18179 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18180
18181         * cs-parser.jay (dim_separators): Implement. Make it a string
18182         concatenating all the commas together, just as they appear.
18183         (opt_dim_separators): Modify accordingly
18184         (rank_specifiers): Update accordingly. Basically do the same
18185         thing - instead, collect the brackets here.
18186         (opt_rank_sepcifiers): Modify accordingly.
18187         (array_type): Modify to actually return the complete type string
18188         instead of ignoring the rank_specifiers.
18189         (expression_list): Implement to collect the expressions
18190         (variable_initializer): Implement. We make it a list of expressions
18191         essentially so that we can handle the array_initializer case neatly too.
18192         (variable_initializer_list): Implement.
18193         (array_initializer): Make it a list of variable_initializers
18194         (opt_array_initializer): Modify accordingly.
18195
18196         * expression.cs (New::NType): Add enumeration to help us
18197         keep track of whether we have an object/delegate creation
18198         or an array creation.
18199         (New:NewType, New::Rank, New::Indices, New::Initializers): New
18200         members to hold data about array creation.
18201         (New:New): Modify to update NewType
18202         (New:New): New Overloaded contructor for the array creation
18203         case.
18204
18205         * cs-parser.jay (array_creation_expression): Implement to call
18206         the overloaded New constructor.
18207
18208 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
18209
18210         * class.cs (TypeContainer::Constructors): Return member
18211         constructors instead of returning null.
18212
18213 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
18214
18215         * typemanager.cs (InitCoreTypes): Initialize the various core
18216         types after we have populated the type manager with the user
18217         defined types (this distinction will be important later while
18218         compiling corlib.dll)
18219
18220         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
18221         on Expression Classification.  Now all expressions have a method
18222         `Resolve' and a method `Emit'.
18223
18224         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
18225         generation from working.     Also add some temporary debugging
18226         code. 
18227
18228 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
18229
18230         * codegen.cs: Lots of code generation pieces.  This is only the
18231         beginning, will continue tomorrow with more touches of polish.  We
18232         handle the fundamentals of if, while, do, for, return.  Others are
18233         trickier and I need to start working on invocations soon.
18234
18235         * gen-treedump.cs: Bug fix, use s.Increment here instead of
18236         s.InitStatement. 
18237
18238         * codegen.cs (EmitContext): New struct, used during code
18239         emission to keep a context.   Most of the code generation will be
18240         here. 
18241
18242         * cs-parser.jay: Add embedded blocks to the list of statements of
18243         this block.  So code generation proceeds in a top down fashion.
18244
18245 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
18246
18247         * statement.cs: Add support for multiple child blocks.
18248
18249 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
18250
18251         * codegen.cs (EmitCode): New function, will emit the code for a
18252         Block of code given a TypeContainer and its ILGenerator. 
18253
18254         * statement.cs (Block): Standard public readonly optimization.
18255         (Block::Block constructors): Link children. 
18256         (Block::Child): Child Linker.
18257         (Block::EmitVariables): Emits IL variable declarations.
18258
18259         * class.cs: Drop support for MethodGroups here, delay until
18260         Semantic Analysis.
18261         (Method::): Applied the same simplification that I did before, and
18262         move from Properties to public readonly fields.
18263         (Method::ParameterTypes): Returns the parameter types for the
18264         function, and implements a cache that will be useful later when I
18265         do error checking and the semantic analysis on the methods is
18266         performed.
18267         (Constructor::GetCallingConvention): Renamed from CallingConvetion
18268         and made a method, optional argument tells whether this is a class
18269         or a structure to apply the `has-this' bit.
18270         (Method::GetCallingConvention): Implement, returns the calling
18271         convention. 
18272         (Method::Define): Defines the type, a second pass is performed
18273         later to populate the methods.
18274
18275         (Constructor::ParameterTypes): implement a cache similar to the
18276         one on Method::ParameterTypes, useful later when we do semantic
18277         analysis. 
18278
18279         (TypeContainer::EmitMethod):  New method.  Emits methods.
18280
18281         * expression.cs: Removed MethodGroup class from here.
18282
18283         * parameter.cs (Parameters::GetCallingConvention): new method.
18284
18285 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
18286
18287         * class.cs (TypeContainer::Populate): Drop RootContext from the
18288         argument. 
18289
18290         (Constructor::CallingConvention): Returns the calling convention.
18291         (Constructor::ParameterTypes): Returns the constructor parameter
18292         types. 
18293
18294         (TypeContainer::AddConstructor): Keep track of default constructor
18295         and the default static constructor.
18296
18297         (Constructor::) Another class that starts using `public readonly'
18298         instead of properties. 
18299
18300         (Constructor::IsDefault): Whether this is a default constructor. 
18301
18302         (Field::) use readonly public fields instead of properties also.
18303
18304         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
18305         track of static constructors;  If none is used, turn on
18306         BeforeFieldInit in the TypeAttributes. 
18307
18308         * cs-parser.jay (opt_argument_list): now the return can be null
18309         for the cases where there are no arguments. 
18310
18311         (constructor_declarator): If there is no implicit `base' or
18312         `this', then invoke the default parent constructor. 
18313
18314         * modifiers.cs (MethodAttr): New static function maps a set of
18315         modifiers flags into a MethodAttributes enum
18316         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
18317         MethodAttr, TypeAttr to represent the various mappings where the
18318         modifiers are used.
18319         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
18320
18321 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
18322
18323         * parameter.cs (GetParameterInfo): Fix bug where there would be no
18324         method arguments.
18325
18326         * interface.cs (PopulateIndexer): Implemented the code generator
18327         for interface indexers.
18328
18329 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
18330
18331         * interface.cs (InterfaceMemberBase): Now we track the new status
18332         here.  
18333
18334         (PopulateProperty): Implement property population.  Woohoo!  Got
18335         Methods and Properties going today. 
18336
18337         Removed all the properties for interfaces, and replaced them with
18338         `public readonly' fields. 
18339
18340 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
18341
18342         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
18343         initialize their hashtables/arraylists only when they are needed
18344         instead of doing this always.
18345
18346         * parameter.cs: Handle refs and out parameters.
18347
18348         * cs-parser.jay: Use an ArrayList to construct the arguments
18349         instead of the ParameterCollection, and then cast that to a
18350         Parameter[] array.
18351
18352         * parameter.cs: Drop the use of ParameterCollection and use
18353         instead arrays of Parameters.
18354
18355         (GetParameterInfo): Use the Type, not the Name when resolving
18356         types. 
18357
18358 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
18359
18360         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
18361         and instead use public readonly fields.
18362
18363         * class.cs: Put back walking code for type containers.
18364
18365 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
18366
18367         * class.cs (MakeConstant): Code to define constants.
18368
18369         * rootcontext.cs (LookupType): New function.  Used to locate types 
18370
18371
18372 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
18373
18374         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
18375         this System.Reflection code is.  Kudos to Microsoft
18376
18377         * typemanager.cs: Implement a type cache and avoid loading all
18378         types at boot time.  Wrap in LookupType the internals.  This made
18379         the compiler so much faster.  Wow.  I rule!
18380
18381         * driver.cs: Make sure we always load mscorlib first (for
18382         debugging purposes, nothing really important).
18383
18384         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
18385         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
18386
18387         * rootcontext.cs: Lookup types on their namespace;  Lookup types
18388         on namespaces that have been imported using the `using' keyword.
18389
18390         * class.cs (TypeContainer::TypeAttr): Virtualize.
18391         (Class::TypeAttr): Return attributes suitable for this bad boy.
18392         (Struct::TypeAttr): ditto.
18393         Handle nested classes.
18394         (TypeContainer::) Remove all the type visiting code, it is now
18395         replaced with the rootcontext.cs code
18396
18397         * rootcontext.cs (GetClassBases): Added support for structs. 
18398
18399 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
18400
18401         * interface.cs, statement.cs, class.cs, parameter.cs,
18402         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
18403         Drop use of TypeRefs, and use strings instead.
18404
18405 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
18406
18407         * rootcontext.cs: 
18408
18409         * class.cs (Struct::Struct): set the SEALED flags after
18410         checking the modifiers.
18411         (TypeContainer::TypeAttr): new property, returns the
18412         TypeAttributes for a class.  
18413
18414         * cs-parser.jay (type_list): Oops, list production was creating a
18415         new list of base types.
18416
18417         * rootcontext.cs (StdLib): New property.
18418         (GetInterfaceTypeByName): returns an interface by type name, and
18419         encapsulates error handling here.
18420         (GetInterfaces): simplified.
18421         (ResolveTree): Encapsulated all the tree resolution here.
18422         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
18423         types. 
18424
18425         * driver.cs: Add support for --nostdlib, to avoid loading the
18426         default assemblies.
18427         (Main): Do not put tree resolution here. 
18428
18429         * rootcontext.cs: Beginning of the class resolution.
18430
18431 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
18432
18433         * rootcontext.cs: Provide better error reporting. 
18434
18435         * cs-parser.jay (interface_base): set our $$ to be interfaces.
18436
18437         * rootcontext.cs (CreateInterface): Handle the case where there
18438         are no parent interfaces.
18439
18440         (CloseTypes): Routine to flush types at the end.
18441         (CreateInterface): Track types.
18442         (GetInterfaces): Returns an array of Types from the list of
18443         defined interfaces.
18444
18445         * typemanager.c (AddUserType): Mechanism to track user types (puts
18446         the type on the global type hash, and allows us to close it at the
18447         end). 
18448
18449 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
18450
18451         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
18452         RecordInterface instead.
18453
18454         * cs-parser.jay: Updated to reflect changes above.
18455
18456         * decl.cs (Definition): Keep track of the TypeBuilder type that
18457         represents this type here.  Not sure we will use it in the long
18458         run, but wont hurt for now.
18459
18460         * driver.cs: Smaller changes to accomodate the new code.
18461
18462         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
18463         when done. 
18464
18465         * rootcontext.cs (CreateInterface):  New method, used to create
18466         the System.TypeBuilder type for interfaces.
18467         (ResolveInterfaces): new entry point to resolve the interface
18468         hierarchy. 
18469         (CodeGen): Property, used to keep track of the code generator.
18470
18471 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
18472
18473         * cs-parser.jay: Add a second production for delegate_declaration
18474         with `VOID'.
18475
18476         (enum_body): Put an opt_comma here instead of putting it on
18477         enum_body or enum_member_declarations so we can handle trailing
18478         commas on enumeration members.  Gets rid of a shift/reduce.
18479
18480         (type_list): Need a COMMA in the middle.
18481
18482         (indexer_declaration): Tell tokenizer to recognize get/set
18483
18484         * Remove old targets.
18485
18486         * Re-add the parser target.
18487
18488 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18489
18490         * cs-parser.jay: Add precendence rules for a number of operators
18491         ot reduce the number of shift/reduce conflicts in the grammar.
18492
18493 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
18494
18495         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
18496         and put it here.
18497
18498         Get rid of old crufty code.
18499
18500         * rootcontext.cs: Use this to keep track of the parsed
18501         representation and the defined types available to the program. 
18502
18503         * gen-treedump.cs: adjust for new convention.
18504
18505         * type.cs: Split out the type manager, and the assembly builder
18506         from here. 
18507
18508         * typemanager.cs: the type manager will live here now.
18509
18510         * cil-codegen.cs: And the code generator here. 
18511
18512 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
18513
18514         * makefile: Fixed up for easy making.
18515
18516 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18517
18518         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
18519         the 
18520
18521         (unary_expression): Expand pre_increment_expression and
18522         post_decrement_expression to reduce a shift/reduce.
18523
18524 2001-07-11  Simon Cozens
18525
18526         * cs-tokenizer.cs: Hex numbers should begin with a 0.
18527
18528         Improve allow_keyword_as_indent name.
18529
18530 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
18531
18532         * Adjustments for Beta2. 
18533
18534 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
18535
18536         * decl.cs: Added `Define' abstract method.
18537         (InTransit): new property, used to catch recursive definitions. 
18538
18539         * interface.cs: Implement `Define'. 
18540
18541         * modifiers.cs: Map Modifiers.constants to
18542         System.Reflection.TypeAttribute flags.
18543
18544         * class.cs: Keep track of types and user-defined types.
18545         (BuilderInit): New method for creating an assembly
18546         (ResolveType): New function to launch the resolution process, only
18547         used by interfaces for now.
18548
18549         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
18550         that are inserted into the name space. 
18551
18552 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
18553
18554         * ARGH.  I have screwed up my tree so many times due to the use of
18555         rsync rather than using CVS.  Going to fix this at once. 
18556
18557         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
18558         load types.
18559
18560 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
18561
18562         * Experiment successful: Use System.Type rather that our own
18563         version of Type.  
18564
18565 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
18566
18567         * cs-parser.jay: Removed nsAliases from here.
18568
18569         Use new namespaces, handle `using XXX;' 
18570
18571         * namespace.cs: Reimplemented namespace handling, use a recursive
18572         definition of the class.  Now we can keep track of using clauses
18573         and catch invalid using clauses.
18574
18575 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
18576
18577         * gen-treedump.cs: Adapted for all the renaming.
18578
18579         * expression.cs (Expression): this class now has a Type property
18580         which returns an expression Type.
18581
18582         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
18583         `Type', as this has a different meaning now in the base
18584
18585 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
18586
18587         * interface.cs, class.cs: Removed from all the sources the
18588         references to signature computation, as we can not do method
18589         signature computation during the parsing time, as we are not
18590         trying to solve at that point distinguishing:
18591
18592         class X {
18593                 void a (Blah x) {}
18594                 void a (NS.Blah x) {}
18595         }
18596
18597         Which depending on the context might be valid or not, as we do not
18598         know if Blah is the same thing as NS.Blah at that point.
18599
18600         * Redid everything so the code uses TypeRefs now instead of
18601         Types.  TypeRefs are just temporary type placeholders, that need
18602         to be resolved.  They initially have a pointer to a string and the
18603         current scope in which they are used.  This is used later by the
18604         compiler to resolve the reference to an actual Type. 
18605
18606         * DeclSpace is no longer a CIR.Type, and neither are
18607         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
18608         are all DeclSpaces, but no Types. 
18609
18610         * type.cs (TypeRefManager): This implements the TypeRef manager,
18611         which keeps track of all the types that need to be resolved after
18612         the parsing has finished. 
18613
18614 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
18615
18616         * ARGH.  We are going to have to store `foreach' as a class rather
18617         than resolving it, as we need to verify error 1579 after name
18618         resolution.   *OR* we could keep a flag that says `This request to
18619         IEnumerator comes from a foreach statement' which we can then use
18620         to generate the error.
18621
18622 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
18623
18624         * class.cs (TypeContainer.AddMethod): we now add methods to the
18625         MethodGroup instead of the method hashtable.  
18626
18627         * expression.cs: Add MethodGroup abstraction, which gets us one
18628         step closer to the specification in the way we handle method
18629         declarations.  
18630
18631         * cs-parser.jay (primary_expression): qualified_identifier now
18632         tried to match up an identifier to a local variable reference or
18633         to a parameter reference.
18634
18635         current_local_parameters is now a parser global variable that
18636         points to the current parameters for the block, used during name
18637         lookup.
18638
18639         (property_declaration): Now creates an implicit `value' argument to
18640         the set accessor.
18641
18642 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18643
18644         * parameter.cs: Do not use `param' arguments as part of the
18645         signature, per the spec.
18646
18647 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18648
18649         * decl.cs: Base class for classes, structs and interfaces.  This
18650         is the "Declaration Space" 
18651
18652         * cs-parser.jay: Use CheckDef for checking declaration errors
18653         instead of having one on each function.
18654
18655         * class.cs: Factor out some code for handling error handling in
18656         accordance to the "Declarations" section in the "Basic Concepts"
18657         chapter in the ECMA C# spec.
18658
18659         * interface.cs: Make all interface member classes derive from
18660         InterfaceMemberBase.
18661
18662 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18663
18664         * Many things: all interfaces are parsed and generated in
18665         gen-treedump.  Support for member variables, constructors,
18666         destructors, properties, constants is there.
18667
18668         Beginning of the IL backend, but very little done, just there for
18669         testing purposes. 
18670
18671 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18672
18673         * cs-parser.jay: Fix labeled statement.
18674
18675         * cs-tokenizer.cs (escape): Escape " and ' always.
18676         ref_line, ref_name: keep track of the line/filename as instructed
18677         by #line by the compiler.
18678         Parse #line.
18679
18680 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18681
18682         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18683         to match the values in System.CodeDOM.
18684
18685         Divid renamed to Divide.
18686
18687         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18688         statements. 
18689         (Statements.set): remove.
18690
18691         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18692         statements. 
18693
18694         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18695         falseStatements always have valid values. 
18696
18697         * cs-parser.jay: Use System.CodeDOM now.
18698