**** Merged from MCS ****
[mono.git] / mcs / gmcs / ChangeLog
1 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
2
3         * driver.cs: Add -pkg handling.
4
5         From Gonzalo: UseShelLExecute=false
6
7 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
8
9         * attribute.cs:
10         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
11         for attribute.
12         (Attribute.IsClsCompliaceRequired): Moved to base for better
13         accesibility.
14         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
15         when attribute is AttributeUsageAttribute.
16         (Attribute.GetValidTargets): Simplified.
17         (Attribute.GetAttributeUsage): New method returns AttributeUsage
18         attribute for this type.
19         (Attribute.ApplyAttributes): Method renamed to Emit and make
20         non-static.
21         (GlobalAttributeSection): New class for special handling of global
22         attributes (assembly, module).
23         (AttributeSection.Emit): New method.
24
25         * class.cs: Implemented Attributable abstract methods.
26         (MethodCore.LabelParameters): Moved to Parameter class.
27         (Accessor): Is back simple class.
28         (PropertyMethod): Implemented Attributable abstract class.
29         (DelegateMethod): Implemented Attributable abstract class.
30         (Event): New constructor for disctintion between normal Event
31         and Event with accessors.
32
33         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
34
35         * codegen.cs, const.cs, decl.cs, delegate.cs:
36         (CommonAssemblyModulClass): Implemented Attributable abstract class
37         and simplified.
38
39         * enum.cs: Implement IAttributeSupport interface.
40         (EnumMember): New class for emum members. Implemented Attributable
41         abstract class
42
43         * parameter.cs:
44         (ParameterBase): Is abstract.
45         (ReturnParameter): New class for easier [return:] attribute handling.
46
47         * typemanager.cs: Removed builder_to_attr.
48
49 2004-05-11  Raja R Harinath  <rharinath@novell.com>
50
51         Fix bug #57151.
52         * attribute.cs (Attribute.GetPositionalValue): New function.
53         * class.cs (TypeContainer.VerifyMembers): New function.
54         (TypeContainer.Emit): Use it.
55         (ClassOrStruct): New base class for Class and Struct.
56         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
57         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
58         class.
59         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
60         then each non-static field should have a FieldOffset attribute.
61         Otherwise, none of the fields should have a FieldOffset attribute.
62         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
63         and FieldOffset attributes.
64         * typemanager.cs (TypeManager.struct_layout_attribute_type)
65         (TypeManager.field_offset_attribute_type): New core types.
66         (TypeManager.InitCoreTypes): Initialize them.
67
68 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
69
70         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
71         Return correct type.
72         From bug #58270.
73
74 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
75
76         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
77         be implicitly converted to ulong.
78         
79         * expression.cs: The logic for allowing operator &, | and ^ worked
80         was wrong, it worked before because we did not report an error in
81         an else branch.  Fixes 57895.
82
83         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
84         allow volatile fields to be reference types.
85
86 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
87
88         * driver.cs: Add support for /debug-
89
90 2004-05-07  Raja R Harinath  <rharinath@novell.com>
91
92         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
93         Add a 'complain' parameter to silence errors.
94         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
95         silently overlooked type-resolutions.
96         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
97         to reflect changes.
98         (Attributes.Search): New function.
99         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
100         (Attributes.GetAttributeFullName): Remove hack.
101         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
102         Update to reflect changes.
103         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
104         Use Attributes.Search instead of nested loops.
105
106 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
107
108         * decl.cs:
109         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
110         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
111         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
112
113         * report.cs: (Report.Warning): Renamed to Warning_T because of
114         parameter collision.
115
116 2004-05-05  Raja R Harinath  <rharinath@novell.com>
117
118         * expression.cs (MemberAccess.ResolveMemberAccess):
119         Exit with non-zero status after Report.Error.
120         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
121         Likewise.
122         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
123
124 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
125
126         * support.cs: Don't hang when the file is empty.
127
128 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
129
130         * support.cs: In SeekableStreamReader, compute the preamble size of the
131           underlying stream. Position changes should take into account that initial
132           count of bytes.
133
134 2004-05-03  Todd Berman  <tberman@sevenl.net>
135
136         * driver.cs: remove unused GetSysVersion function.
137
138 2004-05-03  Todd Berman  <tberman@sevenl.net>
139
140         * driver.cs: Remove the hack from saturday, as well as the hack
141         from jackson (LoadAssemblyFromGac), also adds the CWD to the
142         link_paths to get that bit proper.
143
144 2004-05-01  Todd Berman  <tberman@sevenl.net>
145
146         * driver.cs: Try a LoadFrom before a Load, this checks the current
147         path. This is currently a bug in mono that is be fixed, however, this
148         provides a workaround for now. This will be removed when the bug
149         is fixed.
150
151 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
152
153         * CryptoConvert.cs: Updated to latest version. Fix issue with 
154         incomplete key pairs (#57941).
155
156 2004-05-01  Todd Berman  <tberman@sevenl.net>
157
158         * driver.cs: Remove '.' from path_chars, now System.* loads properly
159         from the GAC
160
161 2004-04-30  Jackson Harper  <jackson@ximian.com>
162
163         * codegen.cs: Open keys readonly.
164         
165 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
166
167         * typemanager.cs: don't report cyclic struct layout when a struct
168         contains 2 or more fields of the same type. Failed for Pango.AttrShape
169         which has 2 Pango.Rectangle fields.
170
171 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
172
173         * expression.cs: Handle IntPtr comparisons with IL code
174         rather than a method call.
175
176 2004-04-29  Martin Baulig  <martin@ximian.com>
177
178         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
179         the list of PropertyInfo's in class hierarchy and find the
180         accessor.  Fixes #56013.
181
182 2004-04-29  Martin Baulig  <martin@ximian.com>
183
184         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
185
186 2004-04-29  Martin Baulig  <martin@ximian.com>
187
188         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
189
190         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
191
192 2004-04-29  Martin Baulig  <martin@ximian.com>
193
194         * class.cs (ConstructorInitializer.Resolve): Check whether the
195         parent .ctor is accessible.  Fixes #52146.
196
197 2004-04-29  Martin Baulig  <martin@ximian.com>
198
199         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
200
201         * statement.cs (Using.EmitLocalVariableDecls): Use
202         TypeManager.idisposable_type, not typeof (IDisposable).
203         (Foreach.EmitCollectionForeach): Added support for valuetypes.
204
205 2004-04-29  Martin Baulig  <martin@ximian.com>
206
207         * class.cs (Event.Define): Don't emit the field and don't set
208         RTSpecialName and SpecialName for events on interfaces.  Fixes
209         #57703. 
210
211 2004-04-29  Raja R Harinath  <rharinath@novell.com>
212
213         Refactor Attribute.ApplyAttributes.
214         * attribute.cs (Attributable): New base class for objects that can
215         have Attributes applied on them.
216         (Attribute): Make AttributeUsage fields public.
217         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
218         (Attribute.IsInternalCall): New property.
219         (Attribute.UsageAttr): Convert to a public read-only property.
220         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
221         (Attribute.ResolveType, Attribute.Resolve)
222         (Attribute.ScanForIndexerName): Update to reflect changes.
223         (Attribute.CheckAttributeTarget): Re-format.
224         (Attribute.ApplyAttributes): Refactor, to various
225         Attributable.ApplyAttributeBuilder methods.
226         * decl.cs (MemberCore): Make Attributable.
227         * class.cs (Accessor): Make Attributable.
228         (MethodData.ApplyAttributes): Use proper attribute types, not
229         attribute names.
230         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
231         (TypeContainer.ApplyAttributeBuilder)
232         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
233         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
234         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
235         (Operator.ApplyAttributeBuilder): New factored-out methods.
236         * const.cs (Const.ApplyAttributeBuilder): Likewise.
237         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
238         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
239         * parameter.cs (ParameterBase): New Attributable base class
240         that can also represent Return types.
241         (Parameter): Update to the changes.
242
243 2004-04-29  Jackson Harper  <jackson@ximian.com>
244
245         * driver.cs: Prefer the corlib system version when looking for
246         assemblies in the GAC. This is still a hack, but its a better hack
247         now.
248         
249 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
250
251         * decl.cs, enum.cs: Improved error 3005 reporting.
252   
253         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
254         (related_symbols): New private member for list of symbols
255         related to reported error/warning.
256         
257         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
258
259 2004-04-29  Martin Baulig  <martin@ximian.com>
260
261         * ecore.cs (Expression.Constantify): If we're an enum and
262         TypeManager.TypeToCoreType() doesn't give us another type, use
263         t.UnderlyingSystemType.  Fixes #56178.  
264
265 2004-04-29  Martin Baulig  <martin@ximian.com>
266
267         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
268         interfaces and for each interface, only add members directly
269         declared in that interface.  Fixes #53255.
270
271 2004-04-28  Martin Baulig  <martin@ximian.com>
272
273         * expression.cs (ConditionalLogicalOperator): Use a temporary
274         variable for `left' to avoid that we evaluate it more than once;
275         bug #52588.
276
277 2004-04-28  Martin Baulig  <martin@ximian.com>
278
279         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
280         `void[]' (CS1547).
281
282 2004-04-28  Martin Baulig  <martin@ximian.com>
283
284         * statement.cs (LocalInfo.Resolve): Check whether the type is not
285         void (CS1547).
286
287         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
288         whether the type is not void (CS1547).
289
290 2004-04-28  Martin Baulig  <martin@ximian.com>
291
292         * expression.cs (Unary.DoResolveLValue): Override this and report
293         CS0131 for anything but Operator.Indirection.
294
295 2004-04-28  Martin Baulig  <martin@ximian.com>
296
297         Committing a patch from Ben Maurer; see bug #50820.
298
299         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
300         check for classes.
301
302         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
303         classes.        
304
305 2004-04-28  Martin Baulig  <martin@ximian.com>
306
307         Committing a patch from Ben Maurer; see bug #50820.
308
309         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
310         check for classes.
311
312         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
313         classes.        
314
315 2004-04-28  Martin Baulig  <martin@ximian.com>
316
317         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
318         (Block.AddLabel): Call DoLookupLabel() to only search in the
319         current block.
320
321 2004-04-28  Martin Baulig  <martin@ximian.com>
322
323         * cfold.cs (ConstantFold.BinaryFold): Added special support for
324         comparing StringConstants and NullLiterals in Equality and Inequality.
325
326 2004-04-28  Jackson Harper  <jackson@ximian.com>
327
328         * driver.cs: Attempt to load referenced assemblies from the
329         GAC. This is the quick and dirty version of this method that
330         doesnt take into account versions and just takes the first
331         canidate found. Will be good enough for now as we will not have more
332         then one version installed into the GAC until I update this method.
333
334 2004-04-28  Martin Baulig  <martin@ximian.com>
335
336         * typemanager.cs (TypeManager.CheckStructCycles): New public
337         static method to check for cycles in the struct layout.
338
339         * rootcontext.cs (RootContext.PopulateTypes): Call
340         TypeManager.CheckStructCycles() for each TypeContainer.
341         [Note: We only need to visit each type once.]
342
343 2004-04-28  Martin Baulig  <martin@ximian.com>
344
345         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
346
347         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
348         success and added `out object value'.  Use a `bool resolved' field
349         to check whether we've already been called rather than
350         `ConstantValue != null' since this breaks for NullLiterals.
351
352 2004-04-28  Raja R Harinath  <rharinath@novell.com>
353
354         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
355         setting of this flag, since the 'set' method may be non-public.
356
357 2004-04-28  Raja R Harinath  <rharinath@novell.com>
358
359         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
360         check on current_vector.Block.
361
362 2004-04-27  Martin Baulig  <martin@ximian.com>
363
364         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
365         a field initializer.  Fixes #56459.
366
367 2004-04-27  Martin Baulig  <martin@ximian.com>
368
369         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
370         we're not attempting to use an indexer.  Fixes #52154.
371
372 2004-04-27  Martin Baulig  <martin@ximian.com>
373
374         * statement.cs (Return): Don't create a return label if we don't
375         need it; reverts my change from January 20th.  Thanks to Ben
376         Maurer for this.
377
378 2004-04-27  Martin Baulig  <martin@ximian.com>
379
380         According to the spec, `goto' can only leave a nested scope, but
381         never enter it.
382
383         * statement.cs (Block.LookupLabel): Only lookup in the current
384         block, don't recurse into parent or child blocks.
385         (Block.AddLabel): Check in parent and child blocks, report
386         CS0140/CS0158 if we find a duplicate.
387         (Block): Removed this indexer for label lookups.
388         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
389         this already does the error reporting for us.
390
391         * flowanalysis.cs
392         (FlowBranching.UsageVector.Block): New public variable; may be null.
393         (FlowBranching.CreateSibling): Added `Block' argument.
394         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
395         label for the target of a `goto' and check whether we're not
396         leaving a `finally'.
397
398 2004-04-27  Martin Baulig  <martin@ximian.com>
399
400         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
401         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
402         just for returns).
403
404 2004-04-27  Martin Baulig  <martin@ximian.com>
405
406         * statement.cs (Block.AddLabel): Also check for implicit blocks
407         and added a CS0158 check.
408
409 2004-04-27  Martin Baulig  <martin@ximian.com>
410
411         * flowanalysis.cs (FlowBranchingLoop): New class.
412         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
413         UsageVector's instead of an ArrayList.
414         (FlowBranching.Label): Likewise.
415         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
416         (FlowBranching.AddBreakVector): New method.
417
418 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
419
420         * attribute.cs: Small regression fix: only convert the type if we
421         the type is different, fixes System.Drawing build.
422
423 2004-04-27  Martin Baulig  <martin@ximian.com>
424
425         * attribute.cs (Attribute.Resolve): If we have a constant value
426         for a named field or property, implicity convert it to the correct
427         type.
428
429 2004-04-27  Raja R Harinath  <rharinath@novell.com>
430
431         * statement.cs (Block.Block): Implicit blocks share
432         'child_variable_names' fields with parent blocks.
433         (Block.AddChildVariableNames): Remove.
434         (Block.AddVariable): Mark variable as "used by a child block" in
435         every surrounding block.
436         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
437         been used in a child block, complain about violation of "Invariant
438         meaning in blocks" rule.
439         * cs-parser.jay (declare_local_variables): Don't use
440         AddChildVariableNames.
441         (foreach_statement): Don't create an implicit block: 'foreach'
442         introduces a scope.
443
444 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
445
446         * convert.cs (ImplicitNumericConversion): 0 is also positive when
447         converting from 0L to ulong.  Fixes 57522.
448
449 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
450
451         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
452         derived class hides via 'new' keyword field from base class (test-242.cs).
453         TODO: Handle this in the more general way.
454         
455         * class.cs (CheckBase): Ditto.
456
457 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
458
459         * decl.cs (caching_flags): New member for storing cached values
460         as bit flags.
461         (MemberCore.Flags): New enum where bit flags for caching_flags
462         are defined.
463         (MemberCore.cls_compliance): Moved to caching_flags.
464         (DeclSpace.Created): Moved to caching_flags.
465
466         * class.cs: Use caching_flags instead of DeclSpace.Created
467         
468 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
469
470         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
471         if we are only a derived class, not a nested class.
472
473         * typemanager.cs: Same as above, but do this at the MemberLookup
474         level (used by field and methods, properties are handled in
475         PropertyExpr).   Allow for the qualified access if we are a nested
476         method. 
477
478 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
479
480         * class.cs: Refactoring.
481         (IMethodData): New inteface; Holds links to parent members
482         to avoid member duplication (reduced memory allocation).
483         (Method): Implemented IMethodData interface.
484         (PropertyBase): New inner classes for get/set methods.
485         (PropertyBase.PropertyMethod): Implemented IMethodData interface
486         (Event): New inner classes for add/remove methods.
487         (Event.DelegateMethod): Implemented IMethodData interface.
488
489         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
490         EmitContext (related to class.cs refactoring).
491
492 2004-04-21  Raja R Harinath  <rharinath@novell.com>
493
494         * delegate.cs (Delegate.VerifyApplicability): If the number of
495         arguments are the same as the number of parameters, first try to
496         verify applicability ignoring  any 'params' modifier on the last
497         parameter.
498         Fixes #56442.
499
500 2004-04-16  Raja R Harinath  <rharinath@novell.com>
501
502         * class.cs (TypeContainer.AddIndexer): Use
503         'ExplicitInterfaceName' to determine if interface name was
504         explicitly specified.  'InterfaceType' is not initialized at this time.
505         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
506         Indexers array is already in the required order.  Initialize
507         'IndexerName' only if there are normal indexers.
508         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
509         (TypeContainer.Emit): Emit DefaultMember attribute only if
510         IndexerName is initialized.
511         Fixes #56300.
512
513 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
514
515         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
516         Fixes #57007
517
518 2004-04-15  Raja R Harinath  <rharinath@novell.com>
519
520         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
521         attributes.
522         Fix for #56456.
523
524         * attribute.cs (Attribute.Resolve): Check for duplicate named
525         attributes.
526         Fix for #56463.
527
528 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
529
530         * iterators.cs (MarkYield): track whether we are in an exception,
531         and generate code accordingly.  Use a temporary value to store the
532         result for our state.
533
534         I had ignored a bit the interaction of try/catch with iterators
535         since their behavior was not entirely obvious, but now it is
536         possible to verify that our behavior is the same as MS .NET 2.0
537
538         Fixes 54814
539
540 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
541
542         * iterators.cs: Avoid creating temporaries if there is no work to
543         do. 
544
545         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
546         Enumerations, use TypeManager.EnumToUnderlying and call
547         recursively. 
548
549         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
550         bug #57013
551
552         (This.Emit): Use EmitContext.EmitThis to emit our
553         instance variable.
554
555         (This.EmitAssign): Ditto.
556
557         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
558         codepaths, we will move all the functionality into
559         Mono.CSharp.This 
560
561         (FieldExpr.EmitAssign): Ditto.
562
563         This fixes several hidden bugs that I uncovered while doing a code
564         review of this today.
565
566         * codegen.cs (EmitThis): reworked so the semantics are more clear
567         and also support value types "this" instances.
568
569         * iterators.cs: Changed so that for iterators in value types, we
570         do not pass the value type as a parameter.  
571
572         Initialization of the enumerator helpers is now done in the caller
573         instead of passing the parameters to the constructors and having
574         the constructor set the fields.
575
576         The fields have now `assembly' visibility instead of private.
577
578 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
579
580         * expression.cs (Argument.Resolve): Check if fields passed as ref
581         or out are contained in a MarshalByRefObject.
582
583         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
584         another compiler type.
585
586 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
587
588         * class.cs (Indexer.Define): use the new name checking method.
589         Also, return false on an error.
590         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
591         (is_identifier_[start/part]_character): make static.
592
593 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
594
595         * expression.cs (Binary.ResolveOperator): Do no append strings
596         twice: since we can be invoked more than once (array evaluation)
597         on the same concatenation, take care of this here.  Based on a fix
598         from Ben (bug #56454)
599
600 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
601
602         * codegen.cs: Fix another case where CS1548 must be reported (when 
603         delay-sign isn't specified and no private is available #56564). Fix
604         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
605         error when MCS is used on the MS runtime and we need to delay-sign 
606         (which seems unsupported by AssemblyBuilder - see #56621).
607
608 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
609
610         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
611         (TypeManager.ComputeNamespaces): Faster implementation for
612         Microsoft runtime.
613
614         * compiler.csproj: Updated AssemblyName to mcs.
615
616 2004-05-11  Jackson Harper  <jackson@ximian.com>
617
618         * Makefile: Preserve MONO_PATH
619         
620 2004-05-11  Jackson Harper  <jackson@ximian.com>
621
622         * Makefile: Use mono and mcs to build gmcs
623         
624 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
625
626         * codegen.cs: Add patch from Robert Shade
627         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
628         sync with mcs.
629
630 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
631
632         * CryptoConvert.cs: Updated to latest version. Fix issue with 
633         incomplete key pairs (#57941).
634
635 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
636
637         * codegen.cs: Fix another case where CS1548 must be reported (when 
638         delay-sign isn't specified and no private is available #56564). Fix
639         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
640         error when MCS is used on the MS runtime and we need to delay-sign 
641         (which seems unsupported by AssemblyBuilder - see #56621).
642
643 2004-04-29  Jackson Harper  <jackson@ximian.com>
644
645         * Makefile: Set MONO_PATH to use the bootstrap corlib
646         * driver.cs: Check the GAC for referenced assemblies.
647                 
648 2004-04-29  Martin Baulig  <martin@ximian.com>
649
650         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
651
652 2004-04-07  Martin Baulig  <martin@ximian.com>
653
654         * expression.cs (Binary.ResolveOperator): Added special case for
655         Equality/Inequality between a type parameter and a null literal.
656
657 2004-04-07  Martin Baulig  <martin@ximian.com>
658
659         * convert.cs: Check null literal -> type parameter conversions.
660
661 2004-04-07  Martin Baulig  <martin@ximian.com>
662
663         * generic.cs (ConstructedType.CheckConstraints): Enforce the
664         `class' and `struct' constraints.
665
666 2004-04-07  Martin Baulig  <martin@ximian.com>
667
668         * generic.cs (SpecialConstraint): New public enum.
669         (Constraints.Resolve): Added support for the `class' and `struct'
670         constraints.
671
672         * cs-parser.jay (type_parameter_constraint): Added support for the
673         `class' and `struct' constraints.
674
675 2004-04-07  Martin Baulig  <martin@ximian.com>
676
677         * support.cs (GenericConstraints): Replaced `Types' by
678         `ClassConstraint' and `InterfaceConstraints'; added
679         `HasClassConstraint'.   
680
681 2004-04-07  Martin Baulig  <martin@ximian.com>
682
683         * generic.cs
684         (Constraints.InterfaceConstraints): New public property.
685         (Constraints.Types): Make this property public
686         (TypeParameter): Implement IMemberContainer.
687         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
688         instead of a TypeBuilder/MethodBuilder; pass the interface
689         constraints to TypeManager.AddTypeParameter().
690         (TypeParameter.DefineType): Just take an EmitContext and no
691         TypeBuilder/MethodBuilder.  Use the new public API.
692
693         * typemanager.cs (TypeManager.AddTypeParameter): Added
694         `TypeExpr[]' argument; add the interfaces to the
695         `builder_to_ifaces' hash.
696         (TypeManager.LookupMemberContainer): For
697         GenericTypeParameterBuilders, get the TypeParameter from the
698         `builder_to_type_param'.
699         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
700         the TypeParameter and call FindMembers on it.
701
702 2004-04-07  Martin Baulig  <martin@ximian.com>
703
704         * class.cs
705         (MethodCore.GenericMethod): Moved this field here from Method.
706         (MethodCore.IsDuplicateImplementation): Take the number of type
707         parameters into account if we're a generic method.
708
709         * expression.cs (Invocation.InferTypeArguments): Don't return true
710         if `arguments' is null; we still need to check whether we actually
711         don't need to infer anything in this case.
712         (MemberAccess): Merged the functionality from GenericMemberAccess
713         into this class.
714
715         * generic.cs (GenericMemberAccess): Removed.
716
717 2004-04-05  Martin Baulig  <martin@ximian.com>
718
719         * decl.cs (MemberCore): For generic classes, interfaces and
720         structs, `Name' now includes the number of type parameters
721         ("Stack!1.Node!1").
722         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
723         encode the number of type arguments in the type name.
724
725         * expression.cs (Expression.MemberLookup): Removed the
726         `num_type_args' argument; we now encode the number of type
727         arguments in the type name.
728
729         * ecore.cs (SimpleName): Encode the number of type arguments in
730         the type name itself.
731
732         * generic.cs (ConstructedType): Likewise.
733
734         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
735         `MemberName'; we now include the number of type parameters in the
736         type name.
737
738         * typemanager.cs (TypeManager.CheckGeneric): Removed.
739         (TypeManager.MemberLookup): Removed the
740         `num_type_args' argument; we now encode the number of type
741         arguments in the type name.     
742
743 2004-04-03  Martin Baulig  <martin@ximian.com>
744
745         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
746         (MemberCore.MemberName): Moved here from MemberBase.
747         (DeclSpace.SetParameterInfo): Just take the constraints as an
748         ArrayList; we already have the type parameters in our
749         `MemberName'; also do the CS0080 reporting here.
750
751         * cs-parser.jay (struct_declaration): Use `member_name' instead of
752         `IDENTIFIER opt_type_parameter_list'; when constructing our
753         `MemberName', it'll already include our type parameters.
754         (class_declaration, interface_declaration): Likewise.
755         (delegate_declaration): Likewise.
756         (MakeName): Take a MemberName and return a MemberName.
757         The following two changes are required to avoid shift/reduce conflicts:
758         (member_name): Don't include a TypeName anymore; ie. this is now
759         just 'IDENTIFIER opt_type_parameter_list'.
760         (property_declaration, event_declaration): Use a
761         `namespace_or_type_name' instead of a `member_name'.            
762
763 2004-04-03  Martin Baulig  <martin@ximian.com>
764
765         * decl.cs (MemberName): Renamed to `TypeName' and created a new
766         `MemberName' class.
767         (TypeName): Formerly known as MemberName.
768
769         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
770         instead of a `MemberName'.
771
772         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
773         (member_name): New rule; create a MemberName.
774
775 2004-04-02  Martin Baulig  <martin@ximian.com>
776
777         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
778         (CS0305 and CS0308).
779
780 2004-04-02  Martin Baulig  <martin@ximian.com>
781
782         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
783         support for nested types.
784
785 2004-04-02  Martin Baulig  <martin@ximian.com>
786
787         * ecore.cs (IAlias): New public interface.
788         (TypeExpr, TypeExpression): Implement IAlias.
789         (TypeAliasExpression): New public class.
790
791         * namespace.cs (Namespace): Implement IAlias.
792         (Namespace.Lookup): Return an IAlias instead on an object.
793         (Namespace.DefineName): Take an IAlias instead of an object.
794         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
795         an object.
796         (NamespaceEntry.UsingAlias): Take a Membername instead of an
797         Expression.
798         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
799         object.
800         (NamespaceEntry.Lookup): Likewise.
801
802         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
803         instead of a Type.      
804
805         * decl.cs (DeclSpace): Implement IAlias.
806         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
807
808         * generic.cs (ConstructedType): Improved error checking.
809
810 2004-04-02  Martin Baulig  <martin@ximian.com>
811
812         * convert.cs: Added type parameter conversions.
813
814         * ecore.cs
815         (UnboxCast.Emit): Emit an `unbox.any' for type params.
816         (ClassCast.Emit): If the source type is a type parameter, box it.
817         If the target type is a type parameter, emit an `unbox.any'
818         instead of a `classcast'.1      
819
820 2004-04-01  Martin Baulig  <martin@ximian.com>
821
822         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
823
824 2004-04-01  Martin Baulig  <martin@ximian.com>
825
826         * expression.cs (Invocation.EmitCall): If we're invoking a method
827         on a type parameter, use the new `Constrained' prefix opcode.
828
829 2004-04-01  Martin Baulig  <martin@ximian.com>
830
831         * generic.cs (ConstructedType.CheckConstraints): Use
832         Convert.ImplicitStandardConversionExists(); user-defined implicit
833         conversions are not allowed according to the spec.
834
835 2004-03-30  Martin Baulig  <martin@ximian.com>
836
837         * expression.cs (New): Added support for type parameters.
838
839         * typemanager.cs
840         (TypeManager.activator_type): New public static field.
841         (TypeManager.activator_create_instance): Likewise.
842
843 2004-03-30  Martin Baulig  <martin@ximian.com>
844
845         * typemanager.cs (TypeManager.HasConstructorConstraint): New
846         public method.
847
848 2004-03-30  Martin Baulig  <martin@ximian.com>
849
850         * generic.cs (ConstructedType.CheckConstraints): Actually follow
851         the spec here: the argument type must be convertible to the
852         constraints.
853
854 2004-03-30  Martin Baulig  <martin@ximian.com>
855
856         * generic.cs
857         (TypeParameter.Define, TypeParameter.DefineMethod): Call
858         TypeManager.AddTypeParameter().
859         (ConstructedType.CheckConstraints): Re-enable this and actually
860         check whether we have a constructor constraint.
861
862         * typemanager.cs
863         (TypeManager.builder_to_type_param): New static field.
864         (TypeManager.AddTypeParameter): New static method.
865         (TypeManager.LookupTypeParameter): New public method.
866
867 2004-03-30  Martin Baulig  <martin@ximian.com>
868
869         * generic.cs (TypeParameter.DefineType): Return a boolean and use
870         the new API to actually define the constructor constraint.
871
872         * typemanager.cs
873         (TypeManager.new_constraint_attr_type): New static field.
874         (TypeManager.InitCoreTypes): Initialize it.
875
876 2004-03-30  Martin Baulig  <martin@ximian.com>
877
878         * generic.cs (Constraints): Completed error checking, use correct
879         error numbers.
880
881 2004-03-29  Martin Baulig  <martin@ximian.com>
882
883         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
884
885         * expression.cs (Invocation.InferTypeArguments): Added overloaded
886         public version which takes a `ParameterData pd' instead of an
887         `ArrayList args'.
888
889 2004-03-29  Martin Baulig  <martin@ximian.com>
890
891         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
892         not a MethodInfo.       
893
894 2004-03-29  Martin Baulig  <martin@ximian.com>
895
896         * expression.cs (Argument.ResolveMethodGroup): If we're a
897         ConstructedType, call GetMemberAccess() on it.  
898
899 2004-03-29  Martin Baulig  <martin@ximian.com>
900
901         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
902         (MethodCore.CheckGenericOverride): When overriding a generic
903         method, check whether the constraints match.
904
905         * support.cs (GenericConstraints): New public interface.
906         (ParameterData.GenericConstraints): New public method.
907
908         * parameter.cs (Parameter.Resolve): Check whether we're a generic
909         method parameter and compute our constraints if appropriate.
910         (Parameter.GenericConstraints): New public property.
911
912         * generic.cs (Constraints): Implement GenericConstraints.
913
914 2004-03-29  Martin Baulig  <martin@ximian.com>
915
916         * decl.cs (MemberCache.FindMemberToOverride): Use
917         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
918
919 2004-03-29  Martin Baulig  <martin@ximian.com>
920
921         * generic.cs (GenericMethod.Define): Resolve our type parameters.
922
923 2004-03-29  Martin Baulig  <martin@ximian.com>
924
925         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
926         not allowed on non-generic declarations").
927
928 2004-03-29  Martin Baulig  <martin@ximian.com>
929
930         * expression.cs (Invocation.InferTypeArguments): Added overloaded
931         public version of this method.
932
933         * class.cs (MethodCore.IsDuplicateImplementation): Use
934         Invocation.InferTypeArguments() to check this.
935
936 2004-03-29  Martin Baulig  <martin@ximian.com>
937
938         * convert.cs: Use TypeManager.IsDelegateType() instead of
939         comparing types correctly.
940
941 2004-03-29  Martin Baulig  <martin@ximian.com>
942
943         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
944         types directly to make it work for generic instances.
945
946         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
947
948 2004-03-29  Martin Baulig  <martin@ximian.com>
949
950         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
951         support for arrays.     
952
953 2004-03-24  Martin Baulig  <martin@ximian.com>
954
955         * decl.cs (DeclSpace.FindType): Also use
956         TypeManager.CheckGeneric() for types from the using clauses.
957
958 2004-03-23  Martin Baulig  <martin@ximian.com>
959
960         * expression.cs (Invocation.OverloadResolve): Added `bool
961         may_fail' argument and use it instead of the Location.IsNull() hack.
962
963 2004-03-23  Martin Baulig  <martin@ximian.com>
964
965         * expression.cs (Invocation.InferType): Use correct type inference
966         rules here.     
967
968 2004-03-23  Martin Baulig  <martin@ximian.com>
969
970         * ecore.cs (MethodGroupExpr.Name): Use
971         TypeManager.CSharpSignature() instead of just the name.
972
973         * expression.cs (Invocation.OverloadResolve): Provide better error
974         reporting.
975         (Invocation.DoResolve): OverloadResolve() never returns null
976         without reporting an error, so removed the error -6 reporting here.
977
978 2004-03-23  Martin Baulig  <martin@ximian.com>
979
980         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
981         generic methods.
982
983         * cs-parser.jay (delegate_declaration): Support generic delegates.
984
985         * delegate.cs: Support generic delegates.
986
987 2004-03-22  Martin Baulig  <martin@ximian.com>
988
989         * expression.cs (Invocation.InferParamsTypeArguments): New static
990         method; does type inference for params arguments.
991
992 2004-03-21  Martin Baulig  <martin@ximian.com>
993
994         * typemanager.cs (TypeManager.IsGenericMethod): New public static
995         method; checks whether a method is a generic method.    
996
997         * expression.cs (Invocation.InferTypeArguments): New static method;
998         infer type arguments for generic method invocation.
999
1000         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
1001         property; we set this to true if we're resolving a generic method
1002         invocation and the user specified type arguments, ie. we're not
1003         doing type inference.
1004
1005 2004-03-20  Martin Baulig  <martin@ximian.com>
1006
1007         * class.cs (MethodData.DeclaringType): New public property.
1008         (MethodData.Define): Set DeclaringType here.
1009         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
1010         instead of OperatorMethodBuilder.DeclaringType.
1011
1012 2004-03-20  Martin Baulig  <martin@ximian.com>
1013
1014         * cs-tokenizer.cs (xtoken): Return a special
1015         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
1016
1017         * cs-parser.jay (default_value_expression): Switch to the new
1018         syntax (14.5.13).
1019
1020 2004-03-19  Martin Baulig  <martin@ximian.com>
1021
1022         * decl.cs (MemberName): New class.  We use this to "construct"
1023         namespace_or_type_name's.
1024
1025         * generics.cs (TypeArguments.GetDeclarations): New public method;
1026         returns the type arguments as a string[] and reports a CS0081 if
1027         one of them is not an identifier.
1028
1029         * class.cs (MemberBase): The .ctor now takes the name as a
1030         MemberName instead of a string.
1031         (MemberBase.ExplicitInterfaceName): Changed type from string to
1032         Expression.
1033         (MemberBase.DoDefine): If we're an explicit implementation, the
1034         InterfaceType may be a generic instance.
1035
1036         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
1037         (namespace_name): Call MemberName.GetName () to transform the
1038         MemberName into a string and ensure we don't have any type
1039         arguments.
1040         (type_name): Call MemberName.GetTypeExpression() to transfrom the
1041         MemberName into an expression.
1042         (method_header): Use namespace_or_type_name instead of member_name.     
1043
1044 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
1045
1046         * rootcontext.cs: Add new types to the boot resolution.
1047
1048         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
1049         MulticastDelegate is not allowed.
1050
1051         * typemanager.cs: Add new types to lookup: System.TypedReference
1052         and ArgIterator.
1053
1054         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
1055         check for TypedReference or ArgIterator, they are not allowed. 
1056
1057         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
1058         makes us properly catch 1510 in some conditions (see bug 56016 for
1059         details). 
1060
1061 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
1062
1063         * CryptoConvert.cs: update from corlib version
1064         with endian fixes.
1065
1066 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
1067
1068         * class.cs (Indexer.Define): Check indexername declaration
1069
1070 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
1071
1072         * attribute.cs (IsClsCompliant): Fixed problem with handling
1073         all three states (compliant, not-compliant, undetected).
1074
1075 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
1076
1077         * attribute.cs (Attribute): Location is now public.
1078         (Resolve): Store resolved arguments (pos_values) in attribute class.
1079         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
1080         (GetClsCompliantAttributeValue): New method that gets
1081         CLSCompliantAttribute value.
1082         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
1083         if exists else null.
1084         (AttributeTester): New class for CLS-Compliant verification routines.
1085
1086         * class.cs (Emit): Add CLS-Compliant verification.
1087         (Method.GetSignatureForError): Implemented.
1088         (Constructor.GetSignatureForError): Implemented
1089         (Constructor.HasCompliantArgs): Returns if constructor has
1090         CLS-Compliant arguments.
1091         (Constructor.Emit): Override.
1092         (Construcor.IsIdentifierClsCompliant): New method; For constructors
1093         is needed to test only parameters.
1094         (FieldBase.GetSignatureForError): Implemented.
1095         (TypeContainer): New member for storing base interfaces.
1096         (TypeContainer.FindMembers): Search in base interfaces too.
1097
1098         * codegen.cs (GetClsComplianceAttribute): New method that gets
1099         assembly or module CLSCompliantAttribute value.
1100         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
1101         for assembly.
1102         (ModuleClass.Emit): Add error 3012 test.
1103
1104         * const.cs (Emit): Override and call base for CLS-Compliant tests.
1105
1106         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
1107         state for all decl types.
1108         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
1109         if CLS-Compliant tests are required.
1110         (IsClsCompliaceRequired): New method. Analyze whether code
1111         must be CLS-Compliant.
1112         (IsExposedFromAssembly): New method. Returns true when MemberCore
1113         is exposed from assembly.
1114         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
1115         value or gets cached value.
1116         (HasClsCompliantAttribute): New method. Returns true if MemberCore
1117         is explicitly marked with CLSCompliantAttribute.
1118         (IsIdentifierClsCompliant): New abstract method. This method is
1119         used to testing error 3005.
1120         (IsIdentifierAndParamClsCompliant): New method. Common helper method
1121         for identifier and parameters CLS-Compliant testing.
1122         (VerifyClsCompliance): New method. The main virtual method for
1123         CLS-Compliant verifications.
1124         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
1125         null. I don't know why is null (too many public members !).
1126         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
1127         and get value of first CLSCompliantAttribute that found.
1128
1129         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
1130         (VerifyClsCompliance): Override and add extra tests.
1131
1132         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
1133         clscheck- disable CLS-Compliant verification event if assembly is has
1134         CLSCompliantAttribute(true).
1135
1136         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
1137         ApllyAttribute is now called in emit section as in the other cases.
1138         Possible future Emit integration.
1139         (IsIdentifierClsCompliant): New override.
1140         (VerifyClsCompliance): New override.
1141         (GetEnumeratorName): Returns full enum name.
1142
1143         * parameter.cs (GetSignatureForError): Implemented.
1144
1145         * report.cs (WarningData): New struct for Warning message information.
1146         (LocationOfPreviousError): New method.
1147         (Warning): New method. Reports warning based on the warning table.
1148         (Error_T): New method. Reports error based on the error table.
1149
1150         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
1151         verifications are done here.
1152
1153         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
1154
1155         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
1156         CLSCompliantAttribute.
1157         (all_imported_types): New member holds all imported types from other
1158         assemblies.
1159         (LoadAllImportedTypes): New method fills static table with exported types
1160         from all referenced assemblies.
1161         (Modules): New property returns all assembly modules.
1162
1163 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
1164
1165         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
1166         throwing a parser error.
1167
1168         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
1169         which removes the hardcoded get_/set_ prefixes for properties, as
1170         IL allows for the properties to be named something else.  
1171
1172         Bug #56013
1173
1174         * expression.cs: Do not override operand before we know if it is
1175         non-null.  Fix 56207
1176
1177 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1178
1179         * typemanager.cs: support for pinned variables.
1180
1181 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1182
1183         * decl.cs, typemanager.cs: Avoid using an arraylist
1184         as a buffer if there is only one result set.
1185
1186 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1187
1188         * expression.cs: Make sure you cant call a static method
1189         with an instance expression, bug #56174.
1190
1191 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
1192
1193         * class.cs (IsDuplicateImplementation): Improve error reporting to
1194         flag 663 (method only differs in parameter modifier).
1195
1196         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
1197         in preprocessor directives.
1198
1199         * location.cs (LookupFile): Allow for the empty path.
1200
1201         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
1202         better approach for some of that patch, but its failing with the
1203         CharSet enumeration.  For now try/catch will do.
1204
1205         * typemanager.cs: Do not crash if a struct does not have fields.
1206         Fixes 56150.
1207
1208 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1209
1210         * expression.cs: cs0213, cant fix a fixed expression.
1211         fixes 50231.
1212
1213 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1214
1215         * cs-parser.jay: detect invalid embeded statements gracefully.
1216         bug #51113.
1217
1218 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1219
1220         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
1221         As a regex:
1222         s/
1223         the invocation type may not be a subclass of the tye of the item/
1224         The type of the item must be a subclass of the invocation item.
1225         /g
1226
1227         Fixes bug #50820.
1228
1229 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
1230
1231         * attribute.cs: Added methods to get a string and a bool from an
1232         attribute. Required to information from AssemblyKeyFileAttribute,
1233         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
1234         * codegen.cs: Modified AssemblyName creation to include support for
1235         strongnames. Catch additional exceptions to report them as CS1548.
1236         * compiler.csproj: Updated include CryptoConvert.cs.
1237         * compiler.csproj.user: Removed file - user specific configuration.
1238         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
1239         Mono.Security assembly. The original class is maintained and tested in
1240         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
1241         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
1242         like CSC 8.0 (C# v2) supports.
1243         * Makefile: Added CryptoConvert.cs to mcs sources.
1244         * rootcontext.cs: Added new options for strongnames.
1245
1246 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
1247
1248         * driver.cs: For --expect-error, report error code `2'
1249         if the program compiled with no errors, error code `1' if
1250         it compiled with an error other than the one expected.
1251
1252 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
1253
1254         * compiler.csproj: Updated for Visual Studio .NET 2003.
1255         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
1256         * compiler.sln: Updated for Visual Studio .NET 2003.
1257
1258 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
1259
1260         * expression.cs: Fix bug #47234. We basically need to apply the
1261         rule that we prefer the conversion of null to a reference type
1262         when faced with a conversion to 'object' (csc behaviour).
1263
1264 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1265
1266         * statement.cs: Shorter form for foreach, eliminates
1267         a local variable. r=Martin.
1268
1269 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1270
1271         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
1272         checks if we can use brtrue/brfalse to test for 0.
1273         * expression.cs: use the above in the test for using brtrue/brfalse.
1274         cleanup code a bit.
1275
1276 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1277
1278         * expression.cs: Rewrite string concat stuff. Benefits:
1279
1280         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
1281         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
1282         rather than a concat chain.
1283
1284         * typemanager.cs: Add lookups for more concat overloads.
1285
1286 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1287
1288         * expression.cs: Emit shorter il code for array init.
1289
1290         newarr
1291         dup
1292         // set 1
1293
1294         // set 2
1295
1296         newarr
1297         stloc.x
1298
1299         ldloc.x
1300         // set 1
1301
1302         ldloc.x
1303         // set 2
1304
1305 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
1306
1307         * statement.cs: Before, two switch blocks would be merged if the
1308         total size of the blocks (end_item - begin_item + 1) was less than
1309         two times the combined sizes of the blocks.
1310
1311         Now, it will only merge if after the merge at least half of the
1312         slots are filled.
1313
1314         fixes 55885.
1315
1316 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
1317
1318         * class.cs : csc build fix for GetMethods(). See bug #52503.
1319
1320 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
1321
1322         * expression.cs: Make sure fp comparisons work with NaN.
1323         This fixes bug #54303. Mig approved this patch a long
1324         time ago, but we were not able to test b/c the runtime
1325         had a related bug.
1326
1327 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
1328
1329         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
1330
1331 2004-03-19  Martin Baulig  <martin@ximian.com>
1332
1333         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
1334         two overloads may unify for some type parameter substitutions and
1335         report a CS0408 if appropriate.
1336
1337 2004-03-19  Martin Baulig  <martin@ximian.com>
1338
1339         * class.cs (MemberCore.IsDuplicateImplementation): Report the
1340         error here and not in our caller.
1341
1342 2004-03-19  Martin Baulig  <martin@ximian.com>
1343
1344         * interface.cs: Completely killed this file.
1345         (Interface): We're now a TypeContainer and live in class.cs.
1346
1347         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
1348         argument; we're now also called for interfaces.
1349         (TypeContainer.DefineMembers): Allow this method being called
1350         multiple times.
1351         (TypeContainer.GetMethods): New public method; formerly known as
1352         Interface.GetMethod().  This is used by PendingImplementation.
1353         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
1354         it's now private and non-static.
1355         (Interface): Moved this here; it's now implemented similar to
1356         Class and Struct.
1357         (Method, Property, Event, Indexer): Added `bool is_interface'
1358         argument to their .ctor's.
1359         (MemberBase.IsInterface): New public field.
1360
1361         * cs-parser.jay: Create normal Method, Property, Event, Indexer
1362         instances instead of InterfaceMethod, InterfaceProperty, etc.
1363         (opt_interface_base): Removed; we now use `opt_class_base' instead.
1364         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
1365
1366 2004-03-19  Martin Baulig  <martin@ximian.com>
1367
1368         * class.cs (MethodCore.IsDuplicateImplementation): New private
1369         method which does the CS0111 checking.
1370         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
1371         Use IsDuplicateImplementation().
1372
1373 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
1374
1375         * decl.cs (FindMemberToOverride): New method to find the correct
1376         method or property to override in the base class.
1377         * class.cs
1378             - Make Method/Property use the above method to find the
1379               version in the base class.
1380             - Remove the InheritableMemberSignatureCompare as it is now
1381               dead code.
1382
1383         This patch makes large code bases much faster to compile, as it is
1384         O(n) rather than O(n^2) to do this validation.
1385
1386         Also, it fixes bug 52458 which is that nested classes are not
1387         taken into account when finding the base class member.
1388
1389         Reviewed/Approved by Martin.
1390
1391 2004-03-17  Martin Baulig  <martin@ximian.com>
1392
1393         * expression.cs (MemberAccess.DoResolve): Take the parent's number
1394         of type arguments into account; use the `real_num_type_args'
1395         approach like in DoResolveAsTypeStep().
1396
1397         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
1398         nested types.
1399
1400 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
1401
1402         * interface.cs: In all interface classes removed redundant
1403         member initialization.
1404
1405 2004-03-16  Martin Baulig  <martin@ximian.com>
1406
1407         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
1408
1409 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
1410
1411         * decl.cs (DefineTypeAndParents): New helper method to define a
1412         type's containers before the type itself is defined;  This is a
1413         bug exposed by the recent changes to Windows.Forms when an
1414         implemented interface was defined inside a class that had not been
1415         built yet.   
1416
1417         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
1418
1419         (Check): Loop correctly to report errors modifiers
1420         (UNSAFE was not in the loop, since it was the same as TOP).
1421
1422         * interface.cs: Every interface member now takes a ModFlags,
1423         instead of a "is_new" bool, which we set on the base MemberCore. 
1424
1425         Every place where we called "UnsafeOk" in the interface, now we
1426         call the proper member (InterfaceMethod.UnsafeOK) instead to get
1427         the unsafe settings from the member declaration instead of the
1428         container interface. 
1429
1430         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
1431
1432         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
1433         `set_indexer_name' to the pending bits (one per type).
1434
1435         We fixed a bug today that was picking the wrong method to
1436         override, since for properties the existing InterfaceMethod code
1437         basically ignored the method name.  Now we make sure that the
1438         method name is one of the valid indexer names.
1439
1440 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
1441  
1442         * support.cs (SeekableStreamReader): Keep track of stream byte
1443         positions and don't mix them with character offsets to the buffer.
1444
1445         Patch from Gustavo Giráldez
1446
1447 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
1448
1449         * interface.cs (InterfaceSetGetBase): Removed double member
1450         initialization, base class does it as well.
1451
1452 2004-03-13  Martin Baulig  <martin@ximian.com>
1453
1454         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
1455         when compiling corlib.
1456
1457 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
1458
1459         * convert.cs (ExplicitConversion): We were reporting an error on
1460         certain conversions (object_type source to a value type, when the
1461         expression was `null') before we had a chance to pass it through
1462         the user defined conversions.
1463
1464         * driver.cs: Replace / and \ in resource specifications to dots.
1465         Fixes 50752
1466
1467         * class.cs: Add check for duplicate operators.  Fixes 52477
1468
1469 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
1470
1471         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
1472         that are in the middle of the statements, not only at the end.
1473         Fixes #54987
1474
1475         * class.cs (TypeContainer.AddField): No longer set the
1476         `HaveStaticConstructor' flag, now we call it
1477         `UserDefineStaticConstructor' to diferentiate the slightly
1478         semantic difference.
1479
1480         The situation is that we were not adding BeforeFieldInit (from
1481         Modifiers.TypeAttr) to classes that could have it.
1482         BeforeFieldInit should be set to classes that have no static
1483         constructor. 
1484
1485         See:
1486
1487         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
1488
1489         And most importantly Zoltan's comment:
1490
1491         http://bugzilla.ximian.com/show_bug.cgi?id=44229
1492
1493         "I think beforefieldinit means 'it's ok to initialize the type sometime 
1494          before its static fields are used', i.e. initialization does not need
1495          to be triggered by the first access to the type. Setting this flag
1496          helps the JIT to compile better code, since it can run the static
1497          constructor at JIT time, and does not need to generate code to call it
1498          (possibly lots of times) at runtime. Unfortunately, mcs does not set
1499          this flag for lots of classes like String. 
1500          
1501          csc sets this flag if the type does not have an explicit static 
1502          constructor. The reasoning seems to be that if there are only static
1503          initalizers for a type, and no static constructor, then the programmer
1504          does not care when this initialization happens, so beforefieldinit
1505          can be used.
1506          
1507          This bug prevents the AOT compiler from being usable, since it 
1508          generates so many calls to mono_runtime_class_init that the AOT code
1509          is much slower than the JITted code. The JITted code is faster, 
1510          because it does not generate these calls if the vtable is type is
1511          already initialized, which is true in the majority of cases. But the
1512          AOT compiler can't do this."
1513
1514 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
1515
1516         * class.cs (MethodData.Emit): Refactor the code so symbolic
1517         information is generated for destructors;  For some reasons we
1518         were taking a code path that did not generate symbolic information
1519         before. 
1520
1521 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
1522
1523         * class.cs: Create a Constructor.CheckBase method that
1524         takes care of all validation type code. The method
1525         contains some code that was moved from Define.
1526
1527         It also includes new code that checks for duplicate ctors.
1528         This fixes bug #55148.
1529
1530 2004-03-09  Joshua Tauberer <tauberer@for.net>
1531
1532         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
1533         a { ... }-style array creation invokes EmitStaticInitializers
1534         which is not good for reference-type arrays.  String, decimal
1535         and now null constants (NullCast) are not counted toward
1536         static initializers.
1537
1538 2004-03-05  Martin Baulig  <martin@ximian.com>
1539
1540         * location.cs (SourceFile.HasLineDirective): New public field;
1541         specifies whether the file contains or is referenced by a "#line"
1542         directive.
1543         (Location.DefineSymbolDocuments): Ignore source files which
1544         either contain or are referenced by a "#line" directive.        
1545
1546 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
1547
1548         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
1549         direct access to our parent, so check the method inline there.
1550
1551 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
1552
1553         * expression.cs (Invocation.EmitCall): Miguel's last commit
1554         caused a regression. If you had:
1555
1556             T t = null;
1557             t.Foo ();
1558
1559         In Foo the implict this would be null.
1560
1561 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
1562
1563         * expression.cs (Invocation.EmitCall): If the method is not
1564         virtual, do not emit a CallVirt to it, use Call.
1565
1566         * typemanager.cs (GetFullNameSignature): Improve the method to
1567         cope with ".ctor" and replace it with the type name.
1568
1569         * class.cs (ConstructorInitializer.Resolve): Now the method takes
1570         as an argument the ConstructorBuilder where it is being defined,
1571         to catch the recursive constructor invocations.
1572
1573 2004-03-16  Martin Baulig  <martin@ximian.com>
1574
1575         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
1576         ConstructedType, call ResolveType() on it to get the type rather
1577         than just using `expr.Type'.
1578
1579 2004-03-16  Martin Baulig  <martin@ximian.com>
1580
1581         * generics.cs (ConstructedType.GetMemberAccess): Take the
1582         EmitContext instead on the TypeExpr and use
1583         ec.TypeContainer.CurrentType/ec.ContainerType.
1584
1585 2004-03-16  Martin Baulig  <martin@ximian.com>
1586
1587         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
1588         parameters before aliases.
1589
1590 2004-03-16  Martin Baulig  <martin@ximian.com>
1591
1592         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
1593         New oublic function; checks whether two generic instances may become
1594         equal under some instantiations (26.3.1).
1595
1596         * class.cs (TypeContainer.Define): Call
1597         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
1598         error.
1599
1600 2004-03-16  Martin Baulig  <martin@ximian.com>
1601
1602         * class.cs (TypeContainer.GetClassBases): Moved
1603         Error_TypeParameterAsBase() here and also check whether the base
1604         class is not an attribute.
1605
1606 2004-03-16  Martin Baulig  <martin@ximian.com>
1607
1608         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
1609
1610 2004-03-16  Martin Baulig  <martin@ximian.com>
1611
1612         * class.cs (Error_TypeParameterAsBase): Use correct error number
1613         here (CS0689).  
1614
1615 2004-03-16  Martin Baulig  <martin@ximian.com>
1616
1617         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
1618         for generics.
1619
1620         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
1621         error reporting.
1622
1623 2004-03-15  Martin Baulig  <martin@ximian.com>
1624
1625         * typemanager.cs (TypeManager.GetFullName): New public method.
1626         (TypeManager.MemberLookup): Added `int_num_type_arguments'
1627         argument; only return members with the correct number of type
1628         arguments.
1629         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
1630         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
1631         whether the number of type arguments matches.
1632
1633         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
1634         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
1635
1636         * expression.cs (MemberAccess): Added public `NumTypeArguments'
1637         field; it's set by the protected .ctor when we're actually a
1638         GenericMemberAccess.
1639         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
1640         arguments and pass it to MemberLookupFinal ().
1641
1642         * ecore.cs (Expression.MemberLookup): Added `int
1643         num_type_arguments' argument; only return members with the correct
1644         number of type arguments.
1645         (Expression.MemberLookupFailed): Check whether the MemberLookup
1646         failed because we did not have the correct number of type
1647         arguments; report CS0305 in this case.
1648
1649         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
1650         `e.ResolveAsTypeTerminal()' already did so.
1651
1652 2004-03-15  Martin Baulig  <martin@ximian.com>
1653
1654         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
1655         we're a ConstructedType; in this case, the caller must report an
1656         error (for instance CS0131).
1657
1658         * generic.cs (TypeArguments): Added Location argument to the .ctor.
1659         (TypeArguments.Resolve): Actually report errors here.
1660
1661 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
1662
1663         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
1664         `set_indexer_name' to the pending bits (one per type).
1665
1666         We fixed a bug today that was picking the wrong method to
1667         override, since for properties the existing InterfaceMethod code
1668         basically ignored the method name.  Now we make sure that the
1669         method name is one of the valid indexer names.
1670
1671 2004-03-15  Martin Baulig  <martin@ximian.com>
1672
1673         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
1674         for generic instances.
1675
1676 2004-03-13  Martin Baulig  <martin@ximian.com>
1677
1678         * class.cs (TypeContainer.DefineType): Call
1679         TypeManager.AddUserType() immediately after creating the
1680         TypeBuilder; pass all type parameters when creating the
1681         CurrentType.
1682
1683         * decl.cs (DeclSpace.FindNestedType): New public method.
1684         (DeclSpace.FindType): Added `int num_type_args' argument; only
1685         return types with the correct number of type parameters.
1686         (DeclSpace.CountTypeParams): New public property.
1687
1688         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
1689         the number of type parameters; defaults to zero.
1690
1691         * generic.cs (TypeArguments.Count): New public property.
1692         (ConstructedType.DoResolveAsTypeStep): First call
1693         ds.FindNestedType() to find out whether we're nested in the
1694         current generic type; in this case, we inherit all type parameters
1695         from the current class.
1696
1697         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
1698         num_type_args' argument.
1699         (RootContext.LookupType): Added overloaded version which takes the
1700         number of type arguments; only return types with the correct
1701         number of type arguments.
1702
1703         * typemanager.cs (TypeManager.CheckGeneric): New public function;
1704         checks whether `Type t' has `int num_type_args'.
1705
1706 2004-03-13  Martin Baulig  <martin@ximian.com>
1707
1708         * generic.cs (GenericMethod.DefineType): New method; calls
1709         DefineType() on all the type parameters.
1710
1711         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
1712         (MethodData.Define): If we're a generic method, call
1713         GenericMethod.DefineType() to define the type parameters.       
1714
1715 2004-03-10  Martin Baulig  <martin@ximian.com>
1716
1717         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
1718         instead of IsAssignableFrom.    
1719
1720 2004-03-10  Martin Baulig  <martin@ximian.com>
1721
1722         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
1723
1724         * support.cs (ParameterData.HasArrayParameter): New property.
1725         (ReflectionParameters.ctor): Take a MethodBase instead of a
1726         ParameterInfo[].  If we have any type parameters, get the generic
1727         method definition and ask it whether we have variable arguments.
1728
1729 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
1730
1731         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
1732         routines to check if a type is an enumerable/enumerator allow
1733         classes that implement the IEnumerable or IEnumerator interfaces.
1734
1735         * class.cs (Property, Operator): Implement IIteratorContainer, and
1736         implement SetYields.
1737
1738         (Property.Define): Do the block swapping for get_methods in the
1739         context of iterators.   We need to check if Properties also
1740         include indexers or not.
1741
1742         (Operator): Assign the Block before invoking the
1743         OperatorMethod.Define, so we can trigger the Iterator code
1744         replacement. 
1745
1746         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
1747         Property and Operator classes are not created when we parse the
1748         declarator but until we have the block completed, so we use a
1749         singleton SimpleIteratorContainer.Simple to flag whether the
1750         SetYields has been invoked.
1751
1752         We propagate this setting then to the Property or the Operator to
1753         allow the `yield' to function.
1754
1755 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
1756
1757         * codegen.cs: Implemented attribute support for modules.
1758         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
1759         Assembly/Module functionality.
1760
1761         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
1762         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
1763         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
1764
1765 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
1766
1767         * interface.cs (FindMembers): The operation is performed on all base
1768         interfaces and not only on the first. It is required for future CLS Compliance patch.
1769
1770 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
1771
1772         * statement.cs, codegen.cs:
1773         This patch deals with patterns such as:
1774
1775         public class List : IEnumerable {
1776
1777                 public MyEnumerator GetEnumerator () {
1778                         return new MyEnumerator(this);
1779                 }
1780
1781                 IEnumerator IEnumerable.GetEnumerator () {
1782                         ...
1783                 }
1784                 
1785                 public struct MyEnumerator : IEnumerator {
1786                         ...
1787                 }
1788         }
1789
1790         Before, there were a few things we did wrong:
1791         1) we would emit callvirt on a struct, which is illegal
1792         2) we emited ldarg when we needed to emit ldarga
1793         3) we would mistakenly call the interface methods on an enumerator
1794         type that derived from IEnumerator and was in another assembly. For example:
1795
1796         public class MyEnumerator : IEnumerator
1797
1798         Would have the interface methods called, even if there were public impls of the
1799         method. In a struct, this lead to invalid IL code.
1800
1801 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
1802
1803         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
1804           renamed to Emit.
1805
1806         * delegate.cs (Define): Fixed crash when delegate type is undefined.
1807
1808 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
1809
1810         * cs-parser.jay: Fix small regression: we were not testing V2
1811         compiler features correctly.
1812
1813         * interface.cs: If the emit context is null, then create one
1814
1815 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
1816
1817         * decl.cs (GetSignatureForError): New virtual method to get full name
1818           for error messages.
1819
1820         * attribute.cs (IAttributeSupport): New interface for attribute setting.
1821           Now it is possible to rewrite ApplyAttributes method to be less if/else.
1822
1823         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
1824           Duplicated members and code in these classes has been removed.
1825           Better encapsulation in these classes.
1826
1827 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
1828
1829         * assign.cs (Assign.DoResolve): When dealing with compound
1830         assignments, there is a new rule in ECMA C# 2.4 (might have been
1831         there before, but it is documented here) that states that in:
1832
1833         a op= b;
1834
1835         If b is of type int, and the `op' is a shift-operator, then the
1836         above is evaluated as:
1837
1838         a = (int) a op b 
1839
1840         * expression.cs (Binary.ResolveOperator): Instead of testing for
1841         int/uint/long/ulong, try to implicitly convert to any of those
1842         types and use that in pointer arithmetic.
1843
1844         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
1845         method to print information for from the type, not from the
1846         null-method we were given.
1847
1848 2004-02-01  Duncan Mak  <duncan@ximian.com>
1849
1850         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
1851         parsing for cmd, fixes bug #53694.
1852
1853 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
1854
1855         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
1856         in the member name duplication tests. Property and operator name duplication
1857         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
1858
1859 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
1860
1861         * interface.cs (PopulateMethod): Fixed crash when interface method
1862         returns not existing type (error test cs0246-3.cs).
1863
1864 2004-02-02  Ravi Pratap M <ravi@ximian.com>
1865
1866         * cs-parser.jay (interface_accessors): Re-write actions to also
1867         store attributes attached to get and set methods. Fix spelling
1868         while at it.
1869
1870         (inteface_property_declaration): Modify accordingly.
1871
1872         (InterfaceAccessorInfo): New helper class to store information to pass
1873         around between rules that use interface_accessors.
1874
1875         * interface.cs (Emit): Apply attributes on the get and set
1876         accessors of properties and indexers too.
1877
1878         * attribute.cs (ApplyAttributes): Modify accordingly to use the
1879         right MethodBuilder when applying attributes to the get and set accessors.
1880
1881 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
1882
1883         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
1884
1885 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
1886
1887         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
1888
1889 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
1890
1891         * cs-parser.jay: Remove YIELD token, instead use the new grammar
1892         changes that treat `yield' specially when present before `break'
1893         or `return' tokens.
1894
1895         * cs-tokenizer.cs: yield is no longer a keyword.
1896
1897 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
1898
1899         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
1900         setting for default constructors.
1901         For default constructors are almost every time set wrong Modifier. The
1902         generated IL code has been alright. But inside mcs this values was
1903         wrong and this was reason why several of my CLS Compliance tests
1904         failed.
1905
1906 2004-02-27  Martin Baulig  <martin@ximian.com>
1907
1908         * generics.cs (ConstructedType.ResolveType): Make the nested type
1909         stuff actually work.
1910
1911 2004-02-25  Martin Baulig  <martin@ximian.com>
1912
1913         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
1914         property; returns the type parameters just from the current type,
1915         ie. with the ones from outer classes.
1916         (DeclSpace.LookupGeneric): First search in the current class, then
1917         in outer classes.
1918         (DeclSpace.initialize_type_params): When hiding a type parameter
1919         from an outer class, put it into the `type_param_list' anyways.
1920
1921         * expression.cs (MemberAccess.expr): Made this field protected.
1922
1923         * class.cs (TypeContainer.Define): The `CurrentType' just contains
1924         the type parameters from the current class.
1925
1926         * generic.cs (ConstructedType.ResolveType): Support nested generic
1927         types by taking the type parameters which we inherit from outer
1928         classes into account.
1929         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
1930         support for nested generic types.
1931
1932 2004-02-23  Martin Baulig  <martin@ximian.com>
1933
1934         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
1935         field and check whether we're nested inside a generic type.
1936         (DeclSpace.ResolveType): If we're resolving to a generic type
1937         definition, create a ConstructedType and return its resolved type.
1938         (DeclSpace.initialize_type_params): New private method;
1939         initializes the `type_param_list' field from the type parameters
1940         from this and all enclosing classes.
1941         (DeclSpace.TypeParameters): Call initialize_type_params() unless
1942         we're already initialized.
1943
1944 2004-02-23  Martin Baulig  <martin@ximian.com>
1945
1946         * class.cs (Method.Define): Create the generic method before
1947         calling DoDefine().
1948         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
1949         the TypeContainer one); we use this for generic methods.
1950
1951         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
1952         parent's TypeBuilder.
1953
1954 2004-02-18  Martin Baulig  <martin@ximian.com>
1955
1956         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
1957         to check for equality.
1958
1959 2004-02-05  Martin Baulig  <martin@ximian.com>
1960
1961         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
1962         `ec.TypeContainer.CurrentType', use it instead of
1963         `ec.ContainerType' to check whether we're in the type's ctor.
1964
1965 2004-01-29  Martin Baulig  <martin@ximian.com>
1966
1967         * expression.cs (Invocation.DoResolve): If we're a
1968         `ConstructedType', then we're actually a generic method, so
1969         rewrite the expr as a GenericMemberAccess.
1970
1971         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
1972         here; manually parse it into a string.
1973
1974 2004-01-28  Martin Baulig  <martin@ximian.com>
1975
1976         * typemanager.cs (TypeManager.IsEqual): New static method.
1977         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
1978         check for equality instead of using `=='.
1979
1980 2004-01-26  Martin Baulig  <martin@ximian.com>
1981
1982         * decl.cs (DeclSpace.CurrentType): New public field.
1983
1984         * expression.cs (This.ResolveBase): If we have an
1985         `ec.TypeContainer.CurrentType', use it instead of
1986         `ec.ContainerType'.
1987
1988         * class.cs (TypeContainer.DefineType): If we're a generic type,
1989         create the `CurrentType' (unresolved).
1990         (TypeContainer.GenericType): New private field.
1991         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
1992         it and store it in `GenericType' before creating the MemberCache.
1993         (TypeContainer.GetMembers): If we have a `GenericType', call
1994         TypeManager.FindMembers() on it.
1995
1996         * interface.cs (Interface.GenericType): New private field.
1997         (Interface.DefineType): If we're a generic type, create the
1998         `CurrentType' (unresolved).
1999         (Interface.DefineMembers): If we have a `CurrentType', resolve it
2000         and store it in `GenericType' before creating the MemberCache.
2001         (Interface.GetMembers): If we have a `GenericType', call
2002         TypeManager.FindMembers() on it.
2003
2004 2004-01-22  Martin Baulig  <martin@ximian.com>
2005
2006         * cs-parser.jay (namespace_or_type_name): Return an Expression,
2007         not a QualifiedIdentifier.  This is what `type_name_expression'
2008         was previously doing.
2009         (type_name_expression): Removed; the code is now in
2010         `namespace_or_type_name'.
2011         (qualified_identifier): Removed, use `namespace_or_type_name'
2012         instead.
2013         (QualifiedIdentifier): Removed this class.      
2014
2015 2004-01-22  Martin Baulig  <martin@ximian.com>
2016
2017         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
2018         not a string as alias name.
2019
2020 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
2021
2022         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
2023         #52730 bug, and instead compute correctly the need to use a
2024         temporary variable when requesting an address based on the
2025         static/instace modified of the field and the constructor.
2026  
2027 2004-01-21  Martin Baulig  <martin@ximian.com>
2028
2029         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
2030         class and namespace before looking up aliases.  Fixes #52517.
2031
2032 2004-01-21  Martin Baulig  <martin@ximian.com>
2033
2034         * flowanalysis.cs (UsageVector.Merge): Allow variables being
2035         assinged in a 'try'; fixes exception4.cs.
2036
2037 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2038         * class.cs : Implemented parameter-less constructor for TypeContainer
2039
2040         * decl.cs: Attributes are now stored here. New property OptAttributes
2041
2042         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
2043
2044         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
2045
2046 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2047
2048         * typemanager.cs (CSharpSignature): Now reports also inner class name.
2049           (CSharpSignature): New method for indexer and property signature.
2050
2051 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2052
2053         * pending.cs (IsVirtualFilter): Faster implementation.
2054
2055 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2056
2057         * typemanager.cs: Avoid inclusion of same assembly more than once.
2058
2059 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2060
2061         * cs-parser.jay: Fixed problem where the last assembly attribute
2062           has been applied also to following declaration (class, struct, etc.)
2063           
2064 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2065
2066         * class.cs: Added error CS0538, CS0539 reporting.
2067         Fixed crash on Microsoft runtime when field type is void.
2068
2069         * cs-parser.jay: Added error CS0537 reporting.
2070
2071         * pending.cs: Added error CS0535 reporting.
2072         Improved error report for errors CS0536, CS0534.
2073
2074 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
2075
2076         Merge a few bits from the Anonymous Method MCS tree.
2077
2078         * statement.cs (ToplevelBlock): New class for toplevel methods,
2079         will hold anonymous methods, lifted variables.
2080
2081         * cs-parser.jay: Create toplevel blocks for delegates and for
2082         regular blocks of code. 
2083
2084 2004-01-20  Martin Baulig  <martin@ximian.com>
2085
2086         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
2087         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
2088         and `NeedExplicitReturn'; added `IsLastStatement'.
2089         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
2090         have a `ReturnLabel' or we're not unreachable.
2091
2092         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
2093         child's reachability; don't just override ours with it.  Fixes
2094         #58058 (lluis's example).
2095         (FlowBranching): Added public InTryOrCatch(), InCatch(),
2096         InFinally(), InLoop(), InSwitch() and
2097         BreakCrossesTryCatchBoundary() methods.
2098
2099         * statement.cs (Return): Do all error checking in Resolve().
2100         Unless we are the last statement in a top-level block, always
2101         create a return label and jump to it.
2102         (Break, Continue): Do all error checking in Resolve(); also make
2103         sure we aren't leaving a `finally'.
2104         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
2105         statement in a top-level block.
2106         (Block.Flags): Added `IsDestructor'.
2107         (Block.IsDestructor): New public property.
2108
2109 2004-01-20  Martin Baulig  <martin@ximian.com>
2110
2111         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
2112
2113 2004-01-20  Martin Baulig  <martin@ximian.com>
2114
2115         * statement.cs (Statement.ResolveUnreachable): New public method.
2116         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
2117         (Block.Resolve): Resolve unreachable statements.
2118
2119 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
2120
2121         * expression.cs: We need to fix the case where we do
2122         not have a temp variable here.
2123
2124         * assign.cs: Only expression compound assignments need
2125         temporary variables.
2126
2127 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
2128
2129         * flowanalysis.cs: Reduce memory allocation in a few ways:
2130           - A block with no variables should not allocate a bit
2131             vector for itself.
2132           - A method with no out parameters does not need any tracking
2133             for assignment of the parameters, so we need not allocate
2134             any data for it.
2135           - The arrays:
2136                 public readonly Type[] VariableTypes;
2137                 public readonly string[] VariableNames;
2138             Are redundant. The data is already stored in the variable
2139             map, so we need not allocate another array for it.
2140           - We need to add alot of checks for if (params | locals) == null
2141             due to the first two changes.
2142
2143 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
2144
2145         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
2146         implement IMemoryLocation, we store a copy on a local variable and
2147         take the address of it.  Patch from Benjamin Jemlich
2148
2149         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
2150         to use a special "type_name_expression" rule which reduces the
2151         number of "QualifiedIdentifier" classes created, and instead
2152         directly creates MemberAccess expressions.
2153
2154 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
2155
2156         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
2157         that fixes #52853.  Null literal assignment to ValueType
2158
2159         * class.cs (MethodData.Emit): Instead of checking the name of the
2160         method to determine if its a destructor, create a new derived
2161         class from Method called Destructor, and test for that.  
2162
2163         * cs-parser.jay: Create a Destructor object instead of a Method.  
2164
2165         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
2166
2167         Fixes: 52933
2168
2169 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
2170
2171         * expression.cs (Binary.ResolveOperator): Perform an implicit
2172         conversion from MethodGroups to their delegate types on the
2173         Addition operation.
2174
2175         * delegate.cs: Introduce a new class DelegateCreation that is the
2176         base class for `NewDelegate' and `ImplicitDelegateCreation',
2177         factor some code in here.
2178
2179         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
2180         conversion from MethodGroups to compatible delegate types. 
2181
2182         * ecore.cs (Expression.Resolve): Do not flag error 654
2183         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
2184         we allow conversions from MethodGroups to delegate types now.
2185
2186         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
2187         assignments in v2 either.
2188
2189 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
2190
2191         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
2192         static read-only fields in ctors.
2193
2194         Applied patch from Benjamin Jemlich 
2195
2196         * expression.cs (UnaryMutator): Avoid leaking local variables. 
2197
2198 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
2199
2200         * cs-tokenizer.cs (IsCastToken): Allow the various native types
2201         here to return true, as they can be used like this:
2202
2203                 (XXX) int.MEMBER ()
2204
2205         Fixed 49836 and all the other dups
2206
2207 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
2208
2209         * driver.cs: Implement /win32res and /win32icon.
2210
2211 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
2212
2213         * cs-parser.jay: Add a rule to improve error handling for the
2214         common mistake of placing modifiers after the type.
2215
2216 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
2217
2218         * cs-parser.jay (interface_event_declaration): Catch
2219         initialization of events on interfaces, and report cs0068
2220
2221         * cs-parser.jay (interface_event_declaration): Catch
2222         initialization of events. 
2223
2224         * ecore.cs: Better report missing constructors.
2225
2226         * expression.cs (Binary.ResolveOperator): My previous bug fix had
2227         the error reporting done in the wrong place.  Fix.
2228
2229         * expression.cs (Binary.ResolveOperator): Catch the 
2230         operator + (E x, E y) error earlier, and later allow for implicit
2231         conversions in operator +/- (E e, U x) from U to the underlying
2232         type of E.
2233
2234         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
2235         52596, if the container class is abstract, the default constructor
2236         is protected otherwise its public (before, we were always public).
2237
2238         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
2239         fixed statement.
2240
2241         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
2242         Jemlich that fixes bug #52597, MCS was generating invalid code for
2243         idisposable structs.   Thanks to Ben for following up with this
2244         bug as well.
2245
2246 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
2247
2248         * driver.cs: Allow assemblies without code to be generated, fixes
2249         52230.
2250
2251 2004-01-07  Nick Drochak <ndrochak@gol.com>
2252
2253         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
2254
2255 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
2256
2257         * cs-parser.jay: Add rules to improve error reporting if fields or
2258         methods are declared at the namespace level (error 116)
2259
2260         * Add rules to catch event add/remove
2261
2262 2004-01-04  David Sheldon <dave-mono@earth.li>
2263
2264   * expression.cs: Added matching ")" to error message for 
2265   CS0077
2266
2267 2004-01-03 Todd Berman <tberman@gentoo.org>
2268
2269         * ecore.cs, attribute.cs:
2270         Applying fix from #52429.
2271
2272 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2273
2274         * ecore.cs, expression.cs, statement.cs:
2275         Total rewrite of how we handle branching. We
2276         now handle complex boolean expressions with fewer
2277         jumps. As well if (x == 0) no longer emits a ceq.
2278
2279         if (x is Foo) is much faster now, because we generate
2280         better code.
2281
2282         Overall, we get a pretty big improvement on our benchmark
2283         tests. The code we generate is smaller and more readable.
2284
2285         I did a full two-stage bootstrap. The patch was reviewed
2286         by Martin and Miguel.
2287
2288 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2289
2290         * cs-parser.jay: Make primary_expression not take a QI.
2291         we dont need this because the member_access rule covers
2292         us here. So we replace the rule with just IDENTIFIER.
2293
2294         This has two good effects. First, we remove a s/r conflict.
2295         Second, we allocate many fewer QualifiedIdentifier objects.
2296
2297 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2298
2299         * attribute.cs: Handle MarshalAs attributes as pseudo, and
2300         set the correct information via SRE. This prevents
2301         hanging on the MS runtime. Fixes #29374.
2302
2303 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2304
2305         * convert.cs: correctly handle conversions to value types
2306         from Enum and ValueType as unboxing conversions.
2307
2308         Fixes bug #52569. Patch by Benjamin Jemlich.
2309
2310 2004-01-02  Ravi Pratap  <ravi@ximian.com>
2311
2312         * expression.cs (BetterConversion): Prefer int -> uint
2313         over int -> ulong (csc's behaviour). This fixed bug #52046.
2314
2315 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2316
2317         * decl.cs (MemberCache.FindMembers): now returns a
2318         MemberInfo [].
2319
2320         * typemanager.cs: In general, go with with ^^.
2321         (CopyNewMethods): take an IList.
2322         (RealMemberLookup): Only allocate an arraylist
2323         if we copy from two sets of methods.
2324
2325         This change basically does two things:
2326         1) Fewer array lists allocated due to CopyNewMethods.
2327         2) the explicit cast in MemberList costed ALOT.
2328
2329 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
2330
2331         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
2332         a hashtable to avoid needless string allocations when an identifier is
2333         used more than once (the common case).
2334
2335 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2336
2337         * pending.cs: MS's TypeBuilder.GetInterfaces ()
2338         is broken, it will not return anything. So, we
2339         have to use the information we have in mcs to
2340         do the task.
2341
2342         * typemanager.cs: Add a cache for GetInterfaces,
2343         since this will now be used more often (due to ^^)
2344
2345         (GetExplicitInterfaces) New method that gets the
2346         declared, not effective, interfaces on a type
2347         builder (eg, if you have interface IFoo, interface
2348         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
2349         { IBar }.
2350
2351         This patch makes MCS able to bootstrap itself on
2352         Windows again.
2353
2354 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2355
2356         * expression.cs: Remove the Nop's that Miguel put
2357         in by mistake.
2358
2359 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2360
2361         * report.cs, codegen.cs: Give the real stack trace to
2362         the error when an exception is thrown.
2363
2364 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2365
2366         * decl.cs: only allocate hashtables for ifaces if 
2367         it is an iface!
2368
2369 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2370
2371         * expression.cs: fix the error from cs0121-2.cs
2372         (a parent interface has two child interfaces that
2373         have a function with the same name and 0 params
2374         and the function is called through the parent).
2375
2376 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2377
2378         * class.cs, rootcontext.cs, typmanager.cs: do not
2379         leak pointers.
2380
2381 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2382
2383         * codegen.cs: remove stack for the ec flow branching.
2384         It is already a linked list, so no need.
2385
2386 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
2387
2388         * Makefile: Allow custom profiler here.
2389
2390 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2391
2392         * typemanager.cs (LookupType):
2393           - Use a static char [], because split takes
2394             a param array for args, so it was allocating
2395             every time.
2396           - Do not store true in a hashtable, it boxes.
2397
2398 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2399
2400         * flowanalysis.cs: bytify common enums.
2401
2402 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2403
2404         * modifiers.cs: Add a new set of flags for the
2405         flags allowed on explicit interface impls.
2406         * cs-parser.jay: catch the use of modifiers in
2407         interfaces correctly.
2408         * class.cs: catch private void IFoo.Blah ().
2409
2410         All related to bug #50572.
2411
2412 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2413
2414         * decl.cs: Rewrite the consistant accessability checking.
2415         Accessability is not linear, it must be implemented in
2416         a tableish way. Fixes #49704.
2417
2418 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2419
2420         * expression.cs: Handle negation in a checked context.
2421         We must use subtraction from zero. Fixes #38674.
2422
2423 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2424
2425         * class.cs: Ignore static void main in DLLs.
2426         * rootcontext.cs: Handle the target type here,
2427         since we are have to access it from class.cs
2428         * driver.cs: account for the above.
2429
2430 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2431
2432         * report.cs: Give line numbers and files if available.
2433
2434 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
2435
2436         * driver.cs: Implement /addmodule.
2437
2438         * typemanager.cs:  Change 'modules' field so it now contains Modules not
2439         ModuleBuilders.
2440
2441 2003-12-20  Martin Baulig  <martin@ximian.com>
2442
2443         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
2444         (FieldBase.IsAssigned): Removed this field.
2445         (FieldBase.SetAssigned): New public method.
2446         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
2447
2448 2003-12-20  Martin Baulig  <martin@ximian.com>
2449
2450         * expression.cs (LocalVariableReference.DoResolve): Don't set
2451         `vi.Used' if we're called from DoResolveLValue().
2452
2453         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
2454         returns the usage vector it just merged into the current one -
2455         pass this one to UsageWarning().
2456         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
2457         of the `EmitContext', don't call this recursively on our children.
2458
2459 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
2460
2461         * driver.cs: Implement /target:module.
2462
2463 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
2464
2465         * support.cs (CharArrayHashtable): New helper class.
2466
2467         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
2468         char arrays, not strings, so we can avoid creating a string in
2469         consume_identifier if the identifier is a keyword.
2470
2471 2003-12-16  Martin Baulig  <martin@ximian.com>
2472
2473         * statement.cs (LocalInfo.Assigned): Removed this property.
2474         (LocalInfo.Flags): Removed `Assigned'.
2475         (LocalInfo.IsAssigned): New public method; takes the EmitContext
2476         and uses flow analysis.
2477         (Block.UsageWarning): Made this method private.
2478         (Block.Resolve): Call UsageWarning() if appropriate.
2479
2480         * expression.cs (LocalVariableReference.DoResolve): Always set
2481         LocalInfo.Used here.
2482
2483 2003-12-13  Martin Baulig  <martin@ximian.com>
2484
2485         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
2486         any value here; we're now using flow analysis to figure out
2487         whether a statement/block returns a value.
2488
2489 2003-12-13  Martin Baulig  <martin@ximian.com>
2490
2491         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
2492         working again.
2493         (FlowBranching.MergeFinally): Don't call
2494         `branching.CheckOutParameters()' here, this is called in
2495         MergeTopBlock().
2496         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
2497         when adding the `finally' vector.       
2498
2499 2003-12-13  Martin Baulig  <martin@ximian.com>
2500
2501         * flowanalysis.cs
2502         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
2503         actually work and also fix #48962.
2504
2505 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2506
2507         * decl.cs: Do not check System.Object for nested types,
2508         since we know it does not have any. Big bang for buck:
2509
2510         BEFORE:
2511            Run 1:   8.35 seconds
2512            Run 2:   8.32 seconds
2513            corlib:  17.99 seconds
2514         AFTER:
2515            Run 1:   8.17 seconds
2516            Run 2:   8.17 seconds
2517            corlib:  17.39 seconds
2518
2519 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
2520
2521         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
2522         time we are returning 0 members, so we save alot here.
2523
2524 2003-12-11  Martin Baulig  <martin@ximian.com>
2525
2526         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
2527         `MergeChild()', also just take the `FlowBranching' as argument;
2528         call Merge() on it and return the result.
2529         (FlowBranching.Merge): We don't need to do anything if we just
2530         have one sibling.
2531
2532 2003-12-11  Martin Baulig  <martin@ximian.com>
2533
2534         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
2535         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
2536         Maurer for this idea.
2537
2538 2003-12-11  Martin Baulig  <martin@ximian.com>
2539
2540         * flowanalysis.cs (MergeResult): This class is now gone; we now
2541         use the `UsageVector' for this.  The reason for this is that if a
2542         branching just has one sibling, we don't need to "merge" them at
2543         all - that's the next step to do.
2544         (FlowBranching.Merge): We now return a `UsageVector' instead of a
2545         `MergeResult'.
2546
2547 2003-12-11  Martin Baulig  <martin@ximian.com>
2548
2549         Reworked flow analyis and made it more precise and bug-free.  The
2550         most important change is that we're now using a special `Reachability'
2551         class instead of having "magic" meanings of `FlowReturns'.  I'll
2552         do some more cleanups and optimizations and also add some more
2553         documentation this week.
2554
2555         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
2556         largely reworked this class.
2557         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
2558         the new `Reachability' class instead of having "magic" values here.
2559         (FlowBranching): We're now using an instance of `Reachability'
2560         instead of having separate `Returns', `Breaks' etc. fields.
2561
2562         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
2563         based on flow analysis; ignore the return value of block.Emit ().
2564
2565 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
2566
2567         * driver.cs typemanager.cs: Find the mono extensions to corlib even
2568         if they are private.
2569
2570 2003-12-09  Martin Baulig  <martin@ximian.com>
2571
2572         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
2573         call them directly on the UsageVector.
2574
2575 2003-12-09  Martin Baulig  <martin@ximian.com>
2576
2577         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
2578         Changed return type from `FlowReturns' to `Reachability'.
2579
2580 2003-12-09  Martin Baulig  <martin@ximian.com>
2581
2582         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
2583         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
2584         `Reachable' fields with a single `Reachability' one.
2585
2586 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2587
2588         * class.cs (FindMembers): Remove foreach's.
2589
2590         Bootstrap times:
2591
2592         BEFORE
2593                 Run 1:   8.74 seconds
2594                 Run 2:   8.71 seconds
2595
2596         AFTER
2597                 Run 1:   8.64 seconds
2598                 Run 2:   8.58 seconds
2599
2600
2601 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2602
2603         * cs-parser.jay:
2604         * gen-treedump.cs:
2605         * statement.cs:
2606         This patch does a few things:
2607                 1. EmptyStatement is now a singleton, so it is never reallocated.
2608                 2. All blah is EmptyStatement constructs have been changed to
2609                    blah == EmptyStatement.Value, which is much faster and valid
2610                    now that EmptyStatement is a singleton.
2611                 3. When resolving a block, rather than allocating a new array for
2612                    the non-empty statements, empty statements are replaced with
2613                    EmptyStatement.Value
2614                 4. Some recursive functions have been made non-recursive.
2615         Mainly the performance impact is from (3), however (1) and (2) are needed for
2616         this to work. (4) does not make a big difference in normal situations, however
2617         it makes the profile look saner.
2618
2619         Bootstrap times:
2620
2621         BEFORE
2622         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2623         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2624         Total memory allocated: 56397 KB
2625
2626         AFTER
2627         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
2628         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
2629         Total memory allocated: 55666 KB
2630
2631 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2632
2633         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
2634         than the hashtable in a hashtable version
2635
2636         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
2637         we always end up concating a string. This results in a huge perf
2638         loss, because many strings have to be tracked by the GC. In this
2639         patch, we first use a hashtable that works with two keys, so that
2640         the strings do not need to be concat'ed.
2641
2642         Bootstrap times:
2643         BEFORE
2644                 Run 1:   8.74 seconds
2645                 Run 2:   8.71 seconds
2646
2647         AFTER
2648                 Run 1:   8.65 seconds
2649                 Run 2:   8.56 seconds
2650
2651 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2652
2653         * Makefile: Add a new target `do-time' that does a quick and simple
2654         profile, leaving easy to parse output.
2655
2656 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
2657
2658         * codegen.cs (Init): Create the dynamic assembly with 
2659         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
2660
2661 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2662
2663         * support.cs: Make the PtrHashtable use only one
2664         instance of its comparer.
2665
2666 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
2667
2668         * typemanager.cs: Fix lookup of GetNamespaces.
2669
2670 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
2671
2672         * expression.cs: Removed redundant line.
2673
2674         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
2675         ArrayLists, use for loops with bounds.  
2676
2677         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
2678         arraylist.
2679
2680         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
2681         arraylists, use for loop with bounds.
2682
2683         The above three changes give us a 0.071 second performance
2684         improvement out of 3.294 seconds down to 3.223.  On my machine
2685         the above changes reduced the memory usage by 1,387 KB during
2686         compiler bootstrap.
2687
2688         * cs-parser.jay (QualifiedIdentifier): New class used to represent
2689         QualifiedIdentifiers.  Before we created a new string through
2690         concatenation, and mostly later on, the result would be
2691         manipulated by DecomposeQI through string manipulation.
2692
2693         This reduced the compiler memory usage for bootstrapping from
2694         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
2695         compile times in 0.05 seconds.
2696
2697 2003-11-28  Dick Porter  <dick@ximian.com>
2698
2699         * support.cs: Do string compares with the Invariant culture.
2700
2701         * rootcontext.cs: 
2702         * gen-treedump.cs: 
2703         * expression.cs: 
2704         * driver.cs: 
2705         * decl.cs: 
2706         * codegen.cs: 
2707         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
2708         the comparison is done with the Invariant culture.
2709
2710 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
2711
2712         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
2713         GetEnumerator method.
2714
2715         (ProbeCollectionType): Iterate starting at the most specific type
2716         upwards looking for a GetEnumerator
2717
2718         * expression.cs: Shift count can be up to 31 for int/uint and 63
2719         for long/ulong.
2720
2721 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
2722
2723         * statement.cs (Block.LookupLabel): Also look for the label on the
2724         children blocks.  Use a hash table to keep track of visited
2725         nodes. 
2726
2727         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
2728         we actually did transform the other operand, otherwise fall back
2729         to the common codepath that casts to long.
2730
2731         * cs-tokenizer.cs: Use the same code pattern as the int case.
2732         Maybe I should do the parsing myself, and avoid depending on the
2733         Parse routines to get this done.
2734
2735 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
2736
2737         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
2738         which fixes bug 51347.  This time test it.
2739
2740         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
2741         attributes for example can not tell the difference between these.
2742         The difference was only a syntax feature of the language. 
2743
2744         * attribute.cs: Apply attributes to delegates.
2745
2746         * delegate.cs: Call the apply attributes method.
2747
2748 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
2749
2750         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
2751         comparing 0 vs Byte.MinValue, not the value
2752
2753         (ImplicitConversionRequired): When reporting a conversion error,
2754         use error 31 to print out the constant error instead of the
2755         simpler 29.
2756
2757         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
2758         which fixes bug 51347.
2759
2760 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
2761
2762         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
2763         which fixes the -warnaserror command line option.
2764
2765 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
2766
2767         * cfold.cs (DoNumericPromotions): During constant folding of
2768         additions on UIntConstant, special case intconstants with
2769         IntConstants like we do on the expression binary operator. 
2770
2771 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
2772
2773         * convert.cs (ImplicitReferenceConversion): We were missing a case
2774         (System.Enum are not value types or class types, so we need to
2775         classify them separatedly).
2776
2777         * driver.cs: We do not support error 2007.
2778
2779 2003-11-12 Jackson Harper <jackson@ximian.com>
2780
2781         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
2782         system directory. Also use the full file name so users can
2783         libraries names mscorlib-o-tron.dll in a non system dir.
2784         
2785 2004-01-04  David Sheldon <dave-mono@earth.li>
2786
2787         * expression.cs: Added matching ")" to error message for CS0077.
2788
2789 2003-12-19  Martin Baulig  <martin@ximian.com>
2790
2791         * typemanager.cs (TypeManager.IsEqualGenericType): New public
2792         static method; see documentation in the method.
2793         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
2794
2795         * convert.cs (Convert.ImplicitReferenceConversion,
2796         Convert.ImplicitReferenceConversionExists): Add support for
2797         generic type declarations; see gen-36.cs.
2798
2799 2003-12-19  Martin Baulig  <martin@ximian.com>
2800
2801         * pending.cs (Pending.InterfaceMethod): Use
2802         `Type.IsAssignableFrom()' instead of `=='.
2803
2804 2003-12-18  Martin Baulig  <martin@ximian.com>
2805
2806         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
2807         byref types first.
2808
2809         * convert.cs (Convert.ImplicitStandardConversionExists): Use
2810         `expr_type.Equals (target_type)' instead of `=='.
2811
2812 2003-12-08  Martin Baulig  <martin@ximian.com>
2813
2814         * generics.cs (Constraints.Types): Removed.
2815         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
2816         to Type's.
2817         (Constraints.ResolveTypes): New public method; resolves the
2818         TypeExpr's to Type's.
2819         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
2820         longer takes the constraints.
2821         (TypeParameter.DefineMethod): Likewise.
2822         (TypeParameter.DefineType): New public method.  Calls
2823         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
2824         the constraints.
2825
2826 2003-12-08  Martin Baulig  <martin@ximian.com>
2827
2828         * convert.cs (Convert.ImplicitConversionStandard): Use
2829         `expr_type.Equals (target_type)' instead of `=='.
2830
2831 2003-12-08  Martin Baulig  <martin@ximian.com>
2832
2833         * typemanager.cs (TypeManager.GetReferenceType): Call
2834         `Type.MakeByRefType ()'.
2835
2836 2003-12-08  Martin Baulig  <martin@ximian.com>
2837
2838         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
2839         just has some special meaning in some situations.  For instance,
2840         it is allowed to use `where' as the name of a variable etc.
2841
2842 2003-12-04  Martin Baulig  <martin@ximian.com>
2843
2844         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
2845         `Type.MakeArrayType()' for array types.
2846
2847 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
2848
2849         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
2850         debugging message.
2851
2852         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
2853         corlib to compile.
2854
2855 2003-11-16  Martin Baulig  <martin@ximian.com>
2856
2857         * codegen.cs (EmitContext.IsGeneric): Removed.
2858
2859         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
2860         ResolveGeneric() on the DeclSpace.
2861
2862 2003-11-16  Martin Baulig  <martin@ximian.com>
2863
2864         * generic.cs (TypeArguments.Resolve):
2865         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
2866         `ResolveType()' on it to get the Type.
2867
2868 2003-11-15  Martin Baulig  <martin@ximian.com>
2869
2870         * generic.cs (ConstructedType.GetInterfaces): Override this.
2871
2872 2003-11-14  Martin Baulig  <martin@ximian.com>
2873
2874         * interface.cs (Interface.DefineType): Define all type parameters
2875         before adding the interfaces we inherit.
2876
2877 2003-11-11  Martin Baulig  <martin@ximian.com>
2878
2879         * generic.cs (ConstructedType.ResolveType): Always call
2880         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
2881
2882 2003-11-10  Martin Baulig  <martin@ximian.com>
2883
2884         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
2885         (TypeManager.InitCoreTypes): Initialize them here, but instead of
2886         calling `ResolveType()' on them, directly assign their `Type'.
2887
2888 2003-11-08  Martin Baulig  <martin@ximian.com>
2889
2890         * generic.cs (ConstructedType): Override `IsClass' etc.
2891
2892 2003-11-08  Martin Baulig  <martin@ximian.com>
2893
2894         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
2895         return value and the `out parent' parameter.
2896         (TypeContainer.DefineType): Moved the CS0644 check into
2897         GetClassBases().  Don't pass the interface types to the
2898         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
2899         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
2900
2901         * ecore.cs (TypeExpr.IsAttribute): New property.
2902         (TypeExpr.GetInterfaces): New method.
2903
2904         * interface.cs (Interface.GetInterfaceTypeByName): Return a
2905         TypeExpr instead of a Type.
2906         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
2907         (Interface.DefineType): Don't pass the interface types to the
2908         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
2909         them later and then call `TypeBulider.AddInterfaceImplementation()'.
2910
2911         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
2912         instead of a `Type[]'.
2913         (TypeManager.RegisterBuilder): Likewise.
2914         (TypeManager.AddUserInterface): Likewise.
2915         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
2916         `Type[]' and also return a `TypeExpr[]'.
2917         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
2918
2919 2003-11-08  Martin Baulig  <martin@ximian.com>
2920
2921         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
2922         Expression.     
2923
2924 2003-11-08  Martin Baulig  <martin@ximian.com>
2925
2926         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
2927         TypeManager.ResolveExpressionTypes().
2928
2929         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
2930         instead of an Expression.
2931         (TypeExpr): This is now an abstract base class for `TypeExpression'.
2932         (TypeExpression): New public class; formerly known as `TypeExpr'.
2933
2934         * expression.cs (ComposedCast): Derive from TypeExpr.
2935
2936         * typemanager.cs (TypeManager.system_*_expr): These are now
2937         TypExpr's instead of Expression's.
2938         (TypeManager.ResolveExpressionTypes): New public static function;
2939         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
2940         of them.        
2941
2942 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
2943
2944         * expression.cs (New.DoResolve): Do not dereference value that
2945         might be a null return.
2946
2947         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
2948         sure that the constant value has the right type.  Fixes an
2949         unreported bug, similar to 50425.
2950
2951         * const.cs (Const.LookupConstantValue): Call
2952         ImplicitStandardConversionExists before doing a conversion to
2953         avoid havng the TypeManager.ChangeType do conversions.
2954
2955         Reduced the number of casts used
2956
2957         (Const.ChangeType): New routine to enable reuse of the constant
2958         type changing code from statement.
2959
2960         * typemanager.cs (ChangeType): Move common initialization to
2961         static global variables.
2962
2963         Fixes #50425.
2964
2965         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
2966         every value type to go through, even if it was void.  Fix that. 
2967
2968         * cs-tokenizer.cs: Use is_identifier_start_character on the start
2969         character of the define, and the is_identifier_part_character for
2970         the rest of the string.
2971
2972 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
2973
2974         * expression.cs (UnaryMutator.EmitCode): When I updated
2975         LocalVariableReference.DoResolve, I overdid it, and dropped an
2976         optimization done on local variable references.
2977
2978 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
2979
2980         * ecore.cs: Convert the return from Ldlen into an int.
2981
2982 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
2983
2984         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
2985         the accessibility, this is a special case for toplevel non-public
2986         classes (internal for instance).
2987
2988 2003-10-20  Nick Drochak <ndrochak@gol.com>
2989
2990         * ecore.cs: Fix typo and build.  Needed another right paren.
2991
2992 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
2993
2994         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
2995         `internal' case regular and protected, but not allowing protected
2996         to be evaluated later.  Bug 49840
2997
2998 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
2999
3000         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
3001         to kb.Nlast, and not the kb.nFirst to isolate the switch
3002         statement.
3003
3004         Extract the underlying type, so enumerations of long/ulong are
3005         treated like long/ulong.
3006
3007 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
3008
3009         * expression.cs (New): Overload the meaning of RequestedType to
3010         track the possible creation of the NewDelegate type, since
3011         DoResolve is invoked more than once for new constructors on field
3012         initialization.
3013
3014         See bugs: #48800 and #37014
3015
3016         * cs-parser.jay (declare_local_constants): Take an arraylist
3017         instead of a single constant.
3018
3019         (local_constant_declaration): It should take a
3020         constant_declarators, not a constant_declarator.  Fixes 49487
3021
3022         * convert.cs: Fix error report.
3023
3024 2003-10-13 Jackson Harper <jackson@ximian.com>
3025
3026         * typemanager.cs (TypeToCoreType): Add float and double this fixes
3027         bug #49611
3028         
3029 2003-11-03  Martin Baulig  <martin@ximian.com>
3030
3031         * expression.cs (ArrayAccess.GetStoreOpcode): Added
3032         `out bool has_type_arg'; if set, we need to pass the type to
3033         ig.Emit().
3034         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
3035         Stelem_Any/Ldelem_Any for generic parameters.   
3036
3037 2003-11-02  Martin Baulig  <martin@ximian.com>
3038
3039         * expression.cs (Invocation.EmitCall): Use
3040         `TypeManager.IsValueType()' to check whether it's a value type.
3041         Don't set `struct_call' when calling a method on a type parameter.
3042
3043 2003-11-02  Martin Baulig  <martin@ximian.com>
3044
3045         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
3046         and removed the TypeBuilder argument.
3047
3048         * typemanager.cs (TypeManager.IsValueType): Return
3049         `t.IsGenericParameter || t.IsValueType'.
3050
3051 2003-10-25  Martin Baulig  <martin@ximian.com>
3052
3053         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
3054         call ConstructedType.Resolve() on it.
3055
3056         * generic.cs (ConstructedType.Resolve): Set `type' on success.
3057
3058 2003-10-25  Martin Baulig  <martin@ximian.com>
3059
3060         * class.cs (TypeContainer.GetClassBases): Changed
3061         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
3062         CS8214 reporting here.
3063         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
3064         instead of a `Type' for our parent.  In case of a recursive
3065         declaration (see tests/gen-23.cs for an example), our parent is a
3066         ConstructedType and it doesn't have its type set.  So, first
3067         create our own TypeBuilder, then call constructed.Resolve() to get
3068         the parent's type and finally TypeBuilder.SetParent() it.
3069
3070         * ecore.cs (TypeExpr.Name): New public virtual property.
3071
3072         * generic.cs
3073         (ConstructedType): We're now a TypeExpr and not just an Expression.
3074         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
3075         arguments here; this is done later.
3076         (ConstructedType.Resolve): New public method to resolve the type
3077         arguments and bind them.
3078
3079 2003-10-21  Martin Baulig  <martin@ximian.com>
3080
3081         * convert.cs: Use `TypeManager.IsValueType' instead of
3082         'type.IsValueType' everywhere.
3083
3084         * typemanager.cs (TypeManager.IsValueType): Return true for type
3085         parameters.  The reason for this is that we need to box a type
3086         parameter when converting it to a reference type.
3087
3088         * cs-parser.jay: Added support for default value expressions.
3089
3090         * generics.cs (DefaultValueExpression): New public class.       
3091
3092 2003-10-17  Martin Baulig  <martin@ximian.com>
3093
3094         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
3095         TypeContainer so we can also use this for Interfaces.
3096         (TypeParameter.Resolve): Likewise.
3097
3098         * interface.cs (Interface.DefineType): Added support for generic
3099         interfaces.
3100
3101         * cs-parser.jay: Added support for generic structs and interfaces.
3102
3103 2003-10-17  Martin Baulig  <martin@ximian.com>
3104
3105         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
3106         call generic methods :-)
3107
3108 2003-10-16  Martin Baulig  <martin@ximian.com>
3109
3110         * cs-parser.jay (namespace_or_type_name): Only create a
3111         GenericMemberAccess if we actually have type arguments.
3112
3113 2003-10-13  Martin Baulig  <martin@ximian.com>
3114
3115         * class.cs (Method.Define): If we're a generic method, call
3116         TypeBuilder.DefineGenericMethod () before resolving
3117         the parameters.
3118         (MethodData): Added .ctor which takes an additional MethodBuilder
3119         argument; this is used for generic methods.
3120         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
3121         we already have a MethodBuilder.
3122
3123 2003-10-10  Martin Baulig  <martin@ximian.com>
3124
3125         * class.cs (Method): Added .ctor which takes a `GenericMethod'
3126         instead of a `DeclSpace'.  This is used for generic methods.
3127
3128         * cs-parser.jay (method_header): Added support for generic
3129         methods; create a `GenericMethod' instance and pass it to the
3130         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
3131         parameters and locals.
3132
3133         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
3134         since we already have the location.  Check whether we're a generic
3135         type declaration or a generic method and create the correct type
3136         parameter.
3137
3138         * generic.cs (TypeParameter.DefineMethod): New public method.
3139         (GenericMethod): New public class; derives from DeclSpace and is
3140         used for generic methods.       
3141
3142 2003-10-09  Martin Baulig  <martin@ximian.com>
3143
3144         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
3145         to the .ctor.
3146         (MethodCore.DoDefineParameters): Removed the TypeContainer
3147         argument; use the DeclSpace which was passed to the .ctor instead.
3148         (MethodCore.CheckParameter): Take a DeclSpace instead of a
3149         TypeContainer; we only need a DeclSpace here.
3150
3151 2003-10-09  Martin Baulig  <martin@ximian.com>
3152
3153         * class.cs (MethodData): Added additional `DeclSpace ds' argument
3154         to the .ctor.
3155         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
3156         EmitContext's .ctor.    
3157
3158 2003-10-09  Martin Baulig  <martin@ximian.com>
3159
3160         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
3161         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
3162         AsAccessible(), moved them as well.
3163
3164         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
3165
3166 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
3167
3168         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
3169         generation for >=, as spotted by Paolo, bug 48679.  
3170         Patch from David Waite.
3171
3172         * cs-tokenizer.cs: Add handling for #pragma.
3173
3174         * cs-parser.jay: Allow for both yield and yield return in the
3175         syntax.  The anti-cobolization of C# fight will go on!
3176
3177         * class.cs (TypeBuilder.DefineType): Catch error condition here
3178         (Parent.DefineType erroring out and returning null).
3179
3180         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
3181         coping with enumerations variables, we were mistakenly processing
3182         them as a regular value type instead of built-in types.  Fixes the
3183         bug #48063
3184
3185         * typemanager.cs (IsBuiltinOrEnum): New method.
3186
3187 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
3188
3189         * cs-parser.jay: Upgrade: yield now needs the return clause.
3190
3191 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
3192
3193         * cs-parser.jay : Renamed yyName to yyNames related to jay.
3194
3195 2003-09-29  Martin Baulig  <martin@ximian.com>
3196
3197         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
3198         inflated generic methods.
3199
3200         * generics.cs (ConstructedType): Distinguish between open and
3201         closed constructed types; correctly resolve the arguments.
3202
3203 2003-09-22  Martin Baulig  <martin@ximian.com>
3204
3205         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
3206         all type arguments meet their constraints.
3207
3208 2003-09-19  Martin Baulig  <martin@ximian.com>
3209
3210         * decl.cs (MemberCache.SetupCacheForInterface): Take a
3211         `MemberCache parent' argument.  Normally, an interface doesn't
3212         have a parent type except System.Object, but we use this in gmcs
3213         for generic type parameters.
3214
3215 2003-09-18  Martin Baulig  <martin@ximian.com>
3216
3217         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
3218         on `type.IsInterface'; don't check whether the type has a parent
3219         to determine whether it's an interface.
3220
3221 2003-09-17  Martin Baulig  <martin@ximian.com>
3222
3223         * generic.cs (ConstructedType.ToString): Always use `name' as the
3224         type name.
3225
3226 2003-09-15  Martin Baulig  <martin@ximian.com>
3227
3228         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
3229
3230         * generic.cs (Constraints.Resolve): New public method; this is
3231         called to resolve the constraint types and to check whether all
3232         the constraints are correct.
3233         (Constraints.Types): New public property.
3234         (TypeParameter.Resolve): New public method; resolves all the
3235         type's constraints.
3236
3237         * class.cs (TypeContainer.DefineType): Call
3238         TypeParameter.Resolve() before actually defining the type.
3239
3240 2003-09-15  Martin Baulig  <martin@ximian.com>
3241
3242         * class.cs (TypeContainer.DefineType): Added an error flag to
3243         avoid reporting duplicate CS0146's ("class definition is
3244         circular.").
3245
3246         * driver.cs (Driver.MainDriver): Abort if
3247         RootContext.ResolveTree() reported any errors.
3248
3249 2003-09-07  Martin Baulig  <martin@ximian.com>
3250
3251         * report.cs (Error, Warning): Added overloaded versions which take
3252         a `params object[] args' and call String.Format().
3253
3254 2003-09-07  Martin Baulig  <martin@ximian.com>
3255
3256         * decl.cs (DeclSpace..ctor): Don't call
3257         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
3258         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
3259         (DeclSpace.RecordDecl): New method.
3260
3261         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
3262
3263 2003-09-02  Ravi Pratap  <ravi@ximian.com>
3264
3265         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
3266         value attributes to be applied to ParameterBuilders.
3267
3268         * class.cs (MethodCore.LabelParameters): Make static and more
3269         generic so that it can be used from other places - like interface
3270         methods, for instance.
3271
3272         * interface.cs (Interface.Emit): Call LabelParameters before
3273         emitting attributes on the InterfaceMethod.
3274
3275 2003-09-07  Martin Baulig  <martin@ximian.com>
3276
3277         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
3278         if the number of type parameters doesn't match.
3279
3280 2003-09-04  Martin Baulig  <martin@ximian.com>
3281
3282         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
3283         for arrays of generic type params (ie. `!0[]').
3284
3285 2003-09-04  Martin Baulig  <martin@ximian.com>
3286
3287         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
3288         for the moment.
3289
3290 2003-09-04  Martin Baulig  <martin@ximian.com>
3291
3292         * decl.cs (DeclSpace.LookupGeneric): New method.
3293         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
3294         moment.
3295
3296         * generic.cs (TypeParameterExpr): Take a TypeParameter as
3297         argument, not just a string.
3298         (TypeParameter.Define): New public method; this is called to
3299         actually define the generic parameter; after this, you can use the
3300         new `Type' property to get the type.
3301
3302 2003-09-04  Martin Baulig  <martin@ximian.com>
3303
3304         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
3305         is now an ArrayList; initialize the result of the `TypeParameters'
3306         property here.
3307         (DeclSpace.GetGenericData): Removed.
3308         (DeclSpace.LookupGeneric): Temporarily removed; we need to
3309         implement this in a different way.
3310         (DeclSpace.GetTypeParameters): Removed; there's now a
3311         `TypeParameters' property.
3312         (DeclSpace.TypeParameters): New public property.
3313
3314         * generic.cs (Constraints): Make this class public.
3315         (TypeParameter): New public class.
3316
3317 2003-09-04  Martin Baulig  <martin@ximian.com>
3318
3319         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
3320         generic parameters.
3321
3322         * class.cs (TypeContainer.DefineType): Call
3323         TypeBuilder.DefineGenericParameter () on all generic parameters if
3324         this is a generic type.
3325
3326 2003-08-28  Martin Baulig  <martin@ximian.com>
3327
3328         * sample-stack.il: Compile this with ilasm: "ilasm /dll
3329         sample-stack.il".
3330
3331         * sample-hello.cs: Compile this with gmcs: "gmcs
3332         /r:sample-stack.dll sample-hello.cs".
3333
3334 2003-08-28  Martin Baulig  <martin@ximian.com>
3335
3336         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
3337         the parameters to the generic type.
3338
3339 2003-08-28  Martin Baulig  <martin@ximian.com>
3340
3341         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
3342
3343 2003-08-28  Martin Baulig  <martin@ximian.com>
3344
3345         * cs-parser.jay (opt_type_argument_list): Use
3346         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
3347         (primary_expression): Replace `qualified_identifier' with `type_name'.
3348         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
3349
3350         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
3351         parser to check whether it is syntactically a type parameter list;
3352         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
3353         this case.
3354
3355 2003-08-26  Martin Baulig  <martin@ximian.com>
3356
3357         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
3358         resolving aliases; fixes #47927.
3359
3360 2003-08-26  Martin Baulig  <martin@ximian.com>
3361
3362         * statement.cs (Using.DoResolve): This is internally emitting a
3363         try/finally clause, so we need to set ec.NeedExplicitReturn if we
3364         do not always return.  Fixes #47681.
3365
3366 2003-08-26  Martin Baulig  <martin@ximian.com>
3367
3368         * decl.cs (MemberCore): Moved WarningNotHiding(),
3369         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
3370         into MemberBase.
3371         (AdditionResult): Make this nested in DeclSpace.
3372         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
3373         argument; call NamespaceEntry.Define() unless we're nested in a
3374         class or struct.
3375
3376         * namespace.cs (Namespace.DefineName): New public function.  This
3377         is called from DeclSpace's .ctor to add 
3378         (Namespace.Lookup): Include DeclSpaces in the lookup.
3379
3380         * class.cs (Operator): Derive from MemberBase, not MemberCore.
3381
3382         * const.cs (Const): Derive from MemberBase, not MemberCore.     
3383
3384 2003-08-25  Martin Baulig  <martin@ximian.com>
3385
3386         * convert.cs (Convert.ExplicitReferenceConversion): When
3387         converting from an interface type to a class, unbox if the target
3388         type is a struct type.  Fixes #47822.
3389
3390 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3391
3392         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
3393         #47854.
3394
3395 2003-08-22  Martin Baulig  <martin@ximian.com>
3396
3397         * class.cs (TypeManager.DefineType): When defining a nested type,
3398         call DefineType() on our parent; fixes #47801.
3399
3400 2003-08-22  Martin Baulig  <martin@ximian.com>
3401
3402         * class.cs (MethodData.Define): While checking if a method is an
3403         interface implementation, improve the test a bit more to fix #47654.
3404
3405 2003-08-22  Martin Baulig  <martin@ximian.com>
3406
3407         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
3408         correctly; fixes #47722.
3409
3410 2003-08-22  Martin Baulig  <martin@ximian.com>
3411
3412         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
3413         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
3414
3415         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
3416
3417 2003-08-22  Martin Baulig  <martin@ximian.com>
3418
3419         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
3420         can only be assigned in static constructors.  Fixes #47161.
3421
3422 2003-08-22  Martin Baulig  <martin@ximian.com>
3423
3424         Rewrote and improved the flow analysis code.
3425
3426         * flowbranching.cs (FlowBranching): Make this class abstract.
3427         (FlowBranching.CreateBranching): New static function to create a
3428         new flow branching.
3429         (FlowBranchingBlock, FlowBranchingException): New classes.
3430         (FlowBranching.UsageVector.Type): New public readonly field.
3431         (FlowBranching.UsageVector.Breaks): Removed the setter.
3432         (FlowBranching.UsageVector.Returns): Removed the setter.
3433         (FlowBranching.UsageVector): Added Break(), Return(),
3434         NeverReachable() and Throw() methods to modify the reachability.
3435         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
3436         done by FlowBranching.Merge().
3437         (FlowBranching.UsageVector.MergeChild): New method; merges the
3438         merge result into the current vector.
3439         (FlowBranching.Merge): New abstract method to merge a branching.
3440
3441 2003-08-12  Martin Baulig  <martin@ximian.com>
3442
3443         * expression.cs (Indirection.CacheTemporaries): Create the
3444         LocalTemporary with the pointer type, not its element type.
3445
3446 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
3447
3448         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
3449         token was a keyword or not.
3450
3451         Add `error' options where an IDENTIFIER was expected;  Provide
3452         CheckToken and CheckIdentifierToken convenience error reporting
3453         functions. 
3454
3455         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
3456
3457         * decl.cs: Rename `NamespaceEntry Namespace' public field into
3458         NameSpaceEntry NameSpaceEntry.
3459
3460         (LookupInterfaceOrClass): Avoid creating a full qualified name
3461         from namespace and name: avoid doing lookups when we know the
3462         namespace is non-existant.   Use new Tree.LookupByNamespace which
3463         looks up DeclSpaces based on their namespace, name pair.
3464
3465         * driver.cs: Provide a new `parser verbose' to display the
3466         exception thrown during parsing.  This is turned off by default
3467         now, so the output of a failure from mcs is more graceful.
3468
3469         * namespace.cs: Track all the namespaces defined in a hashtable
3470         for quick lookup.
3471
3472         (IsNamespace): New method
3473
3474 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
3475
3476         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
3477         we know that we need to concatenate (full typename can never be
3478         null). 
3479
3480         * class.cs: ditto.
3481
3482         * statement.cs: Use a bitfield;  Do not initialize to null things
3483         which are done by the constructor by default.
3484
3485         * cs-parser.jay: bug fix, parameter was 4, not 3.
3486
3487         * expression.cs: Just use the property;
3488
3489         * statement.cs: No need for GetVariableInfo method.
3490
3491 2003-08-08  Martin Baulig  <martin@ximian.com>
3492
3493         * flowanalysis.cs (FlowReturns): This is now nested in the
3494         `FlowBranching' class.
3495         (MyBitVector): Moved this here from statement.cs.
3496         (FlowBranching.SiblingType): New enum type.
3497         (FlowBranching.CreateSibling): Added `SiblingType' argument.
3498
3499 2003-08-07  Martin Baulig  <martin@ximian.com>
3500
3501         * flowanalysis.cs (FlowBranchingType): This is now nested in the
3502         `FlowBranching' class and called `BranchingType'.
3503
3504 2003-08-07  Martin Baulig  <martin@ximian.com>
3505
3506         * flowanalysis.cs: Moved all the control flow analysis code into
3507         its own file.
3508
3509 2003-08-07  Martin Baulig  <martin@ximian.com>
3510
3511         * assign.cs (Assign.DoResolve): `target' must either be an
3512         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
3513         #37319.
3514
3515 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
3516
3517         * expression.cs (BinaryMethod): This kind of expression is created by the
3518         Binary class if it determines that the operator has to be handled
3519         by a method.
3520
3521         (BinaryDelegate): This kind of expression is created if we are
3522         dealing with a + or - operator on delegates.
3523
3524         (Binary): remove method, argumetns, and DelegateOperator: when
3525         dealing with methods, 
3526
3527         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
3528
3529         * statement.cs (Block): use bitfields for the three extra booleans
3530         we had in use.   Remove unused topblock parameter.
3531
3532         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
3533
3534         * assign.cs: Drop extra unneeded tests.
3535
3536 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
3537
3538         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
3539
3540         * statement.cs (Foreach): Use VariableStorage instead of
3541         LocalBuilders.   
3542
3543         * codegen.cs (VariableStorage): New class used by clients that
3544         require a variable stored: locals or fields for variables that
3545         need to live across yield.
3546
3547         Maybe provide a convenience api for EmitThis+EmitLoad?
3548
3549         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
3550         these bad boys.
3551
3552 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
3553
3554         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
3555         RemapParameterLValue): New methods that are used to turn a
3556         precomputed FieldInfo into an expression like this:
3557
3558                 instance.FieldInfo
3559
3560         The idea is to use this instead of making LocalVariableReference
3561         have more than one meaning.
3562
3563         * cs-parser.jay: Add error production to BASE.
3564
3565         * ecore.cs: Deal with TypeManager.GetField returning null, which
3566         is now a valid return value.
3567
3568         (FieldExprNoAddress): New expression for Fields whose address can
3569         not be taken.
3570
3571         * expression.cs (LocalVariableReference): During the resolve
3572         phases, create new expressions if we are in a remapping context.
3573         Remove code that dealt with remapping here.
3574
3575         (ParameterReference): same.
3576
3577         (ProxyInstance): New expression, like the `This' expression, but
3578         it is born fully resolved.  We know what we are doing, so remove
3579         the errors that are targeted to user-provided uses of `this'.
3580
3581         * statement.cs (Foreach): our variable is now stored as an
3582         Expression;  During resolution, follow the protocol, dont just
3583         assume it will return this.
3584
3585 2003-08-06  Martin Baulig  <martin@ximian.com>
3586
3587         * support.cs (SeekableStreamReader.cs): New public class.
3588
3589         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
3590         SeekableStreamReader instead of the normal StreamReader.
3591
3592 2003-08-04  Martin Baulig  <martin@ximian.com>
3593
3594         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
3595         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
3596         deambiguate casts and delegate invocations.
3597         (parenthesized_expression): Use the new tokens to ensure this is
3598         not a cast of method invocation.
3599
3600         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
3601         when reading a `)' and Deambiguate_CloseParens () was previously
3602         called.
3603
3604         * expression.cs (ParenthesizedExpression): New class.  This is
3605         just used for the CS0075 test.
3606         (Binary.DoResolve): Check for CS0075.   
3607
3608 2003-07-29  Ravi Pratap  <ravi@ximian.com>
3609
3610         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
3611         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
3612         reference comparison.
3613
3614         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
3615         examine the ReturnType for equality - this is necessary in the
3616         cases of implicit and explicit operators whose signature also
3617         includes the return type.
3618
3619 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
3620
3621         * namespace.cs: Cache the result of the namespace computation,
3622         instead of computing it every time.
3623
3624 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
3625
3626         * decl.cs: Use a global arraylist that we reuse over invocations
3627         to avoid excesive memory consumption.  Reduces memory usage on an
3628         mcs compile by one meg (45 average).
3629
3630         * typemanager.cs (LookupTypeReflection): In .NET pointers are
3631         private, work around that.
3632
3633 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
3634
3635         * literal.cs (IntLiteral): Define Zero and One static literals. 
3636
3637         * cs-parser.jay (integer_literal): use static literals to reduce
3638         memory usage for the most used literals (0, 1 and -1).  211kb
3639         reduced in memory usage.
3640
3641         Replace all calls to `new ArrayList' with `new
3642         ArrayList(4)' which is a good average number for most allocations,
3643         and also requires only 16 bytes of memory for its buffer by
3644         default. 
3645
3646         This reduced MCS memory usage in seven megabytes for the RSS after
3647         bootstrapping.
3648
3649 2003-07-28  Ravi Pratap  <ravi@ximian.com>
3650
3651         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
3652         handle params methods the correct way by forming only one
3653         applicable set with params and normal methods in them. Earlier we
3654         were looking at params methods only if we found no normal methods
3655         which was not the correct thing to do.
3656
3657         (Invocation.BetterFunction): Take separate arguments indicating
3658         when candidate and the best method are params methods in their
3659         expanded form.
3660
3661         This fixes bugs #43367 and #46199.
3662
3663         * attribute.cs: Documentation updates.
3664
3665         (CheckAttribute): Rename to CheckAttributeTarget.
3666         (GetValidPlaces): Rename to GetValidTargets.
3667
3668         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
3669         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
3670
3671         Fixes bug #44468.
3672
3673 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
3674
3675         * codegen.cs: Compute IsGeneric correctly.
3676
3677         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
3678         resolution. 
3679
3680         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
3681         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
3682         regressions, and I was chasing more bugs than I required.
3683
3684         * interface.cs: Use expressions for base type names (like classes
3685         and structs have been doing for a while now), and resolve that.
3686         This patch should probably go into head as well.
3687
3688         This makes it one less user of FindType.
3689
3690 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
3691
3692         This compiler can not self host currently.  Need to fix that.
3693         
3694         * Makefile: compile to `gmcs.exe'
3695
3696         * driver.cs: Turn on v2 by default on gmcs.
3697
3698         * generic.cs (ConstructedType): Does no longer take a container
3699         type argument;  That will be taken care of later.
3700
3701         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
3702         Use SimpleName to resolve for now, so we can continue the work on
3703         the parser, until we get Type.GetType that understands generics.
3704
3705         (ConstructedType.ToString): Implement
3706
3707         (TypeArguments.Resolve): Resolve the child expressions as types. 
3708         
3709         * cs-parser.jay: Rename interface_constraints to
3710         type_parameter_constraints
3711
3712         (namespace_or_type_name): Only use constructed types for the basic
3713         construction, we will deal with identifier<...> later.
3714
3715         (type/type_name): No longer call DecomposeQI, as
3716         namespace_or_type_name is always decoded now.
3717         
3718 2003-07-22  Ravi Pratap  <ravi@ximian.com>
3719
3720         * expression.cs (Invocation.OverloadResolve): Follow the spec more
3721         closely: we eliminate methods in base types when we have an
3722         applicable method in a top-level type.
3723
3724         Please see section 14.5.5.1 for an exact description of what goes
3725         on. 
3726
3727         This fixes bug #45127 and a host of other related to corlib compilation.
3728
3729         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
3730         array is the method corresponding to the top-level type (this is
3731         because of the changes made to icall.c) so we change this
3732         accordingly.
3733
3734         (MethodGroupExpr.Name): This too.
3735
3736         * typemanager.cs (GetElementType): New method which does the right
3737         thing when compiling corlib. 
3738
3739         * everywhere: Make use of the above in the relevant places.
3740
3741 2003-07-22  Martin Baulig  <martin@ximian.com>
3742
3743         * cs-parser.jay (invocation_expression): Moved
3744         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
3745         `cast_expression', but create a InvocationOrCast which later
3746         resolves to either an Invocation or a Cast.
3747
3748         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
3749         method; call this before EmitStatement() to make sure that this
3750         expression can be used as a statement.
3751
3752         * expression.cs (InvocationOrCast): New class; resolves to either
3753         an Invocation or a Cast.
3754
3755         * statement.cs (StatementExpression): Call ResolveStatement() on
3756         the ExpressionStatement before emitting it.
3757
3758 2003-07-21  Martin Baulig  <martin@ximian.com>
3759
3760         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
3761         `ref' and `out' attributes match; fixes #46220.
3762         (MemberAccess.ResolveMemberAccess): You can't reference a type
3763         through an expression; fixes #33180.
3764         (Indexers.GetIndexersForType): Don't return the indexers from
3765         interfaces the class implements; fixes #46502.
3766
3767 2003-07-21  Martin Baulig  <martin@ximian.com>
3768
3769         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
3770         CS0661 checks; fixes bug #30442.
3771
3772 2003-07-21  Martin Baulig  <martin@ximian.com>
3773
3774         * decl.cs (AdditionResult): Added `Error'.
3775
3776         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
3777
3778         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
3779         cs0031.cs actually work.
3780
3781  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
3782  
3783         * cs-parser.jay (namespace_name): do not use
3784         namespace_or_type_name, use qualified_identifier, because
3785         namespace_or_type_name will soon return a composed expression
3786         instead of a string.
3787  
3788         (namespace_or_type_name): Instead of returning a string, now this
3789         production returns an expression.
3790  
3791         * codegen.cs (EmitContext): Setup IsGeneric property based on
3792         whether our DeclSpace is generic, our the method is generic.
3793  
3794         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
3795         the method is generic.
3796  
3797         * cs-parser.jay (type_arguments, opt_type_argument_list,
3798         type_parameters, type_parameter_list, opt_type_parameter_list,
3799         type_parameter,, opt_type_parameter_constraints_clauses,
3800         type_parameter_constraints_clauses,
3801         type_parameter_constraint_clause, type_parameter_constraint,
3802         interface_constraints): Add new production
3803  
3804         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
3805         DeclSpace is generic or not.
3806  
3807         (DeclSpace.SetParameterInfo): New routine, used to set the
3808         parameter info for a type.
3809  
3810         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
3811         returns a GenericTypeExpr
3812  
3813         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
3814         generic, lookup the generic argument.
3815  
3816         * attribute.cs: Do not allow TypeParameterExpressions in
3817         Attributes.
3818  
3819         * class.cs: Do not allow the Main method to be defined in a
3820         Generic container.
3821  
3822         * expression.cs (SizeOf): Do not allow generic types to be used as
3823         arguments to sizeof.
3824  
3825         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
3826         it: whether a type is generic or not.  Only works for types we are
3827         currently building for now.
3828         
3829 2003-07-20  Martin Baulig  <martin@ximian.com>
3830
3831         * namespace.cs: Fixed that bug which caused a crash when compiling
3832         the debugger's GUI.
3833
3834 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
3835
3836         * typemanager.cs (LookupTypeReflection): Never expose types which
3837         are NotPublic, NestedPrivate, NestedAssembly, or
3838         NestedFamANDAssem.  We used to return these, and later do a check
3839         that would report a meaningful error, but the problem is that we
3840         would not get the real match, if there was a name override.
3841
3842 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
3843
3844         * namespace.cs (Namespace, Name): Do not compute the namespace
3845         name dynamically, compute it in the constructor.  This reduced
3846         memory usage by 1697 KB.
3847
3848         * driver.cs: Use --pause to pause at the end.
3849
3850 2003-07-17  Peter Williams  <peter@newton.cx>
3851
3852         * Makefile: Change the name of the test target so that it doesn't
3853         conflict with the recursive test target.
3854
3855 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
3856
3857         * expression.cs (LocalVariableReference.Emit, EmitAssign,
3858         AddressOf): Do not use EmitThis, that was wrong, use the actual
3859         this pointer.
3860
3861 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
3862
3863         * class.cs (MethodData.Define): While checking if a method is an
3864         interface implementation, improve the test: If we are not public
3865         (use new test here: use the computed MethodAttributes directly,
3866         instead of the parsed modifier flags) check if the `implementing'
3867         method comes from an interface or not.
3868
3869         * pending.cs (VerifyPendingMethods): Slightly better error
3870         message.
3871
3872         * makefile: add test target that does the mcs bootstrap.
3873
3874 2003-07-16  Ravi Pratap  <ravi@ximian.com>
3875
3876         * interface.cs (Define): Do nothing here since there are no
3877         members to populate etc. Move the attribute emission out of here
3878         since this was just totally the wrong place to put it. Attribute
3879         application happens during the 'Emit' phase, not in the 'Define'
3880         phase.
3881
3882         (Emit): Add this method and move the attribute emission here
3883
3884         * rootcontext.cs (EmitCode): Call the Emit method on interface
3885         types too.
3886
3887 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3888
3889         * expression.cs (OverloadResolve): Report error only if Location
3890         is not 'Null' which means that there was a probe going on.
3891
3892 2003-07-14  Martin Baulig  <martin@ximian.com>
3893
3894         * expression.cs (ConditionalLogicalOperator): New public class to
3895         implement user defined conditional logical operators.
3896         This is section 14.11.2 in the spec and bug #40505.
3897
3898 2003-07-14  Martin Baulig  <martin@ximian.com>
3899
3900         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
3901
3902 2003-07-14  Martin Baulig  <martin@ximian.com>
3903
3904         * codegen.cs (EmitContext.InFixedInitializer): New public field.
3905
3906         * ecore.cs (IVariable.VerifyFixed): New interface method.
3907
3908         * expression.cs (Unary.ResolveOperator): When resolving the `&'
3909         operator, check whether the variable is actually fixed.  Fixes bug
3910         #36055.  Set a variable definitely assigned when taking its
3911         address as required by the spec.
3912
3913         * statement.cs (LocalInfo.IsFixed): New field.
3914         (LocalInfo.MakePinned): Set `IsFixed' to true.
3915
3916 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3917
3918         * attribute.cs (Attribute.Resolve): While doing a Member lookup
3919         for .ctors, ensure that we only ask for members declared in the
3920         attribute type (BindingFlags.DeclaredOnly).
3921
3922         Fixes bug #43632.
3923
3924         * expression.cs (Error_WrongNumArguments): Report error 1501
3925         correctly the way CSC does.
3926
3927 2003-07-13  Martin Baulig  <martin@ximian.com>
3928
3929         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
3930         lookup on the fully qualified name, to make things like "X.X" work
3931         where "X.X" is a fully qualified type name, but we also have a
3932         namespace "X" in the using list.  Fixes #41975.
3933
3934 2003-07-13  Martin Baulig  <martin@ximian.com>
3935
3936         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
3937         function. If we're a CompoundAssign, we need to create an embedded
3938         CompoundAssign, not an embedded Assign.
3939         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
3940         Fixes #45854.
3941
3942 2003-07-13  Martin Baulig  <martin@ximian.com>
3943
3944         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
3945         work to fix bug #46088.
3946
3947 2003-07-13  Ravi Pratap <ravi@ximian.com>
3948
3949         * class.cs (Operator.Emit): Do not emit attributes here - it is
3950         taken care of by the Method class that we delegate too. This takes
3951         care of bug #45876.
3952
3953 2003-07-10  Martin Baulig  <martin@ximian.com>
3954
3955         * expression.cs (TypeOfVoid): New class.
3956         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
3957
3958 2003-07-10  Martin Baulig  <martin@ximian.com>
3959
3960         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
3961         bug #35957.
3962
3963 2003-07-10  Martin Baulig  <martin@ximian.com>
3964
3965         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
3966         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
3967
3968         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
3969
3970         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
3971
3972 2003-07-10  Martin Baulig  <martin@ximian.com>
3973
3974         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
3975         of decimal.  Fixes #42850.
3976
3977         NOTE: I also fixed the created byte blob, but this doesn't work on
3978         the MS runtime and csc never produces any byte blobs for decimal
3979         arrays.
3980
3981 2003-07-10  Martin Baulig  <martin@ximian.com>
3982
3983         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
3984         structs; fixes #32068.
3985         (Block.AddChildVariableNames): Fixed #44302.
3986
3987 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3988
3989         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
3990
3991 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3992
3993         * attribute.cs: And this test is onger needed.
3994
3995 2003-07-08  Martin Baulig  <martin@ximian.com>
3996
3997         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
3998         inaccessible types.  Fixes #36313.
3999
4000         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
4001
4002         * namespace.cs (NamespaceEntry): Create implicit entries for all
4003         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
4004         implicit entries for N1.N2 and N1.
4005
4006 2003-07-08  Martin Baulig  <martin@ximian.com>
4007
4008         Rewrote the handling of namespaces to fix a lot of the issues
4009         wrt. `using' aliases etc.
4010
4011         * namespace.cs (Namespace): Splitted this class into a
4012         per-assembly `Namespace' and a per-file `NamespaceEntry'.
4013
4014         * typemanager.cs (TypeManager.IsNamespace): Removed.
4015         (TypeManager.ComputeNamespaces): Only compute namespaces from
4016         loaded assemblies here, not the namespaces from the assembly we're
4017         currently compiling.
4018
4019 2003-07-08  Martin Baulig  <martin@ximian.com>
4020
4021         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
4022
4023 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4024
4025         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
4026         already fixed it.  
4027
4028         I thought about the memory savings here, but LookupTypeReflection
4029         is used under already very constrained scenarios.  Compiling
4030         corlib or mcs only exposes one hit, so it would not really reduce
4031         any memory consumption.
4032
4033 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4034
4035         * typemanager.cs: fixes bug #45889 by only adding public types from
4036         other assemblies to the list of known types.
4037
4038 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4039
4040         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
4041         on the type we resolved.
4042
4043 2003-07-05  Martin Baulig  <martin@ximian.com>
4044
4045         * pending.cs (PendingImplementation.ParentImplements): Don't
4046         create the proxy if the parent is abstract.
4047
4048         * class.cs (TypeContainer.DefineIndexers): Process explicit
4049         interface implementations first.  Fixes #37714.
4050
4051 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
4052
4053         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
4054         defined recursively;  but since we modify the input parameters
4055         (left is set to `this' temporarily), we reset this value if the
4056         left_is_explicit is false, which gives the original semantics to
4057         the code.  
4058
4059         * literal.cs (NullPointer): new class used to represent a null
4060         literal in a pointer context.
4061
4062         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
4063         type is a pointer, use a NullPointer object instead of a
4064         NullLiteral.   Closes 43687
4065
4066         (ExplicitConversion): Convert pointer values using
4067         the conv opcode to the proper type.
4068
4069         * ecore.cs (New): change ValueTypeVariable property into a method,
4070         that returns whether the valuetype is suitable for being used.
4071
4072         * expression.cs (Binary.DoNumericPromotions): Only return if we
4073         the int constant was a valid uint, and we can return both left and
4074         right as uints.  If not, we continue processing, to trigger the
4075         type conversion.  This fixes 39018.
4076
4077         * statement.cs (Block.EmitMeta): During constant resolution, set
4078         the CurrentBlock property on the emitcontext, so that we resolve
4079         constants propertly.
4080
4081 2003-07-02  Martin Baulig  <martin@ximian.com>
4082
4083         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
4084         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
4085
4086         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
4087         than emitting it here.
4088
4089         * statement.cs: Fixed some more flow analysis bugs.
4090
4091 2003-07-02  Martin Baulig  <martin@ximian.com>
4092
4093         * class.cs (MethodData.Define): When implementing interface
4094         methods, set Final unless we're Virtual.
4095
4096         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
4097         check work for interface methods.
4098
4099 2003-07-01  Martin Baulig  <martin@ximian.com>
4100
4101         * ecore.cs (EmitContext.This): Replaced this property with a
4102         GetThis() method which takes a Location argument.  This ensures
4103         that we get the correct error location for a CS0188.
4104
4105 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
4106
4107         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
4108         ImplicitStandardConversion.
4109
4110         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
4111
4112 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
4113
4114         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
4115         optimization.
4116
4117 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
4118
4119         * class.cs (Constructor.Define): Turn off initlocals for unsafe
4120         constructors.
4121
4122         (MethodData.Define): Turn off initlocals for unsafe methods.
4123
4124 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
4125
4126         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
4127         complete;  Fixes #37521.
4128
4129         * delegate.cs: Use Modifiers.TypeAttr to compute the
4130         TypeAttributes, instead of rolling our own.  This makes the flags
4131         correct for the delegates.
4132
4133 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
4134
4135         * class.cs (Constructor.Define): Set the private flag for static
4136         constructors as well.
4137
4138         * cs-parser.jay (statement_expression): Set the return value to
4139         null, to avoid a crash when we catch an error.
4140
4141 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
4142
4143         * cs-parser.jay: Applied patch from Jackson that adds support for
4144         extern and unsafe modifiers to destructor declarations.
4145
4146         * expression.cs: Report error 21 if the user is trying to index a
4147         System.Array.
4148
4149         * driver.cs: Add an error message, suggested by the bug report.
4150
4151         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
4152         if we do not have a ": this ()" constructor initializer.  Fixes 45149
4153
4154 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
4155
4156         * namespace.cs: Add some information to reduce FAQs.
4157
4158 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
4159
4160         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
4161         underlying enumeration types.  Fixes #43915.
4162
4163         * expression.cs: Treat ushort/short as legal values to be used in
4164         bitwise operations.
4165
4166 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
4167
4168         * delegate.cs: transfer custom attributes for paramenters from
4169         the delegate declaration to Invoke and BeginInvoke.
4170
4171 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
4172
4173         * attribute.cs: handle custom marshalers and emit marshal info
4174         for fields, too.
4175
4176 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
4177
4178         * makefile.gnu: Added anonymous.cs to the compiler sources.
4179
4180 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
4181
4182         * iterators.cs: Change the name of the proxy class to include two
4183         underscores.
4184
4185         * cs-parser.jay: Update grammar to include anonymous methods.
4186
4187         * anonymous.cs: new file.
4188
4189 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
4190
4191         * class.cs (Field.Define): Add missing test for pointers and
4192         safety. 
4193
4194 2003-05-27  Ravi Pratap  <ravi@ximian.com>
4195
4196         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
4197         we use the stobj opcode.
4198
4199         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
4200         since it wasn't the correct fix. 
4201
4202         It still is puzzling that we are required to use stobj for IntPtr
4203         which seems to be a ValueType.
4204
4205 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
4206
4207         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
4208         during regular simple name resolution.   Now, the trick is that
4209         instead of returning for processing the simplename, we do a
4210         TypeManager.LookupType (ie, a rooted lookup as opposed to a
4211         contextual lookup type).   If a match is found, return that, if
4212         not, return for further composition.
4213
4214         This fixes long-standing 30485.
4215
4216         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4217         using the address to initialize an object, do an Stobj instead of
4218         using the regular Stelem.
4219
4220         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
4221         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
4222         Because if we are a BaseIndexerAccess that value will be true.
4223         Fixes 43643.
4224
4225         * statement.cs (GotoCase.Resolve): Return after reporting an
4226         error, do not attempt to continue. 
4227
4228         * expression.cs (PointerArithmetic.Emit): If our operand is a
4229         long, convert our constants to match the operand before
4230         multiplying.  Convert to I type before adding.   Fixes 43670.
4231
4232 2003-05-14  Ravi Pratap  <ravi@ximian.com>
4233
4234         * enum.cs (ImplicitConversionExists) : Rename to
4235         ImplicitEnumConversionExists to remove ambiguity. 
4236
4237         * ecore.cs (NullCast): New type of cast expression class which
4238         basically is very similar to EmptyCast with the difference being
4239         it still is a constant since it is used only to cast a null to
4240         something else
4241         (eg. (string) null)
4242
4243         * convert.cs (ImplicitReferenceConversion): When casting a null
4244         literal, we return a NullCast.
4245
4246         * literal.cs (NullLiteralTyped): Remove - I don't see why this
4247         should be around anymore.
4248
4249         The renaming (reported was slightly wrong). Corrections:
4250
4251         ConvertImplicitStandard -> ImplicitConversionStandard
4252         ConvertExplicitStandard -> ExplicitConversionStandard
4253
4254         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
4255         before passing them in !
4256
4257         * convert.cs (ImplicitConversionStandard): When comparing for
4258         equal expr and target types, ensure that expr is not a
4259         NullLiteral.
4260
4261         In general, we must not be checking (expr_type ==
4262         target_type) in the top level conversion methods
4263         (ImplicitConversion, ExplicitConversion etc). This checking is
4264         done in the methods that they delegate to.
4265
4266 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
4267
4268         * convert.cs: Move Error_CannotConvertType,
4269         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
4270         ImplicitNumericConversion, ImplicitConversionExists,
4271         ImplicitUserConversionExists, StandardConversionExists,
4272         FindMostEncompassedType, FindMostSpecificSource,
4273         FindMostSpecificTarget, ImplicitUserConversion,
4274         ExplicitUserConversion, GetConversionOperators,
4275         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
4276         TryImplicitIntConversion, Error_CannotConvertImplicit,
4277         ConvertImplicitRequired, ConvertNumericExplicit,
4278         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
4279         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
4280         its own file.
4281
4282         Perform the following renames:
4283
4284         StandardConversionExists -> ImplicitStandardConversionExists
4285         ConvertImplicit -> ImplicitConversion
4286         ConvertImplicitStandard -> ImplicitStandardConversion
4287         TryImplicitIntConversion -> ImplicitIntConversion
4288         ConvertImplicitRequired -> ImplicitConversionRequired
4289         ConvertNumericExplicit -> ExplicitNumericConversion
4290         ConvertReferenceExplicit -> ExplicitReferenceConversion
4291         ConvertExplicit -> ExplicitConversion
4292         ConvertExplicitStandard -> ExplicitStandardConversion
4293
4294 2003-05-19  Martin Baulig  <martin@ximian.com>
4295
4296         * statement.cs (TypeInfo.StructInfo): Made this type protected.
4297         (TypeInfo): Added support for structs having structs as fields.
4298
4299         * ecore.cs (FieldExpr): Implement IVariable.
4300         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
4301         VariableInfo for the field.
4302
4303 2003-05-18  Martin Baulig  <martin@ximian.com>
4304
4305         * expression.cs (This.DoResolve): Report a CS0027 if we're
4306         emitting a field initializer.
4307
4308 2003-05-18  Martin Baulig  <martin@ximian.com>
4309
4310         * expression.cs (This.ResolveBase): New public function.
4311         (This.DoResolve): Check for CS0188.
4312
4313         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
4314         This.Resolve().
4315
4316         * ecore.cs (MethodGroupExpr.DoResolve): Set the
4317         `instance_expression' to null if we don't have any non-static
4318         methods.
4319
4320 2003-05-18  Martin Baulig  <martin@ximian.com>
4321
4322         Reworked the way how local variables and parameters are handled by
4323         the flow analysis code.
4324
4325         * statement.cs (TypeInfo, VariableMap): New public classes.
4326         (VariableInfo): New public class.  This is now responsible for
4327         checking whether a variable has been assigned.  It is used for
4328         parameters and local variables.
4329         (Block.EmitMeta): Take the InternalParameters as argument; compute
4330         the layout of the flow vectors here.
4331         (Block.LocalMap, Block.ParameterMap): New public properties.
4332         (FlowBranching): The .ctor doesn't get the InternalParameters
4333         anymore since Block.EmitMeta() now computes the layout of the flow
4334         vector.
4335         (MyStructInfo): This class is now known as `StructInfo' and nested
4336         in `TypeInfo'; we don't access this directly anymore.
4337
4338         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
4339         property and removed IsAssigned(), IsFieldAssigned(),
4340         SetAssigned() and SetFieldAssigned(); we now call them on the
4341         VariableInfo so we don't need to duplicate this code everywhere.
4342
4343         * expression.cs (ParameterReference): Added `Block block' argument
4344         to the .ctor.
4345         (LocalVariableReference, ParameterReference, This): The new
4346         VariableInfo class is now responsible for all the definite
4347         assignment stuff.
4348
4349         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
4350         IsParameterAssigned, SetParameterAssigned): Removed.
4351
4352 2003-05-18  Martin Baulig  <martin@ximian.com>
4353
4354         * typemanager.cs (InitCoreTypes): Try calling
4355         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
4356         the 3-args-version.  Corlib now also needs our `void_type'.
4357         (GetMethod): Added overloaded version which takes an optional
4358         `bool report_errors' to allow lookups of optional methods.
4359
4360 2003-05-12  Martin Baulig  <martin@ximian.com>
4361
4362         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
4363         only used for locals and not for parameters.
4364
4365 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
4366
4367         * support.cs (InternalParameters.ParameterType): Return the
4368         ExternalType of the parameter.
4369
4370         * parameter.cs (Parameter.ExternalType): drop the two arguments,
4371         they were unused.
4372
4373 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
4374
4375         * class.cs (MethodData.Define): Do not set the `newslot' on
4376         interface members, if they are also flagged as "override".
4377
4378         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
4379         better code for ++i and i++.  This only works for static fields
4380         and local variables.
4381
4382         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
4383         want to pull the DeclSpace out of the builder_to_declspace instead
4384         of the TypeBuilder (like in TypeContainer.FindMembers).
4385
4386         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
4387         instead of LookupTypeContainer.  Fixes the crash on .NET for
4388         looking up interface members.
4389
4390         * const.cs: Create our own emit context during the Definition
4391         stage, so that constants are evaluated in the proper context, when
4392         a recursive definition happens.
4393
4394 2003-05-11  Martin Baulig  <martin@ximian.com>
4395
4396         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
4397         new block for a switch section.
4398         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
4399         the adding/lookup in the switch block.  Fixes #39828.
4400
4401 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
4402
4403         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
4404         functionality: I needed to convert the data after I had performed
4405         the add/sub operation into the operands type size.
4406
4407         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
4408         pass the type for the box operation, otherwise the resulting
4409         object would have been of type object.
4410
4411         (BoxedCast): Add constructor to specify the type to box as.
4412
4413 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
4414
4415         * iterators.cs: I was reusing the `count' variable inadvertently,
4416         take steps to not allow this to happen.
4417
4418 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
4419
4420         * attribute.cs (Attribute.Resolve): Params attributes are encoded
4421         by creating an array at the point where the params starts and
4422         putting all those arguments there, then adjusting the size of the
4423         array.
4424
4425 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
4426
4427         * expression.cs (New.AddressOf): Implement interface
4428         IMemoryLocation.  This is used when the `new' operator is used in
4429         the context of an invocation to a method on a value type.
4430
4431         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
4432         example. 
4433
4434         * namespace.cs: Also check the using aliases here.
4435
4436         * driver.cs: Move the test for using validity after the types have
4437         been entered, so we do a single pass that also includes the using
4438         aliases. 
4439
4440         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
4441         in the regular case.   CreateSiblingForFinally is doing extra
4442         error checking.
4443
4444         * attribute.cs (GetAttributeArgumentExpression): Store the result
4445         on an out value, and use the return value to indicate failure
4446         instead of using null (which is a valid return for Constant.GetValue).
4447
4448         * statement.cs: Perform the analysis flow for the increment
4449         portion after the statement, because this will be the real flow of
4450         execution.  Fixes #42385
4451
4452         * codegen.cs (EmitContext.EmitArgument,
4453         EmitContext.EmitStoreArgument): New helper functions when the
4454         RemapToProxy flag is set.
4455
4456         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
4457         function.
4458
4459         Add support for remapping parameters. 
4460
4461         * iterators.cs: Propagate parameter values;  Store parameter
4462         values in the proxy classes.
4463
4464 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
4465
4466         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
4467         need a proxy reference;  I do not know what I was thinking
4468
4469         * cs-parser.jay (constructor_initializer): catch another error,
4470         and display nice message.
4471
4472         (field_declaration): catch void field declaration
4473         to flag a better error. 
4474
4475         * class.cs (MemberBase.CheckBase): Report an error instead of a
4476         warning if a new protected member is declared in a struct. 
4477         (Field.Define): catch the error of readonly/volatile.
4478
4479         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
4480
4481         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
4482         volatile variable is taken
4483
4484 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
4485
4486         * statement.cs (Fixed.Resolve): Report an error if we are not in
4487         an unsafe context.
4488
4489 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
4490
4491         * typemanager.cs: reuse the code that handles type clashes for
4492         delegates and enumerations.
4493
4494         * class.cs (Report28): Always report.
4495
4496         * expression.cs (EncodeAsAttribute): Allow nulls here.
4497
4498 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
4499
4500         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
4501         the functionality for testing whether an expression is valid for
4502         an attribute here.  Also handle the case of arrays of elements
4503         being stored. 
4504
4505         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
4506         encoding a linear array into an array of objects that are suitable
4507         to be passed to an CustomAttributeBuilder.
4508
4509         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
4510
4511         * ecore.cs: (FieldExpr): Handle field remapping here.
4512
4513         * iteratators.cs: Pass the instance variable (if the method is an
4514         instance method) to the constructors, so we can access the field
4515         variables on the class.
4516
4517         TODO: Test this with structs.  I think the THIS variable on
4518         structs might have to be a pointer, and not a refenrece
4519
4520 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
4521
4522         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
4523         local variables to fields in a proxy class.
4524
4525         * iterators.cs (PopulateProxy): Rename our internal fields to
4526         <XXX>.  
4527         Create a <THIS> field if we are an instance method, so we can
4528         reference our parent container variables.
4529         (MapVariable): Called back from the EmitContext code to enter a
4530         new variable to field mapping into the proxy class (we just create
4531         a FieldBuilder).
4532
4533         * expression.cs
4534         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
4535         for using the remapped locals to fields.
4536
4537         I placed the code here, because that gives the same semantics to
4538         local variables, and only changes the Emit code.
4539
4540         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
4541         statements inside iterators.
4542         (VariableInfo): Add a FieldBuilder for the cases when we are
4543         remapping local variables to fields in a proxy class
4544
4545         * ecore.cs (SimpleNameResolve): Avoid testing two times for
4546         current_block != null.
4547
4548         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
4549         not cope with strings, as it has been moved to the
4550         TableSwitchEmit.  Fixed bug in switch generation.
4551
4552         * expression.cs (New.DoResolve): Provide more context for the user
4553         when reporting an error.
4554
4555         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
4556         pointers. 
4557
4558         * expression.cs (MemberAccess.DoResolve): When we get a type back,
4559         check the permissions for it.  Note than in a type-resolution
4560         context the check was already present in DeclSpace.ResolveType,
4561         but was missing from the MemberAccess.
4562
4563         (ArrayCreation.CheckIndices): warn if the user has
4564         more nested levels of expressions, but there are no more
4565         dimensions specified.  Avoids crash on bug 41906.
4566
4567 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
4568
4569         * statement.cs (Block): replace Implicit bool, for a generic
4570         flags.   
4571         New flag: `Unchecked'.  This is used during the EmitMeta phase
4572         (which is out-of-line with the regular Resolve/Emit process for a
4573         statement, as this is done ahead of time, but still gets a chance
4574         to call constant resolve).
4575
4576         (Block.Flags): new enum for adding a new flag.
4577
4578         (Block.EmitMeta): track the state of unchecked.
4579
4580         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
4581         to enable constant resolution to work there as well.
4582
4583 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
4584
4585         * typemanager.cs (ienumerable_type): Also look up
4586         System.Collections.IEnumerable. 
4587
4588 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
4589
4590         TODO: Test more than one conditional per method.
4591
4592         * class.cs (Indexer.Define): Report the location where the user is
4593         referencing the unsupported feature.
4594
4595         (MethodData): Overload the use of `conditionals' to
4596         minimize the creation of needless ArrayLists.   This saves roughly
4597         212kb on my machine.
4598
4599         (Method): Implement the new IIteratorContainer interface.
4600         (Method.SetYields): Implement the method by setting the ModFlags
4601         to contain METHOD_YIELDS.
4602
4603         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
4604         which just got set to null.
4605
4606         * iterators.cs: New file.
4607
4608         (Yield, YieldBreak): New statements.
4609
4610         * statement.cs (Return.Resolve): Flag an error if we are used in
4611         an iterator method.
4612
4613         * codegen.cs (InIterator): New flag set if the code is being
4614         compiled in an iterator method.
4615
4616         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
4617         internal modifier, and we just use it to avoid adding extra
4618         fields, as this is seldom used.  
4619
4620         * cs-parser.jay: Add yield_statement (yield and yield break).
4621
4622         * driver.cs: New flag -v2 to turn on version 2 features. 
4623
4624         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
4625         hashtable when v2 is enabled.
4626
4627 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
4628
4629         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
4630         there is already a namespace defined with this name.
4631
4632         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
4633         people upgraded their corlibs.
4634
4635         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
4636         always use fully qualified types, no need to use the compiler
4637         front end.
4638
4639         (TypeManager.IsNamespace): Use binarysearch.
4640
4641         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
4642         AddDelegate): I did not quite use the new IsValid API properly: I
4643         have to pass the short-name and the fullname.  I was passing only
4644         the basename instead of the fullname sometimes. 
4645
4646         (TypeContainer.DefineType): call NamespaceClash.
4647
4648         * interface.cs (Interface.DefineType): use NamespaceClash before
4649         defining the type.
4650
4651         * delegate.cs (Delegate.DefineType): use NamespaceClash before
4652         defining the type.
4653
4654         * enum.cs: (Enum.DefineType): use NamespaceClash before
4655         defining the type.
4656
4657         * typemanager.cs (: 3-line patch that gives us some tasty 11%
4658         speed increase.  First, use the negative_hits cache when we get a
4659         negative.  Second, add the type with its full original name
4660         instead of the new . and + encoded name (reflection uses + to
4661         separate type from a nested type).  Use LookupTypeReflection
4662         directly which bypasses the type->name hashtable (that we already
4663         know does not contain the type.
4664
4665         * decl.cs (DeclSpace.ResolveTypeExpr): track the
4666         location/container type. 
4667
4668         * driver.cs: When passing utf8, use directly the UTF8Encoding.
4669
4670 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
4671
4672         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
4673
4674         * delegate.cs (NewDelegate.Resolve): Test whether an instance
4675         method is being referenced in the method group from a static
4676         context, and report error 120 if so.
4677
4678         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
4679         Error118. 
4680
4681         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
4682         is created, we create the A namespace).
4683
4684         * cs-parser.jay: A namespace also introduces a DeclarationFound.
4685         Fixes #41591
4686
4687 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
4688
4689         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
4690         invocation to ModuleBuilder.GetType with the same values will
4691         return a new type instance, so we need to cache its return
4692         values. 
4693
4694         * expression.cs (Binary.ResolveOperator): Only allow the compare
4695         operators on enums if they are of the same type.
4696
4697         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
4698         types of ValueType on their own case.  Before we were giving them
4699         the same treatment as objects.
4700
4701         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
4702         fullname.  Short name is used to compare against container name.
4703         Fullname is used to check against defined namespace names.
4704
4705         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
4706         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
4707
4708         (Method.CheckBase): Call parent.
4709         (MemberBase.CheckBase): Check for protected members on sealed
4710         classes.
4711         (PropertyBase.CheckBase): Call parent.
4712         (Field.Define): Call parent.
4713
4714         * report.cs: Negative error codes are now mapped to 8000 - code,
4715         so that the display is render more nicely.
4716
4717         * typemanager.cs: Do not use try/catch, instead report a regular
4718         error. 
4719
4720         (GetPointerType, GetReferenceType): These methods provide
4721         mechanisms to obtain the T* and T& from a T.  We had the code
4722         previously scattered around the code base, and it also used
4723         TypeManager.LookupType that would go through plenty of caches.
4724         This one goes directly to the type source.
4725
4726         In some places we did the Type.GetType followed by
4727         ModuleBuilder.GetType, but not in others, so this unifies the
4728         processing as well.
4729
4730         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
4731         statements now that we have namespace information.
4732
4733         * typemanager.cs (IsNamespace): New method, returns whether the
4734         string presented is a namespace or not.
4735
4736         (ComputeNamespaces): New public entry point, computes the list of
4737         available namespaces, using the GetNamespaces API call in Mono, or
4738         the slower version in MS.NET.   
4739
4740         Now before we start the semantic analysis phase, we have a
4741         complete list of namespaces including everything that the user has
4742         provided.
4743
4744         Deleted old code to cache namespaces in .nsc files.
4745
4746 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
4747
4748         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
4749         class/struct location definition Location for the implicit
4750         constructor location.
4751
4752         (Operator.Define): Use the location of the operator for the
4753         implicit Method definition.
4754
4755         (Constructor.Emit): use the constructor location for the implicit
4756         base initializer constructor.
4757
4758         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
4759         and the Expression class now contains two new methods:
4760
4761         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
4762         isolate type lookup from the rest of the resolution process.
4763
4764         Since we use Expressions to hold type definitions due to the way
4765         we parse the input we have historically overloaded Resolve to
4766         perform the Type lookups if a special flag is passed.  Now this is
4767         eliminated and two methods take their place. 
4768
4769         The differences in the two methods between xStep and xTerminal is
4770         that xStep is involved in our current lookup system that uses
4771         SimpleNames to compose a name, while xTerminal is used just to
4772         catch the case where the simplename lookup failed.
4773
4774 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
4775
4776         * expression.cs (ResolveMemberAccess): Remove redundant code.
4777         TypeExpr expressions are always born fully resolved.
4778
4779         * interface.cs (PopulateMethod): Do not lookup the types twice.
4780         We were doing it once during SemanticAnalysis and once during
4781         PopulateMethod.
4782
4783         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
4784         in local variable type definitions, were being returned as a
4785         SimpleName (we decomposed everything into a string), that is
4786         because primary_expression was being used instead of a type in the
4787         grammar (reduce/reduce conflicts).
4788
4789         The part that was wrong is that we converted the expression into a
4790         string (an oversimplification in one hand, compounded with primary
4791         expressions doing string concatenation).
4792
4793         So things like:
4794
4795         A.B.C [] x;
4796
4797         Would return "A.B.C[]" as a SimpleName.  This stopped things like
4798         using clauses from working on this particular context.  And a type
4799         was being matched directly against "A.B.C[]".
4800
4801         We now use the correct approach, and allow for ComposedCast to be
4802         part of the unary expression.  So the "A.B.C []" become a composed
4803         cast of "A.B.C" (as a nested group of MemberAccess with a
4804         SimpleName at the end) plus the rank composition "[]". 
4805
4806         Also fixes 35567
4807
4808 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
4809
4810         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
4811         for the access level checking.
4812
4813         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
4814         `TypeContainer container', because I kept getting confused when I
4815         was debugging this code.
4816
4817         * expression.cs (Indexers): Instead of tracking getters/setters,
4818         we now track them in parallel.  We create one arraylist less, but
4819         most importantly it is possible now for the LValue code to find a
4820         matching get for a set.
4821
4822         (IndexerAccess.DoResolveLValue): Update the code.
4823         GetIndexersForType has been modified already to extract all the
4824         indexers from a type.  The code assumed it did not.
4825
4826         Also make the code set the correct return type for the indexer.
4827         This was fixed a long time ago for properties, but was missing for
4828         indexers.  It used to be void_type.
4829
4830         (Binary.Emit): Test first for doubles instead of
4831         floats, as they are more common.
4832
4833         (Binary.EmitBranchable): Use the .un version of the branch opcodes
4834         when dealing with floats and the <=, >= operators.  This fixes bug
4835         #39314 
4836
4837         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
4838         to load the array value by emitting a load on the foreach variable
4839         type.  This was incorrect.  
4840
4841         We now emit the code to load an element using the the array
4842         variable type, and then we emit the conversion operator.
4843
4844         Fixed #40176
4845
4846 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
4847
4848         * attribute.cs: Avoid allocation of ArrayLists in the common case.
4849
4850 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
4851
4852         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
4853         test for protection before we test for signatures. 
4854
4855         (MethodSignature.ToString): implement.
4856
4857         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
4858         to the case where we reduced into a LongConstant.
4859
4860         * decl.cs (CheckAccessLevel): If the type is an array, we can not
4861         depend on whether the information is acurrate, because the
4862         Microsoft runtime will always claim that the array type is public,
4863         regardless of the real state.
4864
4865         If the type is a pointer, another problem happens: the type is
4866         reported as non-public in Microsoft.  
4867
4868         In both cases we have to call CheckAccessLevel recursively with
4869         the underlying type as the argument to be tested.
4870
4871 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
4872
4873         * assign.cs (Assign.Emit): If we are dealing with a compound
4874         assignment expression, we should use the code path that stores the
4875         intermediate result in a temporary value.  This fixes #40903.
4876
4877         *expression.cs (Indirection.ToString): Provide ToString method for
4878         debugging. 
4879
4880 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
4881
4882         * class.cs: Null out fields holding references to Block objects so
4883         they can be garbage collected.
4884
4885         * expression.cs (OverloadResolve): Remove unused local.
4886
4887 2003-04-07  Martin Baulig  <martin@ximian.com>
4888
4889         * codegen.cs (EmitContext.CurrentFile): New public field.
4890         (EmitContext.Mark): Use the CurrentFile to check whether the
4891         location is in the correct file.
4892         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
4893
4894 2003-04-07  Martin Baulig  <martin@ximian.com>
4895
4896         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
4897
4898         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
4899         location.  [FIXME: The location argument which gets passed to this
4900         method is sometimes wrong!]
4901
4902 2003-04-07  Nick Drochak <ndrochak@gol.com>
4903
4904         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
4905
4906 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
4907
4908         * expression.cs (Indirection.EmitAssign): We were using the
4909         temporary, but returning immediately instead of continuing the
4910         EmitAssing flow.
4911
4912 2003-04-06  Martin Baulig  <martin@ximian.com>
4913
4914         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
4915         if it's a nested child, but also deriving from the outer class.
4916         See test 190.cs.
4917
4918         * typemanager.cs (IsNestedChildOf): Make this work if it's a
4919         nested child, but also deriving from the outer class.  See
4920         test-190.cs.
4921         (FilterWithClosure): We may access private members of the outer
4922         class if we're a nested child and deriving from the outer class.
4923         (RealMemberLookup): Only set `closure_private_ok' if the
4924         `original_bf' contained BindingFlags.NonPublic.
4925
4926 2003-04-05  Martin Baulig  <martin@ximian.com>
4927
4928         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
4929         probe if its a type parameter, and if so, flag an error.
4930
4931         * decl.cs: Move here the SetParameterInfo code from class.cs.
4932         Handle IsGeneric here.
4933
4934         Handle a variety of errors in the parameter info definition.
4935
4936         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
4937         type parameters here.
4938
4939         * cs-parser.jay (class_declaration): report errors for parameters
4940         here as well.
4941
4942 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
4943
4944         * generic.cs: New file, contains support code for generics.
4945
4946         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
4947         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
4948
4949         Update parser for the above removals.
4950
4951         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
4952         now taken care of in the parser.
4953
4954 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
4955
4956         * class.cs (Event.Define): Do not allow abstract events to have
4957         initializers. 
4958
4959 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
4960
4961         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
4962         block in event declarations.
4963
4964         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
4965         value type, get its address.
4966
4967         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
4968         leaving a class on the stack instead of a boolean value (int
4969         0/1).  Change the code so we compare against null, and then the
4970         result against zero.
4971
4972         * class.cs (TypeContainer.GetClassBases): We were checking for the
4973         parent class being sealed too late.
4974
4975         * expression.cs (Binary.Emit): For <= and >= when dealing with
4976         floating point values, use cgt.un and clt.un instead of cgt and
4977         clt alone.
4978
4979 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
4980
4981         * statement.cs: Apply the same optimization as MS: skip the 
4982         GetEnumerator returning an IEnumerator, and use the one returning a 
4983         CharEnumerator instead. This allows us to avoid the try-finally block 
4984         and the boxing.
4985
4986 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
4987
4988         * cs-parser.jay: Attributes cannot be applied to
4989                          namespaces. Fixes #40473
4990
4991 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4992
4993         * class.cs:
4994         (Add*): check if the name is valid using the full name for constants,
4995         fields, properties and events.
4996
4997 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
4998
4999         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
5000         char constants to be part of the enumeration.
5001
5002         * expression.cs (Conditional.DoResolve): Add support for operator
5003         true. Implements the missing functionality from 14.12
5004
5005         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
5006         operator true/false as required by the spec.
5007
5008         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
5009         implicit conversion to boolean.
5010
5011         * statement.cs (Statement.ResolveBoolean): A boolean expression is
5012         also one where the type implements `operator true'. 
5013
5014         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
5015         get an expression that will invoke operator true based on an
5016         expression.  
5017
5018         (GetConversionOperators): Removed the hack that called op_True
5019         here.  
5020
5021         (Expression.ResolveBoolean): Move this from Statement.
5022
5023 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
5024
5025         * ecore.cs (FieldExpr): do not allow initialization of initonly
5026         fields on derived classes
5027
5028 2003-03-13  Martin Baulig  <martin@ximian.com>
5029
5030         * statement.cs (Block.Emit): Call ig.BeginScope() and
5031         ig.EndScope() when compiling with debugging info; call
5032         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
5033
5034 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
5035
5036         * expression.cs (Indexers): Do not construct immediately, allow
5037         for new members to be appended as we go.  Fixes 38143
5038
5039 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5040
5041         * expression.cs: save/restore context when resolving an unchecked
5042         expression.
5043
5044 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
5045
5046         * cfold.cs: Catch division by zero in modulus operator during
5047         constant folding.
5048
5049 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
5050
5051         * interface.cs (Interface.DefineMembers): Avoid defining members
5052         twice. 
5053
5054 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
5055
5056         * driver.cs: handle the +/- options for -noconfig
5057
5058         * statement.cs (Unckeched.Resolve): Also track the state of
5059         unchecked in the Resolve phase.
5060
5061 2003-02-27  Martin Baulig  <martin@ximian.com>
5062
5063         * ecore.cs (Expression.MemberLookup): Don't create a
5064         MethodGroupExpr for something which is not a method.  Fixes #38291.
5065
5066 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
5067
5068         * class.cs (MemberBase.CheckParameters): Also check that the type
5069         is unmanaged if it is a pointer.
5070
5071         * expression.cs (SizeOf.Resolve): Add location information.
5072
5073         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
5074         a managed type is declared.
5075
5076         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
5077         parameter modifiers as well.  Fixes bug 38606
5078
5079         * class.cs: Very sad.  Am backing out the speed up changes
5080         introduced by the ArrayList -> Array in the TypeContainer, as they
5081         were not actually that much faster, and introduced a bug (no error
5082         reports on duplicated methods).
5083
5084         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
5085         source first, this will guarantee that we have a valid expression
5086         before calling in lower levels functions that will require a
5087         resolved object.  Then use this original_source in the
5088         target.ResolveLValue instead of the original source that was
5089         passed to us.
5090
5091         Another change.  Use target.Resolve instead of LValueResolve.
5092         Although we are resolving for LValues, we will let the Assign code
5093         take care of that (it will be called again from Resolve).  This
5094         basically allows code like this:
5095
5096         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
5097         class Y { void A (X x) { x [0] += o; }
5098
5099         The problem was that the indexer was trying to resolve for
5100         set_Item (idx, object o) and never finding one.  The real set_Item
5101         was set_Item (idx, X).  By delaying the process we get the right
5102         semantics. 
5103
5104         Fixes bug 36505
5105
5106 2003-02-23  Martin Baulig  <martin@ximian.com>
5107
5108         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
5109         while calling DoEmit ().
5110
5111         * codegen.cs (EmitContext.Mark): Don't mark locations in other
5112         source files; if you use the #line directive inside a method, the
5113         compiler stops emitting line numbers for the debugger until it
5114         reaches the end of the method or another #line directive which
5115         restores the original file.
5116
5117 2003-02-23  Martin Baulig  <martin@ximian.com>
5118
5119         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
5120
5121 2003-02-23  Martin Baulig  <martin@ximian.com>
5122
5123         * statement.cs (Block.AddChildVariableNames): We need to call this
5124         recursively, not just for our immediate children.
5125
5126 2003-02-23  Martin Baulig  <martin@ximian.com>
5127
5128         * class.cs (Event.Define): Always make the field private, like csc does.
5129
5130         * typemanager.cs (TypeManager.RealMemberLookup): Make events
5131         actually work, fixes bug #37521.
5132
5133 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
5134
5135         * delegate.cs: When creating the various temporary "Parameters"
5136         classes, make sure that we call the ComputeAndDefineParameterTypes
5137         on those new parameters (just like we do with the formal ones), to
5138         allow them to be resolved in the context of the DeclSpace.
5139
5140         This fixes the bug that Dick observed in Bugzilla #38530.
5141
5142 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
5143
5144         * expression.cs (ResolveMemberAccess): When resolving a constant,
5145         do not attempt to pull a constant if the value was not able to
5146         generate a valid constant.
5147
5148         * const.cs (LookupConstantValue): Do not report more errors than required.
5149
5150 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5151
5152         * expression.cs: fixes bug #38328.
5153
5154 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5155
5156         * class.cs: Changed all the various members that can be part of a
5157         class from being an ArrayList to be an Array of the right type.
5158         During the DefineType type_list, interface_list, delegate_list and
5159         enum_list are turned into types, interfaces, delegates and enums
5160         arrays.  
5161
5162         And during the member population, indexer_list, event_list,
5163         constant_list, field_list, instance_constructor_list, method_list,
5164         operator_list and property_list are turned into their real arrays.
5165
5166         Although we could probably perform this operation earlier, for
5167         good error reporting we need to keep the lists and remove the
5168         lists for longer than required.
5169
5170         This optimization was triggered by Paolo profiling the compiler
5171         speed on the output of `gen-sample-program.pl' perl script. 
5172
5173         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
5174         not crash in methods like MemberLookupFailed that use this field.  
5175
5176         This problem arises when the compiler fails to resolve a type
5177         during interface type definition for example.
5178
5179 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5180
5181         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
5182         inherit from System.Object, so we have to stop at null, not only
5183         when reaching System.Object.
5184
5185 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
5186
5187         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
5188         DeclaredOnly because the parent indexer might have had a different
5189         name, but did not loop until the top of the hierarchy was reached.
5190
5191         The problem this one fixes is 35492: when a class implemented an
5192         indexer from an interface, we were getting the interface method
5193         (which was abstract) and we were flagging an error (can not invoke
5194         abstract method).
5195
5196         This also keeps bug 33089 functioning, and test-148 functioning.
5197
5198         * typemanager.cs (IsSpecialMethod): The correct way of figuring
5199         out if a method is special is to see if it is declared in a
5200         property or event, or whether it is one of the predefined operator
5201         names.   This should fix correctly #36804.
5202
5203 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
5204
5205         The goal here is to remove the dependency on EmptyCast.Peel ().
5206         Killing it completely.
5207
5208         The problem is that currently in a number of places where
5209         constants are expected, we have to "probe" for an EmptyCast, and
5210         Peel, which is not the correct thing to do, as this will be
5211         repetitive and will likely lead to errors. 
5212
5213         The idea is to remove any EmptyCasts that are used in casts that
5214         can be reduced to constants, so we only have to cope with
5215         constants. 
5216
5217         This bug hunt was triggered by Bug 37363 and the desire to remove
5218         the duplicate pattern where we were "peeling" emptycasts to check
5219         whether they were constants.  Now constants will always be
5220         constants.
5221
5222         * ecore.cs: Use an enumconstant here instead of wrapping with
5223         EmptyCast.  
5224
5225         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
5226         throwing me off.  By handling this we can get rid of a few hacks.
5227
5228         * statement.cs (Switch): Removed Peel() code.
5229
5230 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
5231
5232         * class.cs: Location information for error 508
5233
5234         * expression.cs (New.DoResolve): Add a guard against double
5235         resolution of an expression.  
5236
5237         The New DoResolve might be called twice when initializing field
5238         expressions (see EmitFieldInitializers, the call to
5239         GetInitializerExpression will perform a resolve on the expression,
5240         and later the assign will trigger another resolution
5241
5242         This leads to bugs (#37014)
5243
5244         * delegate.cs: The signature for EndInvoke should contain any ref
5245         or out parameters as well.  We were not doing this in the past. 
5246
5247         * class.cs (Field.Define): Do not overwrite the type definition
5248         inside the `volatile' group.  Turns out that volatile enumerations
5249         were changing the type here to perform a validity test, which
5250         broke conversions. 
5251
5252 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
5253
5254         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
5255         and structs, we do not want to load the instance variable
5256
5257         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
5258         enum_type has to be handled like an object reference (implicit
5259         conversions exists from this to object), but the regular IsClass
5260         and IsValueType tests will never return true for this one.
5261
5262         Also we use TypeManager.IsValueType instead of type.IsValueType,
5263         just for consistency with the rest of the code (this is only
5264         needed if we ever use the construct exposed by test-180.cs inside
5265         corlib, which we dont today).
5266
5267 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
5268
5269         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
5270         just InternalCall.
5271
5272 2003-02-09  Martin Baulig  <martin@ximian.com>
5273
5274         * namespace.cs (Namespace..ctor): Added SourceFile argument.
5275         (Namespace.DefineNamespaces): New static public method; this is
5276         called when we're compiling with debugging to add all namespaces
5277         to the symbol file.
5278
5279         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
5280         pass it to the Namespace's .ctor.
5281
5282         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
5283         and MethodBase arguments; pass the namespace ID to the symwriter;
5284         pass the MethodBase instead of the token to the symwriter.
5285         (SymbolWriter.DefineNamespace): New method to add a namespace to
5286         the symbol file.
5287
5288 2003-02-09  Martin Baulig  <martin@ximian.com>
5289
5290         * symbolwriter.cs: New file.  This is a wrapper around
5291         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
5292         methods here in near future.
5293
5294 2003-02-09  Martin Baulig  <martin@ximian.com>
5295
5296         * codegen.cs (EmitContext.Mark): Just pass the arguments to
5297         ILGenerator.MarkSequencePoint() which are actually used by the
5298         symbol writer.
5299
5300 2003-02-09  Martin Baulig  <martin@ximian.com>
5301
5302         * location.cs (SourceFile): New public sealed class.  This
5303         contains the name and an index which is used in the location's token.
5304         (Location): Reserve an appropriate number of bits in the token for
5305         the source file instead of walking over that list, this gives us a
5306         really huge performance improvement when compiling with debugging.
5307
5308         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
5309         `SourceFile' argument instead of a string.
5310         (Driver.ProcessFile): Add all the files via Location.AddFile(),
5311         but don't parse/tokenize here, we need to generate the list of all
5312         source files before we do that.
5313         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
5314         the files.
5315
5316         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
5317         instead of a string.
5318
5319         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
5320         of a string.
5321
5322 2003-02-09  Martin Baulig  <martin@ximian.com>
5323
5324         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
5325         filename on `#line default'.
5326
5327 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
5328
5329         * statement.cs: don't clear the pinned var when the fixed statement
5330         returns from the method (fixes bug#37752).
5331
5332 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
5333
5334         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
5335         to IsValueType.
5336
5337 2003-02-07  Martin Baulig  <martin@ximian.com>
5338
5339         * driver.cs: Removed the `--debug-args' command line argument.
5340
5341         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
5342         automatically by the AsssemblyBuilder.
5343         (CodeGen.InitializeSymbolWriter): We don't need to call any
5344         initialization function on the symbol writer anymore.  This method
5345         doesn't take any arguments.
5346
5347 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
5348
5349         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
5350         from referenced assemblies as well.
5351
5352 2003-02-02  Martin Baulig  <martin@ximian.com>
5353
5354         * class.cs (MethodData.Emit): Generate debugging info for external methods.
5355
5356 2003-02-02  Martin Baulig  <martin@ximian.com>
5357
5358         * class.cs (Constructor.Emit): Open the symbol writer before
5359         emitting the constructor initializer.
5360         (ConstructorInitializer.Emit): Call ec.Mark() to allow
5361         single-stepping through constructor initializers.
5362
5363 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
5364
5365         * class.cs: Handle error 549: do not allow virtual methods in
5366         sealed classes. 
5367
5368 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
5369
5370         * decl.cs: Check access levels when resolving types
5371
5372 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
5373
5374         * statement.cs: Add parameters and locals set in catch blocks that might 
5375         return to set vector
5376
5377 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
5378
5379         * class.cs (Operator): Set the SpecialName flags for operators.
5380
5381         * expression.cs (Invocation.DoResolve): Only block calls to
5382         accessors and operators on SpecialName methods.
5383
5384         (Cast.TryReduce): Handle conversions from char constants.
5385
5386
5387 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
5388
5389         * statement.cs: small memory and time optimization in FlowBranching.
5390
5391 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
5392
5393         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
5394         problem that the last fix but in the other sid (Set).
5395
5396         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
5397         access when there is no indexer in the hierarchy.
5398
5399 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
5400
5401         * class.cs: Combine some if statements.
5402
5403 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5404
5405         * driver.cs: fixed bug #37187.
5406
5407 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
5408
5409         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
5410         any indexer, it's needed to build a list with all the indexers in the
5411         hierarchy (AllGetters), else we have problems. Fixes #35653.
5412
5413 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
5414
5415         * class.cs (MethodData.Define): It is wrong for an interface
5416         implementation to be static in both cases: explicit and implicit.
5417         We were only handling this in one case.
5418
5419         Improve the if situation there to not have negations.
5420
5421         * class.cs (Field.Define): Turns out that we do not need to check
5422         the unsafe bit on field definition, only on usage.  Remove the test.
5423
5424 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5425
5426         * driver.cs: use assembly.Location instead of Codebase (the latest
5427         patch made mcs fail when using MS assemblies).
5428
5429 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
5430
5431         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
5432         get the path to *corlib.dll.
5433
5434 2003-01-21  Nick Drochak <ndrochak@gol.com>
5435
5436         * cs-tokenizer.cs:
5437         * pending.cs:
5438         * typemanager.cs: Remove compiler warnings
5439
5440 2003-01-20  Duncan Mak  <duncan@ximian.com>
5441
5442         * AssemblyInfo.cs: Bump the version number to 0.19.
5443
5444 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5445
5446         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
5447
5448 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
5449
5450         * class.cs (Constructor::Emit): Emit debugging info for constructors.
5451
5452 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
5453
5454         * cs-parser.jay: Small fix: we were not comparing the constructor
5455         name correctly.   Thanks to Zoltan for the initial pointer.
5456
5457 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
5458
5459         * cs-tokenizer.cs: Set file name when specified with #line
5460
5461 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
5462
5463         * cs-parser.jay: Only perform the constructor checks here if we
5464         are named like the class;  This will help provider a better
5465         error.  The constructor path is taken when a type definition is
5466         not found, but most likely the user forgot to add the type, so
5467         report that rather than the constructor error.
5468
5469 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
5470
5471         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
5472         allocations.
5473
5474 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
5475
5476         * cs-parser.jay: Add cleanup call.
5477
5478 2003-01-13  Duncan Mak  <duncan@ximian.com>
5479
5480         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
5481         consistent with other methods.
5482
5483 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
5484
5485         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
5486
5487 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
5488
5489         * attribute.cs: only set GuidAttr to true when we have a
5490         GuidAttribute.
5491
5492 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5493
5494         * ecore.cs:
5495         * expression.cs:
5496         * typemanager.cs: fixes to allow mcs compile corlib with the new
5497         Type.IsSubclassOf fix.
5498
5499 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
5500
5501         * expression.cs (LocalVariableReference.DoResolve): Classify a
5502         constant as a value, not as a variable.   Also, set the type for
5503         the variable.
5504
5505         * cs-parser.jay (fixed_statement): take a type instead of a
5506         pointer_type, so we can produce a better error message later.
5507
5508         * statement.cs (Fixed.Resolve): Flag types that are not pointers
5509         as an error.  
5510
5511         (For.DoEmit): Make inifinite loops have a
5512         non-conditional branch back.
5513
5514         (Fixed.DoEmit): First populate the pinned variables, then emit the
5515         statement, then clear the variables.  Before I was emitting the
5516         code once for each fixed piece.
5517
5518
5519 2003-01-08  Martin Baulig  <martin@ximian.com>
5520
5521         * statement.cs (FlowBranching.MergeChild): A break in a
5522         SWITCH_SECTION does not leave a loop.  Fixes #36155.
5523
5524 2003-01-08  Martin Baulig  <martin@ximian.com>
5525
5526         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
5527         lives in the same number space than `param_map'.  Fixes #36154.
5528
5529 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
5530
5531         * cs-parser.jay (constructor_declaration): Set the
5532         Constructor.ModFlags before probing for it.  This makes the
5533         compiler report 514, 515 and 132 (the code was there, but got
5534         broken). 
5535
5536         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
5537         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
5538         (GotoCase.Resolve): Set `Returns' to ALWAYS.
5539
5540 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
5541
5542         * enum.cs: create the enum static fields using the enum type.
5543
5544 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
5545
5546         * class.cs: don't try to create the ParamBuilder for the return
5547         type if it's not needed (and handle it breaking for the ms runtime
5548         anyway).
5549
5550 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
5551
5552         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
5553
5554 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
5555
5556         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
5557         the command.   This showed up while compiling the JANET source
5558         code, which used \r as its only newline separator.
5559
5560 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
5561
5562         * class.cs (Method.Define): If we are an operator (because it
5563         reuses our code), then set the SpecialName and HideBySig.  #36128
5564
5565 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
5566
5567         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
5568         exception, report error 120 `object reference required'.
5569
5570         * driver.cs: Add --pause option, used during to measure the size
5571         of the process as it goes with --timestamp.
5572
5573         * expression.cs (Invocation.DoResolve): Do not allow methods with
5574         SpecialName to be invoked.
5575
5576 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
5577
5578         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
5579         number before adding it.
5580
5581 2002-12-21  Ravi Pratap  <ravi@ximian.com>
5582
5583         * ecore.cs (StandardImplicitConversion): When in an unsafe
5584         context, we allow conversion between void * to any other pointer
5585         type. This fixes bug #35973.
5586
5587 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
5588
5589         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
5590         is not thrown when extensionless outputs are used 
5591
5592 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5593
5594         * rootcontext.cs: fixed compilation of corlib.
5595
5596 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
5597
5598         * attribute.cs (Attributes.Contains): Add new method.
5599
5600         * class.cs (MethodCore.LabelParameters): if the parameter is an
5601         `out' parameter, check that no attribute `[In]' has been passed.
5602
5603         * enum.cs: Handle the `value__' name in an enumeration.
5604
5605 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
5606
5607         * decl.cs: Added special case to allow overrides on "protected
5608         internal" methods
5609
5610 2002-12-18  Ravi Pratap  <ravi@ximian.com>
5611
5612         * attribute.cs (Attributes.AddAttributeSection): Rename to this
5613         since it makes much more sense.
5614
5615         (Attributes.ctor): Don't require a Location parameter.
5616
5617         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
5618
5619         * attribute.cs (ApplyAttributes): Remove extra Location parameters
5620         since we already have that information per attribute.
5621
5622         * everywhere : make appropriate changes.
5623
5624         * class.cs (LabelParameters): Write the code which actually
5625         applies attributes to the return type. We can't do this on the MS
5626         .NET runtime so we flag a warning in the case an exception is
5627         thrown.
5628
5629 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
5630
5631         * const.cs: Handle implicit null conversions here too.
5632
5633 2002-12-17  Ravi Pratap  <ravi@ximian.com>
5634
5635         * class.cs (MethodCore.LabelParameters): Remove the extra
5636         Type [] parameter since it is completely unnecessary. Instead
5637         pass in the method's attributes so that we can extract
5638         the "return" attribute.
5639
5640 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
5641
5642         * cs-parser.jay (parse): Use Report.Error to flag errors instead
5643         of ignoring it and letting the compile continue.
5644
5645         * typemanager.cs (ChangeType): use an extra argument to return an
5646         error condition instead of throwing an exception.
5647
5648 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
5649
5650         * expression.cs (Unary.TryReduce): mimic the code for the regular
5651         code path.  Perform an implicit cast in the cases where we can
5652         implicitly convert to one of the integral types, and then reduce
5653         based on that constant.   This fixes bug #35483.
5654
5655 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5656
5657         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
5658
5659 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5660
5661         * namespace.cs: fixed bug #35489.
5662
5663 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
5664
5665         * class.cs: Remove some dead code.
5666
5667         * cs-parser.jay: Estimate the number of methods needed
5668         (RootContext.MethodCount);
5669
5670         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
5671         numbers instead of StringBuilders.
5672
5673         * support.cs (PtrHashtable): Add constructor with initial size;
5674         We can now reduce reallocations of the method table.
5675
5676 2002-12-10  Ravi Pratap  <ravi@ximian.com>
5677
5678         * attribute.cs (ApplyAttributes): Keep track of the emitted
5679         attributes on a per-target basis. This fixes bug #35413.
5680
5681 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
5682
5683         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
5684         default to the Windows 1252 encoding.
5685
5686         (UnixParseOption): Support version, thanks to Alp for the missing
5687         pointer. 
5688
5689         * AssemblyInfo.cs: Add nice assembly information.
5690
5691         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
5692         (bug 35169).
5693
5694         * cs-parser.jay: Allow a trailing comma before the close bracked
5695         in the attribute_section production.
5696
5697         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
5698         address of the instance was being taken, I will take this out,
5699         because we take the address of the object immediately here.
5700
5701 2002-12-09  Ravi Pratap  <ravi@ximian.com>
5702
5703         * typemanager.cs (AreMultipleAllowed): Take care of the most
5704         obvious case where attribute type is not in the current assembly -
5705         stupid me ;-)
5706
5707 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
5708
5709         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
5710         definitions, instead of doing that afterwards.  
5711
5712         Also we use a nice little hack, depending on the constructor, we
5713         know if we are a "composed" name or a simple name.  Hence, we
5714         avoid the IndexOf test, and we avoid 
5715
5716         * codegen.cs: Add code to assist in a bug reporter to track down
5717         the source of a compiler crash. 
5718
5719 2002-12-07  Ravi Pratap  <ravi@ximian.com>
5720
5721         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
5722         types have been emitted for a given element and flag an error
5723         if something which does not have AllowMultiple set is used more
5724         than once.
5725
5726         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
5727         attribute types and their corresponding AllowMultiple properties
5728
5729         (AreMultipleAllowed): Check the property for a given type.
5730
5731         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
5732         property in the case we have a TypeContainer.
5733
5734         (Attributes.AddAttribute): Detect duplicates and just skip on
5735         adding them. This trivial fix catches a pretty gross error in our
5736         attribute emission - global attributes were being emitted twice!
5737
5738         Bugzilla bug #33187 is now fixed.
5739
5740 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
5741
5742         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
5743         instead of pp_and).
5744
5745         * expression.cs (Binary.ResolveOperator): I can only use the
5746         Concat (string, string, string) and Concat (string, string,
5747         string, string) if the child is actually a concatenation of
5748         strings. 
5749
5750 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
5751
5752         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
5753         context where we need a 2-character lookahead.
5754
5755         * pending.cs (PendingImplementation): Rework so we can keep track
5756         of interface types all the time, and flag those which were
5757         implemented by parents as optional.
5758
5759 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
5760
5761         * expression.cs (Binary.ResolveOperator): Use
5762         String.Concat(string,string,string) or
5763         String.Concat(string,string,string,string) when possible. 
5764
5765         * typemanager: More helper methods.
5766
5767
5768 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
5769
5770         * pending.cs: remove the bogus return from GetMissingInterfaces()
5771         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
5772
5773 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5774
5775         * namespace.cs: avoid duplicated 'using xxx' being added to
5776         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
5777         when we get more than one 'using' statement for the same namespace.
5778         Report a CS0105 warning for it.
5779
5780 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
5781
5782         * cs-tokenizer.cs (consume_identifier): use read directly, instead
5783         of calling getChar/putback, uses internal knowledge of it.    
5784
5785         (xtoken): Reorder tokenizer so most common patterns are checked
5786         first.  This reduces the compilation time in another 5% (from 8.11s
5787         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
5788
5789         The parsing time is 22% of the compilation in mcs, and from that
5790         64% is spent on the tokenization process.  
5791
5792         I tried using a binary search for keywords, but this is slower
5793         than the hashtable.  Another option would be to do a couple of
5794         things:
5795
5796                 * Not use a StringBuilder, instead use an array of chars,
5797                   with a set value.  Notice that this way we could catch
5798                   the 645 error without having to do it *afterwards*.
5799
5800                 * We could write a hand-parser to avoid the hashtable
5801                   compares altogether.
5802
5803         The identifier consumption process takes 37% of the tokenization
5804         time.  Another 15% is spent on is_number.  56% of the time spent
5805         on is_number is spent on Int64.Parse:
5806
5807                 * We could probably choose based on the string length to
5808                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
5809                   computations. 
5810
5811         Another 3% is spend on wrapping `xtoken' in the `token' function.
5812
5813         Handle 0xa0 as whitespace (#34752)
5814
5815 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
5816
5817         * typemanager.cs (IsCLRType): New routine to tell whether a type
5818         is one of the builtin types.  
5819
5820         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
5821         typecode in more places instead of doing pointer comparissions.
5822         We could leverage some knowledge about the way the typecodes are
5823         laid out.
5824
5825         New code to cache namespaces in assemblies, it is currently not
5826         invoked, to be used soon.
5827
5828         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
5829
5830         * expression.cs (Binary.ResolveOperator): specially handle
5831         strings, and do not perform user-defined operator overloading for
5832         built-in types.
5833
5834 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
5835
5836         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
5837         internalcall as it is a pretty simple operation;  Avoid whenever
5838         possible to call Char.IsLetter.
5839
5840         (consume_identifier): Cut by half the number of
5841         hashtable calls by merging the is_keyword and GetKeyword behavior.
5842
5843         Do not short-circuit, because if we do, we
5844         report errors (ie, #if false && true would produce an invalid
5845         directive error);
5846
5847
5848 2002-11-24  Martin Baulig  <martin@ximian.com>
5849
5850         * expression.cs (Cast.TryReduce): If we're in checked syntax,
5851         check constant ranges and report a CS0221.  Fixes #33186.
5852
5853 2002-11-24  Martin Baulig  <martin@ximian.com>
5854
5855         * cs-parser.jay: Make this work for uninitialized variable
5856         declarations in the `for' initializer.  Fixes #32416.
5857
5858 2002-11-24  Martin Baulig  <martin@ximian.com>
5859
5860         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
5861         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
5862
5863 2002-11-24  Martin Baulig  <martin@ximian.com>
5864
5865         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
5866         argument; if true, we also check for user-defined conversions.
5867         This is only needed if both arguments are of a user-defined type.
5868         Fixes #30443, added test-175.cs.
5869         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
5870
5871         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
5872
5873 2002-11-24  Martin Baulig  <martin@ximian.com>
5874
5875         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
5876         function to get the store opcode.
5877         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
5878         only emit the Ldelema if the store opcode is Stobj.  You must run
5879         both test-34 and test-167 to test this.  Fixes #34529.
5880
5881 2002-11-23  Martin Baulig  <martin@ximian.com>
5882
5883         * ecore.cs (Expression.MemberLookup): Added additional
5884         `qualifier_type' argument which is used when we're being called
5885         from MemberAccess.DoResolve() and null if we're called from a
5886         SimpleName lookup.
5887         (Expression.MemberLookupFailed): New method to report errors; this
5888         does the CS1540 check and reports the correct error message.
5889
5890         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
5891         argument for the CS1540 check and redone the way how we're dealing
5892         with private members.  See the comment in the source code for details.
5893         (FilterWithClosure): Reverted this back to revision 1.197; renamed
5894         `closure_start_type' to `closure_qualifier_type' and check whether
5895         it's not null.  It was not this filter being broken, it was just
5896         being called with the wrong arguments.
5897
5898         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
5899         and pass it the correct `qualifier_type'; this also does the error
5900         handling for us.
5901
5902 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
5903
5904         * expression.cs (Invocation.EmitParams): If the we are dealing
5905         with a non-built-in value type, load its address as well.
5906
5907         (ArrayCreation): Use a a pretty constant instead
5908         of the hardcoded value 2.   Use 6 instead of 2 for the number of
5909         static initializers.  
5910
5911         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
5912         because they are not really value types, just glorified integers. 
5913
5914         * driver.cs: Do not append .exe, the CSC compiler does not do it.
5915
5916         * ecore.cs: Remove redundant code for enumerations, make them use
5917         the same code path as everything else, fixes the casting issue
5918         with enumerations in Windows.Forms.
5919
5920         * attribute.cs: Do only cast to string if it is a string, the
5921         validation happens later.
5922
5923         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
5924         people upgrade their corlibs.
5925
5926         * ecore.cs: Oops, enumerations were not following the entire code path
5927
5928 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
5929
5930         * typemanager.cs (FilterWithClosure): Commented out the test for
5931         1540 in typemanager.cs, as it has problems when accessing
5932         protected methods from a parent class (see test-174.cs). 
5933
5934         * attribute.cs (Attribute.ValidateGuid): new method.
5935         (Attribute.Resolve): Use above.
5936
5937 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
5938
5939         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
5940
5941         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
5942         handling for enumerations, as we only needed the TypeContainer
5943         functionality to begin with (this is required for the fix below to
5944         work for enums that reference constants in a container class for
5945         example). 
5946
5947         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
5948
5949         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
5950         a valid TypeBuilder to perform lookups on.o
5951
5952         * class.cs (InheritableMemberSignatureCompare): Use true in the
5953         call to GetGetMethod and GetSetMethod, because we are comparing
5954         the signature, and we need to get the methods *even* if they are
5955         private. 
5956
5957         (PropertyBase.CheckBase): ditto.
5958
5959         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
5960         GotoCase.Resolve): Use Peel on EmpytCasts.
5961
5962         * ecore.cs (EmptyCast): drop child, add Peel method.
5963
5964 2002-11-17  Martin Baulig  <martin@ximian.com>
5965
5966         * ecore.cs (EmptyCast.Child): New public property.
5967
5968         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
5969         label resolved to an EmptyCast.  Fixes #34162.
5970         (GotoCase.Resolve): Likewise.
5971         (Block.EmitMeta): Likewise.
5972
5973 2002-11-17  Martin Baulig  <martin@ximian.com>
5974
5975         * expression.cs (Invocation.BetterConversion): Prefer int over
5976         uint; short over ushort; long over ulong for integer literals.
5977         Use ImplicitConversionExists instead of StandardConversionExists
5978         since we also need to check for user-defined implicit conversions.
5979         Fixes #34165.  Added test-173.cs.
5980
5981 2002-11-16  Martin Baulig  <martin@ximian.com>
5982
5983         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
5984         with the `true' and `false' literals.  Fixes #33151.
5985
5986 2002-11-16  Martin Baulig  <martin@ximian.com>
5987
5988         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
5989         October 22nd; don't do the cs1540 check for static members.
5990
5991         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
5992         now using our own filter here and doing the cs1540 check again.
5993
5994 2002-11-16  Martin Baulig  <martin@ximian.com>
5995
5996         * support.cs (InternalParameters): Don't crash if we don't have
5997         any fixed parameters.  Fixes #33532.
5998
5999 2002-11-16  Martin Baulig  <martin@ximian.com>
6000
6001         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
6002         when looking up static methods to make this work on Windows.
6003         Fixes #33773.
6004
6005 2002-11-16  Martin Baulig  <martin@ximian.com>
6006
6007         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
6008         a setter rather than using PropertyInfo.CanWrite.
6009
6010 2002-11-15  Nick Drochak  <ndrochak@gol.com>
6011
6012         * class.cs: Allow acces to block member by subclasses. Fixes build
6013         breaker.
6014
6015 2002-11-14  Martin Baulig  <martin@ximian.com>
6016
6017         * class.cs (Constructor.Emit): Added the extern/block check.
6018         Fixes bug #33678.
6019
6020 2002-11-14  Martin Baulig  <martin@ximian.com>
6021
6022         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
6023         iteration while looking for indexers, this is needed because the
6024         indexer may have a different name in our base classes.  Fixed the
6025         error reporting (no indexers at all, not get accessor, no
6026         overloaded match).  Fixes bug #33089.
6027         (IndexerAccess.DoResolveLValue): Likewise.
6028
6029 2002-11-14  Martin Baulig  <martin@ximian.com>
6030
6031         * class.cs (PropertyBase.CheckBase): Make this work for multiple
6032         indexers.  Fixes the first part of bug #33089.
6033         (MethodSignature.InheritableMemberSignatureCompare): Added support
6034         for properties.
6035
6036 2002-11-13  Ravi Pratap  <ravi@ximian.com>
6037
6038         * attribute.cs (Attribute.Resolve): Catch the
6039         NullReferenceException and report it since it isn't supposed to
6040         happen. 
6041
6042 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
6043
6044         * expression.cs (Binary.EmitBranchable): Also handle the cases for
6045         LogicalOr and LogicalAnd that can benefit from recursively
6046         handling EmitBranchable.  The code now should be nice for Paolo.
6047
6048 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
6049
6050         * typemanager.cs (LookupType): Added a negative-hit hashtable for
6051         the Type lookups, as we perform quite a number of lookups on
6052         non-Types.  This can be removed once we can deterministically tell
6053         whether we have a type or a namespace in advance.
6054
6055         But this might require special hacks from our corlib.
6056
6057         * TODO: updated.
6058
6059         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
6060         and double which avoids a conversion from an integer to a double.
6061
6062         * expression.cs: tiny optimization, avoid calling IsConstant,
6063         because it effectively performs the lookup twice.
6064
6065 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
6066
6067         But a bogus return here to keep the semantics of the old code
6068         until the Mono runtime is fixed.
6069
6070         * pending.cs (GetMissingInterfaces): New method used to remove all
6071         the interfaces that are already implemented by our parent
6072         classes from the list of pending methods. 
6073
6074         * interface.cs: Add checks for calls after ResolveTypeExpr.
6075
6076 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
6077
6078         * class.cs (Class.Emit): Report warning 67: event not used if the
6079         warning level is beyond 3.
6080
6081         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
6082         being a NullLiteral.
6083
6084         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
6085         specifiers. 
6086
6087         * class.cs (TypeContainer.GetClassBases): Cover a missing code
6088         path that might fail if a type can not be resolved.
6089
6090         * expression.cs (Binary.Emit): Emit unsigned versions of the
6091         operators. 
6092
6093         * driver.cs: use error 5.
6094
6095 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
6096
6097         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
6098
6099 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
6100
6101         * cs-parser.jay (switch_section): A beautiful patch from Martin
6102         Baulig that fixed 33094.
6103
6104 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
6105
6106         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
6107         Check whether the base is abstract and report an error if so.
6108
6109         * expression.cs (IndexerAccess.DoResolveLValue,
6110         IndexerAccess.DoResolve): ditto. 
6111
6112         (Invocation.DoResolve): ditto.
6113
6114         (Invocation.FullMethodDesc): Improve the report string.
6115
6116         * statement.cs (Block): Eliminate IsVariableDefined as it is
6117         basically just a wrapper for GetVariableInfo.
6118
6119         * ecore.cs (SimpleName): Use new 
6120
6121         * support.cs (ReflectionParamter.ParameterType): We unwrap the
6122         type, as we return the actual parameter ref/unref state on a
6123         different call.
6124
6125 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
6126
6127         * support.cs: Return proper flags REF/OUT fixing the previous
6128         commit.  
6129
6130         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
6131         not used to mean `ref' but `ref or out' in ParameterReference
6132
6133         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
6134         full type signature instead of calling TypeManger.CSharpName
6135         ourselves. 
6136
6137         * support.cs (InternalParameters.ParameterDesc): Do not compare
6138         directly to the modflags, because REF/OUT will actually be bitsets
6139         if set. 
6140
6141         * delegate.cs (VerifyMethod): Check also the modifiers.
6142
6143         * cs-tokenizer.cs: Fix bug where floating point values with an
6144         exponent where a sign was missing was ignored.
6145
6146         * driver.cs: Allow multiple assemblies to be specified in a single
6147         /r: argument
6148
6149 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
6150
6151         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
6152         because identifiers after a parenthesis would end up in this kind
6153         of production, and we needed to desamiguate it for having casts
6154         like:
6155
6156                 (UserDefinedType *) xxx
6157
6158 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
6159
6160         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
6161         we should set on the Bindingflags.NonPublic, but not turn on
6162         private_ok.  private_ok controls whether a Private member is
6163         returned (this is chekced on the filter routine), while the
6164         BindingFlags.NonPublic just controls whether private/protected
6165         will be allowed.   This fixes the problem part of the problem of
6166         private properties being allowed to be used in derived classes.
6167
6168         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
6169         so we can call the children DoResolveLValue method (this will
6170         properly signal errors on lvalue assignments to base properties)
6171
6172         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
6173         getter are null, and we have a property info, we know that this
6174         happened because the lookup failed, so we report an error 122 for
6175         protection level violation.
6176
6177         We also silently return if setter and getter are null in the
6178         resolve functions, this condition only happens if we have flagged
6179         the error before.  This is the other half of the problem. 
6180
6181         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
6182         not have accessibility information, that is why we were returning
6183         true in the filter function in typemanager.cs.
6184
6185         To properly report 122 (property is inaccessible because of its
6186         protection level) correctly, we report this error in ResolveAccess
6187         by failing if both the setter and the getter are lacking (ie, the
6188         lookup failed). 
6189
6190         DoResolve and DoLResolve have been modified to check for both
6191         setter/getter being null and returning silently, the reason being
6192         that I did not want to put the knowledge about this error in upper
6193         layers, like:
6194
6195         int old = Report.Errors;
6196         x = new PropertyExpr (...);
6197         if (old != Report.Errors)
6198                 return null;
6199         else
6200                 return x;
6201
6202         So the property expr is returned, but it is invalid, so the error
6203         will be flagged during the resolve process. 
6204
6205         * class.cs: Remove InheritablePropertySignatureCompare from the
6206         class, as we no longer depend on the property signature to compute
6207         whether it is possible to implement a method or not.
6208
6209         The reason is that calling PropertyInfo.GetGetMethod will return
6210         null (in .NET, in Mono it works, and we should change this), in
6211         cases where the Get Method does not exist in that particular
6212         class.
6213
6214         So this code:
6215
6216         class X { public virtual int A { get { return 1; } } }
6217         class Y : X { }
6218         class Z : Y { public override int A { get { return 2; } } }
6219
6220         Would fail in Z because the parent (Y) would not have the property
6221         defined.  So we avoid this completely now (because the alternative
6222         fix was ugly and slow), and we now depend exclusively on the
6223         method names.
6224
6225         (PropertyBase.CheckBase): Use a method-base mechanism to find our
6226         reference method, instead of using the property.
6227
6228         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
6229         routines are gone now.
6230
6231         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
6232         names, they were incorrectly named.
6233
6234         * cs-tokenizer.cs: Return are more gentle token on failure. 
6235
6236         * pending.cs (PendingImplementation.InterfaceMethod): This routine
6237         had an out-of-sync index variable, which caused it to remove from
6238         the list of pending methods the wrong method sometimes.
6239
6240 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
6241
6242         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
6243         CanWrite, because those refer to this particular instance of the
6244         property, and do not take into account the fact that we can
6245         override single members of a property.
6246
6247         Constructor requires an EmitContext.  The resolution process does
6248         not happen here, but we need to compute the accessors before,
6249         because the resolution does not always happen for properties.
6250
6251         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
6252         subclass, before we did not update this flag, but we did update
6253         bindingflags. 
6254
6255         (GetAccessors): Drop this routine, as it did not work in the
6256         presence of partially overwritten set/get methods. 
6257
6258         Notice that this broke the cs1540 detection, but that will require
6259         more thinking. 
6260
6261 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6262
6263         * class.cs:
6264         * codegen.cs:
6265         * driver.cs: issue a warning instead of an error if we don't support
6266         debugging for the platform. Also ignore a couple of errors that may
6267         arise when trying to write the symbols. Undo my previous patch.
6268
6269 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6270
6271         * driver.cs: ignore /debug switch except for Unix platforms.
6272
6273 2002-10-23  Nick Drochak  <ndrochak@gol.com>
6274
6275         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
6276
6277 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
6278
6279         * driver.cs: Do not make mcs-debug conditional, so we do not break
6280         builds that use it.
6281
6282         * statement.cs (UsageVector.MergeChildren): I would like Martin to
6283         review this patch.  But basically after all the children variables
6284         have been merged, the value of "Breaks" was not being set to
6285         new_breaks for Switch blocks.  I think that it should be set after
6286         it has executed.  Currently I set this to the value of new_breaks,
6287         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
6288         conservative, but I do not understand this code very well.
6289
6290         I did not break anything in the build, so that is good ;-)
6291
6292         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
6293
6294 2002-10-20  Mark Crichton  <crichton@gimp.org>
6295
6296         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
6297
6298 2002-10-20  Nick Drochak  <ndrochak@gol.com>
6299
6300         * cfold.cs: Fixed compile blocker.
6301
6302 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
6303
6304         * driver.cs: I was chekcing the key, not the file.
6305
6306 2002-10-19  Ravi Pratap  <ravi@ximian.com>
6307
6308         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
6309         message that we were generating - we just need to silently return
6310         a null.
6311
6312 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
6313
6314         * class.cs (Event.Define): Change my previous commit, as this
6315         breaks the debugger.  This is a temporary hack, as it seems like
6316         the compiler is generating events incorrectly to begin with.
6317
6318         * expression.cs (Binary.ResolveOperator): Added support for 
6319         "U operator - (E x, E y)"
6320
6321         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
6322         y)".
6323
6324         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
6325         init-only variables, but this path did not take into account that
6326         there might be also instance readonly variables.  Correct this
6327         problem. 
6328
6329         This fixes bug 32253
6330
6331         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
6332         delegates as well.
6333
6334         * driver.cs: Change the extension for modules to `netmodule'
6335
6336         * cs-parser.jay: Improved slightly the location tracking for
6337         the debugger symbols.
6338
6339         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
6340         modifiers that were specified instead of the hardcoded value
6341         (FamAndAssem).  This was basically ignoring the static modifier,
6342         and others.  Fixes 32429.
6343
6344         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
6345         fixed a bug in the process (32476)
6346
6347         * expression.cs (ArrayAccess.EmitAssign): Patch from
6348         hwang_rob@yahoo.ca that fixes bug 31834.3
6349
6350 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
6351
6352         * driver.cs: Make the module extension .netmodule.
6353
6354 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
6355
6356         * driver.cs: Report an error if the resource file is not found
6357         instead of crashing.
6358
6359         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
6360         false, like Emit does.
6361
6362 2002-10-16  Nick Drochak  <ndrochak@gol.com>
6363
6364         * typemanager.cs: Remove unused private member.  Also reported mcs
6365         bug to report this as a warning like csc.
6366
6367 2002-10-15  Martin Baulig  <martin@gnome.org>
6368
6369         * statement.cs (Statement.Emit): Made this a virtual method; emits
6370         the line number info and calls DoEmit().
6371         (Statement.DoEmit): New protected abstract method, formerly knows
6372         as Statement.Emit().
6373
6374         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
6375
6376 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
6377
6378         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
6379         have fixed a remaining problem: not every AddXXXX was adding a
6380         fully qualified name.  
6381
6382         Now everyone registers a fully qualified name in the DeclSpace as
6383         being defined instead of the partial name.  
6384
6385         Downsides: we are slower than we need to be due to the excess
6386         copies and the names being registered this way.  
6387
6388         The reason for this is that we currently depend (on the corlib
6389         bootstrap for instance) that types are fully qualified, because
6390         we dump all the types in the namespace, and we should really have
6391         types inserted into the proper namespace, so we can only store the
6392         basenames in the defined_names array.
6393
6394 2002-10-10  Martin Baulig  <martin@gnome.org>
6395
6396         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
6397         from bug #31834, see the bug report for a testcase which is
6398         miscompiled.
6399
6400 2002-10-10  Martin Baulig  <martin@gnome.org>
6401
6402         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
6403         flow analysis code for this.
6404
6405         * statement.cs (Do, While, For): Tell the flow analysis code about
6406         infinite loops.
6407         (FlowBranching.UsageVector): Added support for infinite loops.
6408         (Block.Resolve): Moved the dead code elimination here and use flow
6409         analysis to do it.
6410
6411 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
6412
6413         * class.cs (Field.Define): Catch cycles on struct type
6414         definitions. 
6415
6416         * typemanager.cs (IsUnmanagedtype): Do not recursively check
6417         fields if the fields are static.  We only need to check instance
6418         fields. 
6419
6420         * expression.cs (As.DoResolve): Test for reference type.
6421
6422         * statement.cs (Using.ResolveExpression): Use
6423         ConvertImplicitRequired, not ConvertImplicit which reports an
6424         error on failture
6425         (Using.ResolveLocalVariableDecls): ditto.
6426
6427         * expression.cs (Binary.ResolveOperator): Report errors in a few
6428         places where we had to.
6429
6430         * typemanager.cs (IsUnmanagedtype): Finish implementation.
6431
6432 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
6433
6434         * expression.cs: Use StoreFromPtr instead of extracting the type
6435         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
6436
6437         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
6438         an enumeration value to a System.Enum, but System.Enum is not a
6439         value type, but an class type, so we need to box.
6440
6441         (Expression.ConvertExplicit): One codepath could return
6442         errors but not flag them.  Fix this.  Fixes #31853
6443
6444         * parameter.cs (Resolve): Do not allow void as a parameter type.
6445
6446 2002-10-06  Martin Baulig  <martin@gnome.org>
6447
6448         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
6449         if it's a class type and not a struct.  Fixes #31815.
6450
6451 2002-10-06  Martin Baulig  <martin@gnome.org>
6452
6453         * statement.cs: Reworked the flow analysis code a bit to make it
6454         usable for dead code elimination.
6455
6456 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6457
6458         * cs-parser.jay: allow empty source files. Fixes bug #31781.
6459
6460 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
6461
6462         * expression.cs (ComposedCast.DoResolveType): A quick workaround
6463         to fix the test 165, will investigate deeper.
6464
6465 2002-10-04  Martin Baulig  <martin@gnome.org>
6466
6467         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
6468         finally blocks actually work.
6469         (Try.Resolve): We don't need to create a sibling for `finally' if
6470         there is no finally block.
6471
6472 2002-10-04  Martin Baulig  <martin@gnome.org>
6473
6474         * class.cs (Constructor.Define): The default accessibility for a
6475         non-default constructor is private, not public.
6476
6477 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
6478
6479         * class.cs (Constructor): Make AllowedModifiers public, add
6480         EXTERN.
6481
6482         * cs-parser.jay: Perform the modifiers test here, as the
6483         constructor for the Constructor class usually receives a zero
6484         because of the way we create it (first we create, later we
6485         customize, and we were never checking the modifiers).
6486
6487         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
6488         is a version of LookupTypeReflection that includes the type-name
6489         cache.  This can be used as a fast path for functions that know
6490         the fully qualified name and are only calling into *.GetType() to
6491         obtain a composed type.
6492
6493         This is also used by TypeManager.LookupType during its type
6494         composition.
6495
6496         (LookupType): We now also track the real type name, as sometimes
6497         we can get a quey for the real type name from things like
6498         ComposedCast.  This fixes bug 31422.
6499
6500         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
6501         complete type fullname, it does not have to go through the type
6502         resolution system to obtain the composed version of the type (for
6503         obtaining arrays or pointers).
6504
6505         (Conditional.Emit): Use the EmitBoolExpression to
6506         generate nicer code, as requested by Paolo.
6507
6508         (ArrayCreation.CheckIndices): Use the patch from
6509         hwang_rob@yahoo.ca to validate the array initializers. 
6510
6511 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
6512
6513         * class.cs (ConstructorInitializer.Emit): simplify code by using
6514         Invocation.EmitCall, and at the same time, fix the bugs in calling
6515         parent constructors that took variable arguments. 
6516
6517         * ecore.cs (Expression.ConvertNumericExplicit,
6518         Expression.ImplicitNumericConversion): Remove the code that
6519         manually wrapped decimal (InternalTypeConstructor call is now gone
6520         as well).
6521
6522         * expression.cs (Cast.TryReduce): Also handle decimal types when
6523         trying to perform a constant fold on the type.
6524
6525         * typemanager.cs (IsUnmanagedtype): Partially implemented.
6526
6527         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
6528         that only turned off an error report, and did nothing else. 
6529
6530 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
6531
6532         * driver.cs: Handle and ignore /fullpaths
6533
6534 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
6535
6536         * expression.cs (Binary.ResolveOperator): Catch the case where
6537         DoNumericPromotions returns true, 
6538
6539         (Binary.DoNumericPromotions): Simplify the code, and the tests.
6540
6541 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
6542
6543         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
6544         report error 70.
6545
6546 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
6547
6548         * ecore.cs (ConvertNumericExplicit): It is not enough that the
6549         conversion exists, but it is also required that the conversion be
6550         performed.  This manifested in "(Type64Enum) 2".  
6551
6552         * class.cs (TypeManager.AddMethod): The fix is not to change
6553         AddEnum, because that one was using a fully qualified name (every
6554         DeclSpace derivative does), but to change the AddMethod routine
6555         that was using an un-namespaced name.  This now correctly reports
6556         the duplicated name.
6557
6558         Revert patch until I can properly fix it.  The issue
6559         is that we have a shared Type space across all namespaces
6560         currently, which is wrong.
6561
6562         Options include making the Namespace a DeclSpace, and merge
6563         current_namespace/current_container in the parser.
6564
6565 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
6566
6567         * cs-parser.jay: Improve error reporting when we get a different
6568         kind of expression in local_variable_type and
6569         local_variable_pointer_type. 
6570
6571         Propagate this to avoid missleading errors being reported.
6572
6573         * ecore.cs (ImplicitReferenceConversion): treat
6574         TypeManager.value_type as a target just like object_type.   As
6575         code like this:
6576
6577         ValueType v = 1;
6578
6579         Is valid, and needs to result in the int 1 being boxed before it
6580         is assigned to the value type v.
6581
6582         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
6583         to validate the enumeration name.
6584
6585         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
6586         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
6587         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
6588
6589         * ecore.cs (TryImplicitIntConversion): When doing an
6590         implicit-enumeration-conversion, check if the type is 64-bits and
6591         perform a conversion before passing to EnumConstant.
6592
6593 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
6594
6595         * decl.cs (Error_AmbiguousTypeReference); New routine used to
6596         report ambiguous type references.  Unlike the MS version, we
6597         report what the ambiguity is.   Innovation at work ;-)
6598
6599         (DeclSpace.FindType): Require a location argument to
6600         display when we display an ambiguous error.
6601
6602         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
6603
6604         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
6605
6606         * expression.cs (EmitDynamicInitializers): Apply patch from
6607         hwang_rob@yahoo.ca that fixes the order in which we emit our
6608         initializers. 
6609
6610 2002-09-21  Martin Baulig  <martin@gnome.org>
6611
6612         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
6613         delegate takes no arguments.
6614
6615 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
6616
6617         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
6618         from integers.
6619
6620         * expression.cs: Extract the underlying type.
6621
6622         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
6623
6624         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
6625
6626 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
6627
6628         * class.cs (TypeContainer.DefineType): We can not use the nice
6629         PackingSize with the size set to 1 DefineType method, because it
6630         will not allow us to define the interfaces that the struct
6631         implements.
6632
6633         This completes the fixing of bug 27287
6634
6635         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
6636         means also structs.  This fixes part of the problem. 
6637         (Expresion.ImplicitReferenceConversionExists): ditto.
6638
6639         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
6640         error if there were no errors reported during the type lookup
6641         process, to avoid duplicates or redundant errors.  Without this
6642         you would get an ambiguous errors plus a type not found.  We have
6643         beaten the user enough with the first error.  
6644
6645         (DeclSparce.FindType): Emit a warning if we have an ambiguous
6646         reference. 
6647
6648         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
6649         during the resolution process, stop the lookup, this avoids
6650         repeated error reports (same error twice).
6651
6652         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
6653
6654         * typemanager.cs (LookupType): Redo the type lookup code to match
6655         the needs of System.Reflection.  
6656
6657         The issue is that System.Reflection requires references to nested
6658         types to begin with a "+" sign instead of a dot.  So toplevel
6659         types look like: "NameSpace.TopLevelClass", and nested ones look
6660         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
6661         levels. 
6662
6663 2002-09-19  Martin Baulig  <martin@gnome.org>
6664
6665         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
6666         says that a method always returns or always throws an exception,
6667         don't report the CS0161.
6668
6669         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
6670         set `Returns = new_returns'.
6671
6672 2002-09-19  Martin Baulig  <martin@gnome.org>
6673
6674         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
6675         to an enum constant, check for a CS0176.
6676
6677 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
6678
6679         * class.cs (TypeContainer.CheckPairedOperators): Now we check
6680         for operators that must be in pairs and report errors.
6681
6682         * ecore.cs (SimpleName.DoResolveType): During the initial type
6683         resolution process, when we define types recursively, we must
6684         check first for types in our current scope before we perform
6685         lookups in the enclosing scopes.
6686
6687         * expression.cs (MakeByteBlob): Handle Decimal blobs.
6688
6689         (Invocation.VerifyArgumentsCompat): Call
6690         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
6691         I thought we were supposed to always call this, but there are a
6692         few places in the code where we dont do it.
6693
6694 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
6695
6696         * driver.cs: Add support in -linkres and -resource to specify the
6697         name of the identifier.
6698
6699 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6700
6701         * ecore.cs (StandardConversionExists): Sync with the conversion
6702         code: allow anything-* to void* conversions.
6703
6704         (FindMostSpecificSource): Use an Expression argument
6705         instead of a Type, because we might be handed over a Literal which
6706         gets a few more implicit conversions that plain types do not.  So
6707         this information was being lost.
6708
6709         Also, we drop the temporary type-holder expression when not
6710         required.
6711
6712 2002-09-17  Martin Baulig  <martin@gnome.org>
6713
6714         * class.cs (PropertyBase.CheckBase): Don't check the base class if
6715         this is an explicit interface implementation.
6716
6717 2002-09-17  Martin Baulig  <martin@gnome.org>
6718
6719         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
6720         different `IndexerName' attributes.
6721
6722         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
6723         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
6724         virtual CommonResolve().
6725
6726 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6727
6728         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
6729         and convert that to the UnderlyingType.
6730
6731         * statement.cs (Foreach.Resolve): Indexers are just like variables
6732         or PropertyAccesses.
6733
6734         * cs-tokenizer.cs (consume_string): Track line numbers and columns
6735         inside quoted strings, we were not doing this before.
6736
6737 2002-09-16  Martin Baulig  <martin@gnome.org>
6738
6739         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
6740         resolve it.  This is needed for the definite assignment check of the
6741         instance expression, fixes bug #29846.
6742         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
6743
6744 2002-09-16  Nick Drochak  <ndrochak@gol.com>
6745
6746         * parameter.cs: Fix compile error.  Cannot reference static member
6747         from an instance object.  Is this an mcs bug?
6748
6749 2002-09-14  Martin Baulig  <martin@gnome.org>
6750
6751         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
6752         multiple times.  Fixes bug #30295, added test-166.cs.
6753
6754 2002-09-14  Martin Baulig  <martin@gnome.org>
6755
6756         * statement.cs (Block.Emit): Don't emit unreachable code.
6757         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
6758         `break' statements.
6759         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
6760
6761 2002-09-14  Martin Baulig  <martin@gnome.org>
6762
6763         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
6764         is set.
6765
6766 2002-09-14  Martin Baulig  <martin@gnome.org>
6767
6768         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
6769         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
6770         be false on the ms runtime.
6771
6772 2002-09-13  Martin Baulig  <martin@gnome.org>
6773
6774         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
6775         the CS0038 error message.
6776
6777 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
6778
6779         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
6780         constant inside, return it.
6781
6782 2002-09-12  Martin Baulig  <martin@gnome.org>
6783
6784         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
6785         implicit conversion can be done between enum types.
6786
6787         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
6788         check whether an implicit conversion to the current enum's UnderlyingType
6789         exists and report an error if not.
6790
6791         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
6792         without debugging support.
6793
6794         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
6795         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
6796
6797 2002-09-12  Martin Baulig  <martin@gnome.org>
6798
6799         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
6800
6801         * ecore.cs (IMemberExpr.DeclaringType): New property.
6802         (SimpleName.SimpleNameResolve): Check whether we're accessing a
6803         nonstatic member of an outer type (CS0038).
6804
6805 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
6806
6807         * driver.cs: Activate the using-error detector at warning level
6808         4 (at least for MS-compatible APIs).
6809
6810         * namespace.cs (VerifyUsing): Small buglett fix.
6811
6812         * pending.cs (PendingImplementation): pass the container pointer. 
6813
6814         * interface.cs (GetMethods): Allow for recursive definition.  Long
6815         term, I would like to move every type to support recursive
6816         definitions, not the current ordering mechanism that we have right
6817         now.
6818
6819         The situation is this: Attributes are handled before interfaces,
6820         so we can apply attributes to interfaces.  But some attributes
6821         implement interfaces, we will now handle the simple cases
6822         (recursive definitions will just get an error).  
6823
6824         * parameter.cs: Only invalidate types at the end if we fail to
6825         lookup all types.  
6826
6827 2002-09-09  Martin Baulig  <martin@gnome.org>
6828
6829         * ecore.cs (PropertyExpr.Emit): Also check for
6830         TypeManager.system_int_array_get_length so this'll also work when
6831         compiling corlib.  Fixes #30003.
6832
6833 2002-09-09  Martin Baulig  <martin@gnome.org>
6834
6835         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
6836         and throw an exception if we can't get the type's size.  Fixed #30040,
6837         added test-165.cs.
6838
6839 2002-09-09  Martin Baulig  <martin@gnome.org>
6840
6841         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
6842
6843         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
6844         context.  Fixes bug #30027.
6845
6846         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
6847         virtual functions.  Fixes bug #30043, added test-164.cs.
6848
6849 2002-09-08  Ravi Pratap  <ravi@ximian.com>
6850
6851         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
6852
6853 2002-09-08  Nick Drochak  <ndrochak@gol.com>
6854
6855         * driver.cs: Use an object to get the windows codepage since it's not a
6856         static property.
6857
6858 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
6859
6860         * statement.cs (For.Emit): for infinite loops (test == null)
6861         return whether there is a break inside, not always "true".
6862
6863         * namespace.cs (UsingEntry): New struct to hold the name of the
6864         using definition, the location where it is defined, and whether it
6865         has been used in a successful type lookup.
6866
6867         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
6868         strings.
6869
6870         * decl.cs: ditto.
6871
6872 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6873
6874         * attribute.cs : Fix incorrect code which relied on catching
6875         a NullReferenceException to detect a null being passed in
6876         where an object was expected.
6877
6878 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
6879
6880         * statement.cs (Try): flag the catch variable as assigned
6881
6882         * expression.cs (Cast): Simplified by using ResolveType instead of
6883         manually resolving.
6884
6885         * statement.cs (Catch): Fix bug by using ResolveType.
6886
6887 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6888
6889         * expression.cs (BetterConversion): Special case for when we have
6890         a NullLiteral as the argument and we have to choose between string
6891         and object types - we choose string the way csc does.
6892
6893         * attribute.cs (Attribute.Resolve): Catch the
6894         NullReferenceException and report error #182 since the Mono
6895         runtime no more has the bug and having this exception raised means
6896         we tried to select a constructor which takes an object and is
6897         passed a null.
6898
6899 2002-09-05  Ravi Pratap  <ravi@ximian.com>
6900
6901         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
6902         message (1502, 1503) when we can't locate a method after overload
6903         resolution. This is much more informative and closes the bug
6904         Miguel reported.
6905
6906         * interface.cs (PopulateMethod): Return if there are no argument
6907         types. Fixes a NullReferenceException bug.
6908
6909         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
6910         expressions too. Previously we were checking only in one place for
6911         positional arguments leaving out named arguments.
6912
6913         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
6914         type to the enum type is not allowed. Remove code corresponding to
6915         that.
6916
6917         (ConvertNumericExplicit): Allow explicit conversions from
6918         the underlying type to enum type. This precisely follows the spec
6919         and closes a bug filed by Gonzalo.
6920
6921 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6922
6923         * compiler.csproj:
6924         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
6925
6926 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
6927
6928         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
6929         it was important that we stored the right value after the
6930         reduction in `converted'.
6931
6932 2002-09-04  Martin Baulig  <martin@gnome.org>
6933
6934         * location.cs (Location.SymbolDocument): Use full pathnames for the
6935         source files.
6936
6937 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
6938
6939         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
6940         of the expression resolve mechanism, because that will catch the
6941         SimpleName error failures.
6942
6943         (Conditional): If we can not resolve the
6944         expression, return, do not crash.
6945
6946 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6947
6948         * cs-tokenizer.cs:
6949         (location): display token name instead of its number.
6950
6951 2002-08-28  Martin Baulig  <martin@gnome.org>
6952
6953         * expression.cs (Binary.ResolveOperator): Don't silently return
6954         but return an error if an operator cannot be applied between two
6955         enum types.
6956
6957 2002-08-28  Martin Baulig  <martin@gnome.org>
6958
6959         * class.cs (Constructor.Define): Set the permission attributes
6960         correctly instead of making all constructors public.
6961
6962 2002-08-28  Martin Baulig  <martin@gnome.org>
6963
6964         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
6965         for private members before reporting a CS0103; if we find anything,
6966         it's a CS0122.
6967
6968 2002-08-28  Martin Baulig  <martin@gnome.org>
6969
6970         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
6971         to check whether `closure_start_type == closure_invocation_type',
6972         we also need to check whether `m.DeclaringType == closure_invocation_type'
6973         before bypassing the permission checks.  We might be accessing
6974         protected/private members from the base class.
6975         (TypeManager.RealMemberLookup): Only set private_ok if private
6976         members were requested via BindingFlags.NonPublic.
6977
6978         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
6979
6980         * expression.cs (MemberAccess.ResolveMemberAccess): Set
6981         MethodGroupExpr.IsExplicitImpl if appropriate.
6982         (Invocation.DoResolve): Don't report the CS0120 for explicit
6983         interface implementations.
6984
6985 2002-08-27  Martin Baulig  <martin@gnome.org>
6986
6987         * expression.cs (Invocation.DoResolve): If this is a static
6988         method and we don't have an InstanceExpression, we must report
6989         a CS0120.
6990
6991 2002-08-25  Martin Baulig  <martin@gnome.org>
6992
6993         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
6994         `==' between a valuetype and an object.
6995
6996 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
6997
6998         * ecore.cs (TypeExpr): Provide a ToString method.
6999
7000 2002-08-24  Martin Baulig  <martin@gnome.org>
7001
7002         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
7003         now called proggie.dbg and it's a binary file.
7004
7005 2002-08-23  Martin Baulig  <martin@gnome.org>
7006
7007         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
7008
7009 2002-08-23  Martin Baulig  <martin@gnome.org>
7010
7011         * struct.cs (MyStructInfo.ctor): Make this work with empty
7012         structs; it's not allowed to use foreach() on null.
7013
7014 2002-08-23  Martin Baulig  <martin@gnome.org>
7015
7016         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
7017         writer the full pathname of the generated assembly.
7018
7019 2002-08-23  Martin Baulig  <martin@gnome.org>
7020
7021         * statements.cs (FlowBranching.UsageVector.MergeChildren):
7022         A `finally' block never returns or breaks; improved handling of
7023         unreachable code.
7024
7025 2002-08-23  Martin Baulig  <martin@gnome.org>
7026
7027         * statement.cs (Throw.Resolve): Allow `throw null'.
7028
7029 2002-08-23  Martin Baulig  <martin@gnome.org>
7030
7031         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
7032         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
7033         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
7034         MemberLookup would return a wrong event if this is an explicit
7035         interface implementation and the class has an event with the same
7036         name.
7037
7038 2002-08-23  Martin Baulig  <martin@gnome.org>
7039
7040         * statement.cs (Block.AddChildVariableNames): New public method.
7041         (Block.AddChildVariableName): Likewise.
7042         (Block.IsVariableNameUsedInChildBlock): Likewise.
7043         (Block.AddVariable): Check whether a variable name has already
7044         been used in a child block.
7045
7046         * cs-parser.jay (declare_local_variables): Mark all variable names
7047         from the current block as being used in a child block in the
7048         implicit block.
7049
7050 2002-08-23  Martin Baulig  <martin@gnome.org>
7051
7052         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
7053         find the symbol writer.
7054
7055         * driver.cs: csc also allows the arguments to /define being
7056         separated by commas, not only by semicolons.
7057
7058 2002-08-23  Martin Baulig  <martin@gnome.org>
7059
7060         * interface.cs (Interface.GetMembers): Added static check for events.
7061
7062 2002-08-15  Martin Baulig  <martin@gnome.org>
7063
7064         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
7065         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
7066
7067         * ecore.cs (Expression.MemberLookup): Added documentation and explained
7068         why the MethodData.EmitDestructor() change was necessary.
7069
7070 2002-08-20  Martin Baulig  <martin@gnome.org>
7071
7072         * class.cs (TypeContainer.FindMembers): Added static check for events.
7073
7074         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
7075
7076         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
7077         use Type.GetEvents(), not Type.FindMembers().
7078
7079 2002-08-20  Martin Baulig  <martin@gnome.org>
7080
7081         * decl.cs (MemberCache): Added a special method cache which will
7082         be used for method-only searched.  This ensures that a method
7083         search will return a MethodInfo with the correct ReflectedType for
7084         inherited methods.      
7085
7086 2002-08-20  Martin Baulig  <martin@gnome.org>
7087
7088         * decl.cs (DeclSpace.FindMembers): Made this public.
7089
7090 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7091
7092         * delegate.cs: fixed build on windows.
7093         [FIXME:  Filed as bug #29150: MCS must report these errors.]
7094
7095 2002-08-19  Ravi Pratap  <ravi@ximian.com>
7096
7097         * ecore.cs (StandardConversionExists): Return a false
7098         if we are trying to convert the void type to anything else
7099         since that is not allowed.
7100
7101         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
7102         we flag error 70 in the event an event is trying to be accessed
7103         directly from outside the declaring type.
7104
7105 2002-08-20  Martin Baulig  <martin@gnome.org>
7106
7107         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
7108         MemberCache from typemanager.cs to decl.cs.
7109
7110 2002-08-19  Martin Baulig  <martin@gnome.org>
7111
7112         * class.cs (TypeContainer): Implement IMemberContainer.
7113         (TypeContainer.DefineMembers): Create the MemberCache.
7114         (TypeContainer.FindMembers): Do better BindingFlags checking; only
7115         return public members if BindingFlags.Public was given, check
7116         whether members are static.
7117
7118 2002-08-16  Martin Baulig  <martin@gnome.org>
7119
7120         * decl.cs (DeclSpace.Define): Splitted this in Define and
7121         DefineMembers.  DefineMembers is called first and initializes the
7122         MemberCache.
7123
7124         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
7125         DefineMembers() on all our DeclSpaces.
7126
7127         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
7128         but call DefineMembers() on all nested interfaces.  We call their
7129         Define() in our new Define() function.
7130
7131         * interface.cs (Interface): Implement IMemberContainer.
7132         (Interface.Define): Moved all code except the attribute stuf to
7133         DefineMembers().
7134         (Interface.DefineMembers): Initialize the member cache.
7135
7136         * typemanager.cs (IMemberFinder): Removed this interface, we don't
7137         need this anymore since we can use MemberCache.FindMembers directly.
7138
7139 2002-08-19  Martin Baulig  <martin@gnome.org>
7140
7141         * typemanager.cs (MemberCache): When creating the cache for an
7142         interface type, add all inherited members.
7143         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
7144         to `out bool used_cache' and documented it.
7145         (TypeManager.MemberLookup): If we already used the cache in the first
7146         iteration, we don't need to do the interfaces check.
7147
7148 2002-08-19  Martin Baulig  <martin@gnome.org>
7149
7150         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
7151         here from IMemberFinder and don't implement this interface anymore.
7152         (DeclSpace.MemberCache): Moved here from IMemberFinder.
7153
7154         * typemanager.cs (IMemberFinder): This interface is now only used by
7155         classes which actually support the member cache.
7156         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
7157         since we only put DeclSpaces into this Hashtable.
7158         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
7159         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
7160
7161 2002-08-16  Martin Baulig  <martin@gnome.org>
7162
7163         * typemanager.cs (ICachingMemberFinder): Removed.
7164         (IMemberFinder.MemberCache): New property.
7165         (TypeManager.FindMembers): Merged this with RealFindMembers().
7166         This function will never be called from TypeManager.MemberLookup()
7167         so we can't use the cache here, just the IMemberFinder.
7168         (TypeManager.MemberLookup_FindMembers): Check whether the
7169         IMemberFinder has a MemberCache and call the cache's FindMembers
7170         function.
7171         (MemberCache): Rewrote larger parts of this yet another time and
7172         cleaned it up a bit.
7173
7174 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
7175
7176         * driver.cs (LoadArgs): Support quoting.
7177
7178         (Usage): Show the CSC-like command line arguments.
7179
7180         Improved a few error messages.
7181
7182 2002-08-15  Martin Baulig  <martin@gnome.org>
7183
7184         * typemanager.cs (IMemberContainer.Type): New property.
7185         (IMemberContainer.IsInterface): New property.
7186
7187         The following changes are conditional to BROKEN_RUNTIME, which is
7188         defined at the top of the file.
7189
7190         * typemanager.cs (MemberCache.MemberCache): Don't add the base
7191         class'es members, but add all members from TypeHandle.ObjectType
7192         if we're an interface.
7193         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
7194         is the current type.
7195         (MemberCache.CacheEntry.Container): Removed this field.
7196         (TypeHandle.GetMembers): Include inherited members.
7197
7198 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7199
7200         * typemanager.cs: fixed compilation and added a comment on a field that
7201         is never used.
7202
7203 2002-08-15  Martin Baulig  <martin@gnome.org>
7204
7205         * class.cs (ConstructorInitializer.Resolve): In the
7206         Expression.MemberLookup call, use the queried_type as
7207         invocation_type.
7208
7209         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
7210         declared' attribute, it's always true.
7211         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
7212         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
7213         temporary wrapper for FindMembers which tells MemberLookup whether
7214         members from the base classes are included in the return value.
7215         This will go away soon.
7216         (TypeManager.MemberLookup): Use this temporary hack here; once the
7217         new MemberCache is completed, we don't need to do the DeclaredOnly
7218         looping here anymore since the MemberCache will take care of this.
7219         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
7220         (MemberCache): When creating the MemberCache for a class, get
7221         members from the current class and all its base classes.
7222         (MemberCache.CacheEntry.Container): New field.  This is a
7223         temporary hack until the Mono runtime is fixed to distinguish
7224         between ReflectedType and DeclaringType.  It allows us to use MCS
7225         with both the MS runtime and the unfixed Mono runtime without
7226         problems and without accecting performance.
7227         (MemberCache.SearchMembers): The DeclaredOnly looping from
7228         TypeManager.MemberLookup is now done here.      
7229
7230 2002-08-14  Martin Baulig  <martin@gnome.org>
7231
7232         * statement.cs (MyStructInfo.MyStructInfo): Don't call
7233         Type.GetFields on dynamic types but get the fields from the
7234         corresponding TypeContainer.
7235         (MyStructInfo.GetStructInfo): Added check for enum types.
7236
7237         * typemanager.cs (MemberList.IsSynchronized): Implemented.
7238         (MemberList.SyncRoot): Implemented.
7239         (TypeManager.FilterWithClosure): No need to check permissions if
7240         closure_start_type == closure_invocation_type, don't crash if
7241         closure_invocation_type is null.
7242
7243 2002-08-13  Martin Baulig  <martin@gnome.org>
7244
7245         Rewrote TypeContainer.FindMembers to use a member cache.  This
7246         gives us a speed increase of about 35% for the self-hosting MCS
7247         build and of about 15-20% for the class libs (both on GNU/Linux).
7248
7249         * report.cs (Timer): New class to get enhanced profiling.  This
7250         whole class is "TIMER" conditional since it remarkably slows down
7251         compilation speed.
7252
7253         * class.cs (MemberList): New class.  This is an IList wrapper
7254         which we're now using instead of passing MemberInfo[]'s around to
7255         avoid copying this array unnecessarily.
7256         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
7257         (ICachingMemberFinder, IMemberContainer): New interface.
7258         (TypeManager.FilterWithClosure): If `criteria' is null, the name
7259         has already been checked, otherwise use it for the name comparision.
7260         (TypeManager.FindMembers): Renamed to RealMemberFinder and
7261         provided wrapper which tries to use ICachingMemberFinder.FindMembers
7262         if possible.  Returns a MemberList, not a MemberInfo [].
7263         (TypeHandle): New class, implements IMemberContainer.  We create
7264         one instance of this class per type, it contains a MemberCache
7265         which is used to do the member lookups.
7266         (MemberCache): New class.  Each instance of this class contains
7267         all members of a type and a name-based hash table.
7268         (MemberCache.FindMembers): This is our new member lookup
7269         function.  First, it looks up all members of the requested name in
7270         the hash table.  Then, it walks this list and sorts out all
7271         applicable members and returns them.
7272
7273 2002-08-13  Martin Baulig  <martin@gnome.org>
7274
7275         In addition to a nice code cleanup, this gives us a performance
7276         increase of about 1.4% on GNU/Linux - not much, but it's already
7277         half a second for the self-hosting MCS compilation.
7278
7279         * typemanager.cs (IMemberFinder): New interface.  It is used by
7280         TypeManager.FindMembers to call FindMembers on a TypeContainer,
7281         Enum, Delegate or Interface.
7282         (TypeManager.finder_to_member_finder): New PtrHashtable.
7283         (TypeManager.finder_to_container): Removed.
7284         (TypeManager.finder_to_delegate): Removed.
7285         (TypeManager.finder_to_interface): Removed.
7286         (TypeManager.finder_to_enum): Removed.
7287
7288         * interface.cs (Interface): Implement IMemberFinder.
7289
7290         * delegate.cs (Delegate): Implement IMemberFinder.
7291
7292         * enum.cs (Enum): Implement IMemberFinder.
7293
7294         * class.cs (TypeContainer): Implement IMemberFinder.
7295
7296 2002-08-12  Martin Baulig  <martin@gnome.org>
7297
7298         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
7299
7300 2002-08-12  Martin Baulig  <martin@gnome.org>
7301
7302         * ecore.cs (ITypeExpression): New interface for expressions which
7303         resolve to a type.
7304         (TypeExpression): Renamed to TypeLookupExpression.
7305         (Expression.DoResolve): If we're doing a types-only lookup, the
7306         expression must implement the ITypeExpression interface and we
7307         call DoResolveType() on it.
7308         (SimpleName): Implement the new ITypeExpression interface.
7309         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
7310         hack, the situation that we're only looking up types can't happen
7311         anymore when this method is called.  Moved the type lookup code to
7312         DoResolveType() and call it.
7313         (SimpleName.DoResolveType): This ITypeExpression interface method
7314         is now doing the types-only lookup.
7315         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
7316         (ResolveFlags): Added MaskExprClass.
7317
7318         * expression.cs (MemberAccess): Implement the ITypeExpression
7319         interface.
7320         (MemberAccess.DoResolve): Added support for a types-only lookup
7321         when we're called via ITypeExpression.DoResolveType().
7322         (ComposedCast): Implement the ITypeExpression interface.
7323
7324         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
7325         Expression.Resolve() with ResolveFlags.Type instead.
7326
7327 2002-08-12  Martin Baulig  <martin@gnome.org>
7328
7329         * interface.cs (Interface.Define): Apply attributes.
7330
7331         * attribute.cs (Attribute.ApplyAttributes): Added support for
7332         interface attributes.
7333
7334 2002-08-11  Martin Baulig  <martin@gnome.org>
7335
7336         * statement.cs (Block.Emit): Only check the "this" variable if we
7337         do not always throw an exception.
7338
7339         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
7340         whether the property has a set accessor.
7341
7342 2002-08-11  Martin Baulig  <martin@gnome.org>
7343
7344         Added control flow analysis support for structs.
7345
7346         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
7347         with control flow analysis turned off.
7348         (IVariable): New interface.
7349         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
7350         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
7351         (FieldExpr.DoResolve): Resolve the instance expression with flow
7352         analysis turned off and do the definite assignment check after the
7353         resolving when we know what the expression will resolve to.
7354
7355         * expression.cs (LocalVariableReference, ParameterReference):
7356         Implement the new IVariable interface, only call the flow analysis
7357         code if ec.DoFlowAnalysis is true.
7358         (This): Added constructor which takes a Block argument.  Implement
7359         the new IVariable interface.
7360         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
7361         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
7362         This does the definite assignment checks for struct members.
7363
7364         * class.cs (Constructor.Emit): If this is a non-static `struct'
7365         constructor which doesn't have any initializer, call
7366         Block.AddThisVariable() to tell the flow analysis code that all
7367         struct elements must be initialized before control returns from
7368         the constructor.
7369
7370         * statement.cs (MyStructInfo): New public class.
7371         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
7372         argument to this indexer.  If non-zero, check an individual struct
7373         member, not the whole struct.
7374         (FlowBranching.CheckOutParameters): Check struct members.
7375         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
7376         overloaded versions of these methods which take an additional
7377         `int field_idx' argument to check struct members.
7378         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
7379         overloaded versions of these methods which take an additional
7380         `string field_name' argument to check struct member.s
7381         (VariableInfo): Implement the IVariable interface.
7382         (VariableInfo.StructInfo): New public property.  Returns the
7383         MyStructInfo instance of the variable if it's a struct or null.
7384         (Block.AddThisVariable): New public method.  This is called from
7385         Constructor.Emit() for non-static `struct' constructor which do
7386         not have any initializer.  It creates a special variable for the
7387         "this" instance variable which will be checked by the flow
7388         analysis code to ensure that all of the struct's fields are
7389         initialized before control returns from the constructor.
7390         (UsageVector): Added support for struct members.  If a
7391         variable/parameter is a struct with N members, we reserve a slot
7392         in the usage vector for each member.  A struct is considered fully
7393         initialized if either the struct itself (slot 0) or all its
7394         members are initialized.
7395
7396 2002-08-08  Martin Baulig  <martin@gnome.org>
7397
7398         * driver.cs (Driver.MainDriver): Only report an error CS5001
7399         if there were no compilation errors.
7400
7401         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
7402         `UnsafeContext' property to determine whether the parent is in
7403         unsafe context rather than checking the parent's ModFlags:
7404         classes nested in an unsafe class are unsafe as well.
7405
7406 2002-08-08  Martin Baulig  <martin@gnome.org>
7407
7408         * statement.cs (UsageVector.MergeChildren): Distinguish between
7409         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
7410         we return.  Added test17() and test18() to test-154.cs.
7411
7412 2002-08-08  Martin Baulig  <martin@gnome.org>
7413
7414         * typemanager.cs (TypeManager.FilterWithClosure): If we have
7415         Family access, make sure the invoking type isn't a subclass of the
7416         queried type (that'd be a CS1540).
7417
7418         * ecore.cs (Expression.MemberLookup): Added overloaded version of
7419         this method which takes an additional `Type invocation_type'.
7420
7421         * expression.cs (BaseAccess.DoResolve): Use the base type as
7422         invocation and query type.
7423         (MemberAccess.DoResolve): If the lookup failed and we're about to
7424         report a CS0122, try a lookup with the ec.ContainerType - if this
7425         succeeds, we must report a CS1540.
7426
7427 2002-08-08  Martin Baulig  <martin@gnome.org>
7428
7429         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
7430         (MethodGroupExpr): Implement the IMemberExpr interface.
7431
7432         * expression (MemberAccess.ResolveMemberAccess): No need to have
7433         any special code for MethodGroupExprs anymore, they're now
7434         IMemberExprs.   
7435
7436 2002-08-08  Martin Baulig  <martin@gnome.org>
7437
7438         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
7439         Family, FamANDAssem and FamORAssem permissions.
7440         (TypeManager.IsSubclassOrNestedChildOf): New public method.
7441
7442 2002-08-08  Martin Baulig  <martin@gnome.org>
7443
7444         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
7445         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
7446         or loop block.
7447
7448 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
7449
7450         * driver.cs: implemented /resource option to embed managed resources.
7451
7452 2002-08-07  Martin Baulig  <martin@gnome.org>
7453
7454         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
7455         (FieldBase.HasFieldInitializer): New public property.
7456         (FieldBase.GetInitializerExpression): New public method.  Resolves and
7457         returns the field initializer and makes sure it is only resolved once.
7458         (TypeContainer.EmitFieldInitializers): Call
7459         FieldBase.GetInitializerExpression to get the initializer, this ensures
7460         that it isn't resolved multiple times.
7461
7462         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
7463         the resolving process (SimpleName/MemberLookup) that we're currently
7464         emitting a field initializer (which must not access any instance members,
7465         this is an error CS0236).
7466
7467         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
7468         argument, if the `IsFieldInitializer' flag is set, we must report and
7469         error CS0236 and not an error CS0120.   
7470
7471 2002-08-07  Martin Baulig  <martin@gnome.org>
7472
7473         * ecore.cs (IMemberExpr): New public interface.
7474         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
7475         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
7476         if the expression is an IMemberExpr.
7477
7478         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
7479         to be null, implicitly default to `this' if we're non-static in
7480         this case.  Simplified the code a lot by using the new IMemberExpr
7481         interface.  Also fixed bug #28176 here.
7482
7483 2002-08-06  Martin Baulig  <martin@gnome.org>
7484
7485         * cs-parser.jay (SimpleLookup): Removed.  We need to create
7486         ParameterReferences during semantic analysis so that we can do a
7487         type-only search when resolving Cast, TypeOf and SizeOf.
7488         (block): Pass the `current_local_parameters' to the Block's
7489         constructor.
7490
7491         * class.cs (ConstructorInitializer): Added `Parameters parameters'
7492         argument to the constructor.
7493         (ConstructorInitializer.Resolve): Create a temporary implicit
7494         block with the parameters.
7495
7496         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
7497         references here if we aren't doing a type-only search.
7498
7499         * statement.cs (Block): Added constructor which takes a
7500         `Parameters parameters' argument.
7501         (Block.Parameters): New public property.
7502
7503         * support.cs (InternalParameters.Parameters): Renamed `parameters'
7504         to `Parameters' and made it public readonly.
7505
7506 2002-08-06  Martin Baulig  <martin@gnome.org>
7507
7508         * ecore.cs (Expression.Warning): Made this public as well.
7509
7510         * report.cs (Report.Debug): Print the contents of collections.
7511
7512 2002-08-06  Martin Baulig  <martin@gnome.org>
7513
7514         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
7515         used to tell Resolve() which kinds of expressions it may return.
7516         (Expression.Resolve): Added overloaded version of this method which
7517         takes a `ResolveFlags flags' argument.  This can be used to tell
7518         Resolve() which kinds of expressions it may return.  Reports a
7519         CS0118 on error.
7520         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
7521         ResolveFlags.SimpleName.
7522         (Expression.Error118): Added overloaded version of this method which
7523         takes a `ResolveFlags flags' argument.  It uses the flags to determine
7524         which kinds of expressions are allowed.
7525
7526         * expression.cs (Argument.ResolveMethodGroup): New public method.
7527         Resolves an argument, but allows a MethodGroup to be returned.
7528         This is used when invoking a delegate.
7529
7530         * TODO: Updated a bit.
7531
7532 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7533
7534         Fixed compilation with csc.
7535
7536         * ecore.cs: Expression.Error made public. Is this correct? Should
7537         Warning be made public too?
7538
7539         * expression.cs: use ea.Location instead of ea.loc.
7540         [FIXME:  Filed as bug #28607: MCS must report these errors.]
7541
7542 2002-08-06  Martin Baulig  <martin@gnome.org>
7543
7544         * ecore.cs (Expression.loc): Moved the location here instead of
7545         duplicating it in all derived classes.
7546         (Expression.Location): New public property.
7547         (Expression.Error, Expression.Warning): Made them non-static and
7548         removed the location argument.
7549         (Expression.Warning): Added overloaded version which takes an
7550         `int level' argument.
7551         (Expression.Error118): Make this non-static and removed the
7552         expression and location arguments.
7553         (TypeExpr): Added location argument to the constructor.
7554
7555         * expression.cs (StaticCallExpr): Added location argument to
7556         the constructor.
7557         (Indirection, PointerArithmetic): Likewise.
7558         (CheckedExpr, UnCheckedExpr): Likewise.
7559         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
7560         (StringPtr): Likewise.
7561
7562
7563 2002-08-05  Martin Baulig  <martin@gnome.org>
7564
7565         * expression.cs (BaseAccess.DoResolve): Actually report errors.
7566
7567         * assign.cs (Assign.DoResolve): Check whether the source
7568         expression is a value or variable.
7569
7570         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
7571         while resolving the corresponding blocks.
7572
7573         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
7574         an error, don't silently return null.
7575
7576         * statement.cs (Block.AddVariable): Do the error reporting here
7577         and distinguish between CS0128 and CS0136.
7578         (Block.DoResolve): Report all unused labels (warning CS0164).
7579         (LabeledStatement): Pass the location to the constructor.
7580         (LabeledStatement.HasBeenReferenced): New property.
7581         (LabeledStatement.Resolve): Set it to true here.
7582
7583         * statement.cs (Return.Emit): Return success even after reporting
7584         a type mismatch error (CS0126 or CS0127), this is what csc does and
7585         it avoids confusing the users with any consecutive errors.
7586
7587 2002-08-05  Martin Baulig  <martin@gnome.org>
7588
7589         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
7590
7591         * const.cs (Const.LookupConstantValue): Catch circular definitions.
7592
7593         * expression.cs (MemberAccess.DoResolve): Silently return if an
7594         error has already been reported.
7595
7596         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
7597         error has already been reported.
7598
7599 2002-08-05  Martin Baulig  <martin@gnome.org>
7600
7601         * statement.cs (UsageVector): Only initialize the `parameters'
7602         vector if we actually have any "out" parameters.
7603
7604 2002-08-05  Martin Baulig  <martin@gnome.org>
7605
7606         * expression.cs (Binary.ResolveOperator): When combining delegates,
7607         they must have the same type.
7608
7609 2002-08-05  Martin Baulig  <martin@gnome.org>
7610
7611         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
7612         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
7613         work with the ms runtime and we also don't need it: if we're a
7614         PropertyBuilder and not in the `indexer_arguments' hash, then we
7615         are a property and not an indexer.
7616
7617         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
7618         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
7619         since the latter one doesn't work with the ms runtime.
7620
7621 2002-08-03  Martin Baulig  <martin@gnome.org>
7622
7623         Fixed bugs #27998 and #22735.
7624
7625         * class.cs (Method.IsOperator): New public field.
7626         (Method.CheckBase): Report CS0111 if there's already a method
7627         with the same parameters in the current class.  Report CS0508 when
7628         attempting to change the return type of an inherited method.
7629         (MethodData.Emit): Report CS0179 if a method doesn't have a body
7630         and it's not marked abstract or extern.
7631         (PropertyBase): New abstract base class for Property and Indexer.
7632         (PropertyBase.CheckBase): Moved here from Property and made it work
7633         for indexers.
7634         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
7635         the same so we can reuse it there.
7636         (Property, Indexer): Derive from PropertyBase.
7637         (MethodSignature.inheritable_property_signature_filter): New delegate
7638         to find properties and indexers.
7639
7640         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
7641         argument and improved error reporting.
7642
7643         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
7644         EmptyReadOnlyParameters and made it a property.
7645
7646         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
7647         version of this method which takes a `PropertyInfo indexer'.
7648         (TypeManager.RegisterIndexer): New method.
7649
7650         * class.cs: Added myself as author of this file :-)
7651
7652 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7653
7654         * class.cs: fixed compilation on windoze.
7655
7656 2002-08-03  Martin Baulig  <martin@gnome.org>
7657
7658         * interface.cs (Interface.GetInterfaceBases): Check whether all
7659         base interfaces are at least as accessible than the current one.
7660
7661         * class.cs (TypeContainer.GetClassBases): Check whether base types
7662         are at least as accessible than the current type.
7663         (TypeContainer.AsAccessible): Implemented and made non-static.
7664         (MemberBase.CheckParameters): Report errors if the accessibility
7665         checks fail.
7666
7667         * delegate.cs (Delegate.Delegate): The default visibility is
7668         internal for top-level types and private for nested types.
7669         (Delegate.Define): Report errors if the accessibility checks fail.
7670
7671         * enum.cs (Enum.Enum): The default visibility is internal for
7672         top-level types and private for nested types.
7673         (Enum.DefineType): Compute the correct visibility.
7674
7675         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
7676         function which takes a `bool is_toplevel' instead of a TypeContainer.
7677
7678         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
7679         builtin type.
7680
7681 2002-08-02  Martin Baulig  <martin@gnome.org>
7682
7683         * expression.cs (LocalVariableReferenc): Added constructor which
7684         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
7685         (LocalVariableReference.IsReadOnly): New property.
7686         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
7687         variable is readonly, use our own readonly flag to do this; you can
7688         use the new constructor to get a writable reference to a read-only
7689         variable.
7690
7691         * cs-parser.jay (foreach_statement, using_statement): Get a writable
7692         reference to the local variable.
7693
7694 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
7695
7696         * rootcontext.cs (ResolveCore): Also include System.Exception
7697
7698         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
7699         we reach an EmptyStatement.
7700
7701         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
7702         is also fine.
7703
7704         * expression.cs (Binary.ResolveOperator): Check error result in
7705         two places.
7706
7707         use brtrue/brfalse directly and avoid compares to null.
7708
7709 2002-08-02  Martin Baulig  <martin@gnome.org>
7710
7711         * class.cs (TypeContainer.Define): Define all nested interfaces here.
7712         Fixes bug #28407, added test-155.cs.
7713
7714 2002-08-01  Martin Baulig  <martin@gnome.org>
7715
7716         * class.cs (Event.EmitDefaultMethod): Make this work with static
7717         events.  Fixes #28311, added verify-3.cs.
7718
7719 2002-08-01  Martin Baulig  <martin@gnome.org>
7720
7721         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
7722         `is_disposable' fields.
7723         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
7724         `hm.is_disposable' if we're using the collection pattern.
7725         (Foreach.EmitCollectionForeach): Use the correct type for the
7726         enumerator's local variable, only emit the try/finally block if
7727         necessary (fixes #27713).
7728
7729 2002-08-01  Martin Baulig  <martin@gnome.org>
7730
7731         * ecore.cs (Expression.report118): Renamed to Error118 and made
7732         it public static.
7733
7734         * statement.cs (Throw.Resolve): Check whether the expression is of
7735         the correct type (CS0118) and whether the type derives from
7736         System.Exception (CS0155).
7737         (Catch.Resolve): New method.  Do the type lookup here and check
7738         whether it derives from System.Exception (CS0155).
7739         (Catch.CatchType, Catch.IsGeneral): New public properties.
7740
7741         * typemanager.cs (TypeManager.exception_type): Added.
7742
7743 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
7744
7745         * driver.cs: Updated About function.
7746
7747 2002-07-31  Martin Baulig  <martin@gnome.org>
7748
7749         Implemented Control Flow Analysis.
7750
7751         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
7752         (EmitContext.CurrentBranching): Added.
7753         (EmitContext.StartFlowBranching): Added.
7754         (EmitContext.EndFlowBranching): Added.
7755         (EmitContext.KillFlowBranching): Added.
7756         (EmitContext.IsVariableAssigned): Added.
7757         (EmitContext.SetVariableAssigned): Added.
7758         (EmitContext.IsParameterAssigned): Added.
7759         (EmitContext.SetParameterAssigned): Added.
7760         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
7761         Added control flow analysis stuff here.
7762
7763         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
7764         resolve the expression as lvalue.
7765         (LocalVariableReference.DoResolve): Check whether the variable has
7766         already been assigned.
7767         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
7768         the parameter as assigned here.
7769         (ParameterReference.DoResolve): Check whether the parameter has already
7770         been assigned.
7771         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
7772         expression as lvalue.
7773
7774         * statement.cs (FlowBranching): New class for the flow analysis code.
7775         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
7776         (LabeledStatement.IsDefined): New public property.
7777         (LabeledStatement.AddUsageVector): New public method to tell flow
7778         analyis that the label may be reached via a forward jump.
7779         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
7780         flow analysis.
7781         (VariableInfo.Number): New public field.  This is used by flow analysis
7782         to number all locals of a block.
7783         (Block.CountVariables): New public property.  This is the number of
7784         local variables in this block (including the locals from all parent
7785         blocks).
7786         (Block.EmitMeta): Number all the variables.
7787
7788         * statement.cs: Added flow analysis support to all classes.
7789
7790 2002-07-31  Martin Baulig  <martin@gnome.org>
7791
7792         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
7793         To get debugging messages, compile mcs with /define:MCS_DEBUG and
7794         then use this argument.
7795
7796         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
7797
7798         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
7799         use this to specify /define options.
7800
7801 2002-07-29  Martin Baulig  <martin@gnome.org>
7802
7803         * statement.cs (Fixed): Moved all code that does variable lookups
7804         and resolvings from Emit to Resolve.
7805
7806         * statement.cs (For): Moved all code that does variable lookups
7807         and resolvings from Emit to Resolve.
7808
7809         * statement.cs (Using): Moved all code that does variable lookups
7810         and resolvings from Emit to Resolve.
7811
7812 2002-07-29  Martin Baulig  <martin@gnome.org>
7813
7814         * attribute.cs (Attribute.Resolve): Explicitly catch a
7815         System.NullReferenceException when creating the
7816         CustromAttributeBuilder and report a different warning message.
7817
7818 2002-07-29  Martin Baulig  <martin@gnome.org>
7819
7820         * support.cs (ParameterData.ParameterName): Added method to
7821         get the name of a parameter.
7822
7823         * typemanager.cs (TypeManager.IsValueType): New public method.
7824
7825 2002-07-29  Martin Baulig  <martin@gnome.org>
7826
7827         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
7828         is a flag which specifies that it's either ref or out.
7829         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
7830         the out parameter to `out Parameter.Modifier mod', also set the
7831         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
7832
7833         * support.cs (InternalParameters.ParameterModifier): Distinguish
7834         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7835         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7836
7837         * expression.cs (Argument.GetParameterModifier): Distinguish
7838         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7839         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7840
7841 2002-07-29  Martin Baulig  <martin@gnome.org>
7842
7843         * expression.cs (ParameterReference.ParameterReference): Added
7844         `Location loc' argument to the constructor.
7845
7846         * cs-parser.jay: Pass location to ParameterReference.
7847
7848 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
7849
7850         * statement.cs (Try): Initialize the location.
7851
7852         * cs-parser.jay: pass location to Try.
7853
7854         * expression.cs (Unary.Reduce): Change the prototype to return
7855         whether a constant fold could be performed or not.  The result is
7856         returned in an out parameters.  In the case of Indirection and
7857         AddressOf, we want to perform the full tests.
7858
7859 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
7860
7861         * statement.cs (Statement.Emit): Flag dead code.
7862
7863 2002-07-27  Andrew Birkett  <andy@nobugs.org>
7864
7865         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
7866
7867 2002-07-27  Martin Baulig  <martin@gnome.org>
7868
7869         * class.cs (MethodData.Define): Put back call to
7870         TypeManager.AddMethod(), accidentally commented this out.
7871
7872         * report.cs (Debug): New public method to print debugging information,
7873         this is `[Conditional ("DEBUG")]'.
7874
7875 2002-07-26  Martin Baulig  <martin@gnome.org>
7876
7877         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
7878         (switch_statement): Push the current_block to the switch_stack and
7879         pop it again when we're done with the switch.
7880         (switch_section): The new block is a child of the current_block.
7881         Fixes bug #24007, added test-152.cs.
7882
7883 2002-07-27  Martin Baulig  <martin@gnome.org>
7884
7885         * expression.cs (Invocation.EmitArguments): When calling a varargs
7886         function with only its fixed arguments, we need to pass an empty
7887         array.
7888
7889 2002-07-27  Martin Baulig  <martin@gnome.org>
7890
7891         Mono 0.13 has been released.
7892
7893 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
7894
7895         * driver.cs: Rename --resource to --linkres, because that is what
7896         we do currently, we dont support --resource yet.
7897
7898         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
7899
7900 2002-07-25  Martin Baulig  <martin@gnome.org>
7901
7902         * class.cs (MethodData): New public class.  This is a `method builder'
7903         class for a method or one accessor of a Property/Indexer/Event.
7904         (MethodData.GetMethodFlags): Moved here from MemberBase.
7905         (MethodData.ApplyAttributes): Likewise.
7906         (MethodData.ApplyObsoleteAttribute): Likewise.
7907         (MethodData.ApplyConditionalAttribute): Likewise.
7908         (MethodData.ApplyDllImportAttribute): Likewise.
7909         (MethodData.CheckAbstractAndExternal): Likewise.
7910         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
7911         (MethodData.Emit): Formerly known as Method.Emit().
7912         (MemberBase): Moved everything which was specific to a single
7913         accessor/method to MethodData.
7914         (Method): Create a new MethodData and call Define() and Emit() on it.
7915         (Property, Indexer, Event): Create a new MethodData objects for each
7916         accessor and call Define() and Emit() on them.
7917
7918 2002-07-25  Martin Baulig  <martin@gnome.org>
7919
7920         Made MethodCore derive from MemberBase to reuse the code from there.
7921         MemberBase now also checks for attributes.
7922
7923         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
7924         (MemberBase.GetMethodFlags): Moved here from class Method and marked
7925         as virtual.
7926         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
7927         `CallingConventions cc' and `Attributes opt_attrs' arguments.
7928         (MemberBase.ApplyAttributes): New virtual method; applies the
7929         attributes to a method or accessor.
7930         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
7931         (MemberBase.ApplyConditionalAttribute): Likewise.
7932         (MemberBase.ApplyDllImportAttribute): Likewise.
7933         (MemberBase.CheckAbstractAndExternal): Likewise.
7934         (MethodCore.ParameterTypes): This is now a property instead of a
7935         method, it's initialized from DoDefineParameters().
7936         (MethodCore.ParameterInfo): Removed the set accessor.
7937         (MethodCore.DoDefineParameters): New protected virtual method to
7938         initialize ParameterTypes and ParameterInfo.
7939         (Method.GetReturnType): We can now simply return the MemberType.
7940         (Method.GetMethodFlags): Override the MemberBase version and add
7941         the conditional flags.
7942         (Method.CheckBase): Moved some code from Define() here, call
7943         DoDefineParameters() here.
7944         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
7945         here to avoid some larger code duplication.
7946         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
7947         ensure that abstract and external accessors don't declare a body.
7948
7949         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
7950         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
7951         lookup in the attribute's parent classes, so we need to abort as soon
7952         as we found the first match.
7953         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
7954         the attribute has no arguments.
7955
7956         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
7957         of a Method.
7958
7959 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7960
7961         * cs-parser.jay: reverted previous patch.
7962
7963 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7964
7965         * cs-parser.jay: fixed bug #22119.
7966
7967 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7968
7969         * attribute.cs: fixed compilation. The error was:
7970         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
7971         be assigned to before control leaves the current method."
7972         [FIXME:  Filed as bug #28186: MCS must report this error.]
7973
7974 2002-07-25  Martin Baulig  <martin@gnome.org>
7975
7976         * attribute.cs (Attribute.Conditional_GetConditionName): New static
7977         method to pull the condition name ouf of a Conditional attribute.
7978         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
7979         the obsolete message and error flag out of an Obsolete attribute.
7980
7981         * class.cs (Method.GetMethodFlags): New public method to get the
7982         TypeManager.MethodFlags for this method.
7983         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
7984         private methods.
7985         (Method.Define): Get and apply the Obsolete and Conditional attributes;
7986         if we're overriding a virtual function, set the new private variable
7987         `parent_method'; call the new TypeManager.AddMethod().
7988
7989         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
7990         the MethodBuilder and the Method in a PtrHashtable.
7991         (TypeManager.builder_to_method): Added for this purpose.
7992         (TypeManager.MethodFlags): Added IsObsoleteError.
7993         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
7994         Obsolete and Conditional arguments in MethodBuilders.  If we discover
7995         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
7996         the message from the attribute.
7997
7998 2002-07-24  Martin Baulig  <martin@gnome.org>
7999
8000         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
8001         preprocessor directives, ensure that the argument to #define/#undef is
8002         exactly one identifier and that it's actually an identifier.
8003
8004         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
8005         did not work ....
8006
8007 2002-07-24  Martin Baulig  <martin@gnome.org>
8008
8009         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
8010         initialize it to TypeManager.object_type in the constructor.
8011         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
8012         of the `hm.get_current' method if we're using the collection pattern.
8013         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
8014         for the explicit conversion to make it work when we're using the collection
8015         pattern and the `Current' property has a different return type than `object'.
8016         Fixes #27713.
8017
8018 2002-07-24  Martin Baulig  <martin@gnome.org>
8019
8020         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
8021         does not match, but don't report any errors.  This method is called in
8022         order for all methods in a MethodGroupExpr until a matching method is
8023         found, so we don't want to bail out if the first method doesn't match.
8024         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
8025         matches, report the 123.  Fixes #28070.
8026
8027 2002-07-24  Martin Baulig  <martin@gnome.org>
8028
8029         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
8030         TypeManager.TypeToCoreType() to the top of the method so the
8031         following equality checks will work.  Fixes #28107.
8032
8033 2002-07-24  Martin Baulig  <martin@gnome.org>
8034
8035         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
8036         operand is of type uint, and the other operand is of type sbyte,
8037         short or int, the operands are converted to type long." -
8038         Actually do what this comment already told us.  Fixes bug #28106,
8039         added test-150.cs.
8040
8041 2002-07-24  Martin Baulig  <martin@gnome.org>
8042
8043         * class.cs (MethodBase): New abstract class.  This is now a base
8044         class for Property, Indexer and Event to avoid some code duplication
8045         in their Define() and DefineMethods() methods.
8046         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
8047         generic methods for Define() and DefineMethods().
8048         (FieldBase): Derive from MemberBase, not MemberCore.
8049         (Property): Derive from MemberBase, not MemberCore.
8050         (Property.DefineMethod): Moved all the code from this method to the
8051         new MethodBase.DefineAccessor(), just call it with appropriate
8052         argumetnts.
8053         (Property.Define): Call the new Property.DoDefine(), this does some
8054         sanity checks and we don't need to duplicate the code everywhere.
8055         (Event): Derive from MemberBase, not MemberCore.
8056         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
8057         accessors, this will also make them work with interface events.
8058         (Indexer): Derive from MemberBase, not MemberCore.
8059         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
8060         (Indexer.Define): Use the new MethodBase functions.
8061
8062         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
8063         argument to the constructor.
8064         (Interface.FindMembers): Added support for interface events.
8065         (Interface.PopluateEvent): Implemented.
8066
8067         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
8068
8069 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
8070
8071         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
8072         but this is required to check for a method name being the same as
8073         the containing class.  
8074
8075         Handle this now.
8076
8077 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8078
8079         * interface.cs: initialize variable.
8080
8081 2002-07-23  Martin Baulig  <martin@gnome.org>
8082
8083         Implemented the IndexerName attribute in interfaces.
8084
8085         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
8086         name if this is an explicit interface implementation.
8087         (Indexer.InterfaceIndexerName): New public variable.  If we're
8088         implementing an interface indexer, this is the IndexerName in that
8089         interface.  Otherwise, it's the IndexerName.
8090         (Indexer.DefineMethod): If we're implementing interface indexer,
8091         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
8092         and Pending.ImplementIndexer methods.
8093         (Indexer.Define): Also define the PropertyBuilder if we're
8094         implementing an interface indexer and this is neither an explicit
8095         interface implementation nor do the IndexerName match the one in
8096         the interface.
8097
8098         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
8099         If a method is defined here, then we always need to create a proxy
8100         for it.  This is used when implementing interface indexers.
8101         (Pending.IsInterfaceIndexer): New public method.
8102         (Pending.ImplementIndexer): New public method.
8103         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
8104         This is used when implementing interface indexers to define a proxy
8105         if necessary.
8106         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
8107         define a proxy if necessary.
8108
8109         * interface.cs (Interface.IndexerName): New public variable.
8110         (Interface.PopulateIndexer): Set the IndexerName.
8111         (Interface.DefineIndexers): New private method.  Populate all the
8112         indexers and make sure their IndexerNames match.
8113
8114         * typemanager.cs (IndexerPropertyName): Added support for interface
8115         indexers.
8116
8117 2002-07-22  Martin Baulig  <martin@gnome.org>
8118
8119         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
8120         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
8121         ret if HasReturnLabel.
8122         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
8123         variables.
8124
8125         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
8126         and set the ec.LoopBeginTryCatchLevel.
8127         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
8128         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
8129         the current ec.TryCatchLevel, the branch goes out of an exception
8130         block.  In this case, we need to use Leave and not Br.
8131
8132 2002-07-22  Martin Baulig  <martin@gnome.org>
8133
8134         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
8135         block unless the block does not always return or it is contained in
8136         another try { ... } catch { ... } block.  Fixes bug #26506.
8137         Added verify-1.cs to the test suite.
8138
8139 2002-07-22  Martin Baulig  <martin@gnome.org>
8140
8141         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
8142         then we do not always return.  Fixes bug #24985.
8143
8144 2002-07-22  Martin Baulig  <martin@gnome.org>
8145
8146         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
8147         lookup on a per-class level; ie. walk up the class hierarchy until we
8148         found at least one applicable method, then choose the best among them.
8149         Fixes bug #24463 and test-29.cs.
8150
8151 2002-07-22  Martin Baulig  <martin@gnome.org>
8152
8153         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
8154         return types of the methods.  The return type is not part of the
8155         signature and we must not check it to make the `new' modifier work.
8156         Fixes bug #27999, also added test-147.cs.
8157         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
8158
8159         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
8160         on the method's return type.
8161
8162 2002-07-21  Martin Baulig  <martin@gnome.org>
8163
8164         * assign.cs: Make this work if the rightmost source is a constant and
8165         we need to do an implicit type conversion.  Also adding a few more tests
8166         to test-38.cs which should have caught this.
8167
8168         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
8169         target in the makefile for this.  The makefile.gnu is primarily intended
8170         for end-users who don't want to debug the compiler.
8171
8172 2002-07-21  Martin Baulig  <martin@gnome.org>
8173
8174         * assign.cs: Improved the Assign class so it can now handle embedded
8175         assignments (X = Y = Z = something).  As a side-effect this'll now also
8176         consume less local variables.  test-38.cs now passes with MCS, added
8177         a few new test cases to that test.
8178
8179 2002-07-20  Martin Baulig  <martin@gnome.org>
8180
8181         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
8182         instructions.  Fixes bug #27977, also added test-146.cs.
8183
8184 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8185
8186         * cs-tokenizer.cs: fixed getHex ().
8187
8188 2002-07-19  Martin Baulig  <martin@gnome.org>
8189
8190         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
8191         not Type.GetType() to lookup the array type.  This is needed when
8192         we're constructing an array of a user-defined type.
8193         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
8194         single-dimensional arrays, but also for single-dimensial arrays of
8195         type decimal.
8196
8197 2002-07-19  Martin Baulig  <martin@gnome.org>
8198
8199         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
8200         this function is called, it's not allowed to share LocalBuilders
8201         among ILGenerators.
8202
8203 2002-07-19  Martin Baulig  <martin@gnome.org>
8204
8205         * expression.cs (Argument.Resolve): Report an error 118 when trying
8206         to pass a type as argument.
8207
8208 2002-07-18  Martin Baulig  <martin@gnome.org>
8209
8210         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
8211         Conv_R_Un for the signed `long' type.
8212
8213 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
8214
8215         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
8216         `expr' for the temporary result, as that will fail if we do
8217         multiple resolves on the same expression.
8218
8219 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
8220
8221         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
8222         ec.TypeContainer for looking up aliases. 
8223
8224         * class.cs (TypeContainer): Remove LookupAlias from here.
8225
8226         * decl.cs (DeclSpace); Move here.
8227
8228 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
8229
8230         * class.cs (FindMembers): Only call filter if the constructor
8231         bulider is not null.
8232
8233         Also handle delegates in `NestedTypes' now.  Now we will perform
8234         type lookups using the standard resolution process.  This also
8235         fixes a bug.
8236
8237         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
8238         This uses Expressions (the limited kind that can be parsed by the
8239         tree) instead of strings.
8240
8241         * expression.cs (ComposedCast.ToString): Implement, used to flag
8242         errors since now we have to render expressions.
8243
8244         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
8245         FormArrayType. 
8246
8247         * ecore.cs (SimpleName.ToString): ditto.
8248
8249         * cs-parser.jay: Instead of using strings to assemble types, use
8250         Expressions to assemble the type (using SimpleName, ComposedCast,
8251         MemberAccess).  This should fix the type lookups in declarations,
8252         because we were using a different code path for this.
8253
8254         * statement.cs (Block.Resolve): Continue processing statements
8255         even when there is an error.
8256
8257 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
8258
8259         * class.cs (Event.Define): Also remove the `remove' method from
8260         the list of pending items.
8261
8262         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
8263         generate more compact code. 
8264
8265 2002-07-17  Martin Baulig  <martin@gnome.org>
8266
8267         * const.cs (Const.LookupConstantValue): Add support for constant
8268         `unchecked' and `checked' expressions.
8269         Also adding test case test-140.cs for this.
8270
8271 2002-07-17  Martin Baulig  <martin@gnome.org>
8272
8273         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
8274         check whether mi.ReturnType implements the IEnumerator interface; the
8275         `==' and the IsAssignableFrom() will fail in this situation.
8276
8277 2002-07-16  Ravi Pratap  <ravi@ximian.com>
8278
8279         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
8280         here too.
8281
8282 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8283
8284         * expression.cs: fixed bug #27811.
8285
8286 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
8287
8288         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
8289         Molaro: when we are a ref, the value already contains a pointer
8290         value, do not take the address of it.
8291
8292 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
8293         * removed mb-parser.jay and mb-tokenizer.cs
8294
8295 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
8296
8297         * expression.cs: check against the building corlib void type.
8298
8299 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
8300
8301         * ecore.cs: fix for valuetype static readonly fields: when 
8302         initializing them, we need their address, not the address of a copy.
8303
8304 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
8305
8306         * typemanager.cs: register also enum_type in corlib.
8307
8308 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
8309
8310         * class.cs: allow calling this (but not base) initializers in structs.
8311
8312 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
8313
8314         * ecore.cs: make sure we compare against the building base types
8315         in GetTypeSize ().
8316
8317 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
8318
8319         * typemanager.cs: fix TypeToCoreType() to handle void and object
8320         (corlib gets no more typerefs after this change).
8321
8322 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
8323
8324         * expression.cs (ArrayCreation.EmitArrayArguments): use
8325         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
8326
8327         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
8328         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
8329         array indexes, the runtime actually forbids them.
8330
8331         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
8332         for array arguments here.
8333
8334         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
8335         instead of the default for ValueTypes.
8336
8337         (New.DoEmit): Use IsValueType instead of
8338         IsSubclassOf (value_type)
8339         (New.DoResolve): ditto.
8340         (Invocation.EmitCall): ditto.
8341
8342         * assign.cs (Assign): ditto.
8343
8344         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
8345         Statements *are* currently doing part of their resolution during
8346         Emit.  
8347
8348         Expressions do always resolve during resolve, but statements are
8349         only required to propagate resolution to their children.
8350
8351 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
8352
8353         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
8354
8355         (LoadAssembly): Do not add the dll if it is already specified
8356
8357         (MainDriver): Add the System directory to the link path at the end,
8358         after all the other -L arguments. 
8359
8360         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
8361         wrong opcode for loading bytes and bools (ldelem.i1 instead of
8362         ldelem.u1) and using the opposite for sbytes.
8363
8364         This fixes Digger, and we can finally run it.
8365
8366         * driver.cs (UnixParseOption): Move the option parsing here.  
8367         (CSCParseOption): Implement CSC-like parsing of options.
8368
8369         We now support both modes of operation, the old Unix way, and the
8370         new CSC-like way.  This should help those who wanted to make cross
8371         platform makefiles.
8372
8373         The only thing broken is that /r:, /reference: and /lib: are not
8374         implemented, because I want to make those have the same semantics
8375         as the CSC compiler has, and kill once and for all the confussion
8376         around this.   Will be doing this tomorrow.
8377
8378         * statement.cs (Unsafe.Resolve): The state is checked during
8379         resolve, not emit, so we have to set the flags for IsUnsfe here.
8380
8381 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
8382
8383         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
8384         not catch the Error_ObjectRefRequired in SimpleName (as it is
8385         possible to have a class/instance variable name that later gets
8386         deambiguated), we have to check this here.      
8387
8388 2002-07-10  Ravi Pratap  <ravi@ximian.com>
8389
8390         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
8391         make static and put into Expression.
8392
8393         (Event.Define): Register the private field of the event with the 
8394         TypeManager so that GetFieldFromEvent can get at it.
8395
8396         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
8397         keep track of the private field associated with an event which
8398         has no accessors.
8399
8400         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
8401         private field.
8402
8403         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
8404
8405 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
8406
8407         * expression.cs (Binary.EmitBranchable): this routine emits the
8408         Binary expression in a branchable context.  This basically means:
8409         we need to branch somewhere, not just get the value on the stack.
8410
8411         This works together with Statement.EmitBoolExpression.
8412
8413         * statement.cs (Statement.EmitBoolExpression): Use
8414         EmitBranchable. 
8415
8416 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
8417
8418         * statement.cs (For): Reduce the number of jumps in loops.
8419
8420         (For): Implement loop inversion for the For statement.
8421
8422         (Break): We can be breaking out of a Try/Catch controlled section
8423         (foreach might have an implicit try/catch clause), so we need to
8424         use Leave instead of Br.
8425
8426         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
8427         now).  If the instace expression supports IMemoryLocation, we use
8428         the AddressOf method from the IMemoryLocation to extract the
8429         address instead of emitting the instance.
8430
8431         This showed up with `This', as we were emitting the instance
8432         always (Emit) instead of the Address of This.  Particularly
8433         interesting when This is a value type, as we dont want the Emit
8434         effect (which was to load the object).
8435
8436 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
8437
8438         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
8439
8440         * statement.cs (Checked): Set the CheckedState during the resolve
8441         process too, as the ConvCast operations track the checked state on
8442         the resolve process, and not emit.
8443
8444         * cs-parser.jay (namespace_member_declaration): Flag that we have
8445         found a declaration when we do.  This is used to flag error 1529
8446
8447         * driver.cs: Report ok when we display the help only.
8448
8449 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
8450
8451         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
8452
8453 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
8454
8455         * cs-tokenizer.cs (define): We also have to track locally the
8456         defines.  AllDefines is just used for the Conditional Attribute,
8457         but we also need the local defines for the current source code. 
8458
8459 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
8460
8461         * statement.cs (While, For, Do): These loops can exit through a
8462         Break statement, use this information to tell whether the
8463         statement is the last piece of code.
8464
8465         (Break): Flag that we break.
8466
8467         * codegen.cs (EmitContexts): New `Breaks' state variable.
8468
8469 2002-07-03  Martin Baulig  <martin@gnome.org>
8470
8471         * class.cs (TypeContainer.MethodModifiersValid): Allow override
8472         modifiers in method declarations in structs.  Otherwise, you won't
8473         be able to override things like Object.Equals().
8474
8475 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
8476
8477         * class.cs (Method, Property, Indexer): Do not allow the public
8478         modifier to be used in explicit interface implementations.
8479
8480         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
8481         override modifiers in method declarations in structs
8482
8483 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
8484
8485         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
8486         integer or real overflow, report an error
8487
8488 2002-07-02  Martin Baulig  <martin@gnome.org>
8489
8490         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
8491         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
8492         to tell the runtime about our newly created System.Object and
8493         System.ValueType types.
8494
8495 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
8496
8497         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
8498         struct instead of Ldarg/Starg.
8499
8500 2002-07-02  Martin Baulig  <martin@gnome.org>
8501
8502         * expression.cs (Indirection.Indirection): Call
8503         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
8504
8505 2002-07-02  Martin Baulig  <martin@gnome.org>
8506
8507         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
8508         ValueType, call TypeManager.TypeToCoreType() on it.
8509         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
8510         the OpCodes.Newarr argument.
8511
8512 2002-07-02  Martin Baulig  <martin@gnome.org>
8513
8514         * expression.cs (Invocation.EmitCall): When compiling corlib,
8515         replace all calls to the system's System.Array type to calls to
8516         the newly created one.
8517
8518         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
8519         System.Array methods.
8520         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
8521         from the system's System.Array type which must be replaced.
8522
8523 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
8524
8525         * typemanager.cs: load unverifiable_code_ctor so we can build
8526         corlib using the correct type. Avoid using GetTypeCode() with
8527         TypeBuilders.
8528         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
8529         TypeManager.object_type to allow building corlib.
8530
8531 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
8532
8533         * ecore.cs: handle System.Enum separately in LoadFromPtr().
8534
8535 2002-07-01  Martin Baulig  <martin@gnome.org>
8536
8537         * class.cs: Make the last change actually work, we need to check
8538         whether `ifaces != null' to avoid a crash.
8539
8540 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
8541
8542         * class.cs: when we build structs without fields that implement
8543         interfaces, we need to add the interfaces separately, since there is
8544         no API to both set the size and add the interfaces at type creation
8545         time.
8546
8547 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
8548
8549         * expression.cs: the dimension arguments to the array constructors
8550         need to be converted if they are a long.
8551
8552 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
8553
8554         * class.cs: don't emit ldarg.0 if there is no parent constructor
8555         (fixes showstopper for corlib).
8556
8557 2002-06-29  Martin Baulig  <martin@gnome.org>
8558
8559         MCS now compiles corlib on GNU/Linux :-)
8560
8561         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
8562         ie. check for MethodImplOptions.InternalCall.
8563
8564         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
8565         and TypeManager.attribute_type are null, so we must explicitly check
8566         whether parent is not null to find out whether it's an attribute type.
8567         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
8568         and SetBuilder, not only if the property is neither abstract nor external.
8569         This is necessary to set the MethodImplOptions on the accessor methods.
8570         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
8571         SetBuilder, see Property.Emit().
8572
8573         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
8574         populate "System.Object", "System.ValueType" and "System.Attribute" since
8575         they've already been populated from BootCorlib_PopulateCoreTypes().
8576
8577 2002-06-29  Martin Baulig  <martin@gnome.org>
8578
8579         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
8580         is the NullLiteral, we also need to make sure that target_type is not
8581         an enum type.   
8582
8583 2002-06-29  Martin Baulig  <martin@gnome.org>
8584
8585         * rootcontext.cs (RootContext.ResolveCore): We must initialize
8586         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
8587         before calling BootstrapCorlib_ResolveDelegate ().
8588
8589 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8590
8591         * statement.cs: fixed build-breaker. All tests passed ok.
8592
8593 2002-06-27  Martin Baulig  <martin@gnome.org>
8594
8595         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
8596         for System.Decimal when compiling corlib.
8597
8598 2002-06-27  Martin Baulig  <martin@gnome.org>
8599
8600         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
8601         switch blocks which contain nothing but a default clause.
8602
8603 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
8604
8605        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
8606
8607 2002-06-27  Martin Baulig  <martin@gnome.org>
8608
8609         * ecore.cs (PropertyExpr.PropertyExpr): Call
8610         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
8611
8612         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
8613         is already a TypeBuilder.
8614
8615 2002-06-27  Martin Baulig  <martin@gnome.org>
8616
8617         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
8618         `target_type == TypeManager.array_type', not IsAssignableFrom() in
8619         the "from an array-type to System.Array" case.  This makes it work
8620         when compiling corlib.
8621
8622 2002-06-27  Martin Baulig  <martin@gnome.org>
8623
8624         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
8625         non-static PropertyExpr, set its InstanceExpression.  This makes
8626         the `ICollection.Count' property work in System/Array.cs.
8627
8628 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
8629
8630         * driver.cs: Made error handling more consistent.  Errors now
8631         tracked by Report class, so many methods which used to return int
8632         now return void.  Main() now prints success/failure and 
8633         errors/warnings message.
8634
8635         Renamed '--probe' compiler argument to '--expect-error'.  Removed
8636         the magic number return values (123 and 124).  Now, if the
8637         expected error occurs, the compiler exits with success (exit value
8638         0).  If the compilation completes without seeing that particular
8639         error, the compiler exits with failure (exit value 1).  The
8640         makefile in mcs/errors has been changed to handle the new behaviour.
8641
8642         * report.cs: Made 'expected error' number a property and renamed
8643         it from 'Probe' to 'ExpectedError'.
8644
8645         * genericparser.cs: Removed error handling support, since it is
8646         now all done by Report class.
8647
8648         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
8649         class, so parse() no longer returns an int.
8650
8651         * namespace.cs: Use Report.Error instead of GenericParser.error
8652
8653 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
8654
8655         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
8656         TypeContainer.AddOperator): At the front of the list put the
8657         explicit implementations, so they get resolved/defined first. 
8658
8659 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
8660
8661         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
8662         interface type is implemented by this TypeContainer.  Used during
8663         explicit interface implementation.
8664
8665         (Property.Define, Indexer.Define, Method.Define): Validate that
8666         the given interface in the explicit implementation is one of the
8667         base classes for the containing type.
8668
8669         Also if we are explicitly implementing an interface, but there is
8670         no match in the pending implementation table, report an error.
8671
8672         (Property.Define): Only define the property if we are
8673         not explicitly implementing a property from an interface.  Use the
8674         correct name also for those properties (the same CSC uses,
8675         although that is really not needed).
8676
8677         (Property.Emit): Do not emit attributes for explicitly implemented
8678         properties, as there is no TypeBuilder.
8679
8680         (Indexer.Emit): ditto.
8681
8682         Hiding then means that we do not really *implement* a pending
8683         implementation, which makes code fail.
8684
8685 2002-06-22  Martin Baulig  <martin@gnome.org>
8686
8687         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
8688         the return value of Object.GetType().  [FIXME: we need to do this whenever
8689         we get a type back from the reflection library].
8690
8691 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
8692
8693         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
8694
8695 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
8696
8697         * attribute.cs: Return null if we can not look up the type.
8698
8699         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
8700         the interface types found.
8701
8702         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
8703         interface types found.
8704
8705         * typemanager.cs (GetInterfaces): Make this routine returns alll
8706         the interfaces and work around the lame differences between
8707         System.Type and System.Reflection.Emit.TypeBuilder in the results
8708         result for GetInterfaces.
8709
8710         (ExpandInterfaces): Given an array of interface types, expand and
8711         eliminate repeated ocurrences of an interface.  This expands in
8712         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
8713         be IA, IB, IC.
8714
8715 2002-06-21  Martin Baulig  <martin@gnome.org>
8716
8717         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
8718         on System.Enum.
8719
8720 2002-06-21  Martin Baulig  <martin@gnome.org>
8721
8722         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
8723         and called with one of the core types, return the corresponding typebuilder for
8724         that type.
8725
8726         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
8727         element type.
8728
8729 2002-06-21  Martin Baulig  <martin@gnome.org>
8730
8731         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
8732         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
8733         (Expression.ConvertReferenceExplicit): Likewise.
8734
8735         * expression.cs (ElementAccess.DoResolve): Likewise.
8736         (ElementAccess.DoResolveLValue): Likewise.
8737
8738 2002-06-10  Martin Baulig  <martin@gnome.org>
8739
8740         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
8741         add the "value" parameter to the parameter list.
8742
8743         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
8744         to our caller.
8745
8746 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
8747
8748         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
8749         the argument to an int, uint, long or ulong, per the spec.  Also
8750         catch negative constants in array creation.
8751
8752 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
8753
8754         * class.cs: do not allow the same interface to appear twice in
8755         the definition list.
8756
8757 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
8758
8759         * ecore.cs: don't use ldlen with System.Array.
8760
8761 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
8762
8763         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
8764
8765 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
8766
8767         * modifiers.cs: produce correct field attributes for protected
8768         internal. Easy fix so miguel can work on ther harder stuff:-)
8769
8770 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
8771
8772         * pending.cs: New file.  Move the code from class.cs here.
8773         Support clearning the pending flag for all methods (when not doing
8774         explicit interface implementation).
8775
8776 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
8777
8778         * rootcontext.cs: added a couple more types needed to bootstrap.
8779
8780 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
8781
8782         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
8783         constructor in the type, instead of any constructor in the type
8784         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
8785         a bug in the Mono runtime when applying the params attribute). 
8786
8787 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
8788         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
8789
8790 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
8791
8792         * expression.cs (Unary.ResolveOperator): Use TypeManager
8793         to resolve the type.
8794
8795 2002-06-13  Ravi Pratap  <ravi@ximian.com>
8796
8797         * cs-parser.jay (enum_member_declaration): Pass in the attributes
8798         attached.
8799
8800         * enum.cs (AddEnumMember): Add support to store the attributes associated 
8801         with each member too.
8802
8803         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
8804         field builders too - this takes care of the enum member case.
8805
8806 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
8807
8808         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
8809         address-of operator on both value types and pointers.
8810
8811 2002-06-10  Martin Baulig  <martin@gnome.org>
8812
8813         * interface.cs (Interface.PopulateIndexer): Add the indexer's
8814         PropertyBuilder to the `property_builders' list.
8815
8816         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
8817         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
8818         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
8819         find any indexers which are inherited from an interface.
8820
8821 2002-06-09  Martin Baulig  <martin@gnome.org>
8822
8823         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
8824         the same type as the constant if necessary.  There's also a test-130.cs
8825         for this.
8826
8827         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
8828
8829         * typemanager.cs (TypeManager.ChangeType): Previously known as
8830         Enum.ChangeEnumType().
8831
8832 2002-06-09  Martin Baulig  <martin@gnome.org>
8833
8834         * expression.cs (Cast.TryReduce): Added support for consts.
8835
8836 2002-06-08  Ravi Pratap  <ravi@ximian.com>
8837
8838         * class.cs (Accessor): Hold attributes information so we can pass
8839         it along.
8840
8841         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
8842         Modify to pass in attributes attached to the methods.
8843
8844         (add_accessor_declaration, remove_accessor_declaration): Ditto.
8845
8846         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
8847         to handle the Accessor kind :-)
8848
8849         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
8850
8851 2002-06-08  Martin Baulig  <martin@gnome.org>
8852
8853         * expression.cs (Unary.TryReduceNegative): Added support for
8854         ULongConstants.
8855
8856 2002-06-08  Martin Baulig  <martin@gnome.org>
8857
8858         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
8859         name can't be found in the `defined_names' - the caller will do a
8860         MemberLookup in this case and thus find methods in System.Enum
8861         such as Enum.IsDefined().
8862
8863 2002-06-08  Martin Baulig  <martin@gnome.org>
8864
8865         * enum.cs (Enum.ChangeEnumType): This is a custom version of
8866         Convert.ChangeType() which works with TypeBuilder created types.
8867         (Enum.LookupEnumValue, Enum.Define): Use it here.
8868
8869         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
8870         `TypeBuilder.BaseType != null' check.
8871         (TypeContainer.FindMembers): Only lookup parent members if we
8872         actually have a parent.
8873         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
8874         (ConstructorInitializer.Resolve): Likewise.
8875
8876         * interface.cs (Interface.FindMembers): Added
8877         `TypeBuilder.BaseType != null' check.
8878
8879         * rootcontext.cs (RootContext.ResolveCore): Added
8880         "System.Runtime.CompilerServices.IndexerNameAttribute" to
8881         classes_second_stage.
8882
8883         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
8884         debug_type and trace_type when compiling with --nostdlib.       
8885
8886 2002-06-07  Martin Baulig  <martin@gnome.org>
8887
8888         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
8889         (AddField): Set it to true when adding a non-static field.
8890         (DefineType): Use `have_nonstatic_fields' to find out whether we
8891         have non-static fields, not `Fields != null'.
8892
8893 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
8894
8895         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
8896         dereferencing a null on the static-field code path)
8897
8898 2002-05-30  Martin Baulig  <martin@gnome.org>
8899
8900         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
8901         to take command line arguments.  Use reflection to call the new
8902         custom `Initialize' function on the symbol writer and pass it the
8903         command line arguments.
8904
8905         * driver.cs (--debug-args): New command line argument to pass command
8906         line arguments to the symbol writer.
8907
8908 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
8909
8910         * assign.cs (DoResolve): Forgot to do the implicit conversion to
8911         the target type for indexers and properties.  Thanks to Joe for
8912         catching this.
8913
8914 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
8915
8916         * typemanager.cs (MethodFlags): returns the method flags
8917         (Obsolete/ShouldIgnore) that control warning emission and whether
8918         the invocation should be made, or ignored. 
8919
8920         * expression.cs (Invocation.Emit): Remove previous hack, we should
8921         not do this on matching a base type, we should do this based on an attribute
8922
8923         Only emit calls to System.Diagnostics.Debug and
8924         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
8925         on the command line.
8926
8927         * rootcontext.cs: Global settings for tracing and debugging.
8928
8929         * cs-tokenizer.cs (define): New utility function to track
8930         defines.   Set the global settings for TRACE and DEBUG if found.
8931
8932 2002-05-25  Ravi Pratap  <ravi@ximian.com>
8933
8934         * interface.cs (Populate*): Pass in the TypeContainer as well as
8935         the DeclSpace as parameters so that we can create EmitContexts and
8936         then use that to apply attributes etc.
8937
8938         (PopulateMethod, PopulateEvent, PopulateProperty)
8939         (PopulateIndexer): Apply attributes everywhere.
8940
8941         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
8942         etc.
8943
8944         (ApplyAttributes): Update accordingly.
8945
8946         We now apply interface attributes for all members too.
8947
8948 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
8949
8950         * class.cs (Indexer.Define); Correctly check if we are explicit
8951         implementation (instead of checking the Name for a ".", we
8952         directly look up if the InterfaceType was specified).
8953
8954         Delay the creation of the PropertyBuilder.
8955
8956         Only create the PropertyBuilder if we are not an explicit
8957         interface implementation.   This means that explicit interface
8958         implementation members do not participate in regular function
8959         lookups, and hence fixes another major ambiguity problem in
8960         overload resolution (that was the visible effect).
8961
8962         (DefineMethod): Return whether we are doing an interface
8963         implementation. 
8964
8965         * typemanager.cs: Temporary hack until we get attributes in
8966         interfaces (Ravi is working on that) and we get IndexerName
8967         support in interfaces.
8968
8969         * interface.cs: Register the indexers as properties.
8970
8971         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
8972         warning, I have verified that this is a bug in the .NET runtime
8973         (JavaScript suffers of the same problem).
8974
8975         * typemanager.cs (MemberLookup): When looking up members for
8976         interfaces, the parent of an interface is the implicit
8977         System.Object (so we succeed in searches of Object methods in an
8978         interface method invocation.  Example:  IEnumerable x;  x.ToString
8979         ()) 
8980
8981 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
8982
8983         * class.cs (Event): Events should also register if they do
8984         implement the methods that an interface requires.
8985
8986         * typemanager.cs (MemberLookup); use the new GetInterfaces
8987         method. 
8988
8989         (GetInterfaces): The code used to lookup interfaces for a type is
8990         used in more than one place, factor it here. 
8991
8992         * driver.cs: Track the errors at the bottom of the file, we kept
8993         on going.
8994
8995         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
8996         instance if the method we are calling is static!
8997
8998 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
8999
9000         * attribute.cs (ApplyAttributes): Make this function filter out
9001         the IndexerName attribute (as that attribute in reality is never
9002         applied) and return the string constant for the IndexerName
9003         attribute. 
9004
9005         * class.cs (TypeContainer.Emit): Validate that all the indexers
9006         have the same IndexerName attribute, and if so, set the
9007         DefaultName attribute on the class. 
9008
9009         * typemanager.cs: The return value might contain other stuff (not
9010         only methods).  For instance, consider a method with an "Item"
9011         property and an Item method.
9012
9013         * class.cs: If there is a problem with the parameter types,
9014         return. 
9015
9016 2002-05-24  Ravi Pratap  <ravi@ximian.com>
9017
9018         * ecore.cs (ImplicitConversionExists): Wrapper function which also
9019         looks at user defined conversion after making a call to 
9020         StandardConversionExists - we need this for overload resolution.
9021
9022         * expression.cs : Update accordingly the various method calls.
9023
9024         This fixes 2 bugs filed against implicit user defined conversions 
9025
9026 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
9027
9028         * statement.cs: Track the result of the assignment.
9029
9030 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
9031
9032         * expression.cs (MemberAccess): Improved error reporting for
9033         inaccessible members.
9034
9035 2002-05-22  Martin Baulig  <martin@gnome.org>
9036
9037         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
9038         itself with debugging support.
9039
9040 2002-05-22  Martin Baulig  <martin@gnome.org>
9041
9042         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
9043         Removed, this isn't needed anymore.
9044
9045 2002-05-20  Martin Baulig  <martin@gnome.org>
9046
9047         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
9048         be underlying type for an enum.
9049
9050 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
9051
9052         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
9053         that splits out the loading of just the core types.
9054
9055         * rootcontext.cs (ResolveCore): Split the struct resolution in
9056         two, so we can load the enumeration underlying types before any
9057         enums are used.
9058
9059         * expression.cs (Is): Bandaid until we fix properly Switch (see
9060         bug #24985 for details).
9061
9062         * typemanager.cs (ImplementsInterface): The hashtable will contain
9063         a null if there are no interfaces implemented.
9064
9065 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
9066
9067         * cs-parser.jay (indexer_declarator): It is fine to have array
9068         parameters
9069
9070 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9071
9072         * typemanager.cs: (RegisterBuilder): New function used to register
9073         TypeBuilders that implement interfaces.  Since
9074         TypeBuilder.GetInterfaces (as usual) does not work with lame
9075         Reflection.Emit. 
9076         (AddUserType): register interfaces.
9077
9078         (ImplementsInterface): Use the builder_to_ifaces hash if we are
9079         dealing with TypeBuilder.  Also, arrays are showing up as
9080         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
9081         methods can not be invoked on them!
9082
9083         * ecore.cs (ExplicitReferenceConversionExists): Made public.
9084         (ImplicitReferenceConversionExists): Split out from
9085         StandardConversionExists. 
9086
9087         * expression.cs (As): We were only implementing one of the three
9088         cases for the as operator.  We now implement them all.
9089         (Is): Implement the various other cases for Is as well.
9090
9091         * typemanager.cs (CACHE): New define used to control if we want or
9092         not the FindMembers cache.  Seems to have a negative impact on
9093         performance currently
9094
9095         (MemberLookup): Nested types have full acess to
9096         enclosing type members
9097
9098         Remove code that coped with instance/static returns for events, we
9099         now catch this in RealFindMembers.
9100
9101         (RealFindMembers): only perform static lookup if the instance
9102         lookup did not return a type or an event.  
9103
9104 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9105
9106         * assign.cs (CompoundAssign): We pass more semantic information
9107         now to Compound Assignments than we did before: now we have all
9108         the information at hand, and now we resolve the target *before* we
9109         do the expression expansion, which allows the "CacheValue" method
9110         to have the effect we intended (before, a [x] += 1 would generate
9111         two differen ArrayAccess expressions from the ElementAccess,
9112         during the resolution process).
9113
9114         (CompoundAssign.DoResolve): Resolve target and original_source here.
9115
9116 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
9117
9118         * expression.cs (ArrayAccess): dropped debugging information. 
9119
9120         * typemanager.cs: Small bug fix: I was always returning i_members,
9121         instead of one of i_members or s_members (depending on which had
9122         the content).
9123
9124         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
9125         method is invoked before any code generation takes place, and it
9126         is a mechanism to inform that the expression will be invoked more
9127         than once, and that the method should use temporary values to
9128         avoid having side effects
9129
9130         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
9131
9132         * ecore.cs (Expression.CacheTemporaries): Provide empty default
9133         implementation.
9134
9135         * expression.cs (Indirection, ArrayAccess): Add support for
9136         CacheTemporaries in these two bad boys. 
9137
9138         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
9139         ldobj or ldind_ref.  
9140         (StoreFromPtr): Handle stobj as well.
9141
9142         * expression.cs (UnaryMutator): Share more code.
9143
9144         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
9145         down: I was not tracking the Filter function as well, which
9146         was affecting the results of the cache.
9147
9148 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
9149
9150         * attribute.cs: Remove the hack to handle the CharSet property on
9151         StructLayouts. 
9152
9153 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
9154
9155         * attribute.cs (DoResolve): More uglyness, we now only try to
9156         resolve the attribute partially, to extract the CharSet
9157         information (only if we are a StructLayout attribute).  Otherwise 
9158
9159         (GetExtraTypeInfo): Add some code to conditionally kill in the
9160         future this.   I am more and more convinced that the .NET
9161         framework has special code to handle the attribute setting on
9162         certain elements.
9163
9164         * expression.cs (IsParamsMethodApplicable): Revert my previous
9165         foreach change here, it was wrong.
9166
9167 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
9168
9169         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
9170         (pp_expr): do not abort on unknown input, just return.
9171         (eval): abort if there are pending chars.
9172
9173         * attribute.cs (Attribute.Resolve): Positional parameters are
9174         optional.  Deal with that case.
9175
9176         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
9177         the Ansi/Unicode/Auto information for the type.
9178
9179         (TypeContainer.DefineType): instantiate the EmitContext here, as
9180         we will be using it during the type definition (to resolve
9181         attributes) and during the emit phase.
9182
9183         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
9184         to pull type information out of the attributes
9185
9186         (Attribute.Resolve): track the constructor builder, and allow for
9187         multiple invocations (structs and classes will use this).
9188
9189         * ecore.cs (MemberLookupFinal): new version with all the
9190         parameters customizable.
9191
9192         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
9193         constructors.  Return if the result value is null (as the error
9194         would have been flagged already by MemberLookupFinal)
9195
9196         Do not allow instances of abstract classes or interfaces to be
9197         created.
9198
9199         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
9200         We have to compare the assembly property here when dealing with
9201         FamANDAssem and Assembly access modifiers, because we might be
9202         creating an assembly from *modules* (that means that we are not
9203         getting TypeBuilders for types defined in other modules that are
9204         part of this assembly).
9205
9206         (Method.Emit): If the method is marked abstract and has a body,
9207         emit an error. 
9208
9209         (TypeContainer.DefineMembers): If both the defined member and the
9210         parent name match are methods, then do not emit any warnings: let
9211         the Method.Define routine take care of flagging warnings.  But if
9212         there is a mismatch (method overrides something else, or method is
9213         overriwritten by something, then emit warning).
9214
9215         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
9216         set to null, this means `do not check for the return type on the
9217         signature'. 
9218
9219         (Method.Define): set the return type for the method signature to
9220         null, so that we get methods with the same name and parameters and
9221         different return types.  This is used to flag warning 114 (you are
9222         hiding a method, and you probably want to use the new/override
9223         keywords instead).
9224
9225         * typemanager.cs (MemberLookup): Implemented proper access
9226         control, closing a long standing set of bug reports.  The problem
9227         was that the Framework only has two bits: Public and NonPublic,
9228         and NonPublic includes private and protected methods, but we need
9229         to enforce the FamANDAssem, FamOrAssem and Family. 
9230
9231 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
9232
9233         * statement.cs (GotoCase): Return true: Ammounts to giving up
9234         knowledge on whether we return or not, and letting the other case
9235         be responsible for it.
9236
9237 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
9238
9239         * driver.cs: Do not load directories for each file processed, only
9240         do it if there is a pattern.
9241
9242         * ecore.cs: Report readonly assigns here as well, as we might have
9243         been resolved only by MemberAccess.
9244
9245         (SimpleName.SimpleNameResolve): Also be useful for LValue
9246         resolution.   We need this to propagate assign to local readonly variables
9247
9248         * typemanager.cs: Use a ptrhashtable for the criteria, because we
9249         do not want to reuse potential criteria memory.
9250
9251         * class.cs (MyEventBuilder): Set reflected_type;
9252
9253         * ecore.cs (Constantify): Added support for constifying bools.
9254
9255         (RootContext.LookupType): Added a cache for values looked up in
9256         the declaration space.
9257
9258         * typemanager.cs (FindMembers): Now is a front-end to
9259         RealFindMembers, and provides a two-level hashtable-based cache to
9260         the request.  
9261
9262         15% performance improvement: from 22.5 to 19.2 seconds.
9263
9264         * expression.cs (IsParamsMethodApplicable): use foreach.
9265         (Invocation.DoResolve): ditto.
9266         (New.DoResolve): ditto.
9267         (ArrayCreation.DoResolve): ditto.
9268
9269         * ecore.cs (FindMostEncompassingType): use foreach.
9270
9271         * delegate.cs (NewDelegate.DoResolve): Use foreach
9272
9273         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
9274         (RemoveMethods): use foreach.
9275
9276         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
9277         nested foreach statements instead of for, and also break out of
9278         the inner loop once a match is found.
9279
9280         (Invocation.OverloadResolve): Use foreach, simplify the code. 
9281
9282 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
9283
9284         * cfold.cs (BinaryFold): During an enumeration evaluation context,
9285         we actually unwrap the expression to allow for extra information
9286         to be extracted. 
9287
9288         * expression.cs: Use Shr_Un on unsigned operations. 
9289
9290 2002-05-08  Ravi Pratap  <ravi@ximian.com>
9291
9292         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
9293         applicable operators was not being considered correctly. This closes
9294         the bug Miguel reported.
9295
9296 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
9297
9298         * attribute.cs: check that the type derives from System.Attribute
9299         and report the correct error in that case (moved the duplicate code to
9300         its own method, too).
9301
9302 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
9303
9304         * attribute.cs: lookup attribute type name as the spec says: first the
9305         bare attribute name and then name + "Attribute" (nant compiles with
9306         mcs after this fix).
9307
9308 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
9309
9310         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
9311         Because of the way we parse things, we should try to see if a
9312         UIntConstant can fit in an integer.
9313
9314 2002-05-07  Ravi Pratap  <ravi@ximian.com>
9315
9316         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
9317         when we are in an explicit context.
9318
9319         (ConvertReferenceExplicit): When converting from Iface type S to Class
9320         T make sure the rules are implemented as an OR.
9321
9322         * parameter.cs (ParameterType): Make it a property for now although the
9323         purpose really isn't anything immediate.
9324
9325         * expression.cs (Is*Applicable): Do better checking on the parameter type
9326         of a ref/out parameter. The ones from the system assemblies are already 
9327         marked with the correct type so we don't need to do any correction.
9328
9329         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
9330         the object type is standard too so include that.
9331
9332 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9333
9334         * ecore.cs (StandardConversionExists): Augment with missing code:
9335         deal with IntConstant, LongConstants and Enumerations.
9336
9337         * assign.cs: Report the error, instead of failing silently
9338
9339         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
9340         typecontainer that they are declared, because the
9341         typecontainer/namespace will have the list of using clauses that
9342         need to be applied.
9343
9344         Assembly Attributes were escaping the normal registration
9345         mechanism. 
9346
9347         (EmitCode): Apply attributes within an EmitContext that represents
9348         the container they were declared on.
9349
9350         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
9351
9352 2002-05-06  Ravi Pratap  <ravi@ximian.com>
9353
9354         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
9355         Revamp completely - make much cleaner as we now operate only
9356         on a set of Types.
9357
9358         (FindMostSpecificSource, FindMostSpecificTarget): New methods
9359         to implement the logic detailed in the spec more correctly.
9360
9361         (UserDefinedConversion): Update accordingly.
9362
9363 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9364
9365         * statement.cs: Return flow analysis information up.
9366
9367         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
9368         and the default.
9369
9370         (token): Do not consume an extra character before calling
9371         decimal_digits.
9372
9373 2002-05-06  Piers Haken <piersh@friskit.com>
9374
9375         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
9376
9377 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9378
9379         * class.cs (Constructor.Emit): Set the IsStatic flag in the
9380         EmitContext during the instance constructor initializer
9381         resolution, to stop access to instance variables.
9382
9383         This is mandated by the spec, last paragraph of the `constructor
9384         initializers' section. 
9385
9386 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
9387
9388         * cs-parser.jay, class.cs (Accessor): new class used to represent
9389         an accessor (get or set).  In the past we used `null' to represent
9390         a missing accessor.  But this is ambiguous because there was no
9391         way to tell in abstract indexers/properties if one of them was
9392         specified.
9393
9394         Now there is a way of addressing that.
9395
9396         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
9397         instead of FindMembers.
9398
9399         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
9400         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
9401
9402         * attribute.cs: Treat indexers and properties as the same in terms
9403         of applying attributes
9404
9405         * ecore.cs (FindMostEncompassedType): Use statically initialized
9406         EmptyExpressions()s like we do elsewhere to avoid creating useless
9407         objects (and we take this out of the tight loop).
9408
9409         (GetConversionOperators): Move the code to extract the actual
9410         operators to a separate routine to clean things up.
9411
9412 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
9413
9414         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
9415         events are always registered FieldBuilders.
9416
9417         * class.cs (FieldBase): New class shared by Fields 
9418
9419         * delegate.cs: If we are a toplevel delegate, use our full name.
9420         If we are a nested delegate, then only use our tail name.
9421
9422 2002-05-02  Ravi Pratap  <ravi@ximian.com>
9423
9424         * expression.cs (IsApplicable): Ensure that we add the "&" to
9425         ref/out types before comparing it with the type of the argument.
9426
9427         (IsParamsMethodApplicable): Ditto.
9428
9429         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
9430         silly me ;-)
9431
9432         * delegate.cs : Handle the case when we have more than one applicable
9433         method. Flag an error only when we finish checking all.
9434
9435 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
9436
9437         * expression.cs: Add support for boolean static initializers.
9438
9439 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
9440
9441         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
9442
9443         * parameter.cs (ComputeParameterTypes,
9444         ComputeAndDefineParameterTypes): Better error handling: now we
9445         clear the `types' cache if we fail during any of the type lookups.
9446         We also return the status code correctly to our caller
9447
9448         * delegate.cs: If we fail to define a delegate, abort the extra
9449         steps. 
9450
9451         * expression.cs (Binary.ResolveOperator): for
9452         operator==(object,object) and operator !=(object, object) we also
9453         have to verify that there is an implicit conversion from one to
9454         the other.
9455
9456         (ArrayAccess.DoResolve): Array Access can operate on
9457         non-variables. 
9458
9459 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
9460
9461         * assign.cs (CompoundAssign): A new class used as a "flag" that
9462         the assignment actually is happening as part of a compound
9463         assignment operator.
9464
9465         During compound assignment, a few new rules exist to enable things
9466         like:
9467
9468         byte b |= 1 + 2
9469
9470         From the spec:
9471
9472         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
9473         to the type of x) if y is implicitly convertible to the type of x,
9474         and the operator is a builtin operator and the return type of the
9475         operator is explicitly convertible to the type of x. 
9476
9477         * rootcontext.cs: Reset warning level to 2.  4 catches various
9478         "interesting" features in mcs, we must clean this up at some
9479         point, but currently am trying to kill other bugs ;-)
9480
9481         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
9482         in container classes as well.  
9483
9484         * expression.cs (Binary.ResolveOperator): Handle string case
9485         before anything else (as operator overloading does emit an error
9486         before doing anything else).
9487
9488         This code could go away when we move to a table driven model, but
9489         i could not come up with a good plan last night.
9490
9491 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
9492
9493         * typemanager.cs (CSharpName): reimplementation using regex.
9494         * class.cs: added null check for fields in Emit
9495         * rootcontext.cs: set warninglevel to 4
9496
9497 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
9498
9499         * typemanager.cs (CSharpName): reimplemented with Lupus
9500         suggestion.
9501
9502 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
9503
9504         * statement.cs (If): correclty implement Resolve, because we were
9505         not catching sem errors in there.  The same process is needed
9506         everywhere else. 
9507         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
9508
9509
9510         (Statement.Warning_DeadCodeFound): Factorize code.
9511         (While): Report dead code here too.
9512
9513         (Statement): Added Resolve virtual method to allow
9514         for resolution split from the emit code.
9515
9516 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
9517
9518         * statement.cs (EmitBoolExpression): No longer try to resolve the
9519         expression here.    
9520         (MakeBoolean): New utility function that resolve, implicitly
9521         converts to boolean and tags the expression. 
9522
9523
9524         (If, Do): Implement dead code elimination.
9525         (While): Implement loop inversion
9526
9527         (Do, While, For, If): Resolve the expression prior to calling our
9528         code generation.
9529
9530 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
9531
9532         * class.cs:
9533           - added method Report28 (warning: program has more than one entry point)
9534           - added method IsEntryPoint, implements paragraph 10.1 of the spec
9535           - modified method Method.Define, the part at the end of the method
9536
9537         * rootcontext.cs: added static public Location EntryPointLocation;
9538           
9539         * ../errors/cs0028.cs : Add test case for the above warning.              
9540
9541         * typemanager.cs:
9542           - modified method CSharpName to allow arrays of primitive type to
9543             be printed nicely (e.g. instead of System.Int32[][] it now prints
9544             int[][])
9545           - added method CSharpSignature: returns the signature of a method
9546             in string format to be used in reporting errors, warnings, etc.
9547
9548         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
9549         with String.Empty.
9550
9551 2002-04-26  Ravi Pratap  <ravi@ximian.com>
9552
9553         * delegate.cs (Define): Fix extremely silly bug where I was
9554         setting the type of the 'object' parameter of the BeginInvoke
9555         method to System.IAsyncResult instead of System.Object ;-)
9556
9557 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
9558
9559         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
9560         here. 
9561
9562         (Constructor.Emit): return if we fail to initialize the
9563         constructor.  Another door closed!  
9564
9565         * expression.cs (New.DoResolve): Improve error message (from -6 to
9566         1501).  Use DeclaredOnly lookup to find the exact constructor.
9567
9568         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
9569         loop.  This is useful.
9570
9571         * cs-parser.jay: Adjust the default parameters so that destructors
9572         have the proper signature.
9573
9574 2002-04-26  Martin Baulig  <martin@gnome.org>
9575
9576         * driver.cs (LoadAssembly): If `assembly' contains any characters
9577         which are only valid in path names and not in assembly names
9578         (currently slash, backslash and point), use Assembly.LoadFrom ()
9579         instead of Assembly.Load () on the `assembly' (before iteration
9580         over the link_paths).
9581
9582 2002-04-26  Martin Baulig  <martin@gnome.org>
9583
9584         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
9585
9586 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
9587
9588         * class.cs (Property): use the new typemanager.MemberLookup
9589
9590         (TypeContainer.MemberLookup): Implement using the
9591         TypeManager.MemberLookup now. 
9592
9593         * typemanager.cs: Make MemberLookup a function of the TypeManager,
9594         and return MemberInfos, so that these can be used without an
9595         EmitContext (what we had before).
9596
9597 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
9598
9599         * expression.cs: Fix the case where the argument to params if the
9600         type of the params.  I omitted handling this before.   Fixed
9601
9602 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9603
9604         * driver.cs: Call BootCorlib_PopulateCoreType
9605
9606         * class.cs (Property.CheckBase): Check for properties only, not
9607         for all members. 
9608
9609         * interface.cs: Temporary hack: try/catch around the
9610         CustomAttributeBuilder, because I am getting an exception that I
9611         do not understand.
9612
9613         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
9614         types whose definitions are required to be there (attributes are
9615         defined before standard types).
9616
9617         Compute definitions as we boot the various types, as they are used
9618         immediately (value_type class will need object_type, but if we do
9619         not initialize object_type, we will pass a null, which will let
9620         the runtime pick the System.Object from the existing corlib, which
9621         is not what we want).
9622
9623 2002-04-22  Patrik Torstensson <totte@labs2.com>
9624
9625         * cs-tokenizer.cs: fixed a number of trim() issues.
9626
9627 2002-04-22  Ravi Pratap  <ravi@ximian.com>
9628
9629         * expression.cs (Argument.Type): Ensure that we return the correct
9630         type when we have out or ref parameters [in which case we 
9631         append a "&"].
9632
9633 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9634
9635         * class.cs (Property, Indexer): Allow extern modifier in there. 
9636
9637         * typemanager.cs (InitBaseTypes): Initializes object_type and
9638         value_type, since those will be used early on during the bootstrap
9639         process to compile corlib.
9640
9641         (InitCoreTypes): Move code from here to InitBaseTypes.
9642
9643 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
9644
9645         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
9646         single-dimension arrays as using the ldlen opcode.  
9647
9648         Daniel Lewis discovered this optimization.  
9649
9650         * typemanager.cs: Add signature for System.Array::get_Length
9651
9652 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9653
9654         * statement.cs: report the error when the foreach does not apply to an
9655         array nor a collection.
9656
9657 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
9658
9659         * expression.cs: Add implicit conversions to the operator ~.
9660
9661         * constant.cs (DecimalConstant.Emit): Emit decimal value.
9662
9663         * typemanager.cs: Locate the decimal constructor.
9664
9665 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9666
9667         * attribute.cs: use the new property of TypeOf.
9668         * expression.cs: added 'get' property around typearg.
9669
9670         These changes fix a build breaker reported by NickD. Is this the
9671         correct way to fix?  If not, please, revert my changes and make it
9672         work :-).
9673
9674 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
9675
9676         * attribute.cs: Add support for typeof in attribute invocations.
9677         I am not sure that this is right though.
9678
9679 2002-04-14  Duncan Mak  <duncan@ximian.com>
9680
9681         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
9682         Binary.Operator.Division case.
9683
9684 2002-04-13  Ravi Pratap  <ravi@ximian.com>
9685
9686         * class.cs (DefineType): Ensure that we do a proper check on
9687         attribute types and also register it with the TypeManager.
9688
9689         (TypeContainer.Targets): The default for attribute types is
9690         AttributeTargets.All.
9691
9692         * attribute.cs (ApplyAttributes): Registering the attribute type
9693         is done elsewhere, not when we discover we have a Usage attribute.
9694
9695 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9696
9697         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
9698         and get rid of is_delegate parameter.
9699
9700         * everywhere : update.
9701
9702 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9703
9704         * cs-parser.jay (compilation_unit): Revamp completely to use
9705         some new ideas that I got from Rhys' grammar to solve the problems
9706         with assembly level attributes.
9707
9708         (outer_declaration): New grammar production.
9709
9710         (attribute_sections): Add.
9711
9712         (opt_attributes): Base on attribute_sections
9713
9714         (namespace_declaration): Allow opt_attributes to tackle the case
9715         when we have assembly level attributes - we are clever in this
9716         regard now ;-)
9717
9718         * attribute.cs (ApplyAttributes): Do not worry about assembly 
9719         attributes in the non-global context.
9720
9721         * rootcontext.cs (AddGlobalAttributes): Go back to using this
9722         instead of SetGlobalAttributes.
9723
9724         * class.cs, rootcontext.cs : Ensure we define and generate 
9725         attribute types before anything else.
9726
9727         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
9728         and flag the new error -20 for the case when the attribute type
9729         does not have valid targets specified. csc does not catch this.
9730
9731         * ../errors/errors.txt : update for error # -20
9732
9733 2002-04-11  Ravi Pratap  <ravi@ximian.com>
9734
9735         * support.cs (InternalParameters.ParameterModifier): Do some null
9736         checking and return sane values.
9737
9738         * class.cs (Method.Define): If we are a PInvoke method, ensure
9739         that we are static and extern. Report error # 601
9740
9741         * ../errors/cs0601.cs : Add test case for the above error.
9742
9743 2002-04-07  Ravi Pratap  <ravi@ximian.com>
9744
9745         * rootcontext.cs (attribute_types): We need to keep type of
9746         all attribute types separately and emit code for them first.
9747
9748         (RegisterAttribute) : Implement.
9749
9750         * class.cs (DefineType): Check if the current Type is a custom
9751         attribute type and register it accordingly.
9752
9753         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
9754         adding the first attribute twice and rename to
9755
9756         (SetGlobalAttributes): this.
9757
9758         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
9759         lookups.
9760
9761         * attribute.cs (ApplyAttributes): Take an additional argument telling us
9762         if we are processing global arguments. Hmm, I am unsure of this.
9763
9764 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9765
9766         * expression.cs: added static array of strings to avoid calling
9767         Enum.ToString () for Operator in Binary. Significant recover of
9768         performance.
9769
9770 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
9771
9772         * class.cs (FindMembers): Allow the Builders of the various
9773         members to be null.  If they are skip them.  This only happens
9774         during the PInvoke declaration.
9775
9776 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
9777
9778         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
9779         failure, so we do not keep going afterwards.
9780
9781         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
9782         wanted to pass `false' as the `is_delegate' argument.  If this is
9783         the case, why not use delegate_type == null to mean `is_delegate =
9784         false' and anything else as is_delegate = true.
9785
9786 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
9787
9788         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
9789         code for the section, not the beginning of the tests.
9790
9791 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
9792
9793         * cfold.cs: Handle operator + (Enum x, Underlying x) 
9794
9795         * expression.cs (Binary): same.  Warn about errors where we have
9796         Enum/Enum in operator + as well.
9797
9798 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
9799
9800         * statement.cs:
9801                 - added support for switch(bool)
9802                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
9803                 - add TableSwitchEmit() to handle table-based switch statements
9804
9805 2002-04-05  Ravi Pratap  <ravi@ximian.com>
9806
9807         * expression.cs (Invocation.OverloadResolve): Factor out code which
9808         does parameter compatibility checking with arguments so that we can 
9809         re-use the code even from Delegate.VerifyApplicability
9810
9811         (VerifyArgumentsCompat): Move above code here.
9812
9813         * delegate.cs (VerifyApplicability): Get rid of duplicate code
9814         and instead make a call to the above method.
9815
9816 2002-03-31  Ravi Pratap  <ravi@ximian.com>
9817
9818         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
9819         We use it to keep track of classes which are attribute types.
9820
9821 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
9822
9823         * delegate.cs (Delegate.Define): Correctly define the types in the
9824         presence of fixed and array parameters.
9825
9826         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
9827         doing FindMembers.
9828
9829         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
9830         include NonPublic after the first iteration.
9831
9832         * class.cs (Indexer.CheckBase): Only check if both parents are
9833         non-null. 
9834
9835         * cs-parser.jay (accessor_body): If empty, set to null.
9836
9837         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
9838         same code path here to resolve constants names that we did have in
9839         MemberAccess.DoResolve.  There is too much code duplicated here.
9840
9841 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
9842
9843         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
9844
9845         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
9846         to MakeUnionSet.
9847
9848         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
9849         tokens, numbers and strings.
9850
9851         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
9852         parenthesis.
9853
9854         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
9855         asyncronous parameters and the regular parameters.  
9856
9857         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
9858         specify the target directory.
9859
9860         * expression.cs: (This.DoResolve): Simplify
9861         (As.Emit): Optimize, do not generate IsInst if the expression is
9862         always of the given type.
9863
9864         (Is.DoResolve): Bug fix, we were reporting both always/never for
9865         the is expression.
9866
9867         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
9868         creating too many unnecessary arrays.
9869
9870 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
9871
9872         * class.cs (EmitFieldInitializer): Use Assign expression to assign
9873         fields instead of rolling our own initializer.   Takes care of all
9874         implicit conversions, and drops unnecessary static checks/argument.
9875
9876 2002-03-31  Dick Porter  <dick@ximian.com>
9877
9878         * driver.cs: use the GetDirectories() return values properly, and
9879         use "/" as path separator.
9880
9881 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
9882
9883         * expression.cs (Unary): Optimize - - expr into expr.
9884         (Binary): Optimize a + (-b) into a -b.
9885
9886         * codegen.cs (CodeGen): Made all methods static.
9887
9888 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
9889
9890         * rootcontext.cs: 
9891
9892         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
9893         TypeBuilder property.
9894
9895         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
9896         instead. 
9897
9898         * tree.cs: Removed the various RecordXXXX, and replaced with a
9899         single RecordDecl.  Removed all the accessor methods, and just
9900         left a single access point Type 
9901
9902         * enum.cs: Rename DefineEnum to DefineType.
9903
9904         * decl.cs: New abstract method `DefineType' used to unify the
9905         Defines for Enumerations, Interfaces, TypeContainers and
9906         Delegates.
9907
9908         (FindType): Moved LookupInterfaceOrClass here.  Moved the
9909         LookupBaseClasses method that used to live in class.cs and
9910         interface.cs here, and renamed to FindType.
9911
9912         * delegate.cs: Implement DefineType.  Take advantage of the
9913         refactored pattern for locating the parent builder without taking
9914         the parent_builder argument (which we know does not work if we are
9915         nested, and triggering a toplevel definition).
9916
9917 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9918
9919         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
9920         accessibility of a member has changed during override and report
9921         an error if so.
9922
9923         * class.cs (Method.Define, Property.Define): Only complain on
9924         overrides if the method is private, any other accessibility is
9925         fine (and since we just checked the permission is the same, we are
9926         good to go).
9927
9928         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
9929         and elif are processed always.  The other pre-processing
9930         directives are only processed if we are "taking" the path
9931
9932 2002-03-29  Martin Baulig  <martin@gnome.org>
9933
9934         * class.cs (Method.Emit): Only emit symbolic debugging info if the
9935         current location is not Null.
9936
9937         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
9938         a separate method so we can profile it.
9939
9940         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
9941         `span.Seconds' are just seconds, but no minutes or hours.
9942         (MainDriver): Profile the CodeGen.SaveSymbols calls.
9943
9944 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9945
9946         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
9947         Remove the gratuitous set of Final:
9948
9949                                 // If an interface implementation, then we can set Final.
9950                                 if (((flags & MethodAttributes.Abstract) == 0) &&
9951                                     implementing.DeclaringType.IsInterface)
9952                                         flags |= MethodAttributes.Final;
9953
9954         I do not know what I was smoking when I used that.
9955
9956
9957         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
9958         step into fixing the name resolution issues for delegates and
9959         unifying the toplevel name resolution.
9960
9961 2002-03-28  Martin Baulig  <martin@gnome.org>
9962
9963         * class.cs (Method.Emit): If we have a symbol writer, call its
9964         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
9965         tell it about the current method.
9966
9967         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
9968         writer that we're going to emit the first byte of IL code for a new
9969         statement (a new source line).
9970         (EmitContext.EmitTopBlock): If we have a symbol writer, call
9971         EmitContext.Mark() before emitting any code.
9972
9973         * location.cs (SymbolDocument): Return null when we're Null.
9974
9975         * statement.cs (Statement): Moved the `Location loc' variable here.
9976         (Statement.EmitBoolExpression): If we have a symbol writer, call
9977         ec.Mark() before emitting any code to tell it that we're at the
9978         beginning of a new statement.
9979         (StatementExpression): Added `Location' argument to the constructor.
9980         (Block): Added public readonly variable `StartLocation' and public
9981         variable `EndLocation'.  The latter is to be set using SetEndLocation().
9982         (Block): Added constructor which takes a start and end location.
9983         (Block.SetEndLocation): New method. This sets the end location.
9984         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
9985         local variables we create.
9986         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
9987         each statement and do also mark the begin and end of the block.
9988
9989         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
9990         tell it the current lexer.Location, use Location.Null for the end of the
9991         block.
9992         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
9993         current block, set its end location using SetEndLocation().
9994         (statement_expression): StatementExpression constructor now takes the
9995         lexer.Location as additional argument.
9996         (for_statement, declare_local_variables): Likewise.
9997         (declare_local_variables): When creating a new implicit block, use the
9998         new Block constructor and pass it the lexer.Location.
9999
10000 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10001
10002         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
10003         members also on the parent interfaces recursively.
10004
10005 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
10006
10007         * report.cs: Use new formats, since Gonzalo finished the missing
10008         bits. 
10009
10010         * expression.cs (Binary.ResolveOperator): added missing operator|
10011         operator& and operator^ for bool/bool.
10012
10013         * cs-parser.jay: CheckDef now takes a Location argument that is
10014         used to report errors more precisly (instead of reporting the end
10015         of a definition, we try to track something which is a lot closer
10016         to the source of the problem).
10017
10018         * cs-tokenizer.cs: Track global token use, so we can properly flag
10019         the use of #define/#undef after the first token has been seen.
10020
10021         Also, rename the reportXXXX to Error_DescriptiveName
10022
10023         * decl.cs (DeclSpace.IsTopLevel): Move property here from
10024         TypeContainer, so that Enum and Interface can use this too.
10025
10026         * class.cs (TypeContainer.LookupInterfaceOrClass,
10027         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
10028         `builder' argument.  Typically this was used to pass the parent
10029         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
10030         the definition).  
10031
10032         The problem is that a nested class could trigger the definition of
10033         a toplevel class, and the builder would be obviously wrong in that
10034         case. 
10035
10036         So we drop this argument, and we compute dynamically the
10037         TypeBuilder/ModuleBuilder (the correct information was available
10038         to us anyways from DeclSpace.Parent)
10039
10040         * interface.cs (Interface.DefineInterface): Drop builder
10041         parameter cleanup like class.cs
10042
10043         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
10044         like class.cs
10045
10046         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
10047         values. 
10048
10049         (Try.Emit): Propagate the returns value from the statement.
10050
10051         (Return.Emit): Even if we are leavning 
10052
10053         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
10054
10055         * modifiers.cs: Fix the computation of MethodAttributes flags.
10056
10057 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
10058
10059         * driver.cs: allow compilation of files that start with '/'.
10060         Add a default case when checking the argument of --target.
10061
10062 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
10063
10064         * interface.cs: Implement the same search algorithm for types in
10065         the interface code.
10066
10067         * delegate.cs: Do not allow multiple definition.
10068
10069         * Recovered ChangeLog that got accidentally amputated
10070
10071         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
10072
10073         * rootcontext.cs: Load manually enum to allow core classes to
10074         contain enumerations.
10075
10076         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
10077         Update to new static methods in TypeManager.
10078
10079         * typemanager.cs (GetMethod, GetConstructor): Use our
10080         implementation of FindMembers to find the members, since during
10081         corlib compilation, the types are TypeBuilders and GetMethod and
10082         GetConstructor do not work.
10083
10084         Make all methods in TypeManager static.
10085
10086         (InitCodeHelpers): Split the functionality from
10087         the InitCodeTypes function.
10088
10089         * driver.cs: Call InitCodeHelpers after we have populated the
10090         types. 
10091
10092         * cs-parser.jay (delegate_declaration): we did not used to compute
10093         the delegate name correctly for void delegates.
10094
10095 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
10096
10097         * rootcontext.cs (RootContext): Init the interface_resolve_order
10098         and type_container_resolve_order always.
10099
10100         (ResolveCore, BootstrapCorlib_ResolveClass,
10101         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
10102         compiler when compiling with --nostdlib
10103
10104         * class.cs (TypeContainer.DefineType): Check that our parent is
10105         not null.  This test is most important when we are bootstraping
10106         the core types.
10107
10108         * codegen.cs: Split out the symbol writing code.
10109
10110 2002-03-25  Martin Baulig  <martin@gnome.org>
10111
10112         * driver.cs (-g): Made -g an alias for --debug.
10113
10114 2002-03-24  Martin Baulig  <martin@gnome.org>
10115
10116         * codegen.cs (SymbolWriter): New public variable. Returns the
10117         current symbol writer.
10118         (CodeGen): Added `bool want_debugging_support' argument to the
10119          constructor. If true, tell the ModuleBuild that we want debugging
10120         support and ask it for the ISymbolWriter.
10121         (Save): If we have a symbol writer, call it's Close() method after
10122         saving the assembly.
10123
10124         * driver.c (--debug): New command line argument to create a
10125         debugger information file.
10126
10127         * location.cs (SymbolDocument): New public property. Returns an
10128         ISymbolDocumentWriter object for the current source file or null
10129         if we don't have a symbol writer.
10130
10131 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
10132
10133         * driver.cs (LoadAssembly): Correctly return when all the paths
10134         have been tried and not before.
10135
10136         * statement.cs (Switch.Emit): return the actual coverage for this
10137         statement (returns/not-returns)
10138
10139         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
10140         switch of the statement if we are the last switch section.  That
10141         kills two problems: try/catch problems (we used to emit an empty
10142         nop at the end) and switch statements where all branches would
10143         return. 
10144
10145 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
10146
10147         * driver.cs: Add default assemblies (the equivalent to the
10148         Microsoft CSC.RSP file)
10149
10150         * cs-tokenizer.cs: When updating `cols and setting it to zero,
10151         also update tokens_seen and set it to false.
10152
10153         * driver.cs: Implement --recurse for Mike.
10154
10155         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
10156         correctly splitting out the paths.
10157
10158 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
10159
10160         * interface.cs (Interface.PopulateProperty): Instead of using
10161         `parent' as the declaration space for the set parameters, use
10162         `this' 
10163
10164         * support.cs (InternalParameters): InternalParameters constructor
10165         takes a DeclSpace instead of a TypeContainer.
10166
10167         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
10168         types are being initialized, load the address of it before calling
10169         the function.  
10170
10171         (New): Provide a mechanism to disable the generation of local
10172         value type temporaries when the caller will be providing us with
10173         an address to store it.
10174
10175         (ArrayCreation.EmitDynamicInitializers): Use it.
10176
10177 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
10178
10179         * expression.cs (Invocation.EmitArguments): Only probe for array
10180         property if there is more than one argument.  Sorry about that.
10181
10182         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
10183         empty param arrays.
10184
10185         * class.cs (Method.LabelParameters): Fix incorrect code path that
10186         prevented the `ParamArrayAttribute' from being applied to the
10187         params attribute.
10188
10189 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
10190
10191         * support.cs (ReflectionParameters): Correctly compute whether the
10192         last argument is a params array.  Fixes the problem with
10193         string.Split ('a')
10194
10195         * typemanager.cs: Make the assemblies array always be non-null
10196         (empty, but non-null)
10197
10198         * tree.cs (RecordDecl): New function that abstracts the recording
10199         of names.  This reports error 101, and provides a pointer to the
10200         previous declaration.  Fixes a crash in the compiler.
10201
10202         * cs-parser.jay (constructor_declaration): Update to new grammar,
10203         and provide a constructor_body that can be empty.
10204
10205 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
10206
10207         * driver.cs: Add support for --resources.
10208
10209         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
10210         Make all types for the various array helper methods be integer.
10211
10212         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
10213         CheckState to ConvCast.
10214
10215         (ConvCast): Now it takes a `checked' state argument, to avoid
10216         depending on the emit context for the conversion, and just using
10217         the resolve time setting.
10218
10219         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
10220         instead of Invocation.EmitArguments.  We do not emit the original
10221         arguments, instead we emit those which have been converted to
10222         unsigned int expressions.
10223
10224         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
10225
10226         * codegen.cs: ditto.
10227
10228         * expression.cs (LocalVariableReference): Drop the use of the
10229         Store function that depended on the variable index.
10230
10231         * statement.cs (VariableInfo): Drop the `Idx' property from this
10232         class, as this is not taking into account the indexes for
10233         temporaries tat we generate during the execution, getting the
10234         indexes wrong.
10235
10236         * class.cs: First emit class initializers, then call the parent
10237         constructor. 
10238
10239         * expression.cs (Binary): Fix opcode emision.
10240         (UnaryMutator.EmitCode): Support checked code generation
10241
10242         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
10243         matches for events for both the Static and Instance scans,
10244         pointing to the same element.   Fix that.
10245
10246 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
10247
10248         * rootcontext.cs (ResolveTree): Always set the
10249         interface_resolve_order, because nested interfaces will be calling
10250         into us.
10251
10252         * class.cs (GetInterfaceOrClass): Track the same resolution
10253         process used by TypeManager.LookupType.  This fixes the nested
10254         type lookups in class declarations (separate path from
10255         LookupType). 
10256
10257         (TypeContainer.DefineType): Also define nested interfaces.
10258         (TypeContainer.RegisterOrder): New public function used to
10259         register the order in which child interfaces need to be closed.
10260
10261         Nested interfaces need to be closed after their parents have been
10262         created. 
10263
10264         * interface.cs (InterfaceAttr): Put all the logic for computing
10265         the interface attribute here. 
10266
10267         (DefineInterface): Register our interface order with the
10268         RootContext or with the TypeContainer depending on the case.
10269
10270 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10271
10272         * cs-parser.jay: rework foreach statement to work with the new
10273         changes to the policy on SimpleNames.
10274
10275         * report.cs: support Stacktrace on warnings as well.
10276
10277         * makefile: drop --unsafe and /unsafe from the compile.
10278
10279 2002-03-13  Ravi Pratap  <ravi@ximian.com>
10280
10281         * ecore.cs (StandardConversionExists): Modify to take an Expression
10282         as the first parameter. Ensure we do null -> reference type conversion
10283         checking.
10284
10285         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
10286         temporary Expression objects.
10287
10288 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
10289
10290         * interface.cs: workaround bug in method overloading resolution
10291         (there is already a bugzilla bug for it).
10292
10293 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10294
10295         We could also solve this problem by having a separate path for
10296         performing type lookups, instead of DoResolve, we could have a
10297         ResolveType entry point, and only participating pieces of the
10298         production (simplename, deref, array) would implement this. 
10299
10300         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
10301         signal SimpleName to only resolve type names and not attempt to
10302         resolve anything else.
10303
10304         * expression.cs (Cast): Set the flag.
10305
10306         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
10307
10308         * class.cs: Only report 108 if there is no `new' modifier.
10309
10310         * cs-parser.jay: rework foreach statement to work with the new
10311         changes to the policy on SimpleNames.
10312         
10313         * report.cs: support Stacktrace on warnings as well.
10314
10315         * makefile: drop --unsafe and /unsafe from the compile.
10316
10317 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
10318
10319         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10320         lookups here, instead of doing that at parse time.  This means
10321         that our grammar will not introduce `LocalVariableReferences' as
10322         expressions at this point.  That solves the problem of code like
10323         this:
10324
10325         class X {
10326            static void Main ()
10327            { int X = 1;
10328             { X x = null }}}
10329
10330         This is only half the fix.  The full fix requires parameters to
10331         also be handled in this way.
10332
10333         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
10334         makes the use more obvious of the DeclSpace.  The
10335         ec.TypeContainer.TypeBuilder is now only used to pull the
10336         TypeBuilder for it.
10337
10338         My theory is that I can get rid of the TypeBuilder completely from
10339         the EmitContext, and have typecasts where it is used (from
10340         DeclSpace to where it matters).  
10341
10342         The only pending problem is that the code that implements Aliases
10343         is on TypeContainer, and probably should go in DeclSpace.
10344
10345         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10346         lookups here, instead of doing that at parse time.  This means
10347         that our grammar will not introduce `LocalVariableReferences' as
10348         expressions at this point.  That solves the problem of code like
10349         this:
10350
10351         class X {
10352            static void Main ()
10353            { int X = 1;
10354             { X x = null }}}
10355
10356         This is only half the fix.  The full fix requires parameters to
10357         also be handled in this way.
10358
10359         * class.cs (Property.DefineMethod): When implementing an interface
10360         method, set newslot, when implementing an abstract method, do not
10361         set the flag (before we tried never setting it, or always setting
10362         it, which is the difference).
10363         (Indexer.DefineMethod): same.
10364         (Method.DefineMethod): same.
10365
10366         * ecore.cs: Only set the status used flag if we get back a Field.
10367
10368         * attribute.cs: Temporary hack, so Paolo can keep working.
10369
10370 2002-03-08  Ravi Pratap  <ravi@ximian.com>
10371
10372         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
10373         the unmanaged type in the case we have a MarshalAs attribute.
10374
10375         (Resolve): Handle the case when we are parsing the special MarshalAs
10376         attribute [we need to store the unmanaged type to use later]
10377
10378         * typemanager.cs (marshal_as_attr_type): Built in type for the 
10379         MarshalAs Attribute.
10380
10381         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
10382         on parameters and accordingly set the marshalling info.
10383
10384 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
10385
10386         * class.cs: Optimizing slightly by removing redundant code after
10387         we switched to the `NoTypes' return value.
10388         (Property.DefineMethod): use NoTypes here too.
10389
10390         This fixes the bug I introduced in my last batch of changes.
10391
10392 2002-03-05  Ravi Pratap  <ravi@ximian.com>
10393
10394         * tree.cs (RecordEnum): Add. We now keep track of enums too.
10395
10396         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
10397         Enums since those are types too. 
10398
10399         * cs-parser.jay (enum_declaration): Record enums as we parse them.
10400
10401         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
10402         thanks to a call during the lookup process.
10403
10404 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
10405
10406         * statement.cs (Foreach): Lots of work to accomodate a particular
10407         kind of foreach statement that I had not kept in mind.  It is
10408         possible to have foreachs on classes that provide a GetEnumerator
10409         method that return objects that implement the "pattern" for using
10410         a foreach, there is no need to support GetEnumerator
10411         specifically. 
10412
10413         This is needed to compile nant.
10414
10415         * decl.cs: Only report 114 if the member is not `Finalize' and if
10416         the warning level is at least 2.
10417
10418         * class.cs: Moved the compare function from Method to
10419         MethodSignature. 
10420
10421         (MethodSignature.InheritableMemberSignatureCompare): Add new
10422         filter function that is used to extract inheritable methods from a
10423         class. 
10424
10425         (Method.Define): Use the new `inheritable_method_signature_filter'
10426         delegate
10427
10428         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
10429         command. 
10430
10431 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
10432
10433         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
10434
10435         * cs-parser.jay: Add opt_semicolon to the interface declaration.
10436
10437         * expression.cs: Pass location information to
10438         ConvertImplicitStandard. 
10439
10440         * class.cs: Added debugging code to track return values from
10441         interfaces. 
10442
10443 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
10444
10445         * expression.cs (Is.DoResolve): If either side of the `is' is an
10446         interface, do not flag the warning.
10447
10448         * ecore.cs (ImplicitReferenceConversion): We need a separate test
10449         for interfaces
10450
10451         * report.cs: Allow for --fatal to be used with --probe.
10452
10453         * typemanager.cs (NoTypes): Move the definition for the empty Type
10454         array here. 
10455
10456         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
10457         properties. 
10458         (TypeContainer.DefineProxy): New function used to proxy to parent
10459         implementations when implementing interfaces.
10460         (TypeContainer.ParentImplements): used to lookup if our parent
10461         implements a public function that is required by an interface.
10462         (TypeContainer.VerifyPendingMethods): Hook this up.
10463
10464         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
10465         `modules' and `assemblies' arraylists into arrays.  We only grow
10466         these are the very early start up of the program, so this improves
10467         the speedof LookupType (nicely measured).
10468
10469         * expression.cs (MakeByteBlob): Replaced unsafe code with
10470         BitConverter, as suggested by Paolo.
10471
10472         * cfold.cs (ConstantFold.Binary): Special case: perform constant
10473         folding of string concatenation, but if either side is a string,
10474         and the other is not, then return null, and let the runtime use
10475         the concatenation on the string plus the object (using
10476         `Object.ToString'). 
10477
10478 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
10479
10480         Constant Folding has been implemented now.
10481
10482         * expression.cs (Unary.Reduce): Do not throw an exception, catch
10483         the error instead on types that are not supported in one's
10484         complement. 
10485
10486         * constant.cs (Constant and all children): New set of functions to
10487         perform implict and explicit conversions.
10488
10489         * ecore.cs (EnumConstant): Implement the new functions to perform
10490         conversion by proxying to the child expression.
10491
10492         * codegen.cs: (ConstantCheckState): Constant evaluation has its
10493         own separate setting that can not be turned off from the command
10494         line using --unchecked or --checked and is only controlled using
10495         the checked/unchecked statements and expressions.  This setting is
10496         used by the constant folder to flag errors.
10497
10498         * expression.cs (CheckedExpr, UncheckedExpr): Set the
10499         ConstantCheckState as well.   
10500
10501         During Resolve, they also have to flag the state, because the
10502         constant folder runs completely in the Resolve phase.
10503
10504         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
10505         well.
10506
10507 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
10508
10509         * cfold.cs: New file, this file contains the constant folder.
10510
10511         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
10512         argument to track whether we are using the resulting address to
10513         load or store a value and provide better error messages. 
10514
10515         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
10516         new AddressOf arguments.
10517
10518         * statement.cs (Foreach.EmitCollectionForeach): Update
10519
10520         * expression.cs (Argument.Emit): Call AddressOf with proper
10521         arguments to track usage.
10522
10523         (New.DoEmit): Call AddressOf with new arguments.
10524
10525         (Unary.Emit): Adjust AddressOf call.
10526
10527 2002-03-01  Ravi Pratap  <ravi@ximian.com>
10528
10529         * cs-parser.jay (member_access): Change the case for pre-defined types
10530         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
10531         this suggestion.
10532
10533         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
10534         a method body.
10535
10536         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
10537         essentially like methods and apply attributes like MethodImplOptions to them too.
10538
10539         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
10540         not being null.
10541
10542         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
10543         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
10544         is the DeclSpace.
10545
10546         * Update code everywhere accordingly.
10547
10548         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
10549
10550         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
10551
10552 2002-02-28  Ravi Pratap  <ravi@ximian.com>
10553
10554         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
10555         try performing lookups against those instead of jumping straight into using
10556         the 'using' clauses.
10557
10558         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
10559
10560         (LookupType): Perform lookups in implicit parents too.
10561
10562         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
10563         sequence as RootContext.LookupType. 
10564
10565         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
10566         the various cases of namespace lookups into this method.
10567
10568 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
10569
10570         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
10571         in positional arguments)
10572
10573         * class.cs (Operator): Update the AllowedModifiers to contain
10574         extern. 
10575
10576         * cs-parser.jay: Update operator declaration to allow for the
10577         operator body to be empty.
10578
10579         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
10580         values. 
10581
10582 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
10583
10584         * class.cs (Method.Emit): Label parameters.
10585
10586         * driver.cs: Return 1 or 0 as the program exit code.
10587
10588 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
10589
10590         * expression.cs: Special case the `null' object when trying to
10591         auto-compute the type, as anything can be explicitly converted to
10592         that. 
10593
10594         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
10595         spotting this Paolo.
10596
10597         (Expression.ImplicitNumericConversion): Perform comparissions of
10598         the type using the underlying type in the case of an enumeration
10599         rather than using the enumeration type for the compare.
10600
10601         Cope with the underlying == type case, which is not possible to
10602         catch before. 
10603
10604         (Expression.ConvertNumericExplicit): Perform comparissions of
10605         the type using the underlying type in the case of an enumeration
10606         rather than using the enumeration type for the compare.
10607
10608         * driver.cs: If the user does not supply an extension, assume .exe
10609
10610         * cs-parser.jay (if_statement): Rewrote so that we can track the
10611         location for the if statement.
10612
10613         * expression.cs (Binary.ConstantFold): Only concat strings when
10614         the operation is "+", not everything ;-)
10615
10616         * statement.cs (Statement.EmitBoolExpression): Take a location
10617         argument. 
10618         (If, While, Do): Track location.
10619
10620         * expression.cs (Binary.ResolveOperator): In the object + string
10621         case, I was missing a call to ConvertImplicit
10622
10623 2002-02-25  Ravi Pratap  <ravi@ximian.com>
10624
10625         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
10626         Location arguments. Ensure we use RootContext.LookupType to do our work
10627         and not try to do a direct Type.GetType and ModuleBuilder.GetType
10628
10629         * interface.cs (PopulateMethod): Handle the type of the parameter being
10630         null gracefully.
10631
10632         * expression.cs (Invocation.BetterFunction): Handle the case when we 
10633         have a params method with no fixed arguments and a call is made with no
10634         arguments.
10635
10636 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
10637
10638         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
10639         the verbatim-string-literal
10640
10641         * support.cs (InternalParameters.ParameterModifier): handle null
10642         fixed parameters.
10643         (InternalParameters.ParameterType): ditto.
10644
10645         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
10646         duplicating the name of the variable parameter.
10647         (GetParameterByName): Fix bug where we were not looking up array
10648         paramters if they were the only present (thanks Paolo!).
10649         (GetParameterInfo): We only have an empty set of types if both
10650         fixed and array are set to null.
10651         (GetParameterInfo-idx): Handle FixedParameter == null
10652
10653         * cs-parser.jay: Handle the case where there is no catch
10654         statements (missing null test).
10655
10656 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
10657
10658         * driver.cs (MainDriver): Be conservative on our command line
10659         handling.
10660
10661         Catch DirectoryNotFoundException when calling GetFiles.
10662
10663         (SplitPathAndPattern): Used to split the input specification into
10664         a path and a pattern that we can feed to Directory.GetFiles.
10665
10666 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
10667
10668         * statement.cs (Fixed): Implement the last case of the Fixed
10669         statement (string handling).
10670
10671         * expression.cs (StringPtr): New class used to return a char * to
10672         a string;  Used by the Fixed statement.
10673
10674         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
10675
10676         * expression.cs (Binary.ResolveOperator): Remove redundant
10677         MemberLookup pn parent type.
10678         Optimize union call, we do not need a union if the types are the same.
10679         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
10680         type.
10681
10682         Specialize the use of MemberLookup everywhere, instead of using
10683         the default settings. 
10684
10685         (StackAlloc): Implement stackalloc keyword.
10686
10687         * cs-parser.jay: Add rule to parse stackalloc.
10688
10689         * driver.cs: Handle /h, /help, /?
10690
10691         * expression.cs (MakeByteBlob): Removed the hacks we had in place
10692         before we supported unsafe code.
10693
10694         * makefile: add --unsafe to the self compilation of mcs.
10695
10696 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
10697
10698         * expression.cs (PointerArithmetic): New class that is used to
10699         perform pointer arithmetic.
10700         (Binary.Resolve): Handle pointer arithmetic
10701         Handle pointer comparission.
10702         (ArrayPtr): Utility expression class that is used to take the
10703         address of an array.
10704
10705         (ElementAccess): Implement array access for pointers
10706
10707         * statement.cs (Fixed): Implement fixed statement for arrays, we
10708         are missing one more case before we are done.
10709
10710         * expression.cs (Indirection): Implement EmitAssign and set the
10711         ExprClass to Variable.  This allows pointer dereferences to be
10712         treated as variables, and to have values assigned to them.
10713
10714         * ecore.cs (Expression.StoreFromPtr): New utility function to
10715         store values dereferencing.
10716
10717 2002-02-20  Ravi Pratap  <ravi@ximian.com>
10718
10719         * expression.cs (Binary.ResolveOperator): Ensure that we are
10720         not trying to operate on a void type - this fixes the reported
10721         bug.
10722
10723         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
10724         the parent implementation is sealed.
10725
10726         * ../errors/cs0239.cs : Add.
10727
10728         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
10729
10730         * typemanager.cs (unverifiable_code_type): Corresponds to 
10731         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
10732         which have unsafe code in them.
10733
10734         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
10735         unsafe context.
10736
10737 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
10738
10739         * cs-tokenizer.cs: Add support for @"litreal strings"
10740
10741         Make tokenizer accept pre-processor directives
10742         on any column (remove the old C-like limitation). 
10743
10744         * rootcontext.cs (EmitCode): Emit any global attributes.
10745         (AddGlobalAttributes): Used to keep track of assembly attributes. 
10746
10747         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
10748
10749         * cs-parser.jay: Add support for global attributes.  
10750
10751 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
10752
10753         * expression.cs (Indirection): New helper class.  Unary will
10754         create Indirection classes to be able to implement the
10755         IMemoryLocation interface on it.
10756
10757 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
10758
10759         * cs-parser.jay (fixed_statement): reference the right statement.
10760
10761         * statement.cs (Fixed.Emit): Finish implementing the fixed
10762         statement for the &x case.
10763
10764 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
10765
10766         * class.cs (Property.Define, Method.Define): Remove newslot when
10767         `implementing'.  
10768
10769         * modifiers.cs: My use of NewSlot when `Abstract' was set was
10770         wrong.  NewSlot should only be used if the `new' keyword is present.
10771
10772         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
10773         locating our system dir.  Sorry about this.
10774
10775 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10776
10777         * driver.cs (GetSystemDir): Compute correctly the location of our
10778         system assemblies.  I was using the compiler directory instead of
10779         the library directory.
10780
10781 2002-02-13  Ravi Pratap  <ravi@ximian.com>
10782
10783         * expression.cs (BetterFunction): Put back in what Miguel commented out
10784         since it is the correct fix. The problem is elsewhere ;-)
10785
10786         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
10787         parameters of the parms method are themselves compatible or not !
10788
10789         (StandardConversionExists): Fix very dangerous bug where we were forgetting
10790         to check that a class implements an interface before saying that an implicit
10791         conversion was allowed. Use ImplementsInterface to do the checking.
10792
10793 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10794
10795         * class.cs (Method.Define): Track whether we are an explicit
10796         implementation or not.  And only call DefineMethodOverride if we
10797         are an explicit implementation.
10798
10799         (Property.DefineMethod): Ditto.
10800
10801 2002-02-11  Ravi Pratap  <ravi@ximian.com>
10802
10803         * expression.cs (BetterFunction): Catch hideous bug which was
10804          preventing us from detecting ambiguous calls due to implicit casts i.e
10805         cs0121.
10806
10807 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
10808
10809         * support.cs (Pair): Remove un-needed method.  I figured why I was
10810         getting the error in cs-parser.jay, the variable in a foreach loop
10811         is readonly, and the compiler does not really treat this as a variable.
10812
10813         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
10814         instead of EQUALS in grammar.  
10815
10816         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
10817
10818         * expression.cs (Unary.DoResolve): Check whether the argument is
10819         managed or not.
10820
10821 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
10822
10823         * support.cs: Api for Pair to set a value.  Despite the fact that
10824         the variables are public the MS C# compiler refuses to compile
10825         code that accesses the field if the variable is part of a foreach
10826         statement. 
10827
10828         * statement.cs (Fixed): Begin implementation of the fixed
10829         statement.
10830
10831         (Block.AddVariable): Return the VariableInfo on success and null
10832         on failure instead of true/false. 
10833
10834         * cs-parser.jay (foreach): Catch errors on variables already
10835         defined (we were ignoring this value before) and properly unwind
10836         the block hierarchy
10837
10838         (fixed_statement): grammar for the fixed statement.
10839
10840 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
10841
10842         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
10843         pointer types to be incretemented.
10844
10845         (SizeOf): Implement.
10846
10847         * cs-parser.jay (pointer_member_access): Implement
10848         expr->IDENTIFIER production.
10849
10850         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
10851         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
10852         on safe contexts.
10853
10854         (Unary): Implement indirection.
10855
10856         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
10857         use in non-unsafe context).
10858
10859         (SimpleName.DoResolve): Check for pointers in field access on safe
10860         contexts. 
10861
10862         (Expression.LoadFromPtr): Factor the load-indirect code in this
10863         function.  This was duplicated in UnboxCast and ParameterReference
10864
10865 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
10866
10867         * expression.cs (ComposedCast): report an error if a pointer cast
10868         is used in a safe region.
10869
10870         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
10871         pointer type casts in unsafe context.
10872
10873         * codegen.cs (EmitContext): Set up IsUnsafe.
10874
10875         * cs-parser.jay (non_expression_type): Add productions for pointer
10876         casts. 
10877
10878         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
10879         code.  We should not use force into static mode if the method is
10880         not virtual.  Fixes bug in MIS
10881
10882         * statement.cs (Do.Emit, While.Emit, For.Emit,
10883         Statement.EmitBoolExpression): Add support to Do and While to
10884         propagate infinite loop as `I do return' semantics.
10885
10886         Improve the For case to also test for boolean constants.
10887
10888         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
10889         to the list of attributes we can add.
10890
10891         Remove `EmitContext' argument.
10892
10893         * class.cs (Method.Define): Apply parameter attributes.
10894         (Constructor.Define): Apply parameter attributes.
10895         (MethodCore.LabelParameters): Move here the core of labeling
10896         parameters. 
10897
10898         * support.cs (ReflectionParameters.ParameterModifier,
10899         InternalParameters.ParameterModifier): Use IsByRef on the type and
10900         only return the OUT bit for these parameters instead of in/out/ref
10901         flags.
10902
10903         This is because I miss-understood things.  The ParameterInfo.IsIn
10904         and IsOut represent whether the parameter has the [In] and [Out]
10905         attributes set.  
10906
10907 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
10908
10909         * ecore.cs (FieldExpr.Emit): Release temporaries.
10910
10911         * assign.cs (LocalTemporary.Release): new function.
10912
10913         * codegen.cs (EmitContext.GetTemporaryStorage,
10914         EmitContext.FreeTemporaryStorage): Rework the way we deal with
10915         temporary storage.  Now we can "put back" localbuilders when we
10916         are done with them
10917
10918 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
10919
10920         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
10921         need to make a copy of the variable to generate verifiable code.
10922
10923 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
10924
10925         * driver.cs: Compute dynamically the system directory.
10926
10927         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
10928         Slower, but more generally useful.  Used by the abstract
10929         registering implementation. 
10930
10931         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
10932         the rules for the special rule on Type/instances.  First check if
10933         we have the same name, and if so, try that special static path
10934         rather than the instance path.
10935
10936 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
10937
10938         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
10939         for, while and if.
10940
10941         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
10942         Enum, ValueType, Delegate or Array for non-corlib compiles.
10943
10944         * cs-tokenizer.cs: Catch long identifiers (645)
10945
10946         * typemanager.cs (IndexerPropetyName): Ravi never tested this
10947         piece of code.
10948
10949         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
10950         fix, we were returning too early, so we were not registering
10951         pending methods from abstract classes.
10952
10953         Do not register pending methods if the class is abstract.
10954
10955         * expression.cs (Conditional.DoResolve): Report circular implicit
10956         conversions when we neecd to compute it for conditional
10957         expressions. 
10958
10959         (Is.DoResolve): If the expression is always of the provided type,
10960         flag warning 183.  If the expression can not ever be of the
10961         provided type flag warning 184.
10962
10963         * class.cs: Catch 169 as well.
10964
10965         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
10966         read. 
10967
10968 2002-01-18  Nick Drochak  <ndrochak@gol.com>
10969
10970         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
10971
10972 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
10973
10974         * interface.cs: (PopulateMethod): Check for pointers being defined
10975         only if the unsafe context is active.
10976         (PopulateProperty): ditto.
10977         (PopulateIndexer): ditto.
10978
10979         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
10980         specified.  If pointers are present, make sure that they are
10981         present in an unsafe context.
10982         (Constructor, Constructor.Define): ditto.
10983         (Field, Field.Define): ditto.
10984         (Property, Property.Define): ditto.
10985         (Event, Event.Define): ditto.
10986
10987         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
10988         hashtable if there are classes or structs defined.
10989
10990         * expression.cs (LocalVariableReference.DoResolve): Simplify this
10991         code, as the constant resolution moved.
10992
10993         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
10994         the metadata, so we can flag error 133. 
10995
10996         * decl.cs (MemberCore.UnsafeOK): New function to test that a
10997         pointer is being declared in an unsafe context.
10998
10999 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
11000
11001         * modifiers.cs (Modifiers.Check): Require a Location argument.
11002         Report error 227 for Unsafe use.
11003
11004         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
11005
11006         * statement.cs (For.Emit): If the test is null, then report that
11007         we do `return', as we wont reach anything afterwards.
11008
11009         (Switch.SwitchGoverningType): Track the expression that matched
11010         the conversion.
11011
11012         * driver.cs: Allow negative numbers as an error code to flag.
11013
11014         * cs-parser.jay: Handle 1551.
11015
11016         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
11017
11018 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11019
11020         * cs-parser.jay: Report 1518 (type declaration can only contain
11021         class, struct, interface, enum or delegate)
11022
11023         (switch_label): Report 1523 (keywords `case' or `default' must
11024         preced code)
11025
11026         (opt_switch_sections): Report 1522 (empty switch)
11027
11028         * driver.cs: Report 1515 (response file specified multiple times)
11029         Report 1516 (Source file specified multiple times).
11030
11031         * expression.cs (Argument.Resolve): Signal 1510
11032
11033         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
11034         access not allowed in static code)
11035
11036 2002-01-11  Ravi Pratap  <ravi@ximian.com>
11037
11038         * typemanager.cs (IsPointerType): Utility method which we are going
11039         to need a lot.
11040
11041         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
11042         the object type, so we take care of that.
11043
11044         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
11045
11046         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
11047         added to non-params parameters :-)
11048
11049         * typemanager.cs (CSharpName): Include 'void' type too. 
11050
11051         (void_ptr_type): Include in the set of core types.
11052
11053         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
11054         duplicating code.
11055
11056         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
11057         an unsafe context.
11058
11059         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
11060         completely forgotten about it.
11061
11062 2002-01-10  Ravi Pratap  <ravi@ximian.com>
11063
11064         * cs-parser.jay (pointer_type): Add. This begins our implementation
11065         of parsing rules for unsafe code.
11066
11067         (unsafe_statement): Implement.
11068
11069         (embedded_statement): Modify to include the above.
11070
11071         * statement.cs (Unsafe): Implement new class for unsafe blocks.
11072
11073         * codegen.cs (EmitContext.InUnsafe): Add. This determines
11074         if the current context is an unsafe one.
11075
11076         * cs-parser.jay (local_variable_pointer_type): Since local variable types
11077         are handled differently, we need separate rules for them.
11078
11079         (local_variable_declaration): Update to use local_variable_pointer_type
11080         to allow variable declarations of unmanaged pointer types.
11081
11082         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
11083         in unsafe contexts.
11084
11085         * ../errors/cs0214.cs : Add.
11086
11087 2002-01-16  Nick Drochak  <ndrochak@gol.com>
11088
11089         * makefile: remove 'response' file when cleaning.
11090
11091 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11092
11093         * cs-parser.jay: Report 1524.
11094
11095 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
11096
11097         * typemanager.cs (RegisterMethod): drop checking if we have
11098         registered this from here
11099
11100 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
11101
11102         * class.cs (Method.EmitDestructor): Implement calling our base
11103         destructor. 
11104
11105         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
11106         value of InFinally.
11107
11108         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
11109         this routine and will wrap the call in a try/catch block.  Deal
11110         with the case.
11111
11112 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
11113
11114         * ecore.cs (Expression.MemberLookup): instead of taking a
11115         parameter `same_type' that was used to tell whether we could
11116         access private members we compute our containing type from the
11117         EmitContext.
11118
11119         (FieldExpr): Added partial support for volatile fields.  This does
11120         not work for volatile fields exposed from assemblies, as I can not
11121         figure out how to extract the modreq from it.
11122
11123         Updated all the source files to use this.
11124
11125         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
11126         because it is referenced by MemberLookup very often. 
11127
11128 2002-01-09  Ravi Pratap  <ravi@ximian.com>
11129
11130         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
11131         TypeBuilder.GetCustomAttributes to retrieve what we need.
11132
11133         Get rid of redundant default_member_attr_type as this is the same as
11134         default_member_type which already exists.
11135
11136         * interface.cs, attribute.cs : Update accordingly.
11137
11138 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
11139
11140         * typemanager.cs: Enable IndexerPropertyName again.  It does not
11141         work for TYpeBuilders though.  Ravi, can you please fix this?
11142
11143         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
11144
11145         * expression.cs (Argument.Emit): Handle the case of ref objects
11146         being passed to ref functions;  
11147
11148         (ParameterReference.EmitLoad): Loads the content of the pointer
11149         without dereferencing.
11150
11151 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11152
11153         * cs-tokenizer.cs: Implemented the pre-processing expressions.
11154
11155 2002-01-08  Ravi Pratap  <ravi@ximian.com>
11156
11157         * class.cs (Indexer.DefineMethod): Incorporate the interface
11158         type in the name of the method if we are doing explicit interface
11159         implementation.
11160
11161         * expression.cs (ConversionExists): Remove as it is completely obsolete.
11162
11163         (BetterConversion): Fix extremely trivial bug where we were referring to
11164         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
11165         again !
11166
11167         * ../errors/bug16.cs : Add although we have fixed it.
11168
11169 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11170
11171         * expression.cs (BaseIndexer): Begin implementation.
11172
11173         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
11174
11175         * cs-parser.jay (indexer_declarator): Use qualified_identifier
11176         production directly to remove a shift/reduce, and implement
11177         explicit interface implementation.
11178
11179         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
11180         after a floating point suffix.
11181
11182         * expression.cs (DoNumericPromotions): Improved the conversion for
11183         uint/uint.  If we have a constant, we avoid doing a typecast to a
11184         larger type.
11185
11186         * class.cs (Indexer): Implement explicit interface implementation
11187         for indexers.
11188
11189 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
11190
11191         * class.cs: make the default instance constructor public and hidebysig.
11192
11193 2001-01-03  Ravi Pratap  <ravi@ximian.com>
11194
11195         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
11196         so we can call it from elsewhere.
11197
11198         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
11199         we emit it internally if the class has a defined indexer; otherwise the user
11200         emits it by decorating the class definition with the DefaultMemberAttribute.
11201
11202         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
11203         attribute is not used on a type which defines an indexer.
11204
11205         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
11206         character when we skip whitespace.
11207
11208         * ../errors/cs0646.cs : Add.
11209
11210 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
11211
11212         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
11213         again. 
11214
11215         * makefile: Add practical target `mcs3.exe' which builds the third
11216         generation compiler. 
11217
11218         * expression.cs (New): Fix structures constructor calling.
11219
11220         * class.cs (Property, Method, Indexer): Emit Final flag on the
11221         method if we are an interface implementation and we are not
11222         abstract. 
11223
11224         * ecore.cs (PropertyExpr): New public field `IsBase', tells
11225         whether this property is referencing a `base' method.
11226
11227         * expression.cs (Invocation.EmitCall): take an extra argument:
11228         is_base, this is used to determine whether the `call' or
11229         `callvirt' opcode should be used.
11230
11231
11232         * delegate.cs: update EmitCall.
11233
11234         * class.cs (Method.Define): Set NewSlot for the cases where we are
11235         not implementing an interface method.
11236
11237         (Property.Define): ditto.
11238
11239 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
11240
11241         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
11242         'r'.  Allows mcs to parse itself fully.
11243
11244 2002-01-02  Ravi Pratap  <ravi@ximian.com>
11245
11246         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
11247         of the number of initializers that require the InitializeArray method.
11248
11249         (CheckIndices): Store the Expression in all cases - not the plain value. Also
11250         update the above field where necessary.
11251
11252         (MakeByteBlob): Update accordingly.
11253
11254         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
11255         greater than 2.
11256
11257         (EmitDynamicInitializers): Update in accordance with the new optimization.
11258
11259         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
11260         same OpCode applies.
11261
11262         * cs-parser.jay : Fix some glaring errors I introduced.
11263
11264 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
11265
11266         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
11267         so that we can check for name clashes there too.
11268
11269         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
11270         for interface indexers.
11271
11272         * interfaces.cs (Define): Emit the default member attribute.
11273
11274         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
11275         variable was being referred to while setting the value ;-)
11276
11277 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
11278
11279         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
11280         byte-by-byte information when we know the data is zero.
11281
11282         Make the block always a multiple of 4, because
11283         DefineInitializedData has a bug.
11284
11285         * assign.cs: Fix, we should assign from the temporary, not from
11286         the source. 
11287
11288         * expression.cs (MakeByteBlob): Fix my incorrect code.
11289
11290 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
11291
11292         * typemanager.cs (EnumToUnderlying): This function is used to get
11293         the underlying type from an enumeration, because it does not
11294         always work. 
11295
11296         * constant.cs: Use the I4_S form for values between -128 and 127.
11297
11298         * statement.cs (Block.LookupLabel): Looks up a label.
11299         (Block): Drop support for labeled blocks.
11300
11301         (LabeledStatement): New kind of statement that represents a label
11302         only.
11303
11304         (Goto): Finally implement this bad boy.
11305
11306         * cs-parser.jay: Update to reflect new mechanism to implement
11307         labels.
11308
11309 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
11310
11311         * codegen.cs (EmitContext.This): a codegen property that keeps the
11312         a single instance of this instead of creating many different this
11313         instances. 
11314
11315         * delegate.cs (Delegate.DoResolve): Update to use the property;
11316
11317         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
11318
11319         * expression.cs (BaseAccess.DoResolve): Ditto.
11320
11321 2001-12-29  Ravi Pratap  <ravi@ximian.com>
11322
11323         * typemanager.cs (methodimpl_attr_type): Add to hold the type
11324         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
11325
11326         (InitCoreTypes): Update accordingly.
11327
11328         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
11329         so we can quickly store the state.
11330
11331         (ApplyAttributes): Set the correct implementation flags
11332         for InternalCall methods.
11333
11334 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
11335
11336         * expression.cs (EmitCall): if a method is not virtual, then do
11337         not use callvirt on it.
11338
11339         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
11340         user defined stuff) requires the use of stobj, which takes an
11341         address on the stack instead of an array and an index.  So emit
11342         the Ldelema operation for it.
11343
11344         (EmitStoreOpcode): Use stobj for valuetypes.
11345
11346         (UnaryMutator.EmitCode): Use the right 1 value depending on
11347         whether we are dealing with int64/uint64, float or doubles.
11348
11349         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
11350         constructors that I implemented last night.
11351
11352         (Constructor.IsDefault): Fix to work properly for static
11353         constructors.
11354
11355         * cs-parser.jay (CheckDef): report method signature errors.
11356         Update error number 103 to be 132.
11357
11358         * decl.cs: New AdditionResult enumeration value: MethodExists.
11359         Although we do this check for methods later on in the semantic
11360         analysis, catching repeated default constructors is so easy that
11361         we catch these here. 
11362
11363         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
11364         promotions code.
11365
11366         (ParameterReference.EmitAssign, Emit): handle
11367         bools as bytes.
11368
11369         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
11370         (ArrayAccess.EmitStoreOpcode): ditto.
11371
11372         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
11373
11374         * expression.cs (MakeByteBlob): Complete all the missing types
11375         (uint, short, ushort, byte, sbyte)
11376
11377         * class.cs: Only init instance field initializers on instance
11378         constructors. 
11379
11380         Rename `constructors' to instance_constructors. 
11381
11382         (TypeContainer.AddConstructor): Only add constructors to the list
11383         if it is not static.
11384
11385         Make sure that we handle default_static_constructor independently
11386         everywhere where we handle instance_constructors
11387
11388 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
11389
11390         * class.cs: Do not lookup or create a base initializer for a
11391         static constructor.
11392
11393         (ConstructorInitializer.Resolve): use the proper type to lookup
11394         for constructors.
11395
11396         * cs-parser.jay: Report error 1585 (modifiers between type and name).
11397
11398         * enum.cs, interface.cs: Remove CloseType, this is taken care by
11399         in DeclSpace. 
11400
11401         * decl.cs: CloseType is now an virtual method, the default
11402         implementation just closes this type.
11403
11404 2001-12-28  Ravi Pratap  <ravi@ximian.com>
11405
11406         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
11407         to PreserveSig by default. Also emit HideBySig on such methods.
11408
11409         Basically, set the defaults to standard values.
11410
11411         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
11412         argument, if candidate is better, it can't be worse than the best !
11413
11414         (Invocation): Re-write bits to differentiate between methods being
11415         applicable in their expanded form and their normal form - for params
11416         methods of course.
11417
11418         Get rid of use_standard everywhere as only standard conversions are allowed
11419         in overload resolution. 
11420
11421         More spec conformance.
11422
11423 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
11424
11425         * driver.cs: Add --timestamp, to see where the compiler spends
11426         most of its time.
11427
11428         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
11429         `this' in static code.
11430
11431         (SimpleName.DoResolve): Implement in terms of a helper function
11432         that allows static-references to be passed upstream to
11433         MemberAccess.
11434
11435         (Expression.ResolveWithSimpleName): Resolve specially simple
11436         names when called by MemberAccess to implement the special
11437         semantics. 
11438
11439         (Expression.ImplicitReferenceConversion): Handle conversions from
11440         Null to reference types before others, as Null's type is
11441         System.Object. 
11442
11443         * expression.cs (Invocation.EmitCall): Handle the special case of
11444         calling methods declared on a reference type from a ValueType
11445         (Base classes System.Object and System.Enum)
11446
11447         (MemberAccess.Resolve): Only perform lookups on Enumerations if
11448         the left hand side is a TypeExpr, not on every enumeration. 
11449
11450         (Binary.Resolve): If types are reference types, then do a cast to
11451         object on operators != and == of both arguments.
11452
11453         * typemanager.cs (FindMembers): Extract instance and static
11454         members if requested.
11455
11456         * interface.cs (PopulateProperty): Use void_type instead of null
11457         as the return type for the setter method.
11458
11459         (PopulateIndexer): ditto.
11460
11461 2001-12-27  Ravi Pratap  <ravi@ximian.com>
11462
11463         * support.cs (ReflectionParameters): Fix minor bug where we
11464         were examining the wrong parameter for the ParamArray attribute.
11465
11466         Cope with requests for the type of the parameter at position
11467         greater than the params parameter's. We now return the element
11468         type of the params array as that makes more sense.
11469
11470         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
11471         accordingly as we no longer have to extract the element type
11472         ourselves.
11473
11474         (Invocation.OverloadResolve): Update.
11475
11476 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
11477
11478         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
11479         against IEnumerator, test whether the return value is a descendant
11480         of the IEnumerator interface.
11481
11482         * class.cs (Indexer.Define): Use an auxiliary method to implement
11483         the other bits of the method definition.  Begin support for
11484         explicit interface implementation.
11485
11486         (Property.DefineMethod): Use TypeManager.void_type instead of null
11487         for an empty return value.
11488
11489 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
11490
11491         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
11492         dealing with a FieldExpr which is composed of a FieldBuilder, in
11493         the code path we did extract the constant, but we should have
11494         obtained the underlying value to be able to cast it (otherwise we
11495         end up in an infinite loop, this is what Ravi was running into).
11496
11497         (ArrayCreation.UpdateIndices): Arrays might be empty.
11498
11499         (MemberAccess.ResolveMemberAccess): Add support for section
11500         14.5.4.1 that deals with the special case of E.I when E is a type
11501         and something else, that I can be a reference to a static member.
11502
11503         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
11504         handle a particular array type to create byte blobs, it is just
11505         something we dont generate byteblobs for.
11506
11507         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
11508         arguments. 
11509
11510         * location.cs (Push): remove the key from the hashtable that we
11511         are about to add.   This happens for empty files.
11512
11513         * driver.cs: Dispose files after we have parsed them.
11514
11515         (tokenize): new function that only runs the tokenizer on its
11516         input, for speed testing.
11517
11518 2001-12-26  Ravi Pratap  <ravi@ximian.com>
11519
11520         * class.cs (Event.Define): Define the private field only if there
11521         are no accessors defined.
11522
11523         * expression.cs (ResolveMemberAccess): If there is no associated
11524         field with the event, that means we have an event defined with its
11525         own accessors and we should flag error cs0070 since transforming
11526         ourselves into a field is not valid in that case.
11527
11528         * ecore.cs (SimpleName.DoResolve): Same as above.
11529
11530         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
11531         and charset to sane values.
11532
11533 2001-12-25  Ravi Pratap  <ravi@ximian.com>
11534
11535         * assign.cs (DoResolve): Perform check on events only if they 
11536         are being accessed outside the declaring type.
11537
11538         * cs-parser.jay (event_declarations): Update rules to correctly
11539         set the type of the implicit parameter etc.
11540
11541         (add_accessor, remove_accessor): Set current local parameters.
11542
11543         * expression.cs (Binary): For delegate addition and subtraction,
11544         cast the return value from the method into the appropriate delegate
11545         type.
11546
11547 2001-12-24  Ravi Pratap  <ravi@ximian.com>
11548
11549         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
11550         of these as the workaround is unnecessary.
11551
11552         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
11553         delegate data - none of that is needed at all.
11554
11555         Re-write bits to extract the instance expression and the delegate method
11556         correctly.
11557
11558         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
11559         on delegates too.
11560
11561         * attribute.cs (ApplyAttributes): New method to take care of common tasks
11562         of attaching attributes instead of duplicating code everywhere.
11563
11564         * everywhere : Update code to do attribute emission using the above method.
11565
11566 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11567
11568         * expression.cs (IsParamsMethodApplicable): if there are not
11569         parameters, return immediately.
11570
11571         * ecore.cs: The 0 literal can be implicity converted to an enum
11572         type. 
11573
11574         (SimpleName.DoResolve): First lookup the type, then lookup the
11575         members. 
11576
11577         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
11578         want to get its address.  If the InstanceExpression is not
11579         addressable, store the result in a temporary variable, then get
11580         the address of it.
11581
11582         * codegen.cs: Only display 219 errors on warning level or above. 
11583
11584         * expression.cs (ArrayAccess): Make it implement the
11585         IMemoryLocation interface.
11586
11587         (Binary.DoResolve): handle the operator == (object a, object b)
11588         and operator != (object a, object b) without incurring into a
11589         BoxedCast (because 5 != o should never be performed).
11590
11591         Handle binary enumerator operators.
11592
11593         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
11594         value type, otherwise use Ldelem_ref.
11595
11596         Use precomputed names;
11597
11598         (AddressOf): Implement address of
11599
11600         * cs-parser.jay (labeled_statement): Fix recursive block
11601         addition by reworking the production.
11602
11603         * expression.cs (New.DoEmit): New has a special case:
11604                 
11605                  If we are dealing with a ValueType, we have a few
11606                  situations to deal with:
11607                 
11608                     * The target of New is a ValueType variable, that is
11609                       easy, we just pass this as the variable reference
11610                 
11611                     * The target of New is being passed as an argument,
11612                       to a boxing operation or a function that takes a
11613                       ValueType.
11614                 
11615                       In this case, we need to create a temporary variable
11616                       that is the argument of New.
11617
11618
11619 2001-12-23  Ravi Pratap  <ravi@ximian.com>
11620
11621         * rootcontext.cs (LookupType): Check that current_type is not null before
11622         going about looking at nested types.
11623
11624         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
11625         not implement the IAssignMethod interface any more.
11626
11627         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
11628         where we tranform them into FieldExprs if they are being resolved from within
11629         the declaring type.
11630
11631         * ecore.cs (SimpleName.DoResolve): Do the same here.
11632
11633         * assign.cs (DoResolve, Emit): Clean up code considerably. 
11634
11635         * ../errors/bug10.cs : Add.
11636
11637         * ../errors/cs0070.cs : Add.
11638
11639         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
11640
11641         * assign.cs : Get rid of EventIsLocal everywhere.
11642
11643 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11644
11645         * ecore.cs (ConvertIntLiteral): finished the implementation.
11646
11647         * statement.cs (SwitchLabel): Convert the value we are using as a
11648         key before looking up the table.
11649
11650 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11651
11652         * codegen.cs (EmitTopBlock): Require a Location argument now.
11653
11654         * cs-parser.jay (constructor_declarator): We need to setup
11655         current_local_parameters before we parse the
11656         opt_constructor_initializer, to allow the variables to be bound
11657         to the constructor arguments.
11658
11659         * rootcontext.cs (LookupType): First lookup nested classes in our
11660         class and our parents before we go looking outside our class.
11661
11662         * expression.cs (ConstantFold): Extract/debox the values at the
11663         beginnning. 
11664
11665         * rootcontext.cs (EmitCode): Resolve the constants first before we
11666         resolve the types.  This is not really needed, but it helps debugging.
11667
11668         * statement.cs: report location.
11669
11670         * cs-parser.jay: pass location to throw statement.
11671
11672         * driver.cs: Small bug fix.
11673
11674         * report.cs: Updated format to be 4-zero filled digits.
11675
11676 2001-12-22  Ravi Pratap  <ravi@ximian.com>
11677
11678         * expression.cs (CheckIndices): Fix minor bug where the wrong
11679         variable was being referred to ;-)
11680
11681         (DoEmit): Do not call EmitStaticInitializers when the 
11682         underlying type is System.Object.
11683
11684 2001-12-21  Ravi Pratap  <ravi@ximian.com>
11685
11686         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
11687         and do the usual workaround for SRE.
11688
11689         * class.cs (MyEventBuilder.EventType): New member to get at the type
11690         of the event, quickly.
11691
11692         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
11693
11694         * assign.cs (Assign.DoResolve): Handle the case when the target
11695         is an EventExpr and perform the necessary checks.
11696
11697         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
11698         interface.
11699
11700         (SimpleName.MemberStaticCheck): Include check for EventExpr.
11701
11702         (EventExpr): Set the type in the constructor itself since we 
11703         are meant to be born fully resolved.
11704
11705         (EventExpr.Define): Revert code I wrote earlier.
11706                 
11707         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
11708         instance expression is null. The instance expression is a This in that case
11709         or a null, depending on whether it is a static method or not.
11710
11711         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
11712         refers to more than one method.
11713
11714         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
11715         and accordingly flag errors.
11716
11717 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11718
11719         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
11720
11721 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11722
11723         * location.cs (ToString): Provide useful rutine.
11724
11725 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11726
11727         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
11728         objects, return the actual integral boxed.
11729
11730         * statement.cs (SwitchLabel): define an ILLabel for each
11731         SwitchLabel. 
11732
11733         (Switch.CheckSwitch): If the value is a Literal, extract
11734         the underlying literal.
11735
11736         Also in the unused hashtable we had, add the SwitchLabel so we can
11737         quickly look this value up.
11738
11739         * constant.cs: Implement a bunch of new constants.  Rewrite
11740         Literal based on this.  Made changes everywhere to adapt to this.
11741
11742         * expression.cs (Expression.MakeByteBlob): Optimize routine by
11743         dereferencing array only once, and also copes with enumrations.
11744
11745         bytes are two bytes wide, not one.
11746
11747         (Cast): Perform constant conversions.
11748
11749         * ecore.cs (TryImplicitIntConversion): Return literals instead of
11750         wrappers to the literals here.
11751
11752         * expression.cs (DoNumericPromotions): long literals can converted
11753         to ulong implicity (this is taken care of elsewhere, but I was
11754         missing this spot).
11755
11756         * ecore.cs (Expression.Literalize): Make the return type Literal,
11757         to improve type checking.
11758
11759         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
11760
11761 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11762
11763         * literal.cs: Revert code from ravi that checked the bounds.  The
11764         bounds are sane by the definition of the type itself. 
11765
11766         * typemanager.cs: Fix implementation of ImplementsInterface.  We
11767         need to actually look up in our parent hierarchy for interfaces
11768         implemented. 
11769
11770         * const.cs: Use the underlying type for enumerations
11771
11772         * delegate.cs: Compute the basename for the delegate creation,
11773         that should fix the delegate test case, and restore the correct
11774         Type Lookup semantics in rootcontext
11775
11776         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
11777         referencing a nested type with the Reflection API is using the "+"
11778         sign. 
11779
11780         * cs-parser.jay: Do not require EOF token at the end.
11781
11782 2001-12-20  Ravi Pratap  <ravi@ximian.com>
11783
11784         * rootcontext.cs (LookupType): Concatenate type names with
11785         a '.' instead of a '+' The test suite passes again.
11786
11787         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
11788         field of the enumeration.
11789
11790         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
11791         the case when the member is an EventExpr.
11792
11793         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
11794         static has an associated instance expression.
11795
11796         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
11797
11798         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
11799
11800         * class.cs (Event.Define): Register event and perform appropriate checks
11801         for error #111.
11802
11803         We define the Add and Remove methods even if the use provides none because
11804         in that case, we provide default implementations ourselves.
11805
11806         Define a private field of the type of the event. This is done by the CSC compiler
11807         and we should be doing it too ;-)
11808
11809         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
11810         More methods we use in code we generate.
11811
11812         (multicast_delegate_type, delegate_type): Two separate types since the distinction
11813         is important.
11814
11815         (InitCoreTypes): Update accordingly for the above.
11816
11817         * class.cs (Event.Emit): Generate code for default accessors that we provide
11818
11819         (EmitDefaultMethod): Do the job in the above.
11820
11821         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
11822         appropriate place.
11823
11824 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11825
11826         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
11827         builders even if we were missing one.
11828
11829         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
11830         pass the Basename as our class name instead of the Name.  The
11831         basename will be correctly composed for us.
11832
11833         * parameter.cs (Paramters): Now takes a Location argument.
11834
11835         * decl.cs (DeclSpace.LookupType): Removed convenience function and
11836         make all the code call directly LookupType in RootContext and take
11837         this chance to pass the Location information everywhere.
11838
11839         * Everywhere: pass Location information.
11840
11841 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
11842
11843         * class.cs (Constructor.Define): Updated way of detecting the
11844         length of the parameters.
11845
11846         (TypeContainer.DefineType): Use basename as the type name for
11847         nested types.
11848
11849         (TypeContainer.Define): Do not recursively define types here, as
11850         definition is taken care in order by the RootContext.
11851
11852         * tree.cs: Keep track of namespaces in a per-file basis.
11853
11854         * parameter.cs (Parameter.ComputeSignature): Update to use
11855         DeclSpace. 
11856
11857         (Parameters.GetSignature): ditto.
11858
11859         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
11860         instead of a TypeContainer.
11861
11862         (Interface.SemanticAnalysis): Use `this' instead of our parent to
11863         resolve names.  Because we need to be resolve in our context, not
11864         our parents.
11865
11866         * driver.cs: Implement response files.
11867
11868         * class.cs (TypeContainer.DefineType): If we are defined, do not
11869         redefine ourselves.
11870
11871         (Event.Emit): Emit the code for add/remove handlers.
11872         (Event.Define): Save the MethodBuilders for add/remove.
11873
11874         * typemanager.cs: Use pair here too.
11875
11876         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
11877         DictionaryEntry requires the first argument to be non-null.  
11878
11879         (enum_declaration): Compute full name for registering the
11880         enumeration.
11881
11882         (delegate_declaration): Instead of using
11883         formal_parameter_list, use opt_formal_parameter_list as the list
11884         can be empty.
11885
11886         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
11887         (EventParsing): New property that controls whether `add' and
11888         `remove' are returned as tokens or identifiers (for events);
11889
11890 2001-12-19  Ravi Pratap  <ravi@ximian.com>
11891
11892         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
11893         use MyEventBuilder only and let it wrap the real builder for us.
11894
11895         (MyEventBuilder): Revamp constructor etc.
11896
11897         Implement all operations that we perform on EventBuilder in precisely the same
11898         way here too.
11899
11900         (FindMembers): Update to use the EventBuilder member.
11901
11902         (Event.Emit): Update accordingly.
11903
11904 2001-12-18  Ravi Pratap  <ravi@ximian.com>
11905
11906         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
11907         by calling the appropriate methods.
11908
11909         (GetCustomAttributes): Make stubs as they cannot possibly do anything
11910         useful.
11911
11912         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
11913
11914 2001-12-17  Ravi Pratap  <ravi@ximian.com>
11915
11916         * delegate.cs (Delegate.Populate): Check that the return type
11917         and various parameters types are indeed accessible.
11918
11919         * class.cs (Constructor.Define): Same here.
11920
11921         (Field.Define): Ditto.
11922
11923         (Event.Define): Ditto.
11924
11925         (Operator.Define): Check that the underlying Method defined itself
11926         correctly - so it's MethodBuilder should not be null.
11927
11928         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
11929         expression happens to be null.
11930
11931         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
11932         members but as of now we don't seem to be able to do anything really useful with it.
11933
11934         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
11935         not the EventBuilder.
11936
11937 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
11938
11939         * cs-tokenizer.cs: Add support for defines.
11940         Add support for #if, #elif, #else, #endif
11941
11942         (eval_var): evaluates a variable.
11943         (eval): stubbed for evaluating functions.
11944
11945         * cs-parser.jay: Pass the defines information
11946
11947         * driver.cs: Add --define command line option.
11948
11949         * decl.cs: Move MemberCore here.
11950
11951         Make it the base class for DeclSpace.  This allows us to catch and
11952         report 108 and 109 for everything now.
11953
11954         * class.cs (TypeContainer.Define): Extract all the members
11955         before populating and emit the warning 108 (new keyword required
11956         to override) instead of having each member implement this.
11957
11958         (MemberCore.Define): New abstract method, we will be using this in
11959         the warning reporting engine in Populate.
11960
11961         (Operator.Define): Adjust to new MemberCore protocol. 
11962
11963         * const.cs (Const): This does not derive from Expression, it is a
11964         temporary object we use to create fields, it is a MemberCore. 
11965
11966         * class.cs (Method.Define): Allow the entry point to be in a
11967         specific class.
11968
11969         * driver.cs: Rewrite the argument handler to clean it up a bit.
11970
11971         * rootcontext.cs: Made it just an auxiliary namespace feature by
11972         making everything static.
11973
11974         * driver.cs: Adapt code to use RootContext type name instead of
11975         instance variable.
11976
11977         * delegate.cs: Remove RootContext argument.
11978
11979         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
11980         argument. 
11981
11982         * class.cs (Event.Define): The lookup can fail.
11983
11984         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
11985
11986         * expression.cs: Resolve the this instance before invoking the code.
11987
11988 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
11989
11990         * cs-parser.jay: Add a production in element_access that allows
11991         the thing to become a "type" reference.  This way we can parse
11992         things like "(string [])" as a type.
11993
11994         Note that this still does not handle the more complex rules of
11995         casts. 
11996
11997
11998         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
11999
12000         * ecore.cs: (CopyNewMethods): new utility function used to
12001         assemble the list of methods from running FindMembers.
12002
12003         (MemberLookup): Rework FindMembers so that 
12004
12005 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
12006
12007         * class.cs (TypeContainer): Remove Delegates who fail to be
12008         defined.
12009
12010         * delegate.cs (Populate): Verify that we dont get null return
12011         values.   TODO: Check for AsAccessible.
12012
12013         * cs-parser.jay: Use basename to emit error 574 (destructor should
12014         have the same name as container class), not the full name.
12015
12016         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
12017         possible representation.  
12018
12019         Also implements integer type suffixes U and L.
12020
12021 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
12022
12023         * expression.cs (ArrayCreation.DoResolve): We need to do the
12024         argument resolution *always*.
12025
12026         * decl.cs: Make this hold the namespace.  Hold the root context as
12027         well.
12028         (LookupType): Move here.
12029
12030         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
12031
12032         * location.cs (Row, Name): Fixed the code, it was always returning
12033         references to the first file.
12034
12035         * interface.cs: Register properties defined through interfaces.
12036
12037         * driver.cs: Add support for globbing on the command line
12038
12039         * class.cs (Field): Make it derive from MemberCore as well.
12040         (Event): ditto.
12041
12042 2001-12-15  Ravi Pratap  <ravi@ximian.com>
12043
12044         * class.cs (Event::Define): Check that the type of the event is a delegate
12045         type else flag error #66.
12046
12047         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
12048         same.
12049
12050         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
12051         values of EntryPoint, CharSet etc etc.
12052
12053         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
12054
12055         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
12056         be null and we should ignore this. I am not sure if this is really clean. Apparently,
12057         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
12058         which needs this to do its work.
12059
12060         * ../errors/cs0066.cs : Add.
12061
12062 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
12063
12064         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
12065         helper functions.
12066
12067         * class.cs: (MethodSignature.MethodSignature): Removed hack that
12068         clears out the parameters field.
12069         (MemberSignatureCompare): Cleanup
12070
12071         (MemberCore): New base class used to share code between MethodCore
12072         and Property.
12073
12074         (RegisterRequiredImplementations) BindingFlags.Public requires
12075         either BindingFlags.Instace or Static.  Use instance here.
12076
12077         (Property): Refactored code to cope better with the full spec.
12078
12079         * parameter.cs (GetParameterInfo): Return an empty array instead
12080         of null on error.
12081
12082         * class.cs (Property): Abstract or extern properties have no bodies.
12083
12084         * parameter.cs (GetParameterInfo): return a zero-sized array.
12085
12086         * class.cs (TypeContainer.MethodModifiersValid): Move all the
12087         method modifier validation to the typecontainer so we can reuse
12088         this on properties.
12089
12090         (MethodCore.ParameterTypes): return an empty sized array of types.
12091
12092         (Property.Define): Test property modifier validity.
12093
12094         Add tests for sealed/override too.
12095
12096         (Method.Emit): abstract or extern methods have no bodies.
12097
12098 2001-12-14  Ravi Pratap  <ravi@ximian.com>
12099
12100         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
12101         thing.
12102
12103         (Method::Define, ::Emit): Modify accordingly.
12104
12105         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
12106
12107         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
12108
12109         * makefile: Pass in /unsafe.
12110
12111 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
12112
12113         * class.cs (MakeKey): Kill routine.
12114
12115         * class.cs (TypeContainer.Define): Correctly define explicit
12116         method implementations (they require the full interface name plus
12117         the method name).
12118
12119         * typemanager.cs: Deply the PtrHashtable here and stop using the
12120         lame keys.  Things work so much better.
12121
12122         This of course broke everyone who depended on `RegisterMethod' to
12123         do the `test for existance' test.  This has to be done elsewhere.
12124
12125         * support.cs (PtrHashtable): A hashtable that avoid comparing with
12126         the object stupid Equals method (because, that like fails all over
12127         the place).  We still do not use it.
12128
12129         * class.cs (TypeContainer.SetRequiredInterface,
12130         TypeContainer.RequireMethods): Killed these two routines and moved
12131         all the functionality to RegisterRequiredImplementations.
12132
12133         (TypeContainer.RegisterRequiredImplementations): This routine now
12134         registers all the implementations required in an array for the
12135         interfaces and abstract methods.  We use an array of structures
12136         which can be computed ahead of time to reduce memory usage and we
12137         also assume that lookups are cheap as most classes will not
12138         implement too many interfaces.
12139
12140         We also avoid creating too many MethodSignatures.
12141
12142         (TypeContainer.IsInterfaceMethod): Update and optionally does not
12143         clear the "pending" bit if we find that there are problems with
12144         the declaration.
12145
12146         (TypeContainer.VerifyPendingMethods): Update to report errors of
12147         methods that look like implementations but are not.
12148
12149         (TypeContainer.Define): Add support for explicit interface method
12150         implementation. 
12151
12152 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
12153
12154         * typemanager.cs: Keep track of the parameters here instead of
12155         being a feature of the TypeContainer.
12156
12157         * class.cs: Drop the registration of parameters here, as
12158         InterfaceMethods are also interface declarations.
12159
12160         * delegate.cs: Register methods with the TypeManager not only with
12161         the TypeContainer.  This code was buggy.
12162
12163         * interface.cs: Full registation here.
12164
12165 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
12166
12167         * expression.cs: Remove reducer for binary expressions, it can not
12168         be done this way.
12169
12170         * const.cs: Put here the code that used to go into constant.cs
12171
12172         * constant.cs: Put here the code for constants, this is a new base
12173         class for Literals.
12174
12175         * literal.cs: Make Literal derive from Constant.
12176
12177 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
12178
12179         * statement.cs (Return.Emit): Report error 157 if the user
12180         attempts to return from a finally block.
12181
12182         (Return.Emit): Instead of emitting a return, jump to the end of
12183         the function.
12184
12185         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
12186         LocalBuilder to store the result of the function.  ReturnLabel is
12187         the target where we jump.
12188
12189
12190 2001-12-09  Radek Doulik  <rodo@ximian.com>
12191
12192         * cs-parser.jay: remember alias in current namespace
12193
12194         * ecore.cs (SimpleName::DoResolve): use aliases for types or
12195         namespaces
12196
12197         * class.cs (LookupAlias): lookup alias in my_namespace
12198
12199         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
12200         aliases hashtable
12201         (LookupAlias): lookup alias in this and if needed in parent
12202         namespaces
12203
12204 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
12205
12206         * support.cs: 
12207
12208         * rootcontext.cs: (ModuleBuilder) Made static, first step into
12209         making things static.  I need this to avoid passing the
12210         TypeContainer when calling ParameterType.
12211
12212         * support.cs (InternalParameters.ParameterType): Remove ugly hack
12213         that did string manipulation to compute the type and then call
12214         GetType.  Use Parameter.ParameterType instead.
12215
12216         * cs-tokenizer.cs: Consume the suffix for floating values.
12217
12218         * expression.cs (ParameterReference): figure out whether this is a
12219         reference parameter or not.  Kill an extra variable by computing
12220         the arg_idx during emission.
12221
12222         * parameter.cs (Parameters.GetParameterInfo): New overloaded
12223         function that returns whether a parameter is an out/ref value or not.
12224
12225         (Parameter.ParameterType): The type of the parameter (base,
12226         without ref/out applied).
12227
12228         (Parameter.Resolve): Perform resolution here.
12229         (Parameter.ExternalType): The full type (with ref/out applied).
12230
12231         * statement.cs (Using.Emit, Using.EmitExpression): Implement
12232         support for expressions on the using statement.
12233
12234 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
12235
12236         * statement.cs (Using.EmitLocalVariableDecls): Split the
12237         localvariable handling of the using statement.
12238
12239         (Block.EmitMeta): Keep track of variable count across blocks.  We
12240         were reusing slots on separate branches of blocks.
12241
12242         (Try.Emit): Emit the general code block, we were not emitting it. 
12243
12244         Check the type of the declaration to be an IDisposable or
12245         something that can be implicity converted to it. 
12246
12247         Emit conversions if required.
12248
12249         * ecore.cs (EmptyExpression): New utility class.
12250         (Expression.ImplicitConversionExists): New utility function.
12251
12252 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
12253
12254         * statement.cs (Using): Implement.
12255
12256         * expression.cs (LocalVariableReference): Support read only variables.
12257
12258         * statement.cs: Remove the explicit emit for the Leave opcode.
12259         (VariableInfo): Add a readonly field.
12260
12261 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
12262
12263         * ecore.cs (ConvCast): new class used to encapsulate the various
12264         explicit integer conversions that works in both checked and
12265         unchecked contexts.
12266
12267         (Expression.ConvertNumericExplicit): Use new ConvCast class to
12268         properly generate the overflow opcodes.
12269
12270 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12271
12272         * statement.cs: The correct type for the EmptyExpression is the
12273         element_type, not the variable type.  Ravi pointed this out.
12274
12275 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12276
12277         * class.cs (Method::Define): Handle PInvoke methods specially
12278         by using DefinePInvokeMethod instead of the usual one.
12279
12280         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
12281         above to do the task of extracting information and defining the method.
12282
12283 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12284
12285         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
12286         of the condition for string type.
12287
12288         (Emit): Move that here. 
12289
12290         (ArrayCreation::CheckIndices): Keep string literals in their expression
12291         form.
12292
12293         (EmitDynamicInitializers): Handle strings appropriately.
12294
12295 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12296
12297         * codegen.cs (EmitContext): Replace multiple variables with a
12298         single pointer to the current Switch statement.
12299
12300         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
12301         EmitContext.
12302
12303 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12304
12305         * statement.cs 
12306
12307         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
12308         default'.
12309
12310         (Foreach.Emit): Foreach on arrays was not setting
12311         up the loop variables (for break/continue).
12312
12313         (GotoCase): Semi-implented.
12314
12315 2001-12-03  Ravi Pratap  <ravi@ximian.com>
12316
12317         * attribute.cs (CheckAttribute): Handle system attributes by using
12318         Attribute.GetAttributes to examine information we need.
12319
12320         (GetValidPlaces): Same here.
12321
12322         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
12323
12324         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
12325
12326         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
12327
12328         (Method::Define): Set appropriate flags if we have a DllImport attribute.
12329
12330         (Method::Emit): Handle the case when we are a PInvoke method.
12331
12332 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12333
12334         * expression.cs: Use ResolveWithSimpleName on compound names.
12335
12336 2001-12-02  Ravi Pratap  <ravi@ximian.com>
12337
12338         * constant.cs (EmitConstant): Make sure we resolve the associated expression
12339         before trying to reduce it.
12340
12341         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
12342
12343         * constant.cs (LookupConstantValue): Implement.
12344
12345         (EmitConstant): Use the above in emitting the constant.
12346
12347         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
12348         that are user-defined by doing a LookupConstantValue on them.
12349
12350         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
12351         too, like above.
12352
12353 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
12354
12355         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
12356
12357         (BaseAccess.DoResolve): Implement.
12358
12359         (MemberAccess.DoResolve): Split this routine into a
12360         ResolveMemberAccess routine that can be used independently
12361
12362 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
12363
12364         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
12365         As that share bits of the implementation.  Is returns a boolean,
12366         while As returns the Type that is being probed.
12367
12368 2001-12-01  Ravi Pratap  <ravi@ximian.com>
12369
12370         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
12371         instead of a Literal - much easier.
12372
12373         (EnumInTransit): Remove - utterly useless :-)
12374
12375         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
12376
12377         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
12378
12379         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
12380         chain when we have no associated expression.
12381
12382 2001-11-30  Ravi Pratap  <ravi@ximian.com>
12383
12384         * constant.cs (Define): Use Location while reporting the errror.
12385
12386         Also emit a warning when 'new' is used and there is no inherited
12387         member to hide.
12388
12389         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
12390         populated.
12391
12392         (LookupEnumValue): Implement to lookup an enum member's value and define it
12393         if necessary.
12394
12395         (Populate): Re-write accordingly to use the above routine.
12396
12397 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
12398
12399         * expression.cs (This): Fix prototype for DoResolveLValue to
12400         override the base class DoResolveLValue.
12401
12402         * cs-parser.cs: Report errors cs574 and cs575 (destructor
12403         declarations) 
12404
12405         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
12406         (we need to load the address of the field here).  This fixes
12407         test-22. 
12408
12409         (FieldExpr.DoResolveLValue): Call the DoResolve
12410         function to initialize the Instance expression.
12411
12412         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
12413         correctly the GetEnumerator operation on a value type.
12414
12415         * cs-parser.jay: Add more simple parsing error catches.
12416
12417         * statement.cs (Switch): Add support for string switches.
12418         Handle null specially.
12419
12420         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
12421
12422 2001-11-28  Ravi Pratap  <ravi@ximian.com>
12423
12424         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
12425
12426         (declare_local_constant): New helper function.
12427
12428         * statement.cs (AddConstant): Keep a separate record of constants
12429
12430         (IsConstant): Implement to determine if a variable is a constant.
12431
12432         (GetConstantExpression): Implement.
12433
12434         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
12435
12436         * statement.cs (IsVariableDefined): Re-write.
12437
12438 2001-11-27  Ravi Pratap  <ravi@ximian.com>
12439
12440         * class.cs (TypeContainer::FindMembers): Look for constants
12441         in the case when we are looking for MemberTypes.Field
12442
12443         * expression.cs (MemberAccess::DoResolve): Check that in the
12444         case we are a FieldExpr and a Literal, we are not being accessed
12445         by an instance reference.
12446
12447         * cs-parser.jay (local_constant_declaration): Implement.
12448
12449         (declaration_statement): Implement for constant declarations.
12450
12451 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
12452
12453         * statement.cs (Switch): Catch double defaults.
12454
12455         (Switch): More work on the switch() statement
12456         implementation.  It works for integral values now, need to finish
12457         string support.
12458
12459
12460 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
12461
12462         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
12463         integer literals into other integer literals.  To be used by
12464         switch. 
12465
12466 2001-11-24  Ravi Pratap  <ravi@ximian.com>
12467
12468         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
12469         some memory.
12470
12471         (EmitDynamicInitializers): Cope with the above since we extract data
12472         directly from ArrayData now.
12473
12474         (ExpectInitializers): Keep track of whether initializers are mandatory
12475         or not.
12476
12477         (Bounds): Make it a hashtable to prevent the same dimension being 
12478         recorded for every element in that dimension.
12479
12480         (EmitDynamicInitializers): Fix bug which prevented the Set array method
12481         from being found.
12482
12483         Also fix bug which was causing the indices to be emitted in the reverse
12484         order.
12485
12486 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
12487
12488         * expression.cs (ArrayCreation): Implement the bits that Ravi left
12489         unfinished.  They do not work, because the underlying code is
12490         sloppy.
12491
12492 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12493
12494         * cs-parser.jay: Remove bogus fixme.
12495
12496         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
12497         on Switch statement.
12498
12499 2001-11-23  Ravi Pratap  <ravi@ximian.com>
12500
12501         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
12502         the same. 
12503
12504         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
12505         parameter. Apparently, any expression is allowed. 
12506
12507         (ValidateInitializers): Update accordingly.
12508
12509         (CheckIndices): Fix some tricky bugs thanks to recursion.
12510
12511         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
12512         I was being completely brain-dead.
12513
12514         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
12515         and re-write acordingly.
12516
12517         (DelegateInvocation): Re-write accordingly.
12518
12519         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
12520
12521         (MakeByteBlob): Handle types more correctly.
12522
12523         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
12524         initialization from expressions but it is incomplete because I am a complete
12525         Dodo :-|
12526
12527 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12528
12529         * statement.cs (If.Emit): Fix a bug that generated incorrect code
12530         on If.  Basically, we have to return `true' (ie, we do return to
12531         our caller) only if both branches of the if return.
12532
12533         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
12534         short-circuit operators, handle them as short circuit operators. 
12535
12536         (Cast.DoResolve): Resolve type.
12537         (Cast.Cast): Take an expression as the target type.
12538
12539         * cs-parser.jay (cast_expression): Remove old hack that only
12540         allowed a limited set of types to be handled.  Now we take a
12541         unary_expression and we resolve to a type during semantic
12542         analysis.
12543
12544         Use the grammar productions from Rhys to handle casts (this is
12545         not complete like Rhys syntax yet, we fail to handle that corner
12546         case that C# has regarding (-x), but we will get there.
12547
12548 2001-11-22  Ravi Pratap  <ravi@ximian.com>
12549
12550         * class.cs (EmitFieldInitializer): Take care of the case when we have a
12551         field which is an array type.
12552
12553         * cs-parser.jay (declare_local_variables): Support array initialization too.
12554
12555         * typemanager.cs (MakeKey): Implement.
12556
12557         (everywhere): Use the above appropriately.
12558
12559         * cs-parser.jay (for_statement): Update for array initialization while
12560         declaring variables.
12561
12562         * ecore.cs : The error message was correct, it's the variable's names that
12563         were misleading ;-) Make the code more readable.
12564
12565         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
12566         the correct type etc.
12567
12568         (ConvertExplicit): Handle Enum types by examining the underlying type.
12569
12570 2001-11-21  Ravi Pratap  <ravi@ximian.com>
12571
12572         * parameter.cs (GetCallingConvention): Always return
12573         CallingConventions.Standard for now.
12574
12575 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12576
12577         * expression.cs (Binary.ResolveOperator): Update the values of `l'
12578         and `r' after calling DoNumericPromotions.
12579
12580         * ecore.cs: Fix error message (the types were in the wrong order).
12581
12582         * statement.cs (Foreach.ProbeCollectionType): Need to pass
12583         BindingFlags.Instance as well 
12584
12585         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
12586         implicit int literal conversion in an empty cast so that we
12587         propagate the right type upstream.
12588
12589         (UnboxCast): new class used to unbox value types.
12590         (Expression.ConvertExplicit): Add explicit type conversions done
12591         by unboxing.
12592
12593         (Expression.ImplicitNumericConversion): Oops, forgot to test for
12594         the target type before applying the implicit LongLiterals to ULong
12595         literal cast.
12596
12597 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
12598
12599         * cs-parser.jay (for_statement): Reworked the way For works: now
12600         we declare manually any variables that are introduced in
12601         for_initializer to solve the problem of having out-of-band code
12602         emition (that is what got for broken).
12603
12604         (declaration_statement): Perform the actual variable declaration
12605         that used to be done in local_variable_declaration here.
12606
12607         (local_variable_declaration): Do not declare anything, just pass
12608         the information on a DictionaryEntry
12609
12610 2001-11-20  Ravi Pratap  <ravi@ximian.com>
12611
12612         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
12613         re-write of the logic to now make it recursive.
12614
12615         (UpdateIndices): Re-write accordingly.
12616
12617         Store element data in a separate ArrayData list in the above methods.
12618
12619         (MakeByteBlob): Implement to dump the array data into a byte array.
12620
12621 2001-11-19  Ravi Pratap  <ravi@ximian.com>
12622
12623         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
12624         into CheckIndices.
12625
12626         * constant.cs (Define): Implement.
12627
12628         (EmitConstant): Re-write fully.
12629
12630         Pass in location info.
12631
12632         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
12633         respectively.
12634
12635         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
12636         DictionaryEntry since we need location info too.
12637
12638         (constant_declaration): Update accordingly.
12639
12640         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
12641         code into another method : UpdateIndices.
12642
12643 2001-11-18  Ravi Pratap  <ravi@ximian.com>
12644
12645         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
12646         some type checking etc.
12647
12648 2001-11-17  Ravi Pratap  <ravi@ximian.com>
12649
12650         * expression.cs (ArrayCreation::ValidateInitializers): Implement
12651         bits to provide dimension info if the user skips doing that.
12652
12653         Update second constructor to store the rank correctly.
12654
12655 2001-11-16  Ravi Pratap  <ravi@ximian.com>
12656
12657         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
12658         and try to implement.
12659
12660         * ../errors/cs0150.cs : Add.
12661
12662         * ../errors/cs0178.cs : Add.
12663
12664 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
12665
12666         * statement.cs: Implement foreach on multi-dimensional arrays. 
12667
12668         * parameter.cs (Parameters.GetParameterByName): Also lookup the
12669         name of the params argument.
12670
12671         * expression.cs: Use EmitStoreOpcode to get the right opcode while
12672         initializing the array.
12673
12674         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
12675         we can use this elsewhere.
12676
12677         * statement.cs: Finish implementation of foreach for single
12678         dimension arrays.
12679
12680         * cs-parser.jay: Use an out-of-band stack to pass information
12681         around, I wonder why I need this.
12682
12683         foreach_block: Make the new foreach_block the current_block.
12684
12685         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
12686         function used to return a static Parameters structure.  Used for
12687         empty parameters, as those are created very frequently.
12688
12689         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
12690
12691 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12692
12693         * interface.cs : Default modifier is private, not public. The
12694         make verify test passes again.
12695
12696 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12697
12698         * support.cs (ReflectionParameters): Fix logic to determine
12699         whether the last parameter is a params one. Test 9 passes again.
12700
12701         * delegate.cs (Populate): Register the builders we define with
12702         RegisterParameterForBuilder. Test 19 passes again.
12703
12704         * cs-parser.jay (property_declaration): Reference $6 instead
12705         of $$ to get at the location.
12706
12707         (indexer_declaration): Similar stuff.
12708
12709         (attribute): Ditto.
12710
12711         * class.cs (Property): Register parameters for the Get and Set methods
12712         if they exist. Test 23 passes again.
12713
12714         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
12715         call to EmitArguments as we are sure there aren't any params arguments. 
12716         Test 32 passes again.
12717
12718         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
12719         IndexOutOfRangeException. 
12720
12721         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
12722         Test 33 now passes again.
12723
12724 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
12725
12726         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
12727         broke a bunch of things.  Will have to come up with a better way
12728         of tracking locations.
12729
12730         * statement.cs: Implemented foreach for single dimension arrays.
12731
12732 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12733
12734         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
12735         an error.  This removes the lookup from the critical path.
12736
12737         * cs-parser.jay: Removed use of temporary_loc, which is completely
12738         broken. 
12739
12740 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
12741
12742         * support.cs (ReflectionParameters.ParameterModifier): Report
12743         whether the argument is a PARAMS argument or not.
12744
12745         * class.cs: Set the attribute `ParamArrayAttribute' on the
12746         parameter argument.
12747
12748         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
12749         and cons_param_array_attribute (ConstructorInfo for
12750         ParamArrayAttribute)., 
12751
12752         * codegen.cs: Emit the return using the `Return' statement, that
12753         way we can report the error correctly for missing return values. 
12754
12755         * class.cs (Method.Emit): Clean up.
12756
12757         * expression.cs (Argument.Resolve): Take another argument: the
12758         location where this argument is used.  Notice that this is not
12759         part of the "Argument" class as to reduce the size of the
12760         structure (we know the approximate location anyways).
12761
12762         Test if the argument is a variable-reference, if not, then
12763         complain with a 206.
12764
12765         (Argument.Emit): Emit addresses of variables.
12766
12767         (Argument.FullDesc): Simplify.
12768
12769         (Invocation.DoResolve): Update for Argument.Resolve.
12770
12771         (ElementAccess.DoResolve): ditto.
12772
12773         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
12774         method should be virtual, as this method is always virtual.
12775
12776         (NewDelegate.DoResolve): Update for Argument.Resolve.
12777
12778         * class.cs (ConstructorInitializer.DoResolve): ditto.
12779
12780         * attribute.cs (Attribute.Resolve): ditto.
12781
12782 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
12783
12784         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
12785
12786         * expression.cs (ParameterReference): Drop IStackStorage and implement
12787         IAssignMethod instead. 
12788
12789         (LocalVariableReference): ditto.
12790
12791         * ecore.cs (FieldExpr): Drop IStackStorage and implement
12792         IAssignMethod instead. 
12793
12794 2001-11-13  Miguel de Icaza <miguel@ximian.com>
12795
12796         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
12797         enumerations that are used in heavily used structures derive from
12798         byte in a laughable and pathetic attempt to reduce memory usage.
12799         This is the kind of pre-optimzations that you should not do at
12800         home without adult supervision.
12801
12802         * expression.cs (UnaryMutator): New class, used to handle ++ and
12803         -- separatedly from the other unary operators.  Cleans up the
12804         code, and kills the ExpressionStatement dependency in Unary.
12805
12806         (Unary): Removed `method' and `Arguments' from this class, making
12807         it smaller, and moving it all to SimpleCall, so I can reuse this
12808         code in other locations and avoid creating a lot of transient data
12809         strucutres when not required.
12810
12811         * cs-parser.jay: Adjust for new changes.
12812
12813 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
12814
12815         * enum.cs (Enum.Populate): If there is a failure during
12816         definition, return
12817
12818         * cs-parser.jay (opt_enum_base): we used to catch type errors
12819         here, but this is really incorrect.  The type error should be
12820         catched during semantic analysis.
12821
12822 2001-12-11  Ravi Pratap  <ravi@ximian.com>
12823
12824         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
12825         current_local_parameters as expected since I, in my stupidity, had forgotten
12826         to do this :-)
12827
12828         * attribute.cs (GetValidPlaces): Fix stupid bug.
12829
12830         * class.cs (Method::Emit): Perform check on applicability of attributes.
12831
12832         (Constructor::Emit): Ditto.
12833
12834         (Field::Emit): Ditto.
12835
12836         (Field.Location): Store location information.
12837
12838         (Property, Event, Indexer, Operator): Ditto.
12839
12840         * cs-parser.jay (field_declaration): Pass in location for each field.
12841
12842         * ../errors/cs0592.cs : Add.
12843
12844 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12845
12846         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
12847
12848         (InitCoreTypes): Update accordingly.
12849
12850         (RegisterAttrType, LookupAttr): Implement.
12851
12852         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
12853         info about the same.
12854
12855         (Resolve): Update to populate the above as necessary.
12856
12857         (Error592): Helper.
12858
12859         (GetValidPlaces): Helper to the above.
12860
12861         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
12862
12863         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
12864
12865 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12866
12867         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
12868
12869         * ../errors/cs0617.cs : Add.
12870
12871 2001-11-11  Ravi Pratap  <ravi@ximian.com>
12872
12873         * enum.cs (Emit): Rename to Populate to be more consistent with what
12874         we expect it to do and when exactly it is called.
12875
12876         * class.cs, rootcontext.cs : Update accordingly.
12877
12878         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
12879         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
12880
12881         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
12882
12883         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
12884         of a fieldinfo using the above, when dealing with a FieldBuilder.
12885
12886 2001-11-10  Ravi Pratap  <ravi@ximian.com>
12887
12888         * ../errors/cs0031.cs : Add.
12889
12890         * ../errors/cs1008.cs : Add.
12891
12892         * ../errrors/cs0543.cs : Add.
12893
12894         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
12895         enum type.
12896
12897         (FindMembers): Implement.
12898
12899         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
12900         enums and delegates too.
12901
12902         (enum_types): Rename to builder_to_enum.
12903
12904         (delegate_types): Rename to builder_to_delegate.
12905
12906         * delegate.cs (FindMembers): Implement.
12907
12908 2001-11-09  Ravi Pratap  <ravi@ximian.com>
12909
12910         * typemanager.cs (IsEnumType): Implement.
12911
12912         * enum.cs (Emit): Re-write parts to account for the underlying type
12913         better and perform checking etc.
12914
12915         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
12916         of the underlying type.
12917
12918         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
12919         value
12920
12921         * enum.cs (error31): Helper to report error #31.
12922
12923         * cs-parser.jay (enum_declaration): Store location of each member too.
12924
12925         * enum.cs (member_to_location): New hashtable. 
12926
12927         (AddEnumMember): Update location hashtable.
12928
12929         (Emit): Use the location of each member while reporting errors.
12930
12931 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12932
12933         * cs-parser.jay: A for_initializer if is a
12934         local_variable_declaration really ammount to have an implicit
12935         block with the variable declaration and no initializer for for.
12936
12937         * statement.cs (For.Emit): Cope with null initializers.
12938
12939         This fixes the infinite loop on for initializers.
12940
12941 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
12942
12943         * enum.cs: More cleanup.
12944
12945         * ecore.cs: Remove dead code.
12946
12947         * class.cs (Property.Emit): More simplification.
12948         (Event.Emit): ditto.
12949
12950         Reworked to have less levels of indentation.
12951
12952 2001-11-08  Ravi Pratap  <ravi@ximian.com>
12953
12954         * class.cs (Property): Emit attributes.
12955
12956         (Field): Ditto.
12957
12958         (Event): Ditto.
12959
12960         (Indexer): Ditto.
12961
12962         (Operator): Ditto.
12963
12964         * enum.cs (Emit): Ditto.
12965
12966         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
12967         Enums too.
12968
12969         * class.cs (Field, Event, etc.): Move attribute generation into the
12970         Emit method everywhere.
12971
12972         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
12973         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
12974         as we had no way of defining nested enums !
12975
12976         * rootcontext.cs : Adjust code accordingly.
12977
12978         * typemanager.cs (AddEnumType): To keep track of enum types separately.
12979
12980 2001-11-07  Ravi Pratap  <ravi@ximian.com>
12981
12982         * expression.cs (EvalConstantExpression): Move into ecore.cs
12983
12984         * enum.cs (Enum): Rename some members and make them public and readonly
12985         according to our convention.
12986
12987         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
12988         nothing else.
12989
12990         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
12991
12992         (Enum::Emit): Write a simple version for now which doesn't try to compute
12993         expressions. I shall modify this to be more robust in just a while.
12994
12995         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
12996
12997         (TypeContainer::CloseType): Create the Enum types too.
12998
12999         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
13000
13001         * expression.cs (EvalConstantExpression): Get rid of completely.
13002
13003         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
13004         user-defined values and other cases.
13005
13006         (IsValidEnumLiteral): Helper function.
13007
13008         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
13009         out there in the case we had a literal FieldExpr.
13010
13011         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
13012
13013         (Literalize): Revamp a bit to take two arguments.
13014
13015         (EnumLiteral): New class which derives from Literal to wrap enum literals.
13016
13017 2001-11-06  Ravi Pratap  <ravi@ximian.com>
13018
13019         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
13020
13021         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
13022
13023         (Resolve): Use the above to ensure we have proper initializers.
13024
13025 2001-11-05  Ravi Pratap  <ravi@ximian.com>
13026
13027         * expression.cs (Expression::EvalConstantExpression): New method to 
13028         evaluate constant expressions.
13029
13030         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
13031
13032 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
13033
13034         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
13035         in an array.
13036
13037         (Binary.ResolveOperator): Handle operator != (object a, object b)
13038         and operator == (object a, object b);
13039
13040         (Binary.DoNumericPromotions): Indicate whether the numeric
13041         promotion was possible.
13042
13043         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
13044         Implement.  
13045
13046         Made the ArrayAccess implement interface IAssignMethod instead of
13047         IStackStore as the order in which arguments are passed reflects
13048         this.
13049
13050         * assign.cs: Instead of using expr.ExprClass to select the way of
13051         assinging, probe for the IStackStore/IAssignMethod interfaces.
13052
13053         * typemanager.cs: Load InitializeArray definition.
13054
13055         * rootcontext.cs (RootContext.MakeStaticData): Used to define
13056         static data that can be used to initialize arrays. 
13057
13058 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
13059
13060         * expression.cs: Handle operator== and operator!= for booleans.
13061
13062         (Conditioal.Reduce): Implement reducer for the ?: operator.
13063
13064         (Conditional.Resolve): Implement dead code elimination.
13065
13066         (Binary.Resolve): Catch string literals and return a new
13067         concatenated string.
13068
13069         (Unary.Reduce): Implement reduction of unary expressions.
13070
13071         * ecore.cs: Split out the expression core handling here.
13072
13073         (Expression.Reduce): New method used to perform constant folding
13074         and CSE.  This is needed to support constant-expressions. 
13075
13076         * statement.cs (Statement.EmitBoolExpression): Pass true and false
13077         targets, and optimize for !x.
13078
13079 2001-11-04  Ravi Pratap  <ravi@ximian.com>
13080
13081         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
13082         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
13083         set custom atttributes.
13084
13085         * literal.cs (Literal::GetValue): New abstract method to return the actual
13086         value of the literal, cast as an object.
13087
13088         (*Literal): Implement GetValue method.
13089
13090         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
13091         expressions to the arraylist but objects of type Argument.
13092
13093         * class.cs (TypeContainer::Emit): Emit our attributes too.
13094
13095         (Method::Emit, Constructor::Emit): Ditto.
13096
13097         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
13098         to be ignoring earlier.
13099
13100 2001-11-03  Ravi Pratap  <ravi@ximian.com>
13101
13102         * attribute.cs (AttributeSection::Define): Implement to do the business
13103         of constructing a CustomAttributeBuilder.
13104
13105         (Attribute): New trivial class. Increases readability of code.  
13106
13107         * cs-parser.jay : Update accordingly.
13108
13109         (positional_argument_list, named_argument_list, named_argument): New rules
13110
13111         (attribute_arguments): Use the above so that we are more correct.
13112
13113 2001-11-02  Ravi Pratap  <ravi@ximian.com>
13114
13115         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
13116         to perform all checks for a method with a params parameter.
13117
13118         (Invocation::OverloadResolve): Update to use the above method and therefore
13119         cope correctly with params method invocations.
13120
13121         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
13122         params too.
13123
13124         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
13125         constructors in our parent too because we can't afford to miss out on 
13126         protected ones ;-)
13127
13128         * attribute.cs (AttributeSection): New name for the class Attribute
13129
13130         Other trivial changes to improve readability.
13131
13132         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
13133         use the new class names.
13134
13135 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13136
13137         * class.cs (Method::Define): Complete definition for params types too
13138
13139         (Indexer::Define): Ditto.
13140
13141         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
13142         Cope everywhere with a request for info about the array parameter.
13143
13144 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13145
13146         * tree.cs (RecordNamespace): Fix up to check for the correct key.
13147
13148         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
13149         local_variable_type to extract the string corresponding to the type.
13150
13151         (local_variable_type): Fixup the action to use the new helper method.
13152
13153         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
13154         go.
13155
13156         * expression.cs : Clean out code which uses the above.
13157
13158 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13159
13160         * typemanager.cs (RegisterMethod): Check if we already have an existing key
13161         and bale out if necessary by returning a false.
13162
13163         (RegisterProperty): Ditto.
13164
13165         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
13166         and print out appropriate error messages.
13167
13168         * interface.cs (everywhere): Ditto.
13169
13170         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
13171         location to constructor.
13172
13173         * class.cs (Property, Event, Indexer): Update accordingly.
13174
13175         * ../errors/cs111.cs : Added.
13176
13177         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
13178         of a method, as laid down by the spec.
13179
13180         (Invocation::OverloadResolve): Use the above method.
13181
13182 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13183
13184         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
13185         now take a TypeContainer and a Parameters object.
13186
13187         (ParameterData): Modify return type of ParameterModifier method to be 
13188         Parameter.Modifier and not a string.
13189
13190         (ReflectionParameters, InternalParameters): Update accordingly.
13191
13192         * expression.cs (Argument::GetParameterModifier): Same here.
13193
13194         * support.cs (InternalParameters::ParameterType): Find a better way of determining
13195         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
13196         symbol in it at all so maybe this is only for now.
13197
13198 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13199
13200         * support.cs (InternalParameters): Constructor now takes an extra argument 
13201         which is the actual Parameters class.
13202
13203         (ParameterDesc): Update to provide info on ref/out modifiers.
13204
13205         * class.cs (everywhere): Update call to InternalParameters to pass in
13206         the second argument too.
13207
13208         * support.cs (ParameterData): Add ParameterModifier, which is a method 
13209         to return the modifier info [ref/out etc]
13210
13211         (InternalParameters, ReflectionParameters): Implement the above.
13212
13213         * expression.cs (Argument::ParameterModifier): Similar function to return
13214         info about the argument's modifiers.
13215
13216         (Invocation::OverloadResolve): Update to take into account matching modifiers 
13217         too.
13218
13219         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
13220         a new SetFormalParameters object which we pass to InternalParameters.
13221
13222 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13223
13224         * expression.cs (NewArray): Merge into the ArrayCreation class.
13225
13226 2001-10-29  Ravi Pratap  <ravi@ximian.com>
13227
13228         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
13229         NewUserdefinedArray into one as there wasn't much of a use in having
13230         two separate ones.
13231
13232         * expression.cs (Argument): Change field's name to ArgType from Type.
13233
13234         (Type): New readonly property which returns the proper type, taking into 
13235         account ref/out modifiers.
13236
13237         (everywhere): Adjust code accordingly for the above.
13238
13239         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
13240         whether we are emitting for a ref or out parameter.
13241
13242         * expression.cs (Argument::Emit): Use the above field to set the state.
13243
13244         (LocalVariableReference::Emit): Update to honour the flag and emit the
13245         right stuff.
13246
13247         * parameter.cs (Attributes): Set the correct flags for ref parameters.
13248
13249         * expression.cs (Argument::FullDesc): New function to provide a full desc.
13250
13251         * support.cs (ParameterData): Add method ParameterDesc to the interface.
13252
13253         (ReflectionParameters, InternalParameters): Implement the above method.
13254
13255         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
13256         reporting errors.
13257
13258         (Invocation::FullMethodDesc): Ditto. 
13259
13260 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
13261
13262         * cs-parser.jay: Add extra production for the second form of array
13263         creation. 
13264
13265         * expression.cs (ArrayCreation): Update to reflect the above
13266         change. 
13267
13268         * Small changes to prepare for Array initialization.
13269
13270 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
13271
13272         * typemanager.cs (ImplementsInterface): interface might be null;
13273         Deal with this problem;
13274
13275         Also, we do store negative hits on the cache (null values), so use
13276         this instead of calling t.GetInterfaces on the type everytime.
13277
13278 2001-10-28  Ravi Pratap  <ravi@ximian.com>
13279
13280         * typemanager.cs (IsBuiltinType): New method to help determine the same.
13281
13282         * expression.cs (New::DoResolve): Get rid of array creation code and instead
13283         split functionality out into different classes.
13284
13285         (New::FormArrayType): Move into NewBuiltinArray.
13286
13287         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
13288         quite useless.
13289
13290         (NewBuiltinArray): New class to handle creation of built-in arrays.
13291
13292         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
13293         account creation of one-dimensional arrays.
13294
13295         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
13296
13297         (NewUserdefinedArray::DoResolve): Implement.
13298
13299         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
13300
13301         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
13302         we maintain inside the TypeManager. This is necessary to perform lookups on the
13303         module builder.
13304
13305         (LookupType): Update to perform GetType on the module builders too.     
13306
13307         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
13308
13309         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
13310
13311 2001-10-23  Ravi Pratap  <ravi@ximian.com>
13312
13313         * expression.cs (New::DoResolve): Implement guts of array creation.
13314
13315         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
13316
13317 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
13318
13319         * expression.cs: Fix bug I introduced lsat night that broke
13320         Delegates. 
13321
13322         (Expression.Resolve): Report a 246 error (can not resolve name)
13323         if we find a SimpleName in the stream.
13324
13325         (Expression.ResolveLValue): Ditto.
13326
13327         (Expression.ResolveWithSimpleName): This function is a variant of
13328         ResolveName, this one allows SimpleNames to be returned without a
13329         warning.  The only consumer of SimpleNames is MemberAccess
13330
13331 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
13332
13333         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
13334         might arrive here.  I have my doubts that this is correct.
13335
13336         * statement.cs (Lock): Implement lock statement.
13337
13338         * cs-parser.jay: Small fixes to support `lock' and `using'
13339
13340         * cs-tokenizer.cs: Remove extra space
13341
13342         * driver.cs: New flag --checked, allows to turn on integer math
13343         checking. 
13344
13345         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
13346         Threading.Monitor.Exit 
13347
13348 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
13349
13350         * expression.cs (IndexerAccess::DoResolveLValue): Set the
13351         Expression Class to be IndexerAccess.
13352
13353         Notice that Indexer::DoResolve sets the eclass to Value.
13354
13355 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
13356
13357         * class.cs (TypeContainer::Emit): Emit code for indexers.
13358
13359         * assign.cs (IAssignMethod): New interface implemented by Indexers
13360         and Properties for handling assignment.
13361
13362         (Assign::Emit): Simplify and reuse code. 
13363
13364         * expression.cs (IndexerAccess, PropertyExpr): Implement
13365         IAssignMethod, clean up old code. 
13366
13367 2001-10-22  Ravi Pratap  <ravi@ximian.com>
13368
13369         * typemanager.cs (ImplementsInterface): New method to determine if a type
13370         implements a given interface. Provides a nice cache too.
13371
13372         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
13373         method.
13374
13375         (ConvertReferenceExplicit): Ditto.
13376
13377         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
13378         various methods, with correct names etc.
13379
13380         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
13381         Operator.UnaryNegation.
13382
13383         * cs-parser.jay (operator_declarator): Be a little clever in the case where
13384         we have a unary plus or minus operator.
13385
13386         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
13387         UnaryMinus.
13388
13389         * everywhere : update accordingly.
13390
13391         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
13392         respectively.
13393
13394         * class.cs (Method::Define): For the case where we are implementing a method
13395         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
13396         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
13397
13398 2001-10-21  Ravi Pratap  <ravi@ximian.com>
13399
13400         * interface.cs (FindMembers): Implement to work around S.R.E
13401         lameness.
13402
13403         * typemanager.cs (IsInterfaceType): Implement.
13404
13405         (FindMembers): Update to handle interface types too.
13406
13407         * expression.cs (ImplicitReferenceConversion): Re-write bits which
13408         use IsAssignableFrom as that is not correct - it doesn't work.
13409
13410         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
13411         and accordingly override EmitStatement.
13412
13413         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
13414         using the correct logic :-)
13415
13416 2001-10-19  Ravi Pratap  <ravi@ximian.com>
13417
13418         * ../errors/cs-11.cs : Add to demonstrate error -11 
13419
13420 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
13421
13422         * assign.cs (Assign::Resolve): Resolve right hand side first, and
13423         then pass this as a hint to ResolveLValue.
13424
13425         * expression.cs (FieldExpr): Add Location information
13426
13427         (FieldExpr::LValueResolve): Report assignment to readonly
13428         variable. 
13429
13430         (Expression::ExprClassFromMemberInfo): Pass location information.
13431
13432         (Expression::ResolveLValue): Add new method that resolves an
13433         LValue. 
13434
13435         (Expression::DoResolveLValue): Default invocation calls
13436         DoResolve. 
13437
13438         (Indexers): New class used to keep track of indexers in a given
13439         Type. 
13440
13441         (IStackStore): Renamed from LValue, as it did not really describe
13442         what this did.  Also ResolveLValue is gone from this interface and
13443         now is part of Expression.
13444
13445         (ElementAccess): Depending on the element access type
13446
13447         * typemanager.cs: Add `indexer_name_type' as a Core type
13448         (System.Runtime.CompilerServices.IndexerNameAttribute)
13449
13450         * statement.cs (Goto): Take a location.
13451
13452 2001-10-18  Ravi Pratap  <ravi@ximian.com>
13453
13454         * delegate.cs (Delegate::VerifyDelegate): New method to verify
13455         if two delegates are compatible.
13456
13457         (NewDelegate::DoResolve): Update to take care of the case when
13458         we instantiate a delegate from another delegate.
13459
13460         * typemanager.cs (FindMembers): Don't even try to look up members
13461         of Delegate types for now.
13462
13463 2001-10-18  Ravi Pratap  <ravi@ximian.com>
13464
13465         * delegate.cs (NewDelegate): New class to take care of delegate
13466         instantiation.
13467
13468         * expression.cs (New): Split the delegate related code out into 
13469         the NewDelegate class.
13470
13471         * delegate.cs (DelegateInvocation): New class to handle delegate 
13472         invocation.
13473
13474         * expression.cs (Invocation): Split out delegate related code into
13475         the DelegateInvocation class.
13476
13477 2001-10-17  Ravi Pratap  <ravi@ximian.com>
13478
13479         * expression.cs (New::DoResolve): Implement delegate creation fully
13480         and according to the spec.
13481
13482         (New::DoEmit): Update to handle delegates differently.
13483
13484         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
13485         because of which we were printing out arguments in reverse order !
13486
13487         * delegate.cs (VerifyMethod): Implement to check if the given method
13488         matches the delegate.
13489
13490         (FullDelegateDesc): Implement.
13491
13492         (VerifyApplicability): Implement.
13493
13494         * expression.cs (Invocation::DoResolve): Update to accordingly handle
13495         delegate invocations too.
13496
13497         (Invocation::Emit): Ditto.
13498
13499         * ../errors/cs1593.cs : Added.
13500
13501         * ../errors/cs1594.cs : Added.
13502
13503         * delegate.cs (InstanceExpression, TargetMethod): New properties.
13504
13505 2001-10-16  Ravi Pratap  <ravi@ximian.com>
13506
13507         * typemanager.cs (intptr_type): Core type for System.IntPtr
13508
13509         (InitCoreTypes): Update for the same.
13510
13511         (iasyncresult_type, asynccallback_type): Ditto.
13512
13513         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
13514         correct.
13515
13516         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
13517         too.
13518
13519         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
13520         the builders for the 4 members of a delegate type :-)
13521
13522         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
13523         type.
13524
13525         * expression.cs (New::DoResolve): Implement guts for delegate creation.
13526
13527         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
13528
13529 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
13530
13531         * statement.cs (Break::Emit): Implement.   
13532         (Continue::Emit): Implement.
13533
13534         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13535         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13536         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13537         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
13538         end loop
13539
13540         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
13541         properties that track the label for the current loop (begin of the
13542         loop and end of the loop).
13543
13544 2001-10-15  Ravi Pratap  <ravi@ximian.com>
13545
13546         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
13547         use of emitting anything at all.
13548
13549         * class.cs, rootcontext.cs : Get rid of calls to the same.
13550
13551         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
13552
13553         (Populate): Define the constructor correctly and set the implementation
13554         attributes.
13555
13556         * typemanager.cs (delegate_types): New hashtable to hold delegates that
13557         have been defined.
13558
13559         (AddDelegateType): Implement.
13560
13561         (IsDelegateType): Implement helper method.
13562
13563         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
13564
13565         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
13566         and accordingly handle it.
13567
13568         * delegate.cs (Populate): Take TypeContainer argument.
13569         Implement bits to define the Invoke method. However, I still haven't figured out
13570         how to take care of the native int bit :-(
13571
13572         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
13573         Qualify the name of the delegate, not its return type !
13574
13575         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
13576         conversion.
13577
13578         (StandardConversionExists): Checking for array types turns out to be recursive.
13579
13580         (ConvertReferenceExplicit): Implement array conversion.
13581
13582         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
13583
13584 2001-10-12  Ravi Pratap  <ravi@ximian.com>
13585
13586         * cs-parser.jay (delegate_declaration): Store the fully qualified
13587         name as it is a type declaration.
13588
13589         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
13590         readonly.
13591
13592         (DefineDelegate): Renamed from Define. Does the same thing essentially,
13593         as TypeContainer::DefineType.
13594
13595         (Populate): Method in which all the definition of the various methods (Invoke)
13596         etc is done.
13597
13598         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
13599         see.
13600
13601         (CloseDelegate): Finally creates the delegate.
13602
13603         * class.cs (TypeContainer::DefineType): Update to define delegates.
13604         (Populate, Emit and CloseType): Do the same thing here too.
13605
13606         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
13607         delegates in all these operations.
13608
13609 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
13610
13611         * expression.cs: LocalTemporary: a new expression used to
13612         reference a temporary that has been created.
13613
13614         * assign.cs: Handle PropertyAccess back here, so that we can
13615         provide the proper semantic access to properties.
13616
13617         * expression.cs (Expression::ConvertReferenceExplicit): Implement
13618         a few more explicit conversions. 
13619
13620         * modifiers.cs: `NEW' modifier maps to HideBySig.
13621
13622         * expression.cs (PropertyExpr): Make this into an
13623         ExpressionStatement, and support the EmitStatement code path. 
13624
13625         Perform get/set error checking, clean up the interface.
13626
13627         * assign.cs: recognize PropertyExprs as targets, and if so, turn
13628         them into toplevel access objects.
13629
13630 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
13631
13632         * expression.cs: PropertyExpr::PropertyExpr: use work around the
13633         SRE.
13634
13635         * typemanager.cs: Keep track here of our PropertyBuilders again to
13636         work around lameness in SRE.
13637
13638 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
13639
13640         * expression.cs (LValue::LValueResolve): New method in the
13641         interface, used to perform a second resolution pass for LValues. 
13642
13643         (This::DoResolve): Catch the use of this in static methods.
13644
13645         (This::LValueResolve): Implement.
13646
13647         (This::Store): Remove warning, assigning to `this' in structures
13648         is 
13649
13650         (Invocation::Emit): Deal with invocation of
13651         methods on value types.  We need to pass the address to structure
13652         methods rather than the object itself.  (The equivalent code to
13653         emit "this" for structures leaves the entire structure on the
13654         stack instead of a pointer to it). 
13655
13656         (ParameterReference::DoResolve): Compute the real index for the
13657         argument based on whether the method takes or not a `this' pointer
13658         (ie, the method is static).
13659
13660         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
13661         value types returned from functions when we need to invoke a
13662         method on the sturcture.
13663
13664
13665 2001-10-11  Ravi Pratap  <ravi@ximian.com>
13666
13667         * class.cs (TypeContainer::DefineType): Method to actually do the business of
13668         defining the type in the Modulebuilder or Typebuilder. This is to take
13669         care of nested types which need to be defined on the TypeBuilder using
13670         DefineNestedMethod.
13671
13672         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
13673         methods in RootContext, only ported to be part of TypeContainer.
13674
13675         (TypeContainer::GetInterfaceOrClass): Ditto.
13676
13677         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
13678
13679         * interface.cs (Interface::DefineInterface): New method. Does exactly
13680         what RootContext.CreateInterface did earlier, only it takes care of nested types 
13681         too.
13682
13683         (Interface::GetInterfaces): Move from RootContext here and port.
13684
13685         (Interface::GetInterfaceByName): Same here.
13686
13687         * rootcontext.cs (ResolveTree): Re-write.
13688
13689         (PopulateTypes): Re-write.
13690
13691         * class.cs (TypeContainer::Populate): Populate nested types too.
13692         (TypeContainer::Emit): Emit nested members too.
13693
13694         * typemanager.cs (AddUserType): Do not make use of the FullName property,
13695         instead just use the name argument passed in as it is already fully
13696         qualified.
13697
13698         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
13699         to TypeContainer mapping to see if a type is user-defined.
13700
13701         * class.cs (TypeContainer::CloseType): Implement. 
13702
13703         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
13704         the default constructor.
13705
13706         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
13707         twice.
13708
13709         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
13710
13711         * interface.cs (CloseType): Create the type here.
13712
13713         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
13714         the hierarchy.
13715
13716         Remove all the methods which are now in TypeContainer.
13717
13718 2001-10-10  Ravi Pratap  <ravi@ximian.com>
13719
13720         * delegate.cs (Define): Re-write bits to define the delegate
13721         correctly.
13722
13723 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
13724
13725         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
13726
13727         * expression.cs (ImplicitReferenceConversion): handle null as well
13728         as a source to convert to any reference type.
13729
13730         * statement.cs (Return): Perform any implicit conversions to
13731         expected return type.  
13732
13733         Validate use of return statement.  
13734
13735         * codegen.cs (EmitContext): Pass the expected return type here.
13736
13737         * class.cs (Method, Constructor, Property): Pass expected return
13738         type to EmitContext.
13739
13740 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
13741
13742         * expression.cs: Make DoResolve take an EmitContext instead of a
13743         TypeContainer.
13744
13745         Replaced `l' and `location' for `loc', for consistency.
13746
13747         (Error, Warning): Remove unneeded Tc argument.
13748
13749         * assign.cs, literal.cs, constant.cs: Update to new calling
13750         convention. 
13751
13752         * codegen.cs: EmitContext now contains a flag indicating whether
13753         code is being generated in a static method or not.
13754
13755         * cs-parser.jay: DecomposeQI, new function that replaces the old
13756         QualifiedIdentifier.  Now we always decompose the assembled
13757         strings from qualified_identifier productions into a group of
13758         memberaccesses.
13759
13760 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
13761
13762         * rootcontext.cs: Deal with field-less struct types correctly now
13763         by passing the size option to Define Type.
13764
13765         * class.cs: Removed hack that created one static field. 
13766
13767 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13768
13769         * statement.cs: Moved most of the code generation here. 
13770
13771 2001-10-09  Ravi Pratap  <ravi@ximian.com>
13772
13773         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
13774         seem very right.
13775
13776         (ElementAccess): Remove useless bits for now - keep checks as the spec
13777         says.
13778
13779 2001-10-08  Ravi Pratap  <ravi@ximian.com>
13780
13781         * expression.cs (ElementAccess::DoResolve): Remove my crap code
13782         and start performing checks according to the spec.
13783
13784 2001-10-07  Ravi Pratap  <ravi@ximian.com>
13785
13786         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
13787         rank_specifiers instead.
13788
13789         (rank_specifiers): Change the order in which the rank specifiers are stored
13790
13791         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
13792
13793         * expression.cs (ElementAccess): Implement the LValue interface too.
13794
13795 2001-10-06  Ravi Pratap  <ravi@ximian.com>
13796
13797         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
13798         except that user defined conversions are not included.
13799
13800         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
13801         perform the conversion of the return type, if necessary.
13802
13803         (New::DoResolve): Check whether we are creating an array or an object
13804         and accordingly do the needful.
13805
13806         (New::Emit): Same here.
13807
13808         (New::DoResolve): Implement guts of array creation.
13809
13810         (New::FormLookupType): Helper function.
13811
13812 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13813
13814         * codegen.cs: Removed most of the code generation here, and move the
13815         corresponding code generation bits to the statement classes. 
13816
13817         Added support for try/catch/finalize and throw.
13818
13819         * cs-parser.jay: Added support for try/catch/finalize.
13820
13821         * class.cs: Catch static methods having the flags override,
13822         virtual or abstract.
13823
13824         * expression.cs (UserCast): This user cast was not really doing
13825         what it was supposed to do.  Which is to be born in fully resolved
13826         state.  Parts of the resolution were being performed at Emit time! 
13827
13828         Fixed this code.
13829
13830 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13831
13832         * expression.cs: Implicity convert the result from UserCast.
13833
13834 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13835
13836         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
13837         prevented it from working correctly. 
13838
13839         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
13840         merely ConvertImplicit.
13841
13842 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13843
13844         * typemanager.cs: Make the LookupTypeContainer function static,
13845         and not per-instance.  
13846
13847         * class.cs: Make static FindMembers (the one that takes a Type
13848         argument). 
13849
13850         * codegen.cs: Add EmitForeach here.
13851
13852         * cs-parser.jay: Make foreach a toplevel object instead of the
13853         inline expansion, as we need to perform semantic analysis on it. 
13854
13855 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13856
13857         * expression.cs (Expression::ImplicitUserConversion): Rename to
13858         UserDefinedConversion.
13859
13860         (Expression::UserDefinedConversion): Take an extra argument specifying 
13861         whether we look for explicit user conversions too.
13862
13863         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
13864
13865         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
13866
13867         (ExplicitUserConversion): Make it a call to UserDefinedConversion
13868         with the appropriate arguments.
13869
13870         * cs-parser.jay (cast_expression): Record location too.
13871
13872         * expression.cs (Cast): Record location info.
13873
13874         (Expression::ConvertExplicit): Take location argument.
13875
13876         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
13877         to determine if we are doing explicit conversions.
13878
13879         (UserCast::Emit): Update accordingly.
13880
13881         (Expression::ConvertExplicit): Report an error if everything fails.
13882
13883         * ../errors/cs0030.cs : Add.
13884
13885 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
13886
13887         * modifiers.cs: If the ABSTRACT keyword is present, also set the
13888         virtual and newslot bits. 
13889
13890         * class.cs (TypeContainer::RegisterRequiredImplementations):
13891         Record methods we need.
13892
13893         (TypeContainer::MakeKey): Helper function to make keys for
13894         MethodBases, since the Methodbase key is useless.
13895
13896         (TypeContainer::Populate): Call RegisterRequiredImplementations
13897         before defining the methods.   
13898
13899         Create a mapping for method_builders_to_methods ahead of time
13900         instead of inside a tight loop.
13901
13902         (::RequireMethods):  Accept an object as the data to set into the
13903         hashtable so we can report interface vs abstract method mismatch.
13904
13905 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13906
13907         * report.cs: Make all of it static.
13908
13909         * rootcontext.cs: Drop object_type and value_type computations, as
13910         we have those in the TypeManager anyways.
13911
13912         Drop report instance variable too, now it is a global.
13913
13914         * driver.cs: Use try/catch on command line handling.
13915
13916         Add --probe option to debug the error reporting system with a test
13917         suite. 
13918
13919         * report.cs: Add support for exiting program when a probe
13920         condition is reached.
13921
13922 2001-10-03  Ravi Pratap  <ravi@ximian.com>
13923
13924         * expression.cs (Binary::DoNumericPromotions): Fix the case when
13925         we do a forcible conversion regardless of type, to check if 
13926         ForceConversion returns a null.
13927
13928         (Binary::error19): Use location to report error.
13929
13930         (Unary::error23): Use location here too.
13931
13932         * ../errors/cs0019.cs : Check in.
13933
13934         * ../errors/cs0023.cs : Check in.
13935
13936         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
13937         case of a non-null MethodInfo object with a length of 0 !
13938
13939         (Binary::ResolveOperator): Flag error if overload resolution fails to find
13940         an applicable member - according to the spec :-)
13941         Also fix logic to find members in base types.
13942
13943         (Unary::ResolveOperator): Same here.
13944
13945         (Unary::report23): Change name to error23 and make first argument a TypeContainer
13946         as I was getting thoroughly confused between this and error19 :-)
13947
13948         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
13949         (::FindMostEncompassedType): Implement.
13950         (::FindMostEncompassingType): Implement.
13951         (::StandardConversionExists): Implement.
13952
13953         (UserImplicitCast): Re-vamp. We now need info about most specific
13954         source and target types so that we can do the necessary conversions.
13955
13956         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
13957         mathematical union with no duplicates.
13958
13959 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13960
13961         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
13962         in order from base classes to child classes, so that we can in
13963         child classes look up in our parent for method names and
13964         attributes (required for handling abstract, virtual, new, override
13965         constructs: we need to instrospect our base class, and if we dont
13966         populate the classes in order, the introspection might be
13967         incorrect.  For example, a method could query its parent before
13968         the parent has any methods and would determine that the parent has
13969         no abstract methods (while it could have had them)).
13970
13971         (RootContext::CreateType): Record the order in which we define the
13972         classes.
13973
13974 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
13975
13976         * class.cs (TypeContainer::Populate): Also method definitions can
13977         fail now, keep track of this.
13978
13979         (TypeContainer::FindMembers): Implement support for
13980         DeclaredOnly/noDeclaredOnly flag.
13981
13982         (Constructor::Emit) Return the ConstructorBuilder.
13983
13984         (Method::Emit) Return the MethodBuilder. 
13985         Check for abstract or virtual methods to be public.
13986
13987         * rootcontext.cs (RootContext::CreateType): Register all the
13988         abstract methods required for the class to be complete and the
13989         interface methods that must be implemented. 
13990
13991         * cs-parser.jay: Report error 501 (method requires body if it is
13992         not marked abstract or extern).
13993
13994         * expression.cs (TypeOf::Emit): Implement.
13995
13996         * typemanager.cs: runtime_handle_type, new global type.
13997
13998         * class.cs (Property::Emit): Generate code for properties.
13999
14000 2001-10-02  Ravi Pratap  <ravi@ximian.com>
14001
14002         * expression.cs (Unary::ResolveOperator): Find operators on base type
14003         too - we now conform exactly to the spec.
14004
14005         (Binary::ResolveOperator): Same here.
14006
14007         * class.cs (Operator::Define): Fix minor quirk in the tests.
14008
14009         * ../errors/cs0215.cs : Added.
14010
14011         * ../errors/cs0556.cs : Added.
14012
14013         * ../errors/cs0555.cs : Added.
14014
14015 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14016
14017         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
14018         single integer which is really efficient
14019
14020 2001-10-01  Ravi Pratap  <ravi@ximian.com>
14021
14022         *  expression.cs (Expression::ImplicitUserConversion): Use location
14023         even in the case when we are examining True operators.
14024  
14025         * class.cs (Operator::Define): Perform extensive checks to conform
14026         with the rules for operator overloading in the spec.
14027
14028         * expression.cs (Expression::ImplicitReferenceConversion): Implement
14029         some of the other conversions mentioned in the spec.
14030
14031         * typemanager.cs (array_type): New static member for the System.Array built-in
14032         type.
14033
14034         (cloneable_interface): For System.ICloneable interface.
14035
14036         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
14037         we start resolving the tree and populating types.
14038
14039         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
14040  
14041 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14042
14043         * expression.cs (Expression::ExprClassFromMemberInfo,
14044         Expression::Literalize): Create literal expressions from
14045         FieldInfos which are literals.
14046
14047         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
14048         type casts, because they were wrong.  The test suite in tests
14049         caught these ones.
14050
14051         (ImplicitNumericConversion): ushort to ulong requires a widening
14052         cast. 
14053
14054         Int32 constant to long requires widening cast as well.
14055
14056         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
14057         for integers because the type on the stack is not i4.
14058
14059 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
14060
14061         * expression.cs (report118): require location argument. 
14062
14063         * parameter.cs: Do not dereference potential null value.
14064
14065         * class.cs: Catch methods that lack the `new' keyword when
14066         overriding a name.  Report warnings when `new' is used without
14067         anything being there to override.
14068
14069         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
14070
14071         * class.cs: Only add constructor to hashtable if it is non-null
14072         (as now constructors can fail on define).
14073
14074         (TypeManager, Class, Struct): Take location arguments.
14075
14076         Catch field instance initialization in structs as errors.
14077
14078         accepting_filter: a new filter for FindMembers that is static so
14079         that we dont create an instance per invocation.
14080
14081         (Constructor::Define): Catch errors where a struct constructor is
14082         parameterless 
14083
14084         * cs-parser.jay: Pass location information for various new
14085         constructs. 
14086
14087         * delegate.cs (Delegate): take a location argument.
14088
14089         * driver.cs: Do not call EmitCode if there were problesm in the
14090         Definition of the types, as many Builders wont be there. 
14091
14092         * decl.cs (Decl::Decl): Require a location argument.
14093
14094         * cs-tokenizer.cs: Handle properly hex constants that can not fit
14095         into integers, and find the most appropiate integer for it.
14096
14097         * literal.cs: Implement ULongLiteral.
14098
14099         * rootcontext.cs: Provide better information about the location of
14100         failure when CreateType fails.
14101
14102 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
14103
14104         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
14105         as well.
14106
14107         * expression.cs (Binary::CheckShiftArguments): Add missing type
14108         computation.
14109         (Binary::ResolveOperator): Add type to the logical and and logical
14110         or, Bitwise And/Or and Exclusive Or code paths, it was missing
14111         before.
14112
14113         (Binary::DoNumericPromotions): In the case where either argument
14114         is ulong (and most signed types combined with ulong cause an
14115         error) perform implicit integer constant conversions as well.
14116
14117 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14118
14119         * expression.cs (UserImplicitCast): Method should always be
14120         non-null. 
14121         (Invocation::BetterConversion): Simplified test for IntLiteral.
14122
14123         (Expression::ImplicitNumericConversion): Split this routine out.
14124         Put the code that performs implicit constant integer conversions
14125         here. 
14126
14127         (Expression::Resolve): Become a wrapper around DoResolve so we can
14128         check eclass and type being set after resolve.
14129
14130         (Invocation::Badness): Remove this dead function
14131
14132         (Binary::ResolveOperator): Do not compute the expensive argumnets
14133         unless we have a union for it.
14134
14135         (Probe::Emit): Is needs to do an isinst and then
14136         compare against null.
14137
14138         (::CanConvert): Added Location argument.  If the Location argument
14139         is null (Location.Null), then we do not report errors.  This is
14140         used by the `probe' mechanism of the Explicit conversion.  We do
14141         not want to generate an error for something that the user
14142         explicitly requested to be casted.  But the pipeline for an
14143         explicit cast first tests for potential implicit casts.
14144
14145         So for now, if the Location is null, it means `Probe only' to
14146         avoid adding another argument.   Might have to revise this
14147         strategy later.
14148
14149         (ClassCast): New class used to type cast objects into arbitrary
14150         classes (used in Explicit Reference Conversions).
14151
14152         Implement `as' as well.
14153
14154         Reverted all the patches from Ravi below: they were broken:
14155
14156                 * The use of `level' as a mechanism to stop recursive
14157                   invocations is wrong.  That was there just to catch the
14158                   bug with a strack trace but not as a way of addressing
14159                   the problem.
14160
14161                   To fix the problem we have to *understand* what is going
14162                   on and the interactions and come up with a plan, not
14163                   just get things going.
14164
14165                 * The use of the type conversion cache that I proposed
14166                   last night had an open topic: How does this work across
14167                   protection domains.  A user defined conversion might not
14168                   be public in the location where we are applying the
14169                   conversion, a different conversion might be selected
14170                   (ie, private A->B (better) but public B->A (worse),
14171                   inside A, A->B applies, but outside it, B->A will
14172                   apply).
14173
14174                 * On top of that (ie, even if the above is solved),
14175                   conversions in a cache need to be abstract.  Ie, `To
14176                   convert from an Int to a Short use an OpcodeCast', not
14177                   `To convert from an Int to a Short use the OpcodeCast on
14178                   the variable 5' (which is what this patch was doing).
14179
14180 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14181
14182         * expression.cs (Invocation::ConversionExists): Re-write to use
14183         the conversion cache
14184
14185         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
14186         cache all conversions done, not just user-defined ones.
14187
14188         (Invocation::BetterConversion): The real culprit. Use ConversionExists
14189         to determine if a conversion exists instead of acutually trying to 
14190         perform the conversion. It's faster too.
14191
14192         (Expression::ConvertExplicit): Modify to use ConversionExists to check
14193         and only then attempt the implicit conversion.
14194
14195 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14196
14197         * expression.cs (ConvertImplicit): Use a cache for conversions
14198         already found. Check level of recursion and bail out if necessary.
14199
14200 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14201
14202         * typemanager.cs (string_concat_string_string, string_concat_object_object):
14203         Export standard methods that we expect for string operations.
14204
14205         * statement.cs (Block::UsageWarning): Track usage of variables and
14206         report the errors for not used variables.
14207
14208         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
14209         operator. 
14210
14211 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14212
14213         * codegen.cs: remove unnneded code 
14214
14215         * expression.cs: Removed BuiltinTypeAccess class
14216
14217         Fix the order in which implicit conversions are
14218         done.  
14219
14220         The previous fixed dropped support for boxed conversions (adding a
14221         test to the test suite now)
14222
14223         (UserImplicitCast::CanConvert): Remove test for source being null,
14224         that code is broken.  We should not feed a null to begin with, if
14225         we do, then we should track the bug where the problem originates
14226         and not try to cover it up here.
14227
14228         Return a resolved expression of type UserImplicitCast on success
14229         rather than true/false.  Ravi: this is what I was talking about,
14230         the pattern is to use a static method as a "constructor" for
14231         objects. 
14232
14233         Also, do not create arguments until the very last minute,
14234         otherwise we always create the arguments even for lookups that
14235         will never be performed. 
14236
14237         (UserImplicitCast::Resolve): Eliminate, objects of type
14238         UserImplicitCast are born in a fully resolved state. 
14239
14240         * typemanager.cs (InitCoreTypes): Init also value_type
14241         (System.ValueType). 
14242
14243         * expression.cs (Cast::Resolve): First resolve the child expression.
14244
14245         (LValue): Add new method AddressOf to be used by
14246         the `&' operator.  
14247
14248         Change the argument of Store to take an EmitContext instead of an
14249         ILGenerator, because things like FieldExpr need to be able to call
14250         their children expression to generate the instance code. 
14251
14252         (Expression::Error, Expression::Warning): Sugar functions for
14253         reporting errors.
14254
14255         (Expression::MemberLookup): Accept a TypeContainer instead of a
14256         Report as the first argument.
14257
14258         (Expression::ResolvePrimary): Killed.  I still want to improve
14259         this as currently the code is just not right.
14260
14261         (Expression::ResolveMemberAccess): Simplify, but it is still
14262         wrong. 
14263
14264         (Unary::Resolve): Catch errors in AddressOf operators.
14265
14266         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
14267         index to a byte for the short-version, or the compiler will choose
14268         the wrong Emit call, which generates the wrong data.
14269
14270         (ParameterReference::Emit, ::Store): same.
14271
14272         (FieldExpr::AddressOf): Implement.
14273
14274         * typemanager.cs: TypeManager: made public variable instead of
14275         property.
14276
14277         * driver.cs: document --fatal.
14278
14279         * report.cs (ErrorMessage, WarningMessage): new names for the old
14280         Error and Warning classes.
14281
14282         * cs-parser.jay (member_access): Turn built-in access to types
14283         into a normal simplename
14284
14285 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14286
14287         * expression.cs (Invocation::BetterConversion): Fix to cope
14288         with q being null, since this was introducing a bug.
14289
14290         * expression.cs (ConvertImplicit): Do built-in conversions first.
14291
14292 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14293
14294         * expression.cs (UserImplicitCast::Resolve): Fix bug.
14295
14296 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14297
14298         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
14299         I had introduced long ago (what's new ?).
14300
14301         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
14302         the work of all the checking. 
14303         (ConvertImplicit): Call CanConvert and only then create object if necessary.
14304         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
14305
14306         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
14307         that is the right way. 
14308
14309         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
14310         overloading resolution. Use everywhere instead of cutting and pasting code.
14311
14312         (Binary::ResolveOperator): Use MakeUnionSet.
14313
14314         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
14315         we have to convert to bool types. Not complete yet.
14316
14317 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14318
14319         * typemanager.cs (TypeManager::CSharpName): support ushort.
14320
14321         * expression.cs (Expression::TryImplicitIntConversion): Attempts
14322         to provide an expression that performsn an implicit constant int
14323         conversion (section 6.1.6).
14324         (Expression::ConvertImplicitRequired): Reworked to include
14325         implicit constant expression conversions.
14326
14327         (Expression::ConvertNumericExplicit): Finished.
14328
14329         (Invocation::Emit): If InstanceExpression is null, then it means
14330         that we perform a call on this.
14331
14332 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14333
14334         * expression.cs (Unary::Emit): Remove some dead code.
14335         (Probe): Implement Resolve and Emit for `is'.
14336         (Expression::ConvertImplicitRequired): Attempt to do constant
14337         expression conversions here.  Maybe should be moved to
14338         ConvertImplicit, but I am not sure.
14339         (Expression::ImplicitLongConstantConversionPossible,
14340         Expression::ImplicitIntConstantConversionPossible): New functions
14341         that tell whether is it possible to apply an implicit constant
14342         expression conversion.
14343
14344         (ConvertNumericExplicit): Started work on explicit numeric
14345         conversions.
14346
14347         * cs-parser.jay: Update operator constants.
14348
14349         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
14350         (Parameters::GetSignature): Hook up VerifyArgs here.
14351         (Parameters::VerifyArgs): Verifies that no two arguments have the
14352         same name. 
14353
14354         * class.cs (Operator): Update the operator names to reflect the
14355         ones that the spec expects (as we are just stringizing the
14356         operator names).
14357
14358         * expression.cs (Unary::ResolveOperator): Fix bug: Use
14359         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
14360         previous usage did only work for our methods.
14361         (Expression::ConvertImplicit): Handle decimal implicit numeric
14362         conversions as well.
14363         (Expression::InternalTypeConstructor): Used to invoke constructors
14364         on internal types for default promotions.
14365
14366         (Unary::Emit): Implement special handling for the pre/post
14367         increment/decrement for overloaded operators, as they need to have
14368         the same semantics as the other operators.
14369
14370         (Binary::ResolveOperator): ditto.
14371         (Invocation::ConversionExists): ditto.
14372         (UserImplicitCast::Resolve): ditto.
14373
14374 2001-09-26  Ravi Pratap  <ravi@ximian.com>
14375
14376         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
14377         operator, return after emitting body. Regression tests pass again !
14378
14379         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
14380         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
14381         (Invocation::OverloadResolve): Ditto.
14382         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
14383
14384         * everywhere : update calls to the above methods accordingly.
14385
14386 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14387
14388         * assign.cs (Assign): Make it inherit from ExpressionStatement.
14389
14390         * expression.cs (ExpressionStatement): New base class used for
14391         expressions that can appear in statements, so that we can provide
14392         an alternate path to generate expression that do not leave a value
14393         on the stack.
14394
14395         (Expression::Emit, and all the derivatives): We no longer return
14396         whether a value is left on the stack or not.  Every expression
14397         after being emitted leaves a single value on the stack.
14398
14399         * codegen.cs (EmitContext::EmitStatementExpression): Use the
14400         facilties of ExpressionStatement if possible.
14401
14402         * cs-parser.jay: Update statement_expression.
14403
14404 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
14405
14406         * driver.cs: Change the wording of message
14407
14408 2001-09-25  Ravi Pratap  <ravi@ximian.com>
14409
14410         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
14411         the type of the expression to the return type of the method if
14412         we have an overloaded operator match ! The regression tests pass again !
14413         (Unary::ResolveOperator): Ditto.
14414
14415         * expression.cs (Invocation::ConversionExists): Correct the member lookup
14416         to find "op_Implicit", not "implicit" ;-)
14417         (UserImplicitCast): New class to take care of user-defined implicit conversions.
14418         (ConvertImplicit, ForceConversion): Take TypeContainer argument
14419
14420         * everywhere : Correct calls to the above accordingly.
14421
14422         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
14423         (ConvertImplicit): Do user-defined conversion if it exists.
14424
14425 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
14426
14427         * assign.cs: track location.
14428         (Resolve): Use implicit conversions on assignment.
14429
14430         * literal.cs: Oops.  Not good, Emit of short access values should
14431         pass (Bytes) or the wrong argument will be selected.
14432
14433         * expression.cs (Unary::Emit): Emit code for -expr.
14434
14435         (Unary::ResolveOperator): Handle `Substract' for non-constants
14436         (substract from zero from the non-constants).
14437         Deal with Doubles as well. 
14438
14439         (Expression::ConvertImplicitRequired): New routine that reports an
14440         error if no implicit conversion exists. 
14441
14442         (Invocation::OverloadResolve): Store the converted implicit
14443         expressions if we make them
14444
14445 2001-09-24  Ravi Pratap  <ravi@ximian.com>
14446
14447         * class.cs (ConstructorInitializer): Take a Location argument.
14448         (ConstructorBaseInitializer): Same here.
14449         (ConstructorThisInitializer): Same here.
14450
14451         * cs-parser.jay : Update all calls accordingly.
14452
14453         * expression.cs (Unary, Binary, New): Take location argument.
14454         Update accordingly everywhere.
14455
14456         * cs-parser.jay : Update all calls to the above to take a location
14457         argument.
14458
14459         * class.cs : Ditto.
14460
14461 2001-09-24  Ravi Pratap  <ravi@ximian.com>
14462
14463         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
14464         (Invocation::BetterConversion): Same here
14465         (Invocation::ConversionExists): Ditto.
14466
14467         (Invocation::ConversionExists): Implement.
14468
14469 2001-09-22  Ravi Pratap  <ravi@ximian.com>
14470
14471         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
14472         Also take an additional TypeContainer argument.
14473
14474         * All over : Pass in TypeContainer as argument to OverloadResolve.
14475
14476         * typemanager.cs (CSharpName): Update to check for the string type and return
14477         that too.
14478
14479         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
14480         a given method.
14481
14482 2001-09-21  Ravi Pratap  <ravi@ximian.com>
14483
14484         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
14485         (Invocation::BetterFunction): Implement.
14486         (Invocation::BetterConversion): Implement.
14487         (Invocation::ConversionExists): Skeleton, no implementation yet.
14488
14489         Okay, things work fine !
14490
14491 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
14492
14493         * typemanager.cs: declare and load enum_type, delegate_type and
14494         void_type. 
14495
14496         * expression.cs (Expression::Emit): Now emit returns a value that
14497         tells whether a value is left on the stack or not.  This strategy
14498         might be reveted tomorrow with a mechanism that would address
14499         multiple assignments.
14500         (Expression::report118): Utility routine to report mismatches on
14501         the ExprClass.
14502
14503         (Unary::Report23): Report impossible type/operator combination
14504         utility function.
14505
14506         (Unary::IsIncrementableNumber): Whether the type can be
14507         incremented or decremented with add.
14508         (Unary::ResolveOperator): Also allow enumerations to be bitwise
14509         complemented. 
14510         (Unary::ResolveOperator): Implement ++, !, ~,
14511
14512         (Invocation::Emit): Deal with new Emit convetion.
14513
14514         * All Expression derivatives: Updated their Emit method to return
14515         whether they leave values on the stack or not.
14516
14517         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
14518         stack for expressions that are statements. 
14519
14520 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
14521
14522         * expression.cs (LValue): New interface.  Must be implemented by
14523         LValue objects.
14524         (LocalVariableReference, ParameterReference, FieldExpr): Implement
14525         LValue interface.
14526
14527         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
14528         interface for generating code, simplifies the code.
14529
14530 2001-09-20  Ravi Pratap  <ravi@ximian.com>
14531
14532         * expression.cs (everywhere): Comment out return statements in ::Resolve
14533         methods to avoid the warnings.
14534
14535 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
14536
14537         * driver.cs (parse): Report error 2001 if we can not open the
14538         source file.
14539
14540         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
14541         not resolve it.
14542
14543         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
14544         object. 
14545
14546         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
14547         otherwise nested blocks end up with the same index.
14548
14549         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
14550
14551         * expression.cs:  Instead of having FIXMEs in the Resolve
14552         functions, throw exceptions so it is obvious that we are facing a
14553         bug. 
14554
14555         * cs-parser.jay (invocation_expression): Pass Location information.
14556
14557         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
14558         Use a basename for those routines because .NET does not like paths
14559         on them. 
14560
14561         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
14562         already defined.
14563
14564 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
14565
14566         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
14567         are loading the correct data types (throws an exception if not).
14568         (TypeManager::InitCoreTypes): Use CoreLookupType
14569
14570         * expression.cs (Unary::ResolveOperator): return the child
14571         expression for expressions which are just +expr.
14572         (Unary::ResolveOperator): Return negative literals for -LITERAL
14573         expressions (otherwise they are Unary {Literal}).
14574         (Invocation::Badness): Take into account `Implicit constant
14575         expression conversions'.
14576
14577         * literal.cs (LongLiteral): Implement long literal class.
14578         (IntLiteral): export the `Value' of the intliteral. 
14579
14580 2001-09-19  Ravi Pratap  <ravi@ximian.com>
14581
14582         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
14583
14584         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
14585         instead of 'Operator'
14586
14587         * expression.cs (Binary::ResolveOperator): Update accordingly.
14588         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
14589         and 'Minus'
14590
14591         * cs-parser.jay (unary_expression): Update to use the new names.
14592
14593         * gen-treedump.cs (GetUnary): Same here.
14594
14595         * expression.cs (Unary::Resolve): Implement.
14596         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
14597         operators are found instead of making noise ;-)
14598         (Unary::ResolveOperator): New method to do precisely the same thing which
14599         Binary::ResolveOperator does for Binary expressions.
14600         (Unary.method, .Arguments): Add.
14601         (Unary::OperName): Implement.   
14602         (Unary::ForceConversion): Copy and Paste !
14603
14604         * class.cs (Operator::Define): Fix a small bug for the case when we have 
14605         a unary operator.
14606
14607         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
14608         for the inbuilt operators. Only overloading works for now ;-)
14609
14610 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
14611
14612         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
14613         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
14614
14615         * expression.cs (This::Emit): Implement. 
14616         (This::Resolve): Implement.
14617         (TypeOf:Resolve): Implement.
14618         (Expression::ResolveSimpleName): Add an implicit this to instance
14619         field references. 
14620         (MemberAccess::Resolve): Deal with Parameters and Fields. 
14621         Bind instance variable to Field expressions.
14622         (FieldExpr::Instance): New field used to track the expression that
14623         represents the object instance.
14624         (FieldExpr::Resolve): Track potential errors from MemberLookup not
14625         binding 
14626         (FieldExpr::Emit): Implement.
14627
14628         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
14629         the last instruction contains a return opcode to avoid generating
14630         the last `ret' instruction (this generates correct code, and it is
14631         nice to pass the peverify output).
14632
14633         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
14634         initializer for static and instance variables.
14635         (Constructor::Emit): Allow initializer to be null in the case of
14636         static constructors.  Only emit initializer for instance
14637         constructors. 
14638
14639         (TypeContainer::FindMembers): Return a null array if there are no
14640         matches.
14641
14642         Also fix the code for the MemberTypes.Method branch, as it was not
14643         scanning that for operators (or tried to access null variables before).
14644
14645         * assign.cs (Assign::Emit): Handle instance and static fields. 
14646
14647         * TODO: Updated.
14648
14649         * driver.cs: Stop compilation if there are parse errors.
14650
14651         * cs-parser.jay (constructor_declaration): Provide default base
14652         initializer for non-static constructors.
14653         (constructor_declarator): Do not provide a default base
14654         initializers if none was specified.
14655         Catch the fact that constructors should not have parameters.
14656
14657         * class.cs: Do not emit parent class initializers for static
14658         constructors, that should be flagged as an error.
14659
14660 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14661
14662         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
14663         Move back code into TypeContainer::Populate.
14664
14665 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14666
14667         * class.cs (TypeContainer::AddConstructor): Fix the check to
14668         compare against Name, not Basename. 
14669         (Operator::OpType): Change Plus and Minus to Add and Subtract.
14670
14671         * cs-parser.jay : Update accordingly.
14672
14673         * class.cs (TypeContainer::FindMembers): For the case where we are searching
14674         for methods, don't forget to look into the operators too.
14675         (RegisterMethodBuilder): Helper method to take care of this for
14676         methods, constructors and operators.
14677         (Operator::Define): Completely revamp.
14678         (Operator.OperatorMethod, MethodName): New fields.
14679         (TypeContainer::Populate): Move the registering of builders into
14680         RegisterMethodBuilder.
14681         (Operator::Emit): Re-write.
14682
14683         * expression.cs (Binary::Emit): Comment out code path to emit method
14684         invocation stuff for the case when we have a user defined operator. I am
14685         just not able to get it right !
14686
14687 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14688
14689         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
14690         argument. 
14691
14692         (Expression::MemberLookup): Provide a version that allows to
14693         specify the MemberTypes and BindingFlags. 
14694
14695         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
14696         so it was not fetching variable information from outer blocks.
14697
14698         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
14699         Beforefieldinit as it was buggy.
14700
14701         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
14702         that Ravi put here.  
14703
14704         * class.cs (Constructor::Emit): Only emit if block is not null.
14705         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
14706         deal with this by semantically definining it as if the user had
14707         done it.
14708
14709         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
14710         constructors as we now "emit" them at a higher level.
14711
14712         (TypeContainer::DefineDefaultConstructor): Used to define the
14713         default constructors if none was provided.
14714
14715         (ConstructorInitializer): Add methods Resolve and Emit. 
14716
14717         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
14718
14719 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14720
14721         * class.cs (TypeContainer::EmitDefaultConstructor): Register
14722         the default constructor builder with our hashtable for methodbuilders
14723         to methodcores.
14724
14725         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
14726         and argument_count is 0 in which case we have a match.
14727         (Binary::ResolveOperator): More null checking and miscellaneous coding
14728         style cleanup.
14729
14730 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14731
14732         * rootcontext.cs (IsNameSpace): Compare against null.
14733
14734         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
14735
14736         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
14737         and Unary::Operator.
14738
14739         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
14740         accordingly.
14741
14742         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
14743         we have overloaded operators.
14744         (Binary::ResolveOperator): Implement the part which does the operator overload
14745         resolution.
14746
14747         * class.cs (Operator::Emit): Implement.
14748         (TypeContainer::Emit): Emit the operators we have too.
14749
14750         * expression.cs (Binary::Emit): Update to emit the appropriate code for
14751         the case when we have a user-defined operator.
14752
14753 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14754
14755         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
14756
14757 2001-09-16  Ravi Pratap  <ravi@ximian.com>
14758
14759         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
14760         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
14761         (Constructor::Emit): Implement.
14762         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
14763         if we have no work to do. 
14764         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
14765         Emit method.
14766
14767         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
14768         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
14769
14770         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
14771         of parent.parent.
14772
14773 2001-09-15  Ravi Pratap  <ravi@ximian.com>
14774
14775         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
14776         in the source.
14777         (Tree::RecordNamespace): Method to do what the name says ;-)
14778         (Tree::Namespaces): Property to get at the namespaces hashtable.
14779
14780         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
14781         keep track.
14782
14783         * rootcontext.cs (IsNamespace): Fixed it :-)
14784
14785 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14786
14787         * class.cs (TypeContainer::FindMembers): Add support for
14788         constructors. 
14789         (MethodCore): New class that encapsulates both the shared aspects
14790         of a Constructor and a Method.  
14791         (Method, Constructor): Factored pieces into MethodCore.
14792
14793         * driver.cs: Added --fatal which makes errors throw exceptions.
14794         Load System assembly as well as part of the standard library.
14795
14796         * report.cs: Allow throwing exceptions on errors for debugging.
14797
14798         * modifiers.cs: Do not use `parent', instead use the real type
14799         container to evaluate permission settings.
14800
14801         * class.cs: Put Ravi's patch back in.  He is right, and we will
14802         have to cope with the
14803
14804 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14805
14806         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
14807         FamORAssem, not FamANDAssem.
14808
14809 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14810
14811         * driver.cs: Added --parse option that only parses its input files
14812         and terminates.
14813
14814         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
14815         incorrect.  IsTopLevel is not used to tell whether an object is
14816         root_types or not (that can be achieved by testing this ==
14817         root_types).  But to see if this is a top-level *class* (not
14818         necessarly our "toplevel" container). 
14819
14820 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14821
14822         * enum.cs (Enum::Define): Modify to call the Lookup method on the
14823         parent instead of a direct call to GetType.
14824
14825 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14826
14827         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
14828         Modifiers.TypeAttr. This should just be a call to that method.
14829
14830         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
14831         object so that we can determine if we are top-level or not.
14832
14833         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
14834         TypeContainer too.
14835
14836         * enum.cs (Enum::Define): Ditto.
14837
14838         * modifiers.cs (FieldAttr): Re-write.
14839
14840         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
14841         (TypeContainer::HaveStaticConstructor): New property to provide access
14842         to precisely that info.
14843
14844         * modifiers.cs (MethodAttr): Re-write.
14845         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
14846
14847         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
14848         of top-level types as claimed.
14849
14850 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14851
14852         * expression.cs (MemberLookup): Fruitless attempt to lookup
14853         constructors.  Maybe I need to emit default constructors?  That
14854         might be it (currently .NET emits this for me automatically).
14855         (Invocation::OverloadResolve): Cope with Arguments == null.
14856         (Invocation::EmitArguments): new function, shared by the new
14857         constructor and us.
14858         (Invocation::Emit): Handle static and instance methods.  Emit
14859         proper call instruction for virtual or non-virtual invocations.
14860         (New::Emit): Implement.
14861         (New::Resolve): Implement.
14862         (MemberAccess:Resolve): Implement.
14863         (MethodGroupExpr::InstanceExpression): used conforming to the spec
14864         to track instances.
14865         (FieldExpr::Resolve): Set type.
14866
14867         * support.cs: Handle empty arguments.
14868                 
14869         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
14870         SimpleLookup): Auxiliary routines to help parse a qualifier
14871         identifier.  
14872
14873         Update qualifier_identifier rule.
14874
14875         * codegen.cs: Removed debugging messages.
14876
14877         * class.cs: Make this a global thing, this acts just as a "key" to
14878         objects that we might have around.
14879
14880         (Populate): Only initialize method_builders_to_methods once.
14881
14882         * expression.cs (PropertyExpr): Initialize type from the
14883         PropertyType. 
14884
14885         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
14886         Resolve pattern.  Attempt to implicitly convert value to boolean.
14887         Emit code.
14888
14889         * expression.cs: Set the type for the int32/int32 argument case.
14890         (Binary::ResolveOperator): Set the return type to boolean for
14891         comparission operators
14892
14893         * typemanager.cs: Remove debugging print code.
14894
14895         (Invocation::Resolve): resolve type.
14896
14897         * class.cs: Allocate a MemberInfo of the correct size, as the code
14898         elsewhere depends on the test to reflect the correct contents.
14899
14900         (Method::) Keep track of parameters, due to System.Reflection holes
14901
14902         (TypeContainer::Populate): Keep track of MethodBuilders to Method
14903         mapping here.
14904
14905         (TypeContainer::FindMembers): Use ArrayList and then copy an array
14906         of the exact size and return that.
14907
14908         (Class::LookupMethodByBuilder): New function that maps
14909         MethodBuilders to its methods.  Required to locate the information
14910         on methods because System.Reflection bit us again.
14911
14912         * support.cs: New file, contains an interface ParameterData and
14913         two implementations: ReflectionParameters and InternalParameters
14914         used to access Parameter information.  We will need to grow this
14915         as required.
14916
14917         * expression.cs (Invocation::GetParameterData): implement a cache
14918         and a wrapper around the ParameterData creation for methods. 
14919         (Invocation::OverloadResolve): Use new code.
14920
14921 2001-09-13  Ravi Pratap  <ravi@ximian.com>
14922
14923         * class.cs (TypeContainer::EmitField): Remove and move into 
14924         (Field::Define): here and modify accordingly.
14925         (Field.FieldBuilder): New member.
14926         (TypeContainer::Populate): Update accordingly.
14927         (TypeContainer::FindMembers): Implement.
14928
14929 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14930
14931         * statement.cs: (VariableInfo::VariableType): New field to be
14932         initialized with the full type once it is resolved. 
14933
14934 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
14935
14936         * parameter.cs (GetParameterInfo): Use a type cache to compute
14937         things only once, and to reuse this information
14938
14939         * expression.cs (LocalVariableReference::Emit): Implement.
14940         (OpcodeCast::Emit): fix.
14941
14942         (ParameterReference::Resolve): Implement.
14943         (ParameterReference::Emit): Implement.
14944
14945         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
14946         that are expressions need to stay as Expressions.
14947
14948         * typemanager.cs (CSharpName): Returns the C# name of a type if
14949         possible. 
14950
14951         * expression.cs (Expression::ConvertImplicit): New function that
14952         implements implicit type conversions.
14953
14954         (Expression::ImplicitReferenceConversion): Implements implicit
14955         reference conversions.
14956
14957         (EmptyCast): New type for transparent casts.
14958
14959         (OpcodeCast): New type for casts of types that are performed with
14960         a sequence of bytecodes.
14961
14962         (BoxedCast): New type used for casting value types into reference
14963         types.  Emits a box opcode.
14964
14965         (Binary::DoNumericPromotions): Implements numeric promotions of
14966         and computation of the Binary::Type.
14967
14968         (Binary::EmitBranchable): Optimization.
14969
14970         (Binary::Emit): Implement code emission for expressions.
14971
14972         * typemanager.cs (TypeManager): Added two new core types: sbyte
14973         and byte.
14974
14975 2001-09-12  Ravi Pratap  <ravi@ximian.com>
14976
14977         * class.cs (TypeContainer::FindMembers): Method which does exactly
14978         what Type.FindMembers does, only we don't have to use reflection. No
14979         implementation yet.
14980
14981         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
14982         typecontainer objects as we need to get at them.
14983         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
14984
14985         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
14986         typecontainer object.
14987
14988         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
14989         of just a Report object.
14990
14991 2001-09-11  Ravi Pratap  <ravi@ximian.com>
14992
14993         * class.cs (Event::Define): Go back to using the prefixes "add_" and
14994         "remove_"
14995         (TypeContainer::Populate): Now define the delegates of the type too.
14996         (TypeContainer.Delegates): Property to access the list of delegates defined
14997         in the type.
14998
14999         * delegates.cs (Delegate::Define): Implement partially.
15000
15001         * modifiers.cs (TypeAttr): Handle more flags.
15002
15003 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15004
15005         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
15006         and not <=
15007         (Operator::Define): Re-write logic to get types by using the LookupType method
15008         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
15009         (Indexer::Define): Ditto.
15010         (Event::Define): Ditto.
15011         (Property::Define): Ditto.
15012
15013 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15014
15015         * class.cs (TypeContainer::Populate): Now define operators too. 
15016         (TypeContainer.Operators): New property to access the list of operators
15017         in a type.
15018         (Operator.OperatorMethodBuilder): New member to hold the method builder
15019         for the operator we are defining.
15020         (Operator::Define): Implement.
15021
15022 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15023
15024         * class.cs (Event::Define): Make the prefixes of the accessor methods
15025         addOn_ and removeOn_ 
15026
15027         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
15028         of the location being passed in too. Ideally, this should go later since all
15029         error reporting should be done through the Report object.
15030
15031         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
15032         (Populate): Iterate thru the indexers we have and define them too.
15033         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
15034         for the get and set accessors.
15035         (Indexer::Define): Implement.
15036
15037 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
15038
15039         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
15040         my previous implementation, did not work.
15041
15042         * typemanager.cs: Add a couple of missing types (the longs).
15043
15044         * literal.cs: Use TypeManager.bool_type instead of getting it.
15045
15046         * expression.cs (EventExpr): New kind of expressions.
15047         (Expressio::ExprClassFromMemberInfo): finish
15048
15049 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
15050
15051         * assign.cs: Emit stores to static fields differently.
15052
15053 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15054
15055         * Merge in changes and adjust code to tackle conflicts. Backed out my
15056         code in Assign::Resolve ;-) 
15057
15058 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15059
15060         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
15061         instead Report.Error and also pass in the location.
15062         (CSharpParser::Lexer): New readonly property to return the reference
15063         to the Tokenizer object.
15064         (declare_local_variables): Use Report.Error with location instead of plain 
15065         old error.
15066         (CheckDef): Ditto.
15067
15068         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
15069         (Operator.CheckBinaryOperator): Ditto.
15070
15071         * cs-parser.jay (operator_declarator): Update accordingly.
15072
15073         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
15074         (CheckBinaryOperator): Same here.
15075
15076         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
15077         on the name without any prefixes of namespace names etc. This is because we
15078         already might have something already fully qualified like 
15079         'System.Console.WriteLine'
15080
15081         * assign.cs (Resolve): Begin implementation. Stuck ;-)
15082
15083 2001-09-07  Ravi Pratap  <ravi@ximian.com>
15084
15085         * cs-tokenizer.cs (location): Return a string which also contains
15086         the file name.
15087
15088         * expression.cs (ElementAccess): New class for expressions of the
15089         type 'element access.'
15090         (BaseAccess): New class for expressions of the type 'base access.'
15091         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
15092         respectively.
15093
15094         * cs-parser.jay (element_access): Implement action.
15095         (base_access): Implement actions.
15096         (checked_expression, unchecked_expression): Implement.
15097
15098         * cs-parser.jay (local_variable_type): Correct and implement.
15099         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
15100
15101         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
15102
15103         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
15104         name and the specifiers.
15105
15106         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
15107
15108         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
15109         making them all public ;-)
15110
15111         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
15112         class anyways.
15113
15114 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
15115
15116         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
15117         PropertyExprs.
15118         (FieldExpr, PropertyExprs): New resolved expressions.
15119         (SimpleName::MemberStaticCheck): Perform static checks for access
15120         to non-static fields on static methods. Maybe this should be
15121         generalized for MemberAccesses. 
15122         (SimpleName::ResolveSimpleName): More work on simple name
15123         resolution. 
15124
15125         * cs-parser.jay (primary_expression/qualified_identifier): track
15126         the parameter index.
15127
15128         * codegen.cs (CodeGen::Save): Catch save exception, report error.
15129         (EmitContext::EmitBoolExpression): Chain to expression generation
15130         instead of temporary hack.
15131         (::EmitStatementExpression): Put generic expression code generation.
15132
15133         * assign.cs (Assign::Emit): Implement variable assignments to
15134         local variables, parameters and fields.
15135
15136 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
15137
15138         * statement.cs (Block::GetVariableInfo): New method, returns the
15139         VariableInfo for a variable name in a block.
15140         (Block::GetVariableType): Implement in terms of GetVariableInfo
15141
15142         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
15143         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
15144
15145 2001-09-06  Ravi Pratap  <ravi@ximian.com>
15146
15147         * cs-parser.jay (operator_declaration): Continue on my quest : update
15148         to take attributes argument.
15149         (event_declaration): Ditto.
15150         (enum_declaration): Ditto.
15151         (indexer_declaration): Ditto.
15152
15153         * class.cs (Operator::Operator): Update constructor accordingly.
15154         (Event::Event): Ditto.
15155
15156         * delegate.cs (Delegate::Delegate): Same here.
15157
15158         * enum.cs (Enum::Enum): Same here.
15159
15160 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15161
15162         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
15163
15164         * ../tests/cs0658.cs : New file to demonstrate error 0658.
15165
15166         * attribute.cs (Attributes): New class to encapsulate all attributes which were
15167         being passed around as an arraylist.
15168         (Attributes::AddAttribute): Method to add attribute sections.
15169
15170         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
15171         (struct_declaration): Update accordingly.
15172         (constant_declaration): Update.
15173         (field_declaration): Update.
15174         (method_header): Update.
15175         (fixed_parameter): Update.
15176         (parameter_array): Ditto.
15177         (property_declaration): Ditto.
15178         (destructor_declaration): Ditto.
15179
15180         * class.cs (Struct::Struct): Update constructors accordingly.
15181         (Class::Class): Ditto.
15182         (Field::Field): Ditto.
15183         (Method::Method): Ditto.
15184         (Property::Property): Ditto.
15185         (TypeContainer::OptAttribute): update property's return type.
15186
15187         * interface.cs (Interface.opt_attributes): New member.
15188         (Interface::Interface): Update to take the extra Attributes argument.
15189
15190         * parameter.cs (Parameter::Parameter): Ditto.
15191
15192         * constant.cs (Constant::Constant): Ditto.
15193
15194         * interface.cs (InterfaceMemberBase): New OptAttributes field.
15195         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
15196         the attributes as a parameter.
15197         (InterfaceProperty): Update constructor call.
15198         (InterfaceEvent): Ditto.
15199         (InterfaceMethod): Ditto.
15200         (InterfaceIndexer): Ditto.
15201
15202         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
15203         pass the attributes too.
15204         (interface_event_declaration): Ditto.
15205         (interface_property_declaration): Ditto.
15206         (interface_method_declaration): Ditto.
15207         (interface_declaration): Ditto.
15208
15209 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
15210
15211         * class.cs (Method::Define): Track the "static Main" definition to
15212         create an entry point. 
15213
15214         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
15215         EntryPoint if we find it. 
15216
15217         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
15218         (EmitContext::ig): Make this variable public.
15219
15220         * driver.cs: Make the default output file be the first file name
15221         with the .exe extension.  
15222
15223         Detect empty compilations
15224
15225         Handle various kinds of output targets.  Handle --target and
15226         rename -t to --dumper.
15227
15228         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
15229         methods inherited from Expression return now an Expression.  This
15230         will is used during the tree rewriting as we resolve them during
15231         semantic analysis.
15232
15233         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
15234         the spec.  Missing entirely is the information about
15235         accessability of elements of it.
15236
15237         (Expression::ExprClassFromMemberInfo): New constructor for
15238         Expressions that creates a fully initialized Expression based on
15239         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
15240         a Type.
15241
15242         (Invocation::Resolve): Begin implementing resolution of invocations.
15243
15244         * literal.cs (StringLiteral):  Implement Emit.
15245
15246 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15247
15248         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
15249         member.
15250
15251 2001-09-04  Ravi Pratap  <ravi@ximian.com>
15252
15253         * cs-parser.jay (attribute_arguments): Implement actions.
15254         (attribute): Fix bug in production. Implement action.
15255         (attribute_list): Implement.
15256         (attribute_target): Implement.
15257         (attribute_target_specifier, opt_target_specifier): Implement
15258         (CheckAttributeTarget): New method to check if the attribute target
15259         is valid.
15260         (attribute_section): Implement.
15261         (opt_attributes): Implement.
15262
15263         * attribute.cs : New file to handle attributes.
15264         (Attribute): Class to hold attribute info.
15265
15266         * cs-parser.jay (opt_attribute_target_specifier): Remove production
15267         (attribute_section): Modify production to use 2 different rules to 
15268         achieve the same thing. 1 s/r conflict down !
15269         Clean out commented, useless, non-reducing dimension_separator rules.
15270
15271         * class.cs (TypeContainer.attributes): New member to hold list
15272         of attributes for a type.
15273         (Struct::Struct): Modify to take one more argument, the attribute list.
15274         (Class::Class): Ditto.
15275         (Field::Field): Ditto.
15276         (Method::Method): Ditto.
15277         (Property::Property): Ditto.
15278
15279         * cs-parser.jay (struct_declaration): Update constructor call to
15280         pass in the attributes too.
15281         (class_declaration): Ditto.
15282         (constant_declaration): Ditto.
15283         (field_declaration): Ditto.
15284         (method_header): Ditto.
15285         (fixed_parameter): Ditto.
15286         (parameter_array): Ditto.
15287         (property_declaration): Ditto.
15288
15289         * constant.cs (Constant::Constant): Update constructor similarly.
15290         Use System.Collections.
15291
15292         * parameter.cs (Parameter::Parameter): Update as above.
15293
15294 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15295
15296         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
15297         (TypeContainer.delegates): New member to hold list of delegates.
15298
15299         * cs-parser.jay (delegate_declaration): Implement the action correctly 
15300         this time as I seem to be on crack ;-)
15301
15302 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
15303
15304         * rootcontext.cs (RootContext::IsNamespace): new function, used to
15305         tell whether an identifier represents a namespace.
15306
15307         * expression.cs (NamespaceExpr): A namespace expression, used only
15308         temporarly during expression resolution.
15309         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
15310         utility functions to resolve names on expressions.
15311
15312 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
15313
15314         * codegen.cs: Add hook for StatementExpressions. 
15315
15316         * class.cs: Fix inverted test for static flag in methods.
15317
15318 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15319
15320         * class.cs (Operator::CheckUnaryOperator): Correct error number used
15321         to make it coincide with MS' number.
15322         (Operator::CheckBinaryOperator): Ditto.
15323
15324         * ../errors/errors.txt : Remove error numbers added earlier.
15325
15326         * ../errors/cs1019.cs : Test case for error # 1019
15327
15328         * ../errros/cs1020.cs : Test case for error # 1020
15329
15330         * cs-parser.jay : Clean out commented cruft.
15331         (dimension_separators, dimension_separator): Comment out. Ostensibly not
15332         used anywhere - non-reducing rule.
15333         (namespace_declarations): Non-reducing rule - comment out.
15334
15335         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
15336         with TypeContainer::AddEnum.
15337
15338         * delegate.cs : New file for delegate handling classes.
15339         (Delegate): Class for declaring delegates.
15340
15341         * makefile : Update.
15342
15343         * cs-parser.jay (delegate_declaration): Implement.
15344
15345 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
15346
15347         * class.cs (Event::Define): Implement.
15348         (Event.EventBuilder): New member.
15349
15350         * class.cs (TypeContainer::Populate): Update to define all enums and events
15351         we have.
15352         (Events): New property for the events arraylist we hold. Shouldn't we move to using
15353         readonly fields for all these cases ?
15354
15355 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15356
15357         * class.cs (Property): Revamp to use the convention of making fields readonly.
15358         Accordingly modify code elsewhere.
15359
15360         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
15361         the Define method of the Property class.
15362
15363         * class.cs : Clean up applied patch and update references to variables etc. Fix 
15364         trivial bug.
15365         (TypeContainer::Populate): Update to define all the properties we have. Also
15366         define all enumerations.
15367
15368         * enum.cs (Define): Implement.
15369
15370 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15371
15372         * cs-parser.jay (overloadable_operator): The semantic value is an
15373         enum of the Operator class.
15374         (operator_declarator): Implement actions.
15375         (operator_declaration): Implement.
15376
15377         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
15378         validity of definitions.
15379         (Operator::CheckBinaryOperator): Static method to check for binary operators
15380         (TypeContainer::AddOperator): New method to add an operator to a type.
15381
15382         * cs-parser.jay (indexer_declaration): Added line to actually call the
15383         AddIndexer method so it gets added ;-)
15384
15385         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
15386         already taken care of by the MS compiler ?  
15387
15388 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15389
15390         * class.cs (Operator): New class for operator declarations.
15391         (Operator::OpType): Enum for the various operators.
15392
15393 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15394
15395         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
15396         ostensibly handle this in semantic analysis.
15397
15398         * cs-parser.jay (general_catch_clause): Comment out
15399         (specific_catch_clauses, specific_catch_clause): Ditto.
15400         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
15401         (catch_args, opt_catch_args): New productions.
15402         (catch_clause): Rewrite to use the new productions above
15403         (catch_clauses): Modify accordingly.
15404         (opt_catch_clauses): New production to use in try_statement
15405         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
15406         and re-write the code in the actions to extract the specific and
15407         general catch clauses by being a little smart ;-)
15408
15409         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
15410         Hooray, try and catch statements parse fine !
15411
15412 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15413
15414         * statement.cs (Block::GetVariableType): Fix logic to extract the type
15415         string from the hashtable of variables.
15416
15417         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
15418         I end up making that mistake ;-)
15419         (catch_clauses): Fixed gross error which made Key and Value of the 
15420         DictionaryEntry the same : $1 !!
15421
15422 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15423
15424         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
15425
15426         * cs-parser.jay (event_declaration): Correct to remove the semicolon
15427         when the add and remove accessors are specified. 
15428
15429 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15430
15431         * cs-parser.jay (IndexerDeclaration): New helper class to hold
15432         information about indexer_declarator.
15433         (indexer_declarator): Implement actions.
15434         (parsing_indexer): New local boolean used to keep track of whether
15435         we are parsing indexers or properties. This is necessary because 
15436         implicit_parameters come into picture even for the get accessor in the 
15437         case of an indexer.
15438         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
15439
15440         * class.cs (Indexer): New class for indexer declarations.
15441         (TypeContainer::AddIndexer): New method to add an indexer to a type.
15442         (TypeContainer::indexers): New member to hold list of indexers for the
15443         type.
15444
15445 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
15446
15447         * cs-parser.jay (add_accessor_declaration): Implement action.
15448         (remove_accessor_declaration): Implement action.
15449         (event_accessors_declaration): Implement
15450         (variable_declarators): swap statements for first rule - trivial.
15451
15452         * class.cs (Event): New class to hold information about event
15453         declarations.
15454         (TypeContainer::AddEvent): New method to add an event to a type
15455         (TypeContainer::events): New member to hold list of events.
15456
15457         * cs-parser.jay (event_declaration): Implement actions.
15458
15459 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
15460
15461         * cs-parser.jay (dim_separators): Implement. Make it a string
15462         concatenating all the commas together, just as they appear.
15463         (opt_dim_separators): Modify accordingly
15464         (rank_specifiers): Update accordingly. Basically do the same
15465         thing - instead, collect the brackets here.
15466         (opt_rank_sepcifiers): Modify accordingly.
15467         (array_type): Modify to actually return the complete type string
15468         instead of ignoring the rank_specifiers.
15469         (expression_list): Implement to collect the expressions
15470         (variable_initializer): Implement. We make it a list of expressions
15471         essentially so that we can handle the array_initializer case neatly too.
15472         (variable_initializer_list): Implement.
15473         (array_initializer): Make it a list of variable_initializers
15474         (opt_array_initializer): Modify accordingly.
15475
15476         * expression.cs (New::NType): Add enumeration to help us
15477         keep track of whether we have an object/delegate creation
15478         or an array creation.
15479         (New:NewType, New::Rank, New::Indices, New::Initializers): New
15480         members to hold data about array creation.
15481         (New:New): Modify to update NewType
15482         (New:New): New Overloaded contructor for the array creation
15483         case.
15484
15485         * cs-parser.jay (array_creation_expression): Implement to call
15486         the overloaded New constructor.
15487
15488 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
15489
15490         * class.cs (TypeContainer::Constructors): Return member
15491         constructors instead of returning null.
15492
15493 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
15494
15495         * typemanager.cs (InitCoreTypes): Initialize the various core
15496         types after we have populated the type manager with the user
15497         defined types (this distinction will be important later while
15498         compiling corlib.dll)
15499
15500         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
15501         on Expression Classification.  Now all expressions have a method
15502         `Resolve' and a method `Emit'.
15503
15504         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
15505         generation from working.     Also add some temporary debugging
15506         code. 
15507
15508 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
15509
15510         * codegen.cs: Lots of code generation pieces.  This is only the
15511         beginning, will continue tomorrow with more touches of polish.  We
15512         handle the fundamentals of if, while, do, for, return.  Others are
15513         trickier and I need to start working on invocations soon.
15514
15515         * gen-treedump.cs: Bug fix, use s.Increment here instead of
15516         s.InitStatement. 
15517
15518         * codegen.cs (EmitContext): New struct, used during code
15519         emission to keep a context.   Most of the code generation will be
15520         here. 
15521
15522         * cs-parser.jay: Add embedded blocks to the list of statements of
15523         this block.  So code generation proceeds in a top down fashion.
15524
15525 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
15526
15527         * statement.cs: Add support for multiple child blocks.
15528
15529 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
15530
15531         * codegen.cs (EmitCode): New function, will emit the code for a
15532         Block of code given a TypeContainer and its ILGenerator. 
15533
15534         * statement.cs (Block): Standard public readonly optimization.
15535         (Block::Block constructors): Link children. 
15536         (Block::Child): Child Linker.
15537         (Block::EmitVariables): Emits IL variable declarations.
15538
15539         * class.cs: Drop support for MethodGroups here, delay until
15540         Semantic Analysis.
15541         (Method::): Applied the same simplification that I did before, and
15542         move from Properties to public readonly fields.
15543         (Method::ParameterTypes): Returns the parameter types for the
15544         function, and implements a cache that will be useful later when I
15545         do error checking and the semantic analysis on the methods is
15546         performed.
15547         (Constructor::GetCallingConvention): Renamed from CallingConvetion
15548         and made a method, optional argument tells whether this is a class
15549         or a structure to apply the `has-this' bit.
15550         (Method::GetCallingConvention): Implement, returns the calling
15551         convention. 
15552         (Method::Define): Defines the type, a second pass is performed
15553         later to populate the methods.
15554
15555         (Constructor::ParameterTypes): implement a cache similar to the
15556         one on Method::ParameterTypes, useful later when we do semantic
15557         analysis. 
15558
15559         (TypeContainer::EmitMethod):  New method.  Emits methods.
15560
15561         * expression.cs: Removed MethodGroup class from here.
15562
15563         * parameter.cs (Parameters::GetCallingConvention): new method.
15564
15565 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
15566
15567         * class.cs (TypeContainer::Populate): Drop RootContext from the
15568         argument. 
15569
15570         (Constructor::CallingConvention): Returns the calling convention.
15571         (Constructor::ParameterTypes): Returns the constructor parameter
15572         types. 
15573
15574         (TypeContainer::AddConstructor): Keep track of default constructor
15575         and the default static constructor.
15576
15577         (Constructor::) Another class that starts using `public readonly'
15578         instead of properties. 
15579
15580         (Constructor::IsDefault): Whether this is a default constructor. 
15581
15582         (Field::) use readonly public fields instead of properties also.
15583
15584         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
15585         track of static constructors;  If none is used, turn on
15586         BeforeFieldInit in the TypeAttributes. 
15587
15588         * cs-parser.jay (opt_argument_list): now the return can be null
15589         for the cases where there are no arguments. 
15590
15591         (constructor_declarator): If there is no implicit `base' or
15592         `this', then invoke the default parent constructor. 
15593
15594         * modifiers.cs (MethodAttr): New static function maps a set of
15595         modifiers flags into a MethodAttributes enum
15596         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
15597         MethodAttr, TypeAttr to represent the various mappings where the
15598         modifiers are used.
15599         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
15600
15601 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
15602
15603         * parameter.cs (GetParameterInfo): Fix bug where there would be no
15604         method arguments.
15605
15606         * interface.cs (PopulateIndexer): Implemented the code generator
15607         for interface indexers.
15608
15609 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
15610
15611         * interface.cs (InterfaceMemberBase): Now we track the new status
15612         here.  
15613
15614         (PopulateProperty): Implement property population.  Woohoo!  Got
15615         Methods and Properties going today. 
15616
15617         Removed all the properties for interfaces, and replaced them with
15618         `public readonly' fields. 
15619
15620 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
15621
15622         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
15623         initialize their hashtables/arraylists only when they are needed
15624         instead of doing this always.
15625
15626         * parameter.cs: Handle refs and out parameters.
15627
15628         * cs-parser.jay: Use an ArrayList to construct the arguments
15629         instead of the ParameterCollection, and then cast that to a
15630         Parameter[] array.
15631
15632         * parameter.cs: Drop the use of ParameterCollection and use
15633         instead arrays of Parameters.
15634
15635         (GetParameterInfo): Use the Type, not the Name when resolving
15636         types. 
15637
15638 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
15639
15640         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
15641         and instead use public readonly fields.
15642
15643         * class.cs: Put back walking code for type containers.
15644
15645 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
15646
15647         * class.cs (MakeConstant): Code to define constants.
15648
15649         * rootcontext.cs (LookupType): New function.  Used to locate types 
15650
15651
15652 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
15653
15654         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
15655         this System.Reflection code is.  Kudos to Microsoft
15656
15657         * typemanager.cs: Implement a type cache and avoid loading all
15658         types at boot time.  Wrap in LookupType the internals.  This made
15659         the compiler so much faster.  Wow.  I rule!
15660
15661         * driver.cs: Make sure we always load mscorlib first (for
15662         debugging purposes, nothing really important).
15663
15664         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
15665         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
15666
15667         * rootcontext.cs: Lookup types on their namespace;  Lookup types
15668         on namespaces that have been imported using the `using' keyword.
15669
15670         * class.cs (TypeContainer::TypeAttr): Virtualize.
15671         (Class::TypeAttr): Return attributes suitable for this bad boy.
15672         (Struct::TypeAttr): ditto.
15673         Handle nested classes.
15674         (TypeContainer::) Remove all the type visiting code, it is now
15675         replaced with the rootcontext.cs code
15676
15677         * rootcontext.cs (GetClassBases): Added support for structs. 
15678
15679 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
15680
15681         * interface.cs, statement.cs, class.cs, parameter.cs,
15682         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
15683         Drop use of TypeRefs, and use strings instead.
15684
15685 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
15686
15687         * rootcontext.cs: 
15688
15689         * class.cs (Struct::Struct): set the SEALED flags after
15690         checking the modifiers.
15691         (TypeContainer::TypeAttr): new property, returns the
15692         TypeAttributes for a class.  
15693
15694         * cs-parser.jay (type_list): Oops, list production was creating a
15695         new list of base types.
15696
15697         * rootcontext.cs (StdLib): New property.
15698         (GetInterfaceTypeByName): returns an interface by type name, and
15699         encapsulates error handling here.
15700         (GetInterfaces): simplified.
15701         (ResolveTree): Encapsulated all the tree resolution here.
15702         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
15703         types. 
15704
15705         * driver.cs: Add support for --nostdlib, to avoid loading the
15706         default assemblies.
15707         (Main): Do not put tree resolution here. 
15708
15709         * rootcontext.cs: Beginning of the class resolution.
15710
15711 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
15712
15713         * rootcontext.cs: Provide better error reporting. 
15714
15715         * cs-parser.jay (interface_base): set our $$ to be interfaces.
15716
15717         * rootcontext.cs (CreateInterface): Handle the case where there
15718         are no parent interfaces.
15719
15720         (CloseTypes): Routine to flush types at the end.
15721         (CreateInterface): Track types.
15722         (GetInterfaces): Returns an array of Types from the list of
15723         defined interfaces.
15724
15725         * typemanager.c (AddUserType): Mechanism to track user types (puts
15726         the type on the global type hash, and allows us to close it at the
15727         end). 
15728
15729 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
15730
15731         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
15732         RecordInterface instead.
15733
15734         * cs-parser.jay: Updated to reflect changes above.
15735
15736         * decl.cs (Definition): Keep track of the TypeBuilder type that
15737         represents this type here.  Not sure we will use it in the long
15738         run, but wont hurt for now.
15739
15740         * driver.cs: Smaller changes to accomodate the new code.
15741
15742         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
15743         when done. 
15744
15745         * rootcontext.cs (CreateInterface):  New method, used to create
15746         the System.TypeBuilder type for interfaces.
15747         (ResolveInterfaces): new entry point to resolve the interface
15748         hierarchy. 
15749         (CodeGen): Property, used to keep track of the code generator.
15750
15751 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
15752
15753         * cs-parser.jay: Add a second production for delegate_declaration
15754         with `VOID'.
15755
15756         (enum_body): Put an opt_comma here instead of putting it on
15757         enum_body or enum_member_declarations so we can handle trailing
15758         commas on enumeration members.  Gets rid of a shift/reduce.
15759
15760         (type_list): Need a COMMA in the middle.
15761
15762         (indexer_declaration): Tell tokenizer to recognize get/set
15763
15764         * Remove old targets.
15765
15766         * Re-add the parser target.
15767
15768 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15769
15770         * cs-parser.jay: Add precendence rules for a number of operators
15771         ot reduce the number of shift/reduce conflicts in the grammar.
15772
15773 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
15774
15775         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
15776         and put it here.
15777
15778         Get rid of old crufty code.
15779
15780         * rootcontext.cs: Use this to keep track of the parsed
15781         representation and the defined types available to the program. 
15782
15783         * gen-treedump.cs: adjust for new convention.
15784
15785         * type.cs: Split out the type manager, and the assembly builder
15786         from here. 
15787
15788         * typemanager.cs: the type manager will live here now.
15789
15790         * cil-codegen.cs: And the code generator here. 
15791
15792 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
15793
15794         * makefile: Fixed up for easy making.
15795
15796 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15797
15798         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
15799         the 
15800
15801         (unary_expression): Expand pre_increment_expression and
15802         post_decrement_expression to reduce a shift/reduce.
15803
15804 2001-07-11  Simon Cozens
15805
15806         * cs-tokenizer.cs: Hex numbers should begin with a 0.
15807
15808         Improve allow_keyword_as_indent name.
15809
15810 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
15811
15812         * Adjustments for Beta2. 
15813
15814 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
15815
15816         * decl.cs: Added `Define' abstract method.
15817         (InTransit): new property, used to catch recursive definitions. 
15818
15819         * interface.cs: Implement `Define'. 
15820
15821         * modifiers.cs: Map Modifiers.constants to
15822         System.Reflection.TypeAttribute flags.
15823
15824         * class.cs: Keep track of types and user-defined types.
15825         (BuilderInit): New method for creating an assembly
15826         (ResolveType): New function to launch the resolution process, only
15827         used by interfaces for now.
15828
15829         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
15830         that are inserted into the name space. 
15831
15832 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
15833
15834         * ARGH.  I have screwed up my tree so many times due to the use of
15835         rsync rather than using CVS.  Going to fix this at once. 
15836
15837         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
15838         load types.
15839
15840 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
15841
15842         * Experiment successful: Use System.Type rather that our own
15843         version of Type.  
15844
15845 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
15846
15847         * cs-parser.jay: Removed nsAliases from here.
15848
15849         Use new namespaces, handle `using XXX;' 
15850
15851         * namespace.cs: Reimplemented namespace handling, use a recursive
15852         definition of the class.  Now we can keep track of using clauses
15853         and catch invalid using clauses.
15854
15855 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
15856
15857         * gen-treedump.cs: Adapted for all the renaming.
15858
15859         * expression.cs (Expression): this class now has a Type property
15860         which returns an expression Type.
15861
15862         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
15863         `Type', as this has a different meaning now in the base
15864
15865 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
15866
15867         * interface.cs, class.cs: Removed from all the sources the
15868         references to signature computation, as we can not do method
15869         signature computation during the parsing time, as we are not
15870         trying to solve at that point distinguishing:
15871
15872         class X {
15873                 void a (Blah x) {}
15874                 void a (NS.Blah x) {}
15875         }
15876
15877         Which depending on the context might be valid or not, as we do not
15878         know if Blah is the same thing as NS.Blah at that point.
15879
15880         * Redid everything so the code uses TypeRefs now instead of
15881         Types.  TypeRefs are just temporary type placeholders, that need
15882         to be resolved.  They initially have a pointer to a string and the
15883         current scope in which they are used.  This is used later by the
15884         compiler to resolve the reference to an actual Type. 
15885
15886         * DeclSpace is no longer a CIR.Type, and neither are
15887         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
15888         are all DeclSpaces, but no Types. 
15889
15890         * type.cs (TypeRefManager): This implements the TypeRef manager,
15891         which keeps track of all the types that need to be resolved after
15892         the parsing has finished. 
15893
15894 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
15895
15896         * ARGH.  We are going to have to store `foreach' as a class rather
15897         than resolving it, as we need to verify error 1579 after name
15898         resolution.   *OR* we could keep a flag that says `This request to
15899         IEnumerator comes from a foreach statement' which we can then use
15900         to generate the error.
15901
15902 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
15903
15904         * class.cs (TypeContainer.AddMethod): we now add methods to the
15905         MethodGroup instead of the method hashtable.  
15906
15907         * expression.cs: Add MethodGroup abstraction, which gets us one
15908         step closer to the specification in the way we handle method
15909         declarations.  
15910
15911         * cs-parser.jay (primary_expression): qualified_identifier now
15912         tried to match up an identifier to a local variable reference or
15913         to a parameter reference.
15914
15915         current_local_parameters is now a parser global variable that
15916         points to the current parameters for the block, used during name
15917         lookup.
15918
15919         (property_declaration): Now creates an implicit `value' argument to
15920         the set accessor.
15921
15922 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
15923
15924         * parameter.cs: Do not use `param' arguments as part of the
15925         signature, per the spec.
15926
15927 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
15928
15929         * decl.cs: Base class for classes, structs and interfaces.  This
15930         is the "Declaration Space" 
15931
15932         * cs-parser.jay: Use CheckDef for checking declaration errors
15933         instead of having one on each function.
15934
15935         * class.cs: Factor out some code for handling error handling in
15936         accordance to the "Declarations" section in the "Basic Concepts"
15937         chapter in the ECMA C# spec.
15938
15939         * interface.cs: Make all interface member classes derive from
15940         InterfaceMemberBase.
15941
15942 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
15943
15944         * Many things: all interfaces are parsed and generated in
15945         gen-treedump.  Support for member variables, constructors,
15946         destructors, properties, constants is there.
15947
15948         Beginning of the IL backend, but very little done, just there for
15949         testing purposes. 
15950
15951 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
15952
15953         * cs-parser.jay: Fix labeled statement.
15954
15955         * cs-tokenizer.cs (escape): Escape " and ' always.
15956         ref_line, ref_name: keep track of the line/filename as instructed
15957         by #line by the compiler.
15958         Parse #line.
15959
15960 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
15961
15962         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
15963         to match the values in System.CodeDOM.
15964
15965         Divid renamed to Divide.
15966
15967         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
15968         statements. 
15969         (Statements.set): remove.
15970
15971         * System.CodeDOM/CodeCatchClause.cs: always have a valid
15972         statements. 
15973
15974         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
15975         falseStatements always have valid values. 
15976
15977         * cs-parser.jay: Use System.CodeDOM now.
15978