2004-08-02 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / mcs / ChangeLog
1 2004-07-25  Martin Baulig  <martin@ximian.com>
2
3         Merged latest changes into gmcs.  Please keep this comment in
4         here, it makes it easier for me to see what changed in MCS since
5         the last time I merged.
6
7 2004-08-02  Martin Baulig  <martin@ximian.com>
8
9         * statement.cs (LocalInfo.Flags): Added `IsThis'.
10         (LocalInfo.IsThis): New public property.
11         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
12
13 2004-08-01  Martin Baulig  <martin@ximian.com>
14
15         * class.cs (TypeContainer.GetClassBases): Don't set the default
16         here since we may get called from GetPartialBases().
17         (TypeContainer.DefineType): If GetClassBases() didn't return a
18         parent, use the default one.
19
20 2004-07-30  Duncan Mak  <duncan@ximian.com>
21
22         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
23
24 2004-07-30  Martin Baulig  <martin@ximian.com>
25
26         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
27
28         * class.cs (SourceMethod): New public class, derive from the
29         symbol writer's ISourceMethod.
30         (Method): Use the new symbol writer API.
31
32         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
33         as argument and use the new symbol writer.
34
35         * location.cs
36         (SourceFile): Implement the symbol writer's ISourceFile.
37         (Location.SymbolDocument): Removed.
38         (Location.SourceFile): New public property.
39
40         * symbolwriter.cs: Use the new symbol writer API.
41
42 2004-07-30  Raja R Harinath  <rharinath@novell.com>
43
44         * Makefile (install-local): Remove.  Functionality moved to
45         executable.make.
46
47 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
48
49         * Makefile: Install mcs.exe.config file together with mcs.exe.
50         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
51         correct runtime version.
52         
53 2004-07-25  Martin Baulig  <martin@ximian.com>
54
55         * class.cs
56         (TypeContainer.RegisterOrder): Removed, this was unused.
57         (TypeContainer, interface_order): Removed.
58         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
59         TypeContainer as argument since we can also be called with a
60         `PartialContainer' for a partial class/struct/interface.
61         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
62         of checking whether we're an `Interface' - we could be a
63         `PartialContainer'.
64         (PartialContainer.Register): Override; call
65         AddClass()/AddStruct()/AddInterface() on our parent.
66
67         * cs-parser.jay (interface_member_declaration): Add things to the
68         `current_container', not the `current_class'.
69
70         * rootcontext.cs (RegisterOrder): The overloaded version which
71         takes an `Interface' was unused, removed.
72
73         * typemanager.cs (TypeManager.LookupInterface): Return a
74         `TypeContainer', not an `Interface'.
75         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
76         contain a `PartialContainer' for an interface, so check it's
77         `Kind' to figure out what it is.
78
79 2004-07-25  Martin Baulig  <martin@ximian.com>
80
81         * class.cs (Class.DefaultTypeAttributes): New public constant.
82         (Struct.DefaultTypeAttributes): Likewise.
83         (Interface.DefaultTypeAttributes): Likewise.
84         (PartialContainer.TypeAttr): Override this and add the
85         DefaultTypeAttributes.
86
87 2004-07-25  Martin Baulig  <martin@ximian.com>
88
89         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
90         we can just use the `Parent' field instead.
91
92 2004-07-25  Martin Baulig  <martin@ximian.com>
93
94         * class.cs (TypeContainer.Emit): Renamed to EmitType().
95
96 2004-07-25  Martin Baulig  <martin@ximian.com>
97
98         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
99         our parts before defining any methods.
100         (TypeContainer.VerifyImplements): Make this virtual.
101         (ClassPart.VerifyImplements): Override and call VerifyImplements()
102         on our PartialContainer.
103
104 2004-07-25  Martin Baulig  <martin@ximian.com>
105
106         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
107
108         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
109         argument, we can just use the `Parent' field instead.
110
111         * class.cs
112         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
113         (MemberBase.DoDefine): Likewise.
114
115 2004-07-24  Martin Baulig  <martin@ximian.com>
116
117         * decl.cs (MemberCore.Parent): New public field.
118         (DeclSpace.Parent): Moved to MemberCore.
119
120         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
121         (MemberBase.ctor): Added TypeContainer argument, pass it to our
122         parent's .ctor.
123         (FieldBase, Field, Operator): Likewise.
124         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
125         (EventField, Event): Likewise.
126
127 2004-07-23  Martin Baulig  <martin@ximian.com>
128
129         * class.cs (PartialContainer): New public class.
130         (ClassPart): New public class.
131         (TypeContainer): Added support for partial classes.
132         (TypeContainer.GetClassBases): Splitted some of the functionality
133         out into GetNormalBases() and GetPartialBases().
134
135         * cs-tokenizer.cs (Token.PARTIAL): New token.
136         (Tokenizer.consume_identifier): Added some hacks to recognize
137         `partial', but only if it's immediately followed by `class',
138         `struct' or `interface'.
139
140         * cs-parser.jay: Added support for partial clases.
141
142 2004-07-23  Martin Baulig  <martin@ximian.com>
143
144         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
145         a `DeclSpace' and also made it readonly.
146         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
147         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
148         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
149
150         * cs-parser.jay: Pass the `current_class', not the
151         `current_container' (at the moment, this is still the same thing)
152         to a new Method, Property, Event, Indexer or Constructor.
153
154 2004-07-23  Martin Baulig  <martin@ximian.com>
155
156         * cs-parser.jay (CSharpParser): Added a new `current_class' field
157         and removed the `current_interface' one.
158         (struct_declaration, class_declaration, interface_declaration):
159         Set `current_class' to the newly created class/struct/interface;
160         set their `Bases' and call Register() before parsing their body.
161
162 2004-07-23  Martin Baulig  <martin@ximian.com>
163
164         * class.cs (Kind): New public enum.
165         (TypeContainer): Made this class abstract.
166         (TypeContainer.Kind): New public readonly field.
167         (TypeContainer.CheckDef): New public method; moved here from
168         cs-parser.jay.
169         (TypeContainer.Register): New public abstract method.
170         (TypeContainer.GetPendingImplementations): New public abstract
171         method.
172         (TypeContainer.GetClassBases): Removed the `is_class' and
173         `is_iface' parameters.
174         (TypeContainer.DefineNestedTypes): Formerly known as
175         DoDefineType().
176         (ClassOrStruct): Made this class abstract.
177
178         * tree.cs (RootTypes): New public type. 
179
180 2004-07-20  Martin Baulig  <martin@ximian.com>
181
182         * tree.cs (Tree.RecordNamespace): Removed.
183         (Tree.Namespaces): Removed.
184
185         * rootcontext.cs (RootContext.IsNamespace): Removed.
186
187         * cs-parser.jay (namespace_declaration): Just create a new
188         NamespaceEntry here.
189
190 2004-07-20  Martin Baulig  <martin@ximian.com>
191
192         * statement.cs (ExceptionStatement): New abstract class.  This is
193         now used as a base class for everyone who's using `finally'.
194         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
195         our local variables before using them.
196
197         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
198         virtual method.  This is used by Yield.Resolve() to "steal" an
199         outer block's `finally' clauses.
200         (FlowBranchingException): The .ctor now takes an ExceptionStatement
201         argument.
202
203         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
204         version which takes an ExceptionStatement.  This version must be
205         used to create exception branchings.
206
207         * iterator.cs
208         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
209         (Iterator.EmitMoveNext): Added exception support; protect the
210         block with a `fault' clause, properly handle 'finally' clauses.
211         (Iterator.EmitDispose): Run all the `finally' clauses here.
212
213 2004-07-20  Martin Baulig  <martin@ximian.com>
214
215         * iterator.cs: This is the first of a set of changes in the
216         iterator code.  Match the spec more closely: if we're an
217         IEnumerable, then GetEnumerator() must be called.  The first time
218         GetEnumerator() is called, it returns the current instance; all
219         subsequent invocations (if any) must create a copy.
220
221 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
222
223         * expression.cs: Resolve the constant expression before returning
224         it. 
225
226 2004-07-19  Martin Baulig  <martin@ximian.com>
227
228         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
229         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
230         the return type of the new EmitContext.
231
232 2004-07-18  Martin Baulig  <martin@ximian.com>
233
234         * class.cs (Property.Define): Fix iterators.
235
236         * iterators.cs (Iterator.Define): Moved the
237         `container.AddInterator (this)' call here from the .ctor; only do
238         it if we resolved successfully.
239
240 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
241
242         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
243         `true' for preprocessing directives that we parse.  The return
244         value indicates whether we should return to regular tokenizing or
245         not, not whether it was parsed successfully.
246
247         In the past if we were in: #if false ... #line #endif, we would
248         resume parsing after `#line'.  See bug 61604.
249
250         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
251         building: IsEnumType should return true only for enums, not for
252         enums or System.Enum itself.  This fixes #61593.
253
254         Likely what happened is that corlib was wrong: mcs depended on
255         this bug in some places.  The bug got fixed, we had to add the
256         hack, which caused bug 61593.
257
258         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
259         that was a workaround for the older conditions.
260
261 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
262
263         * assign.cs: IAssignMethod has a new interface, as documented
264         inline. All assignment code now uses this new api.
265
266         * ecore.cs, expression.cs: All classes which implement
267         IAssignMethod now use the new interface.
268
269         * expression.cs (Invocation): add a hack to EmitCall so that
270         IndexerAccess can be the target of a compound assignment without
271         evaluating its arguments twice.
272
273         * statement.cs: Handle changes in Invocation api.
274
275 2004-07-16  Martin Baulig  <martin@ximian.com>
276
277         * iterators.cs: Rewrote this.  We're now using one single Proxy
278         class for both the IEnumerable and the IEnumerator interface and
279         `Iterator' derives from Class so we can use the high-level API.
280
281         * class.cs (TypeContainer.AddIterator): New method.
282         (TypeContainer.DoDefineType): New protected virtual method, which
283         is called from DefineType().
284         (TypeContainer.DoDefineMembers): Call DefineType() and
285         DefineMembers() on all our iterators.
286         (TypeContainer.Emit): Call Emit() on all our iterators.
287         (TypeContainer.CloseType): Call CloseType() on all our iterators.
288
289         * codegen.cs (EmitContext.CurrentIterator): New public field.
290
291 2004-07-15  Martin Baulig  <martin@ximian.com>
292
293         * typemanager.cs
294         (TypeManager.not_supported_exception_type): New type.   
295
296 2004-07-14  Martin Baulig  <martin@ximian.com>
297
298         * iterators.cs: Use real error numbers.
299
300 2004-07-14  Martin Baulig  <martin@ximian.com>
301
302         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
303         requires this to be a System.Collection.IEnumerable and not a
304         class implementing that interface.
305         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
306
307 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
308
309         * class.cs: Fixed previous fix, it broke some error tests.
310
311 2004-07-12  Martin Baulig  <martin@ximian.com>
312
313         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
314         Fixes #61293.
315
316 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
317
318         * assign.cs (LocalTemporary): Add new argument: is_address,If
319         `is_address' is true, then the value that we store is the address
320         to the real value, and not the value itself.
321         
322         * ecore.cs (PropertyExpr): use the new local temporary
323         stuff to allow us to handle X.Y += z (where X is a struct)
324
325 2004-07-08  Martin Baulig  <martin@ximian.com>
326
327         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
328         not always return, just like we're doing in Using.Resolve().
329
330 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
331
332         * cs-parser.jay (fixed_statement): flag this as Pinned.
333
334 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
335
336         * typemanager.cs (TypeManager): Removed MakePinned method, this
337         mechanism is replaced with the .NET 2.x compatible mechanism of
338         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
339
340         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
341         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
342         `IsFixed' property which has a different meaning.
343
344 2004-07-02  Raja R Harinath  <rharinath@novell.com>
345
346         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
347         visible from inside a nested class, not just the names of the
348         immediately enclosing class.
349         Fix for bug #60730.
350
351 2004-06-24  Raja R Harinath  <rharinath@novell.com>
352
353         * expression.cs (BetterConversion): Remove buggy special-case
354         handling of "implicit constant expression conversions".  At this
355         point, we already know that the conversion is possible -- we're
356         only checking to see which is better.
357
358 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
359
360         * cs-parser.jay: Added error CS0210 test.
361
362 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
363
364         * cs-parser.jay: Added error CS0134 test.
365
366 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
367
368         Fix bug #52507
369         * cs-parser.jay: Added error CS0145 test.
370
371 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
372
373         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
374
375 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
376         
377         * expression.cs (StackAlloc.Resolve): The argument may not
378         be a constant; deal with this case.
379         
380 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
381
382         * attribute.cs (IndexerName_GetIndexerName): Renamed to
383         GetIndexerAttributeValue.
384         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
385
386         * class.cs (Indexer.Define): Added error tests for CS0415,
387         CS0609.
388
389 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
390
391         * attribute.cs (Attribute.Resolve): Keep field code in sync with
392         property code.
393
394 2004-06-23  Martin Baulig  <martin@ximian.com>
395
396         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
397         neither return nor throw, reset the barrier as well.  Fixes #60457.
398
399 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
400
401         * class.cs : EventAttributes is now set to None by default.
402           This fixes bug #60459.
403
404 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
405
406         Fix bug #60219
407         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
408         Don't throw exception but return null (it's sufficient now).
409
410 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
411
412         * typemanager.cs (GetArgumentTypes): Faster implementation.
413
414 2004-06-18  Martin Baulig  <martin@ximian.com>
415
416         * attribute.cs (Attribute.Resolve): Check whether we're an
417         EmptyCast which a Constant child.  Fixes #60333.
418
419 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
420
421         * statement.cs (EmitCollectionForeach): Account for the fact that
422         not all valuetypes are in areas which we can take the address of.
423         For these variables, we store to a temporary variable. Also, make
424         sure that we dont emit a `callvirt' on a valuetype method.
425
426 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
427
428         * expression.cs (StackAlloc.DoReSolve): Added test for
429         negative parameter (CS0247).
430
431 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
432
433         Fix bug #59792
434         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
435
436 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
437
438         Fix bug #59781
439         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
440         ulong.
441
442 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
443
444         Fix bug #58254 & cs1555.cs, cs1556.cs
445         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
446
447 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
448
449         * cs-parser.jay: Added error CS1669 test for indexers.
450
451 2004-06-11  Martin Baulig  <martin@ximian.com>
452
453         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
454         call this twice: for params and varargs methods.
455
456 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
457
458         * class.cs:
459         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
460
461 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
462
463         * attribute.cs (Attribute.GetValidTargets): Made public.
464
465         * class.cs: 
466         (AbstractPropertyEventMethod): New class for better code sharing.
467         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
468         CS1667 report.
469         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
470
471 2004-06-11  Raja R Harinath  <rharinath@novell.com>
472
473         Fix bug #59477.
474         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
475         that the call to Resolve is part of a MemberAccess.
476         (Expression.Resolve): Use it for SimpleName resolution.
477         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
478         Add 'intermediate' boolean argument.
479         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
480         error message when the SimpleName can be resolved ambiguously
481         between an expression and a type.
482         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
483         public.
484         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
485         call on the left-side.
486
487 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
488
489         * class.cs:
490         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
491
492 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
493
494         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
495
496 2004-06-11  Martin Baulig  <martin@ximian.com>
497
498         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
499         varargs methods if applicable.
500
501 2004-06-11  Martin Baulig  <martin@ximian.com>
502
503         * expression.cs (Invocation.EmitCall): Don't use
504         `method.CallingConvention == CallingConventions.VarArgs' since the
505         method could also have `CallingConventions.HasThis'.
506
507 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
508
509         * class.cs (Event.GetSignatureForError): Implemented.
510         Fixed crash in error test cs3010.cs
511
512 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
513
514         * cs-tokenizer.cs: Change the way we track __arglist to be
515         consistent with the other keywords.
516
517 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
518
519         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
520         tomorrow.
521
522 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
523
524         * codegen.cs: Check that all referenced assemblies have a strongname
525         before strongnaming the compiled assembly. If not report error CS1577.
526         Fix bug #56563. Patch by Jackson Harper.
527         * typemanager.cs: Added a method to return all referenced assemblies.
528         Fix bug #56563. Patch by Jackson Harper.
529
530 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
531
532         * class.cs:
533         (Method.ApplyAttributeBuilder): Moved and added conditional
534         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
535
536         * delegate.cs:
537         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
538
539 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
540
541         Fixed #59640
542         * class.cs: (EventField.attribute_targets): Changed default target.
543
544 2004-06-08  Martin Baulig  <martin@ximian.com>
545
546         * expression.cs (Invocation.EmitCall): Enable varargs methods.
547
548 2004-06-08  Martin Baulig  <martin@ximian.com>
549
550         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
551
552 2004-06-07  Martin Baulig  <martin@ximian.com>
553
554         Added support for varargs methods.
555
556         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
557         keyword.
558
559         * cs-parser.jay: Added support for `__arglist'.
560
561         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
562
563         * expression.cs (Argument.AType): Added `ArgList'.
564         (Invocation): Added support for varargs methods.
565         (ArglistAccess): New public class.
566         (Arglist): New public class.
567
568         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
569
570         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
571         a method's top-level block if the method has varargs.
572
573         * support.cs (ReflectionParameters, InternalParameters): Added
574         support for varargs methods.    
575
576 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
577
578         * class.cs: Provide location in indexer error report.
579
580         * driver.cs: Use standard names.
581
582         * namespace.cs: Catch the use of using after a namespace has been
583         declared also on using aliases.
584
585 2004-06-03  Raja R Harinath  <rharinath@novell.com>
586
587         Bug #50820.
588         * typemanager.cs (closure_private_ok, closure_invocation_type)
589         (closure_qualifier_type, closure_invocation_assembly)
590         (FilterWithClosure): Move to ...
591         (Closure): New internal nested class.
592         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
593         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
594         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
595         (MemberLookup, MemberLookupFailed): Use it.
596         * expression.cs (New.DoResolve): Treat the lookup for the
597         constructor as being qualified by the 'new'ed type.
598         (Indexers.GetIndexersForTypeOrInterface): Update.
599
600 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
601
602         * attribute.cs
603         (GetConditionalAttributeValue): New method. Returns
604         condition of ConditionalAttribute.
605         (SearchMulti): New method.  Returns all attributes of type 't'.
606         Use it when attribute is AllowMultiple = true.
607         (IsConditionalMethodExcluded): New method.
608
609         * class.cs
610         (Method.IsExcluded): Implemented. Returns true if method has conditional
611         attribute and the conditions is not defined (method is excluded).
612         (IMethodData): Extended interface for ConditionalAttribute support.
613         (PropertyMethod.IsExcluded): Implemented.
614
615         * decl.cs
616         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
617
618         * expression.cs
619         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
620         on the method.
621
622 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
623
624         * expression.cs (ArrayCreationExpression): Make this just an
625         `expression'. It can't be a statement, so the code here was
626         dead.
627
628 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
629
630         Fixed #59072
631         * typemanager.cs (GetFullNameSignature): New method for
632         MethodBase types.
633
634 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
635
636         Fixed #56452
637         * class.cs (MemberBase.GetSignatureForError): New virtual method.
638         Use this method when MethodBuilder is null.
639         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
640         Added test for error CS0626 (MONO reports error for this situation).
641         (IMethodData.GetSignatureForError): Extended interface.
642
643 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
644
645         * attribute.cs
646         (AttributeTester.GetObsoleteAttribute): Returns instance of
647         ObsoleteAttribute when type is obsolete.
648
649         * class.cs
650         (TypeContainer.VerifyObsoleteAttribute): Override.
651         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
652         (MethodCode.VerifyObsoleteAttribute): Override.
653         (MemberBase.VerifyObsoleteAttribute): Override.
654
655         * decl.cs
656         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
657         and report proper error.
658
659         *delegate.cs
660         Delegate.VerifyObsoleteAttribute): Override.
661
662         * ecore.cs
663         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
664         and report proper error.
665         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
666
667         * enum.cs
668         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
669         and enum member.
670
671         * expression.cs
672         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
673         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
674         Added test for ObsoleteAttribute.
675
676         * statement.cs
677         (Catch): Derived from Statement.
678
679 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
680  
681         Fixed bug #59071 & cs0160.cs
682  
683         * statement.cs (Try.Resolve): Check here whether order of catch
684         clauses matches their dependencies.
685
686 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
687
688         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
689         caused a regression: #59343.  Referencing nested classes from an
690         assembly stopped working.
691
692 2004-05-31  Martin Baulig  <martin@ximian.com>
693
694         MCS is now frozen for beta 2.
695
696 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
697
698         * convert.cs: add a trivial cache for overload operator resolution.
699
700 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
701
702         * decl.cs: If possible, use lookuptypedirect here. We can only do
703         this if there is no `.' after the namespace. Avoids using
704         LookupType, which does lots of slow processing.
705         (FindNestedType) New method, does what it says :-).
706         * namespace.cs: use LookupTypeDirect.
707         * rootcontext.cs: use membercache, if possible.
708         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
709
710 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
711
712         * expression.cs:
713         According to the spec, 
714
715         In a member access of the form E.I, if E is a single identifier,
716         and if the meaning of E as a simple-name (§7.5.2) is a constant,
717         field, property, localvariable, or parameter with the same type as
718         the meaning of E as a type-name (§3.8), then both possible
719         meanings of E are permitted.
720
721         We did not check that E as a simple-name had the same type as E as
722         a type name.
723
724         This trivial check gives us 5-7% on bootstrap time.
725
726 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
727
728         * expression.cs (Invocation.OverloadResolve): Avoid the
729         use of hashtables and boxing here by allocating on demand.
730
731 2004-05-30  Martin Baulig  <martin@ximian.com>
732
733         * rootcontext.cs (RootContext.LookupType): Don't cache things if
734         we're doing a silent lookup.  Don't try to lookup nested types in
735         TypeManager.object_type (thanks to Ben Maurer).
736
737 2004-05-30  Martin Baulig  <martin@ximian.com>
738
739         Committing a patch from Ben Maurer.
740
741         * rootcontext.cs (RootContext.LookupType): Cache negative results.
742
743 2004-05-29  Martin Baulig  <martin@ximian.com>
744
745         * class.cs (IMethodData.ShouldIgnore): New method.
746
747         * typemanager.cs (TypeManager.MethodFlags): Don't take a
748         `Location' argument, we don't need it anywhere.  Use
749         `IMethodData.ShouldIgnore ()' instead of
750         `MethodData.GetMethodFlags ()'.
751         (TypeManager.AddMethod): Removed.
752         (TypeManager.AddMethod2): Renamed to AddMethod.
753
754 2004-05-29  Martin Baulig  <martin@ximian.com>
755
756         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
757
758         * convert.cs (Convert.ImplicitReferenceConversion): If we're
759         converting from a class type S to an interface type and we already
760         have an object on the stack, don't box it again.  Fixes #52578.
761
762 2004-05-29  Martin Baulig  <martin@ximian.com>
763
764         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
765         Added support for `params' parameters.  Fixes #59267.
766
767 2004-05-29  Martin Baulig  <martin@ximian.com>
768
769         * literal.cs (NullPointer): Provide a private .ctor which sets
770         `type' to TypeManager.object_type.  Fixes #59048.
771
772 2004-05-29  Martin Baulig  <martin@ximian.com>
773
774         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
775         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
776
777         * ecore.cs (EventExpr.instance_expr): Make the field private.
778
779 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
780
781         Fixed bug #50080 & cs0214-2.cs
782         * expression.cs (Cast.DoResolve): Check unsafe context here.
783         
784         * statement.cs (Resolve.DoResolve): Likewise.
785
786 2004-05-26  Martin Baulig  <martin@ximian.com>
787
788         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
789
790         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
791         (RootContext.LookupType): Pass down the `silent' flag.
792
793 2004-05-25  Martin Baulig  <martin@ximian.com>
794
795         * expression.cs
796         (MethodGroupExpr.IdenticalTypeName): New public property.
797         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
798         expression actually refers to a type.
799
800 2004-05-25  Martin Baulig  <martin@ximian.com>
801
802         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
803         for #56176 and made it actually work.
804
805 2004-05-25  Martin Baulig  <martin@ximian.com>
806
807         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
808         (FieldExpr, PropertyExpr): Override and implement
809         CacheTemporaries.  Fixes #52279.
810
811 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
812
813         * location.cs: In the new compiler listing a file twice is a
814         warning, not an error.
815
816 2004-05-24  Martin Baulig  <martin@ximian.com>
817
818         * enum.cs (Enum.DefineType): For the `BaseType' to be a
819         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
820
821 2004-05-24  Martin Baulig  <martin@ximian.com>
822
823         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
824         walking the `using' list.  Fixes #53921.
825
826 2004-05-24  Martin Baulig  <martin@ximian.com>
827
828         * const.cs (Const.LookupConstantValue): Added support for
829         EmptyCast's; fixes #55251.
830
831 2004-05-24  Martin Baulig  <martin@ximian.com>
832
833         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
834         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
835         which does the CS0135 check.  The reason is that we first need to
836         check whether the variable actually exists.
837
838 2004-05-24  Martin Baulig  <martin@ximian.com>
839
840         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
841         than RootContext.LookupType() to find the explicit interface
842         type.  Fixes #58584.
843
844 2004-05-24  Raja R Harinath  <rharinath@novell.com>
845
846         * Makefile: Simplify.  Use executable.make.
847         * mcs.exe.sources: New file.  List of sources of mcs.exe.
848
849 2004-05-24  Anders Carlsson  <andersca@gnome.org>
850
851         * decl.cs:
852         * enum.cs:
853         Use the invariant culture when doing String.Compare for CLS case
854         sensitivity.
855         
856 2004-05-23  Martin Baulig  <martin@ximian.com>
857
858         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
859         don't have any dots.  Fixes #52622, added cs0246-8.cs.
860
861         * namespace.cs (NamespaceEntry.Lookup): Likewise.
862         
863 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
864
865         * class.cs (MemberBase.Define): Reuse MemberType member for 
866         resolved type. Other methods can use it too.
867
868 2004-05-23  Martin Baulig  <martin@ximian.com>
869
870         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
871         the variable also exists in the current block (otherwise, we need
872         to report a CS0103).  Fixes #58670.
873
874 2004-05-23  Martin Baulig  <martin@ximian.com>
875
876         * flowanalysis.cs (Reachability.Reachable): Compute this
877         on-the-fly rather than storing it as a field.
878
879 2004-05-23  Martin Baulig  <martin@ximian.com>
880
881         * flowanalysis.cs (Reachability.And): Manually compute the
882         resulting `barrier' from the reachability.      
883        
884 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
885
886         Fix bug #57835
887         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
888         instance of ObsoleteAttribute when symbol is obsolete.
889
890         * class.cs
891         (IMethodData): Extended interface for ObsoleteAttribute support.
892
893 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
894
895         * attribute.cs: Fix bug #55970
896
897 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
898
899         Fix bug #52705
900         * attribute.cs
901         (GetObsoleteAttribute): New method. Creates the instance of
902         ObsoleteAttribute.
903         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
904         ObsoleteAttribute when member is obsolete.
905         (AttributeTester.Report_ObsoleteMessage): Common method for
906         Obsolete error/warning reporting.
907
908         * class.cs
909         (TypeContainer.base_classs_type): New member for storing parent type.
910
911         * decl.cs
912         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
913         for this MemberCore.
914
915 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
916
917         * attribute.cs, const.cs: Fix bug #58590
918
919 2004-05-21  Martin Baulig  <martin@ximian.com>
920
921         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
922         out parameters if the end of the method is unreachable.  Fixes
923         #58098. 
924
925 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
926
927         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
928         Hari was right, why extra method.
929
930 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
931
932         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
933
934 2004-05-20  Martin Baulig  <martin@ximian.com>
935
936         Merged this back from gmcs to keep the differences to a minumum.
937
938         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
939         instead of a Declspace.
940         (Attribute.ResolveType): Likewise.
941         (Attributes.Search): Likewise.
942         (Attributes.Contains): Likewise.
943         (Attributes.GetClsCompliantAttribute): Likewise.
944
945         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
946         argument.
947         (MethodData.ApplyAttributes): Take an EmitContext instead of a
948         DeclSpace.
949
950 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
951
952         Fix bug #58688 (MCS does not report error when the same attribute
953         is assigned twice)
954
955         * attribute.cs (Attribute.Emit): Distinction between null and default.
956
957 2004-05-19  Raja R Harinath  <rharinath@novell.com>
958
959         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
960         of a top-level attribute without an attribute target.
961         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
962         Make non-static.
963         (Attribute.Conditional_GetConditionName), 
964         (Attribute.Obsolete_GetObsoleteMessage): Update.
965         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
966         part of ScanForIndexerName.
967         (Attribute.CanIgnoreInvalidAttribute): New function.
968         (Attribute.ScanForIndexerName): Move to ...
969         (Attributes.ScanForIndexerName): ... here.
970         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
971         (Attributes.Search): New internal variant that can choose not to
972         complain if types aren't resolved.  The original signature now
973         complains.
974         (Attributes.GetClsCompliantAttribute): Use internal variant, with
975         complaints suppressed.
976         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
977         only if it not useful.
978         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
979         top-level for attributes that are shared between the assembly
980         and a top-level class.
981         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
982         * class.cs: Update to reflect changes.
983         (DefineIndexers): Fuse loops.
984         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
985         a couple more variants of attribute names.
986
987 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
988
989         Fix bug #52585 (Implemented explicit attribute declaration)
990
991         * attribute.cs:
992         (Attributable.ValidAttributeTargets): New abstract method. It gets
993         list of valid attribute targets for explicit target declaration.
994         (Attribute.Target): It holds target itself.
995         (AttributeSection): Removed.
996         (Attribute.CheckTargets): New method. It checks whether attribute
997         target is valid for the current element.
998
999         * class.cs:
1000         (EventProperty): New class. For events that are declared like
1001         property (with add and remove accessors).
1002         (EventField): New class. For events that are declared like field.
1003         class.cs
1004
1005         * cs-parser.jay: Implemented explicit attribute target declaration.
1006
1007         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1008         Override ValidAttributeTargets.
1009
1010         * parameter.cs:
1011         (ReturnParameter): Class for applying custom attributes on 
1012         the return type.
1013         (ParameterAtribute): New class. Class for applying custom
1014         attributes on the parameter type.
1015
1016 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1017
1018         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1019         definitions. 
1020
1021         (Method): Allow UNSAFE here.
1022
1023         * modifiers.cs: Support unsafe reporting.
1024
1025 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1026
1027         * decl.cs: Fix bug #58478.
1028
1029 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1030
1031         * statement.cs: When checking for unreachable code on an EmptyStatement,
1032         set the location. Fixes bug #58488.
1033
1034 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1035
1036         * driver.cs: Add -pkg handling.
1037
1038         From Gonzalo: UseShelLExecute=false
1039
1040 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1041
1042         * attribute.cs:
1043         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1044         for attribute.
1045         (Attribute.IsClsCompliaceRequired): Moved to base for better
1046         accesibility.
1047         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1048         when attribute is AttributeUsageAttribute.
1049         (Attribute.GetValidTargets): Simplified.
1050         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1051         attribute for this type.
1052         (Attribute.ApplyAttributes): Method renamed to Emit and make
1053         non-static.
1054         (GlobalAttributeSection): New class for special handling of global
1055         attributes (assembly, module).
1056         (AttributeSection.Emit): New method.
1057
1058         * class.cs: Implemented Attributable abstract methods.
1059         (MethodCore.LabelParameters): Moved to Parameter class.
1060         (Accessor): Is back simple class.
1061         (PropertyMethod): Implemented Attributable abstract class.
1062         (DelegateMethod): Implemented Attributable abstract class.
1063         (Event): New constructor for disctintion between normal Event
1064         and Event with accessors.
1065
1066         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1067
1068         * codegen.cs, const.cs, decl.cs, delegate.cs:
1069         (CommonAssemblyModulClass): Implemented Attributable abstract class
1070         and simplified.
1071
1072         * enum.cs: Implement IAttributeSupport interface.
1073         (EnumMember): New class for emum members. Implemented Attributable
1074         abstract class
1075
1076         * parameter.cs:
1077         (ParameterBase): Is abstract.
1078         (ReturnParameter): New class for easier [return:] attribute handling.
1079
1080         * typemanager.cs: Removed builder_to_attr.
1081
1082 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1083
1084         Fix bug #57151.
1085         * attribute.cs (Attribute.GetPositionalValue): New function.
1086         * class.cs (TypeContainer.VerifyMembers): New function.
1087         (TypeContainer.Emit): Use it.
1088         (ClassOrStruct): New base class for Class and Struct.
1089         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1090         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1091         class.
1092         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1093         then each non-static field should have a FieldOffset attribute.
1094         Otherwise, none of the fields should have a FieldOffset attribute.
1095         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1096         and FieldOffset attributes.
1097         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1098         (TypeManager.field_offset_attribute_type): New core types.
1099         (TypeManager.InitCoreTypes): Initialize them.
1100
1101 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1102
1103         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1104         Return correct type.
1105         From bug #58270.
1106
1107 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1108
1109         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1110         be implicitly converted to ulong.
1111         
1112         * expression.cs: The logic for allowing operator &, | and ^ worked
1113         was wrong, it worked before because we did not report an error in
1114         an else branch.  Fixes 57895.
1115
1116         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1117         allow volatile fields to be reference types.
1118
1119 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1120
1121         * driver.cs: Add support for /debug-
1122
1123 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1124
1125         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1126         Add a 'complain' parameter to silence errors.
1127         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1128         silently overlooked type-resolutions.
1129         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1130         to reflect changes.
1131         (Attributes.Search): New function.
1132         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1133         (Attributes.GetAttributeFullName): Remove hack.
1134         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1135         Update to reflect changes.
1136         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1137         Use Attributes.Search instead of nested loops.
1138
1139 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1140
1141         * decl.cs:
1142         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1143         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1144         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1145
1146         * report.cs: (Report.Warning): Renamed to Warning_T because of
1147         parameter collision.
1148
1149 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1150
1151         * expression.cs (MemberAccess.ResolveMemberAccess):
1152         Exit with non-zero status after Report.Error.
1153         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1154         Likewise.
1155         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1156
1157 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1158
1159         * support.cs: Don't hang when the file is empty.
1160
1161 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1162
1163         * support.cs: In SeekableStreamReader, compute the preamble size of the
1164           underlying stream. Position changes should take into account that initial
1165           count of bytes.
1166
1167 2004-05-03  Todd Berman  <tberman@sevenl.net>
1168
1169         * driver.cs: remove unused GetSysVersion function.
1170
1171 2004-05-03  Todd Berman  <tberman@sevenl.net>
1172
1173         * driver.cs: Remove the hack from saturday, as well as the hack
1174         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1175         link_paths to get that bit proper.
1176
1177 2004-05-01  Todd Berman  <tberman@sevenl.net>
1178
1179         * driver.cs: Try a LoadFrom before a Load, this checks the current
1180         path. This is currently a bug in mono that is be fixed, however, this
1181         provides a workaround for now. This will be removed when the bug
1182         is fixed.
1183
1184 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1185
1186         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1187         incomplete key pairs (#57941).
1188
1189 2004-05-01  Todd Berman  <tberman@sevenl.net>
1190
1191         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1192         from the GAC
1193
1194 2004-04-30  Jackson Harper  <jackson@ximian.com>
1195
1196         * codegen.cs: Open keys readonly.
1197         
1198 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1199
1200         * typemanager.cs: don't report cyclic struct layout when a struct
1201         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1202         which has 2 Pango.Rectangle fields.
1203
1204 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1205
1206         * expression.cs: Handle IntPtr comparisons with IL code
1207         rather than a method call.
1208
1209 2004-04-29  Martin Baulig  <martin@ximian.com>
1210
1211         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1212         the list of PropertyInfo's in class hierarchy and find the
1213         accessor.  Fixes #56013.
1214
1215 2004-04-29  Martin Baulig  <martin@ximian.com>
1216
1217         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
1218
1219 2004-04-29  Martin Baulig  <martin@ximian.com>
1220
1221         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1222
1223         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
1224
1225 2004-04-29  Martin Baulig  <martin@ximian.com>
1226
1227         * class.cs (ConstructorInitializer.Resolve): Check whether the
1228         parent .ctor is accessible.  Fixes #52146.
1229
1230 2004-04-29  Martin Baulig  <martin@ximian.com>
1231
1232         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1233
1234         * statement.cs (Using.EmitLocalVariableDecls): Use
1235         TypeManager.idisposable_type, not typeof (IDisposable).
1236         (Foreach.EmitCollectionForeach): Added support for valuetypes.
1237
1238 2004-04-29  Martin Baulig  <martin@ximian.com>
1239
1240         * class.cs (Event.Define): Don't emit the field and don't set
1241         RTSpecialName and SpecialName for events on interfaces.  Fixes
1242         #57703. 
1243
1244 2004-04-29  Raja R Harinath  <rharinath@novell.com>
1245
1246         Refactor Attribute.ApplyAttributes.
1247         * attribute.cs (Attributable): New base class for objects that can
1248         have Attributes applied on them.
1249         (Attribute): Make AttributeUsage fields public.
1250         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
1251         (Attribute.IsInternalCall): New property.
1252         (Attribute.UsageAttr): Convert to a public read-only property.
1253         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
1254         (Attribute.ResolveType, Attribute.Resolve)
1255         (Attribute.ScanForIndexerName): Update to reflect changes.
1256         (Attribute.CheckAttributeTarget): Re-format.
1257         (Attribute.ApplyAttributes): Refactor, to various
1258         Attributable.ApplyAttributeBuilder methods.
1259         * decl.cs (MemberCore): Make Attributable.
1260         * class.cs (Accessor): Make Attributable.
1261         (MethodData.ApplyAttributes): Use proper attribute types, not
1262         attribute names.
1263         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
1264         (TypeContainer.ApplyAttributeBuilder)
1265         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
1266         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
1267         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
1268         (Operator.ApplyAttributeBuilder): New factored-out methods.
1269         * const.cs (Const.ApplyAttributeBuilder): Likewise.
1270         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
1271         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
1272         * parameter.cs (ParameterBase): New Attributable base class
1273         that can also represent Return types.
1274         (Parameter): Update to the changes.
1275
1276 2004-04-29  Jackson Harper  <jackson@ximian.com>
1277
1278         * driver.cs: Prefer the corlib system version when looking for
1279         assemblies in the GAC. This is still a hack, but its a better hack
1280         now.
1281         
1282 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
1283
1284         * decl.cs, enum.cs: Improved error 3005 reporting.
1285   
1286         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
1287         (related_symbols): New private member for list of symbols
1288         related to reported error/warning.
1289         
1290         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
1291
1292 2004-04-29  Martin Baulig  <martin@ximian.com>
1293
1294         * ecore.cs (Expression.Constantify): If we're an enum and
1295         TypeManager.TypeToCoreType() doesn't give us another type, use
1296         t.UnderlyingSystemType.  Fixes #56178.  
1297
1298 2004-04-29  Martin Baulig  <martin@ximian.com>
1299
1300         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
1301         interfaces and for each interface, only add members directly
1302         declared in that interface.  Fixes #53255.
1303
1304 2004-04-28  Martin Baulig  <martin@ximian.com>
1305
1306         * expression.cs (ConditionalLogicalOperator): Use a temporary
1307         variable for `left' to avoid that we evaluate it more than once;
1308         bug #52588.
1309
1310 2004-04-28  Martin Baulig  <martin@ximian.com>
1311
1312         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
1313         `void[]' (CS1547).
1314
1315 2004-04-28  Martin Baulig  <martin@ximian.com>
1316
1317         * statement.cs (LocalInfo.Resolve): Check whether the type is not
1318         void (CS1547).
1319
1320         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
1321         whether the type is not void (CS1547).
1322
1323 2004-04-28  Martin Baulig  <martin@ximian.com>
1324
1325         * expression.cs (Unary.DoResolveLValue): Override this and report
1326         CS0131 for anything but Operator.Indirection.
1327
1328 2004-04-28  Martin Baulig  <martin@ximian.com>
1329
1330         Committing a patch from Ben Maurer; see bug #50820.
1331
1332         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
1333         check for classes.
1334
1335         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
1336         classes.        
1337
1338 2004-04-28  Martin Baulig  <martin@ximian.com>
1339
1340         Committing a patch from Ben Maurer; see bug #50820.
1341
1342         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
1343         check for classes.
1344
1345         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
1346         classes.        
1347
1348 2004-04-28  Martin Baulig  <martin@ximian.com>
1349
1350         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
1351         (Block.AddLabel): Call DoLookupLabel() to only search in the
1352         current block.
1353
1354 2004-04-28  Martin Baulig  <martin@ximian.com>
1355
1356         * cfold.cs (ConstantFold.BinaryFold): Added special support for
1357         comparing StringConstants and NullLiterals in Equality and Inequality.
1358
1359 2004-04-28  Jackson Harper  <jackson@ximian.com>
1360
1361         * driver.cs: Attempt to load referenced assemblies from the
1362         GAC. This is the quick and dirty version of this method that
1363         doesnt take into account versions and just takes the first
1364         canidate found. Will be good enough for now as we will not have more
1365         then one version installed into the GAC until I update this method.
1366
1367 2004-04-28  Martin Baulig  <martin@ximian.com>
1368
1369         * typemanager.cs (TypeManager.CheckStructCycles): New public
1370         static method to check for cycles in the struct layout.
1371
1372         * rootcontext.cs (RootContext.PopulateTypes): Call
1373         TypeManager.CheckStructCycles() for each TypeContainer.
1374         [Note: We only need to visit each type once.]
1375
1376 2004-04-28  Martin Baulig  <martin@ximian.com>
1377
1378         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
1379
1380         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
1381         success and added `out object value'.  Use a `bool resolved' field
1382         to check whether we've already been called rather than
1383         `ConstantValue != null' since this breaks for NullLiterals.
1384
1385 2004-04-28  Raja R Harinath  <rharinath@novell.com>
1386
1387         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
1388         setting of this flag, since the 'set' method may be non-public.
1389
1390 2004-04-28  Raja R Harinath  <rharinath@novell.com>
1391
1392         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
1393         check on current_vector.Block.
1394
1395 2004-04-27  Martin Baulig  <martin@ximian.com>
1396
1397         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
1398         a field initializer.  Fixes #56459.
1399
1400 2004-04-27  Martin Baulig  <martin@ximian.com>
1401
1402         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
1403         we're not attempting to use an indexer.  Fixes #52154.
1404
1405 2004-04-27  Martin Baulig  <martin@ximian.com>
1406
1407         * statement.cs (Return): Don't create a return label if we don't
1408         need it; reverts my change from January 20th.  Thanks to Ben
1409         Maurer for this.
1410
1411 2004-04-27  Martin Baulig  <martin@ximian.com>
1412
1413         According to the spec, `goto' can only leave a nested scope, but
1414         never enter it.
1415
1416         * statement.cs (Block.LookupLabel): Only lookup in the current
1417         block, don't recurse into parent or child blocks.
1418         (Block.AddLabel): Check in parent and child blocks, report
1419         CS0140/CS0158 if we find a duplicate.
1420         (Block): Removed this indexer for label lookups.
1421         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
1422         this already does the error reporting for us.
1423
1424         * flowanalysis.cs
1425         (FlowBranching.UsageVector.Block): New public variable; may be null.
1426         (FlowBranching.CreateSibling): Added `Block' argument.
1427         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
1428         label for the target of a `goto' and check whether we're not
1429         leaving a `finally'.
1430
1431 2004-04-27  Martin Baulig  <martin@ximian.com>
1432
1433         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1434         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
1435         just for returns).
1436
1437 2004-04-27  Martin Baulig  <martin@ximian.com>
1438
1439         * statement.cs (Block.AddLabel): Also check for implicit blocks
1440         and added a CS0158 check.
1441
1442 2004-04-27  Martin Baulig  <martin@ximian.com>
1443
1444         * flowanalysis.cs (FlowBranchingLoop): New class.
1445         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
1446         UsageVector's instead of an ArrayList.
1447         (FlowBranching.Label): Likewise.
1448         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
1449         (FlowBranching.AddBreakVector): New method.
1450
1451 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
1452
1453         * attribute.cs: Small regression fix: only convert the type if we
1454         the type is different, fixes System.Drawing build.
1455
1456 2004-04-27  Martin Baulig  <martin@ximian.com>
1457
1458         * attribute.cs (Attribute.Resolve): If we have a constant value
1459         for a named field or property, implicity convert it to the correct
1460         type.
1461
1462 2004-04-27  Raja R Harinath  <rharinath@novell.com>
1463
1464         * statement.cs (Block.Block): Implicit blocks share
1465         'child_variable_names' fields with parent blocks.
1466         (Block.AddChildVariableNames): Remove.
1467         (Block.AddVariable): Mark variable as "used by a child block" in
1468         every surrounding block.
1469         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
1470         been used in a child block, complain about violation of "Invariant
1471         meaning in blocks" rule.
1472         * cs-parser.jay (declare_local_variables): Don't use
1473         AddChildVariableNames.
1474         (foreach_statement): Don't create an implicit block: 'foreach'
1475         introduces a scope.
1476
1477 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
1478
1479         * convert.cs (ImplicitNumericConversion): 0 is also positive when
1480         converting from 0L to ulong.  Fixes 57522.
1481
1482 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
1483
1484         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
1485         derived class hides via 'new' keyword field from base class (test-242.cs).
1486         TODO: Handle this in the more general way.
1487         
1488         * class.cs (CheckBase): Ditto.
1489
1490 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
1491
1492         * decl.cs (caching_flags): New member for storing cached values
1493         as bit flags.
1494         (MemberCore.Flags): New enum where bit flags for caching_flags
1495         are defined.
1496         (MemberCore.cls_compliance): Moved to caching_flags.
1497         (DeclSpace.Created): Moved to caching_flags.
1498
1499         * class.cs: Use caching_flags instead of DeclSpace.Created
1500         
1501 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
1502
1503         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
1504         if we are only a derived class, not a nested class.
1505
1506         * typemanager.cs: Same as above, but do this at the MemberLookup
1507         level (used by field and methods, properties are handled in
1508         PropertyExpr).   Allow for the qualified access if we are a nested
1509         method. 
1510
1511 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
1512
1513         * class.cs: Refactoring.
1514         (IMethodData): New inteface; Holds links to parent members
1515         to avoid member duplication (reduced memory allocation).
1516         (Method): Implemented IMethodData interface.
1517         (PropertyBase): New inner classes for get/set methods.
1518         (PropertyBase.PropertyMethod): Implemented IMethodData interface
1519         (Event): New inner classes for add/remove methods.
1520         (Event.DelegateMethod): Implemented IMethodData interface.
1521
1522         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
1523         EmitContext (related to class.cs refactoring).
1524
1525 2004-04-21  Raja R Harinath  <rharinath@novell.com>
1526
1527         * delegate.cs (Delegate.VerifyApplicability): If the number of
1528         arguments are the same as the number of parameters, first try to
1529         verify applicability ignoring  any 'params' modifier on the last
1530         parameter.
1531         Fixes #56442.
1532
1533 2004-04-16  Raja R Harinath  <rharinath@novell.com>
1534
1535         * class.cs (TypeContainer.AddIndexer): Use
1536         'ExplicitInterfaceName' to determine if interface name was
1537         explicitly specified.  'InterfaceType' is not initialized at this time.
1538         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
1539         Indexers array is already in the required order.  Initialize
1540         'IndexerName' only if there are normal indexers.
1541         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
1542         (TypeContainer.Emit): Emit DefaultMember attribute only if
1543         IndexerName is initialized.
1544         Fixes #56300.
1545
1546 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
1547
1548         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
1549         Fixes #57007
1550
1551 2004-04-15  Raja R Harinath  <rharinath@novell.com>
1552
1553         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
1554         attributes.
1555         Fix for #56456.
1556
1557         * attribute.cs (Attribute.Resolve): Check for duplicate named
1558         attributes.
1559         Fix for #56463.
1560
1561 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
1562
1563         * iterators.cs (MarkYield): track whether we are in an exception,
1564         and generate code accordingly.  Use a temporary value to store the
1565         result for our state.
1566
1567         I had ignored a bit the interaction of try/catch with iterators
1568         since their behavior was not entirely obvious, but now it is
1569         possible to verify that our behavior is the same as MS .NET 2.0
1570
1571         Fixes 54814
1572
1573 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
1574
1575         * iterators.cs: Avoid creating temporaries if there is no work to
1576         do. 
1577
1578         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
1579         Enumerations, use TypeManager.EnumToUnderlying and call
1580         recursively. 
1581
1582         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
1583         bug #57013
1584
1585         (This.Emit): Use EmitContext.EmitThis to emit our
1586         instance variable.
1587
1588         (This.EmitAssign): Ditto.
1589
1590         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
1591         codepaths, we will move all the functionality into
1592         Mono.CSharp.This 
1593
1594         (FieldExpr.EmitAssign): Ditto.
1595
1596         This fixes several hidden bugs that I uncovered while doing a code
1597         review of this today.
1598
1599         * codegen.cs (EmitThis): reworked so the semantics are more clear
1600         and also support value types "this" instances.
1601
1602         * iterators.cs: Changed so that for iterators in value types, we
1603         do not pass the value type as a parameter.  
1604
1605         Initialization of the enumerator helpers is now done in the caller
1606         instead of passing the parameters to the constructors and having
1607         the constructor set the fields.
1608
1609         The fields have now `assembly' visibility instead of private.
1610
1611 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
1612
1613         * expression.cs (Argument.Resolve): Check if fields passed as ref
1614         or out are contained in a MarshalByRefObject.
1615
1616         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
1617         another compiler type.
1618
1619 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1620
1621         * class.cs (Indexer.Define): use the new name checking method.
1622         Also, return false on an error.
1623         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
1624         (is_identifier_[start/part]_character): make static.
1625
1626 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
1627
1628         * expression.cs (Binary.ResolveOperator): Do no append strings
1629         twice: since we can be invoked more than once (array evaluation)
1630         on the same concatenation, take care of this here.  Based on a fix
1631         from Ben (bug #56454)
1632
1633 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
1634
1635         * codegen.cs: Fix another case where CS1548 must be reported (when 
1636         delay-sign isn't specified and no private is available #56564). Fix
1637         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
1638         error when MCS is used on the MS runtime and we need to delay-sign 
1639         (which seems unsupported by AssemblyBuilder - see #56621).
1640
1641 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
1642
1643         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
1644         (TypeManager.ComputeNamespaces): Faster implementation for
1645         Microsoft runtime.
1646
1647         * compiler.csproj: Updated AssemblyName to mcs.
1648
1649 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
1650
1651         * rootcontext.cs: Add new types to the boot resolution.
1652
1653         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
1654         MulticastDelegate is not allowed.
1655
1656         * typemanager.cs: Add new types to lookup: System.TypedReference
1657         and ArgIterator.
1658
1659         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
1660         check for TypedReference or ArgIterator, they are not allowed. 
1661
1662         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
1663         makes us properly catch 1510 in some conditions (see bug 56016 for
1664         details). 
1665
1666 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
1667
1668         * CryptoConvert.cs: update from corlib version
1669         with endian fixes.
1670
1671 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
1672
1673         * class.cs (Indexer.Define): Check indexername declaration
1674
1675 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
1676
1677         * attribute.cs (IsClsCompliant): Fixed problem with handling
1678         all three states (compliant, not-compliant, undetected).
1679
1680 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
1681
1682         * attribute.cs (Attribute): Location is now public.
1683         (Resolve): Store resolved arguments (pos_values) in attribute class.
1684         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
1685         (GetClsCompliantAttributeValue): New method that gets
1686         CLSCompliantAttribute value.
1687         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
1688         if exists else null.
1689         (AttributeTester): New class for CLS-Compliant verification routines.
1690
1691         * class.cs (Emit): Add CLS-Compliant verification.
1692         (Method.GetSignatureForError): Implemented.
1693         (Constructor.GetSignatureForError): Implemented
1694         (Constructor.HasCompliantArgs): Returns if constructor has
1695         CLS-Compliant arguments.
1696         (Constructor.Emit): Override.
1697         (Construcor.IsIdentifierClsCompliant): New method; For constructors
1698         is needed to test only parameters.
1699         (FieldBase.GetSignatureForError): Implemented.
1700         (TypeContainer): New member for storing base interfaces.
1701         (TypeContainer.FindMembers): Search in base interfaces too.
1702
1703         * codegen.cs (GetClsComplianceAttribute): New method that gets
1704         assembly or module CLSCompliantAttribute value.
1705         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
1706         for assembly.
1707         (ModuleClass.Emit): Add error 3012 test.
1708
1709         * const.cs (Emit): Override and call base for CLS-Compliant tests.
1710
1711         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
1712         state for all decl types.
1713         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
1714         if CLS-Compliant tests are required.
1715         (IsClsCompliaceRequired): New method. Analyze whether code
1716         must be CLS-Compliant.
1717         (IsExposedFromAssembly): New method. Returns true when MemberCore
1718         is exposed from assembly.
1719         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
1720         value or gets cached value.
1721         (HasClsCompliantAttribute): New method. Returns true if MemberCore
1722         is explicitly marked with CLSCompliantAttribute.
1723         (IsIdentifierClsCompliant): New abstract method. This method is
1724         used to testing error 3005.
1725         (IsIdentifierAndParamClsCompliant): New method. Common helper method
1726         for identifier and parameters CLS-Compliant testing.
1727         (VerifyClsCompliance): New method. The main virtual method for
1728         CLS-Compliant verifications.
1729         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
1730         null. I don't know why is null (too many public members !).
1731         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
1732         and get value of first CLSCompliantAttribute that found.
1733
1734         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
1735         (VerifyClsCompliance): Override and add extra tests.
1736
1737         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
1738         clscheck- disable CLS-Compliant verification event if assembly is has
1739         CLSCompliantAttribute(true).
1740
1741         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
1742         ApllyAttribute is now called in emit section as in the other cases.
1743         Possible future Emit integration.
1744         (IsIdentifierClsCompliant): New override.
1745         (VerifyClsCompliance): New override.
1746         (GetEnumeratorName): Returns full enum name.
1747
1748         * parameter.cs (GetSignatureForError): Implemented.
1749
1750         * report.cs (WarningData): New struct for Warning message information.
1751         (LocationOfPreviousError): New method.
1752         (Warning): New method. Reports warning based on the warning table.
1753         (Error_T): New method. Reports error based on the error table.
1754
1755         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
1756         verifications are done here.
1757
1758         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
1759
1760         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
1761         CLSCompliantAttribute.
1762         (all_imported_types): New member holds all imported types from other
1763         assemblies.
1764         (LoadAllImportedTypes): New method fills static table with exported types
1765         from all referenced assemblies.
1766         (Modules): New property returns all assembly modules.
1767
1768 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
1769
1770         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
1771         throwing a parser error.
1772
1773         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
1774         which removes the hardcoded get_/set_ prefixes for properties, as
1775         IL allows for the properties to be named something else.  
1776
1777         Bug #56013
1778
1779         * expression.cs: Do not override operand before we know if it is
1780         non-null.  Fix 56207
1781
1782 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1783
1784         * typemanager.cs: support for pinned variables.
1785
1786 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1787
1788         * decl.cs, typemanager.cs: Avoid using an arraylist
1789         as a buffer if there is only one result set.
1790
1791 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1792
1793         * expression.cs: Make sure you cant call a static method
1794         with an instance expression, bug #56174.
1795
1796 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
1797
1798         * class.cs (IsDuplicateImplementation): Improve error reporting to
1799         flag 663 (method only differs in parameter modifier).
1800
1801         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
1802         in preprocessor directives.
1803
1804         * location.cs (LookupFile): Allow for the empty path.
1805
1806         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
1807         better approach for some of that patch, but its failing with the
1808         CharSet enumeration.  For now try/catch will do.
1809
1810         * typemanager.cs: Do not crash if a struct does not have fields.
1811         Fixes 56150.
1812
1813 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1814
1815         * expression.cs: cs0213, cant fix a fixed expression.
1816         fixes 50231.
1817
1818 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1819
1820         * cs-parser.jay: detect invalid embeded statements gracefully.
1821         bug #51113.
1822
1823 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1824
1825         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
1826         As a regex:
1827         s/
1828         the invocation type may not be a subclass of the tye of the item/
1829         The type of the item must be a subclass of the invocation item.
1830         /g
1831
1832         Fixes bug #50820.
1833
1834 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
1835
1836         * attribute.cs: Added methods to get a string and a bool from an
1837         attribute. Required to information from AssemblyKeyFileAttribute,
1838         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
1839         * codegen.cs: Modified AssemblyName creation to include support for
1840         strongnames. Catch additional exceptions to report them as CS1548.
1841         * compiler.csproj: Updated include CryptoConvert.cs.
1842         * compiler.csproj.user: Removed file - user specific configuration.
1843         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
1844         Mono.Security assembly. The original class is maintained and tested in
1845         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
1846         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
1847         like CSC 8.0 (C# v2) supports.
1848         * Makefile: Added CryptoConvert.cs to mcs sources.
1849         * rootcontext.cs: Added new options for strongnames.
1850
1851 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
1852
1853         * driver.cs: For --expect-error, report error code `2'
1854         if the program compiled with no errors, error code `1' if
1855         it compiled with an error other than the one expected.
1856
1857 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
1858
1859         * compiler.csproj: Updated for Visual Studio .NET 2003.
1860         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
1861         * compiler.sln: Updated for Visual Studio .NET 2003.
1862
1863 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
1864
1865         * expression.cs: Fix bug #47234. We basically need to apply the
1866         rule that we prefer the conversion of null to a reference type
1867         when faced with a conversion to 'object' (csc behaviour).
1868
1869 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1870
1871         * statement.cs: Shorter form for foreach, eliminates
1872         a local variable. r=Martin.
1873
1874 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1875
1876         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
1877         checks if we can use brtrue/brfalse to test for 0.
1878         * expression.cs: use the above in the test for using brtrue/brfalse.
1879         cleanup code a bit.
1880
1881 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1882
1883         * expression.cs: Rewrite string concat stuff. Benefits:
1884
1885         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
1886         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
1887         rather than a concat chain.
1888
1889         * typemanager.cs: Add lookups for more concat overloads.
1890
1891 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1892
1893         * expression.cs: Emit shorter il code for array init.
1894
1895         newarr
1896         dup
1897         // set 1
1898
1899         // set 2
1900
1901         newarr
1902         stloc.x
1903
1904         ldloc.x
1905         // set 1
1906
1907         ldloc.x
1908         // set 2
1909
1910 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
1911
1912         * statement.cs: Before, two switch blocks would be merged if the
1913         total size of the blocks (end_item - begin_item + 1) was less than
1914         two times the combined sizes of the blocks.
1915
1916         Now, it will only merge if after the merge at least half of the
1917         slots are filled.
1918
1919         fixes 55885.
1920
1921 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
1922
1923         * class.cs : csc build fix for GetMethods(). See bug #52503.
1924
1925 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
1926
1927         * expression.cs: Make sure fp comparisons work with NaN.
1928         This fixes bug #54303. Mig approved this patch a long
1929         time ago, but we were not able to test b/c the runtime
1930         had a related bug.
1931
1932 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
1933
1934         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
1935
1936 2004-03-19  Martin Baulig  <martin@ximian.com>
1937
1938         * class.cs (MemberCore.IsDuplicateImplementation): Report the
1939         error here and not in our caller.
1940
1941 2004-03-19  Martin Baulig  <martin@ximian.com>
1942
1943         * interface.cs: Completely killed this file.
1944         (Interface): We're now a TypeContainer and live in class.cs.
1945
1946         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
1947         argument; we're now also called for interfaces.
1948         (TypeContainer.DefineMembers): Allow this method being called
1949         multiple times.
1950         (TypeContainer.GetMethods): New public method; formerly known as
1951         Interface.GetMethod().  This is used by PendingImplementation.
1952         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
1953         it's now private and non-static.
1954         (Interface): Moved this here; it's now implemented similar to
1955         Class and Struct.
1956         (Method, Property, Event, Indexer): Added `bool is_interface'
1957         argument to their .ctor's.
1958         (MemberBase.IsInterface): New public field.
1959
1960         * cs-parser.jay: Create normal Method, Property, Event, Indexer
1961         instances instead of InterfaceMethod, InterfaceProperty, etc.
1962         (opt_interface_base): Removed; we now use `opt_class_base' instead.
1963         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
1964
1965 2004-03-19  Martin Baulig  <martin@ximian.com>
1966
1967         * class.cs (MethodCore.IsDuplicateImplementation): New private
1968         method which does the CS0111 checking.
1969         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
1970         Use IsDuplicateImplementation().
1971
1972 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
1973
1974         * decl.cs (FindMemberToOverride): New method to find the correct
1975         method or property to override in the base class.
1976         * class.cs
1977             - Make Method/Property use the above method to find the
1978               version in the base class.
1979             - Remove the InheritableMemberSignatureCompare as it is now
1980               dead code.
1981
1982         This patch makes large code bases much faster to compile, as it is
1983         O(n) rather than O(n^2) to do this validation.
1984
1985         Also, it fixes bug 52458 which is that nested classes are not
1986         taken into account when finding the base class member.
1987
1988         Reviewed/Approved by Martin.
1989
1990 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
1991
1992         * interface.cs: In all interface classes removed redundant
1993         member initialization.
1994
1995 2004-03-16  Martin Baulig  <martin@ximian.com>
1996
1997         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
1998
1999 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
2000
2001         * decl.cs (DefineTypeAndParents): New helper method to define a
2002         type's containers before the type itself is defined;  This is a
2003         bug exposed by the recent changes to Windows.Forms when an
2004         implemented interface was defined inside a class that had not been
2005         built yet.   
2006
2007         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
2008
2009         (Check): Loop correctly to report errors modifiers
2010         (UNSAFE was not in the loop, since it was the same as TOP).
2011
2012         * interface.cs: Every interface member now takes a ModFlags,
2013         instead of a "is_new" bool, which we set on the base MemberCore. 
2014
2015         Every place where we called "UnsafeOk" in the interface, now we
2016         call the proper member (InterfaceMethod.UnsafeOK) instead to get
2017         the unsafe settings from the member declaration instead of the
2018         container interface. 
2019
2020         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
2021
2022         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
2023         `set_indexer_name' to the pending bits (one per type).
2024
2025         We fixed a bug today that was picking the wrong method to
2026         override, since for properties the existing InterfaceMethod code
2027         basically ignored the method name.  Now we make sure that the
2028         method name is one of the valid indexer names.
2029
2030 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
2031  
2032         * support.cs (SeekableStreamReader): Keep track of stream byte
2033         positions and don't mix them with character offsets to the buffer.
2034
2035         Patch from Gustavo Giráldez
2036
2037 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
2038
2039         * interface.cs (InterfaceSetGetBase): Removed double member
2040         initialization, base class does it as well.
2041
2042 2004-03-13  Martin Baulig  <martin@ximian.com>
2043
2044         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
2045         when compiling corlib.
2046
2047 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
2048
2049         * convert.cs (ExplicitConversion): We were reporting an error on
2050         certain conversions (object_type source to a value type, when the
2051         expression was `null') before we had a chance to pass it through
2052         the user defined conversions.
2053
2054         * driver.cs: Replace / and \ in resource specifications to dots.
2055         Fixes 50752
2056
2057         * class.cs: Add check for duplicate operators.  Fixes 52477
2058
2059 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
2060
2061         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
2062         that are in the middle of the statements, not only at the end.
2063         Fixes #54987
2064
2065         * class.cs (TypeContainer.AddField): No longer set the
2066         `HaveStaticConstructor' flag, now we call it
2067         `UserDefineStaticConstructor' to diferentiate the slightly
2068         semantic difference.
2069
2070         The situation is that we were not adding BeforeFieldInit (from
2071         Modifiers.TypeAttr) to classes that could have it.
2072         BeforeFieldInit should be set to classes that have no static
2073         constructor. 
2074
2075         See:
2076
2077         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
2078
2079         And most importantly Zoltan's comment:
2080
2081         http://bugzilla.ximian.com/show_bug.cgi?id=44229
2082
2083         "I think beforefieldinit means 'it's ok to initialize the type sometime 
2084          before its static fields are used', i.e. initialization does not need
2085          to be triggered by the first access to the type. Setting this flag
2086          helps the JIT to compile better code, since it can run the static
2087          constructor at JIT time, and does not need to generate code to call it
2088          (possibly lots of times) at runtime. Unfortunately, mcs does not set
2089          this flag for lots of classes like String. 
2090          
2091          csc sets this flag if the type does not have an explicit static 
2092          constructor. The reasoning seems to be that if there are only static
2093          initalizers for a type, and no static constructor, then the programmer
2094          does not care when this initialization happens, so beforefieldinit
2095          can be used.
2096          
2097          This bug prevents the AOT compiler from being usable, since it 
2098          generates so many calls to mono_runtime_class_init that the AOT code
2099          is much slower than the JITted code. The JITted code is faster, 
2100          because it does not generate these calls if the vtable is type is
2101          already initialized, which is true in the majority of cases. But the
2102          AOT compiler can't do this."
2103
2104 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
2105
2106         * class.cs (MethodData.Emit): Refactor the code so symbolic
2107         information is generated for destructors;  For some reasons we
2108         were taking a code path that did not generate symbolic information
2109         before. 
2110
2111 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
2112
2113         * class.cs: Create a Constructor.CheckBase method that
2114         takes care of all validation type code. The method
2115         contains some code that was moved from Define.
2116
2117         It also includes new code that checks for duplicate ctors.
2118         This fixes bug #55148.
2119
2120 2004-03-09  Joshua Tauberer <tauberer@for.net>
2121
2122         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
2123         a { ... }-style array creation invokes EmitStaticInitializers
2124         which is not good for reference-type arrays.  String, decimal
2125         and now null constants (NullCast) are not counted toward
2126         static initializers.
2127
2128 2004-03-05  Martin Baulig  <martin@ximian.com>
2129
2130         * location.cs (SourceFile.HasLineDirective): New public field;
2131         specifies whether the file contains or is referenced by a "#line"
2132         directive.
2133         (Location.DefineSymbolDocuments): Ignore source files which
2134         either contain or are referenced by a "#line" directive.        
2135
2136 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
2137
2138         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
2139         direct access to our parent, so check the method inline there.
2140
2141 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
2142
2143         * expression.cs (Invocation.EmitCall): Miguel's last commit
2144         caused a regression. If you had:
2145
2146             T t = null;
2147             t.Foo ();
2148
2149         In Foo the implict this would be null.
2150
2151 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
2152
2153         * expression.cs (Invocation.EmitCall): If the method is not
2154         virtual, do not emit a CallVirt to it, use Call.
2155
2156         * typemanager.cs (GetFullNameSignature): Improve the method to
2157         cope with ".ctor" and replace it with the type name.
2158
2159         * class.cs (ConstructorInitializer.Resolve): Now the method takes
2160         as an argument the ConstructorBuilder where it is being defined,
2161         to catch the recursive constructor invocations.
2162
2163 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
2164
2165         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
2166         routines to check if a type is an enumerable/enumerator allow
2167         classes that implement the IEnumerable or IEnumerator interfaces.
2168
2169         * class.cs (Property, Operator): Implement IIteratorContainer, and
2170         implement SetYields.
2171
2172         (Property.Define): Do the block swapping for get_methods in the
2173         context of iterators.   We need to check if Properties also
2174         include indexers or not.
2175
2176         (Operator): Assign the Block before invoking the
2177         OperatorMethod.Define, so we can trigger the Iterator code
2178         replacement. 
2179
2180         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
2181         Property and Operator classes are not created when we parse the
2182         declarator but until we have the block completed, so we use a
2183         singleton SimpleIteratorContainer.Simple to flag whether the
2184         SetYields has been invoked.
2185
2186         We propagate this setting then to the Property or the Operator to
2187         allow the `yield' to function.
2188
2189 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
2190
2191         * codegen.cs: Implemented attribute support for modules.
2192         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
2193         Assembly/Module functionality.
2194
2195         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
2196         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
2197         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
2198
2199 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
2200
2201         * interface.cs (FindMembers): The operation is performed on all base
2202         interfaces and not only on the first. It is required for future CLS Compliance patch.
2203
2204 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2205
2206         * statement.cs, codegen.cs:
2207         This patch deals with patterns such as:
2208
2209         public class List : IEnumerable {
2210
2211                 public MyEnumerator GetEnumerator () {
2212                         return new MyEnumerator(this);
2213                 }
2214
2215                 IEnumerator IEnumerable.GetEnumerator () {
2216                         ...
2217                 }
2218                 
2219                 public struct MyEnumerator : IEnumerator {
2220                         ...
2221                 }
2222         }
2223
2224         Before, there were a few things we did wrong:
2225         1) we would emit callvirt on a struct, which is illegal
2226         2) we emited ldarg when we needed to emit ldarga
2227         3) we would mistakenly call the interface methods on an enumerator
2228         type that derived from IEnumerator and was in another assembly. For example:
2229
2230         public class MyEnumerator : IEnumerator
2231
2232         Would have the interface methods called, even if there were public impls of the
2233         method. In a struct, this lead to invalid IL code.
2234
2235 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
2236
2237         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
2238           renamed to Emit.
2239
2240         * delegate.cs (Define): Fixed crash when delegate type is undefined.
2241
2242 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
2243
2244         * cs-parser.jay: Fix small regression: we were not testing V2
2245         compiler features correctly.
2246
2247         * interface.cs: If the emit context is null, then create one
2248
2249 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
2250
2251         * decl.cs (GetSignatureForError): New virtual method to get full name
2252           for error messages.
2253
2254         * attribute.cs (IAttributeSupport): New interface for attribute setting.
2255           Now it is possible to rewrite ApplyAttributes method to be less if/else.
2256
2257         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
2258           Duplicated members and code in these classes has been removed.
2259           Better encapsulation in these classes.
2260
2261 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
2262
2263         * assign.cs (Assign.DoResolve): When dealing with compound
2264         assignments, there is a new rule in ECMA C# 2.4 (might have been
2265         there before, but it is documented here) that states that in:
2266
2267         a op= b;
2268
2269         If b is of type int, and the `op' is a shift-operator, then the
2270         above is evaluated as:
2271
2272         a = (int) a op b 
2273
2274         * expression.cs (Binary.ResolveOperator): Instead of testing for
2275         int/uint/long/ulong, try to implicitly convert to any of those
2276         types and use that in pointer arithmetic.
2277
2278         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
2279         method to print information for from the type, not from the
2280         null-method we were given.
2281
2282 2004-02-01  Duncan Mak  <duncan@ximian.com>
2283
2284         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
2285         parsing for cmd, fixes bug #53694.
2286
2287 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
2288
2289         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
2290         in the member name duplication tests. Property and operator name duplication
2291         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
2292
2293 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
2294
2295         * interface.cs (PopulateMethod): Fixed crash when interface method
2296         returns not existing type (error test cs0246-3.cs).
2297
2298 2004-02-02  Ravi Pratap M <ravi@ximian.com>
2299
2300         * cs-parser.jay (interface_accessors): Re-write actions to also
2301         store attributes attached to get and set methods. Fix spelling
2302         while at it.
2303
2304         (inteface_property_declaration): Modify accordingly.
2305
2306         (InterfaceAccessorInfo): New helper class to store information to pass
2307         around between rules that use interface_accessors.
2308
2309         * interface.cs (Emit): Apply attributes on the get and set
2310         accessors of properties and indexers too.
2311
2312         * attribute.cs (ApplyAttributes): Modify accordingly to use the
2313         right MethodBuilder when applying attributes to the get and set accessors.
2314
2315 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
2316
2317         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
2318
2319 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
2320
2321         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
2322
2323 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
2324
2325         * cs-parser.jay: Remove YIELD token, instead use the new grammar
2326         changes that treat `yield' specially when present before `break'
2327         or `return' tokens.
2328
2329         * cs-tokenizer.cs: yield is no longer a keyword.
2330
2331 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
2332
2333         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
2334         setting for default constructors.
2335         For default constructors are almost every time set wrong Modifier. The
2336         generated IL code has been alright. But inside mcs this values was
2337         wrong and this was reason why several of my CLS Compliance tests
2338         failed.
2339
2340 2004-01-22  Martin Baulig  <martin@ximian.com>
2341
2342         * cs-parser.jay (namespace_or_type_name): Return an Expression,
2343         not a QualifiedIdentifier.  This is what `type_name_expression'
2344         was previously doing.
2345         (type_name_expression): Removed; the code is now in
2346         `namespace_or_type_name'.
2347         (qualified_identifier): Removed, use `namespace_or_type_name'
2348         instead.
2349         (QualifiedIdentifier): Removed this class.      
2350
2351 2004-01-22  Martin Baulig  <martin@ximian.com>
2352
2353         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
2354         not a string as alias name.
2355
2356 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
2357
2358         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
2359         #52730 bug, and instead compute correctly the need to use a
2360         temporary variable when requesting an address based on the
2361         static/instace modified of the field and the constructor.
2362  
2363 2004-01-21  Martin Baulig  <martin@ximian.com>
2364
2365         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
2366         class and namespace before looking up aliases.  Fixes #52517.
2367
2368 2004-01-21  Martin Baulig  <martin@ximian.com>
2369
2370         * flowanalysis.cs (UsageVector.Merge): Allow variables being
2371         assinged in a 'try'; fixes exception4.cs.
2372
2373 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2374         * class.cs : Implemented parameter-less constructor for TypeContainer
2375
2376         * decl.cs: Attributes are now stored here. New property OptAttributes
2377
2378         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
2379
2380         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
2381
2382 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2383
2384         * typemanager.cs (CSharpSignature): Now reports also inner class name.
2385           (CSharpSignature): New method for indexer and property signature.
2386
2387 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2388
2389         * pending.cs (IsVirtualFilter): Faster implementation.
2390
2391 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2392
2393         * typemanager.cs: Avoid inclusion of same assembly more than once.
2394
2395 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2396
2397         * cs-parser.jay: Fixed problem where the last assembly attribute
2398           has been applied also to following declaration (class, struct, etc.)
2399           
2400 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2401
2402         * class.cs: Added error CS0538, CS0539 reporting.
2403         Fixed crash on Microsoft runtime when field type is void.
2404
2405         * cs-parser.jay: Added error CS0537 reporting.
2406
2407         * pending.cs: Added error CS0535 reporting.
2408         Improved error report for errors CS0536, CS0534.
2409
2410 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
2411
2412         Merge a few bits from the Anonymous Method MCS tree.
2413
2414         * statement.cs (ToplevelBlock): New class for toplevel methods,
2415         will hold anonymous methods, lifted variables.
2416
2417         * cs-parser.jay: Create toplevel blocks for delegates and for
2418         regular blocks of code. 
2419
2420 2004-01-20  Martin Baulig  <martin@ximian.com>
2421
2422         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
2423         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
2424         and `NeedExplicitReturn'; added `IsLastStatement'.
2425         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
2426         have a `ReturnLabel' or we're not unreachable.
2427
2428         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
2429         child's reachability; don't just override ours with it.  Fixes
2430         #58058 (lluis's example).
2431         (FlowBranching): Added public InTryOrCatch(), InCatch(),
2432         InFinally(), InLoop(), InSwitch() and
2433         BreakCrossesTryCatchBoundary() methods.
2434
2435         * statement.cs (Return): Do all error checking in Resolve().
2436         Unless we are the last statement in a top-level block, always
2437         create a return label and jump to it.
2438         (Break, Continue): Do all error checking in Resolve(); also make
2439         sure we aren't leaving a `finally'.
2440         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
2441         statement in a top-level block.
2442         (Block.Flags): Added `IsDestructor'.
2443         (Block.IsDestructor): New public property.
2444
2445 2004-01-20  Martin Baulig  <martin@ximian.com>
2446
2447         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
2448
2449 2004-01-20  Martin Baulig  <martin@ximian.com>
2450
2451         * statement.cs (Statement.ResolveUnreachable): New public method.
2452         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
2453         (Block.Resolve): Resolve unreachable statements.
2454
2455 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
2456
2457         * expression.cs: We need to fix the case where we do
2458         not have a temp variable here.
2459
2460         * assign.cs: Only expression compound assignments need
2461         temporary variables.
2462
2463 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
2464
2465         * flowanalysis.cs: Reduce memory allocation in a few ways:
2466           - A block with no variables should not allocate a bit
2467             vector for itself.
2468           - A method with no out parameters does not need any tracking
2469             for assignment of the parameters, so we need not allocate
2470             any data for it.
2471           - The arrays:
2472                 public readonly Type[] VariableTypes;
2473                 public readonly string[] VariableNames;
2474             Are redundant. The data is already stored in the variable
2475             map, so we need not allocate another array for it.
2476           - We need to add alot of checks for if (params | locals) == null
2477             due to the first two changes.
2478
2479 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
2480
2481         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
2482         implement IMemoryLocation, we store a copy on a local variable and
2483         take the address of it.  Patch from Benjamin Jemlich
2484
2485         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
2486         to use a special "type_name_expression" rule which reduces the
2487         number of "QualifiedIdentifier" classes created, and instead
2488         directly creates MemberAccess expressions.
2489
2490 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
2491
2492         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
2493         that fixes #52853.  Null literal assignment to ValueType
2494
2495         * class.cs (MethodData.Emit): Instead of checking the name of the
2496         method to determine if its a destructor, create a new derived
2497         class from Method called Destructor, and test for that.  
2498
2499         * cs-parser.jay: Create a Destructor object instead of a Method.  
2500
2501         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
2502
2503         Fixes: 52933
2504
2505 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
2506
2507         * expression.cs (Binary.ResolveOperator): Perform an implicit
2508         conversion from MethodGroups to their delegate types on the
2509         Addition operation.
2510
2511         * delegate.cs: Introduce a new class DelegateCreation that is the
2512         base class for `NewDelegate' and `ImplicitDelegateCreation',
2513         factor some code in here.
2514
2515         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
2516         conversion from MethodGroups to compatible delegate types. 
2517
2518         * ecore.cs (Expression.Resolve): Do not flag error 654
2519         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
2520         we allow conversions from MethodGroups to delegate types now.
2521
2522         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
2523         assignments in v2 either.
2524
2525 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
2526
2527         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
2528         static read-only fields in ctors.
2529
2530         Applied patch from Benjamin Jemlich 
2531
2532         * expression.cs (UnaryMutator): Avoid leaking local variables. 
2533
2534 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
2535
2536         * cs-tokenizer.cs (IsCastToken): Allow the various native types
2537         here to return true, as they can be used like this:
2538
2539                 (XXX) int.MEMBER ()
2540
2541         Fixed 49836 and all the other dups
2542
2543 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
2544
2545         * driver.cs: Implement /win32res and /win32icon.
2546
2547 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
2548
2549         * cs-parser.jay: Add a rule to improve error handling for the
2550         common mistake of placing modifiers after the type.
2551
2552 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
2553
2554         * cs-parser.jay (interface_event_declaration): Catch
2555         initialization of events on interfaces, and report cs0068
2556
2557         * cs-parser.jay (interface_event_declaration): Catch
2558         initialization of events. 
2559
2560         * ecore.cs: Better report missing constructors.
2561
2562         * expression.cs (Binary.ResolveOperator): My previous bug fix had
2563         the error reporting done in the wrong place.  Fix.
2564
2565         * expression.cs (Binary.ResolveOperator): Catch the 
2566         operator + (E x, E y) error earlier, and later allow for implicit
2567         conversions in operator +/- (E e, U x) from U to the underlying
2568         type of E.
2569
2570         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
2571         52596, if the container class is abstract, the default constructor
2572         is protected otherwise its public (before, we were always public).
2573
2574         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
2575         fixed statement.
2576
2577         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
2578         Jemlich that fixes bug #52597, MCS was generating invalid code for
2579         idisposable structs.   Thanks to Ben for following up with this
2580         bug as well.
2581
2582 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
2583
2584         * driver.cs: Allow assemblies without code to be generated, fixes
2585         52230.
2586
2587 2004-01-07  Nick Drochak <ndrochak@gol.com>
2588
2589         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
2590
2591 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
2592
2593         * cs-parser.jay: Add rules to improve error reporting if fields or
2594         methods are declared at the namespace level (error 116)
2595
2596         * Add rules to catch event add/remove
2597
2598 2004-01-04  David Sheldon <dave-mono@earth.li>
2599
2600   * expression.cs: Added matching ")" to error message for 
2601   CS0077
2602
2603 2004-01-03 Todd Berman <tberman@gentoo.org>
2604
2605         * ecore.cs, attribute.cs:
2606         Applying fix from #52429.
2607
2608 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2609
2610         * ecore.cs, expression.cs, statement.cs:
2611         Total rewrite of how we handle branching. We
2612         now handle complex boolean expressions with fewer
2613         jumps. As well if (x == 0) no longer emits a ceq.
2614
2615         if (x is Foo) is much faster now, because we generate
2616         better code.
2617
2618         Overall, we get a pretty big improvement on our benchmark
2619         tests. The code we generate is smaller and more readable.
2620
2621         I did a full two-stage bootstrap. The patch was reviewed
2622         by Martin and Miguel.
2623
2624 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2625
2626         * cs-parser.jay: Make primary_expression not take a QI.
2627         we dont need this because the member_access rule covers
2628         us here. So we replace the rule with just IDENTIFIER.
2629
2630         This has two good effects. First, we remove a s/r conflict.
2631         Second, we allocate many fewer QualifiedIdentifier objects.
2632
2633 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2634
2635         * attribute.cs: Handle MarshalAs attributes as pseudo, and
2636         set the correct information via SRE. This prevents
2637         hanging on the MS runtime. Fixes #29374.
2638
2639 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2640
2641         * convert.cs: correctly handle conversions to value types
2642         from Enum and ValueType as unboxing conversions.
2643
2644         Fixes bug #52569. Patch by Benjamin Jemlich.
2645
2646 2004-01-02  Ravi Pratap  <ravi@ximian.com>
2647
2648         * expression.cs (BetterConversion): Prefer int -> uint
2649         over int -> ulong (csc's behaviour). This fixed bug #52046.
2650
2651 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2652
2653         * decl.cs (MemberCache.FindMembers): now returns a
2654         MemberInfo [].
2655
2656         * typemanager.cs: In general, go with with ^^.
2657         (CopyNewMethods): take an IList.
2658         (RealMemberLookup): Only allocate an arraylist
2659         if we copy from two sets of methods.
2660
2661         This change basically does two things:
2662         1) Fewer array lists allocated due to CopyNewMethods.
2663         2) the explicit cast in MemberList costed ALOT.
2664
2665 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
2666
2667         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
2668         a hashtable to avoid needless string allocations when an identifier is
2669         used more than once (the common case).
2670
2671 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2672
2673         * pending.cs: MS's TypeBuilder.GetInterfaces ()
2674         is broken, it will not return anything. So, we
2675         have to use the information we have in mcs to
2676         do the task.
2677
2678         * typemanager.cs: Add a cache for GetInterfaces,
2679         since this will now be used more often (due to ^^)
2680
2681         (GetExplicitInterfaces) New method that gets the
2682         declared, not effective, interfaces on a type
2683         builder (eg, if you have interface IFoo, interface
2684         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
2685         { IBar }.
2686
2687         This patch makes MCS able to bootstrap itself on
2688         Windows again.
2689
2690 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2691
2692         * expression.cs: Remove the Nop's that Miguel put
2693         in by mistake.
2694
2695 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2696
2697         * report.cs, codegen.cs: Give the real stack trace to
2698         the error when an exception is thrown.
2699
2700 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2701
2702         * decl.cs: only allocate hashtables for ifaces if 
2703         it is an iface!
2704
2705 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2706
2707         * expression.cs: fix the error from cs0121-2.cs
2708         (a parent interface has two child interfaces that
2709         have a function with the same name and 0 params
2710         and the function is called through the parent).
2711
2712 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2713
2714         * class.cs, rootcontext.cs, typmanager.cs: do not
2715         leak pointers.
2716
2717 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2718
2719         * codegen.cs: remove stack for the ec flow branching.
2720         It is already a linked list, so no need.
2721
2722 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
2723
2724         * Makefile: Allow custom profiler here.
2725
2726 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2727
2728         * typemanager.cs (LookupType):
2729           - Use a static char [], because split takes
2730             a param array for args, so it was allocating
2731             every time.
2732           - Do not store true in a hashtable, it boxes.
2733
2734 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2735
2736         * flowanalysis.cs: bytify common enums.
2737
2738 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2739
2740         * modifiers.cs: Add a new set of flags for the
2741         flags allowed on explicit interface impls.
2742         * cs-parser.jay: catch the use of modifiers in
2743         interfaces correctly.
2744         * class.cs: catch private void IFoo.Blah ().
2745
2746         All related to bug #50572.
2747
2748 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2749
2750         * decl.cs: Rewrite the consistant accessability checking.
2751         Accessability is not linear, it must be implemented in
2752         a tableish way. Fixes #49704.
2753
2754 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2755
2756         * expression.cs: Handle negation in a checked context.
2757         We must use subtraction from zero. Fixes #38674.
2758
2759 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2760
2761         * class.cs: Ignore static void main in DLLs.
2762         * rootcontext.cs: Handle the target type here,
2763         since we are have to access it from class.cs
2764         * driver.cs: account for the above.
2765
2766 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2767
2768         * report.cs: Give line numbers and files if available.
2769
2770 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
2771
2772         * driver.cs: Implement /addmodule.
2773
2774         * typemanager.cs:  Change 'modules' field so it now contains Modules not
2775         ModuleBuilders.
2776
2777 2003-12-20  Martin Baulig  <martin@ximian.com>
2778
2779         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
2780         (FieldBase.IsAssigned): Removed this field.
2781         (FieldBase.SetAssigned): New public method.
2782         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
2783
2784 2003-12-20  Martin Baulig  <martin@ximian.com>
2785
2786         * expression.cs (LocalVariableReference.DoResolve): Don't set
2787         `vi.Used' if we're called from DoResolveLValue().
2788
2789         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
2790         returns the usage vector it just merged into the current one -
2791         pass this one to UsageWarning().
2792         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
2793         of the `EmitContext', don't call this recursively on our children.
2794
2795 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
2796
2797         * driver.cs: Implement /target:module.
2798
2799 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
2800
2801         * support.cs (CharArrayHashtable): New helper class.
2802
2803         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
2804         char arrays, not strings, so we can avoid creating a string in
2805         consume_identifier if the identifier is a keyword.
2806
2807 2003-12-16  Martin Baulig  <martin@ximian.com>
2808
2809         * statement.cs (LocalInfo.Assigned): Removed this property.
2810         (LocalInfo.Flags): Removed `Assigned'.
2811         (LocalInfo.IsAssigned): New public method; takes the EmitContext
2812         and uses flow analysis.
2813         (Block.UsageWarning): Made this method private.
2814         (Block.Resolve): Call UsageWarning() if appropriate.
2815
2816         * expression.cs (LocalVariableReference.DoResolve): Always set
2817         LocalInfo.Used here.
2818
2819 2003-12-13  Martin Baulig  <martin@ximian.com>
2820
2821         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
2822         any value here; we're now using flow analysis to figure out
2823         whether a statement/block returns a value.
2824
2825 2003-12-13  Martin Baulig  <martin@ximian.com>
2826
2827         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
2828         working again.
2829         (FlowBranching.MergeFinally): Don't call
2830         `branching.CheckOutParameters()' here, this is called in
2831         MergeTopBlock().
2832         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
2833         when adding the `finally' vector.       
2834
2835 2003-12-13  Martin Baulig  <martin@ximian.com>
2836
2837         * flowanalysis.cs
2838         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
2839         actually work and also fix #48962.
2840
2841 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2842
2843         * decl.cs: Do not check System.Object for nested types,
2844         since we know it does not have any. Big bang for buck:
2845
2846         BEFORE:
2847            Run 1:   8.35 seconds
2848            Run 2:   8.32 seconds
2849            corlib:  17.99 seconds
2850         AFTER:
2851            Run 1:   8.17 seconds
2852            Run 2:   8.17 seconds
2853            corlib:  17.39 seconds
2854
2855 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
2856
2857         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
2858         time we are returning 0 members, so we save alot here.
2859
2860 2003-12-11  Martin Baulig  <martin@ximian.com>
2861
2862         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
2863         `MergeChild()', also just take the `FlowBranching' as argument;
2864         call Merge() on it and return the result.
2865         (FlowBranching.Merge): We don't need to do anything if we just
2866         have one sibling.
2867
2868 2003-12-11  Martin Baulig  <martin@ximian.com>
2869
2870         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
2871         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
2872         Maurer for this idea.
2873
2874 2003-12-11  Martin Baulig  <martin@ximian.com>
2875
2876         * flowanalysis.cs (MergeResult): This class is now gone; we now
2877         use the `UsageVector' for this.  The reason for this is that if a
2878         branching just has one sibling, we don't need to "merge" them at
2879         all - that's the next step to do.
2880         (FlowBranching.Merge): We now return a `UsageVector' instead of a
2881         `MergeResult'.
2882
2883 2003-12-11  Martin Baulig  <martin@ximian.com>
2884
2885         Reworked flow analyis and made it more precise and bug-free.  The
2886         most important change is that we're now using a special `Reachability'
2887         class instead of having "magic" meanings of `FlowReturns'.  I'll
2888         do some more cleanups and optimizations and also add some more
2889         documentation this week.
2890
2891         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
2892         largely reworked this class.
2893         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
2894         the new `Reachability' class instead of having "magic" values here.
2895         (FlowBranching): We're now using an instance of `Reachability'
2896         instead of having separate `Returns', `Breaks' etc. fields.
2897
2898         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
2899         based on flow analysis; ignore the return value of block.Emit ().
2900
2901 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
2902
2903         * driver.cs typemanager.cs: Find the mono extensions to corlib even
2904         if they are private.
2905
2906 2003-12-09  Martin Baulig  <martin@ximian.com>
2907
2908         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
2909         call them directly on the UsageVector.
2910
2911 2003-12-09  Martin Baulig  <martin@ximian.com>
2912
2913         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
2914         Changed return type from `FlowReturns' to `Reachability'.
2915
2916 2003-12-09  Martin Baulig  <martin@ximian.com>
2917
2918         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
2919         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
2920         `Reachable' fields with a single `Reachability' one.
2921
2922 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2923
2924         * class.cs (FindMembers): Remove foreach's.
2925
2926         Bootstrap times:
2927
2928         BEFORE
2929                 Run 1:   8.74 seconds
2930                 Run 2:   8.71 seconds
2931
2932         AFTER
2933                 Run 1:   8.64 seconds
2934                 Run 2:   8.58 seconds
2935
2936
2937 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2938
2939         * cs-parser.jay:
2940         * gen-treedump.cs:
2941         * statement.cs:
2942         This patch does a few things:
2943                 1. EmptyStatement is now a singleton, so it is never reallocated.
2944                 2. All blah is EmptyStatement constructs have been changed to
2945                    blah == EmptyStatement.Value, which is much faster and valid
2946                    now that EmptyStatement is a singleton.
2947                 3. When resolving a block, rather than allocating a new array for
2948                    the non-empty statements, empty statements are replaced with
2949                    EmptyStatement.Value
2950                 4. Some recursive functions have been made non-recursive.
2951         Mainly the performance impact is from (3), however (1) and (2) are needed for
2952         this to work. (4) does not make a big difference in normal situations, however
2953         it makes the profile look saner.
2954
2955         Bootstrap times:
2956
2957         BEFORE
2958         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2959         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2960         Total memory allocated: 56397 KB
2961
2962         AFTER
2963         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
2964         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
2965         Total memory allocated: 55666 KB
2966
2967 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2968
2969         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
2970         than the hashtable in a hashtable version
2971
2972         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
2973         we always end up concating a string. This results in a huge perf
2974         loss, because many strings have to be tracked by the GC. In this
2975         patch, we first use a hashtable that works with two keys, so that
2976         the strings do not need to be concat'ed.
2977
2978         Bootstrap times:
2979         BEFORE
2980                 Run 1:   8.74 seconds
2981                 Run 2:   8.71 seconds
2982
2983         AFTER
2984                 Run 1:   8.65 seconds
2985                 Run 2:   8.56 seconds
2986
2987 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2988
2989         * Makefile: Add a new target `do-time' that does a quick and simple
2990         profile, leaving easy to parse output.
2991
2992 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
2993
2994         * codegen.cs (Init): Create the dynamic assembly with 
2995         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
2996
2997 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2998
2999         * support.cs: Make the PtrHashtable use only one
3000         instance of its comparer.
3001
3002 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
3003
3004         * typemanager.cs: Fix lookup of GetNamespaces.
3005
3006 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
3007
3008         * expression.cs: Removed redundant line.
3009
3010         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
3011         ArrayLists, use for loops with bounds.  
3012
3013         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
3014         arraylist.
3015
3016         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
3017         arraylists, use for loop with bounds.
3018
3019         The above three changes give us a 0.071 second performance
3020         improvement out of 3.294 seconds down to 3.223.  On my machine
3021         the above changes reduced the memory usage by 1,387 KB during
3022         compiler bootstrap.
3023
3024         * cs-parser.jay (QualifiedIdentifier): New class used to represent
3025         QualifiedIdentifiers.  Before we created a new string through
3026         concatenation, and mostly later on, the result would be
3027         manipulated by DecomposeQI through string manipulation.
3028
3029         This reduced the compiler memory usage for bootstrapping from
3030         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
3031         compile times in 0.05 seconds.
3032
3033 2003-11-28  Dick Porter  <dick@ximian.com>
3034
3035         * support.cs: Do string compares with the Invariant culture.
3036
3037         * rootcontext.cs: 
3038         * gen-treedump.cs: 
3039         * expression.cs: 
3040         * driver.cs: 
3041         * decl.cs: 
3042         * codegen.cs: 
3043         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
3044         the comparison is done with the Invariant culture.
3045
3046 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
3047
3048         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
3049         GetEnumerator method.
3050
3051         (ProbeCollectionType): Iterate starting at the most specific type
3052         upwards looking for a GetEnumerator
3053
3054         * expression.cs: Shift count can be up to 31 for int/uint and 63
3055         for long/ulong.
3056
3057 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
3058
3059         * statement.cs (Block.LookupLabel): Also look for the label on the
3060         children blocks.  Use a hash table to keep track of visited
3061         nodes. 
3062
3063         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
3064         we actually did transform the other operand, otherwise fall back
3065         to the common codepath that casts to long.
3066
3067         * cs-tokenizer.cs: Use the same code pattern as the int case.
3068         Maybe I should do the parsing myself, and avoid depending on the
3069         Parse routines to get this done.
3070
3071 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
3072
3073         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3074         which fixes bug 51347.  This time test it.
3075
3076         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
3077         attributes for example can not tell the difference between these.
3078         The difference was only a syntax feature of the language. 
3079
3080         * attribute.cs: Apply attributes to delegates.
3081
3082         * delegate.cs: Call the apply attributes method.
3083
3084 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
3085
3086         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
3087         comparing 0 vs Byte.MinValue, not the value
3088
3089         (ImplicitConversionRequired): When reporting a conversion error,
3090         use error 31 to print out the constant error instead of the
3091         simpler 29.
3092
3093         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3094         which fixes bug 51347.
3095
3096 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
3097
3098         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
3099         which fixes the -warnaserror command line option.
3100
3101 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
3102
3103         * cfold.cs (DoNumericPromotions): During constant folding of
3104         additions on UIntConstant, special case intconstants with
3105         IntConstants like we do on the expression binary operator. 
3106
3107 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
3108
3109         * convert.cs (ImplicitReferenceConversion): We were missing a case
3110         (System.Enum are not value types or class types, so we need to
3111         classify them separatedly).
3112
3113         * driver.cs: We do not support error 2007.
3114
3115 2003-11-12 Jackson Harper <jackson@ximian.com>
3116
3117         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
3118         system directory. Also use the full file name so users can
3119         libraries names mscorlib-o-tron.dll in a non system dir.
3120
3121 2003-11-10  Martin Baulig  <martin@ximian.com>
3122
3123         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
3124         (TypeManager.InitCoreTypes): Initialize them here, but instead of
3125         calling `ResolveType()' on them, directly assign their `Type'.
3126
3127 2003-11-08  Martin Baulig  <martin@ximian.com>
3128
3129         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
3130         return value and the `out parent' parameter.
3131         (TypeContainer.DefineType): Moved the CS0644 check into
3132         GetClassBases().  Don't pass the interface types to the
3133         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
3134         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
3135
3136         * ecore.cs (TypeExpr.IsAttribute): New property.
3137         (TypeExpr.GetInterfaces): New method.
3138
3139         * interface.cs (Interface.GetInterfaceTypeByName): Return a
3140         TypeExpr instead of a Type.
3141         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
3142         (Interface.DefineType): Don't pass the interface types to the
3143         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
3144         them later and then call `TypeBulider.AddInterfaceImplementation()'.
3145
3146         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
3147         instead of a `Type[]'.
3148         (TypeManager.RegisterBuilder): Likewise.
3149         (TypeManager.AddUserInterface): Likewise.
3150         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
3151         `Type[]' and also return a `TypeExpr[]'.
3152         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
3153
3154 2003-11-08  Martin Baulig  <martin@ximian.com>
3155
3156         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
3157         Expression.     
3158
3159 2003-11-08  Martin Baulig  <martin@ximian.com>
3160
3161         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
3162         TypeManager.ResolveExpressionTypes().
3163
3164         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
3165         instead of an Expression.
3166         (TypeExpr): This is now an abstract base class for `TypeExpression'.
3167         (TypeExpression): New public class; formerly known as `TypeExpr'.
3168
3169         * expression.cs (ComposedCast): Derive from TypeExpr.
3170
3171         * typemanager.cs (TypeManager.system_*_expr): These are now
3172         TypExpr's instead of Expression's.
3173         (TypeManager.ResolveExpressionTypes): New public static function;
3174         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
3175         of them.        
3176
3177 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
3178
3179         * expression.cs (New.DoResolve): Do not dereference value that
3180         might be a null return.
3181
3182         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
3183         sure that the constant value has the right type.  Fixes an
3184         unreported bug, similar to 50425.
3185
3186         * const.cs (Const.LookupConstantValue): Call
3187         ImplicitStandardConversionExists before doing a conversion to
3188         avoid havng the TypeManager.ChangeType do conversions.
3189
3190         Reduced the number of casts used
3191
3192         (Const.ChangeType): New routine to enable reuse of the constant
3193         type changing code from statement.
3194
3195         * typemanager.cs (ChangeType): Move common initialization to
3196         static global variables.
3197
3198         Fixes #50425.
3199
3200         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
3201         every value type to go through, even if it was void.  Fix that. 
3202
3203         * cs-tokenizer.cs: Use is_identifier_start_character on the start
3204         character of the define, and the is_identifier_part_character for
3205         the rest of the string.
3206
3207 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
3208
3209         * expression.cs (UnaryMutator.EmitCode): When I updated
3210         LocalVariableReference.DoResolve, I overdid it, and dropped an
3211         optimization done on local variable references.
3212
3213 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
3214
3215         * ecore.cs: Convert the return from Ldlen into an int.
3216
3217 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
3218
3219         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
3220         the accessibility, this is a special case for toplevel non-public
3221         classes (internal for instance).
3222
3223 2003-10-20  Nick Drochak <ndrochak@gol.com>
3224
3225         * ecore.cs: Fix typo and build.  Needed another right paren.
3226
3227 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
3228
3229         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
3230         `internal' case regular and protected, but not allowing protected
3231         to be evaluated later.  Bug 49840
3232
3233 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
3234
3235         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
3236         to kb.Nlast, and not the kb.nFirst to isolate the switch
3237         statement.
3238
3239         Extract the underlying type, so enumerations of long/ulong are
3240         treated like long/ulong.
3241
3242 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
3243
3244         * expression.cs (New): Overload the meaning of RequestedType to
3245         track the possible creation of the NewDelegate type, since
3246         DoResolve is invoked more than once for new constructors on field
3247         initialization.
3248
3249         See bugs: #48800 and #37014
3250
3251         * cs-parser.jay (declare_local_constants): Take an arraylist
3252         instead of a single constant.
3253
3254         (local_constant_declaration): It should take a
3255         constant_declarators, not a constant_declarator.  Fixes 49487
3256
3257         * convert.cs: Fix error report.
3258
3259 2003-10-13 Jackson Harper <jackson@ximian.com>
3260
3261         * typemanager.cs (TypeToCoreType): Add float and double this fixes
3262         bug #49611
3263
3264 2003-10-09  Martin Baulig  <martin@ximian.com>
3265
3266         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
3267         to the .ctor.
3268         (MethodCore.DoDefineParameters): Removed the TypeContainer
3269         argument; use the DeclSpace which was passed to the .ctor instead.
3270         (MethodCore.CheckParameter): Take a DeclSpace instead of a
3271         TypeContainer; we only need a DeclSpace here.
3272
3273 2003-10-09  Martin Baulig  <martin@ximian.com>
3274
3275         * class.cs (MethodData): Added additional `DeclSpace ds' argument
3276         to the .ctor.
3277         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
3278         EmitContext's .ctor.    
3279
3280 2003-10-09  Martin Baulig  <martin@ximian.com>
3281
3282         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
3283         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
3284         AsAccessible(), moved them as well.
3285
3286         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
3287
3288 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
3289
3290         * cs-parser.jay : Renamed yyName to yyNames related to jay.
3291
3292 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
3293
3294         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
3295         generation for >=, as spotted by Paolo, bug 48679.  
3296         Patch from David Waite.
3297
3298         * cs-tokenizer.cs: Add handling for #pragma.
3299
3300         * cs-parser.jay: Allow for both yield and yield return in the
3301         syntax.  The anti-cobolization of C# fight will go on!
3302
3303         * class.cs (TypeBuilder.DefineType): Catch error condition here
3304         (Parent.DefineType erroring out and returning null).
3305
3306         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
3307         coping with enumerations variables, we were mistakenly processing
3308         them as a regular value type instead of built-in types.  Fixes the
3309         bug #48063
3310
3311         * typemanager.cs (IsBuiltinOrEnum): New method.
3312
3313 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
3314
3315         * cs-parser.jay: Upgrade: yield now needs the return clause.
3316
3317 2003-09-19  Martin Baulig  <martin@ximian.com>
3318
3319         * decl.cs (MemberCache.SetupCacheForInterface): Take a
3320         `MemberCache parent' argument.  Normally, an interface doesn't
3321         have a parent type except System.Object, but we use this in gmcs
3322         for generic type parameters.
3323
3324 2003-09-18  Martin Baulig  <martin@ximian.com>
3325
3326         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
3327         on `type.IsInterface'; don't check whether the type has a parent
3328         to determine whether it's an interface.
3329
3330 2003-09-15  Martin Baulig  <martin@ximian.com>
3331
3332         * class.cs (TypeContainer.DefineType): Added an error flag to
3333         avoid reporting duplicate CS0146's ("class definition is
3334         circular.").
3335
3336         * driver.cs (Driver.MainDriver): Abort if
3337         RootContext.ResolveTree() reported any errors.
3338
3339 2003-09-07  Martin Baulig  <martin@ximian.com>
3340
3341         * report.cs (Error, Warning): Added overloaded versions which take
3342         a `params object[] args' and call String.Format().
3343
3344 2003-09-07  Martin Baulig  <martin@ximian.com>
3345
3346         * decl.cs (DeclSpace..ctor): Don't call
3347         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
3348         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
3349         (DeclSpace.RecordDecl): New method.
3350
3351         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
3352
3353 2003-09-02  Ravi Pratap  <ravi@ximian.com>
3354
3355         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
3356         value attributes to be applied to ParameterBuilders.
3357
3358         * class.cs (MethodCore.LabelParameters): Make static and more
3359         generic so that it can be used from other places - like interface
3360         methods, for instance.
3361
3362         * interface.cs (Interface.Emit): Call LabelParameters before
3363         emitting attributes on the InterfaceMethod.
3364
3365 2003-08-26  Martin Baulig  <martin@ximian.com>
3366
3367         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
3368         resolving aliases; fixes #47927.
3369
3370 2003-08-26  Martin Baulig  <martin@ximian.com>
3371
3372         * statement.cs (Using.DoResolve): This is internally emitting a
3373         try/finally clause, so we need to set ec.NeedExplicitReturn if we
3374         do not always return.  Fixes #47681.
3375
3376 2003-08-26  Martin Baulig  <martin@ximian.com>
3377
3378         * decl.cs (MemberCore): Moved WarningNotHiding(),
3379         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
3380         into MemberBase.
3381         (AdditionResult): Make this nested in DeclSpace.
3382         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
3383         argument; call NamespaceEntry.Define() unless we're nested in a
3384         class or struct.
3385
3386         * namespace.cs (Namespace.DefineName): New public function.  This
3387         is called from DeclSpace's .ctor to add 
3388         (Namespace.Lookup): Include DeclSpaces in the lookup.
3389
3390         * class.cs (Operator): Derive from MemberBase, not MemberCore.
3391
3392         * const.cs (Const): Derive from MemberBase, not MemberCore.     
3393
3394 2003-08-25  Martin Baulig  <martin@ximian.com>
3395
3396         * convert.cs (Convert.ExplicitReferenceConversion): When
3397         converting from an interface type to a class, unbox if the target
3398         type is a struct type.  Fixes #47822.
3399
3400 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3401
3402         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
3403         #47854.
3404
3405 2003-08-22  Martin Baulig  <martin@ximian.com>
3406
3407         * class.cs (TypeManager.DefineType): When defining a nested type,
3408         call DefineType() on our parent; fixes #47801.
3409
3410 2003-08-22  Martin Baulig  <martin@ximian.com>
3411
3412         * class.cs (MethodData.Define): While checking if a method is an
3413         interface implementation, improve the test a bit more to fix #47654.
3414
3415 2003-08-22  Martin Baulig  <martin@ximian.com>
3416
3417         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
3418         correctly; fixes #47722.
3419
3420 2003-08-22  Martin Baulig  <martin@ximian.com>
3421
3422         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
3423         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
3424
3425         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
3426
3427 2003-08-22  Martin Baulig  <martin@ximian.com>
3428
3429         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
3430         can only be assigned in static constructors.  Fixes #47161.
3431
3432 2003-08-22  Martin Baulig  <martin@ximian.com>
3433
3434         Rewrote and improved the flow analysis code.
3435
3436         * flowbranching.cs (FlowBranching): Make this class abstract.
3437         (FlowBranching.CreateBranching): New static function to create a
3438         new flow branching.
3439         (FlowBranchingBlock, FlowBranchingException): New classes.
3440         (FlowBranching.UsageVector.Type): New public readonly field.
3441         (FlowBranching.UsageVector.Breaks): Removed the setter.
3442         (FlowBranching.UsageVector.Returns): Removed the setter.
3443         (FlowBranching.UsageVector): Added Break(), Return(),
3444         NeverReachable() and Throw() methods to modify the reachability.
3445         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
3446         done by FlowBranching.Merge().
3447         (FlowBranching.UsageVector.MergeChild): New method; merges the
3448         merge result into the current vector.
3449         (FlowBranching.Merge): New abstract method to merge a branching.
3450
3451 2003-08-12  Martin Baulig  <martin@ximian.com>
3452
3453         * expression.cs (Indirection.CacheTemporaries): Create the
3454         LocalTemporary with the pointer type, not its element type.
3455
3456 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
3457
3458         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
3459         token was a keyword or not.
3460
3461         Add `error' options where an IDENTIFIER was expected;  Provide
3462         CheckToken and CheckIdentifierToken convenience error reporting
3463         functions. 
3464
3465         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
3466
3467         * decl.cs: Rename `NamespaceEntry Namespace' public field into
3468         NameSpaceEntry NameSpaceEntry.
3469
3470         (LookupInterfaceOrClass): Avoid creating a full qualified name
3471         from namespace and name: avoid doing lookups when we know the
3472         namespace is non-existant.   Use new Tree.LookupByNamespace which
3473         looks up DeclSpaces based on their namespace, name pair.
3474
3475         * driver.cs: Provide a new `parser verbose' to display the
3476         exception thrown during parsing.  This is turned off by default
3477         now, so the output of a failure from mcs is more graceful.
3478
3479         * namespace.cs: Track all the namespaces defined in a hashtable
3480         for quick lookup.
3481
3482         (IsNamespace): New method
3483
3484 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
3485
3486         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
3487         we know that we need to concatenate (full typename can never be
3488         null). 
3489
3490         * class.cs: ditto.
3491
3492         * statement.cs: Use a bitfield;  Do not initialize to null things
3493         which are done by the constructor by default.
3494
3495         * cs-parser.jay: bug fix, parameter was 4, not 3.
3496
3497         * expression.cs: Just use the property;
3498
3499         * statement.cs: No need for GetVariableInfo method.
3500
3501 2003-08-08  Martin Baulig  <martin@ximian.com>
3502
3503         * flowanalysis.cs (FlowReturns): This is now nested in the
3504         `FlowBranching' class.
3505         (MyBitVector): Moved this here from statement.cs.
3506         (FlowBranching.SiblingType): New enum type.
3507         (FlowBranching.CreateSibling): Added `SiblingType' argument.
3508
3509 2003-08-07  Martin Baulig  <martin@ximian.com>
3510
3511         * flowanalysis.cs (FlowBranchingType): This is now nested in the
3512         `FlowBranching' class and called `BranchingType'.
3513
3514 2003-08-07  Martin Baulig  <martin@ximian.com>
3515
3516         * flowanalysis.cs: Moved all the control flow analysis code into
3517         its own file.
3518
3519 2003-08-07  Martin Baulig  <martin@ximian.com>
3520
3521         * assign.cs (Assign.DoResolve): `target' must either be an
3522         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
3523         #37319.
3524
3525 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
3526
3527         * expression.cs (BinaryMethod): This kind of expression is created by the
3528         Binary class if it determines that the operator has to be handled
3529         by a method.
3530
3531         (BinaryDelegate): This kind of expression is created if we are
3532         dealing with a + or - operator on delegates.
3533
3534         (Binary): remove method, argumetns, and DelegateOperator: when
3535         dealing with methods, 
3536
3537         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
3538
3539         * statement.cs (Block): use bitfields for the three extra booleans
3540         we had in use.   Remove unused topblock parameter.
3541
3542         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
3543
3544         * assign.cs: Drop extra unneeded tests.
3545
3546 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
3547
3548         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
3549
3550         * statement.cs (Foreach): Use VariableStorage instead of
3551         LocalBuilders.   
3552
3553         * codegen.cs (VariableStorage): New class used by clients that
3554         require a variable stored: locals or fields for variables that
3555         need to live across yield.
3556
3557         Maybe provide a convenience api for EmitThis+EmitLoad?
3558
3559         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
3560         these bad boys.
3561
3562 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
3563
3564         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
3565         RemapParameterLValue): New methods that are used to turn a
3566         precomputed FieldInfo into an expression like this:
3567
3568                 instance.FieldInfo
3569
3570         The idea is to use this instead of making LocalVariableReference
3571         have more than one meaning.
3572
3573         * cs-parser.jay: Add error production to BASE.
3574
3575         * ecore.cs: Deal with TypeManager.GetField returning null, which
3576         is now a valid return value.
3577
3578         (FieldExprNoAddress): New expression for Fields whose address can
3579         not be taken.
3580
3581         * expression.cs (LocalVariableReference): During the resolve
3582         phases, create new expressions if we are in a remapping context.
3583         Remove code that dealt with remapping here.
3584
3585         (ParameterReference): same.
3586
3587         (ProxyInstance): New expression, like the `This' expression, but
3588         it is born fully resolved.  We know what we are doing, so remove
3589         the errors that are targeted to user-provided uses of `this'.
3590
3591         * statement.cs (Foreach): our variable is now stored as an
3592         Expression;  During resolution, follow the protocol, dont just
3593         assume it will return this.
3594
3595 2003-08-06  Martin Baulig  <martin@ximian.com>
3596
3597         * support.cs (SeekableStreamReader.cs): New public class.
3598
3599         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
3600         SeekableStreamReader instead of the normal StreamReader.
3601
3602 2003-08-04  Martin Baulig  <martin@ximian.com>
3603
3604         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
3605         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
3606         deambiguate casts and delegate invocations.
3607         (parenthesized_expression): Use the new tokens to ensure this is
3608         not a cast of method invocation.
3609
3610         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
3611         when reading a `)' and Deambiguate_CloseParens () was previously
3612         called.
3613
3614         * expression.cs (ParenthesizedExpression): New class.  This is
3615         just used for the CS0075 test.
3616         (Binary.DoResolve): Check for CS0075.   
3617
3618 2003-07-29  Ravi Pratap  <ravi@ximian.com>
3619
3620         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
3621         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
3622         reference comparison.
3623
3624         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
3625         examine the ReturnType for equality - this is necessary in the
3626         cases of implicit and explicit operators whose signature also
3627         includes the return type.
3628
3629 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
3630
3631         * namespace.cs: Cache the result of the namespace computation,
3632         instead of computing it every time.
3633
3634 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
3635
3636         * decl.cs: Use a global arraylist that we reuse over invocations
3637         to avoid excesive memory consumption.  Reduces memory usage on an
3638         mcs compile by one meg (45 average).
3639
3640         * typemanager.cs (LookupTypeReflection): In .NET pointers are
3641         private, work around that.
3642
3643 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
3644
3645         * literal.cs (IntLiteral): Define Zero and One static literals. 
3646
3647         * cs-parser.jay (integer_literal): use static literals to reduce
3648         memory usage for the most used literals (0, 1 and -1).  211kb
3649         reduced in memory usage.
3650
3651         Replace all calls to `new ArrayList' with `new
3652         ArrayList(4)' which is a good average number for most allocations,
3653         and also requires only 16 bytes of memory for its buffer by
3654         default. 
3655
3656         This reduced MCS memory usage in seven megabytes for the RSS after
3657         bootstrapping.
3658
3659 2003-07-28  Ravi Pratap  <ravi@ximian.com>
3660
3661         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
3662         handle params methods the correct way by forming only one
3663         applicable set with params and normal methods in them. Earlier we
3664         were looking at params methods only if we found no normal methods
3665         which was not the correct thing to do.
3666
3667         (Invocation.BetterFunction): Take separate arguments indicating
3668         when candidate and the best method are params methods in their
3669         expanded form.
3670
3671         This fixes bugs #43367 and #46199.
3672
3673         * attribute.cs: Documentation updates.
3674
3675         (CheckAttribute): Rename to CheckAttributeTarget.
3676         (GetValidPlaces): Rename to GetValidTargets.
3677
3678         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
3679         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
3680
3681         Fixes bug #44468.
3682
3683 2003-07-28  Martin Baulig  <martin@ximian.com>
3684
3685         * class.cs (TypeContainer.DefineMembers): Use the base type's full
3686         name when looking up the base class of a nested class.  Fixes #46977.
3687
3688 2003-07-26  Martin Baulig  <martin@ximian.com>
3689
3690         * expression.cs (Indexers.Indexer): New nested struct; contains
3691         getter, setter and the indexer's type.
3692         (Indexers.Properties): This is now an ArrayList of
3693         Indexers.Indexer's.
3694         (IndexerAccess.DoResolveLValue): Correctly set the type if the
3695         indexer doesn't have any getters.
3696
3697         * assign.cs (Assign.DoResolve): Also do the implicit conversions
3698         for embedded property and indexer assignments.
3699
3700 2003-07-26  Martin Baulig  <martin@ximian.com>
3701
3702         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
3703         preprocessor directive is not the first non-whitespace character
3704         on a line.
3705
3706 2003-07-26  Martin Baulig  <martin@ximian.com>
3707
3708         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
3709         namespace parsing, follow the spec more closely.
3710
3711         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
3712         NamespaceEntry.Lookup().
3713
3714 2003-07-25  Martin Baulig  <martin@ximian.com>
3715
3716         * MethodCore.cs (OverridesSomething): New public field; it's set
3717         from TypeContainer.DefineMembers if this method overrides
3718         something (which doesn't need to be a method).  Fix #39462.
3719
3720 2003-07-25  Ravi Pratap  <ravi@ximian.com>
3721
3722         * typemanager.cs (GetMembers): Ensure that the list of members is
3723         reversed. This keeps things in sync.
3724
3725         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
3726         find an AttributeUsage attribute.
3727
3728         * expression.cs (Invocation.OverloadResolve): Perform the check
3729         which disallows Invoke to be directly called on a Delegate.
3730
3731         (Error_InvokeOnDelegate): Report error cs1533.
3732
3733 2003-07-25  Martin Baulig  <martin@ximian.com>
3734
3735         * expression.cs (Indexers.GetIndexersForType): Only look in the
3736         interface hierarchy if the requested type is already an
3737         interface.  Fixes #46788 while keeping #46502 fixed.
3738
3739 2003-07-25  Martin Baulig  <martin@ximian.com>
3740
3741         * class.cs (TypeContainer.DefineMembers): Check whether all
3742         readonly fields have been assigned and report warning CS0649 if
3743         not.
3744
3745         * statement.cs (LocalInfo.IsFixed): Always return true if this is
3746         a valuetype.
3747
3748 2003-07-24  Ravi Pratap  <ravi@ximian.com>
3749
3750         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
3751         returned from GetMethods to make things consistent with the
3752         assumptions MCS makes about ordering of methods.
3753
3754         This should comprehensively fix bug #45127 and it does :-)
3755
3756         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
3757         ordering is actually reverse.
3758
3759         * Clean up some debug messages I left lying around.
3760
3761         * interface.cs (Populate*): Get rid of code which emits attributes
3762         since the stage in which we emit attributes is the 'Emit' stage,
3763         not the define stage.
3764
3765         (Emit): Move attribute emission for interface members here.
3766
3767 2003-07-22  Ravi Pratap  <ravi@ximian.com>
3768
3769         * expression.cs (Invocation.OverloadResolve): Follow the spec more
3770         closely: we eliminate methods in base types when we have an
3771         applicable method in a top-level type.
3772
3773         Please see section 14.5.5.1 for an exact description of what goes
3774         on. 
3775
3776         This fixes bug #45127 and a host of other related to corlib compilation.
3777
3778         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
3779         array is the method corresponding to the top-level type (this is
3780         because of the changes made to icall.c) so we change this
3781         accordingly.
3782
3783         (MethodGroupExpr.Name): This too.
3784
3785         * typemanager.cs (GetElementType): New method which does the right
3786         thing when compiling corlib. 
3787
3788         * everywhere: Make use of the above in the relevant places.
3789
3790 2003-07-22  Martin Baulig  <martin@ximian.com>
3791
3792         * cs-parser.jay (invocation_expression): Moved
3793         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
3794         `cast_expression', but create a InvocationOrCast which later
3795         resolves to either an Invocation or a Cast.
3796
3797         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
3798         method; call this before EmitStatement() to make sure that this
3799         expression can be used as a statement.
3800
3801         * expression.cs (InvocationOrCast): New class; resolves to either
3802         an Invocation or a Cast.
3803
3804         * statement.cs (StatementExpression): Call ResolveStatement() on
3805         the ExpressionStatement before emitting it.
3806
3807 2003-07-21  Martin Baulig  <martin@ximian.com>
3808
3809         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
3810         `ref' and `out' attributes match; fixes #46220.
3811         (MemberAccess.ResolveMemberAccess): You can't reference a type
3812         through an expression; fixes #33180.
3813         (Indexers.GetIndexersForType): Don't return the indexers from
3814         interfaces the class implements; fixes #46502.
3815
3816 2003-07-21  Martin Baulig  <martin@ximian.com>
3817
3818         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
3819         CS0661 checks; fixes bug #30442.
3820
3821 2003-07-21  Martin Baulig  <martin@ximian.com>
3822
3823         * decl.cs (AdditionResult): Added `Error'.
3824
3825         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
3826
3827         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
3828         makes cs0031.cs actually work.
3829
3830 2003-07-20  Martin Baulig  <martin@ximian.com>
3831
3832         * namespace.cs: Fixed that bug which caused a crash when compiling
3833         the debugger's GUI.
3834
3835 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
3836
3837         * typemanager.cs (LookupTypeReflection): Never expose types which
3838         are NotPublic, NestedPrivate, NestedAssembly, or
3839         NestedFamANDAssem.  We used to return these, and later do a check
3840         that would report a meaningful error, but the problem is that we
3841         would not get the real match, if there was a name override.
3842
3843 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
3844
3845         * namespace.cs (Namespace, Name): Do not compute the namespace
3846         name dynamically, compute it in the constructor.  This reduced
3847         memory usage by 1697 KB.
3848
3849         * driver.cs: Use --pause to pause at the end.
3850
3851 2003-07-17  Peter Williams  <peter@newton.cx>
3852
3853         * Makefile: Change the name of the test target so that it doesn't
3854         conflict with the recursive test target.
3855
3856 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
3857
3858         * expression.cs (LocalVariableReference.Emit, EmitAssign,
3859         AddressOf): Do not use EmitThis, that was wrong, use the actual
3860         this pointer.
3861
3862 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
3863
3864         * class.cs (MethodData.Define): While checking if a method is an
3865         interface implementation, improve the test: If we are not public
3866         (use new test here: use the computed MethodAttributes directly,
3867         instead of the parsed modifier flags) check if the `implementing'
3868         method comes from an interface or not.
3869
3870         * pending.cs (VerifyPendingMethods): Slightly better error
3871         message.
3872
3873         * makefile: add test target that does the mcs bootstrap.
3874
3875 2003-07-16  Ravi Pratap  <ravi@ximian.com>
3876
3877         * interface.cs (Define): Do nothing here since there are no
3878         members to populate etc. Move the attribute emission out of here
3879         since this was just totally the wrong place to put it. Attribute
3880         application happens during the 'Emit' phase, not in the 'Define'
3881         phase.
3882
3883         (Emit): Add this method and move the attribute emission here
3884
3885         * rootcontext.cs (EmitCode): Call the Emit method on interface
3886         types too.
3887
3888 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3889
3890         * expression.cs (OverloadResolve): Report error only if Location
3891         is not 'Null' which means that there was a probe going on.
3892
3893 2003-07-14  Martin Baulig  <martin@ximian.com>
3894
3895         * expression.cs (ConditionalLogicalOperator): New public class to
3896         implement user defined conditional logical operators.
3897         This is section 14.11.2 in the spec and bug #40505.
3898
3899 2003-07-14  Martin Baulig  <martin@ximian.com>
3900
3901         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
3902
3903 2003-07-14  Martin Baulig  <martin@ximian.com>
3904
3905         * codegen.cs (EmitContext.InFixedInitializer): New public field.
3906
3907         * ecore.cs (IVariable.VerifyFixed): New interface method.
3908
3909         * expression.cs (Unary.ResolveOperator): When resolving the `&'
3910         operator, check whether the variable is actually fixed.  Fixes bug
3911         #36055.  Set a variable definitely assigned when taking its
3912         address as required by the spec.
3913
3914         * statement.cs (LocalInfo.IsFixed): New field.
3915         (LocalInfo.MakePinned): Set `IsFixed' to true.
3916
3917 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3918
3919         * attribute.cs (Attribute.Resolve): While doing a Member lookup
3920         for .ctors, ensure that we only ask for members declared in the
3921         attribute type (BindingFlags.DeclaredOnly).
3922
3923         Fixes bug #43632.
3924
3925         * expression.cs (Error_WrongNumArguments): Report error 1501
3926         correctly the way CSC does.
3927
3928 2003-07-13  Martin Baulig  <martin@ximian.com>
3929
3930         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
3931         lookup on the fully qualified name, to make things like "X.X" work
3932         where "X.X" is a fully qualified type name, but we also have a
3933         namespace "X" in the using list.  Fixes #41975.
3934
3935 2003-07-13  Martin Baulig  <martin@ximian.com>
3936
3937         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
3938         function. If we're a CompoundAssign, we need to create an embedded
3939         CompoundAssign, not an embedded Assign.
3940         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
3941         Fixes #45854.
3942
3943 2003-07-13  Martin Baulig  <martin@ximian.com>
3944
3945         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
3946         work to fix bug #46088.
3947
3948 2003-07-13  Ravi Pratap <ravi@ximian.com>
3949
3950         * class.cs (Operator.Emit): Do not emit attributes here - it is
3951         taken care of by the Method class that we delegate too. This takes
3952         care of bug #45876.
3953
3954 2003-07-10  Martin Baulig  <martin@ximian.com>
3955
3956         * expression.cs (TypeOfVoid): New class.
3957         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
3958
3959 2003-07-10  Martin Baulig  <martin@ximian.com>
3960
3961         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
3962         bug #35957.
3963
3964 2003-07-10  Martin Baulig  <martin@ximian.com>
3965
3966         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
3967         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
3968
3969         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
3970
3971         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
3972
3973 2003-07-10  Martin Baulig  <martin@ximian.com>
3974
3975         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
3976         of decimal.  Fixes #42850.
3977
3978         NOTE: I also fixed the created byte blob, but this doesn't work on
3979         the MS runtime and csc never produces any byte blobs for decimal
3980         arrays.
3981
3982 2003-07-10  Martin Baulig  <martin@ximian.com>
3983
3984         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
3985         structs; fixes #32068.
3986         (Block.AddChildVariableNames): Fixed #44302.
3987
3988 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3989
3990         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
3991
3992 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3993
3994         * attribute.cs: And this test is onger needed.
3995
3996 2003-07-08  Martin Baulig  <martin@ximian.com>
3997
3998         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
3999         inaccessible types.  Fixes #36313.
4000
4001         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
4002
4003         * namespace.cs (NamespaceEntry): Create implicit entries for all
4004         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
4005         implicit entries for N1.N2 and N1.
4006
4007 2003-07-08  Martin Baulig  <martin@ximian.com>
4008
4009         Rewrote the handling of namespaces to fix a lot of the issues
4010         wrt. `using' aliases etc.
4011
4012         * namespace.cs (Namespace): Splitted this class into a
4013         per-assembly `Namespace' and a per-file `NamespaceEntry'.
4014
4015         * typemanager.cs (TypeManager.IsNamespace): Removed.
4016         (TypeManager.ComputeNamespaces): Only compute namespaces from
4017         loaded assemblies here, not the namespaces from the assembly we're
4018         currently compiling.
4019
4020 2003-07-08  Martin Baulig  <martin@ximian.com>
4021
4022         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
4023
4024 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4025
4026         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
4027         already fixed it.  
4028
4029         I thought about the memory savings here, but LookupTypeReflection
4030         is used under already very constrained scenarios.  Compiling
4031         corlib or mcs only exposes one hit, so it would not really reduce
4032         any memory consumption.
4033
4034 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4035
4036         * typemanager.cs: fixes bug #45889 by only adding public types from
4037         other assemblies to the list of known types.
4038
4039 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4040
4041         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
4042         on the type we resolved.
4043
4044 2003-07-05  Martin Baulig  <martin@ximian.com>
4045
4046         * pending.cs (PendingImplementation.ParentImplements): Don't
4047         create the proxy if the parent is abstract.
4048
4049         * class.cs (TypeContainer.DefineIndexers): Process explicit
4050         interface implementations first.  Fixes #37714.
4051
4052 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
4053
4054         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
4055         defined recursively;  but since we modify the input parameters
4056         (left is set to `this' temporarily), we reset this value if the
4057         left_is_explicit is false, which gives the original semantics to
4058         the code.  
4059
4060         * literal.cs (NullPointer): new class used to represent a null
4061         literal in a pointer context.
4062
4063         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
4064         type is a pointer, use a NullPointer object instead of a
4065         NullLiteral.   Closes 43687
4066
4067         (ExplicitConversion): Convert pointer values using
4068         the conv opcode to the proper type.
4069
4070         * ecore.cs (New): change ValueTypeVariable property into a method,
4071         that returns whether the valuetype is suitable for being used.
4072
4073         * expression.cs (Binary.DoNumericPromotions): Only return if we
4074         the int constant was a valid uint, and we can return both left and
4075         right as uints.  If not, we continue processing, to trigger the
4076         type conversion.  This fixes 39018.
4077
4078         * statement.cs (Block.EmitMeta): During constant resolution, set
4079         the CurrentBlock property on the emitcontext, so that we resolve
4080         constants propertly.
4081
4082 2003-07-02  Martin Baulig  <martin@ximian.com>
4083
4084         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
4085         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
4086
4087         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
4088         than emitting it here.
4089
4090         * statement.cs: Fixed some more flow analysis bugs.
4091
4092 2003-07-02  Martin Baulig  <martin@ximian.com>
4093
4094         * class.cs (MethodData.Define): When implementing interface
4095         methods, set Final unless we're Virtual.
4096
4097         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
4098         check work for interface methods.
4099
4100 2003-07-01  Martin Baulig  <martin@ximian.com>
4101
4102         * ecore.cs (EmitContext.This): Replaced this property with a
4103         GetThis() method which takes a Location argument.  This ensures
4104         that we get the correct error location for a CS0188.
4105
4106 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
4107
4108         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
4109         ImplicitStandardConversion.
4110
4111         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
4112
4113 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
4114
4115         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
4116         optimization.
4117
4118 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
4119
4120         * class.cs (Constructor.Define): Turn off initlocals for unsafe
4121         constructors.
4122
4123         (MethodData.Define): Turn off initlocals for unsafe methods.
4124
4125 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
4126
4127         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
4128         complete;  Fixes #37521.
4129
4130         * delegate.cs: Use Modifiers.TypeAttr to compute the
4131         TypeAttributes, instead of rolling our own.  This makes the flags
4132         correct for the delegates.
4133
4134 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
4135
4136         * class.cs (Constructor.Define): Set the private flag for static
4137         constructors as well.
4138
4139         * cs-parser.jay (statement_expression): Set the return value to
4140         null, to avoid a crash when we catch an error.
4141
4142 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
4143
4144         * cs-parser.jay: Applied patch from Jackson that adds support for
4145         extern and unsafe modifiers to destructor declarations.
4146
4147         * expression.cs: Report error 21 if the user is trying to index a
4148         System.Array.
4149
4150         * driver.cs: Add an error message, suggested by the bug report.
4151
4152         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
4153         if we do not have a ": this ()" constructor initializer.  Fixes 45149
4154
4155 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
4156
4157         * namespace.cs: Add some information to reduce FAQs.
4158
4159 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
4160
4161         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
4162         underlying enumeration types.  Fixes #43915.
4163
4164         * expression.cs: Treat ushort/short as legal values to be used in
4165         bitwise operations.
4166
4167 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
4168
4169         * delegate.cs: transfer custom attributes for paramenters from
4170         the delegate declaration to Invoke and BeginInvoke.
4171
4172 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
4173
4174         * attribute.cs: handle custom marshalers and emit marshal info
4175         for fields, too.
4176
4177 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
4178
4179         * makefile.gnu: Added anonymous.cs to the compiler sources.
4180
4181 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
4182
4183         * iterators.cs: Change the name of the proxy class to include two
4184         underscores.
4185
4186         * cs-parser.jay: Update grammar to include anonymous methods.
4187
4188         * anonymous.cs: new file.
4189
4190 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
4191
4192         * class.cs (Field.Define): Add missing test for pointers and
4193         safety. 
4194
4195 2003-05-27  Ravi Pratap  <ravi@ximian.com>
4196
4197         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
4198         we use the stobj opcode.
4199
4200         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
4201         since it wasn't the correct fix. 
4202
4203         It still is puzzling that we are required to use stobj for IntPtr
4204         which seems to be a ValueType.
4205
4206 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
4207
4208         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
4209         during regular simple name resolution.   Now, the trick is that
4210         instead of returning for processing the simplename, we do a
4211         TypeManager.LookupType (ie, a rooted lookup as opposed to a
4212         contextual lookup type).   If a match is found, return that, if
4213         not, return for further composition.
4214
4215         This fixes long-standing 30485.
4216
4217         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4218         using the address to initialize an object, do an Stobj instead of
4219         using the regular Stelem.
4220
4221         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
4222         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
4223         Because if we are a BaseIndexerAccess that value will be true.
4224         Fixes 43643.
4225
4226         * statement.cs (GotoCase.Resolve): Return after reporting an
4227         error, do not attempt to continue. 
4228
4229         * expression.cs (PointerArithmetic.Emit): If our operand is a
4230         long, convert our constants to match the operand before
4231         multiplying.  Convert to I type before adding.   Fixes 43670.
4232
4233 2003-05-14  Ravi Pratap  <ravi@ximian.com>
4234
4235         * enum.cs (ImplicitConversionExists) : Rename to
4236         ImplicitEnumConversionExists to remove ambiguity. 
4237
4238         * ecore.cs (NullCast): New type of cast expression class which
4239         basically is very similar to EmptyCast with the difference being
4240         it still is a constant since it is used only to cast a null to
4241         something else
4242         (eg. (string) null)
4243
4244         * convert.cs (ImplicitReferenceConversion): When casting a null
4245         literal, we return a NullCast.
4246
4247         * literal.cs (NullLiteralTyped): Remove - I don't see why this
4248         should be around anymore.
4249
4250         The renaming (reported was slightly wrong). Corrections:
4251
4252         ConvertImplicitStandard -> ImplicitConversionStandard
4253         ConvertExplicitStandard -> ExplicitConversionStandard
4254
4255         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
4256         before passing them in !
4257
4258         * convert.cs (ImplicitConversionStandard): When comparing for
4259         equal expr and target types, ensure that expr is not a
4260         NullLiteral.
4261
4262         In general, we must not be checking (expr_type ==
4263         target_type) in the top level conversion methods
4264         (ImplicitConversion, ExplicitConversion etc). This checking is
4265         done in the methods that they delegate to.
4266
4267 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
4268
4269         * convert.cs: Move Error_CannotConvertType,
4270         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
4271         ImplicitNumericConversion, ImplicitConversionExists,
4272         ImplicitUserConversionExists, StandardConversionExists,
4273         FindMostEncompassedType, FindMostSpecificSource,
4274         FindMostSpecificTarget, ImplicitUserConversion,
4275         ExplicitUserConversion, GetConversionOperators,
4276         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
4277         TryImplicitIntConversion, Error_CannotConvertImplicit,
4278         ConvertImplicitRequired, ConvertNumericExplicit,
4279         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
4280         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
4281         its own file.
4282
4283         Perform the following renames:
4284
4285         StandardConversionExists -> ImplicitStandardConversionExists
4286         ConvertImplicit -> ImplicitConversion
4287         ConvertImplicitStandard -> ImplicitStandardConversion
4288         TryImplicitIntConversion -> ImplicitIntConversion
4289         ConvertImplicitRequired -> ImplicitConversionRequired
4290         ConvertNumericExplicit -> ExplicitNumericConversion
4291         ConvertReferenceExplicit -> ExplicitReferenceConversion
4292         ConvertExplicit -> ExplicitConversion
4293         ConvertExplicitStandard -> ExplicitStandardConversion
4294
4295 2003-05-19  Martin Baulig  <martin@ximian.com>
4296
4297         * statement.cs (TypeInfo.StructInfo): Made this type protected.
4298         (TypeInfo): Added support for structs having structs as fields.
4299
4300         * ecore.cs (FieldExpr): Implement IVariable.
4301         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
4302         VariableInfo for the field.
4303
4304 2003-05-18  Martin Baulig  <martin@ximian.com>
4305
4306         * expression.cs (This.DoResolve): Report a CS0027 if we're
4307         emitting a field initializer.
4308
4309 2003-05-18  Martin Baulig  <martin@ximian.com>
4310
4311         * expression.cs (This.ResolveBase): New public function.
4312         (This.DoResolve): Check for CS0188.
4313
4314         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
4315         This.Resolve().
4316
4317         * ecore.cs (MethodGroupExpr.DoResolve): Set the
4318         `instance_expression' to null if we don't have any non-static
4319         methods.
4320
4321 2003-05-18  Martin Baulig  <martin@ximian.com>
4322
4323         Reworked the way how local variables and parameters are handled by
4324         the flow analysis code.
4325
4326         * statement.cs (TypeInfo, VariableMap): New public classes.
4327         (VariableInfo): New public class.  This is now responsible for
4328         checking whether a variable has been assigned.  It is used for
4329         parameters and local variables.
4330         (Block.EmitMeta): Take the InternalParameters as argument; compute
4331         the layout of the flow vectors here.
4332         (Block.LocalMap, Block.ParameterMap): New public properties.
4333         (FlowBranching): The .ctor doesn't get the InternalParameters
4334         anymore since Block.EmitMeta() now computes the layout of the flow
4335         vector.
4336         (MyStructInfo): This class is now known as `StructInfo' and nested
4337         in `TypeInfo'; we don't access this directly anymore.
4338
4339         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
4340         property and removed IsAssigned(), IsFieldAssigned(),
4341         SetAssigned() and SetFieldAssigned(); we now call them on the
4342         VariableInfo so we don't need to duplicate this code everywhere.
4343
4344         * expression.cs (ParameterReference): Added `Block block' argument
4345         to the .ctor.
4346         (LocalVariableReference, ParameterReference, This): The new
4347         VariableInfo class is now responsible for all the definite
4348         assignment stuff.
4349
4350         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
4351         IsParameterAssigned, SetParameterAssigned): Removed.
4352
4353 2003-05-18  Martin Baulig  <martin@ximian.com>
4354
4355         * typemanager.cs (InitCoreTypes): Try calling
4356         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
4357         the 3-args-version.  Corlib now also needs our `void_type'.
4358         (GetMethod): Added overloaded version which takes an optional
4359         `bool report_errors' to allow lookups of optional methods.
4360
4361 2003-05-12  Martin Baulig  <martin@ximian.com>
4362
4363         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
4364         only used for locals and not for parameters.
4365
4366 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
4367
4368         * support.cs (InternalParameters.ParameterType): Return the
4369         ExternalType of the parameter.
4370
4371         * parameter.cs (Parameter.ExternalType): drop the two arguments,
4372         they were unused.
4373
4374 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
4375
4376         * class.cs (MethodData.Define): Do not set the `newslot' on
4377         interface members, if they are also flagged as "override".
4378
4379         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
4380         better code for ++i and i++.  This only works for static fields
4381         and local variables.
4382
4383         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
4384         want to pull the DeclSpace out of the builder_to_declspace instead
4385         of the TypeBuilder (like in TypeContainer.FindMembers).
4386
4387         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
4388         instead of LookupTypeContainer.  Fixes the crash on .NET for
4389         looking up interface members.
4390
4391         * const.cs: Create our own emit context during the Definition
4392         stage, so that constants are evaluated in the proper context, when
4393         a recursive definition happens.
4394
4395 2003-05-11  Martin Baulig  <martin@ximian.com>
4396
4397         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
4398         new block for a switch section.
4399         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
4400         the adding/lookup in the switch block.  Fixes #39828.
4401
4402 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
4403
4404         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
4405         functionality: I needed to convert the data after I had performed
4406         the add/sub operation into the operands type size.
4407
4408         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
4409         pass the type for the box operation, otherwise the resulting
4410         object would have been of type object.
4411
4412         (BoxedCast): Add constructor to specify the type to box as.
4413
4414 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
4415
4416         * iterators.cs: I was reusing the `count' variable inadvertently,
4417         take steps to not allow this to happen.
4418
4419 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
4420
4421         * attribute.cs (Attribute.Resolve): Params attributes are encoded
4422         by creating an array at the point where the params starts and
4423         putting all those arguments there, then adjusting the size of the
4424         array.
4425
4426 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
4427
4428         * expression.cs (New.AddressOf): Implement interface
4429         IMemoryLocation.  This is used when the `new' operator is used in
4430         the context of an invocation to a method on a value type.
4431
4432         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
4433         example. 
4434
4435         * namespace.cs: Also check the using aliases here.
4436
4437         * driver.cs: Move the test for using validity after the types have
4438         been entered, so we do a single pass that also includes the using
4439         aliases. 
4440
4441         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
4442         in the regular case.   CreateSiblingForFinally is doing extra
4443         error checking.
4444
4445         * attribute.cs (GetAttributeArgumentExpression): Store the result
4446         on an out value, and use the return value to indicate failure
4447         instead of using null (which is a valid return for Constant.GetValue).
4448
4449         * statement.cs: Perform the analysis flow for the increment
4450         portion after the statement, because this will be the real flow of
4451         execution.  Fixes #42385
4452
4453         * codegen.cs (EmitContext.EmitArgument,
4454         EmitContext.EmitStoreArgument): New helper functions when the
4455         RemapToProxy flag is set.
4456
4457         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
4458         function.
4459
4460         Add support for remapping parameters. 
4461
4462         * iterators.cs: Propagate parameter values;  Store parameter
4463         values in the proxy classes.
4464
4465 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
4466
4467         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
4468         need a proxy reference;  I do not know what I was thinking
4469
4470         * cs-parser.jay (constructor_initializer): catch another error,
4471         and display nice message.
4472
4473         (field_declaration): catch void field declaration
4474         to flag a better error. 
4475
4476         * class.cs (MemberBase.CheckBase): Report an error instead of a
4477         warning if a new protected member is declared in a struct. 
4478         (Field.Define): catch the error of readonly/volatile.
4479
4480         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
4481
4482         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
4483         volatile variable is taken
4484
4485 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
4486
4487         * statement.cs (Fixed.Resolve): Report an error if we are not in
4488         an unsafe context.
4489
4490 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
4491
4492         * typemanager.cs: reuse the code that handles type clashes for
4493         delegates and enumerations.
4494
4495         * class.cs (Report28): Always report.
4496
4497         * expression.cs (EncodeAsAttribute): Allow nulls here.
4498
4499 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
4500
4501         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
4502         the functionality for testing whether an expression is valid for
4503         an attribute here.  Also handle the case of arrays of elements
4504         being stored. 
4505
4506         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
4507         encoding a linear array into an array of objects that are suitable
4508         to be passed to an CustomAttributeBuilder.
4509
4510         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
4511
4512         * ecore.cs: (FieldExpr): Handle field remapping here.
4513
4514         * iteratators.cs: Pass the instance variable (if the method is an
4515         instance method) to the constructors, so we can access the field
4516         variables on the class.
4517
4518         TODO: Test this with structs.  I think the THIS variable on
4519         structs might have to be a pointer, and not a refenrece
4520
4521 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
4522
4523         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
4524         local variables to fields in a proxy class.
4525
4526         * iterators.cs (PopulateProxy): Rename our internal fields to
4527         <XXX>.  
4528         Create a <THIS> field if we are an instance method, so we can
4529         reference our parent container variables.
4530         (MapVariable): Called back from the EmitContext code to enter a
4531         new variable to field mapping into the proxy class (we just create
4532         a FieldBuilder).
4533
4534         * expression.cs
4535         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
4536         for using the remapped locals to fields.
4537
4538         I placed the code here, because that gives the same semantics to
4539         local variables, and only changes the Emit code.
4540
4541         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
4542         statements inside iterators.
4543         (VariableInfo): Add a FieldBuilder for the cases when we are
4544         remapping local variables to fields in a proxy class
4545
4546         * ecore.cs (SimpleNameResolve): Avoid testing two times for
4547         current_block != null.
4548
4549         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
4550         not cope with strings, as it has been moved to the
4551         TableSwitchEmit.  Fixed bug in switch generation.
4552
4553         * expression.cs (New.DoResolve): Provide more context for the user
4554         when reporting an error.
4555
4556         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
4557         pointers. 
4558
4559         * expression.cs (MemberAccess.DoResolve): When we get a type back,
4560         check the permissions for it.  Note than in a type-resolution
4561         context the check was already present in DeclSpace.ResolveType,
4562         but was missing from the MemberAccess.
4563
4564         (ArrayCreation.CheckIndices): warn if the user has
4565         more nested levels of expressions, but there are no more
4566         dimensions specified.  Avoids crash on bug 41906.
4567
4568 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
4569
4570         * statement.cs (Block): replace Implicit bool, for a generic
4571         flags.   
4572         New flag: `Unchecked'.  This is used during the EmitMeta phase
4573         (which is out-of-line with the regular Resolve/Emit process for a
4574         statement, as this is done ahead of time, but still gets a chance
4575         to call constant resolve).
4576
4577         (Block.Flags): new enum for adding a new flag.
4578
4579         (Block.EmitMeta): track the state of unchecked.
4580
4581         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
4582         to enable constant resolution to work there as well.
4583
4584 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
4585
4586         * typemanager.cs (ienumerable_type): Also look up
4587         System.Collections.IEnumerable. 
4588
4589 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
4590
4591         TODO: Test more than one conditional per method.
4592
4593         * class.cs (Indexer.Define): Report the location where the user is
4594         referencing the unsupported feature.
4595
4596         (MethodData): Overload the use of `conditionals' to
4597         minimize the creation of needless ArrayLists.   This saves roughly
4598         212kb on my machine.
4599
4600         (Method): Implement the new IIteratorContainer interface.
4601         (Method.SetYields): Implement the method by setting the ModFlags
4602         to contain METHOD_YIELDS.
4603
4604         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
4605         which just got set to null.
4606
4607         * iterators.cs: New file.
4608
4609         (Yield, YieldBreak): New statements.
4610
4611         * statement.cs (Return.Resolve): Flag an error if we are used in
4612         an iterator method.
4613
4614         * codegen.cs (InIterator): New flag set if the code is being
4615         compiled in an iterator method.
4616
4617         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
4618         internal modifier, and we just use it to avoid adding extra
4619         fields, as this is seldom used.  
4620
4621         * cs-parser.jay: Add yield_statement (yield and yield break).
4622
4623         * driver.cs: New flag -v2 to turn on version 2 features. 
4624
4625         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
4626         hashtable when v2 is enabled.
4627
4628 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
4629
4630         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
4631         there is already a namespace defined with this name.
4632
4633         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
4634         people upgraded their corlibs.
4635
4636         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
4637         always use fully qualified types, no need to use the compiler
4638         front end.
4639
4640         (TypeManager.IsNamespace): Use binarysearch.
4641
4642         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
4643         AddDelegate): I did not quite use the new IsValid API properly: I
4644         have to pass the short-name and the fullname.  I was passing only
4645         the basename instead of the fullname sometimes. 
4646
4647         (TypeContainer.DefineType): call NamespaceClash.
4648
4649         * interface.cs (Interface.DefineType): use NamespaceClash before
4650         defining the type.
4651
4652         * delegate.cs (Delegate.DefineType): use NamespaceClash before
4653         defining the type.
4654
4655         * enum.cs: (Enum.DefineType): use NamespaceClash before
4656         defining the type.
4657
4658         * typemanager.cs (: 3-line patch that gives us some tasty 11%
4659         speed increase.  First, use the negative_hits cache when we get a
4660         negative.  Second, add the type with its full original name
4661         instead of the new . and + encoded name (reflection uses + to
4662         separate type from a nested type).  Use LookupTypeReflection
4663         directly which bypasses the type->name hashtable (that we already
4664         know does not contain the type.
4665
4666         * decl.cs (DeclSpace.ResolveTypeExpr): track the
4667         location/container type. 
4668
4669         * driver.cs: When passing utf8, use directly the UTF8Encoding.
4670
4671 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
4672
4673         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
4674
4675         * delegate.cs (NewDelegate.Resolve): Test whether an instance
4676         method is being referenced in the method group from a static
4677         context, and report error 120 if so.
4678
4679         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
4680         Error118. 
4681
4682         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
4683         is created, we create the A namespace).
4684
4685         * cs-parser.jay: A namespace also introduces a DeclarationFound.
4686         Fixes #41591
4687
4688 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
4689
4690         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
4691         invocation to ModuleBuilder.GetType with the same values will
4692         return a new type instance, so we need to cache its return
4693         values. 
4694
4695         * expression.cs (Binary.ResolveOperator): Only allow the compare
4696         operators on enums if they are of the same type.
4697
4698         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
4699         types of ValueType on their own case.  Before we were giving them
4700         the same treatment as objects.
4701
4702         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
4703         fullname.  Short name is used to compare against container name.
4704         Fullname is used to check against defined namespace names.
4705
4706         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
4707         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
4708
4709         (Method.CheckBase): Call parent.
4710         (MemberBase.CheckBase): Check for protected members on sealed
4711         classes.
4712         (PropertyBase.CheckBase): Call parent.
4713         (Field.Define): Call parent.
4714
4715         * report.cs: Negative error codes are now mapped to 8000 - code,
4716         so that the display is render more nicely.
4717
4718         * typemanager.cs: Do not use try/catch, instead report a regular
4719         error. 
4720
4721         (GetPointerType, GetReferenceType): These methods provide
4722         mechanisms to obtain the T* and T& from a T.  We had the code
4723         previously scattered around the code base, and it also used
4724         TypeManager.LookupType that would go through plenty of caches.
4725         This one goes directly to the type source.
4726
4727         In some places we did the Type.GetType followed by
4728         ModuleBuilder.GetType, but not in others, so this unifies the
4729         processing as well.
4730
4731         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
4732         statements now that we have namespace information.
4733
4734         * typemanager.cs (IsNamespace): New method, returns whether the
4735         string presented is a namespace or not.
4736
4737         (ComputeNamespaces): New public entry point, computes the list of
4738         available namespaces, using the GetNamespaces API call in Mono, or
4739         the slower version in MS.NET.   
4740
4741         Now before we start the semantic analysis phase, we have a
4742         complete list of namespaces including everything that the user has
4743         provided.
4744
4745         Deleted old code to cache namespaces in .nsc files.
4746
4747 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
4748
4749         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
4750         class/struct location definition Location for the implicit
4751         constructor location.
4752
4753         (Operator.Define): Use the location of the operator for the
4754         implicit Method definition.
4755
4756         (Constructor.Emit): use the constructor location for the implicit
4757         base initializer constructor.
4758
4759         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
4760         and the Expression class now contains two new methods:
4761
4762         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
4763         isolate type lookup from the rest of the resolution process.
4764
4765         Since we use Expressions to hold type definitions due to the way
4766         we parse the input we have historically overloaded Resolve to
4767         perform the Type lookups if a special flag is passed.  Now this is
4768         eliminated and two methods take their place. 
4769
4770         The differences in the two methods between xStep and xTerminal is
4771         that xStep is involved in our current lookup system that uses
4772         SimpleNames to compose a name, while xTerminal is used just to
4773         catch the case where the simplename lookup failed.
4774
4775 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
4776
4777         * expression.cs (ResolveMemberAccess): Remove redundant code.
4778         TypeExpr expressions are always born fully resolved.
4779
4780         * interface.cs (PopulateMethod): Do not lookup the types twice.
4781         We were doing it once during SemanticAnalysis and once during
4782         PopulateMethod.
4783
4784         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
4785         in local variable type definitions, were being returned as a
4786         SimpleName (we decomposed everything into a string), that is
4787         because primary_expression was being used instead of a type in the
4788         grammar (reduce/reduce conflicts).
4789
4790         The part that was wrong is that we converted the expression into a
4791         string (an oversimplification in one hand, compounded with primary
4792         expressions doing string concatenation).
4793
4794         So things like:
4795
4796         A.B.C [] x;
4797
4798         Would return "A.B.C[]" as a SimpleName.  This stopped things like
4799         using clauses from working on this particular context.  And a type
4800         was being matched directly against "A.B.C[]".
4801
4802         We now use the correct approach, and allow for ComposedCast to be
4803         part of the unary expression.  So the "A.B.C []" become a composed
4804         cast of "A.B.C" (as a nested group of MemberAccess with a
4805         SimpleName at the end) plus the rank composition "[]". 
4806
4807         Also fixes 35567
4808
4809 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
4810
4811         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
4812         for the access level checking.
4813
4814         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
4815         `TypeContainer container', because I kept getting confused when I
4816         was debugging this code.
4817
4818         * expression.cs (Indexers): Instead of tracking getters/setters,
4819         we now track them in parallel.  We create one arraylist less, but
4820         most importantly it is possible now for the LValue code to find a
4821         matching get for a set.
4822
4823         (IndexerAccess.DoResolveLValue): Update the code.
4824         GetIndexersForType has been modified already to extract all the
4825         indexers from a type.  The code assumed it did not.
4826
4827         Also make the code set the correct return type for the indexer.
4828         This was fixed a long time ago for properties, but was missing for
4829         indexers.  It used to be void_type.
4830
4831         (Binary.Emit): Test first for doubles instead of
4832         floats, as they are more common.
4833
4834         (Binary.EmitBranchable): Use the .un version of the branch opcodes
4835         when dealing with floats and the <=, >= operators.  This fixes bug
4836         #39314 
4837
4838         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
4839         to load the array value by emitting a load on the foreach variable
4840         type.  This was incorrect.  
4841
4842         We now emit the code to load an element using the the array
4843         variable type, and then we emit the conversion operator.
4844
4845         Fixed #40176
4846
4847 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
4848
4849         * attribute.cs: Avoid allocation of ArrayLists in the common case.
4850
4851 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
4852
4853         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
4854         test for protection before we test for signatures. 
4855
4856         (MethodSignature.ToString): implement.
4857
4858         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
4859         to the case where we reduced into a LongConstant.
4860
4861         * decl.cs (CheckAccessLevel): If the type is an array, we can not
4862         depend on whether the information is acurrate, because the
4863         Microsoft runtime will always claim that the array type is public,
4864         regardless of the real state.
4865
4866         If the type is a pointer, another problem happens: the type is
4867         reported as non-public in Microsoft.  
4868
4869         In both cases we have to call CheckAccessLevel recursively with
4870         the underlying type as the argument to be tested.
4871
4872 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
4873
4874         * assign.cs (Assign.Emit): If we are dealing with a compound
4875         assignment expression, we should use the code path that stores the
4876         intermediate result in a temporary value.  This fixes #40903.
4877
4878         *expression.cs (Indirection.ToString): Provide ToString method for
4879         debugging. 
4880
4881 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
4882
4883         * class.cs: Null out fields holding references to Block objects so
4884         they can be garbage collected.
4885
4886         * expression.cs (OverloadResolve): Remove unused local.
4887
4888 2003-04-07  Martin Baulig  <martin@ximian.com>
4889
4890         * codegen.cs (EmitContext.CurrentFile): New public field.
4891         (EmitContext.Mark): Use the CurrentFile to check whether the
4892         location is in the correct file.
4893         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
4894
4895 2003-04-07  Martin Baulig  <martin@ximian.com>
4896
4897         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
4898
4899         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
4900         location.  [FIXME: The location argument which gets passed to this
4901         method is sometimes wrong!]
4902
4903 2003-04-07  Nick Drochak <ndrochak@gol.com>
4904
4905         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
4906
4907 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
4908
4909         * expression.cs (Indirection.EmitAssign): We were using the
4910         temporary, but returning immediately instead of continuing the
4911         EmitAssing flow.
4912
4913 2003-04-06  Martin Baulig  <martin@ximian.com>
4914
4915         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
4916         if it's a nested child, but also deriving from the outer class.
4917         See test 190.cs.
4918
4919         * typemanager.cs (IsNestedChildOf): Make this work if it's a
4920         nested child, but also deriving from the outer class.  See
4921         test-190.cs.
4922         (FilterWithClosure): We may access private members of the outer
4923         class if we're a nested child and deriving from the outer class.
4924         (RealMemberLookup): Only set `closure_private_ok' if the
4925         `original_bf' contained BindingFlags.NonPublic.
4926
4927 2003-04-05  Martin Baulig  <martin@ximian.com>
4928
4929         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
4930
4931 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
4932
4933         * class.cs (Event.Define): Do not allow abstract events to have
4934         initializers. 
4935
4936 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
4937
4938         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
4939         block in event declarations.
4940
4941         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
4942         value type, get its address.
4943
4944         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
4945         leaving a class on the stack instead of a boolean value (int
4946         0/1).  Change the code so we compare against null, and then the
4947         result against zero.
4948
4949         * class.cs (TypeContainer.GetClassBases): We were checking for the
4950         parent class being sealed too late.
4951
4952         * expression.cs (Binary.Emit): For <= and >= when dealing with
4953         floating point values, use cgt.un and clt.un instead of cgt and
4954         clt alone.
4955
4956 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
4957
4958         * statement.cs: Apply the same optimization as MS: skip the 
4959         GetEnumerator returning an IEnumerator, and use the one returning a 
4960         CharEnumerator instead. This allows us to avoid the try-finally block 
4961         and the boxing.
4962
4963 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
4964
4965         * cs-parser.jay: Attributes cannot be applied to
4966                          namespaces. Fixes #40473
4967
4968 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4969
4970         * class.cs:
4971         (Add*): check if the name is valid using the full name for constants,
4972         fields, properties and events.
4973
4974 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
4975
4976         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
4977         char constants to be part of the enumeration.
4978
4979         * expression.cs (Conditional.DoResolve): Add support for operator
4980         true. Implements the missing functionality from 14.12
4981
4982         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
4983         operator true/false as required by the spec.
4984
4985         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
4986         implicit conversion to boolean.
4987
4988         * statement.cs (Statement.ResolveBoolean): A boolean expression is
4989         also one where the type implements `operator true'. 
4990
4991         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
4992         get an expression that will invoke operator true based on an
4993         expression.  
4994
4995         (GetConversionOperators): Removed the hack that called op_True
4996         here.  
4997
4998         (Expression.ResolveBoolean): Move this from Statement.
4999
5000 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
5001
5002         * ecore.cs (FieldExpr): do not allow initialization of initonly
5003         fields on derived classes
5004
5005 2003-03-13  Martin Baulig  <martin@ximian.com>
5006
5007         * statement.cs (Block.Emit): Call ig.BeginScope() and
5008         ig.EndScope() when compiling with debugging info; call
5009         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
5010
5011 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
5012
5013         * expression.cs (Indexers): Do not construct immediately, allow
5014         for new members to be appended as we go.  Fixes 38143
5015
5016 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5017
5018         * expression.cs: save/restore context when resolving an unchecked
5019         expression.
5020
5021 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
5022
5023         * cfold.cs: Catch division by zero in modulus operator during
5024         constant folding.
5025
5026 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
5027
5028         * interface.cs (Interface.DefineMembers): Avoid defining members
5029         twice. 
5030
5031 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
5032
5033         * driver.cs: handle the +/- options for -noconfig
5034
5035         * statement.cs (Unckeched.Resolve): Also track the state of
5036         unchecked in the Resolve phase.
5037
5038 2003-02-27  Martin Baulig  <martin@ximian.com>
5039
5040         * ecore.cs (Expression.MemberLookup): Don't create a
5041         MethodGroupExpr for something which is not a method.  Fixes #38291.
5042
5043 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
5044
5045         * class.cs (MemberBase.CheckParameters): Also check that the type
5046         is unmanaged if it is a pointer.
5047
5048         * expression.cs (SizeOf.Resolve): Add location information.
5049
5050         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
5051         a managed type is declared.
5052
5053         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
5054         parameter modifiers as well.  Fixes bug 38606
5055
5056         * class.cs: Very sad.  Am backing out the speed up changes
5057         introduced by the ArrayList -> Array in the TypeContainer, as they
5058         were not actually that much faster, and introduced a bug (no error
5059         reports on duplicated methods).
5060
5061         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
5062         source first, this will guarantee that we have a valid expression
5063         before calling in lower levels functions that will require a
5064         resolved object.  Then use this original_source in the
5065         target.ResolveLValue instead of the original source that was
5066         passed to us.
5067
5068         Another change.  Use target.Resolve instead of LValueResolve.
5069         Although we are resolving for LValues, we will let the Assign code
5070         take care of that (it will be called again from Resolve).  This
5071         basically allows code like this:
5072
5073         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
5074         class Y { void A (X x) { x [0] += o; }
5075
5076         The problem was that the indexer was trying to resolve for
5077         set_Item (idx, object o) and never finding one.  The real set_Item
5078         was set_Item (idx, X).  By delaying the process we get the right
5079         semantics. 
5080
5081         Fixes bug 36505
5082
5083 2003-02-23  Martin Baulig  <martin@ximian.com>
5084
5085         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
5086         while calling DoEmit ().
5087
5088         * codegen.cs (EmitContext.Mark): Don't mark locations in other
5089         source files; if you use the #line directive inside a method, the
5090         compiler stops emitting line numbers for the debugger until it
5091         reaches the end of the method or another #line directive which
5092         restores the original file.
5093
5094 2003-02-23  Martin Baulig  <martin@ximian.com>
5095
5096         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
5097
5098 2003-02-23  Martin Baulig  <martin@ximian.com>
5099
5100         * statement.cs (Block.AddChildVariableNames): We need to call this
5101         recursively, not just for our immediate children.
5102
5103 2003-02-23  Martin Baulig  <martin@ximian.com>
5104
5105         * class.cs (Event.Define): Always make the field private, like csc does.
5106
5107         * typemanager.cs (TypeManager.RealMemberLookup): Make events
5108         actually work, fixes bug #37521.
5109
5110 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
5111
5112         * delegate.cs: When creating the various temporary "Parameters"
5113         classes, make sure that we call the ComputeAndDefineParameterTypes
5114         on those new parameters (just like we do with the formal ones), to
5115         allow them to be resolved in the context of the DeclSpace.
5116
5117         This fixes the bug that Dick observed in Bugzilla #38530.
5118
5119 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
5120
5121         * expression.cs (ResolveMemberAccess): When resolving a constant,
5122         do not attempt to pull a constant if the value was not able to
5123         generate a valid constant.
5124
5125         * const.cs (LookupConstantValue): Do not report more errors than required.
5126
5127 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5128
5129         * expression.cs: fixes bug #38328.
5130
5131 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5132
5133         * class.cs: Changed all the various members that can be part of a
5134         class from being an ArrayList to be an Array of the right type.
5135         During the DefineType type_list, interface_list, delegate_list and
5136         enum_list are turned into types, interfaces, delegates and enums
5137         arrays.  
5138
5139         And during the member population, indexer_list, event_list,
5140         constant_list, field_list, instance_constructor_list, method_list,
5141         operator_list and property_list are turned into their real arrays.
5142
5143         Although we could probably perform this operation earlier, for
5144         good error reporting we need to keep the lists and remove the
5145         lists for longer than required.
5146
5147         This optimization was triggered by Paolo profiling the compiler
5148         speed on the output of `gen-sample-program.pl' perl script. 
5149
5150         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
5151         not crash in methods like MemberLookupFailed that use this field.  
5152
5153         This problem arises when the compiler fails to resolve a type
5154         during interface type definition for example.
5155
5156 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5157
5158         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
5159         inherit from System.Object, so we have to stop at null, not only
5160         when reaching System.Object.
5161
5162 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
5163
5164         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
5165         DeclaredOnly because the parent indexer might have had a different
5166         name, but did not loop until the top of the hierarchy was reached.
5167
5168         The problem this one fixes is 35492: when a class implemented an
5169         indexer from an interface, we were getting the interface method
5170         (which was abstract) and we were flagging an error (can not invoke
5171         abstract method).
5172
5173         This also keeps bug 33089 functioning, and test-148 functioning.
5174
5175         * typemanager.cs (IsSpecialMethod): The correct way of figuring
5176         out if a method is special is to see if it is declared in a
5177         property or event, or whether it is one of the predefined operator
5178         names.   This should fix correctly #36804.
5179
5180 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
5181
5182         The goal here is to remove the dependency on EmptyCast.Peel ().
5183         Killing it completely.
5184
5185         The problem is that currently in a number of places where
5186         constants are expected, we have to "probe" for an EmptyCast, and
5187         Peel, which is not the correct thing to do, as this will be
5188         repetitive and will likely lead to errors. 
5189
5190         The idea is to remove any EmptyCasts that are used in casts that
5191         can be reduced to constants, so we only have to cope with
5192         constants. 
5193
5194         This bug hunt was triggered by Bug 37363 and the desire to remove
5195         the duplicate pattern where we were "peeling" emptycasts to check
5196         whether they were constants.  Now constants will always be
5197         constants.
5198
5199         * ecore.cs: Use an enumconstant here instead of wrapping with
5200         EmptyCast.  
5201
5202         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
5203         throwing me off.  By handling this we can get rid of a few hacks.
5204
5205         * statement.cs (Switch): Removed Peel() code.
5206
5207 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
5208
5209         * class.cs: Location information for error 508
5210
5211         * expression.cs (New.DoResolve): Add a guard against double
5212         resolution of an expression.  
5213
5214         The New DoResolve might be called twice when initializing field
5215         expressions (see EmitFieldInitializers, the call to
5216         GetInitializerExpression will perform a resolve on the expression,
5217         and later the assign will trigger another resolution
5218
5219         This leads to bugs (#37014)
5220
5221         * delegate.cs: The signature for EndInvoke should contain any ref
5222         or out parameters as well.  We were not doing this in the past. 
5223
5224         * class.cs (Field.Define): Do not overwrite the type definition
5225         inside the `volatile' group.  Turns out that volatile enumerations
5226         were changing the type here to perform a validity test, which
5227         broke conversions. 
5228
5229 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
5230
5231         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
5232         and structs, we do not want to load the instance variable
5233
5234         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
5235         enum_type has to be handled like an object reference (implicit
5236         conversions exists from this to object), but the regular IsClass
5237         and IsValueType tests will never return true for this one.
5238
5239         Also we use TypeManager.IsValueType instead of type.IsValueType,
5240         just for consistency with the rest of the code (this is only
5241         needed if we ever use the construct exposed by test-180.cs inside
5242         corlib, which we dont today).
5243
5244 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
5245
5246         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
5247         just InternalCall.
5248
5249 2003-02-09  Martin Baulig  <martin@ximian.com>
5250
5251         * namespace.cs (Namespace..ctor): Added SourceFile argument.
5252         (Namespace.DefineNamespaces): New static public method; this is
5253         called when we're compiling with debugging to add all namespaces
5254         to the symbol file.
5255
5256         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
5257         pass it to the Namespace's .ctor.
5258
5259         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
5260         and MethodBase arguments; pass the namespace ID to the symwriter;
5261         pass the MethodBase instead of the token to the symwriter.
5262         (SymbolWriter.DefineNamespace): New method to add a namespace to
5263         the symbol file.
5264
5265 2003-02-09  Martin Baulig  <martin@ximian.com>
5266
5267         * symbolwriter.cs: New file.  This is a wrapper around
5268         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
5269         methods here in near future.
5270
5271 2003-02-09  Martin Baulig  <martin@ximian.com>
5272
5273         * codegen.cs (EmitContext.Mark): Just pass the arguments to
5274         ILGenerator.MarkSequencePoint() which are actually used by the
5275         symbol writer.
5276
5277 2003-02-09  Martin Baulig  <martin@ximian.com>
5278
5279         * location.cs (SourceFile): New public sealed class.  This
5280         contains the name and an index which is used in the location's token.
5281         (Location): Reserve an appropriate number of bits in the token for
5282         the source file instead of walking over that list, this gives us a
5283         really huge performance improvement when compiling with debugging.
5284
5285         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
5286         `SourceFile' argument instead of a string.
5287         (Driver.ProcessFile): Add all the files via Location.AddFile(),
5288         but don't parse/tokenize here, we need to generate the list of all
5289         source files before we do that.
5290         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
5291         the files.
5292
5293         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
5294         instead of a string.
5295
5296         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
5297         of a string.
5298
5299 2003-02-09  Martin Baulig  <martin@ximian.com>
5300
5301         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
5302         filename on `#line default'.
5303
5304 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
5305
5306         * statement.cs: don't clear the pinned var when the fixed statement
5307         returns from the method (fixes bug#37752).
5308
5309 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
5310
5311         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
5312         to IsValueType.
5313
5314 2003-02-07  Martin Baulig  <martin@ximian.com>
5315
5316         * driver.cs: Removed the `--debug-args' command line argument.
5317
5318         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
5319         automatically by the AsssemblyBuilder.
5320         (CodeGen.InitializeSymbolWriter): We don't need to call any
5321         initialization function on the symbol writer anymore.  This method
5322         doesn't take any arguments.
5323
5324 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
5325
5326         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
5327         from referenced assemblies as well.
5328
5329 2003-02-02  Martin Baulig  <martin@ximian.com>
5330
5331         * class.cs (MethodData.Emit): Generate debugging info for external methods.
5332
5333 2003-02-02  Martin Baulig  <martin@ximian.com>
5334
5335         * class.cs (Constructor.Emit): Open the symbol writer before
5336         emitting the constructor initializer.
5337         (ConstructorInitializer.Emit): Call ec.Mark() to allow
5338         single-stepping through constructor initializers.
5339
5340 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
5341
5342         * class.cs: Handle error 549: do not allow virtual methods in
5343         sealed classes. 
5344
5345 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
5346
5347         * decl.cs: Check access levels when resolving types
5348
5349 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
5350
5351         * statement.cs: Add parameters and locals set in catch blocks that might 
5352         return to set vector
5353
5354 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
5355
5356         * class.cs (Operator): Set the SpecialName flags for operators.
5357
5358         * expression.cs (Invocation.DoResolve): Only block calls to
5359         accessors and operators on SpecialName methods.
5360
5361         (Cast.TryReduce): Handle conversions from char constants.
5362
5363
5364 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
5365
5366         * statement.cs: small memory and time optimization in FlowBranching.
5367
5368 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
5369
5370         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
5371         problem that the last fix but in the other sid (Set).
5372
5373         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
5374         access when there is no indexer in the hierarchy.
5375
5376 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
5377
5378         * class.cs: Combine some if statements.
5379
5380 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5381
5382         * driver.cs: fixed bug #37187.
5383
5384 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
5385
5386         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
5387         any indexer, it's needed to build a list with all the indexers in the
5388         hierarchy (AllGetters), else we have problems. Fixes #35653.
5389
5390 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
5391
5392         * class.cs (MethodData.Define): It is wrong for an interface
5393         implementation to be static in both cases: explicit and implicit.
5394         We were only handling this in one case.
5395
5396         Improve the if situation there to not have negations.
5397
5398         * class.cs (Field.Define): Turns out that we do not need to check
5399         the unsafe bit on field definition, only on usage.  Remove the test.
5400
5401 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5402
5403         * driver.cs: use assembly.Location instead of Codebase (the latest
5404         patch made mcs fail when using MS assemblies).
5405
5406 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
5407
5408         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
5409         get the path to *corlib.dll.
5410
5411 2003-01-21  Nick Drochak <ndrochak@gol.com>
5412
5413         * cs-tokenizer.cs:
5414         * pending.cs:
5415         * typemanager.cs: Remove compiler warnings
5416
5417 2003-01-20  Duncan Mak  <duncan@ximian.com>
5418
5419         * AssemblyInfo.cs: Bump the version number to 0.19.
5420
5421 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5422
5423         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
5424
5425 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
5426
5427         * class.cs (Constructor::Emit): Emit debugging info for constructors.
5428
5429 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
5430
5431         * cs-parser.jay: Small fix: we were not comparing the constructor
5432         name correctly.   Thanks to Zoltan for the initial pointer.
5433
5434 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
5435
5436         * cs-tokenizer.cs: Set file name when specified with #line
5437
5438 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
5439
5440         * cs-parser.jay: Only perform the constructor checks here if we
5441         are named like the class;  This will help provider a better
5442         error.  The constructor path is taken when a type definition is
5443         not found, but most likely the user forgot to add the type, so
5444         report that rather than the constructor error.
5445
5446 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
5447
5448         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
5449         allocations.
5450
5451 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
5452
5453         * cs-parser.jay: Add cleanup call.
5454
5455 2003-01-13  Duncan Mak  <duncan@ximian.com>
5456
5457         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
5458         consistent with other methods.
5459
5460 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
5461
5462         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
5463
5464 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
5465
5466         * attribute.cs: only set GuidAttr to true when we have a
5467         GuidAttribute.
5468
5469 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5470
5471         * ecore.cs:
5472         * expression.cs:
5473         * typemanager.cs: fixes to allow mcs compile corlib with the new
5474         Type.IsSubclassOf fix.
5475
5476 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
5477
5478         * expression.cs (LocalVariableReference.DoResolve): Classify a
5479         constant as a value, not as a variable.   Also, set the type for
5480         the variable.
5481
5482         * cs-parser.jay (fixed_statement): take a type instead of a
5483         pointer_type, so we can produce a better error message later.
5484
5485         * statement.cs (Fixed.Resolve): Flag types that are not pointers
5486         as an error.  
5487
5488         (For.DoEmit): Make inifinite loops have a
5489         non-conditional branch back.
5490
5491         (Fixed.DoEmit): First populate the pinned variables, then emit the
5492         statement, then clear the variables.  Before I was emitting the
5493         code once for each fixed piece.
5494
5495
5496 2003-01-08  Martin Baulig  <martin@ximian.com>
5497
5498         * statement.cs (FlowBranching.MergeChild): A break in a
5499         SWITCH_SECTION does not leave a loop.  Fixes #36155.
5500
5501 2003-01-08  Martin Baulig  <martin@ximian.com>
5502
5503         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
5504         lives in the same number space than `param_map'.  Fixes #36154.
5505
5506 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
5507
5508         * cs-parser.jay (constructor_declaration): Set the
5509         Constructor.ModFlags before probing for it.  This makes the
5510         compiler report 514, 515 and 132 (the code was there, but got
5511         broken). 
5512
5513         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
5514         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
5515         (GotoCase.Resolve): Set `Returns' to ALWAYS.
5516
5517 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
5518
5519         * enum.cs: create the enum static fields using the enum type.
5520
5521 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
5522
5523         * class.cs: don't try to create the ParamBuilder for the return
5524         type if it's not needed (and handle it breaking for the ms runtime
5525         anyway).
5526
5527 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
5528
5529         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
5530
5531 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
5532
5533         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
5534         the command.   This showed up while compiling the JANET source
5535         code, which used \r as its only newline separator.
5536
5537 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
5538
5539         * class.cs (Method.Define): If we are an operator (because it
5540         reuses our code), then set the SpecialName and HideBySig.  #36128
5541
5542 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
5543
5544         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
5545         exception, report error 120 `object reference required'.
5546
5547         * driver.cs: Add --pause option, used during to measure the size
5548         of the process as it goes with --timestamp.
5549
5550         * expression.cs (Invocation.DoResolve): Do not allow methods with
5551         SpecialName to be invoked.
5552
5553 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
5554
5555         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
5556         number before adding it.
5557
5558 2002-12-21  Ravi Pratap  <ravi@ximian.com>
5559
5560         * ecore.cs (StandardImplicitConversion): When in an unsafe
5561         context, we allow conversion between void * to any other pointer
5562         type. This fixes bug #35973.
5563
5564 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
5565
5566         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
5567         is not thrown when extensionless outputs are used 
5568
5569 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5570
5571         * rootcontext.cs: fixed compilation of corlib.
5572
5573 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
5574
5575         * attribute.cs (Attributes.Contains): Add new method.
5576
5577         * class.cs (MethodCore.LabelParameters): if the parameter is an
5578         `out' parameter, check that no attribute `[In]' has been passed.
5579
5580         * enum.cs: Handle the `value__' name in an enumeration.
5581
5582 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
5583
5584         * decl.cs: Added special case to allow overrides on "protected
5585         internal" methods
5586
5587 2002-12-18  Ravi Pratap  <ravi@ximian.com>
5588
5589         * attribute.cs (Attributes.AddAttributeSection): Rename to this
5590         since it makes much more sense.
5591
5592         (Attributes.ctor): Don't require a Location parameter.
5593
5594         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
5595
5596         * attribute.cs (ApplyAttributes): Remove extra Location parameters
5597         since we already have that information per attribute.
5598
5599         * everywhere : make appropriate changes.
5600
5601         * class.cs (LabelParameters): Write the code which actually
5602         applies attributes to the return type. We can't do this on the MS
5603         .NET runtime so we flag a warning in the case an exception is
5604         thrown.
5605
5606 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
5607
5608         * const.cs: Handle implicit null conversions here too.
5609
5610 2002-12-17  Ravi Pratap  <ravi@ximian.com>
5611
5612         * class.cs (MethodCore.LabelParameters): Remove the extra
5613         Type [] parameter since it is completely unnecessary. Instead
5614         pass in the method's attributes so that we can extract
5615         the "return" attribute.
5616
5617 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
5618
5619         * cs-parser.jay (parse): Use Report.Error to flag errors instead
5620         of ignoring it and letting the compile continue.
5621
5622         * typemanager.cs (ChangeType): use an extra argument to return an
5623         error condition instead of throwing an exception.
5624
5625 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
5626
5627         * expression.cs (Unary.TryReduce): mimic the code for the regular
5628         code path.  Perform an implicit cast in the cases where we can
5629         implicitly convert to one of the integral types, and then reduce
5630         based on that constant.   This fixes bug #35483.
5631
5632 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5633
5634         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
5635
5636 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5637
5638         * namespace.cs: fixed bug #35489.
5639
5640 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
5641
5642         * class.cs: Remove some dead code.
5643
5644         * cs-parser.jay: Estimate the number of methods needed
5645         (RootContext.MethodCount);
5646
5647         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
5648         numbers instead of StringBuilders.
5649
5650         * support.cs (PtrHashtable): Add constructor with initial size;
5651         We can now reduce reallocations of the method table.
5652
5653 2002-12-10  Ravi Pratap  <ravi@ximian.com>
5654
5655         * attribute.cs (ApplyAttributes): Keep track of the emitted
5656         attributes on a per-target basis. This fixes bug #35413.
5657
5658 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
5659
5660         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
5661         default to the Windows 1252 encoding.
5662
5663         (UnixParseOption): Support version, thanks to Alp for the missing
5664         pointer. 
5665
5666         * AssemblyInfo.cs: Add nice assembly information.
5667
5668         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
5669         (bug 35169).
5670
5671         * cs-parser.jay: Allow a trailing comma before the close bracked
5672         in the attribute_section production.
5673
5674         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
5675         address of the instance was being taken, I will take this out,
5676         because we take the address of the object immediately here.
5677
5678 2002-12-09  Ravi Pratap  <ravi@ximian.com>
5679
5680         * typemanager.cs (AreMultipleAllowed): Take care of the most
5681         obvious case where attribute type is not in the current assembly -
5682         stupid me ;-)
5683
5684 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
5685
5686         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
5687         definitions, instead of doing that afterwards.  
5688
5689         Also we use a nice little hack, depending on the constructor, we
5690         know if we are a "composed" name or a simple name.  Hence, we
5691         avoid the IndexOf test, and we avoid 
5692
5693         * codegen.cs: Add code to assist in a bug reporter to track down
5694         the source of a compiler crash. 
5695
5696 2002-12-07  Ravi Pratap  <ravi@ximian.com>
5697
5698         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
5699         types have been emitted for a given element and flag an error
5700         if something which does not have AllowMultiple set is used more
5701         than once.
5702
5703         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
5704         attribute types and their corresponding AllowMultiple properties
5705
5706         (AreMultipleAllowed): Check the property for a given type.
5707
5708         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
5709         property in the case we have a TypeContainer.
5710
5711         (Attributes.AddAttribute): Detect duplicates and just skip on
5712         adding them. This trivial fix catches a pretty gross error in our
5713         attribute emission - global attributes were being emitted twice!
5714
5715         Bugzilla bug #33187 is now fixed.
5716
5717 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
5718
5719         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
5720         instead of pp_and).
5721
5722         * expression.cs (Binary.ResolveOperator): I can only use the
5723         Concat (string, string, string) and Concat (string, string,
5724         string, string) if the child is actually a concatenation of
5725         strings. 
5726
5727 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
5728
5729         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
5730         context where we need a 2-character lookahead.
5731
5732         * pending.cs (PendingImplementation): Rework so we can keep track
5733         of interface types all the time, and flag those which were
5734         implemented by parents as optional.
5735
5736 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
5737
5738         * expression.cs (Binary.ResolveOperator): Use
5739         String.Concat(string,string,string) or
5740         String.Concat(string,string,string,string) when possible. 
5741
5742         * typemanager: More helper methods.
5743
5744
5745 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
5746
5747         * pending.cs: remove the bogus return from GetMissingInterfaces()
5748         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
5749
5750 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5751
5752         * namespace.cs: avoid duplicated 'using xxx' being added to
5753         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
5754         when we get more than one 'using' statement for the same namespace.
5755         Report a CS0105 warning for it.
5756
5757 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
5758
5759         * cs-tokenizer.cs (consume_identifier): use read directly, instead
5760         of calling getChar/putback, uses internal knowledge of it.    
5761
5762         (xtoken): Reorder tokenizer so most common patterns are checked
5763         first.  This reduces the compilation time in another 5% (from 8.11s
5764         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
5765
5766         The parsing time is 22% of the compilation in mcs, and from that
5767         64% is spent on the tokenization process.  
5768
5769         I tried using a binary search for keywords, but this is slower
5770         than the hashtable.  Another option would be to do a couple of
5771         things:
5772
5773                 * Not use a StringBuilder, instead use an array of chars,
5774                   with a set value.  Notice that this way we could catch
5775                   the 645 error without having to do it *afterwards*.
5776
5777                 * We could write a hand-parser to avoid the hashtable
5778                   compares altogether.
5779
5780         The identifier consumption process takes 37% of the tokenization
5781         time.  Another 15% is spent on is_number.  56% of the time spent
5782         on is_number is spent on Int64.Parse:
5783
5784                 * We could probably choose based on the string length to
5785                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
5786                   computations. 
5787
5788         Another 3% is spend on wrapping `xtoken' in the `token' function.
5789
5790         Handle 0xa0 as whitespace (#34752)
5791
5792 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
5793
5794         * typemanager.cs (IsCLRType): New routine to tell whether a type
5795         is one of the builtin types.  
5796
5797         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
5798         typecode in more places instead of doing pointer comparissions.
5799         We could leverage some knowledge about the way the typecodes are
5800         laid out.
5801
5802         New code to cache namespaces in assemblies, it is currently not
5803         invoked, to be used soon.
5804
5805         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
5806
5807         * expression.cs (Binary.ResolveOperator): specially handle
5808         strings, and do not perform user-defined operator overloading for
5809         built-in types.
5810
5811 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
5812
5813         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
5814         internalcall as it is a pretty simple operation;  Avoid whenever
5815         possible to call Char.IsLetter.
5816
5817         (consume_identifier): Cut by half the number of
5818         hashtable calls by merging the is_keyword and GetKeyword behavior.
5819
5820         Do not short-circuit, because if we do, we
5821         report errors (ie, #if false && true would produce an invalid
5822         directive error);
5823
5824
5825 2002-11-24  Martin Baulig  <martin@ximian.com>
5826
5827         * expression.cs (Cast.TryReduce): If we're in checked syntax,
5828         check constant ranges and report a CS0221.  Fixes #33186.
5829
5830 2002-11-24  Martin Baulig  <martin@ximian.com>
5831
5832         * cs-parser.jay: Make this work for uninitialized variable
5833         declarations in the `for' initializer.  Fixes #32416.
5834
5835 2002-11-24  Martin Baulig  <martin@ximian.com>
5836
5837         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
5838         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
5839
5840 2002-11-24  Martin Baulig  <martin@ximian.com>
5841
5842         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
5843         argument; if true, we also check for user-defined conversions.
5844         This is only needed if both arguments are of a user-defined type.
5845         Fixes #30443, added test-175.cs.
5846         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
5847
5848         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
5849
5850 2002-11-24  Martin Baulig  <martin@ximian.com>
5851
5852         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
5853         function to get the store opcode.
5854         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
5855         only emit the Ldelema if the store opcode is Stobj.  You must run
5856         both test-34 and test-167 to test this.  Fixes #34529.
5857
5858 2002-11-23  Martin Baulig  <martin@ximian.com>
5859
5860         * ecore.cs (Expression.MemberLookup): Added additional
5861         `qualifier_type' argument which is used when we're being called
5862         from MemberAccess.DoResolve() and null if we're called from a
5863         SimpleName lookup.
5864         (Expression.MemberLookupFailed): New method to report errors; this
5865         does the CS1540 check and reports the correct error message.
5866
5867         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
5868         argument for the CS1540 check and redone the way how we're dealing
5869         with private members.  See the comment in the source code for details.
5870         (FilterWithClosure): Reverted this back to revision 1.197; renamed
5871         `closure_start_type' to `closure_qualifier_type' and check whether
5872         it's not null.  It was not this filter being broken, it was just
5873         being called with the wrong arguments.
5874
5875         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
5876         and pass it the correct `qualifier_type'; this also does the error
5877         handling for us.
5878
5879 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
5880
5881         * expression.cs (Invocation.EmitParams): If the we are dealing
5882         with a non-built-in value type, load its address as well.
5883
5884         (ArrayCreation): Use a a pretty constant instead
5885         of the hardcoded value 2.   Use 6 instead of 2 for the number of
5886         static initializers.  
5887
5888         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
5889         because they are not really value types, just glorified integers. 
5890
5891         * driver.cs: Do not append .exe, the CSC compiler does not do it.
5892
5893         * ecore.cs: Remove redundant code for enumerations, make them use
5894         the same code path as everything else, fixes the casting issue
5895         with enumerations in Windows.Forms.
5896
5897         * attribute.cs: Do only cast to string if it is a string, the
5898         validation happens later.
5899
5900         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
5901         people upgrade their corlibs.
5902
5903         * ecore.cs: Oops, enumerations were not following the entire code path
5904
5905 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
5906
5907         * typemanager.cs (FilterWithClosure): Commented out the test for
5908         1540 in typemanager.cs, as it has problems when accessing
5909         protected methods from a parent class (see test-174.cs). 
5910
5911         * attribute.cs (Attribute.ValidateGuid): new method.
5912         (Attribute.Resolve): Use above.
5913
5914 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
5915
5916         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
5917
5918         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
5919         handling for enumerations, as we only needed the TypeContainer
5920         functionality to begin with (this is required for the fix below to
5921         work for enums that reference constants in a container class for
5922         example). 
5923
5924         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
5925
5926         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
5927         a valid TypeBuilder to perform lookups on.o
5928
5929         * class.cs (InheritableMemberSignatureCompare): Use true in the
5930         call to GetGetMethod and GetSetMethod, because we are comparing
5931         the signature, and we need to get the methods *even* if they are
5932         private. 
5933
5934         (PropertyBase.CheckBase): ditto.
5935
5936         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
5937         GotoCase.Resolve): Use Peel on EmpytCasts.
5938
5939         * ecore.cs (EmptyCast): drop child, add Peel method.
5940
5941 2002-11-17  Martin Baulig  <martin@ximian.com>
5942
5943         * ecore.cs (EmptyCast.Child): New public property.
5944
5945         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
5946         label resolved to an EmptyCast.  Fixes #34162.
5947         (GotoCase.Resolve): Likewise.
5948         (Block.EmitMeta): Likewise.
5949
5950 2002-11-17  Martin Baulig  <martin@ximian.com>
5951
5952         * expression.cs (Invocation.BetterConversion): Prefer int over
5953         uint; short over ushort; long over ulong for integer literals.
5954         Use ImplicitConversionExists instead of StandardConversionExists
5955         since we also need to check for user-defined implicit conversions.
5956         Fixes #34165.  Added test-173.cs.
5957
5958 2002-11-16  Martin Baulig  <martin@ximian.com>
5959
5960         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
5961         with the `true' and `false' literals.  Fixes #33151.
5962
5963 2002-11-16  Martin Baulig  <martin@ximian.com>
5964
5965         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
5966         October 22nd; don't do the cs1540 check for static members.
5967
5968         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
5969         now using our own filter here and doing the cs1540 check again.
5970
5971 2002-11-16  Martin Baulig  <martin@ximian.com>
5972
5973         * support.cs (InternalParameters): Don't crash if we don't have
5974         any fixed parameters.  Fixes #33532.
5975
5976 2002-11-16  Martin Baulig  <martin@ximian.com>
5977
5978         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
5979         when looking up static methods to make this work on Windows.
5980         Fixes #33773.
5981
5982 2002-11-16  Martin Baulig  <martin@ximian.com>
5983
5984         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
5985         a setter rather than using PropertyInfo.CanWrite.
5986
5987 2002-11-15  Nick Drochak  <ndrochak@gol.com>
5988
5989         * class.cs: Allow acces to block member by subclasses. Fixes build
5990         breaker.
5991
5992 2002-11-14  Martin Baulig  <martin@ximian.com>
5993
5994         * class.cs (Constructor.Emit): Added the extern/block check.
5995         Fixes bug #33678.
5996
5997 2002-11-14  Martin Baulig  <martin@ximian.com>
5998
5999         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
6000         iteration while looking for indexers, this is needed because the
6001         indexer may have a different name in our base classes.  Fixed the
6002         error reporting (no indexers at all, not get accessor, no
6003         overloaded match).  Fixes bug #33089.
6004         (IndexerAccess.DoResolveLValue): Likewise.
6005
6006 2002-11-14  Martin Baulig  <martin@ximian.com>
6007
6008         * class.cs (PropertyBase.CheckBase): Make this work for multiple
6009         indexers.  Fixes the first part of bug #33089.
6010         (MethodSignature.InheritableMemberSignatureCompare): Added support
6011         for properties.
6012
6013 2002-11-13  Ravi Pratap  <ravi@ximian.com>
6014
6015         * attribute.cs (Attribute.Resolve): Catch the
6016         NullReferenceException and report it since it isn't supposed to
6017         happen. 
6018
6019 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
6020
6021         * expression.cs (Binary.EmitBranchable): Also handle the cases for
6022         LogicalOr and LogicalAnd that can benefit from recursively
6023         handling EmitBranchable.  The code now should be nice for Paolo.
6024
6025 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
6026
6027         * typemanager.cs (LookupType): Added a negative-hit hashtable for
6028         the Type lookups, as we perform quite a number of lookups on
6029         non-Types.  This can be removed once we can deterministically tell
6030         whether we have a type or a namespace in advance.
6031
6032         But this might require special hacks from our corlib.
6033
6034         * TODO: updated.
6035
6036         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
6037         and double which avoids a conversion from an integer to a double.
6038
6039         * expression.cs: tiny optimization, avoid calling IsConstant,
6040         because it effectively performs the lookup twice.
6041
6042 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
6043
6044         But a bogus return here to keep the semantics of the old code
6045         until the Mono runtime is fixed.
6046
6047         * pending.cs (GetMissingInterfaces): New method used to remove all
6048         the interfaces that are already implemented by our parent
6049         classes from the list of pending methods. 
6050
6051         * interface.cs: Add checks for calls after ResolveTypeExpr.
6052
6053 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
6054
6055         * class.cs (Class.Emit): Report warning 67: event not used if the
6056         warning level is beyond 3.
6057
6058         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
6059         being a NullLiteral.
6060
6061         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
6062         specifiers. 
6063
6064         * class.cs (TypeContainer.GetClassBases): Cover a missing code
6065         path that might fail if a type can not be resolved.
6066
6067         * expression.cs (Binary.Emit): Emit unsigned versions of the
6068         operators. 
6069
6070         * driver.cs: use error 5.
6071
6072 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
6073
6074         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
6075
6076 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
6077
6078         * cs-parser.jay (switch_section): A beautiful patch from Martin
6079         Baulig that fixed 33094.
6080
6081 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
6082
6083         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
6084         Check whether the base is abstract and report an error if so.
6085
6086         * expression.cs (IndexerAccess.DoResolveLValue,
6087         IndexerAccess.DoResolve): ditto. 
6088
6089         (Invocation.DoResolve): ditto.
6090
6091         (Invocation.FullMethodDesc): Improve the report string.
6092
6093         * statement.cs (Block): Eliminate IsVariableDefined as it is
6094         basically just a wrapper for GetVariableInfo.
6095
6096         * ecore.cs (SimpleName): Use new 
6097
6098         * support.cs (ReflectionParamter.ParameterType): We unwrap the
6099         type, as we return the actual parameter ref/unref state on a
6100         different call.
6101
6102 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
6103
6104         * support.cs: Return proper flags REF/OUT fixing the previous
6105         commit.  
6106
6107         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
6108         not used to mean `ref' but `ref or out' in ParameterReference
6109
6110         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
6111         full type signature instead of calling TypeManger.CSharpName
6112         ourselves. 
6113
6114         * support.cs (InternalParameters.ParameterDesc): Do not compare
6115         directly to the modflags, because REF/OUT will actually be bitsets
6116         if set. 
6117
6118         * delegate.cs (VerifyMethod): Check also the modifiers.
6119
6120         * cs-tokenizer.cs: Fix bug where floating point values with an
6121         exponent where a sign was missing was ignored.
6122
6123         * driver.cs: Allow multiple assemblies to be specified in a single
6124         /r: argument
6125
6126 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
6127
6128         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
6129         because identifiers after a parenthesis would end up in this kind
6130         of production, and we needed to desamiguate it for having casts
6131         like:
6132
6133                 (UserDefinedType *) xxx
6134
6135 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
6136
6137         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
6138         we should set on the Bindingflags.NonPublic, but not turn on
6139         private_ok.  private_ok controls whether a Private member is
6140         returned (this is chekced on the filter routine), while the
6141         BindingFlags.NonPublic just controls whether private/protected
6142         will be allowed.   This fixes the problem part of the problem of
6143         private properties being allowed to be used in derived classes.
6144
6145         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
6146         so we can call the children DoResolveLValue method (this will
6147         properly signal errors on lvalue assignments to base properties)
6148
6149         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
6150         getter are null, and we have a property info, we know that this
6151         happened because the lookup failed, so we report an error 122 for
6152         protection level violation.
6153
6154         We also silently return if setter and getter are null in the
6155         resolve functions, this condition only happens if we have flagged
6156         the error before.  This is the other half of the problem. 
6157
6158         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
6159         not have accessibility information, that is why we were returning
6160         true in the filter function in typemanager.cs.
6161
6162         To properly report 122 (property is inaccessible because of its
6163         protection level) correctly, we report this error in ResolveAccess
6164         by failing if both the setter and the getter are lacking (ie, the
6165         lookup failed). 
6166
6167         DoResolve and DoLResolve have been modified to check for both
6168         setter/getter being null and returning silently, the reason being
6169         that I did not want to put the knowledge about this error in upper
6170         layers, like:
6171
6172         int old = Report.Errors;
6173         x = new PropertyExpr (...);
6174         if (old != Report.Errors)
6175                 return null;
6176         else
6177                 return x;
6178
6179         So the property expr is returned, but it is invalid, so the error
6180         will be flagged during the resolve process. 
6181
6182         * class.cs: Remove InheritablePropertySignatureCompare from the
6183         class, as we no longer depend on the property signature to compute
6184         whether it is possible to implement a method or not.
6185
6186         The reason is that calling PropertyInfo.GetGetMethod will return
6187         null (in .NET, in Mono it works, and we should change this), in
6188         cases where the Get Method does not exist in that particular
6189         class.
6190
6191         So this code:
6192
6193         class X { public virtual int A { get { return 1; } } }
6194         class Y : X { }
6195         class Z : Y { public override int A { get { return 2; } } }
6196
6197         Would fail in Z because the parent (Y) would not have the property
6198         defined.  So we avoid this completely now (because the alternative
6199         fix was ugly and slow), and we now depend exclusively on the
6200         method names.
6201
6202         (PropertyBase.CheckBase): Use a method-base mechanism to find our
6203         reference method, instead of using the property.
6204
6205         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
6206         routines are gone now.
6207
6208         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
6209         names, they were incorrectly named.
6210
6211         * cs-tokenizer.cs: Return are more gentle token on failure. 
6212
6213         * pending.cs (PendingImplementation.InterfaceMethod): This routine
6214         had an out-of-sync index variable, which caused it to remove from
6215         the list of pending methods the wrong method sometimes.
6216
6217 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
6218
6219         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
6220         CanWrite, because those refer to this particular instance of the
6221         property, and do not take into account the fact that we can
6222         override single members of a property.
6223
6224         Constructor requires an EmitContext.  The resolution process does
6225         not happen here, but we need to compute the accessors before,
6226         because the resolution does not always happen for properties.
6227
6228         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
6229         subclass, before we did not update this flag, but we did update
6230         bindingflags. 
6231
6232         (GetAccessors): Drop this routine, as it did not work in the
6233         presence of partially overwritten set/get methods. 
6234
6235         Notice that this broke the cs1540 detection, but that will require
6236         more thinking. 
6237
6238 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6239
6240         * class.cs:
6241         * codegen.cs:
6242         * driver.cs: issue a warning instead of an error if we don't support
6243         debugging for the platform. Also ignore a couple of errors that may
6244         arise when trying to write the symbols. Undo my previous patch.
6245
6246 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6247
6248         * driver.cs: ignore /debug switch except for Unix platforms.
6249
6250 2002-10-23  Nick Drochak  <ndrochak@gol.com>
6251
6252         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
6253
6254 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
6255
6256         * driver.cs: Do not make mcs-debug conditional, so we do not break
6257         builds that use it.
6258
6259         * statement.cs (UsageVector.MergeChildren): I would like Martin to
6260         review this patch.  But basically after all the children variables
6261         have been merged, the value of "Breaks" was not being set to
6262         new_breaks for Switch blocks.  I think that it should be set after
6263         it has executed.  Currently I set this to the value of new_breaks,
6264         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
6265         conservative, but I do not understand this code very well.
6266
6267         I did not break anything in the build, so that is good ;-)
6268
6269         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
6270
6271 2002-10-20  Mark Crichton  <crichton@gimp.org>
6272
6273         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
6274
6275 2002-10-20  Nick Drochak  <ndrochak@gol.com>
6276
6277         * cfold.cs: Fixed compile blocker.
6278
6279 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
6280
6281         * driver.cs: I was chekcing the key, not the file.
6282
6283 2002-10-19  Ravi Pratap  <ravi@ximian.com>
6284
6285         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
6286         message that we were generating - we just need to silently return
6287         a null.
6288
6289 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
6290
6291         * class.cs (Event.Define): Change my previous commit, as this
6292         breaks the debugger.  This is a temporary hack, as it seems like
6293         the compiler is generating events incorrectly to begin with.
6294
6295         * expression.cs (Binary.ResolveOperator): Added support for 
6296         "U operator - (E x, E y)"
6297
6298         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
6299         y)".
6300
6301         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
6302         init-only variables, but this path did not take into account that
6303         there might be also instance readonly variables.  Correct this
6304         problem. 
6305
6306         This fixes bug 32253
6307
6308         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
6309         delegates as well.
6310
6311         * driver.cs: Change the extension for modules to `netmodule'
6312
6313         * cs-parser.jay: Improved slightly the location tracking for
6314         the debugger symbols.
6315
6316         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
6317         modifiers that were specified instead of the hardcoded value
6318         (FamAndAssem).  This was basically ignoring the static modifier,
6319         and others.  Fixes 32429.
6320
6321         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
6322         fixed a bug in the process (32476)
6323
6324         * expression.cs (ArrayAccess.EmitAssign): Patch from
6325         hwang_rob@yahoo.ca that fixes bug 31834.3
6326
6327 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
6328
6329         * driver.cs: Make the module extension .netmodule.
6330
6331 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
6332
6333         * driver.cs: Report an error if the resource file is not found
6334         instead of crashing.
6335
6336         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
6337         false, like Emit does.
6338
6339 2002-10-16  Nick Drochak  <ndrochak@gol.com>
6340
6341         * typemanager.cs: Remove unused private member.  Also reported mcs
6342         bug to report this as a warning like csc.
6343
6344 2002-10-15  Martin Baulig  <martin@gnome.org>
6345
6346         * statement.cs (Statement.Emit): Made this a virtual method; emits
6347         the line number info and calls DoEmit().
6348         (Statement.DoEmit): New protected abstract method, formerly knows
6349         as Statement.Emit().
6350
6351         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
6352
6353 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
6354
6355         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
6356         have fixed a remaining problem: not every AddXXXX was adding a
6357         fully qualified name.  
6358
6359         Now everyone registers a fully qualified name in the DeclSpace as
6360         being defined instead of the partial name.  
6361
6362         Downsides: we are slower than we need to be due to the excess
6363         copies and the names being registered this way.  
6364
6365         The reason for this is that we currently depend (on the corlib
6366         bootstrap for instance) that types are fully qualified, because
6367         we dump all the types in the namespace, and we should really have
6368         types inserted into the proper namespace, so we can only store the
6369         basenames in the defined_names array.
6370
6371 2002-10-10  Martin Baulig  <martin@gnome.org>
6372
6373         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
6374         from bug #31834, see the bug report for a testcase which is
6375         miscompiled.
6376
6377 2002-10-10  Martin Baulig  <martin@gnome.org>
6378
6379         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
6380         flow analysis code for this.
6381
6382         * statement.cs (Do, While, For): Tell the flow analysis code about
6383         infinite loops.
6384         (FlowBranching.UsageVector): Added support for infinite loops.
6385         (Block.Resolve): Moved the dead code elimination here and use flow
6386         analysis to do it.
6387
6388 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
6389
6390         * class.cs (Field.Define): Catch cycles on struct type
6391         definitions. 
6392
6393         * typemanager.cs (IsUnmanagedtype): Do not recursively check
6394         fields if the fields are static.  We only need to check instance
6395         fields. 
6396
6397         * expression.cs (As.DoResolve): Test for reference type.
6398
6399         * statement.cs (Using.ResolveExpression): Use
6400         ConvertImplicitRequired, not ConvertImplicit which reports an
6401         error on failture
6402         (Using.ResolveLocalVariableDecls): ditto.
6403
6404         * expression.cs (Binary.ResolveOperator): Report errors in a few
6405         places where we had to.
6406
6407         * typemanager.cs (IsUnmanagedtype): Finish implementation.
6408
6409 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
6410
6411         * expression.cs: Use StoreFromPtr instead of extracting the type
6412         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
6413
6414         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
6415         an enumeration value to a System.Enum, but System.Enum is not a
6416         value type, but an class type, so we need to box.
6417
6418         (Expression.ConvertExplicit): One codepath could return
6419         errors but not flag them.  Fix this.  Fixes #31853
6420
6421         * parameter.cs (Resolve): Do not allow void as a parameter type.
6422
6423 2002-10-06  Martin Baulig  <martin@gnome.org>
6424
6425         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
6426         if it's a class type and not a struct.  Fixes #31815.
6427
6428 2002-10-06  Martin Baulig  <martin@gnome.org>
6429
6430         * statement.cs: Reworked the flow analysis code a bit to make it
6431         usable for dead code elimination.
6432
6433 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6434
6435         * cs-parser.jay: allow empty source files. Fixes bug #31781.
6436
6437 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
6438
6439         * expression.cs (ComposedCast.DoResolveType): A quick workaround
6440         to fix the test 165, will investigate deeper.
6441
6442 2002-10-04  Martin Baulig  <martin@gnome.org>
6443
6444         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
6445         finally blocks actually work.
6446         (Try.Resolve): We don't need to create a sibling for `finally' if
6447         there is no finally block.
6448
6449 2002-10-04  Martin Baulig  <martin@gnome.org>
6450
6451         * class.cs (Constructor.Define): The default accessibility for a
6452         non-default constructor is private, not public.
6453
6454 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
6455
6456         * class.cs (Constructor): Make AllowedModifiers public, add
6457         EXTERN.
6458
6459         * cs-parser.jay: Perform the modifiers test here, as the
6460         constructor for the Constructor class usually receives a zero
6461         because of the way we create it (first we create, later we
6462         customize, and we were never checking the modifiers).
6463
6464         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
6465         is a version of LookupTypeReflection that includes the type-name
6466         cache.  This can be used as a fast path for functions that know
6467         the fully qualified name and are only calling into *.GetType() to
6468         obtain a composed type.
6469
6470         This is also used by TypeManager.LookupType during its type
6471         composition.
6472
6473         (LookupType): We now also track the real type name, as sometimes
6474         we can get a quey for the real type name from things like
6475         ComposedCast.  This fixes bug 31422.
6476
6477         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
6478         complete type fullname, it does not have to go through the type
6479         resolution system to obtain the composed version of the type (for
6480         obtaining arrays or pointers).
6481
6482         (Conditional.Emit): Use the EmitBoolExpression to
6483         generate nicer code, as requested by Paolo.
6484
6485         (ArrayCreation.CheckIndices): Use the patch from
6486         hwang_rob@yahoo.ca to validate the array initializers. 
6487
6488 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
6489
6490         * class.cs (ConstructorInitializer.Emit): simplify code by using
6491         Invocation.EmitCall, and at the same time, fix the bugs in calling
6492         parent constructors that took variable arguments. 
6493
6494         * ecore.cs (Expression.ConvertNumericExplicit,
6495         Expression.ImplicitNumericConversion): Remove the code that
6496         manually wrapped decimal (InternalTypeConstructor call is now gone
6497         as well).
6498
6499         * expression.cs (Cast.TryReduce): Also handle decimal types when
6500         trying to perform a constant fold on the type.
6501
6502         * typemanager.cs (IsUnmanagedtype): Partially implemented.
6503
6504         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
6505         that only turned off an error report, and did nothing else. 
6506
6507 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
6508
6509         * driver.cs: Handle and ignore /fullpaths
6510
6511 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
6512
6513         * expression.cs (Binary.ResolveOperator): Catch the case where
6514         DoNumericPromotions returns true, 
6515
6516         (Binary.DoNumericPromotions): Simplify the code, and the tests.
6517
6518 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
6519
6520         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
6521         report error 70.
6522
6523 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
6524
6525         * ecore.cs (ConvertNumericExplicit): It is not enough that the
6526         conversion exists, but it is also required that the conversion be
6527         performed.  This manifested in "(Type64Enum) 2".  
6528
6529         * class.cs (TypeManager.AddMethod): The fix is not to change
6530         AddEnum, because that one was using a fully qualified name (every
6531         DeclSpace derivative does), but to change the AddMethod routine
6532         that was using an un-namespaced name.  This now correctly reports
6533         the duplicated name.
6534
6535         Revert patch until I can properly fix it.  The issue
6536         is that we have a shared Type space across all namespaces
6537         currently, which is wrong.
6538
6539         Options include making the Namespace a DeclSpace, and merge
6540         current_namespace/current_container in the parser.
6541
6542 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
6543
6544         * cs-parser.jay: Improve error reporting when we get a different
6545         kind of expression in local_variable_type and
6546         local_variable_pointer_type. 
6547
6548         Propagate this to avoid missleading errors being reported.
6549
6550         * ecore.cs (ImplicitReferenceConversion): treat
6551         TypeManager.value_type as a target just like object_type.   As
6552         code like this:
6553
6554         ValueType v = 1;
6555
6556         Is valid, and needs to result in the int 1 being boxed before it
6557         is assigned to the value type v.
6558
6559         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
6560         to validate the enumeration name.
6561
6562         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
6563         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
6564         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
6565
6566         * ecore.cs (TryImplicitIntConversion): When doing an
6567         implicit-enumeration-conversion, check if the type is 64-bits and
6568         perform a conversion before passing to EnumConstant.
6569
6570 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
6571
6572         * decl.cs (Error_AmbiguousTypeReference); New routine used to
6573         report ambiguous type references.  Unlike the MS version, we
6574         report what the ambiguity is.   Innovation at work ;-)
6575
6576         (DeclSpace.FindType): Require a location argument to
6577         display when we display an ambiguous error.
6578
6579         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
6580
6581         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
6582
6583         * expression.cs (EmitDynamicInitializers): Apply patch from
6584         hwang_rob@yahoo.ca that fixes the order in which we emit our
6585         initializers. 
6586
6587 2002-09-21  Martin Baulig  <martin@gnome.org>
6588
6589         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
6590         delegate takes no arguments.
6591
6592 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
6593
6594         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
6595         from integers.
6596
6597         * expression.cs: Extract the underlying type.
6598
6599         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
6600
6601         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
6602
6603 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
6604
6605         * class.cs (TypeContainer.DefineType): We can not use the nice
6606         PackingSize with the size set to 1 DefineType method, because it
6607         will not allow us to define the interfaces that the struct
6608         implements.
6609
6610         This completes the fixing of bug 27287
6611
6612         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
6613         means also structs.  This fixes part of the problem. 
6614         (Expresion.ImplicitReferenceConversionExists): ditto.
6615
6616         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
6617         error if there were no errors reported during the type lookup
6618         process, to avoid duplicates or redundant errors.  Without this
6619         you would get an ambiguous errors plus a type not found.  We have
6620         beaten the user enough with the first error.  
6621
6622         (DeclSparce.FindType): Emit a warning if we have an ambiguous
6623         reference. 
6624
6625         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
6626         during the resolution process, stop the lookup, this avoids
6627         repeated error reports (same error twice).
6628
6629         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
6630
6631         * typemanager.cs (LookupType): Redo the type lookup code to match
6632         the needs of System.Reflection.  
6633
6634         The issue is that System.Reflection requires references to nested
6635         types to begin with a "+" sign instead of a dot.  So toplevel
6636         types look like: "NameSpace.TopLevelClass", and nested ones look
6637         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
6638         levels. 
6639
6640 2002-09-19  Martin Baulig  <martin@gnome.org>
6641
6642         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
6643         says that a method always returns or always throws an exception,
6644         don't report the CS0161.
6645
6646         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
6647         set `Returns = new_returns'.
6648
6649 2002-09-19  Martin Baulig  <martin@gnome.org>
6650
6651         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
6652         to an enum constant, check for a CS0176.
6653
6654 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
6655
6656         * class.cs (TypeContainer.CheckPairedOperators): Now we check
6657         for operators that must be in pairs and report errors.
6658
6659         * ecore.cs (SimpleName.DoResolveType): During the initial type
6660         resolution process, when we define types recursively, we must
6661         check first for types in our current scope before we perform
6662         lookups in the enclosing scopes.
6663
6664         * expression.cs (MakeByteBlob): Handle Decimal blobs.
6665
6666         (Invocation.VerifyArgumentsCompat): Call
6667         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
6668         I thought we were supposed to always call this, but there are a
6669         few places in the code where we dont do it.
6670
6671 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
6672
6673         * driver.cs: Add support in -linkres and -resource to specify the
6674         name of the identifier.
6675
6676 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6677
6678         * ecore.cs (StandardConversionExists): Sync with the conversion
6679         code: allow anything-* to void* conversions.
6680
6681         (FindMostSpecificSource): Use an Expression argument
6682         instead of a Type, because we might be handed over a Literal which
6683         gets a few more implicit conversions that plain types do not.  So
6684         this information was being lost.
6685
6686         Also, we drop the temporary type-holder expression when not
6687         required.
6688
6689 2002-09-17  Martin Baulig  <martin@gnome.org>
6690
6691         * class.cs (PropertyBase.CheckBase): Don't check the base class if
6692         this is an explicit interface implementation.
6693
6694 2002-09-17  Martin Baulig  <martin@gnome.org>
6695
6696         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
6697         different `IndexerName' attributes.
6698
6699         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
6700         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
6701         virtual CommonResolve().
6702
6703 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6704
6705         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
6706         and convert that to the UnderlyingType.
6707
6708         * statement.cs (Foreach.Resolve): Indexers are just like variables
6709         or PropertyAccesses.
6710
6711         * cs-tokenizer.cs (consume_string): Track line numbers and columns
6712         inside quoted strings, we were not doing this before.
6713
6714 2002-09-16  Martin Baulig  <martin@gnome.org>
6715
6716         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
6717         resolve it.  This is needed for the definite assignment check of the
6718         instance expression, fixes bug #29846.
6719         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
6720
6721 2002-09-16  Nick Drochak  <ndrochak@gol.com>
6722
6723         * parameter.cs: Fix compile error.  Cannot reference static member
6724         from an instance object.  Is this an mcs bug?
6725
6726 2002-09-14  Martin Baulig  <martin@gnome.org>
6727
6728         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
6729         multiple times.  Fixes bug #30295, added test-166.cs.
6730
6731 2002-09-14  Martin Baulig  <martin@gnome.org>
6732
6733         * statement.cs (Block.Emit): Don't emit unreachable code.
6734         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
6735         `break' statements.
6736         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
6737
6738 2002-09-14  Martin Baulig  <martin@gnome.org>
6739
6740         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
6741         is set.
6742
6743 2002-09-14  Martin Baulig  <martin@gnome.org>
6744
6745         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
6746         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
6747         be false on the ms runtime.
6748
6749 2002-09-13  Martin Baulig  <martin@gnome.org>
6750
6751         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
6752         the CS0038 error message.
6753
6754 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
6755
6756         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
6757         constant inside, return it.
6758
6759 2002-09-12  Martin Baulig  <martin@gnome.org>
6760
6761         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
6762         implicit conversion can be done between enum types.
6763
6764         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
6765         check whether an implicit conversion to the current enum's UnderlyingType
6766         exists and report an error if not.
6767
6768         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
6769         without debugging support.
6770
6771         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
6772         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
6773
6774 2002-09-12  Martin Baulig  <martin@gnome.org>
6775
6776         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
6777
6778         * ecore.cs (IMemberExpr.DeclaringType): New property.
6779         (SimpleName.SimpleNameResolve): Check whether we're accessing a
6780         nonstatic member of an outer type (CS0038).
6781
6782 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
6783
6784         * driver.cs: Activate the using-error detector at warning level
6785         4 (at least for MS-compatible APIs).
6786
6787         * namespace.cs (VerifyUsing): Small buglett fix.
6788
6789         * pending.cs (PendingImplementation): pass the container pointer. 
6790
6791         * interface.cs (GetMethods): Allow for recursive definition.  Long
6792         term, I would like to move every type to support recursive
6793         definitions, not the current ordering mechanism that we have right
6794         now.
6795
6796         The situation is this: Attributes are handled before interfaces,
6797         so we can apply attributes to interfaces.  But some attributes
6798         implement interfaces, we will now handle the simple cases
6799         (recursive definitions will just get an error).  
6800
6801         * parameter.cs: Only invalidate types at the end if we fail to
6802         lookup all types.  
6803
6804 2002-09-09  Martin Baulig  <martin@gnome.org>
6805
6806         * ecore.cs (PropertyExpr.Emit): Also check for
6807         TypeManager.system_int_array_get_length so this'll also work when
6808         compiling corlib.  Fixes #30003.
6809
6810 2002-09-09  Martin Baulig  <martin@gnome.org>
6811
6812         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
6813         and throw an exception if we can't get the type's size.  Fixed #30040,
6814         added test-165.cs.
6815
6816 2002-09-09  Martin Baulig  <martin@gnome.org>
6817
6818         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
6819
6820         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
6821         context.  Fixes bug #30027.
6822
6823         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
6824         virtual functions.  Fixes bug #30043, added test-164.cs.
6825
6826 2002-09-08  Ravi Pratap  <ravi@ximian.com>
6827
6828         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
6829
6830 2002-09-08  Nick Drochak  <ndrochak@gol.com>
6831
6832         * driver.cs: Use an object to get the windows codepage since it's not a
6833         static property.
6834
6835 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
6836
6837         * statement.cs (For.Emit): for infinite loops (test == null)
6838         return whether there is a break inside, not always "true".
6839
6840         * namespace.cs (UsingEntry): New struct to hold the name of the
6841         using definition, the location where it is defined, and whether it
6842         has been used in a successful type lookup.
6843
6844         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
6845         strings.
6846
6847         * decl.cs: ditto.
6848
6849 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6850
6851         * attribute.cs : Fix incorrect code which relied on catching
6852         a NullReferenceException to detect a null being passed in
6853         where an object was expected.
6854
6855 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
6856
6857         * statement.cs (Try): flag the catch variable as assigned
6858
6859         * expression.cs (Cast): Simplified by using ResolveType instead of
6860         manually resolving.
6861
6862         * statement.cs (Catch): Fix bug by using ResolveType.
6863
6864 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6865
6866         * expression.cs (BetterConversion): Special case for when we have
6867         a NullLiteral as the argument and we have to choose between string
6868         and object types - we choose string the way csc does.
6869
6870         * attribute.cs (Attribute.Resolve): Catch the
6871         NullReferenceException and report error #182 since the Mono
6872         runtime no more has the bug and having this exception raised means
6873         we tried to select a constructor which takes an object and is
6874         passed a null.
6875
6876 2002-09-05  Ravi Pratap  <ravi@ximian.com>
6877
6878         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
6879         message (1502, 1503) when we can't locate a method after overload
6880         resolution. This is much more informative and closes the bug
6881         Miguel reported.
6882
6883         * interface.cs (PopulateMethod): Return if there are no argument
6884         types. Fixes a NullReferenceException bug.
6885
6886         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
6887         expressions too. Previously we were checking only in one place for
6888         positional arguments leaving out named arguments.
6889
6890         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
6891         type to the enum type is not allowed. Remove code corresponding to
6892         that.
6893
6894         (ConvertNumericExplicit): Allow explicit conversions from
6895         the underlying type to enum type. This precisely follows the spec
6896         and closes a bug filed by Gonzalo.
6897
6898 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6899
6900         * compiler.csproj:
6901         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
6902
6903 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
6904
6905         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
6906         it was important that we stored the right value after the
6907         reduction in `converted'.
6908
6909 2002-09-04  Martin Baulig  <martin@gnome.org>
6910
6911         * location.cs (Location.SymbolDocument): Use full pathnames for the
6912         source files.
6913
6914 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
6915
6916         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
6917         of the expression resolve mechanism, because that will catch the
6918         SimpleName error failures.
6919
6920         (Conditional): If we can not resolve the
6921         expression, return, do not crash.
6922
6923 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6924
6925         * cs-tokenizer.cs:
6926         (location): display token name instead of its number.
6927
6928 2002-08-28  Martin Baulig  <martin@gnome.org>
6929
6930         * expression.cs (Binary.ResolveOperator): Don't silently return
6931         but return an error if an operator cannot be applied between two
6932         enum types.
6933
6934 2002-08-28  Martin Baulig  <martin@gnome.org>
6935
6936         * class.cs (Constructor.Define): Set the permission attributes
6937         correctly instead of making all constructors public.
6938
6939 2002-08-28  Martin Baulig  <martin@gnome.org>
6940
6941         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
6942         for private members before reporting a CS0103; if we find anything,
6943         it's a CS0122.
6944
6945 2002-08-28  Martin Baulig  <martin@gnome.org>
6946
6947         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
6948         to check whether `closure_start_type == closure_invocation_type',
6949         we also need to check whether `m.DeclaringType == closure_invocation_type'
6950         before bypassing the permission checks.  We might be accessing
6951         protected/private members from the base class.
6952         (TypeManager.RealMemberLookup): Only set private_ok if private
6953         members were requested via BindingFlags.NonPublic.
6954
6955         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
6956
6957         * expression.cs (MemberAccess.ResolveMemberAccess): Set
6958         MethodGroupExpr.IsExplicitImpl if appropriate.
6959         (Invocation.DoResolve): Don't report the CS0120 for explicit
6960         interface implementations.
6961
6962 2002-08-27  Martin Baulig  <martin@gnome.org>
6963
6964         * expression.cs (Invocation.DoResolve): If this is a static
6965         method and we don't have an InstanceExpression, we must report
6966         a CS0120.
6967
6968 2002-08-25  Martin Baulig  <martin@gnome.org>
6969
6970         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
6971         `==' between a valuetype and an object.
6972
6973 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
6974
6975         * ecore.cs (TypeExpr): Provide a ToString method.
6976
6977 2002-08-24  Martin Baulig  <martin@gnome.org>
6978
6979         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
6980         now called proggie.dbg and it's a binary file.
6981
6982 2002-08-23  Martin Baulig  <martin@gnome.org>
6983
6984         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
6985
6986 2002-08-23  Martin Baulig  <martin@gnome.org>
6987
6988         * struct.cs (MyStructInfo.ctor): Make this work with empty
6989         structs; it's not allowed to use foreach() on null.
6990
6991 2002-08-23  Martin Baulig  <martin@gnome.org>
6992
6993         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
6994         writer the full pathname of the generated assembly.
6995
6996 2002-08-23  Martin Baulig  <martin@gnome.org>
6997
6998         * statements.cs (FlowBranching.UsageVector.MergeChildren):
6999         A `finally' block never returns or breaks; improved handling of
7000         unreachable code.
7001
7002 2002-08-23  Martin Baulig  <martin@gnome.org>
7003
7004         * statement.cs (Throw.Resolve): Allow `throw null'.
7005
7006 2002-08-23  Martin Baulig  <martin@gnome.org>
7007
7008         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
7009         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
7010         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
7011         MemberLookup would return a wrong event if this is an explicit
7012         interface implementation and the class has an event with the same
7013         name.
7014
7015 2002-08-23  Martin Baulig  <martin@gnome.org>
7016
7017         * statement.cs (Block.AddChildVariableNames): New public method.
7018         (Block.AddChildVariableName): Likewise.
7019         (Block.IsVariableNameUsedInChildBlock): Likewise.
7020         (Block.AddVariable): Check whether a variable name has already
7021         been used in a child block.
7022
7023         * cs-parser.jay (declare_local_variables): Mark all variable names
7024         from the current block as being used in a child block in the
7025         implicit block.
7026
7027 2002-08-23  Martin Baulig  <martin@gnome.org>
7028
7029         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
7030         find the symbol writer.
7031
7032         * driver.cs: csc also allows the arguments to /define being
7033         separated by commas, not only by semicolons.
7034
7035 2002-08-23  Martin Baulig  <martin@gnome.org>
7036
7037         * interface.cs (Interface.GetMembers): Added static check for events.
7038
7039 2002-08-15  Martin Baulig  <martin@gnome.org>
7040
7041         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
7042         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
7043
7044         * ecore.cs (Expression.MemberLookup): Added documentation and explained
7045         why the MethodData.EmitDestructor() change was necessary.
7046
7047 2002-08-20  Martin Baulig  <martin@gnome.org>
7048
7049         * class.cs (TypeContainer.FindMembers): Added static check for events.
7050
7051         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
7052
7053         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
7054         use Type.GetEvents(), not Type.FindMembers().
7055
7056 2002-08-20  Martin Baulig  <martin@gnome.org>
7057
7058         * decl.cs (MemberCache): Added a special method cache which will
7059         be used for method-only searched.  This ensures that a method
7060         search will return a MethodInfo with the correct ReflectedType for
7061         inherited methods.      
7062
7063 2002-08-20  Martin Baulig  <martin@gnome.org>
7064
7065         * decl.cs (DeclSpace.FindMembers): Made this public.
7066
7067 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7068
7069         * delegate.cs: fixed build on windows.
7070         [FIXME:  Filed as bug #29150: MCS must report these errors.]
7071
7072 2002-08-19  Ravi Pratap  <ravi@ximian.com>
7073
7074         * ecore.cs (StandardConversionExists): Return a false
7075         if we are trying to convert the void type to anything else
7076         since that is not allowed.
7077
7078         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
7079         we flag error 70 in the event an event is trying to be accessed
7080         directly from outside the declaring type.
7081
7082 2002-08-20  Martin Baulig  <martin@gnome.org>
7083
7084         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
7085         MemberCache from typemanager.cs to decl.cs.
7086
7087 2002-08-19  Martin Baulig  <martin@gnome.org>
7088
7089         * class.cs (TypeContainer): Implement IMemberContainer.
7090         (TypeContainer.DefineMembers): Create the MemberCache.
7091         (TypeContainer.FindMembers): Do better BindingFlags checking; only
7092         return public members if BindingFlags.Public was given, check
7093         whether members are static.
7094
7095 2002-08-16  Martin Baulig  <martin@gnome.org>
7096
7097         * decl.cs (DeclSpace.Define): Splitted this in Define and
7098         DefineMembers.  DefineMembers is called first and initializes the
7099         MemberCache.
7100
7101         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
7102         DefineMembers() on all our DeclSpaces.
7103
7104         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
7105         but call DefineMembers() on all nested interfaces.  We call their
7106         Define() in our new Define() function.
7107
7108         * interface.cs (Interface): Implement IMemberContainer.
7109         (Interface.Define): Moved all code except the attribute stuf to
7110         DefineMembers().
7111         (Interface.DefineMembers): Initialize the member cache.
7112
7113         * typemanager.cs (IMemberFinder): Removed this interface, we don't
7114         need this anymore since we can use MemberCache.FindMembers directly.
7115
7116 2002-08-19  Martin Baulig  <martin@gnome.org>
7117
7118         * typemanager.cs (MemberCache): When creating the cache for an
7119         interface type, add all inherited members.
7120         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
7121         to `out bool used_cache' and documented it.
7122         (TypeManager.MemberLookup): If we already used the cache in the first
7123         iteration, we don't need to do the interfaces check.
7124
7125 2002-08-19  Martin Baulig  <martin@gnome.org>
7126
7127         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
7128         here from IMemberFinder and don't implement this interface anymore.
7129         (DeclSpace.MemberCache): Moved here from IMemberFinder.
7130
7131         * typemanager.cs (IMemberFinder): This interface is now only used by
7132         classes which actually support the member cache.
7133         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
7134         since we only put DeclSpaces into this Hashtable.
7135         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
7136         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
7137
7138 2002-08-16  Martin Baulig  <martin@gnome.org>
7139
7140         * typemanager.cs (ICachingMemberFinder): Removed.
7141         (IMemberFinder.MemberCache): New property.
7142         (TypeManager.FindMembers): Merged this with RealFindMembers().
7143         This function will never be called from TypeManager.MemberLookup()
7144         so we can't use the cache here, just the IMemberFinder.
7145         (TypeManager.MemberLookup_FindMembers): Check whether the
7146         IMemberFinder has a MemberCache and call the cache's FindMembers
7147         function.
7148         (MemberCache): Rewrote larger parts of this yet another time and
7149         cleaned it up a bit.
7150
7151 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
7152
7153         * driver.cs (LoadArgs): Support quoting.
7154
7155         (Usage): Show the CSC-like command line arguments.
7156
7157         Improved a few error messages.
7158
7159 2002-08-15  Martin Baulig  <martin@gnome.org>
7160
7161         * typemanager.cs (IMemberContainer.Type): New property.
7162         (IMemberContainer.IsInterface): New property.
7163
7164         The following changes are conditional to BROKEN_RUNTIME, which is
7165         defined at the top of the file.
7166
7167         * typemanager.cs (MemberCache.MemberCache): Don't add the base
7168         class'es members, but add all members from TypeHandle.ObjectType
7169         if we're an interface.
7170         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
7171         is the current type.
7172         (MemberCache.CacheEntry.Container): Removed this field.
7173         (TypeHandle.GetMembers): Include inherited members.
7174
7175 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7176
7177         * typemanager.cs: fixed compilation and added a comment on a field that
7178         is never used.
7179
7180 2002-08-15  Martin Baulig  <martin@gnome.org>
7181
7182         * class.cs (ConstructorInitializer.Resolve): In the
7183         Expression.MemberLookup call, use the queried_type as
7184         invocation_type.
7185
7186         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
7187         declared' attribute, it's always true.
7188         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
7189         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
7190         temporary wrapper for FindMembers which tells MemberLookup whether
7191         members from the base classes are included in the return value.
7192         This will go away soon.
7193         (TypeManager.MemberLookup): Use this temporary hack here; once the
7194         new MemberCache is completed, we don't need to do the DeclaredOnly
7195         looping here anymore since the MemberCache will take care of this.
7196         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
7197         (MemberCache): When creating the MemberCache for a class, get
7198         members from the current class and all its base classes.
7199         (MemberCache.CacheEntry.Container): New field.  This is a
7200         temporary hack until the Mono runtime is fixed to distinguish
7201         between ReflectedType and DeclaringType.  It allows us to use MCS
7202         with both the MS runtime and the unfixed Mono runtime without
7203         problems and without accecting performance.
7204         (MemberCache.SearchMembers): The DeclaredOnly looping from
7205         TypeManager.MemberLookup is now done here.      
7206
7207 2002-08-14  Martin Baulig  <martin@gnome.org>
7208
7209         * statement.cs (MyStructInfo.MyStructInfo): Don't call
7210         Type.GetFields on dynamic types but get the fields from the
7211         corresponding TypeContainer.
7212         (MyStructInfo.GetStructInfo): Added check for enum types.
7213
7214         * typemanager.cs (MemberList.IsSynchronized): Implemented.
7215         (MemberList.SyncRoot): Implemented.
7216         (TypeManager.FilterWithClosure): No need to check permissions if
7217         closure_start_type == closure_invocation_type, don't crash if
7218         closure_invocation_type is null.
7219
7220 2002-08-13  Martin Baulig  <martin@gnome.org>
7221
7222         Rewrote TypeContainer.FindMembers to use a member cache.  This
7223         gives us a speed increase of about 35% for the self-hosting MCS
7224         build and of about 15-20% for the class libs (both on GNU/Linux).
7225
7226         * report.cs (Timer): New class to get enhanced profiling.  This
7227         whole class is "TIMER" conditional since it remarkably slows down
7228         compilation speed.
7229
7230         * class.cs (MemberList): New class.  This is an IList wrapper
7231         which we're now using instead of passing MemberInfo[]'s around to
7232         avoid copying this array unnecessarily.
7233         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
7234         (ICachingMemberFinder, IMemberContainer): New interface.
7235         (TypeManager.FilterWithClosure): If `criteria' is null, the name
7236         has already been checked, otherwise use it for the name comparision.
7237         (TypeManager.FindMembers): Renamed to RealMemberFinder and
7238         provided wrapper which tries to use ICachingMemberFinder.FindMembers
7239         if possible.  Returns a MemberList, not a MemberInfo [].
7240         (TypeHandle): New class, implements IMemberContainer.  We create
7241         one instance of this class per type, it contains a MemberCache
7242         which is used to do the member lookups.
7243         (MemberCache): New class.  Each instance of this class contains
7244         all members of a type and a name-based hash table.
7245         (MemberCache.FindMembers): This is our new member lookup
7246         function.  First, it looks up all members of the requested name in
7247         the hash table.  Then, it walks this list and sorts out all
7248         applicable members and returns them.
7249
7250 2002-08-13  Martin Baulig  <martin@gnome.org>
7251
7252         In addition to a nice code cleanup, this gives us a performance
7253         increase of about 1.4% on GNU/Linux - not much, but it's already
7254         half a second for the self-hosting MCS compilation.
7255
7256         * typemanager.cs (IMemberFinder): New interface.  It is used by
7257         TypeManager.FindMembers to call FindMembers on a TypeContainer,
7258         Enum, Delegate or Interface.
7259         (TypeManager.finder_to_member_finder): New PtrHashtable.
7260         (TypeManager.finder_to_container): Removed.
7261         (TypeManager.finder_to_delegate): Removed.
7262         (TypeManager.finder_to_interface): Removed.
7263         (TypeManager.finder_to_enum): Removed.
7264
7265         * interface.cs (Interface): Implement IMemberFinder.
7266
7267         * delegate.cs (Delegate): Implement IMemberFinder.
7268
7269         * enum.cs (Enum): Implement IMemberFinder.
7270
7271         * class.cs (TypeContainer): Implement IMemberFinder.
7272
7273 2002-08-12  Martin Baulig  <martin@gnome.org>
7274
7275         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
7276
7277 2002-08-12  Martin Baulig  <martin@gnome.org>
7278
7279         * ecore.cs (ITypeExpression): New interface for expressions which
7280         resolve to a type.
7281         (TypeExpression): Renamed to TypeLookupExpression.
7282         (Expression.DoResolve): If we're doing a types-only lookup, the
7283         expression must implement the ITypeExpression interface and we
7284         call DoResolveType() on it.
7285         (SimpleName): Implement the new ITypeExpression interface.
7286         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
7287         hack, the situation that we're only looking up types can't happen
7288         anymore when this method is called.  Moved the type lookup code to
7289         DoResolveType() and call it.
7290         (SimpleName.DoResolveType): This ITypeExpression interface method
7291         is now doing the types-only lookup.
7292         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
7293         (ResolveFlags): Added MaskExprClass.
7294
7295         * expression.cs (MemberAccess): Implement the ITypeExpression
7296         interface.
7297         (MemberAccess.DoResolve): Added support for a types-only lookup
7298         when we're called via ITypeExpression.DoResolveType().
7299         (ComposedCast): Implement the ITypeExpression interface.
7300
7301         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
7302         Expression.Resolve() with ResolveFlags.Type instead.
7303
7304 2002-08-12  Martin Baulig  <martin@gnome.org>
7305
7306         * interface.cs (Interface.Define): Apply attributes.
7307
7308         * attribute.cs (Attribute.ApplyAttributes): Added support for
7309         interface attributes.
7310
7311 2002-08-11  Martin Baulig  <martin@gnome.org>
7312
7313         * statement.cs (Block.Emit): Only check the "this" variable if we
7314         do not always throw an exception.
7315
7316         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
7317         whether the property has a set accessor.
7318
7319 2002-08-11  Martin Baulig  <martin@gnome.org>
7320
7321         Added control flow analysis support for structs.
7322
7323         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
7324         with control flow analysis turned off.
7325         (IVariable): New interface.
7326         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
7327         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
7328         (FieldExpr.DoResolve): Resolve the instance expression with flow
7329         analysis turned off and do the definite assignment check after the
7330         resolving when we know what the expression will resolve to.
7331
7332         * expression.cs (LocalVariableReference, ParameterReference):
7333         Implement the new IVariable interface, only call the flow analysis
7334         code if ec.DoFlowAnalysis is true.
7335         (This): Added constructor which takes a Block argument.  Implement
7336         the new IVariable interface.
7337         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
7338         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
7339         This does the definite assignment checks for struct members.
7340
7341         * class.cs (Constructor.Emit): If this is a non-static `struct'
7342         constructor which doesn't have any initializer, call
7343         Block.AddThisVariable() to tell the flow analysis code that all
7344         struct elements must be initialized before control returns from
7345         the constructor.
7346
7347         * statement.cs (MyStructInfo): New public class.
7348         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
7349         argument to this indexer.  If non-zero, check an individual struct
7350         member, not the whole struct.
7351         (FlowBranching.CheckOutParameters): Check struct members.
7352         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
7353         overloaded versions of these methods which take an additional
7354         `int field_idx' argument to check struct members.
7355         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
7356         overloaded versions of these methods which take an additional
7357         `string field_name' argument to check struct member.s
7358         (VariableInfo): Implement the IVariable interface.
7359         (VariableInfo.StructInfo): New public property.  Returns the
7360         MyStructInfo instance of the variable if it's a struct or null.
7361         (Block.AddThisVariable): New public method.  This is called from
7362         Constructor.Emit() for non-static `struct' constructor which do
7363         not have any initializer.  It creates a special variable for the
7364         "this" instance variable which will be checked by the flow
7365         analysis code to ensure that all of the struct's fields are
7366         initialized before control returns from the constructor.
7367         (UsageVector): Added support for struct members.  If a
7368         variable/parameter is a struct with N members, we reserve a slot
7369         in the usage vector for each member.  A struct is considered fully
7370         initialized if either the struct itself (slot 0) or all its
7371         members are initialized.
7372
7373 2002-08-08  Martin Baulig  <martin@gnome.org>
7374
7375         * driver.cs (Driver.MainDriver): Only report an error CS5001
7376         if there were no compilation errors.
7377
7378         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
7379         `UnsafeContext' property to determine whether the parent is in
7380         unsafe context rather than checking the parent's ModFlags:
7381         classes nested in an unsafe class are unsafe as well.
7382
7383 2002-08-08  Martin Baulig  <martin@gnome.org>
7384
7385         * statement.cs (UsageVector.MergeChildren): Distinguish between
7386         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
7387         we return.  Added test17() and test18() to test-154.cs.
7388
7389 2002-08-08  Martin Baulig  <martin@gnome.org>
7390
7391         * typemanager.cs (TypeManager.FilterWithClosure): If we have
7392         Family access, make sure the invoking type isn't a subclass of the
7393         queried type (that'd be a CS1540).
7394
7395         * ecore.cs (Expression.MemberLookup): Added overloaded version of
7396         this method which takes an additional `Type invocation_type'.
7397
7398         * expression.cs (BaseAccess.DoResolve): Use the base type as
7399         invocation and query type.
7400         (MemberAccess.DoResolve): If the lookup failed and we're about to
7401         report a CS0122, try a lookup with the ec.ContainerType - if this
7402         succeeds, we must report a CS1540.
7403
7404 2002-08-08  Martin Baulig  <martin@gnome.org>
7405
7406         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
7407         (MethodGroupExpr): Implement the IMemberExpr interface.
7408
7409         * expression (MemberAccess.ResolveMemberAccess): No need to have
7410         any special code for MethodGroupExprs anymore, they're now
7411         IMemberExprs.   
7412
7413 2002-08-08  Martin Baulig  <martin@gnome.org>
7414
7415         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
7416         Family, FamANDAssem and FamORAssem permissions.
7417         (TypeManager.IsSubclassOrNestedChildOf): New public method.
7418
7419 2002-08-08  Martin Baulig  <martin@gnome.org>
7420
7421         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
7422         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
7423         or loop block.
7424
7425 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
7426
7427         * driver.cs: implemented /resource option to embed managed resources.
7428
7429 2002-08-07  Martin Baulig  <martin@gnome.org>
7430
7431         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
7432         (FieldBase.HasFieldInitializer): New public property.
7433         (FieldBase.GetInitializerExpression): New public method.  Resolves and
7434         returns the field initializer and makes sure it is only resolved once.
7435         (TypeContainer.EmitFieldInitializers): Call
7436         FieldBase.GetInitializerExpression to get the initializer, this ensures
7437         that it isn't resolved multiple times.
7438
7439         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
7440         the resolving process (SimpleName/MemberLookup) that we're currently
7441         emitting a field initializer (which must not access any instance members,
7442         this is an error CS0236).
7443
7444         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
7445         argument, if the `IsFieldInitializer' flag is set, we must report and
7446         error CS0236 and not an error CS0120.   
7447
7448 2002-08-07  Martin Baulig  <martin@gnome.org>
7449
7450         * ecore.cs (IMemberExpr): New public interface.
7451         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
7452         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
7453         if the expression is an IMemberExpr.
7454
7455         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
7456         to be null, implicitly default to `this' if we're non-static in
7457         this case.  Simplified the code a lot by using the new IMemberExpr
7458         interface.  Also fixed bug #28176 here.
7459
7460 2002-08-06  Martin Baulig  <martin@gnome.org>
7461
7462         * cs-parser.jay (SimpleLookup): Removed.  We need to create
7463         ParameterReferences during semantic analysis so that we can do a
7464         type-only search when resolving Cast, TypeOf and SizeOf.
7465         (block): Pass the `current_local_parameters' to the Block's
7466         constructor.
7467
7468         * class.cs (ConstructorInitializer): Added `Parameters parameters'
7469         argument to the constructor.
7470         (ConstructorInitializer.Resolve): Create a temporary implicit
7471         block with the parameters.
7472
7473         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
7474         references here if we aren't doing a type-only search.
7475
7476         * statement.cs (Block): Added constructor which takes a
7477         `Parameters parameters' argument.
7478         (Block.Parameters): New public property.
7479
7480         * support.cs (InternalParameters.Parameters): Renamed `parameters'
7481         to `Parameters' and made it public readonly.
7482
7483 2002-08-06  Martin Baulig  <martin@gnome.org>
7484
7485         * ecore.cs (Expression.Warning): Made this public as well.
7486
7487         * report.cs (Report.Debug): Print the contents of collections.
7488
7489 2002-08-06  Martin Baulig  <martin@gnome.org>
7490
7491         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
7492         used to tell Resolve() which kinds of expressions it may return.
7493         (Expression.Resolve): Added overloaded version of this method which
7494         takes a `ResolveFlags flags' argument.  This can be used to tell
7495         Resolve() which kinds of expressions it may return.  Reports a
7496         CS0118 on error.
7497         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
7498         ResolveFlags.SimpleName.
7499         (Expression.Error118): Added overloaded version of this method which
7500         takes a `ResolveFlags flags' argument.  It uses the flags to determine
7501         which kinds of expressions are allowed.
7502
7503         * expression.cs (Argument.ResolveMethodGroup): New public method.
7504         Resolves an argument, but allows a MethodGroup to be returned.
7505         This is used when invoking a delegate.
7506
7507         * TODO: Updated a bit.
7508
7509 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7510
7511         Fixed compilation with csc.
7512
7513         * ecore.cs: Expression.Error made public. Is this correct? Should
7514         Warning be made public too?
7515
7516         * expression.cs: use ea.Location instead of ea.loc.
7517         [FIXME:  Filed as bug #28607: MCS must report these errors.]
7518
7519 2002-08-06  Martin Baulig  <martin@gnome.org>
7520
7521         * ecore.cs (Expression.loc): Moved the location here instead of
7522         duplicating it in all derived classes.
7523         (Expression.Location): New public property.
7524         (Expression.Error, Expression.Warning): Made them non-static and
7525         removed the location argument.
7526         (Expression.Warning): Added overloaded version which takes an
7527         `int level' argument.
7528         (Expression.Error118): Make this non-static and removed the
7529         expression and location arguments.
7530         (TypeExpr): Added location argument to the constructor.
7531
7532         * expression.cs (StaticCallExpr): Added location argument to
7533         the constructor.
7534         (Indirection, PointerArithmetic): Likewise.
7535         (CheckedExpr, UnCheckedExpr): Likewise.
7536         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
7537         (StringPtr): Likewise.
7538
7539
7540 2002-08-05  Martin Baulig  <martin@gnome.org>
7541
7542         * expression.cs (BaseAccess.DoResolve): Actually report errors.
7543
7544         * assign.cs (Assign.DoResolve): Check whether the source
7545         expression is a value or variable.
7546
7547         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
7548         while resolving the corresponding blocks.
7549
7550         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
7551         an error, don't silently return null.
7552
7553         * statement.cs (Block.AddVariable): Do the error reporting here
7554         and distinguish between CS0128 and CS0136.
7555         (Block.DoResolve): Report all unused labels (warning CS0164).
7556         (LabeledStatement): Pass the location to the constructor.
7557         (LabeledStatement.HasBeenReferenced): New property.
7558         (LabeledStatement.Resolve): Set it to true here.
7559
7560         * statement.cs (Return.Emit): Return success even after reporting
7561         a type mismatch error (CS0126 or CS0127), this is what csc does and
7562         it avoids confusing the users with any consecutive errors.
7563
7564 2002-08-05  Martin Baulig  <martin@gnome.org>
7565
7566         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
7567
7568         * const.cs (Const.LookupConstantValue): Catch circular definitions.
7569
7570         * expression.cs (MemberAccess.DoResolve): Silently return if an
7571         error has already been reported.
7572
7573         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
7574         error has already been reported.
7575
7576 2002-08-05  Martin Baulig  <martin@gnome.org>
7577
7578         * statement.cs (UsageVector): Only initialize the `parameters'
7579         vector if we actually have any "out" parameters.
7580
7581 2002-08-05  Martin Baulig  <martin@gnome.org>
7582
7583         * expression.cs (Binary.ResolveOperator): When combining delegates,
7584         they must have the same type.
7585
7586 2002-08-05  Martin Baulig  <martin@gnome.org>
7587
7588         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
7589         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
7590         work with the ms runtime and we also don't need it: if we're a
7591         PropertyBuilder and not in the `indexer_arguments' hash, then we
7592         are a property and not an indexer.
7593
7594         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
7595         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
7596         since the latter one doesn't work with the ms runtime.
7597
7598 2002-08-03  Martin Baulig  <martin@gnome.org>
7599
7600         Fixed bugs #27998 and #22735.
7601
7602         * class.cs (Method.IsOperator): New public field.
7603         (Method.CheckBase): Report CS0111 if there's already a method
7604         with the same parameters in the current class.  Report CS0508 when
7605         attempting to change the return type of an inherited method.
7606         (MethodData.Emit): Report CS0179 if a method doesn't have a body
7607         and it's not marked abstract or extern.
7608         (PropertyBase): New abstract base class for Property and Indexer.
7609         (PropertyBase.CheckBase): Moved here from Property and made it work
7610         for indexers.
7611         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
7612         the same so we can reuse it there.
7613         (Property, Indexer): Derive from PropertyBase.
7614         (MethodSignature.inheritable_property_signature_filter): New delegate
7615         to find properties and indexers.
7616
7617         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
7618         argument and improved error reporting.
7619
7620         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
7621         EmptyReadOnlyParameters and made it a property.
7622
7623         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
7624         version of this method which takes a `PropertyInfo indexer'.
7625         (TypeManager.RegisterIndexer): New method.
7626
7627         * class.cs: Added myself as author of this file :-)
7628
7629 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7630
7631         * class.cs: fixed compilation on windoze.
7632
7633 2002-08-03  Martin Baulig  <martin@gnome.org>
7634
7635         * interface.cs (Interface.GetInterfaceBases): Check whether all
7636         base interfaces are at least as accessible than the current one.
7637
7638         * class.cs (TypeContainer.GetClassBases): Check whether base types
7639         are at least as accessible than the current type.
7640         (TypeContainer.AsAccessible): Implemented and made non-static.
7641         (MemberBase.CheckParameters): Report errors if the accessibility
7642         checks fail.
7643
7644         * delegate.cs (Delegate.Delegate): The default visibility is
7645         internal for top-level types and private for nested types.
7646         (Delegate.Define): Report errors if the accessibility checks fail.
7647
7648         * enum.cs (Enum.Enum): The default visibility is internal for
7649         top-level types and private for nested types.
7650         (Enum.DefineType): Compute the correct visibility.
7651
7652         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
7653         function which takes a `bool is_toplevel' instead of a TypeContainer.
7654
7655         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
7656         builtin type.
7657
7658 2002-08-02  Martin Baulig  <martin@gnome.org>
7659
7660         * expression.cs (LocalVariableReferenc): Added constructor which
7661         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
7662         (LocalVariableReference.IsReadOnly): New property.
7663         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
7664         variable is readonly, use our own readonly flag to do this; you can
7665         use the new constructor to get a writable reference to a read-only
7666         variable.
7667
7668         * cs-parser.jay (foreach_statement, using_statement): Get a writable
7669         reference to the local variable.
7670
7671 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
7672
7673         * rootcontext.cs (ResolveCore): Also include System.Exception
7674
7675         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
7676         we reach an EmptyStatement.
7677
7678         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
7679         is also fine.
7680
7681         * expression.cs (Binary.ResolveOperator): Check error result in
7682         two places.
7683
7684         use brtrue/brfalse directly and avoid compares to null.
7685
7686 2002-08-02  Martin Baulig  <martin@gnome.org>
7687
7688         * class.cs (TypeContainer.Define): Define all nested interfaces here.
7689         Fixes bug #28407, added test-155.cs.
7690
7691 2002-08-01  Martin Baulig  <martin@gnome.org>
7692
7693         * class.cs (Event.EmitDefaultMethod): Make this work with static
7694         events.  Fixes #28311, added verify-3.cs.
7695
7696 2002-08-01  Martin Baulig  <martin@gnome.org>
7697
7698         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
7699         `is_disposable' fields.
7700         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
7701         `hm.is_disposable' if we're using the collection pattern.
7702         (Foreach.EmitCollectionForeach): Use the correct type for the
7703         enumerator's local variable, only emit the try/finally block if
7704         necessary (fixes #27713).
7705
7706 2002-08-01  Martin Baulig  <martin@gnome.org>
7707
7708         * ecore.cs (Expression.report118): Renamed to Error118 and made
7709         it public static.
7710
7711         * statement.cs (Throw.Resolve): Check whether the expression is of
7712         the correct type (CS0118) and whether the type derives from
7713         System.Exception (CS0155).
7714         (Catch.Resolve): New method.  Do the type lookup here and check
7715         whether it derives from System.Exception (CS0155).
7716         (Catch.CatchType, Catch.IsGeneral): New public properties.
7717
7718         * typemanager.cs (TypeManager.exception_type): Added.
7719
7720 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
7721
7722         * driver.cs: Updated About function.
7723
7724 2002-07-31  Martin Baulig  <martin@gnome.org>
7725
7726         Implemented Control Flow Analysis.
7727
7728         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
7729         (EmitContext.CurrentBranching): Added.
7730         (EmitContext.StartFlowBranching): Added.
7731         (EmitContext.EndFlowBranching): Added.
7732         (EmitContext.KillFlowBranching): Added.
7733         (EmitContext.IsVariableAssigned): Added.
7734         (EmitContext.SetVariableAssigned): Added.
7735         (EmitContext.IsParameterAssigned): Added.
7736         (EmitContext.SetParameterAssigned): Added.
7737         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
7738         Added control flow analysis stuff here.
7739
7740         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
7741         resolve the expression as lvalue.
7742         (LocalVariableReference.DoResolve): Check whether the variable has
7743         already been assigned.
7744         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
7745         the parameter as assigned here.
7746         (ParameterReference.DoResolve): Check whether the parameter has already
7747         been assigned.
7748         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
7749         expression as lvalue.
7750
7751         * statement.cs (FlowBranching): New class for the flow analysis code.
7752         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
7753         (LabeledStatement.IsDefined): New public property.
7754         (LabeledStatement.AddUsageVector): New public method to tell flow
7755         analyis that the label may be reached via a forward jump.
7756         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
7757         flow analysis.
7758         (VariableInfo.Number): New public field.  This is used by flow analysis
7759         to number all locals of a block.
7760         (Block.CountVariables): New public property.  This is the number of
7761         local variables in this block (including the locals from all parent
7762         blocks).
7763         (Block.EmitMeta): Number all the variables.
7764
7765         * statement.cs: Added flow analysis support to all classes.
7766
7767 2002-07-31  Martin Baulig  <martin@gnome.org>
7768
7769         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
7770         To get debugging messages, compile mcs with /define:MCS_DEBUG and
7771         then use this argument.
7772
7773         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
7774
7775         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
7776         use this to specify /define options.
7777
7778 2002-07-29  Martin Baulig  <martin@gnome.org>
7779
7780         * statement.cs (Fixed): Moved all code that does variable lookups
7781         and resolvings from Emit to Resolve.
7782
7783         * statement.cs (For): Moved all code that does variable lookups
7784         and resolvings from Emit to Resolve.
7785
7786         * statement.cs (Using): Moved all code that does variable lookups
7787         and resolvings from Emit to Resolve.
7788
7789 2002-07-29  Martin Baulig  <martin@gnome.org>
7790
7791         * attribute.cs (Attribute.Resolve): Explicitly catch a
7792         System.NullReferenceException when creating the
7793         CustromAttributeBuilder and report a different warning message.
7794
7795 2002-07-29  Martin Baulig  <martin@gnome.org>
7796
7797         * support.cs (ParameterData.ParameterName): Added method to
7798         get the name of a parameter.
7799
7800         * typemanager.cs (TypeManager.IsValueType): New public method.
7801
7802 2002-07-29  Martin Baulig  <martin@gnome.org>
7803
7804         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
7805         is a flag which specifies that it's either ref or out.
7806         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
7807         the out parameter to `out Parameter.Modifier mod', also set the
7808         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
7809
7810         * support.cs (InternalParameters.ParameterModifier): Distinguish
7811         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7812         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7813
7814         * expression.cs (Argument.GetParameterModifier): Distinguish
7815         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7816         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7817
7818 2002-07-29  Martin Baulig  <martin@gnome.org>
7819
7820         * expression.cs (ParameterReference.ParameterReference): Added
7821         `Location loc' argument to the constructor.
7822
7823         * cs-parser.jay: Pass location to ParameterReference.
7824
7825 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
7826
7827         * statement.cs (Try): Initialize the location.
7828
7829         * cs-parser.jay: pass location to Try.
7830
7831         * expression.cs (Unary.Reduce): Change the prototype to return
7832         whether a constant fold could be performed or not.  The result is
7833         returned in an out parameters.  In the case of Indirection and
7834         AddressOf, we want to perform the full tests.
7835
7836 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
7837
7838         * statement.cs (Statement.Emit): Flag dead code.
7839
7840 2002-07-27  Andrew Birkett  <andy@nobugs.org>
7841
7842         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
7843
7844 2002-07-27  Martin Baulig  <martin@gnome.org>
7845
7846         * class.cs (MethodData.Define): Put back call to
7847         TypeManager.AddMethod(), accidentally commented this out.
7848
7849         * report.cs (Debug): New public method to print debugging information,
7850         this is `[Conditional ("DEBUG")]'.
7851
7852 2002-07-26  Martin Baulig  <martin@gnome.org>
7853
7854         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
7855         (switch_statement): Push the current_block to the switch_stack and
7856         pop it again when we're done with the switch.
7857         (switch_section): The new block is a child of the current_block.
7858         Fixes bug #24007, added test-152.cs.
7859
7860 2002-07-27  Martin Baulig  <martin@gnome.org>
7861
7862         * expression.cs (Invocation.EmitArguments): When calling a varargs
7863         function with only its fixed arguments, we need to pass an empty
7864         array.
7865
7866 2002-07-27  Martin Baulig  <martin@gnome.org>
7867
7868         Mono 0.13 has been released.
7869
7870 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
7871
7872         * driver.cs: Rename --resource to --linkres, because that is what
7873         we do currently, we dont support --resource yet.
7874
7875         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
7876
7877 2002-07-25  Martin Baulig  <martin@gnome.org>
7878
7879         * class.cs (MethodData): New public class.  This is a `method builder'
7880         class for a method or one accessor of a Property/Indexer/Event.
7881         (MethodData.GetMethodFlags): Moved here from MemberBase.
7882         (MethodData.ApplyAttributes): Likewise.
7883         (MethodData.ApplyObsoleteAttribute): Likewise.
7884         (MethodData.ApplyConditionalAttribute): Likewise.
7885         (MethodData.ApplyDllImportAttribute): Likewise.
7886         (MethodData.CheckAbstractAndExternal): Likewise.
7887         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
7888         (MethodData.Emit): Formerly known as Method.Emit().
7889         (MemberBase): Moved everything which was specific to a single
7890         accessor/method to MethodData.
7891         (Method): Create a new MethodData and call Define() and Emit() on it.
7892         (Property, Indexer, Event): Create a new MethodData objects for each
7893         accessor and call Define() and Emit() on them.
7894
7895 2002-07-25  Martin Baulig  <martin@gnome.org>
7896
7897         Made MethodCore derive from MemberBase to reuse the code from there.
7898         MemberBase now also checks for attributes.
7899
7900         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
7901         (MemberBase.GetMethodFlags): Moved here from class Method and marked
7902         as virtual.
7903         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
7904         `CallingConventions cc' and `Attributes opt_attrs' arguments.
7905         (MemberBase.ApplyAttributes): New virtual method; applies the
7906         attributes to a method or accessor.
7907         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
7908         (MemberBase.ApplyConditionalAttribute): Likewise.
7909         (MemberBase.ApplyDllImportAttribute): Likewise.
7910         (MemberBase.CheckAbstractAndExternal): Likewise.
7911         (MethodCore.ParameterTypes): This is now a property instead of a
7912         method, it's initialized from DoDefineParameters().
7913         (MethodCore.ParameterInfo): Removed the set accessor.
7914         (MethodCore.DoDefineParameters): New protected virtual method to
7915         initialize ParameterTypes and ParameterInfo.
7916         (Method.GetReturnType): We can now simply return the MemberType.
7917         (Method.GetMethodFlags): Override the MemberBase version and add
7918         the conditional flags.
7919         (Method.CheckBase): Moved some code from Define() here, call
7920         DoDefineParameters() here.
7921         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
7922         here to avoid some larger code duplication.
7923         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
7924         ensure that abstract and external accessors don't declare a body.
7925
7926         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
7927         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
7928         lookup in the attribute's parent classes, so we need to abort as soon
7929         as we found the first match.
7930         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
7931         the attribute has no arguments.
7932
7933         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
7934         of a Method.
7935
7936 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7937
7938         * cs-parser.jay: reverted previous patch.
7939
7940 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7941
7942         * cs-parser.jay: fixed bug #22119.
7943
7944 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7945
7946         * attribute.cs: fixed compilation. The error was:
7947         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
7948         be assigned to before control leaves the current method."
7949         [FIXME:  Filed as bug #28186: MCS must report this error.]
7950
7951 2002-07-25  Martin Baulig  <martin@gnome.org>
7952
7953         * attribute.cs (Attribute.Conditional_GetConditionName): New static
7954         method to pull the condition name ouf of a Conditional attribute.
7955         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
7956         the obsolete message and error flag out of an Obsolete attribute.
7957
7958         * class.cs (Method.GetMethodFlags): New public method to get the
7959         TypeManager.MethodFlags for this method.
7960         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
7961         private methods.
7962         (Method.Define): Get and apply the Obsolete and Conditional attributes;
7963         if we're overriding a virtual function, set the new private variable
7964         `parent_method'; call the new TypeManager.AddMethod().
7965
7966         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
7967         the MethodBuilder and the Method in a PtrHashtable.
7968         (TypeManager.builder_to_method): Added for this purpose.
7969         (TypeManager.MethodFlags): Added IsObsoleteError.
7970         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
7971         Obsolete and Conditional arguments in MethodBuilders.  If we discover
7972         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
7973         the message from the attribute.
7974
7975 2002-07-24  Martin Baulig  <martin@gnome.org>
7976
7977         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
7978         preprocessor directives, ensure that the argument to #define/#undef is
7979         exactly one identifier and that it's actually an identifier.
7980
7981         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
7982         did not work ....
7983
7984 2002-07-24  Martin Baulig  <martin@gnome.org>
7985
7986         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
7987         initialize it to TypeManager.object_type in the constructor.
7988         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
7989         of the `hm.get_current' method if we're using the collection pattern.
7990         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
7991         for the explicit conversion to make it work when we're using the collection
7992         pattern and the `Current' property has a different return type than `object'.
7993         Fixes #27713.
7994
7995 2002-07-24  Martin Baulig  <martin@gnome.org>
7996
7997         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
7998         does not match, but don't report any errors.  This method is called in
7999         order for all methods in a MethodGroupExpr until a matching method is
8000         found, so we don't want to bail out if the first method doesn't match.
8001         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
8002         matches, report the 123.  Fixes #28070.
8003
8004 2002-07-24  Martin Baulig  <martin@gnome.org>
8005
8006         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
8007         TypeManager.TypeToCoreType() to the top of the method so the
8008         following equality checks will work.  Fixes #28107.
8009
8010 2002-07-24  Martin Baulig  <martin@gnome.org>
8011
8012         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
8013         operand is of type uint, and the other operand is of type sbyte,
8014         short or int, the operands are converted to type long." -
8015         Actually do what this comment already told us.  Fixes bug #28106,
8016         added test-150.cs.
8017
8018 2002-07-24  Martin Baulig  <martin@gnome.org>
8019
8020         * class.cs (MethodBase): New abstract class.  This is now a base
8021         class for Property, Indexer and Event to avoid some code duplication
8022         in their Define() and DefineMethods() methods.
8023         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
8024         generic methods for Define() and DefineMethods().
8025         (FieldBase): Derive from MemberBase, not MemberCore.
8026         (Property): Derive from MemberBase, not MemberCore.
8027         (Property.DefineMethod): Moved all the code from this method to the
8028         new MethodBase.DefineAccessor(), just call it with appropriate
8029         argumetnts.
8030         (Property.Define): Call the new Property.DoDefine(), this does some
8031         sanity checks and we don't need to duplicate the code everywhere.
8032         (Event): Derive from MemberBase, not MemberCore.
8033         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
8034         accessors, this will also make them work with interface events.
8035         (Indexer): Derive from MemberBase, not MemberCore.
8036         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
8037         (Indexer.Define): Use the new MethodBase functions.
8038
8039         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
8040         argument to the constructor.
8041         (Interface.FindMembers): Added support for interface events.
8042         (Interface.PopluateEvent): Implemented.
8043
8044         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
8045
8046 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
8047
8048         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
8049         but this is required to check for a method name being the same as
8050         the containing class.  
8051
8052         Handle this now.
8053
8054 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8055
8056         * interface.cs: initialize variable.
8057
8058 2002-07-23  Martin Baulig  <martin@gnome.org>
8059
8060         Implemented the IndexerName attribute in interfaces.
8061
8062         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
8063         name if this is an explicit interface implementation.
8064         (Indexer.InterfaceIndexerName): New public variable.  If we're
8065         implementing an interface indexer, this is the IndexerName in that
8066         interface.  Otherwise, it's the IndexerName.
8067         (Indexer.DefineMethod): If we're implementing interface indexer,
8068         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
8069         and Pending.ImplementIndexer methods.
8070         (Indexer.Define): Also define the PropertyBuilder if we're
8071         implementing an interface indexer and this is neither an explicit
8072         interface implementation nor do the IndexerName match the one in
8073         the interface.
8074
8075         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
8076         If a method is defined here, then we always need to create a proxy
8077         for it.  This is used when implementing interface indexers.
8078         (Pending.IsInterfaceIndexer): New public method.
8079         (Pending.ImplementIndexer): New public method.
8080         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
8081         This is used when implementing interface indexers to define a proxy
8082         if necessary.
8083         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
8084         define a proxy if necessary.
8085
8086         * interface.cs (Interface.IndexerName): New public variable.
8087         (Interface.PopulateIndexer): Set the IndexerName.
8088         (Interface.DefineIndexers): New private method.  Populate all the
8089         indexers and make sure their IndexerNames match.
8090
8091         * typemanager.cs (IndexerPropertyName): Added support for interface
8092         indexers.
8093
8094 2002-07-22  Martin Baulig  <martin@gnome.org>
8095
8096         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
8097         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
8098         ret if HasReturnLabel.
8099         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
8100         variables.
8101
8102         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
8103         and set the ec.LoopBeginTryCatchLevel.
8104         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
8105         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
8106         the current ec.TryCatchLevel, the branch goes out of an exception
8107         block.  In this case, we need to use Leave and not Br.
8108
8109 2002-07-22  Martin Baulig  <martin@gnome.org>
8110
8111         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
8112         block unless the block does not always return or it is contained in
8113         another try { ... } catch { ... } block.  Fixes bug #26506.
8114         Added verify-1.cs to the test suite.
8115
8116 2002-07-22  Martin Baulig  <martin@gnome.org>
8117
8118         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
8119         then we do not always return.  Fixes bug #24985.
8120
8121 2002-07-22  Martin Baulig  <martin@gnome.org>
8122
8123         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
8124         lookup on a per-class level; ie. walk up the class hierarchy until we
8125         found at least one applicable method, then choose the best among them.
8126         Fixes bug #24463 and test-29.cs.
8127
8128 2002-07-22  Martin Baulig  <martin@gnome.org>
8129
8130         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
8131         return types of the methods.  The return type is not part of the
8132         signature and we must not check it to make the `new' modifier work.
8133         Fixes bug #27999, also added test-147.cs.
8134         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
8135
8136         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
8137         on the method's return type.
8138
8139 2002-07-21  Martin Baulig  <martin@gnome.org>
8140
8141         * assign.cs: Make this work if the rightmost source is a constant and
8142         we need to do an implicit type conversion.  Also adding a few more tests
8143         to test-38.cs which should have caught this.
8144
8145         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
8146         target in the makefile for this.  The makefile.gnu is primarily intended
8147         for end-users who don't want to debug the compiler.
8148
8149 2002-07-21  Martin Baulig  <martin@gnome.org>
8150
8151         * assign.cs: Improved the Assign class so it can now handle embedded
8152         assignments (X = Y = Z = something).  As a side-effect this'll now also
8153         consume less local variables.  test-38.cs now passes with MCS, added
8154         a few new test cases to that test.
8155
8156 2002-07-20  Martin Baulig  <martin@gnome.org>
8157
8158         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
8159         instructions.  Fixes bug #27977, also added test-146.cs.
8160
8161 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8162
8163         * cs-tokenizer.cs: fixed getHex ().
8164
8165 2002-07-19  Martin Baulig  <martin@gnome.org>
8166
8167         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
8168         not Type.GetType() to lookup the array type.  This is needed when
8169         we're constructing an array of a user-defined type.
8170         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
8171         single-dimensional arrays, but also for single-dimensial arrays of
8172         type decimal.
8173
8174 2002-07-19  Martin Baulig  <martin@gnome.org>
8175
8176         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
8177         this function is called, it's not allowed to share LocalBuilders
8178         among ILGenerators.
8179
8180 2002-07-19  Martin Baulig  <martin@gnome.org>
8181
8182         * expression.cs (Argument.Resolve): Report an error 118 when trying
8183         to pass a type as argument.
8184
8185 2002-07-18  Martin Baulig  <martin@gnome.org>
8186
8187         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
8188         Conv_R_Un for the signed `long' type.
8189
8190 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
8191
8192         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
8193         `expr' for the temporary result, as that will fail if we do
8194         multiple resolves on the same expression.
8195
8196 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
8197
8198         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
8199         ec.TypeContainer for looking up aliases. 
8200
8201         * class.cs (TypeContainer): Remove LookupAlias from here.
8202
8203         * decl.cs (DeclSpace); Move here.
8204
8205 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
8206
8207         * class.cs (FindMembers): Only call filter if the constructor
8208         bulider is not null.
8209
8210         Also handle delegates in `NestedTypes' now.  Now we will perform
8211         type lookups using the standard resolution process.  This also
8212         fixes a bug.
8213
8214         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
8215         This uses Expressions (the limited kind that can be parsed by the
8216         tree) instead of strings.
8217
8218         * expression.cs (ComposedCast.ToString): Implement, used to flag
8219         errors since now we have to render expressions.
8220
8221         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
8222         FormArrayType. 
8223
8224         * ecore.cs (SimpleName.ToString): ditto.
8225
8226         * cs-parser.jay: Instead of using strings to assemble types, use
8227         Expressions to assemble the type (using SimpleName, ComposedCast,
8228         MemberAccess).  This should fix the type lookups in declarations,
8229         because we were using a different code path for this.
8230
8231         * statement.cs (Block.Resolve): Continue processing statements
8232         even when there is an error.
8233
8234 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
8235
8236         * class.cs (Event.Define): Also remove the `remove' method from
8237         the list of pending items.
8238
8239         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
8240         generate more compact code. 
8241
8242 2002-07-17  Martin Baulig  <martin@gnome.org>
8243
8244         * const.cs (Const.LookupConstantValue): Add support for constant
8245         `unchecked' and `checked' expressions.
8246         Also adding test case test-140.cs for this.
8247
8248 2002-07-17  Martin Baulig  <martin@gnome.org>
8249
8250         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
8251         check whether mi.ReturnType implements the IEnumerator interface; the
8252         `==' and the IsAssignableFrom() will fail in this situation.
8253
8254 2002-07-16  Ravi Pratap  <ravi@ximian.com>
8255
8256         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
8257         here too.
8258
8259 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8260
8261         * expression.cs: fixed bug #27811.
8262
8263 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
8264
8265         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
8266         Molaro: when we are a ref, the value already contains a pointer
8267         value, do not take the address of it.
8268
8269 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
8270         * removed mb-parser.jay and mb-tokenizer.cs
8271
8272 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
8273
8274         * expression.cs: check against the building corlib void type.
8275
8276 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
8277
8278         * ecore.cs: fix for valuetype static readonly fields: when 
8279         initializing them, we need their address, not the address of a copy.
8280
8281 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
8282
8283         * typemanager.cs: register also enum_type in corlib.
8284
8285 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
8286
8287         * class.cs: allow calling this (but not base) initializers in structs.
8288
8289 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
8290
8291         * ecore.cs: make sure we compare against the building base types
8292         in GetTypeSize ().
8293
8294 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
8295
8296         * typemanager.cs: fix TypeToCoreType() to handle void and object
8297         (corlib gets no more typerefs after this change).
8298
8299 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
8300
8301         * expression.cs (ArrayCreation.EmitArrayArguments): use
8302         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
8303
8304         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
8305         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
8306         array indexes, the runtime actually forbids them.
8307
8308         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
8309         for array arguments here.
8310
8311         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
8312         instead of the default for ValueTypes.
8313
8314         (New.DoEmit): Use IsValueType instead of
8315         IsSubclassOf (value_type)
8316         (New.DoResolve): ditto.
8317         (Invocation.EmitCall): ditto.
8318
8319         * assign.cs (Assign): ditto.
8320
8321         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
8322         Statements *are* currently doing part of their resolution during
8323         Emit.  
8324
8325         Expressions do always resolve during resolve, but statements are
8326         only required to propagate resolution to their children.
8327
8328 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
8329
8330         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
8331
8332         (LoadAssembly): Do not add the dll if it is already specified
8333
8334         (MainDriver): Add the System directory to the link path at the end,
8335         after all the other -L arguments. 
8336
8337         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
8338         wrong opcode for loading bytes and bools (ldelem.i1 instead of
8339         ldelem.u1) and using the opposite for sbytes.
8340
8341         This fixes Digger, and we can finally run it.
8342
8343         * driver.cs (UnixParseOption): Move the option parsing here.  
8344         (CSCParseOption): Implement CSC-like parsing of options.
8345
8346         We now support both modes of operation, the old Unix way, and the
8347         new CSC-like way.  This should help those who wanted to make cross
8348         platform makefiles.
8349
8350         The only thing broken is that /r:, /reference: and /lib: are not
8351         implemented, because I want to make those have the same semantics
8352         as the CSC compiler has, and kill once and for all the confussion
8353         around this.   Will be doing this tomorrow.
8354
8355         * statement.cs (Unsafe.Resolve): The state is checked during
8356         resolve, not emit, so we have to set the flags for IsUnsfe here.
8357
8358 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
8359
8360         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
8361         not catch the Error_ObjectRefRequired in SimpleName (as it is
8362         possible to have a class/instance variable name that later gets
8363         deambiguated), we have to check this here.      
8364
8365 2002-07-10  Ravi Pratap  <ravi@ximian.com>
8366
8367         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
8368         make static and put into Expression.
8369
8370         (Event.Define): Register the private field of the event with the 
8371         TypeManager so that GetFieldFromEvent can get at it.
8372
8373         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
8374         keep track of the private field associated with an event which
8375         has no accessors.
8376
8377         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
8378         private field.
8379
8380         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
8381
8382 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
8383
8384         * expression.cs (Binary.EmitBranchable): this routine emits the
8385         Binary expression in a branchable context.  This basically means:
8386         we need to branch somewhere, not just get the value on the stack.
8387
8388         This works together with Statement.EmitBoolExpression.
8389
8390         * statement.cs (Statement.EmitBoolExpression): Use
8391         EmitBranchable. 
8392
8393 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
8394
8395         * statement.cs (For): Reduce the number of jumps in loops.
8396
8397         (For): Implement loop inversion for the For statement.
8398
8399         (Break): We can be breaking out of a Try/Catch controlled section
8400         (foreach might have an implicit try/catch clause), so we need to
8401         use Leave instead of Br.
8402
8403         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
8404         now).  If the instace expression supports IMemoryLocation, we use
8405         the AddressOf method from the IMemoryLocation to extract the
8406         address instead of emitting the instance.
8407
8408         This showed up with `This', as we were emitting the instance
8409         always (Emit) instead of the Address of This.  Particularly
8410         interesting when This is a value type, as we dont want the Emit
8411         effect (which was to load the object).
8412
8413 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
8414
8415         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
8416
8417         * statement.cs (Checked): Set the CheckedState during the resolve
8418         process too, as the ConvCast operations track the checked state on
8419         the resolve process, and not emit.
8420
8421         * cs-parser.jay (namespace_member_declaration): Flag that we have
8422         found a declaration when we do.  This is used to flag error 1529
8423
8424         * driver.cs: Report ok when we display the help only.
8425
8426 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
8427
8428         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
8429
8430 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
8431
8432         * cs-tokenizer.cs (define): We also have to track locally the
8433         defines.  AllDefines is just used for the Conditional Attribute,
8434         but we also need the local defines for the current source code. 
8435
8436 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
8437
8438         * statement.cs (While, For, Do): These loops can exit through a
8439         Break statement, use this information to tell whether the
8440         statement is the last piece of code.
8441
8442         (Break): Flag that we break.
8443
8444         * codegen.cs (EmitContexts): New `Breaks' state variable.
8445
8446 2002-07-03  Martin Baulig  <martin@gnome.org>
8447
8448         * class.cs (TypeContainer.MethodModifiersValid): Allow override
8449         modifiers in method declarations in structs.  Otherwise, you won't
8450         be able to override things like Object.Equals().
8451
8452 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
8453
8454         * class.cs (Method, Property, Indexer): Do not allow the public
8455         modifier to be used in explicit interface implementations.
8456
8457         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
8458         override modifiers in method declarations in structs
8459
8460 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
8461
8462         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
8463         integer or real overflow, report an error
8464
8465 2002-07-02  Martin Baulig  <martin@gnome.org>
8466
8467         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
8468         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
8469         to tell the runtime about our newly created System.Object and
8470         System.ValueType types.
8471
8472 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
8473
8474         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
8475         struct instead of Ldarg/Starg.
8476
8477 2002-07-02  Martin Baulig  <martin@gnome.org>
8478
8479         * expression.cs (Indirection.Indirection): Call
8480         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
8481
8482 2002-07-02  Martin Baulig  <martin@gnome.org>
8483
8484         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
8485         ValueType, call TypeManager.TypeToCoreType() on it.
8486         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
8487         the OpCodes.Newarr argument.
8488
8489 2002-07-02  Martin Baulig  <martin@gnome.org>
8490
8491         * expression.cs (Invocation.EmitCall): When compiling corlib,
8492         replace all calls to the system's System.Array type to calls to
8493         the newly created one.
8494
8495         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
8496         System.Array methods.
8497         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
8498         from the system's System.Array type which must be replaced.
8499
8500 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
8501
8502         * typemanager.cs: load unverifiable_code_ctor so we can build
8503         corlib using the correct type. Avoid using GetTypeCode() with
8504         TypeBuilders.
8505         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
8506         TypeManager.object_type to allow building corlib.
8507
8508 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
8509
8510         * ecore.cs: handle System.Enum separately in LoadFromPtr().
8511
8512 2002-07-01  Martin Baulig  <martin@gnome.org>
8513
8514         * class.cs: Make the last change actually work, we need to check
8515         whether `ifaces != null' to avoid a crash.
8516
8517 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
8518
8519         * class.cs: when we build structs without fields that implement
8520         interfaces, we need to add the interfaces separately, since there is
8521         no API to both set the size and add the interfaces at type creation
8522         time.
8523
8524 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
8525
8526         * expression.cs: the dimension arguments to the array constructors
8527         need to be converted if they are a long.
8528
8529 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
8530
8531         * class.cs: don't emit ldarg.0 if there is no parent constructor
8532         (fixes showstopper for corlib).
8533
8534 2002-06-29  Martin Baulig  <martin@gnome.org>
8535
8536         MCS now compiles corlib on GNU/Linux :-)
8537
8538         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
8539         ie. check for MethodImplOptions.InternalCall.
8540
8541         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
8542         and TypeManager.attribute_type are null, so we must explicitly check
8543         whether parent is not null to find out whether it's an attribute type.
8544         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
8545         and SetBuilder, not only if the property is neither abstract nor external.
8546         This is necessary to set the MethodImplOptions on the accessor methods.
8547         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
8548         SetBuilder, see Property.Emit().
8549
8550         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
8551         populate "System.Object", "System.ValueType" and "System.Attribute" since
8552         they've already been populated from BootCorlib_PopulateCoreTypes().
8553
8554 2002-06-29  Martin Baulig  <martin@gnome.org>
8555
8556         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
8557         is the NullLiteral, we also need to make sure that target_type is not
8558         an enum type.   
8559
8560 2002-06-29  Martin Baulig  <martin@gnome.org>
8561
8562         * rootcontext.cs (RootContext.ResolveCore): We must initialize
8563         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
8564         before calling BootstrapCorlib_ResolveDelegate ().
8565
8566 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8567
8568         * statement.cs: fixed build-breaker. All tests passed ok.
8569
8570 2002-06-27  Martin Baulig  <martin@gnome.org>
8571
8572         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
8573         for System.Decimal when compiling corlib.
8574
8575 2002-06-27  Martin Baulig  <martin@gnome.org>
8576
8577         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
8578         switch blocks which contain nothing but a default clause.
8579
8580 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
8581
8582        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
8583
8584 2002-06-27  Martin Baulig  <martin@gnome.org>
8585
8586         * ecore.cs (PropertyExpr.PropertyExpr): Call
8587         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
8588
8589         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
8590         is already a TypeBuilder.
8591
8592 2002-06-27  Martin Baulig  <martin@gnome.org>
8593
8594         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
8595         `target_type == TypeManager.array_type', not IsAssignableFrom() in
8596         the "from an array-type to System.Array" case.  This makes it work
8597         when compiling corlib.
8598
8599 2002-06-27  Martin Baulig  <martin@gnome.org>
8600
8601         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
8602         non-static PropertyExpr, set its InstanceExpression.  This makes
8603         the `ICollection.Count' property work in System/Array.cs.
8604
8605 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
8606
8607         * driver.cs: Made error handling more consistent.  Errors now
8608         tracked by Report class, so many methods which used to return int
8609         now return void.  Main() now prints success/failure and 
8610         errors/warnings message.
8611
8612         Renamed '--probe' compiler argument to '--expect-error'.  Removed
8613         the magic number return values (123 and 124).  Now, if the
8614         expected error occurs, the compiler exits with success (exit value
8615         0).  If the compilation completes without seeing that particular
8616         error, the compiler exits with failure (exit value 1).  The
8617         makefile in mcs/errors has been changed to handle the new behaviour.
8618
8619         * report.cs: Made 'expected error' number a property and renamed
8620         it from 'Probe' to 'ExpectedError'.
8621
8622         * genericparser.cs: Removed error handling support, since it is
8623         now all done by Report class.
8624
8625         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
8626         class, so parse() no longer returns an int.
8627
8628         * namespace.cs: Use Report.Error instead of GenericParser.error
8629
8630 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
8631
8632         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
8633         TypeContainer.AddOperator): At the front of the list put the
8634         explicit implementations, so they get resolved/defined first. 
8635
8636 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
8637
8638         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
8639         interface type is implemented by this TypeContainer.  Used during
8640         explicit interface implementation.
8641
8642         (Property.Define, Indexer.Define, Method.Define): Validate that
8643         the given interface in the explicit implementation is one of the
8644         base classes for the containing type.
8645
8646         Also if we are explicitly implementing an interface, but there is
8647         no match in the pending implementation table, report an error.
8648
8649         (Property.Define): Only define the property if we are
8650         not explicitly implementing a property from an interface.  Use the
8651         correct name also for those properties (the same CSC uses,
8652         although that is really not needed).
8653
8654         (Property.Emit): Do not emit attributes for explicitly implemented
8655         properties, as there is no TypeBuilder.
8656
8657         (Indexer.Emit): ditto.
8658
8659         Hiding then means that we do not really *implement* a pending
8660         implementation, which makes code fail.
8661
8662 2002-06-22  Martin Baulig  <martin@gnome.org>
8663
8664         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
8665         the return value of Object.GetType().  [FIXME: we need to do this whenever
8666         we get a type back from the reflection library].
8667
8668 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
8669
8670         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
8671
8672 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
8673
8674         * attribute.cs: Return null if we can not look up the type.
8675
8676         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
8677         the interface types found.
8678
8679         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
8680         interface types found.
8681
8682         * typemanager.cs (GetInterfaces): Make this routine returns alll
8683         the interfaces and work around the lame differences between
8684         System.Type and System.Reflection.Emit.TypeBuilder in the results
8685         result for GetInterfaces.
8686
8687         (ExpandInterfaces): Given an array of interface types, expand and
8688         eliminate repeated ocurrences of an interface.  This expands in
8689         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
8690         be IA, IB, IC.
8691
8692 2002-06-21  Martin Baulig  <martin@gnome.org>
8693
8694         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
8695         on System.Enum.
8696
8697 2002-06-21  Martin Baulig  <martin@gnome.org>
8698
8699         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
8700         and called with one of the core types, return the corresponding typebuilder for
8701         that type.
8702
8703         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
8704         element type.
8705
8706 2002-06-21  Martin Baulig  <martin@gnome.org>
8707
8708         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
8709         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
8710         (Expression.ConvertReferenceExplicit): Likewise.
8711
8712         * expression.cs (ElementAccess.DoResolve): Likewise.
8713         (ElementAccess.DoResolveLValue): Likewise.
8714
8715 2002-06-10  Martin Baulig  <martin@gnome.org>
8716
8717         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
8718         add the "value" parameter to the parameter list.
8719
8720         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
8721         to our caller.
8722
8723 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
8724
8725         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
8726         the argument to an int, uint, long or ulong, per the spec.  Also
8727         catch negative constants in array creation.
8728
8729 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
8730
8731         * class.cs: do not allow the same interface to appear twice in
8732         the definition list.
8733
8734 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
8735
8736         * ecore.cs: don't use ldlen with System.Array.
8737
8738 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
8739
8740         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
8741
8742 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
8743
8744         * modifiers.cs: produce correct field attributes for protected
8745         internal. Easy fix so miguel can work on ther harder stuff:-)
8746
8747 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
8748
8749         * pending.cs: New file.  Move the code from class.cs here.
8750         Support clearning the pending flag for all methods (when not doing
8751         explicit interface implementation).
8752
8753 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
8754
8755         * rootcontext.cs: added a couple more types needed to bootstrap.
8756
8757 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
8758
8759         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
8760         constructor in the type, instead of any constructor in the type
8761         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
8762         a bug in the Mono runtime when applying the params attribute). 
8763
8764 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
8765         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
8766
8767 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
8768
8769         * expression.cs (Unary.ResolveOperator): Use TypeManager
8770         to resolve the type.
8771
8772 2002-06-13  Ravi Pratap  <ravi@ximian.com>
8773
8774         * cs-parser.jay (enum_member_declaration): Pass in the attributes
8775         attached.
8776
8777         * enum.cs (AddEnumMember): Add support to store the attributes associated 
8778         with each member too.
8779
8780         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
8781         field builders too - this takes care of the enum member case.
8782
8783 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
8784
8785         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
8786         address-of operator on both value types and pointers.
8787
8788 2002-06-10  Martin Baulig  <martin@gnome.org>
8789
8790         * interface.cs (Interface.PopulateIndexer): Add the indexer's
8791         PropertyBuilder to the `property_builders' list.
8792
8793         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
8794         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
8795         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
8796         find any indexers which are inherited from an interface.
8797
8798 2002-06-09  Martin Baulig  <martin@gnome.org>
8799
8800         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
8801         the same type as the constant if necessary.  There's also a test-130.cs
8802         for this.
8803
8804         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
8805
8806         * typemanager.cs (TypeManager.ChangeType): Previously known as
8807         Enum.ChangeEnumType().
8808
8809 2002-06-09  Martin Baulig  <martin@gnome.org>
8810
8811         * expression.cs (Cast.TryReduce): Added support for consts.
8812
8813 2002-06-08  Ravi Pratap  <ravi@ximian.com>
8814
8815         * class.cs (Accessor): Hold attributes information so we can pass
8816         it along.
8817
8818         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
8819         Modify to pass in attributes attached to the methods.
8820
8821         (add_accessor_declaration, remove_accessor_declaration): Ditto.
8822
8823         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
8824         to handle the Accessor kind :-)
8825
8826         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
8827
8828 2002-06-08  Martin Baulig  <martin@gnome.org>
8829
8830         * expression.cs (Unary.TryReduceNegative): Added support for
8831         ULongConstants.
8832
8833 2002-06-08  Martin Baulig  <martin@gnome.org>
8834
8835         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
8836         name can't be found in the `defined_names' - the caller will do a
8837         MemberLookup in this case and thus find methods in System.Enum
8838         such as Enum.IsDefined().
8839
8840 2002-06-08  Martin Baulig  <martin@gnome.org>
8841
8842         * enum.cs (Enum.ChangeEnumType): This is a custom version of
8843         Convert.ChangeType() which works with TypeBuilder created types.
8844         (Enum.LookupEnumValue, Enum.Define): Use it here.
8845
8846         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
8847         `TypeBuilder.BaseType != null' check.
8848         (TypeContainer.FindMembers): Only lookup parent members if we
8849         actually have a parent.
8850         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
8851         (ConstructorInitializer.Resolve): Likewise.
8852
8853         * interface.cs (Interface.FindMembers): Added
8854         `TypeBuilder.BaseType != null' check.
8855
8856         * rootcontext.cs (RootContext.ResolveCore): Added
8857         "System.Runtime.CompilerServices.IndexerNameAttribute" to
8858         classes_second_stage.
8859
8860         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
8861         debug_type and trace_type when compiling with --nostdlib.       
8862
8863 2002-06-07  Martin Baulig  <martin@gnome.org>
8864
8865         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
8866         (AddField): Set it to true when adding a non-static field.
8867         (DefineType): Use `have_nonstatic_fields' to find out whether we
8868         have non-static fields, not `Fields != null'.
8869
8870 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
8871
8872         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
8873         dereferencing a null on the static-field code path)
8874
8875 2002-05-30  Martin Baulig  <martin@gnome.org>
8876
8877         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
8878         to take command line arguments.  Use reflection to call the new
8879         custom `Initialize' function on the symbol writer and pass it the
8880         command line arguments.
8881
8882         * driver.cs (--debug-args): New command line argument to pass command
8883         line arguments to the symbol writer.
8884
8885 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
8886
8887         * assign.cs (DoResolve): Forgot to do the implicit conversion to
8888         the target type for indexers and properties.  Thanks to Joe for
8889         catching this.
8890
8891 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
8892
8893         * typemanager.cs (MethodFlags): returns the method flags
8894         (Obsolete/ShouldIgnore) that control warning emission and whether
8895         the invocation should be made, or ignored. 
8896
8897         * expression.cs (Invocation.Emit): Remove previous hack, we should
8898         not do this on matching a base type, we should do this based on an attribute
8899
8900         Only emit calls to System.Diagnostics.Debug and
8901         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
8902         on the command line.
8903
8904         * rootcontext.cs: Global settings for tracing and debugging.
8905
8906         * cs-tokenizer.cs (define): New utility function to track
8907         defines.   Set the global settings for TRACE and DEBUG if found.
8908
8909 2002-05-25  Ravi Pratap  <ravi@ximian.com>
8910
8911         * interface.cs (Populate*): Pass in the TypeContainer as well as
8912         the DeclSpace as parameters so that we can create EmitContexts and
8913         then use that to apply attributes etc.
8914
8915         (PopulateMethod, PopulateEvent, PopulateProperty)
8916         (PopulateIndexer): Apply attributes everywhere.
8917
8918         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
8919         etc.
8920
8921         (ApplyAttributes): Update accordingly.
8922
8923         We now apply interface attributes for all members too.
8924
8925 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
8926
8927         * class.cs (Indexer.Define); Correctly check if we are explicit
8928         implementation (instead of checking the Name for a ".", we
8929         directly look up if the InterfaceType was specified).
8930
8931         Delay the creation of the PropertyBuilder.
8932
8933         Only create the PropertyBuilder if we are not an explicit
8934         interface implementation.   This means that explicit interface
8935         implementation members do not participate in regular function
8936         lookups, and hence fixes another major ambiguity problem in
8937         overload resolution (that was the visible effect).
8938
8939         (DefineMethod): Return whether we are doing an interface
8940         implementation. 
8941
8942         * typemanager.cs: Temporary hack until we get attributes in
8943         interfaces (Ravi is working on that) and we get IndexerName
8944         support in interfaces.
8945
8946         * interface.cs: Register the indexers as properties.
8947
8948         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
8949         warning, I have verified that this is a bug in the .NET runtime
8950         (JavaScript suffers of the same problem).
8951
8952         * typemanager.cs (MemberLookup): When looking up members for
8953         interfaces, the parent of an interface is the implicit
8954         System.Object (so we succeed in searches of Object methods in an
8955         interface method invocation.  Example:  IEnumerable x;  x.ToString
8956         ()) 
8957
8958 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
8959
8960         * class.cs (Event): Events should also register if they do
8961         implement the methods that an interface requires.
8962
8963         * typemanager.cs (MemberLookup); use the new GetInterfaces
8964         method. 
8965
8966         (GetInterfaces): The code used to lookup interfaces for a type is
8967         used in more than one place, factor it here. 
8968
8969         * driver.cs: Track the errors at the bottom of the file, we kept
8970         on going.
8971
8972         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
8973         instance if the method we are calling is static!
8974
8975 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
8976
8977         * attribute.cs (ApplyAttributes): Make this function filter out
8978         the IndexerName attribute (as that attribute in reality is never
8979         applied) and return the string constant for the IndexerName
8980         attribute. 
8981
8982         * class.cs (TypeContainer.Emit): Validate that all the indexers
8983         have the same IndexerName attribute, and if so, set the
8984         DefaultName attribute on the class. 
8985
8986         * typemanager.cs: The return value might contain other stuff (not
8987         only methods).  For instance, consider a method with an "Item"
8988         property and an Item method.
8989
8990         * class.cs: If there is a problem with the parameter types,
8991         return. 
8992
8993 2002-05-24  Ravi Pratap  <ravi@ximian.com>
8994
8995         * ecore.cs (ImplicitConversionExists): Wrapper function which also
8996         looks at user defined conversion after making a call to 
8997         StandardConversionExists - we need this for overload resolution.
8998
8999         * expression.cs : Update accordingly the various method calls.
9000
9001         This fixes 2 bugs filed against implicit user defined conversions 
9002
9003 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
9004
9005         * statement.cs: Track the result of the assignment.
9006
9007 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
9008
9009         * expression.cs (MemberAccess): Improved error reporting for
9010         inaccessible members.
9011
9012 2002-05-22  Martin Baulig  <martin@gnome.org>
9013
9014         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
9015         itself with debugging support.
9016
9017 2002-05-22  Martin Baulig  <martin@gnome.org>
9018
9019         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
9020         Removed, this isn't needed anymore.
9021
9022 2002-05-20  Martin Baulig  <martin@gnome.org>
9023
9024         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
9025         be underlying type for an enum.
9026
9027 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
9028
9029         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
9030         that splits out the loading of just the core types.
9031
9032         * rootcontext.cs (ResolveCore): Split the struct resolution in
9033         two, so we can load the enumeration underlying types before any
9034         enums are used.
9035
9036         * expression.cs (Is): Bandaid until we fix properly Switch (see
9037         bug #24985 for details).
9038
9039         * typemanager.cs (ImplementsInterface): The hashtable will contain
9040         a null if there are no interfaces implemented.
9041
9042 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
9043
9044         * cs-parser.jay (indexer_declarator): It is fine to have array
9045         parameters
9046
9047 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9048
9049         * typemanager.cs: (RegisterBuilder): New function used to register
9050         TypeBuilders that implement interfaces.  Since
9051         TypeBuilder.GetInterfaces (as usual) does not work with lame
9052         Reflection.Emit. 
9053         (AddUserType): register interfaces.
9054
9055         (ImplementsInterface): Use the builder_to_ifaces hash if we are
9056         dealing with TypeBuilder.  Also, arrays are showing up as
9057         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
9058         methods can not be invoked on them!
9059
9060         * ecore.cs (ExplicitReferenceConversionExists): Made public.
9061         (ImplicitReferenceConversionExists): Split out from
9062         StandardConversionExists. 
9063
9064         * expression.cs (As): We were only implementing one of the three
9065         cases for the as operator.  We now implement them all.
9066         (Is): Implement the various other cases for Is as well.
9067
9068         * typemanager.cs (CACHE): New define used to control if we want or
9069         not the FindMembers cache.  Seems to have a negative impact on
9070         performance currently
9071
9072         (MemberLookup): Nested types have full acess to
9073         enclosing type members
9074
9075         Remove code that coped with instance/static returns for events, we
9076         now catch this in RealFindMembers.
9077
9078         (RealFindMembers): only perform static lookup if the instance
9079         lookup did not return a type or an event.  
9080
9081 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9082
9083         * assign.cs (CompoundAssign): We pass more semantic information
9084         now to Compound Assignments than we did before: now we have all
9085         the information at hand, and now we resolve the target *before* we
9086         do the expression expansion, which allows the "CacheValue" method
9087         to have the effect we intended (before, a [x] += 1 would generate
9088         two differen ArrayAccess expressions from the ElementAccess,
9089         during the resolution process).
9090
9091         (CompoundAssign.DoResolve): Resolve target and original_source here.
9092
9093 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
9094
9095         * expression.cs (ArrayAccess): dropped debugging information. 
9096
9097         * typemanager.cs: Small bug fix: I was always returning i_members,
9098         instead of one of i_members or s_members (depending on which had
9099         the content).
9100
9101         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
9102         method is invoked before any code generation takes place, and it
9103         is a mechanism to inform that the expression will be invoked more
9104         than once, and that the method should use temporary values to
9105         avoid having side effects
9106
9107         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
9108
9109         * ecore.cs (Expression.CacheTemporaries): Provide empty default
9110         implementation.
9111
9112         * expression.cs (Indirection, ArrayAccess): Add support for
9113         CacheTemporaries in these two bad boys. 
9114
9115         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
9116         ldobj or ldind_ref.  
9117         (StoreFromPtr): Handle stobj as well.
9118
9119         * expression.cs (UnaryMutator): Share more code.
9120
9121         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
9122         down: I was not tracking the Filter function as well, which
9123         was affecting the results of the cache.
9124
9125 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
9126
9127         * attribute.cs: Remove the hack to handle the CharSet property on
9128         StructLayouts. 
9129
9130 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
9131
9132         * attribute.cs (DoResolve): More uglyness, we now only try to
9133         resolve the attribute partially, to extract the CharSet
9134         information (only if we are a StructLayout attribute).  Otherwise 
9135
9136         (GetExtraTypeInfo): Add some code to conditionally kill in the
9137         future this.   I am more and more convinced that the .NET
9138         framework has special code to handle the attribute setting on
9139         certain elements.
9140
9141         * expression.cs (IsParamsMethodApplicable): Revert my previous
9142         foreach change here, it was wrong.
9143
9144 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
9145
9146         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
9147         (pp_expr): do not abort on unknown input, just return.
9148         (eval): abort if there are pending chars.
9149
9150         * attribute.cs (Attribute.Resolve): Positional parameters are
9151         optional.  Deal with that case.
9152
9153         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
9154         the Ansi/Unicode/Auto information for the type.
9155
9156         (TypeContainer.DefineType): instantiate the EmitContext here, as
9157         we will be using it during the type definition (to resolve
9158         attributes) and during the emit phase.
9159
9160         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
9161         to pull type information out of the attributes
9162
9163         (Attribute.Resolve): track the constructor builder, and allow for
9164         multiple invocations (structs and classes will use this).
9165
9166         * ecore.cs (MemberLookupFinal): new version with all the
9167         parameters customizable.
9168
9169         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
9170         constructors.  Return if the result value is null (as the error
9171         would have been flagged already by MemberLookupFinal)
9172
9173         Do not allow instances of abstract classes or interfaces to be
9174         created.
9175
9176         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
9177         We have to compare the assembly property here when dealing with
9178         FamANDAssem and Assembly access modifiers, because we might be
9179         creating an assembly from *modules* (that means that we are not
9180         getting TypeBuilders for types defined in other modules that are
9181         part of this assembly).
9182
9183         (Method.Emit): If the method is marked abstract and has a body,
9184         emit an error. 
9185
9186         (TypeContainer.DefineMembers): If both the defined member and the
9187         parent name match are methods, then do not emit any warnings: let
9188         the Method.Define routine take care of flagging warnings.  But if
9189         there is a mismatch (method overrides something else, or method is
9190         overriwritten by something, then emit warning).
9191
9192         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
9193         set to null, this means `do not check for the return type on the
9194         signature'. 
9195
9196         (Method.Define): set the return type for the method signature to
9197         null, so that we get methods with the same name and parameters and
9198         different return types.  This is used to flag warning 114 (you are
9199         hiding a method, and you probably want to use the new/override
9200         keywords instead).
9201
9202         * typemanager.cs (MemberLookup): Implemented proper access
9203         control, closing a long standing set of bug reports.  The problem
9204         was that the Framework only has two bits: Public and NonPublic,
9205         and NonPublic includes private and protected methods, but we need
9206         to enforce the FamANDAssem, FamOrAssem and Family. 
9207
9208 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
9209
9210         * statement.cs (GotoCase): Return true: Ammounts to giving up
9211         knowledge on whether we return or not, and letting the other case
9212         be responsible for it.
9213
9214 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
9215
9216         * driver.cs: Do not load directories for each file processed, only
9217         do it if there is a pattern.
9218
9219         * ecore.cs: Report readonly assigns here as well, as we might have
9220         been resolved only by MemberAccess.
9221
9222         (SimpleName.SimpleNameResolve): Also be useful for LValue
9223         resolution.   We need this to propagate assign to local readonly variables
9224
9225         * typemanager.cs: Use a ptrhashtable for the criteria, because we
9226         do not want to reuse potential criteria memory.
9227
9228         * class.cs (MyEventBuilder): Set reflected_type;
9229
9230         * ecore.cs (Constantify): Added support for constifying bools.
9231
9232         (RootContext.LookupType): Added a cache for values looked up in
9233         the declaration space.
9234
9235         * typemanager.cs (FindMembers): Now is a front-end to
9236         RealFindMembers, and provides a two-level hashtable-based cache to
9237         the request.  
9238
9239         15% performance improvement: from 22.5 to 19.2 seconds.
9240
9241         * expression.cs (IsParamsMethodApplicable): use foreach.
9242         (Invocation.DoResolve): ditto.
9243         (New.DoResolve): ditto.
9244         (ArrayCreation.DoResolve): ditto.
9245
9246         * ecore.cs (FindMostEncompassingType): use foreach.
9247
9248         * delegate.cs (NewDelegate.DoResolve): Use foreach
9249
9250         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
9251         (RemoveMethods): use foreach.
9252
9253         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
9254         nested foreach statements instead of for, and also break out of
9255         the inner loop once a match is found.
9256
9257         (Invocation.OverloadResolve): Use foreach, simplify the code. 
9258
9259 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
9260
9261         * cfold.cs (BinaryFold): During an enumeration evaluation context,
9262         we actually unwrap the expression to allow for extra information
9263         to be extracted. 
9264
9265         * expression.cs: Use Shr_Un on unsigned operations. 
9266
9267 2002-05-08  Ravi Pratap  <ravi@ximian.com>
9268
9269         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
9270         applicable operators was not being considered correctly. This closes
9271         the bug Miguel reported.
9272
9273 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
9274
9275         * attribute.cs: check that the type derives from System.Attribute
9276         and report the correct error in that case (moved the duplicate code to
9277         its own method, too).
9278
9279 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
9280
9281         * attribute.cs: lookup attribute type name as the spec says: first the
9282         bare attribute name and then name + "Attribute" (nant compiles with
9283         mcs after this fix).
9284
9285 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
9286
9287         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
9288         Because of the way we parse things, we should try to see if a
9289         UIntConstant can fit in an integer.
9290
9291 2002-05-07  Ravi Pratap  <ravi@ximian.com>
9292
9293         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
9294         when we are in an explicit context.
9295
9296         (ConvertReferenceExplicit): When converting from Iface type S to Class
9297         T make sure the rules are implemented as an OR.
9298
9299         * parameter.cs (ParameterType): Make it a property for now although the
9300         purpose really isn't anything immediate.
9301
9302         * expression.cs (Is*Applicable): Do better checking on the parameter type
9303         of a ref/out parameter. The ones from the system assemblies are already 
9304         marked with the correct type so we don't need to do any correction.
9305
9306         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
9307         the object type is standard too so include that.
9308
9309 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9310
9311         * ecore.cs (StandardConversionExists): Augment with missing code:
9312         deal with IntConstant, LongConstants and Enumerations.
9313
9314         * assign.cs: Report the error, instead of failing silently
9315
9316         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
9317         typecontainer that they are declared, because the
9318         typecontainer/namespace will have the list of using clauses that
9319         need to be applied.
9320
9321         Assembly Attributes were escaping the normal registration
9322         mechanism. 
9323
9324         (EmitCode): Apply attributes within an EmitContext that represents
9325         the container they were declared on.
9326
9327         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
9328
9329 2002-05-06  Ravi Pratap  <ravi@ximian.com>
9330
9331         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
9332         Revamp completely - make much cleaner as we now operate only
9333         on a set of Types.
9334
9335         (FindMostSpecificSource, FindMostSpecificTarget): New methods
9336         to implement the logic detailed in the spec more correctly.
9337
9338         (UserDefinedConversion): Update accordingly.
9339
9340 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9341
9342         * statement.cs: Return flow analysis information up.
9343
9344         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
9345         and the default.
9346
9347         (token): Do not consume an extra character before calling
9348         decimal_digits.
9349
9350 2002-05-06  Piers Haken <piersh@friskit.com>
9351
9352         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
9353
9354 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9355
9356         * class.cs (Constructor.Emit): Set the IsStatic flag in the
9357         EmitContext during the instance constructor initializer
9358         resolution, to stop access to instance variables.
9359
9360         This is mandated by the spec, last paragraph of the `constructor
9361         initializers' section. 
9362
9363 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
9364
9365         * cs-parser.jay, class.cs (Accessor): new class used to represent
9366         an accessor (get or set).  In the past we used `null' to represent
9367         a missing accessor.  But this is ambiguous because there was no
9368         way to tell in abstract indexers/properties if one of them was
9369         specified.
9370
9371         Now there is a way of addressing that.
9372
9373         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
9374         instead of FindMembers.
9375
9376         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
9377         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
9378
9379         * attribute.cs: Treat indexers and properties as the same in terms
9380         of applying attributes
9381
9382         * ecore.cs (FindMostEncompassedType): Use statically initialized
9383         EmptyExpressions()s like we do elsewhere to avoid creating useless
9384         objects (and we take this out of the tight loop).
9385
9386         (GetConversionOperators): Move the code to extract the actual
9387         operators to a separate routine to clean things up.
9388
9389 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
9390
9391         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
9392         events are always registered FieldBuilders.
9393
9394         * class.cs (FieldBase): New class shared by Fields 
9395
9396         * delegate.cs: If we are a toplevel delegate, use our full name.
9397         If we are a nested delegate, then only use our tail name.
9398
9399 2002-05-02  Ravi Pratap  <ravi@ximian.com>
9400
9401         * expression.cs (IsApplicable): Ensure that we add the "&" to
9402         ref/out types before comparing it with the type of the argument.
9403
9404         (IsParamsMethodApplicable): Ditto.
9405
9406         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
9407         silly me ;-)
9408
9409         * delegate.cs : Handle the case when we have more than one applicable
9410         method. Flag an error only when we finish checking all.
9411
9412 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
9413
9414         * expression.cs: Add support for boolean static initializers.
9415
9416 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
9417
9418         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
9419
9420         * parameter.cs (ComputeParameterTypes,
9421         ComputeAndDefineParameterTypes): Better error handling: now we
9422         clear the `types' cache if we fail during any of the type lookups.
9423         We also return the status code correctly to our caller
9424
9425         * delegate.cs: If we fail to define a delegate, abort the extra
9426         steps. 
9427
9428         * expression.cs (Binary.ResolveOperator): for
9429         operator==(object,object) and operator !=(object, object) we also
9430         have to verify that there is an implicit conversion from one to
9431         the other.
9432
9433         (ArrayAccess.DoResolve): Array Access can operate on
9434         non-variables. 
9435
9436 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
9437
9438         * assign.cs (CompoundAssign): A new class used as a "flag" that
9439         the assignment actually is happening as part of a compound
9440         assignment operator.
9441
9442         During compound assignment, a few new rules exist to enable things
9443         like:
9444
9445         byte b |= 1 + 2
9446
9447         From the spec:
9448
9449         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
9450         to the type of x) if y is implicitly convertible to the type of x,
9451         and the operator is a builtin operator and the return type of the
9452         operator is explicitly convertible to the type of x. 
9453
9454         * rootcontext.cs: Reset warning level to 2.  4 catches various
9455         "interesting" features in mcs, we must clean this up at some
9456         point, but currently am trying to kill other bugs ;-)
9457
9458         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
9459         in container classes as well.  
9460
9461         * expression.cs (Binary.ResolveOperator): Handle string case
9462         before anything else (as operator overloading does emit an error
9463         before doing anything else).
9464
9465         This code could go away when we move to a table driven model, but
9466         i could not come up with a good plan last night.
9467
9468 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
9469
9470         * typemanager.cs (CSharpName): reimplementation using regex.
9471         * class.cs: added null check for fields in Emit
9472         * rootcontext.cs: set warninglevel to 4
9473
9474 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
9475
9476         * typemanager.cs (CSharpName): reimplemented with Lupus
9477         suggestion.
9478
9479 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
9480
9481         * statement.cs (If): correclty implement Resolve, because we were
9482         not catching sem errors in there.  The same process is needed
9483         everywhere else. 
9484         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
9485
9486
9487         (Statement.Warning_DeadCodeFound): Factorize code.
9488         (While): Report dead code here too.
9489
9490         (Statement): Added Resolve virtual method to allow
9491         for resolution split from the emit code.
9492
9493 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
9494
9495         * statement.cs (EmitBoolExpression): No longer try to resolve the
9496         expression here.    
9497         (MakeBoolean): New utility function that resolve, implicitly
9498         converts to boolean and tags the expression. 
9499
9500
9501         (If, Do): Implement dead code elimination.
9502         (While): Implement loop inversion
9503
9504         (Do, While, For, If): Resolve the expression prior to calling our
9505         code generation.
9506
9507 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
9508
9509         * class.cs:
9510           - added method Report28 (warning: program has more than one entry point)
9511           - added method IsEntryPoint, implements paragraph 10.1 of the spec
9512           - modified method Method.Define, the part at the end of the method
9513
9514         * rootcontext.cs: added static public Location EntryPointLocation;
9515           
9516         * ../errors/cs0028.cs : Add test case for the above warning.              
9517
9518         * typemanager.cs:
9519           - modified method CSharpName to allow arrays of primitive type to
9520             be printed nicely (e.g. instead of System.Int32[][] it now prints
9521             int[][])
9522           - added method CSharpSignature: returns the signature of a method
9523             in string format to be used in reporting errors, warnings, etc.
9524
9525         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
9526         with String.Empty.
9527
9528 2002-04-26  Ravi Pratap  <ravi@ximian.com>
9529
9530         * delegate.cs (Define): Fix extremely silly bug where I was
9531         setting the type of the 'object' parameter of the BeginInvoke
9532         method to System.IAsyncResult instead of System.Object ;-)
9533
9534 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
9535
9536         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
9537         here. 
9538
9539         (Constructor.Emit): return if we fail to initialize the
9540         constructor.  Another door closed!  
9541
9542         * expression.cs (New.DoResolve): Improve error message (from -6 to
9543         1501).  Use DeclaredOnly lookup to find the exact constructor.
9544
9545         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
9546         loop.  This is useful.
9547
9548         * cs-parser.jay: Adjust the default parameters so that destructors
9549         have the proper signature.
9550
9551 2002-04-26  Martin Baulig  <martin@gnome.org>
9552
9553         * driver.cs (LoadAssembly): If `assembly' contains any characters
9554         which are only valid in path names and not in assembly names
9555         (currently slash, backslash and point), use Assembly.LoadFrom ()
9556         instead of Assembly.Load () on the `assembly' (before iteration
9557         over the link_paths).
9558
9559 2002-04-26  Martin Baulig  <martin@gnome.org>
9560
9561         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
9562
9563 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
9564
9565         * class.cs (Property): use the new typemanager.MemberLookup
9566
9567         (TypeContainer.MemberLookup): Implement using the
9568         TypeManager.MemberLookup now. 
9569
9570         * typemanager.cs: Make MemberLookup a function of the TypeManager,
9571         and return MemberInfos, so that these can be used without an
9572         EmitContext (what we had before).
9573
9574 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
9575
9576         * expression.cs: Fix the case where the argument to params if the
9577         type of the params.  I omitted handling this before.   Fixed
9578
9579 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9580
9581         * driver.cs: Call BootCorlib_PopulateCoreType
9582
9583         * class.cs (Property.CheckBase): Check for properties only, not
9584         for all members. 
9585
9586         * interface.cs: Temporary hack: try/catch around the
9587         CustomAttributeBuilder, because I am getting an exception that I
9588         do not understand.
9589
9590         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
9591         types whose definitions are required to be there (attributes are
9592         defined before standard types).
9593
9594         Compute definitions as we boot the various types, as they are used
9595         immediately (value_type class will need object_type, but if we do
9596         not initialize object_type, we will pass a null, which will let
9597         the runtime pick the System.Object from the existing corlib, which
9598         is not what we want).
9599
9600 2002-04-22  Patrik Torstensson <totte@labs2.com>
9601
9602         * cs-tokenizer.cs: fixed a number of trim() issues.
9603
9604 2002-04-22  Ravi Pratap  <ravi@ximian.com>
9605
9606         * expression.cs (Argument.Type): Ensure that we return the correct
9607         type when we have out or ref parameters [in which case we 
9608         append a "&"].
9609
9610 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9611
9612         * class.cs (Property, Indexer): Allow extern modifier in there. 
9613
9614         * typemanager.cs (InitBaseTypes): Initializes object_type and
9615         value_type, since those will be used early on during the bootstrap
9616         process to compile corlib.
9617
9618         (InitCoreTypes): Move code from here to InitBaseTypes.
9619
9620 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
9621
9622         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
9623         single-dimension arrays as using the ldlen opcode.  
9624
9625         Daniel Lewis discovered this optimization.  
9626
9627         * typemanager.cs: Add signature for System.Array::get_Length
9628
9629 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9630
9631         * statement.cs: report the error when the foreach does not apply to an
9632         array nor a collection.
9633
9634 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
9635
9636         * expression.cs: Add implicit conversions to the operator ~.
9637
9638         * constant.cs (DecimalConstant.Emit): Emit decimal value.
9639
9640         * typemanager.cs: Locate the decimal constructor.
9641
9642 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9643
9644         * attribute.cs: use the new property of TypeOf.
9645         * expression.cs: added 'get' property around typearg.
9646
9647         These changes fix a build breaker reported by NickD. Is this the
9648         correct way to fix?  If not, please, revert my changes and make it
9649         work :-).
9650
9651 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
9652
9653         * attribute.cs: Add support for typeof in attribute invocations.
9654         I am not sure that this is right though.
9655
9656 2002-04-14  Duncan Mak  <duncan@ximian.com>
9657
9658         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
9659         Binary.Operator.Division case.
9660
9661 2002-04-13  Ravi Pratap  <ravi@ximian.com>
9662
9663         * class.cs (DefineType): Ensure that we do a proper check on
9664         attribute types and also register it with the TypeManager.
9665
9666         (TypeContainer.Targets): The default for attribute types is
9667         AttributeTargets.All.
9668
9669         * attribute.cs (ApplyAttributes): Registering the attribute type
9670         is done elsewhere, not when we discover we have a Usage attribute.
9671
9672 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9673
9674         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
9675         and get rid of is_delegate parameter.
9676
9677         * everywhere : update.
9678
9679 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9680
9681         * cs-parser.jay (compilation_unit): Revamp completely to use
9682         some new ideas that I got from Rhys' grammar to solve the problems
9683         with assembly level attributes.
9684
9685         (outer_declaration): New grammar production.
9686
9687         (attribute_sections): Add.
9688
9689         (opt_attributes): Base on attribute_sections
9690
9691         (namespace_declaration): Allow opt_attributes to tackle the case
9692         when we have assembly level attributes - we are clever in this
9693         regard now ;-)
9694
9695         * attribute.cs (ApplyAttributes): Do not worry about assembly 
9696         attributes in the non-global context.
9697
9698         * rootcontext.cs (AddGlobalAttributes): Go back to using this
9699         instead of SetGlobalAttributes.
9700
9701         * class.cs, rootcontext.cs : Ensure we define and generate 
9702         attribute types before anything else.
9703
9704         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
9705         and flag the new error -20 for the case when the attribute type
9706         does not have valid targets specified. csc does not catch this.
9707
9708         * ../errors/errors.txt : update for error # -20
9709
9710 2002-04-11  Ravi Pratap  <ravi@ximian.com>
9711
9712         * support.cs (InternalParameters.ParameterModifier): Do some null
9713         checking and return sane values.
9714
9715         * class.cs (Method.Define): If we are a PInvoke method, ensure
9716         that we are static and extern. Report error # 601
9717
9718         * ../errors/cs0601.cs : Add test case for the above error.
9719
9720 2002-04-07  Ravi Pratap  <ravi@ximian.com>
9721
9722         * rootcontext.cs (attribute_types): We need to keep type of
9723         all attribute types separately and emit code for them first.
9724
9725         (RegisterAttribute) : Implement.
9726
9727         * class.cs (DefineType): Check if the current Type is a custom
9728         attribute type and register it accordingly.
9729
9730         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
9731         adding the first attribute twice and rename to
9732
9733         (SetGlobalAttributes): this.
9734
9735         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
9736         lookups.
9737
9738         * attribute.cs (ApplyAttributes): Take an additional argument telling us
9739         if we are processing global arguments. Hmm, I am unsure of this.
9740
9741 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9742
9743         * expression.cs: added static array of strings to avoid calling
9744         Enum.ToString () for Operator in Binary. Significant recover of
9745         performance.
9746
9747 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
9748
9749         * class.cs (FindMembers): Allow the Builders of the various
9750         members to be null.  If they are skip them.  This only happens
9751         during the PInvoke declaration.
9752
9753 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
9754
9755         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
9756         failure, so we do not keep going afterwards.
9757
9758         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
9759         wanted to pass `false' as the `is_delegate' argument.  If this is
9760         the case, why not use delegate_type == null to mean `is_delegate =
9761         false' and anything else as is_delegate = true.
9762
9763 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
9764
9765         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
9766         code for the section, not the beginning of the tests.
9767
9768 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
9769
9770         * cfold.cs: Handle operator + (Enum x, Underlying x) 
9771
9772         * expression.cs (Binary): same.  Warn about errors where we have
9773         Enum/Enum in operator + as well.
9774
9775 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
9776
9777         * statement.cs:
9778                 - added support for switch(bool)
9779                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
9780                 - add TableSwitchEmit() to handle table-based switch statements
9781
9782 2002-04-05  Ravi Pratap  <ravi@ximian.com>
9783
9784         * expression.cs (Invocation.OverloadResolve): Factor out code which
9785         does parameter compatibility checking with arguments so that we can 
9786         re-use the code even from Delegate.VerifyApplicability
9787
9788         (VerifyArgumentsCompat): Move above code here.
9789
9790         * delegate.cs (VerifyApplicability): Get rid of duplicate code
9791         and instead make a call to the above method.
9792
9793 2002-03-31  Ravi Pratap  <ravi@ximian.com>
9794
9795         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
9796         We use it to keep track of classes which are attribute types.
9797
9798 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
9799
9800         * delegate.cs (Delegate.Define): Correctly define the types in the
9801         presence of fixed and array parameters.
9802
9803         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
9804         doing FindMembers.
9805
9806         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
9807         include NonPublic after the first iteration.
9808
9809         * class.cs (Indexer.CheckBase): Only check if both parents are
9810         non-null. 
9811
9812         * cs-parser.jay (accessor_body): If empty, set to null.
9813
9814         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
9815         same code path here to resolve constants names that we did have in
9816         MemberAccess.DoResolve.  There is too much code duplicated here.
9817
9818 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
9819
9820         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
9821
9822         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
9823         to MakeUnionSet.
9824
9825         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
9826         tokens, numbers and strings.
9827
9828         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
9829         parenthesis.
9830
9831         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
9832         asyncronous parameters and the regular parameters.  
9833
9834         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
9835         specify the target directory.
9836
9837         * expression.cs: (This.DoResolve): Simplify
9838         (As.Emit): Optimize, do not generate IsInst if the expression is
9839         always of the given type.
9840
9841         (Is.DoResolve): Bug fix, we were reporting both always/never for
9842         the is expression.
9843
9844         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
9845         creating too many unnecessary arrays.
9846
9847 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
9848
9849         * class.cs (EmitFieldInitializer): Use Assign expression to assign
9850         fields instead of rolling our own initializer.   Takes care of all
9851         implicit conversions, and drops unnecessary static checks/argument.
9852
9853 2002-03-31  Dick Porter  <dick@ximian.com>
9854
9855         * driver.cs: use the GetDirectories() return values properly, and
9856         use "/" as path separator.
9857
9858 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
9859
9860         * expression.cs (Unary): Optimize - - expr into expr.
9861         (Binary): Optimize a + (-b) into a -b.
9862
9863         * codegen.cs (CodeGen): Made all methods static.
9864
9865 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
9866
9867         * rootcontext.cs: 
9868
9869         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
9870         TypeBuilder property.
9871
9872         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
9873         instead. 
9874
9875         * tree.cs: Removed the various RecordXXXX, and replaced with a
9876         single RecordDecl.  Removed all the accessor methods, and just
9877         left a single access point Type 
9878
9879         * enum.cs: Rename DefineEnum to DefineType.
9880
9881         * decl.cs: New abstract method `DefineType' used to unify the
9882         Defines for Enumerations, Interfaces, TypeContainers and
9883         Delegates.
9884
9885         (FindType): Moved LookupInterfaceOrClass here.  Moved the
9886         LookupBaseClasses method that used to live in class.cs and
9887         interface.cs here, and renamed to FindType.
9888
9889         * delegate.cs: Implement DefineType.  Take advantage of the
9890         refactored pattern for locating the parent builder without taking
9891         the parent_builder argument (which we know does not work if we are
9892         nested, and triggering a toplevel definition).
9893
9894 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9895
9896         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
9897         accessibility of a member has changed during override and report
9898         an error if so.
9899
9900         * class.cs (Method.Define, Property.Define): Only complain on
9901         overrides if the method is private, any other accessibility is
9902         fine (and since we just checked the permission is the same, we are
9903         good to go).
9904
9905         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
9906         and elif are processed always.  The other pre-processing
9907         directives are only processed if we are "taking" the path
9908
9909 2002-03-29  Martin Baulig  <martin@gnome.org>
9910
9911         * class.cs (Method.Emit): Only emit symbolic debugging info if the
9912         current location is not Null.
9913
9914         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
9915         a separate method so we can profile it.
9916
9917         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
9918         `span.Seconds' are just seconds, but no minutes or hours.
9919         (MainDriver): Profile the CodeGen.SaveSymbols calls.
9920
9921 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9922
9923         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
9924         Remove the gratuitous set of Final:
9925
9926                                 // If an interface implementation, then we can set Final.
9927                                 if (((flags & MethodAttributes.Abstract) == 0) &&
9928                                     implementing.DeclaringType.IsInterface)
9929                                         flags |= MethodAttributes.Final;
9930
9931         I do not know what I was smoking when I used that.
9932
9933
9934         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
9935         step into fixing the name resolution issues for delegates and
9936         unifying the toplevel name resolution.
9937
9938 2002-03-28  Martin Baulig  <martin@gnome.org>
9939
9940         * class.cs (Method.Emit): If we have a symbol writer, call its
9941         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
9942         tell it about the current method.
9943
9944         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
9945         writer that we're going to emit the first byte of IL code for a new
9946         statement (a new source line).
9947         (EmitContext.EmitTopBlock): If we have a symbol writer, call
9948         EmitContext.Mark() before emitting any code.
9949
9950         * location.cs (SymbolDocument): Return null when we're Null.
9951
9952         * statement.cs (Statement): Moved the `Location loc' variable here.
9953         (Statement.EmitBoolExpression): If we have a symbol writer, call
9954         ec.Mark() before emitting any code to tell it that we're at the
9955         beginning of a new statement.
9956         (StatementExpression): Added `Location' argument to the constructor.
9957         (Block): Added public readonly variable `StartLocation' and public
9958         variable `EndLocation'.  The latter is to be set using SetEndLocation().
9959         (Block): Added constructor which takes a start and end location.
9960         (Block.SetEndLocation): New method. This sets the end location.
9961         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
9962         local variables we create.
9963         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
9964         each statement and do also mark the begin and end of the block.
9965
9966         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
9967         tell it the current lexer.Location, use Location.Null for the end of the
9968         block.
9969         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
9970         current block, set its end location using SetEndLocation().
9971         (statement_expression): StatementExpression constructor now takes the
9972         lexer.Location as additional argument.
9973         (for_statement, declare_local_variables): Likewise.
9974         (declare_local_variables): When creating a new implicit block, use the
9975         new Block constructor and pass it the lexer.Location.
9976
9977 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9978
9979         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
9980         members also on the parent interfaces recursively.
9981
9982 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
9983
9984         * report.cs: Use new formats, since Gonzalo finished the missing
9985         bits. 
9986
9987         * expression.cs (Binary.ResolveOperator): added missing operator|
9988         operator& and operator^ for bool/bool.
9989
9990         * cs-parser.jay: CheckDef now takes a Location argument that is
9991         used to report errors more precisly (instead of reporting the end
9992         of a definition, we try to track something which is a lot closer
9993         to the source of the problem).
9994
9995         * cs-tokenizer.cs: Track global token use, so we can properly flag
9996         the use of #define/#undef after the first token has been seen.
9997
9998         Also, rename the reportXXXX to Error_DescriptiveName
9999
10000         * decl.cs (DeclSpace.IsTopLevel): Move property here from
10001         TypeContainer, so that Enum and Interface can use this too.
10002
10003         * class.cs (TypeContainer.LookupInterfaceOrClass,
10004         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
10005         `builder' argument.  Typically this was used to pass the parent
10006         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
10007         the definition).  
10008
10009         The problem is that a nested class could trigger the definition of
10010         a toplevel class, and the builder would be obviously wrong in that
10011         case. 
10012
10013         So we drop this argument, and we compute dynamically the
10014         TypeBuilder/ModuleBuilder (the correct information was available
10015         to us anyways from DeclSpace.Parent)
10016
10017         * interface.cs (Interface.DefineInterface): Drop builder
10018         parameter cleanup like class.cs
10019
10020         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
10021         like class.cs
10022
10023         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
10024         values. 
10025
10026         (Try.Emit): Propagate the returns value from the statement.
10027
10028         (Return.Emit): Even if we are leavning 
10029
10030         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
10031
10032         * modifiers.cs: Fix the computation of MethodAttributes flags.
10033
10034 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
10035
10036         * driver.cs: allow compilation of files that start with '/'.
10037         Add a default case when checking the argument of --target.
10038
10039 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
10040
10041         * interface.cs: Implement the same search algorithm for types in
10042         the interface code.
10043
10044         * delegate.cs: Do not allow multiple definition.
10045
10046         * Recovered ChangeLog that got accidentally amputated
10047
10048         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
10049
10050         * rootcontext.cs: Load manually enum to allow core classes to
10051         contain enumerations.
10052
10053         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
10054         Update to new static methods in TypeManager.
10055
10056         * typemanager.cs (GetMethod, GetConstructor): Use our
10057         implementation of FindMembers to find the members, since during
10058         corlib compilation, the types are TypeBuilders and GetMethod and
10059         GetConstructor do not work.
10060
10061         Make all methods in TypeManager static.
10062
10063         (InitCodeHelpers): Split the functionality from
10064         the InitCodeTypes function.
10065
10066         * driver.cs: Call InitCodeHelpers after we have populated the
10067         types. 
10068
10069         * cs-parser.jay (delegate_declaration): we did not used to compute
10070         the delegate name correctly for void delegates.
10071
10072 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
10073
10074         * rootcontext.cs (RootContext): Init the interface_resolve_order
10075         and type_container_resolve_order always.
10076
10077         (ResolveCore, BootstrapCorlib_ResolveClass,
10078         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
10079         compiler when compiling with --nostdlib
10080
10081         * class.cs (TypeContainer.DefineType): Check that our parent is
10082         not null.  This test is most important when we are bootstraping
10083         the core types.
10084
10085         * codegen.cs: Split out the symbol writing code.
10086
10087 2002-03-25  Martin Baulig  <martin@gnome.org>
10088
10089         * driver.cs (-g): Made -g an alias for --debug.
10090
10091 2002-03-24  Martin Baulig  <martin@gnome.org>
10092
10093         * codegen.cs (SymbolWriter): New public variable. Returns the
10094         current symbol writer.
10095         (CodeGen): Added `bool want_debugging_support' argument to the
10096          constructor. If true, tell the ModuleBuild that we want debugging
10097         support and ask it for the ISymbolWriter.
10098         (Save): If we have a symbol writer, call it's Close() method after
10099         saving the assembly.
10100
10101         * driver.c (--debug): New command line argument to create a
10102         debugger information file.
10103
10104         * location.cs (SymbolDocument): New public property. Returns an
10105         ISymbolDocumentWriter object for the current source file or null
10106         if we don't have a symbol writer.
10107
10108 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
10109
10110         * driver.cs (LoadAssembly): Correctly return when all the paths
10111         have been tried and not before.
10112
10113         * statement.cs (Switch.Emit): return the actual coverage for this
10114         statement (returns/not-returns)
10115
10116         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
10117         switch of the statement if we are the last switch section.  That
10118         kills two problems: try/catch problems (we used to emit an empty
10119         nop at the end) and switch statements where all branches would
10120         return. 
10121
10122 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
10123
10124         * driver.cs: Add default assemblies (the equivalent to the
10125         Microsoft CSC.RSP file)
10126
10127         * cs-tokenizer.cs: When updating `cols and setting it to zero,
10128         also update tokens_seen and set it to false.
10129
10130         * driver.cs: Implement --recurse for Mike.
10131
10132         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
10133         correctly splitting out the paths.
10134
10135 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
10136
10137         * interface.cs (Interface.PopulateProperty): Instead of using
10138         `parent' as the declaration space for the set parameters, use
10139         `this' 
10140
10141         * support.cs (InternalParameters): InternalParameters constructor
10142         takes a DeclSpace instead of a TypeContainer.
10143
10144         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
10145         types are being initialized, load the address of it before calling
10146         the function.  
10147
10148         (New): Provide a mechanism to disable the generation of local
10149         value type temporaries when the caller will be providing us with
10150         an address to store it.
10151
10152         (ArrayCreation.EmitDynamicInitializers): Use it.
10153
10154 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
10155
10156         * expression.cs (Invocation.EmitArguments): Only probe for array
10157         property if there is more than one argument.  Sorry about that.
10158
10159         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
10160         empty param arrays.
10161
10162         * class.cs (Method.LabelParameters): Fix incorrect code path that
10163         prevented the `ParamArrayAttribute' from being applied to the
10164         params attribute.
10165
10166 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
10167
10168         * support.cs (ReflectionParameters): Correctly compute whether the
10169         last argument is a params array.  Fixes the problem with
10170         string.Split ('a')
10171
10172         * typemanager.cs: Make the assemblies array always be non-null
10173         (empty, but non-null)
10174
10175         * tree.cs (RecordDecl): New function that abstracts the recording
10176         of names.  This reports error 101, and provides a pointer to the
10177         previous declaration.  Fixes a crash in the compiler.
10178
10179         * cs-parser.jay (constructor_declaration): Update to new grammar,
10180         and provide a constructor_body that can be empty.
10181
10182 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
10183
10184         * driver.cs: Add support for --resources.
10185
10186         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
10187         Make all types for the various array helper methods be integer.
10188
10189         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
10190         CheckState to ConvCast.
10191
10192         (ConvCast): Now it takes a `checked' state argument, to avoid
10193         depending on the emit context for the conversion, and just using
10194         the resolve time setting.
10195
10196         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
10197         instead of Invocation.EmitArguments.  We do not emit the original
10198         arguments, instead we emit those which have been converted to
10199         unsigned int expressions.
10200
10201         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
10202
10203         * codegen.cs: ditto.
10204
10205         * expression.cs (LocalVariableReference): Drop the use of the
10206         Store function that depended on the variable index.
10207
10208         * statement.cs (VariableInfo): Drop the `Idx' property from this
10209         class, as this is not taking into account the indexes for
10210         temporaries tat we generate during the execution, getting the
10211         indexes wrong.
10212
10213         * class.cs: First emit class initializers, then call the parent
10214         constructor. 
10215
10216         * expression.cs (Binary): Fix opcode emision.
10217         (UnaryMutator.EmitCode): Support checked code generation
10218
10219         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
10220         matches for events for both the Static and Instance scans,
10221         pointing to the same element.   Fix that.
10222
10223 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
10224
10225         * rootcontext.cs (ResolveTree): Always set the
10226         interface_resolve_order, because nested interfaces will be calling
10227         into us.
10228
10229         * class.cs (GetInterfaceOrClass): Track the same resolution
10230         process used by TypeManager.LookupType.  This fixes the nested
10231         type lookups in class declarations (separate path from
10232         LookupType). 
10233
10234         (TypeContainer.DefineType): Also define nested interfaces.
10235         (TypeContainer.RegisterOrder): New public function used to
10236         register the order in which child interfaces need to be closed.
10237
10238         Nested interfaces need to be closed after their parents have been
10239         created. 
10240
10241         * interface.cs (InterfaceAttr): Put all the logic for computing
10242         the interface attribute here. 
10243
10244         (DefineInterface): Register our interface order with the
10245         RootContext or with the TypeContainer depending on the case.
10246
10247 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10248
10249         * cs-parser.jay: rework foreach statement to work with the new
10250         changes to the policy on SimpleNames.
10251
10252         * report.cs: support Stacktrace on warnings as well.
10253
10254         * makefile: drop --unsafe and /unsafe from the compile.
10255
10256 2002-03-13  Ravi Pratap  <ravi@ximian.com>
10257
10258         * ecore.cs (StandardConversionExists): Modify to take an Expression
10259         as the first parameter. Ensure we do null -> reference type conversion
10260         checking.
10261
10262         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
10263         temporary Expression objects.
10264
10265 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
10266
10267         * interface.cs: workaround bug in method overloading resolution
10268         (there is already a bugzilla bug for it).
10269
10270 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10271
10272         We could also solve this problem by having a separate path for
10273         performing type lookups, instead of DoResolve, we could have a
10274         ResolveType entry point, and only participating pieces of the
10275         production (simplename, deref, array) would implement this. 
10276
10277         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
10278         signal SimpleName to only resolve type names and not attempt to
10279         resolve anything else.
10280
10281         * expression.cs (Cast): Set the flag.
10282
10283         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
10284
10285         * class.cs: Only report 108 if there is no `new' modifier.
10286
10287         * cs-parser.jay: rework foreach statement to work with the new
10288         changes to the policy on SimpleNames.
10289
10290         * report.cs: support Stacktrace on warnings as well.
10291
10292         * makefile: drop --unsafe and /unsafe from the compile.
10293
10294 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
10295
10296         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10297         lookups here, instead of doing that at parse time.  This means
10298         that our grammar will not introduce `LocalVariableReferences' as
10299         expressions at this point.  That solves the problem of code like
10300         this:
10301
10302         class X {
10303            static void Main ()
10304            { int X = 1;
10305             { X x = null }}}
10306
10307         This is only half the fix.  The full fix requires parameters to
10308         also be handled in this way.
10309
10310         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
10311         makes the use more obvious of the DeclSpace.  The
10312         ec.TypeContainer.TypeBuilder is now only used to pull the
10313         TypeBuilder for it.
10314
10315         My theory is that I can get rid of the TypeBuilder completely from
10316         the EmitContext, and have typecasts where it is used (from
10317         DeclSpace to where it matters).  
10318
10319         The only pending problem is that the code that implements Aliases
10320         is on TypeContainer, and probably should go in DeclSpace.
10321
10322         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10323         lookups here, instead of doing that at parse time.  This means
10324         that our grammar will not introduce `LocalVariableReferences' as
10325         expressions at this point.  That solves the problem of code like
10326         this:
10327
10328         class X {
10329            static void Main ()
10330            { int X = 1;
10331             { X x = null }}}
10332
10333         This is only half the fix.  The full fix requires parameters to
10334         also be handled in this way.
10335
10336         * class.cs (Property.DefineMethod): When implementing an interface
10337         method, set newslot, when implementing an abstract method, do not
10338         set the flag (before we tried never setting it, or always setting
10339         it, which is the difference).
10340         (Indexer.DefineMethod): same.
10341         (Method.DefineMethod): same.
10342
10343         * ecore.cs: Only set the status used flag if we get back a Field.
10344
10345         * attribute.cs: Temporary hack, so Paolo can keep working.
10346
10347 2002-03-08  Ravi Pratap  <ravi@ximian.com>
10348
10349         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
10350         the unmanaged type in the case we have a MarshalAs attribute.
10351
10352         (Resolve): Handle the case when we are parsing the special MarshalAs
10353         attribute [we need to store the unmanaged type to use later]
10354
10355         * typemanager.cs (marshal_as_attr_type): Built in type for the 
10356         MarshalAs Attribute.
10357
10358         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
10359         on parameters and accordingly set the marshalling info.
10360
10361 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
10362
10363         * class.cs: Optimizing slightly by removing redundant code after
10364         we switched to the `NoTypes' return value.
10365         (Property.DefineMethod): use NoTypes here too.
10366
10367         This fixes the bug I introduced in my last batch of changes.
10368
10369 2002-03-05  Ravi Pratap  <ravi@ximian.com>
10370
10371         * tree.cs (RecordEnum): Add. We now keep track of enums too.
10372
10373         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
10374         Enums since those are types too. 
10375
10376         * cs-parser.jay (enum_declaration): Record enums as we parse them.
10377
10378         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
10379         thanks to a call during the lookup process.
10380
10381 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
10382
10383         * statement.cs (Foreach): Lots of work to accomodate a particular
10384         kind of foreach statement that I had not kept in mind.  It is
10385         possible to have foreachs on classes that provide a GetEnumerator
10386         method that return objects that implement the "pattern" for using
10387         a foreach, there is no need to support GetEnumerator
10388         specifically. 
10389
10390         This is needed to compile nant.
10391
10392         * decl.cs: Only report 114 if the member is not `Finalize' and if
10393         the warning level is at least 2.
10394
10395         * class.cs: Moved the compare function from Method to
10396         MethodSignature. 
10397
10398         (MethodSignature.InheritableMemberSignatureCompare): Add new
10399         filter function that is used to extract inheritable methods from a
10400         class. 
10401
10402         (Method.Define): Use the new `inheritable_method_signature_filter'
10403         delegate
10404
10405         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
10406         command. 
10407
10408 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
10409
10410         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
10411
10412         * cs-parser.jay: Add opt_semicolon to the interface declaration.
10413
10414         * expression.cs: Pass location information to
10415         ConvertImplicitStandard. 
10416
10417         * class.cs: Added debugging code to track return values from
10418         interfaces. 
10419
10420 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
10421
10422         * expression.cs (Is.DoResolve): If either side of the `is' is an
10423         interface, do not flag the warning.
10424
10425         * ecore.cs (ImplicitReferenceConversion): We need a separate test
10426         for interfaces
10427
10428         * report.cs: Allow for --fatal to be used with --probe.
10429
10430         * typemanager.cs (NoTypes): Move the definition for the empty Type
10431         array here. 
10432
10433         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
10434         properties. 
10435         (TypeContainer.DefineProxy): New function used to proxy to parent
10436         implementations when implementing interfaces.
10437         (TypeContainer.ParentImplements): used to lookup if our parent
10438         implements a public function that is required by an interface.
10439         (TypeContainer.VerifyPendingMethods): Hook this up.
10440
10441         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
10442         `modules' and `assemblies' arraylists into arrays.  We only grow
10443         these are the very early start up of the program, so this improves
10444         the speedof LookupType (nicely measured).
10445
10446         * expression.cs (MakeByteBlob): Replaced unsafe code with
10447         BitConverter, as suggested by Paolo.
10448
10449         * cfold.cs (ConstantFold.Binary): Special case: perform constant
10450         folding of string concatenation, but if either side is a string,
10451         and the other is not, then return null, and let the runtime use
10452         the concatenation on the string plus the object (using
10453         `Object.ToString'). 
10454
10455 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
10456
10457         Constant Folding has been implemented now.
10458
10459         * expression.cs (Unary.Reduce): Do not throw an exception, catch
10460         the error instead on types that are not supported in one's
10461         complement. 
10462
10463         * constant.cs (Constant and all children): New set of functions to
10464         perform implict and explicit conversions.
10465
10466         * ecore.cs (EnumConstant): Implement the new functions to perform
10467         conversion by proxying to the child expression.
10468
10469         * codegen.cs: (ConstantCheckState): Constant evaluation has its
10470         own separate setting that can not be turned off from the command
10471         line using --unchecked or --checked and is only controlled using
10472         the checked/unchecked statements and expressions.  This setting is
10473         used by the constant folder to flag errors.
10474
10475         * expression.cs (CheckedExpr, UncheckedExpr): Set the
10476         ConstantCheckState as well.   
10477
10478         During Resolve, they also have to flag the state, because the
10479         constant folder runs completely in the Resolve phase.
10480
10481         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
10482         well.
10483
10484 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
10485
10486         * cfold.cs: New file, this file contains the constant folder.
10487
10488         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
10489         argument to track whether we are using the resulting address to
10490         load or store a value and provide better error messages. 
10491
10492         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
10493         new AddressOf arguments.
10494
10495         * statement.cs (Foreach.EmitCollectionForeach): Update
10496
10497         * expression.cs (Argument.Emit): Call AddressOf with proper
10498         arguments to track usage.
10499
10500         (New.DoEmit): Call AddressOf with new arguments.
10501
10502         (Unary.Emit): Adjust AddressOf call.
10503
10504 2002-03-01  Ravi Pratap  <ravi@ximian.com>
10505
10506         * cs-parser.jay (member_access): Change the case for pre-defined types
10507         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
10508         this suggestion.
10509
10510         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
10511         a method body.
10512
10513         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
10514         essentially like methods and apply attributes like MethodImplOptions to them too.
10515
10516         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
10517         not being null.
10518
10519         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
10520         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
10521         is the DeclSpace.
10522
10523         * Update code everywhere accordingly.
10524
10525         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
10526
10527         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
10528
10529 2002-02-28  Ravi Pratap  <ravi@ximian.com>
10530
10531         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
10532         try performing lookups against those instead of jumping straight into using
10533         the 'using' clauses.
10534
10535         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
10536
10537         (LookupType): Perform lookups in implicit parents too.
10538
10539         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
10540         sequence as RootContext.LookupType. 
10541
10542         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
10543         the various cases of namespace lookups into this method.
10544
10545 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
10546
10547         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
10548         in positional arguments)
10549
10550         * class.cs (Operator): Update the AllowedModifiers to contain
10551         extern. 
10552
10553         * cs-parser.jay: Update operator declaration to allow for the
10554         operator body to be empty.
10555
10556         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
10557         values. 
10558
10559 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
10560
10561         * class.cs (Method.Emit): Label parameters.
10562
10563         * driver.cs: Return 1 or 0 as the program exit code.
10564
10565 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
10566
10567         * expression.cs: Special case the `null' object when trying to
10568         auto-compute the type, as anything can be explicitly converted to
10569         that. 
10570
10571         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
10572         spotting this Paolo.
10573
10574         (Expression.ImplicitNumericConversion): Perform comparissions of
10575         the type using the underlying type in the case of an enumeration
10576         rather than using the enumeration type for the compare.
10577
10578         Cope with the underlying == type case, which is not possible to
10579         catch before. 
10580
10581         (Expression.ConvertNumericExplicit): Perform comparissions of
10582         the type using the underlying type in the case of an enumeration
10583         rather than using the enumeration type for the compare.
10584
10585         * driver.cs: If the user does not supply an extension, assume .exe
10586
10587         * cs-parser.jay (if_statement): Rewrote so that we can track the
10588         location for the if statement.
10589
10590         * expression.cs (Binary.ConstantFold): Only concat strings when
10591         the operation is "+", not everything ;-)
10592
10593         * statement.cs (Statement.EmitBoolExpression): Take a location
10594         argument. 
10595         (If, While, Do): Track location.
10596
10597         * expression.cs (Binary.ResolveOperator): In the object + string
10598         case, I was missing a call to ConvertImplicit
10599
10600 2002-02-25  Ravi Pratap  <ravi@ximian.com>
10601
10602         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
10603         Location arguments. Ensure we use RootContext.LookupType to do our work
10604         and not try to do a direct Type.GetType and ModuleBuilder.GetType
10605
10606         * interface.cs (PopulateMethod): Handle the type of the parameter being
10607         null gracefully.
10608
10609         * expression.cs (Invocation.BetterFunction): Handle the case when we 
10610         have a params method with no fixed arguments and a call is made with no
10611         arguments.
10612
10613 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
10614
10615         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
10616         the verbatim-string-literal
10617
10618         * support.cs (InternalParameters.ParameterModifier): handle null
10619         fixed parameters.
10620         (InternalParameters.ParameterType): ditto.
10621
10622         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
10623         duplicating the name of the variable parameter.
10624         (GetParameterByName): Fix bug where we were not looking up array
10625         paramters if they were the only present (thanks Paolo!).
10626         (GetParameterInfo): We only have an empty set of types if both
10627         fixed and array are set to null.
10628         (GetParameterInfo-idx): Handle FixedParameter == null
10629
10630         * cs-parser.jay: Handle the case where there is no catch
10631         statements (missing null test).
10632
10633 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
10634
10635         * driver.cs (MainDriver): Be conservative on our command line
10636         handling.
10637
10638         Catch DirectoryNotFoundException when calling GetFiles.
10639
10640         (SplitPathAndPattern): Used to split the input specification into
10641         a path and a pattern that we can feed to Directory.GetFiles.
10642
10643 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
10644
10645         * statement.cs (Fixed): Implement the last case of the Fixed
10646         statement (string handling).
10647
10648         * expression.cs (StringPtr): New class used to return a char * to
10649         a string;  Used by the Fixed statement.
10650
10651         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
10652
10653         * expression.cs (Binary.ResolveOperator): Remove redundant
10654         MemberLookup pn parent type.
10655         Optimize union call, we do not need a union if the types are the same.
10656         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
10657         type.
10658
10659         Specialize the use of MemberLookup everywhere, instead of using
10660         the default settings. 
10661
10662         (StackAlloc): Implement stackalloc keyword.
10663
10664         * cs-parser.jay: Add rule to parse stackalloc.
10665
10666         * driver.cs: Handle /h, /help, /?
10667
10668         * expression.cs (MakeByteBlob): Removed the hacks we had in place
10669         before we supported unsafe code.
10670
10671         * makefile: add --unsafe to the self compilation of mcs.
10672
10673 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
10674
10675         * expression.cs (PointerArithmetic): New class that is used to
10676         perform pointer arithmetic.
10677         (Binary.Resolve): Handle pointer arithmetic
10678         Handle pointer comparission.
10679         (ArrayPtr): Utility expression class that is used to take the
10680         address of an array.
10681
10682         (ElementAccess): Implement array access for pointers
10683
10684         * statement.cs (Fixed): Implement fixed statement for arrays, we
10685         are missing one more case before we are done.
10686
10687         * expression.cs (Indirection): Implement EmitAssign and set the
10688         ExprClass to Variable.  This allows pointer dereferences to be
10689         treated as variables, and to have values assigned to them.
10690
10691         * ecore.cs (Expression.StoreFromPtr): New utility function to
10692         store values dereferencing.
10693
10694 2002-02-20  Ravi Pratap  <ravi@ximian.com>
10695
10696         * expression.cs (Binary.ResolveOperator): Ensure that we are
10697         not trying to operate on a void type - this fixes the reported
10698         bug.
10699
10700         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
10701         the parent implementation is sealed.
10702
10703         * ../errors/cs0239.cs : Add.
10704
10705         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
10706
10707         * typemanager.cs (unverifiable_code_type): Corresponds to 
10708         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
10709         which have unsafe code in them.
10710
10711         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
10712         unsafe context.
10713
10714 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
10715
10716         * cs-tokenizer.cs: Add support for @"litreal strings"
10717
10718         Make tokenizer accept pre-processor directives
10719         on any column (remove the old C-like limitation). 
10720
10721         * rootcontext.cs (EmitCode): Emit any global attributes.
10722         (AddGlobalAttributes): Used to keep track of assembly attributes. 
10723
10724         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
10725
10726         * cs-parser.jay: Add support for global attributes.  
10727
10728 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
10729
10730         * expression.cs (Indirection): New helper class.  Unary will
10731         create Indirection classes to be able to implement the
10732         IMemoryLocation interface on it.
10733
10734 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
10735
10736         * cs-parser.jay (fixed_statement): reference the right statement.
10737
10738         * statement.cs (Fixed.Emit): Finish implementing the fixed
10739         statement for the &x case.
10740
10741 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
10742
10743         * class.cs (Property.Define, Method.Define): Remove newslot when
10744         `implementing'.  
10745
10746         * modifiers.cs: My use of NewSlot when `Abstract' was set was
10747         wrong.  NewSlot should only be used if the `new' keyword is present.
10748
10749         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
10750         locating our system dir.  Sorry about this.
10751
10752 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10753
10754         * driver.cs (GetSystemDir): Compute correctly the location of our
10755         system assemblies.  I was using the compiler directory instead of
10756         the library directory.
10757
10758 2002-02-13  Ravi Pratap  <ravi@ximian.com>
10759
10760         * expression.cs (BetterFunction): Put back in what Miguel commented out
10761         since it is the correct fix. The problem is elsewhere ;-)
10762
10763         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
10764         parameters of the parms method are themselves compatible or not !
10765
10766         (StandardConversionExists): Fix very dangerous bug where we were forgetting
10767         to check that a class implements an interface before saying that an implicit
10768         conversion was allowed. Use ImplementsInterface to do the checking.
10769
10770 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10771
10772         * class.cs (Method.Define): Track whether we are an explicit
10773         implementation or not.  And only call DefineMethodOverride if we
10774         are an explicit implementation.
10775
10776         (Property.DefineMethod): Ditto.
10777
10778 2002-02-11  Ravi Pratap  <ravi@ximian.com>
10779
10780         * expression.cs (BetterFunction): Catch hideous bug which was
10781          preventing us from detecting ambiguous calls due to implicit casts i.e
10782         cs0121.
10783
10784 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
10785
10786         * support.cs (Pair): Remove un-needed method.  I figured why I was
10787         getting the error in cs-parser.jay, the variable in a foreach loop
10788         is readonly, and the compiler does not really treat this as a variable.
10789
10790         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
10791         instead of EQUALS in grammar.  
10792
10793         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
10794
10795         * expression.cs (Unary.DoResolve): Check whether the argument is
10796         managed or not.
10797
10798 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
10799
10800         * support.cs: Api for Pair to set a value.  Despite the fact that
10801         the variables are public the MS C# compiler refuses to compile
10802         code that accesses the field if the variable is part of a foreach
10803         statement. 
10804
10805         * statement.cs (Fixed): Begin implementation of the fixed
10806         statement.
10807
10808         (Block.AddVariable): Return the VariableInfo on success and null
10809         on failure instead of true/false. 
10810
10811         * cs-parser.jay (foreach): Catch errors on variables already
10812         defined (we were ignoring this value before) and properly unwind
10813         the block hierarchy
10814
10815         (fixed_statement): grammar for the fixed statement.
10816
10817 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
10818
10819         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
10820         pointer types to be incretemented.
10821
10822         (SizeOf): Implement.
10823
10824         * cs-parser.jay (pointer_member_access): Implement
10825         expr->IDENTIFIER production.
10826
10827         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
10828         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
10829         on safe contexts.
10830
10831         (Unary): Implement indirection.
10832
10833         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
10834         use in non-unsafe context).
10835
10836         (SimpleName.DoResolve): Check for pointers in field access on safe
10837         contexts. 
10838
10839         (Expression.LoadFromPtr): Factor the load-indirect code in this
10840         function.  This was duplicated in UnboxCast and ParameterReference
10841
10842 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
10843
10844         * expression.cs (ComposedCast): report an error if a pointer cast
10845         is used in a safe region.
10846
10847         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
10848         pointer type casts in unsafe context.
10849
10850         * codegen.cs (EmitContext): Set up IsUnsafe.
10851
10852         * cs-parser.jay (non_expression_type): Add productions for pointer
10853         casts. 
10854
10855         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
10856         code.  We should not use force into static mode if the method is
10857         not virtual.  Fixes bug in MIS
10858
10859         * statement.cs (Do.Emit, While.Emit, For.Emit,
10860         Statement.EmitBoolExpression): Add support to Do and While to
10861         propagate infinite loop as `I do return' semantics.
10862
10863         Improve the For case to also test for boolean constants.
10864
10865         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
10866         to the list of attributes we can add.
10867
10868         Remove `EmitContext' argument.
10869
10870         * class.cs (Method.Define): Apply parameter attributes.
10871         (Constructor.Define): Apply parameter attributes.
10872         (MethodCore.LabelParameters): Move here the core of labeling
10873         parameters. 
10874
10875         * support.cs (ReflectionParameters.ParameterModifier,
10876         InternalParameters.ParameterModifier): Use IsByRef on the type and
10877         only return the OUT bit for these parameters instead of in/out/ref
10878         flags.
10879
10880         This is because I miss-understood things.  The ParameterInfo.IsIn
10881         and IsOut represent whether the parameter has the [In] and [Out]
10882         attributes set.  
10883
10884 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
10885
10886         * ecore.cs (FieldExpr.Emit): Release temporaries.
10887
10888         * assign.cs (LocalTemporary.Release): new function.
10889
10890         * codegen.cs (EmitContext.GetTemporaryStorage,
10891         EmitContext.FreeTemporaryStorage): Rework the way we deal with
10892         temporary storage.  Now we can "put back" localbuilders when we
10893         are done with them
10894
10895 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
10896
10897         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
10898         need to make a copy of the variable to generate verifiable code.
10899
10900 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
10901
10902         * driver.cs: Compute dynamically the system directory.
10903
10904         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
10905         Slower, but more generally useful.  Used by the abstract
10906         registering implementation. 
10907
10908         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
10909         the rules for the special rule on Type/instances.  First check if
10910         we have the same name, and if so, try that special static path
10911         rather than the instance path.
10912
10913 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
10914
10915         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
10916         for, while and if.
10917
10918         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
10919         Enum, ValueType, Delegate or Array for non-corlib compiles.
10920
10921         * cs-tokenizer.cs: Catch long identifiers (645)
10922
10923         * typemanager.cs (IndexerPropetyName): Ravi never tested this
10924         piece of code.
10925
10926         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
10927         fix, we were returning too early, so we were not registering
10928         pending methods from abstract classes.
10929
10930         Do not register pending methods if the class is abstract.
10931
10932         * expression.cs (Conditional.DoResolve): Report circular implicit
10933         conversions when we neecd to compute it for conditional
10934         expressions. 
10935
10936         (Is.DoResolve): If the expression is always of the provided type,
10937         flag warning 183.  If the expression can not ever be of the
10938         provided type flag warning 184.
10939
10940         * class.cs: Catch 169 as well.
10941
10942         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
10943         read. 
10944
10945 2002-01-18  Nick Drochak  <ndrochak@gol.com>
10946
10947         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
10948
10949 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
10950
10951         * interface.cs: (PopulateMethod): Check for pointers being defined
10952         only if the unsafe context is active.
10953         (PopulateProperty): ditto.
10954         (PopulateIndexer): ditto.
10955
10956         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
10957         specified.  If pointers are present, make sure that they are
10958         present in an unsafe context.
10959         (Constructor, Constructor.Define): ditto.
10960         (Field, Field.Define): ditto.
10961         (Property, Property.Define): ditto.
10962         (Event, Event.Define): ditto.
10963
10964         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
10965         hashtable if there are classes or structs defined.
10966
10967         * expression.cs (LocalVariableReference.DoResolve): Simplify this
10968         code, as the constant resolution moved.
10969
10970         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
10971         the metadata, so we can flag error 133. 
10972
10973         * decl.cs (MemberCore.UnsafeOK): New function to test that a
10974         pointer is being declared in an unsafe context.
10975
10976 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
10977
10978         * modifiers.cs (Modifiers.Check): Require a Location argument.
10979         Report error 227 for Unsafe use.
10980
10981         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
10982
10983         * statement.cs (For.Emit): If the test is null, then report that
10984         we do `return', as we wont reach anything afterwards.
10985
10986         (Switch.SwitchGoverningType): Track the expression that matched
10987         the conversion.
10988
10989         * driver.cs: Allow negative numbers as an error code to flag.
10990
10991         * cs-parser.jay: Handle 1551.
10992
10993         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
10994
10995 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
10996
10997         * cs-parser.jay: Report 1518 (type declaration can only contain
10998         class, struct, interface, enum or delegate)
10999
11000         (switch_label): Report 1523 (keywords `case' or `default' must
11001         preced code)
11002
11003         (opt_switch_sections): Report 1522 (empty switch)
11004
11005         * driver.cs: Report 1515 (response file specified multiple times)
11006         Report 1516 (Source file specified multiple times).
11007
11008         * expression.cs (Argument.Resolve): Signal 1510
11009
11010         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
11011         access not allowed in static code)
11012
11013 2002-01-11  Ravi Pratap  <ravi@ximian.com>
11014
11015         * typemanager.cs (IsPointerType): Utility method which we are going
11016         to need a lot.
11017
11018         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
11019         the object type, so we take care of that.
11020
11021         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
11022
11023         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
11024         added to non-params parameters :-)
11025
11026         * typemanager.cs (CSharpName): Include 'void' type too. 
11027
11028         (void_ptr_type): Include in the set of core types.
11029
11030         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
11031         duplicating code.
11032
11033         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
11034         an unsafe context.
11035
11036         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
11037         completely forgotten about it.
11038
11039 2002-01-10  Ravi Pratap  <ravi@ximian.com>
11040
11041         * cs-parser.jay (pointer_type): Add. This begins our implementation
11042         of parsing rules for unsafe code.
11043
11044         (unsafe_statement): Implement.
11045
11046         (embedded_statement): Modify to include the above.
11047
11048         * statement.cs (Unsafe): Implement new class for unsafe blocks.
11049
11050         * codegen.cs (EmitContext.InUnsafe): Add. This determines
11051         if the current context is an unsafe one.
11052
11053         * cs-parser.jay (local_variable_pointer_type): Since local variable types
11054         are handled differently, we need separate rules for them.
11055
11056         (local_variable_declaration): Update to use local_variable_pointer_type
11057         to allow variable declarations of unmanaged pointer types.
11058
11059         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
11060         in unsafe contexts.
11061
11062         * ../errors/cs0214.cs : Add.
11063
11064 2002-01-16  Nick Drochak  <ndrochak@gol.com>
11065
11066         * makefile: remove 'response' file when cleaning.
11067
11068 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11069
11070         * cs-parser.jay: Report 1524.
11071
11072 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
11073
11074         * typemanager.cs (RegisterMethod): drop checking if we have
11075         registered this from here
11076
11077 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
11078
11079         * class.cs (Method.EmitDestructor): Implement calling our base
11080         destructor. 
11081
11082         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
11083         value of InFinally.
11084
11085         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
11086         this routine and will wrap the call in a try/catch block.  Deal
11087         with the case.
11088
11089 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
11090
11091         * ecore.cs (Expression.MemberLookup): instead of taking a
11092         parameter `same_type' that was used to tell whether we could
11093         access private members we compute our containing type from the
11094         EmitContext.
11095
11096         (FieldExpr): Added partial support for volatile fields.  This does
11097         not work for volatile fields exposed from assemblies, as I can not
11098         figure out how to extract the modreq from it.
11099
11100         Updated all the source files to use this.
11101
11102         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
11103         because it is referenced by MemberLookup very often. 
11104
11105 2002-01-09  Ravi Pratap  <ravi@ximian.com>
11106
11107         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
11108         TypeBuilder.GetCustomAttributes to retrieve what we need.
11109
11110         Get rid of redundant default_member_attr_type as this is the same as
11111         default_member_type which already exists.
11112
11113         * interface.cs, attribute.cs : Update accordingly.
11114
11115 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
11116
11117         * typemanager.cs: Enable IndexerPropertyName again.  It does not
11118         work for TYpeBuilders though.  Ravi, can you please fix this?
11119
11120         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
11121
11122         * expression.cs (Argument.Emit): Handle the case of ref objects
11123         being passed to ref functions;  
11124
11125         (ParameterReference.EmitLoad): Loads the content of the pointer
11126         without dereferencing.
11127
11128 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11129
11130         * cs-tokenizer.cs: Implemented the pre-processing expressions.
11131
11132 2002-01-08  Ravi Pratap  <ravi@ximian.com>
11133
11134         * class.cs (Indexer.DefineMethod): Incorporate the interface
11135         type in the name of the method if we are doing explicit interface
11136         implementation.
11137
11138         * expression.cs (ConversionExists): Remove as it is completely obsolete.
11139
11140         (BetterConversion): Fix extremely trivial bug where we were referring to
11141         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
11142         again !
11143
11144         * ../errors/bug16.cs : Add although we have fixed it.
11145
11146 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11147
11148         * expression.cs (BaseIndexer): Begin implementation.
11149
11150         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
11151
11152         * cs-parser.jay (indexer_declarator): Use qualified_identifier
11153         production directly to remove a shift/reduce, and implement
11154         explicit interface implementation.
11155
11156         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
11157         after a floating point suffix.
11158
11159         * expression.cs (DoNumericPromotions): Improved the conversion for
11160         uint/uint.  If we have a constant, we avoid doing a typecast to a
11161         larger type.
11162
11163         * class.cs (Indexer): Implement explicit interface implementation
11164         for indexers.
11165
11166 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
11167
11168         * class.cs: make the default instance constructor public and hidebysig.
11169
11170 2001-01-03  Ravi Pratap  <ravi@ximian.com>
11171
11172         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
11173         so we can call it from elsewhere.
11174
11175         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
11176         we emit it internally if the class has a defined indexer; otherwise the user
11177         emits it by decorating the class definition with the DefaultMemberAttribute.
11178
11179         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
11180         attribute is not used on a type which defines an indexer.
11181
11182         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
11183         character when we skip whitespace.
11184
11185         * ../errors/cs0646.cs : Add.
11186
11187 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
11188
11189         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
11190         again. 
11191
11192         * makefile: Add practical target `mcs3.exe' which builds the third
11193         generation compiler. 
11194
11195         * expression.cs (New): Fix structures constructor calling.
11196
11197         * class.cs (Property, Method, Indexer): Emit Final flag on the
11198         method if we are an interface implementation and we are not
11199         abstract. 
11200
11201         * ecore.cs (PropertyExpr): New public field `IsBase', tells
11202         whether this property is referencing a `base' method.
11203
11204         * expression.cs (Invocation.EmitCall): take an extra argument:
11205         is_base, this is used to determine whether the `call' or
11206         `callvirt' opcode should be used.
11207
11208
11209         * delegate.cs: update EmitCall.
11210
11211         * class.cs (Method.Define): Set NewSlot for the cases where we are
11212         not implementing an interface method.
11213
11214         (Property.Define): ditto.
11215
11216 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
11217
11218         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
11219         'r'.  Allows mcs to parse itself fully.
11220
11221 2002-01-02  Ravi Pratap  <ravi@ximian.com>
11222
11223         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
11224         of the number of initializers that require the InitializeArray method.
11225
11226         (CheckIndices): Store the Expression in all cases - not the plain value. Also
11227         update the above field where necessary.
11228
11229         (MakeByteBlob): Update accordingly.
11230
11231         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
11232         greater than 2.
11233
11234         (EmitDynamicInitializers): Update in accordance with the new optimization.
11235
11236         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
11237         same OpCode applies.
11238
11239         * cs-parser.jay : Fix some glaring errors I introduced.
11240
11241 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
11242
11243         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
11244         so that we can check for name clashes there too.
11245
11246         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
11247         for interface indexers.
11248
11249         * interfaces.cs (Define): Emit the default member attribute.
11250
11251         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
11252         variable was being referred to while setting the value ;-)
11253
11254 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
11255
11256         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
11257         byte-by-byte information when we know the data is zero.
11258
11259         Make the block always a multiple of 4, because
11260         DefineInitializedData has a bug.
11261
11262         * assign.cs: Fix, we should assign from the temporary, not from
11263         the source. 
11264
11265         * expression.cs (MakeByteBlob): Fix my incorrect code.
11266
11267 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
11268
11269         * typemanager.cs (EnumToUnderlying): This function is used to get
11270         the underlying type from an enumeration, because it does not
11271         always work. 
11272
11273         * constant.cs: Use the I4_S form for values between -128 and 127.
11274
11275         * statement.cs (Block.LookupLabel): Looks up a label.
11276         (Block): Drop support for labeled blocks.
11277
11278         (LabeledStatement): New kind of statement that represents a label
11279         only.
11280
11281         (Goto): Finally implement this bad boy.
11282
11283         * cs-parser.jay: Update to reflect new mechanism to implement
11284         labels.
11285
11286 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
11287
11288         * codegen.cs (EmitContext.This): a codegen property that keeps the
11289         a single instance of this instead of creating many different this
11290         instances. 
11291
11292         * delegate.cs (Delegate.DoResolve): Update to use the property;
11293
11294         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
11295
11296         * expression.cs (BaseAccess.DoResolve): Ditto.
11297
11298 2001-12-29  Ravi Pratap  <ravi@ximian.com>
11299
11300         * typemanager.cs (methodimpl_attr_type): Add to hold the type
11301         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
11302
11303         (InitCoreTypes): Update accordingly.
11304
11305         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
11306         so we can quickly store the state.
11307
11308         (ApplyAttributes): Set the correct implementation flags
11309         for InternalCall methods.
11310
11311 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
11312
11313         * expression.cs (EmitCall): if a method is not virtual, then do
11314         not use callvirt on it.
11315
11316         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
11317         user defined stuff) requires the use of stobj, which takes an
11318         address on the stack instead of an array and an index.  So emit
11319         the Ldelema operation for it.
11320
11321         (EmitStoreOpcode): Use stobj for valuetypes.
11322
11323         (UnaryMutator.EmitCode): Use the right 1 value depending on
11324         whether we are dealing with int64/uint64, float or doubles.
11325
11326         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
11327         constructors that I implemented last night.
11328
11329         (Constructor.IsDefault): Fix to work properly for static
11330         constructors.
11331
11332         * cs-parser.jay (CheckDef): report method signature errors.
11333         Update error number 103 to be 132.
11334
11335         * decl.cs: New AdditionResult enumeration value: MethodExists.
11336         Although we do this check for methods later on in the semantic
11337         analysis, catching repeated default constructors is so easy that
11338         we catch these here. 
11339
11340         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
11341         promotions code.
11342
11343         (ParameterReference.EmitAssign, Emit): handle
11344         bools as bytes.
11345
11346         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
11347         (ArrayAccess.EmitStoreOpcode): ditto.
11348
11349         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
11350
11351         * expression.cs (MakeByteBlob): Complete all the missing types
11352         (uint, short, ushort, byte, sbyte)
11353
11354         * class.cs: Only init instance field initializers on instance
11355         constructors. 
11356
11357         Rename `constructors' to instance_constructors. 
11358
11359         (TypeContainer.AddConstructor): Only add constructors to the list
11360         if it is not static.
11361
11362         Make sure that we handle default_static_constructor independently
11363         everywhere where we handle instance_constructors
11364
11365 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
11366
11367         * class.cs: Do not lookup or create a base initializer for a
11368         static constructor.
11369
11370         (ConstructorInitializer.Resolve): use the proper type to lookup
11371         for constructors.
11372
11373         * cs-parser.jay: Report error 1585 (modifiers between type and name).
11374
11375         * enum.cs, interface.cs: Remove CloseType, this is taken care by
11376         in DeclSpace. 
11377
11378         * decl.cs: CloseType is now an virtual method, the default
11379         implementation just closes this type.
11380
11381 2001-12-28  Ravi Pratap  <ravi@ximian.com>
11382
11383         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
11384         to PreserveSig by default. Also emit HideBySig on such methods.
11385
11386         Basically, set the defaults to standard values.
11387
11388         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
11389         argument, if candidate is better, it can't be worse than the best !
11390
11391         (Invocation): Re-write bits to differentiate between methods being
11392         applicable in their expanded form and their normal form - for params
11393         methods of course.
11394
11395         Get rid of use_standard everywhere as only standard conversions are allowed
11396         in overload resolution. 
11397
11398         More spec conformance.
11399
11400 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
11401
11402         * driver.cs: Add --timestamp, to see where the compiler spends
11403         most of its time.
11404
11405         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
11406         `this' in static code.
11407
11408         (SimpleName.DoResolve): Implement in terms of a helper function
11409         that allows static-references to be passed upstream to
11410         MemberAccess.
11411
11412         (Expression.ResolveWithSimpleName): Resolve specially simple
11413         names when called by MemberAccess to implement the special
11414         semantics. 
11415
11416         (Expression.ImplicitReferenceConversion): Handle conversions from
11417         Null to reference types before others, as Null's type is
11418         System.Object. 
11419
11420         * expression.cs (Invocation.EmitCall): Handle the special case of
11421         calling methods declared on a reference type from a ValueType
11422         (Base classes System.Object and System.Enum)
11423
11424         (MemberAccess.Resolve): Only perform lookups on Enumerations if
11425         the left hand side is a TypeExpr, not on every enumeration. 
11426
11427         (Binary.Resolve): If types are reference types, then do a cast to
11428         object on operators != and == of both arguments.
11429
11430         * typemanager.cs (FindMembers): Extract instance and static
11431         members if requested.
11432
11433         * interface.cs (PopulateProperty): Use void_type instead of null
11434         as the return type for the setter method.
11435
11436         (PopulateIndexer): ditto.
11437
11438 2001-12-27  Ravi Pratap  <ravi@ximian.com>
11439
11440         * support.cs (ReflectionParameters): Fix minor bug where we
11441         were examining the wrong parameter for the ParamArray attribute.
11442
11443         Cope with requests for the type of the parameter at position
11444         greater than the params parameter's. We now return the element
11445         type of the params array as that makes more sense.
11446
11447         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
11448         accordingly as we no longer have to extract the element type
11449         ourselves.
11450
11451         (Invocation.OverloadResolve): Update.
11452
11453 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
11454
11455         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
11456         against IEnumerator, test whether the return value is a descendant
11457         of the IEnumerator interface.
11458
11459         * class.cs (Indexer.Define): Use an auxiliary method to implement
11460         the other bits of the method definition.  Begin support for
11461         explicit interface implementation.
11462
11463         (Property.DefineMethod): Use TypeManager.void_type instead of null
11464         for an empty return value.
11465
11466 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
11467
11468         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
11469         dealing with a FieldExpr which is composed of a FieldBuilder, in
11470         the code path we did extract the constant, but we should have
11471         obtained the underlying value to be able to cast it (otherwise we
11472         end up in an infinite loop, this is what Ravi was running into).
11473
11474         (ArrayCreation.UpdateIndices): Arrays might be empty.
11475
11476         (MemberAccess.ResolveMemberAccess): Add support for section
11477         14.5.4.1 that deals with the special case of E.I when E is a type
11478         and something else, that I can be a reference to a static member.
11479
11480         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
11481         handle a particular array type to create byte blobs, it is just
11482         something we dont generate byteblobs for.
11483
11484         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
11485         arguments. 
11486
11487         * location.cs (Push): remove the key from the hashtable that we
11488         are about to add.   This happens for empty files.
11489
11490         * driver.cs: Dispose files after we have parsed them.
11491
11492         (tokenize): new function that only runs the tokenizer on its
11493         input, for speed testing.
11494
11495 2001-12-26  Ravi Pratap  <ravi@ximian.com>
11496
11497         * class.cs (Event.Define): Define the private field only if there
11498         are no accessors defined.
11499
11500         * expression.cs (ResolveMemberAccess): If there is no associated
11501         field with the event, that means we have an event defined with its
11502         own accessors and we should flag error cs0070 since transforming
11503         ourselves into a field is not valid in that case.
11504
11505         * ecore.cs (SimpleName.DoResolve): Same as above.
11506
11507         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
11508         and charset to sane values.
11509
11510 2001-12-25  Ravi Pratap  <ravi@ximian.com>
11511
11512         * assign.cs (DoResolve): Perform check on events only if they 
11513         are being accessed outside the declaring type.
11514
11515         * cs-parser.jay (event_declarations): Update rules to correctly
11516         set the type of the implicit parameter etc.
11517
11518         (add_accessor, remove_accessor): Set current local parameters.
11519
11520         * expression.cs (Binary): For delegate addition and subtraction,
11521         cast the return value from the method into the appropriate delegate
11522         type.
11523
11524 2001-12-24  Ravi Pratap  <ravi@ximian.com>
11525
11526         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
11527         of these as the workaround is unnecessary.
11528
11529         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
11530         delegate data - none of that is needed at all.
11531
11532         Re-write bits to extract the instance expression and the delegate method
11533         correctly.
11534
11535         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
11536         on delegates too.
11537
11538         * attribute.cs (ApplyAttributes): New method to take care of common tasks
11539         of attaching attributes instead of duplicating code everywhere.
11540
11541         * everywhere : Update code to do attribute emission using the above method.
11542
11543 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11544
11545         * expression.cs (IsParamsMethodApplicable): if there are not
11546         parameters, return immediately.
11547
11548         * ecore.cs: The 0 literal can be implicity converted to an enum
11549         type. 
11550
11551         (SimpleName.DoResolve): First lookup the type, then lookup the
11552         members. 
11553
11554         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
11555         want to get its address.  If the InstanceExpression is not
11556         addressable, store the result in a temporary variable, then get
11557         the address of it.
11558
11559         * codegen.cs: Only display 219 errors on warning level or above. 
11560
11561         * expression.cs (ArrayAccess): Make it implement the
11562         IMemoryLocation interface.
11563
11564         (Binary.DoResolve): handle the operator == (object a, object b)
11565         and operator != (object a, object b) without incurring into a
11566         BoxedCast (because 5 != o should never be performed).
11567
11568         Handle binary enumerator operators.
11569
11570         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
11571         value type, otherwise use Ldelem_ref.
11572
11573         Use precomputed names;
11574
11575         (AddressOf): Implement address of
11576
11577         * cs-parser.jay (labeled_statement): Fix recursive block
11578         addition by reworking the production.
11579
11580         * expression.cs (New.DoEmit): New has a special case:
11581                 
11582                  If we are dealing with a ValueType, we have a few
11583                  situations to deal with:
11584                 
11585                     * The target of New is a ValueType variable, that is
11586                       easy, we just pass this as the variable reference
11587                 
11588                     * The target of New is being passed as an argument,
11589                       to a boxing operation or a function that takes a
11590                       ValueType.
11591                 
11592                       In this case, we need to create a temporary variable
11593                       that is the argument of New.
11594
11595
11596 2001-12-23  Ravi Pratap  <ravi@ximian.com>
11597
11598         * rootcontext.cs (LookupType): Check that current_type is not null before
11599         going about looking at nested types.
11600
11601         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
11602         not implement the IAssignMethod interface any more.
11603
11604         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
11605         where we tranform them into FieldExprs if they are being resolved from within
11606         the declaring type.
11607
11608         * ecore.cs (SimpleName.DoResolve): Do the same here.
11609
11610         * assign.cs (DoResolve, Emit): Clean up code considerably. 
11611
11612         * ../errors/bug10.cs : Add.
11613
11614         * ../errors/cs0070.cs : Add.
11615
11616         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
11617
11618         * assign.cs : Get rid of EventIsLocal everywhere.
11619
11620 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11621
11622         * ecore.cs (ConvertIntLiteral): finished the implementation.
11623
11624         * statement.cs (SwitchLabel): Convert the value we are using as a
11625         key before looking up the table.
11626
11627 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11628
11629         * codegen.cs (EmitTopBlock): Require a Location argument now.
11630
11631         * cs-parser.jay (constructor_declarator): We need to setup
11632         current_local_parameters before we parse the
11633         opt_constructor_initializer, to allow the variables to be bound
11634         to the constructor arguments.
11635
11636         * rootcontext.cs (LookupType): First lookup nested classes in our
11637         class and our parents before we go looking outside our class.
11638
11639         * expression.cs (ConstantFold): Extract/debox the values at the
11640         beginnning. 
11641
11642         * rootcontext.cs (EmitCode): Resolve the constants first before we
11643         resolve the types.  This is not really needed, but it helps debugging.
11644
11645         * statement.cs: report location.
11646
11647         * cs-parser.jay: pass location to throw statement.
11648
11649         * driver.cs: Small bug fix.
11650
11651         * report.cs: Updated format to be 4-zero filled digits.
11652
11653 2001-12-22  Ravi Pratap  <ravi@ximian.com>
11654
11655         * expression.cs (CheckIndices): Fix minor bug where the wrong
11656         variable was being referred to ;-)
11657
11658         (DoEmit): Do not call EmitStaticInitializers when the 
11659         underlying type is System.Object.
11660
11661 2001-12-21  Ravi Pratap  <ravi@ximian.com>
11662
11663         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
11664         and do the usual workaround for SRE.
11665
11666         * class.cs (MyEventBuilder.EventType): New member to get at the type
11667         of the event, quickly.
11668
11669         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
11670
11671         * assign.cs (Assign.DoResolve): Handle the case when the target
11672         is an EventExpr and perform the necessary checks.
11673
11674         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
11675         interface.
11676
11677         (SimpleName.MemberStaticCheck): Include check for EventExpr.
11678
11679         (EventExpr): Set the type in the constructor itself since we 
11680         are meant to be born fully resolved.
11681
11682         (EventExpr.Define): Revert code I wrote earlier.
11683                 
11684         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
11685         instance expression is null. The instance expression is a This in that case
11686         or a null, depending on whether it is a static method or not.
11687
11688         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
11689         refers to more than one method.
11690
11691         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
11692         and accordingly flag errors.
11693
11694 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11695
11696         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
11697
11698 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11699
11700         * location.cs (ToString): Provide useful rutine.
11701
11702 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11703
11704         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
11705         objects, return the actual integral boxed.
11706
11707         * statement.cs (SwitchLabel): define an ILLabel for each
11708         SwitchLabel. 
11709
11710         (Switch.CheckSwitch): If the value is a Literal, extract
11711         the underlying literal.
11712
11713         Also in the unused hashtable we had, add the SwitchLabel so we can
11714         quickly look this value up.
11715
11716         * constant.cs: Implement a bunch of new constants.  Rewrite
11717         Literal based on this.  Made changes everywhere to adapt to this.
11718
11719         * expression.cs (Expression.MakeByteBlob): Optimize routine by
11720         dereferencing array only once, and also copes with enumrations.
11721
11722         bytes are two bytes wide, not one.
11723
11724         (Cast): Perform constant conversions.
11725
11726         * ecore.cs (TryImplicitIntConversion): Return literals instead of
11727         wrappers to the literals here.
11728
11729         * expression.cs (DoNumericPromotions): long literals can converted
11730         to ulong implicity (this is taken care of elsewhere, but I was
11731         missing this spot).
11732
11733         * ecore.cs (Expression.Literalize): Make the return type Literal,
11734         to improve type checking.
11735
11736         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
11737
11738 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11739
11740         * literal.cs: Revert code from ravi that checked the bounds.  The
11741         bounds are sane by the definition of the type itself. 
11742
11743         * typemanager.cs: Fix implementation of ImplementsInterface.  We
11744         need to actually look up in our parent hierarchy for interfaces
11745         implemented. 
11746
11747         * const.cs: Use the underlying type for enumerations
11748
11749         * delegate.cs: Compute the basename for the delegate creation,
11750         that should fix the delegate test case, and restore the correct
11751         Type Lookup semantics in rootcontext
11752
11753         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
11754         referencing a nested type with the Reflection API is using the "+"
11755         sign. 
11756
11757         * cs-parser.jay: Do not require EOF token at the end.
11758
11759 2001-12-20  Ravi Pratap  <ravi@ximian.com>
11760
11761         * rootcontext.cs (LookupType): Concatenate type names with
11762         a '.' instead of a '+' The test suite passes again.
11763
11764         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
11765         field of the enumeration.
11766
11767         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
11768         the case when the member is an EventExpr.
11769
11770         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
11771         static has an associated instance expression.
11772
11773         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
11774
11775         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
11776
11777         * class.cs (Event.Define): Register event and perform appropriate checks
11778         for error #111.
11779
11780         We define the Add and Remove methods even if the use provides none because
11781         in that case, we provide default implementations ourselves.
11782
11783         Define a private field of the type of the event. This is done by the CSC compiler
11784         and we should be doing it too ;-)
11785
11786         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
11787         More methods we use in code we generate.
11788
11789         (multicast_delegate_type, delegate_type): Two separate types since the distinction
11790         is important.
11791
11792         (InitCoreTypes): Update accordingly for the above.
11793
11794         * class.cs (Event.Emit): Generate code for default accessors that we provide
11795
11796         (EmitDefaultMethod): Do the job in the above.
11797
11798         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
11799         appropriate place.
11800
11801 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11802
11803         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
11804         builders even if we were missing one.
11805
11806         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
11807         pass the Basename as our class name instead of the Name.  The
11808         basename will be correctly composed for us.
11809
11810         * parameter.cs (Paramters): Now takes a Location argument.
11811
11812         * decl.cs (DeclSpace.LookupType): Removed convenience function and
11813         make all the code call directly LookupType in RootContext and take
11814         this chance to pass the Location information everywhere.
11815
11816         * Everywhere: pass Location information.
11817
11818 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
11819
11820         * class.cs (Constructor.Define): Updated way of detecting the
11821         length of the parameters.
11822
11823         (TypeContainer.DefineType): Use basename as the type name for
11824         nested types.
11825
11826         (TypeContainer.Define): Do not recursively define types here, as
11827         definition is taken care in order by the RootContext.
11828
11829         * tree.cs: Keep track of namespaces in a per-file basis.
11830
11831         * parameter.cs (Parameter.ComputeSignature): Update to use
11832         DeclSpace. 
11833
11834         (Parameters.GetSignature): ditto.
11835
11836         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
11837         instead of a TypeContainer.
11838
11839         (Interface.SemanticAnalysis): Use `this' instead of our parent to
11840         resolve names.  Because we need to be resolve in our context, not
11841         our parents.
11842
11843         * driver.cs: Implement response files.
11844
11845         * class.cs (TypeContainer.DefineType): If we are defined, do not
11846         redefine ourselves.
11847
11848         (Event.Emit): Emit the code for add/remove handlers.
11849         (Event.Define): Save the MethodBuilders for add/remove.
11850
11851         * typemanager.cs: Use pair here too.
11852
11853         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
11854         DictionaryEntry requires the first argument to be non-null.  
11855
11856         (enum_declaration): Compute full name for registering the
11857         enumeration.
11858
11859         (delegate_declaration): Instead of using
11860         formal_parameter_list, use opt_formal_parameter_list as the list
11861         can be empty.
11862
11863         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
11864         (EventParsing): New property that controls whether `add' and
11865         `remove' are returned as tokens or identifiers (for events);
11866
11867 2001-12-19  Ravi Pratap  <ravi@ximian.com>
11868
11869         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
11870         use MyEventBuilder only and let it wrap the real builder for us.
11871
11872         (MyEventBuilder): Revamp constructor etc.
11873
11874         Implement all operations that we perform on EventBuilder in precisely the same
11875         way here too.
11876
11877         (FindMembers): Update to use the EventBuilder member.
11878
11879         (Event.Emit): Update accordingly.
11880
11881 2001-12-18  Ravi Pratap  <ravi@ximian.com>
11882
11883         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
11884         by calling the appropriate methods.
11885
11886         (GetCustomAttributes): Make stubs as they cannot possibly do anything
11887         useful.
11888
11889         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
11890
11891 2001-12-17  Ravi Pratap  <ravi@ximian.com>
11892
11893         * delegate.cs (Delegate.Populate): Check that the return type
11894         and various parameters types are indeed accessible.
11895
11896         * class.cs (Constructor.Define): Same here.
11897
11898         (Field.Define): Ditto.
11899
11900         (Event.Define): Ditto.
11901
11902         (Operator.Define): Check that the underlying Method defined itself
11903         correctly - so it's MethodBuilder should not be null.
11904
11905         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
11906         expression happens to be null.
11907
11908         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
11909         members but as of now we don't seem to be able to do anything really useful with it.
11910
11911         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
11912         not the EventBuilder.
11913
11914 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
11915
11916         * cs-tokenizer.cs: Add support for defines.
11917         Add support for #if, #elif, #else, #endif
11918
11919         (eval_var): evaluates a variable.
11920         (eval): stubbed for evaluating functions.
11921
11922         * cs-parser.jay: Pass the defines information
11923
11924         * driver.cs: Add --define command line option.
11925
11926         * decl.cs: Move MemberCore here.
11927
11928         Make it the base class for DeclSpace.  This allows us to catch and
11929         report 108 and 109 for everything now.
11930
11931         * class.cs (TypeContainer.Define): Extract all the members
11932         before populating and emit the warning 108 (new keyword required
11933         to override) instead of having each member implement this.
11934
11935         (MemberCore.Define): New abstract method, we will be using this in
11936         the warning reporting engine in Populate.
11937
11938         (Operator.Define): Adjust to new MemberCore protocol. 
11939
11940         * const.cs (Const): This does not derive from Expression, it is a
11941         temporary object we use to create fields, it is a MemberCore. 
11942
11943         * class.cs (Method.Define): Allow the entry point to be in a
11944         specific class.
11945
11946         * driver.cs: Rewrite the argument handler to clean it up a bit.
11947
11948         * rootcontext.cs: Made it just an auxiliary namespace feature by
11949         making everything static.
11950
11951         * driver.cs: Adapt code to use RootContext type name instead of
11952         instance variable.
11953
11954         * delegate.cs: Remove RootContext argument.
11955
11956         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
11957         argument. 
11958
11959         * class.cs (Event.Define): The lookup can fail.
11960
11961         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
11962
11963         * expression.cs: Resolve the this instance before invoking the code.
11964
11965 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
11966
11967         * cs-parser.jay: Add a production in element_access that allows
11968         the thing to become a "type" reference.  This way we can parse
11969         things like "(string [])" as a type.
11970
11971         Note that this still does not handle the more complex rules of
11972         casts. 
11973
11974
11975         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
11976
11977         * ecore.cs: (CopyNewMethods): new utility function used to
11978         assemble the list of methods from running FindMembers.
11979
11980         (MemberLookup): Rework FindMembers so that 
11981
11982 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
11983
11984         * class.cs (TypeContainer): Remove Delegates who fail to be
11985         defined.
11986
11987         * delegate.cs (Populate): Verify that we dont get null return
11988         values.   TODO: Check for AsAccessible.
11989
11990         * cs-parser.jay: Use basename to emit error 574 (destructor should
11991         have the same name as container class), not the full name.
11992
11993         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
11994         possible representation.  
11995
11996         Also implements integer type suffixes U and L.
11997
11998 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
11999
12000         * expression.cs (ArrayCreation.DoResolve): We need to do the
12001         argument resolution *always*.
12002
12003         * decl.cs: Make this hold the namespace.  Hold the root context as
12004         well.
12005         (LookupType): Move here.
12006
12007         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
12008
12009         * location.cs (Row, Name): Fixed the code, it was always returning
12010         references to the first file.
12011
12012         * interface.cs: Register properties defined through interfaces.
12013
12014         * driver.cs: Add support for globbing on the command line
12015
12016         * class.cs (Field): Make it derive from MemberCore as well.
12017         (Event): ditto.
12018
12019 2001-12-15  Ravi Pratap  <ravi@ximian.com>
12020
12021         * class.cs (Event::Define): Check that the type of the event is a delegate
12022         type else flag error #66.
12023
12024         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
12025         same.
12026
12027         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
12028         values of EntryPoint, CharSet etc etc.
12029
12030         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
12031
12032         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
12033         be null and we should ignore this. I am not sure if this is really clean. Apparently,
12034         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
12035         which needs this to do its work.
12036
12037         * ../errors/cs0066.cs : Add.
12038
12039 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
12040
12041         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
12042         helper functions.
12043
12044         * class.cs: (MethodSignature.MethodSignature): Removed hack that
12045         clears out the parameters field.
12046         (MemberSignatureCompare): Cleanup
12047
12048         (MemberCore): New base class used to share code between MethodCore
12049         and Property.
12050
12051         (RegisterRequiredImplementations) BindingFlags.Public requires
12052         either BindingFlags.Instace or Static.  Use instance here.
12053
12054         (Property): Refactored code to cope better with the full spec.
12055
12056         * parameter.cs (GetParameterInfo): Return an empty array instead
12057         of null on error.
12058
12059         * class.cs (Property): Abstract or extern properties have no bodies.
12060
12061         * parameter.cs (GetParameterInfo): return a zero-sized array.
12062
12063         * class.cs (TypeContainer.MethodModifiersValid): Move all the
12064         method modifier validation to the typecontainer so we can reuse
12065         this on properties.
12066
12067         (MethodCore.ParameterTypes): return an empty sized array of types.
12068
12069         (Property.Define): Test property modifier validity.
12070
12071         Add tests for sealed/override too.
12072
12073         (Method.Emit): abstract or extern methods have no bodies.
12074
12075 2001-12-14  Ravi Pratap  <ravi@ximian.com>
12076
12077         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
12078         thing.
12079
12080         (Method::Define, ::Emit): Modify accordingly.
12081
12082         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
12083
12084         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
12085
12086         * makefile: Pass in /unsafe.
12087
12088 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
12089
12090         * class.cs (MakeKey): Kill routine.
12091
12092         * class.cs (TypeContainer.Define): Correctly define explicit
12093         method implementations (they require the full interface name plus
12094         the method name).
12095
12096         * typemanager.cs: Deply the PtrHashtable here and stop using the
12097         lame keys.  Things work so much better.
12098
12099         This of course broke everyone who depended on `RegisterMethod' to
12100         do the `test for existance' test.  This has to be done elsewhere.
12101
12102         * support.cs (PtrHashtable): A hashtable that avoid comparing with
12103         the object stupid Equals method (because, that like fails all over
12104         the place).  We still do not use it.
12105
12106         * class.cs (TypeContainer.SetRequiredInterface,
12107         TypeContainer.RequireMethods): Killed these two routines and moved
12108         all the functionality to RegisterRequiredImplementations.
12109
12110         (TypeContainer.RegisterRequiredImplementations): This routine now
12111         registers all the implementations required in an array for the
12112         interfaces and abstract methods.  We use an array of structures
12113         which can be computed ahead of time to reduce memory usage and we
12114         also assume that lookups are cheap as most classes will not
12115         implement too many interfaces.
12116
12117         We also avoid creating too many MethodSignatures.
12118
12119         (TypeContainer.IsInterfaceMethod): Update and optionally does not
12120         clear the "pending" bit if we find that there are problems with
12121         the declaration.
12122
12123         (TypeContainer.VerifyPendingMethods): Update to report errors of
12124         methods that look like implementations but are not.
12125
12126         (TypeContainer.Define): Add support for explicit interface method
12127         implementation. 
12128
12129 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
12130
12131         * typemanager.cs: Keep track of the parameters here instead of
12132         being a feature of the TypeContainer.
12133
12134         * class.cs: Drop the registration of parameters here, as
12135         InterfaceMethods are also interface declarations.
12136
12137         * delegate.cs: Register methods with the TypeManager not only with
12138         the TypeContainer.  This code was buggy.
12139
12140         * interface.cs: Full registation here.
12141
12142 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
12143
12144         * expression.cs: Remove reducer for binary expressions, it can not
12145         be done this way.
12146
12147         * const.cs: Put here the code that used to go into constant.cs
12148
12149         * constant.cs: Put here the code for constants, this is a new base
12150         class for Literals.
12151
12152         * literal.cs: Make Literal derive from Constant.
12153
12154 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
12155
12156         * statement.cs (Return.Emit): Report error 157 if the user
12157         attempts to return from a finally block.
12158
12159         (Return.Emit): Instead of emitting a return, jump to the end of
12160         the function.
12161
12162         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
12163         LocalBuilder to store the result of the function.  ReturnLabel is
12164         the target where we jump.
12165
12166
12167 2001-12-09  Radek Doulik  <rodo@ximian.com>
12168
12169         * cs-parser.jay: remember alias in current namespace
12170
12171         * ecore.cs (SimpleName::DoResolve): use aliases for types or
12172         namespaces
12173
12174         * class.cs (LookupAlias): lookup alias in my_namespace
12175
12176         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
12177         aliases hashtable
12178         (LookupAlias): lookup alias in this and if needed in parent
12179         namespaces
12180
12181 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
12182
12183         * support.cs: 
12184
12185         * rootcontext.cs: (ModuleBuilder) Made static, first step into
12186         making things static.  I need this to avoid passing the
12187         TypeContainer when calling ParameterType.
12188
12189         * support.cs (InternalParameters.ParameterType): Remove ugly hack
12190         that did string manipulation to compute the type and then call
12191         GetType.  Use Parameter.ParameterType instead.
12192
12193         * cs-tokenizer.cs: Consume the suffix for floating values.
12194
12195         * expression.cs (ParameterReference): figure out whether this is a
12196         reference parameter or not.  Kill an extra variable by computing
12197         the arg_idx during emission.
12198
12199         * parameter.cs (Parameters.GetParameterInfo): New overloaded
12200         function that returns whether a parameter is an out/ref value or not.
12201
12202         (Parameter.ParameterType): The type of the parameter (base,
12203         without ref/out applied).
12204
12205         (Parameter.Resolve): Perform resolution here.
12206         (Parameter.ExternalType): The full type (with ref/out applied).
12207
12208         * statement.cs (Using.Emit, Using.EmitExpression): Implement
12209         support for expressions on the using statement.
12210
12211 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
12212
12213         * statement.cs (Using.EmitLocalVariableDecls): Split the
12214         localvariable handling of the using statement.
12215
12216         (Block.EmitMeta): Keep track of variable count across blocks.  We
12217         were reusing slots on separate branches of blocks.
12218
12219         (Try.Emit): Emit the general code block, we were not emitting it. 
12220
12221         Check the type of the declaration to be an IDisposable or
12222         something that can be implicity converted to it. 
12223
12224         Emit conversions if required.
12225
12226         * ecore.cs (EmptyExpression): New utility class.
12227         (Expression.ImplicitConversionExists): New utility function.
12228
12229 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
12230
12231         * statement.cs (Using): Implement.
12232
12233         * expression.cs (LocalVariableReference): Support read only variables.
12234
12235         * statement.cs: Remove the explicit emit for the Leave opcode.
12236         (VariableInfo): Add a readonly field.
12237
12238 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
12239
12240         * ecore.cs (ConvCast): new class used to encapsulate the various
12241         explicit integer conversions that works in both checked and
12242         unchecked contexts.
12243
12244         (Expression.ConvertNumericExplicit): Use new ConvCast class to
12245         properly generate the overflow opcodes.
12246
12247 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12248
12249         * statement.cs: The correct type for the EmptyExpression is the
12250         element_type, not the variable type.  Ravi pointed this out.
12251
12252 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12253
12254         * class.cs (Method::Define): Handle PInvoke methods specially
12255         by using DefinePInvokeMethod instead of the usual one.
12256
12257         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
12258         above to do the task of extracting information and defining the method.
12259
12260 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12261
12262         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
12263         of the condition for string type.
12264
12265         (Emit): Move that here. 
12266
12267         (ArrayCreation::CheckIndices): Keep string literals in their expression
12268         form.
12269
12270         (EmitDynamicInitializers): Handle strings appropriately.
12271
12272 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12273
12274         * codegen.cs (EmitContext): Replace multiple variables with a
12275         single pointer to the current Switch statement.
12276
12277         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
12278         EmitContext.
12279
12280 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12281
12282         * statement.cs 
12283
12284         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
12285         default'.
12286
12287         (Foreach.Emit): Foreach on arrays was not setting
12288         up the loop variables (for break/continue).
12289
12290         (GotoCase): Semi-implented.
12291
12292 2001-12-03  Ravi Pratap  <ravi@ximian.com>
12293
12294         * attribute.cs (CheckAttribute): Handle system attributes by using
12295         Attribute.GetAttributes to examine information we need.
12296
12297         (GetValidPlaces): Same here.
12298
12299         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
12300
12301         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
12302
12303         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
12304
12305         (Method::Define): Set appropriate flags if we have a DllImport attribute.
12306
12307         (Method::Emit): Handle the case when we are a PInvoke method.
12308
12309 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12310
12311         * expression.cs: Use ResolveWithSimpleName on compound names.
12312
12313 2001-12-02  Ravi Pratap  <ravi@ximian.com>
12314
12315         * constant.cs (EmitConstant): Make sure we resolve the associated expression
12316         before trying to reduce it.
12317
12318         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
12319
12320         * constant.cs (LookupConstantValue): Implement.
12321
12322         (EmitConstant): Use the above in emitting the constant.
12323
12324         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
12325         that are user-defined by doing a LookupConstantValue on them.
12326
12327         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
12328         too, like above.
12329
12330 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
12331
12332         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
12333
12334         (BaseAccess.DoResolve): Implement.
12335
12336         (MemberAccess.DoResolve): Split this routine into a
12337         ResolveMemberAccess routine that can be used independently
12338
12339 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
12340
12341         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
12342         As that share bits of the implementation.  Is returns a boolean,
12343         while As returns the Type that is being probed.
12344
12345 2001-12-01  Ravi Pratap  <ravi@ximian.com>
12346
12347         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
12348         instead of a Literal - much easier.
12349
12350         (EnumInTransit): Remove - utterly useless :-)
12351
12352         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
12353
12354         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
12355
12356         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
12357         chain when we have no associated expression.
12358
12359 2001-11-30  Ravi Pratap  <ravi@ximian.com>
12360
12361         * constant.cs (Define): Use Location while reporting the errror.
12362
12363         Also emit a warning when 'new' is used and there is no inherited
12364         member to hide.
12365
12366         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
12367         populated.
12368
12369         (LookupEnumValue): Implement to lookup an enum member's value and define it
12370         if necessary.
12371
12372         (Populate): Re-write accordingly to use the above routine.
12373
12374 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
12375
12376         * expression.cs (This): Fix prototype for DoResolveLValue to
12377         override the base class DoResolveLValue.
12378
12379         * cs-parser.cs: Report errors cs574 and cs575 (destructor
12380         declarations) 
12381
12382         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
12383         (we need to load the address of the field here).  This fixes
12384         test-22. 
12385
12386         (FieldExpr.DoResolveLValue): Call the DoResolve
12387         function to initialize the Instance expression.
12388
12389         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
12390         correctly the GetEnumerator operation on a value type.
12391
12392         * cs-parser.jay: Add more simple parsing error catches.
12393
12394         * statement.cs (Switch): Add support for string switches.
12395         Handle null specially.
12396
12397         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
12398
12399 2001-11-28  Ravi Pratap  <ravi@ximian.com>
12400
12401         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
12402
12403         (declare_local_constant): New helper function.
12404
12405         * statement.cs (AddConstant): Keep a separate record of constants
12406
12407         (IsConstant): Implement to determine if a variable is a constant.
12408
12409         (GetConstantExpression): Implement.
12410
12411         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
12412
12413         * statement.cs (IsVariableDefined): Re-write.
12414
12415 2001-11-27  Ravi Pratap  <ravi@ximian.com>
12416
12417         * class.cs (TypeContainer::FindMembers): Look for constants
12418         in the case when we are looking for MemberTypes.Field
12419
12420         * expression.cs (MemberAccess::DoResolve): Check that in the
12421         case we are a FieldExpr and a Literal, we are not being accessed
12422         by an instance reference.
12423
12424         * cs-parser.jay (local_constant_declaration): Implement.
12425
12426         (declaration_statement): Implement for constant declarations.
12427
12428 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
12429
12430         * statement.cs (Switch): Catch double defaults.
12431
12432         (Switch): More work on the switch() statement
12433         implementation.  It works for integral values now, need to finish
12434         string support.
12435
12436
12437 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
12438
12439         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
12440         integer literals into other integer literals.  To be used by
12441         switch. 
12442
12443 2001-11-24  Ravi Pratap  <ravi@ximian.com>
12444
12445         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
12446         some memory.
12447
12448         (EmitDynamicInitializers): Cope with the above since we extract data
12449         directly from ArrayData now.
12450
12451         (ExpectInitializers): Keep track of whether initializers are mandatory
12452         or not.
12453
12454         (Bounds): Make it a hashtable to prevent the same dimension being 
12455         recorded for every element in that dimension.
12456
12457         (EmitDynamicInitializers): Fix bug which prevented the Set array method
12458         from being found.
12459
12460         Also fix bug which was causing the indices to be emitted in the reverse
12461         order.
12462
12463 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
12464
12465         * expression.cs (ArrayCreation): Implement the bits that Ravi left
12466         unfinished.  They do not work, because the underlying code is
12467         sloppy.
12468
12469 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12470
12471         * cs-parser.jay: Remove bogus fixme.
12472
12473         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
12474         on Switch statement.
12475
12476 2001-11-23  Ravi Pratap  <ravi@ximian.com>
12477
12478         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
12479         the same. 
12480
12481         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
12482         parameter. Apparently, any expression is allowed. 
12483
12484         (ValidateInitializers): Update accordingly.
12485
12486         (CheckIndices): Fix some tricky bugs thanks to recursion.
12487
12488         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
12489         I was being completely brain-dead.
12490
12491         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
12492         and re-write acordingly.
12493
12494         (DelegateInvocation): Re-write accordingly.
12495
12496         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
12497
12498         (MakeByteBlob): Handle types more correctly.
12499
12500         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
12501         initialization from expressions but it is incomplete because I am a complete
12502         Dodo :-|
12503
12504 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12505
12506         * statement.cs (If.Emit): Fix a bug that generated incorrect code
12507         on If.  Basically, we have to return `true' (ie, we do return to
12508         our caller) only if both branches of the if return.
12509
12510         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
12511         short-circuit operators, handle them as short circuit operators. 
12512
12513         (Cast.DoResolve): Resolve type.
12514         (Cast.Cast): Take an expression as the target type.
12515
12516         * cs-parser.jay (cast_expression): Remove old hack that only
12517         allowed a limited set of types to be handled.  Now we take a
12518         unary_expression and we resolve to a type during semantic
12519         analysis.
12520
12521         Use the grammar productions from Rhys to handle casts (this is
12522         not complete like Rhys syntax yet, we fail to handle that corner
12523         case that C# has regarding (-x), but we will get there.
12524
12525 2001-11-22  Ravi Pratap  <ravi@ximian.com>
12526
12527         * class.cs (EmitFieldInitializer): Take care of the case when we have a
12528         field which is an array type.
12529
12530         * cs-parser.jay (declare_local_variables): Support array initialization too.
12531
12532         * typemanager.cs (MakeKey): Implement.
12533
12534         (everywhere): Use the above appropriately.
12535
12536         * cs-parser.jay (for_statement): Update for array initialization while
12537         declaring variables.
12538
12539         * ecore.cs : The error message was correct, it's the variable's names that
12540         were misleading ;-) Make the code more readable.
12541
12542         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
12543         the correct type etc.
12544
12545         (ConvertExplicit): Handle Enum types by examining the underlying type.
12546
12547 2001-11-21  Ravi Pratap  <ravi@ximian.com>
12548
12549         * parameter.cs (GetCallingConvention): Always return
12550         CallingConventions.Standard for now.
12551
12552 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12553
12554         * expression.cs (Binary.ResolveOperator): Update the values of `l'
12555         and `r' after calling DoNumericPromotions.
12556
12557         * ecore.cs: Fix error message (the types were in the wrong order).
12558
12559         * statement.cs (Foreach.ProbeCollectionType): Need to pass
12560         BindingFlags.Instance as well 
12561
12562         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
12563         implicit int literal conversion in an empty cast so that we
12564         propagate the right type upstream.
12565
12566         (UnboxCast): new class used to unbox value types.
12567         (Expression.ConvertExplicit): Add explicit type conversions done
12568         by unboxing.
12569
12570         (Expression.ImplicitNumericConversion): Oops, forgot to test for
12571         the target type before applying the implicit LongLiterals to ULong
12572         literal cast.
12573
12574 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
12575
12576         * cs-parser.jay (for_statement): Reworked the way For works: now
12577         we declare manually any variables that are introduced in
12578         for_initializer to solve the problem of having out-of-band code
12579         emition (that is what got for broken).
12580
12581         (declaration_statement): Perform the actual variable declaration
12582         that used to be done in local_variable_declaration here.
12583
12584         (local_variable_declaration): Do not declare anything, just pass
12585         the information on a DictionaryEntry
12586
12587 2001-11-20  Ravi Pratap  <ravi@ximian.com>
12588
12589         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
12590         re-write of the logic to now make it recursive.
12591
12592         (UpdateIndices): Re-write accordingly.
12593
12594         Store element data in a separate ArrayData list in the above methods.
12595
12596         (MakeByteBlob): Implement to dump the array data into a byte array.
12597
12598 2001-11-19  Ravi Pratap  <ravi@ximian.com>
12599
12600         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
12601         into CheckIndices.
12602
12603         * constant.cs (Define): Implement.
12604
12605         (EmitConstant): Re-write fully.
12606
12607         Pass in location info.
12608
12609         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
12610         respectively.
12611
12612         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
12613         DictionaryEntry since we need location info too.
12614
12615         (constant_declaration): Update accordingly.
12616
12617         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
12618         code into another method : UpdateIndices.
12619
12620 2001-11-18  Ravi Pratap  <ravi@ximian.com>
12621
12622         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
12623         some type checking etc.
12624
12625 2001-11-17  Ravi Pratap  <ravi@ximian.com>
12626
12627         * expression.cs (ArrayCreation::ValidateInitializers): Implement
12628         bits to provide dimension info if the user skips doing that.
12629
12630         Update second constructor to store the rank correctly.
12631
12632 2001-11-16  Ravi Pratap  <ravi@ximian.com>
12633
12634         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
12635         and try to implement.
12636
12637         * ../errors/cs0150.cs : Add.
12638
12639         * ../errors/cs0178.cs : Add.
12640
12641 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
12642
12643         * statement.cs: Implement foreach on multi-dimensional arrays. 
12644
12645         * parameter.cs (Parameters.GetParameterByName): Also lookup the
12646         name of the params argument.
12647
12648         * expression.cs: Use EmitStoreOpcode to get the right opcode while
12649         initializing the array.
12650
12651         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
12652         we can use this elsewhere.
12653
12654         * statement.cs: Finish implementation of foreach for single
12655         dimension arrays.
12656
12657         * cs-parser.jay: Use an out-of-band stack to pass information
12658         around, I wonder why I need this.
12659
12660         foreach_block: Make the new foreach_block the current_block.
12661
12662         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
12663         function used to return a static Parameters structure.  Used for
12664         empty parameters, as those are created very frequently.
12665
12666         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
12667
12668 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12669
12670         * interface.cs : Default modifier is private, not public. The
12671         make verify test passes again.
12672
12673 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12674
12675         * support.cs (ReflectionParameters): Fix logic to determine
12676         whether the last parameter is a params one. Test 9 passes again.
12677
12678         * delegate.cs (Populate): Register the builders we define with
12679         RegisterParameterForBuilder. Test 19 passes again.
12680
12681         * cs-parser.jay (property_declaration): Reference $6 instead
12682         of $$ to get at the location.
12683
12684         (indexer_declaration): Similar stuff.
12685
12686         (attribute): Ditto.
12687
12688         * class.cs (Property): Register parameters for the Get and Set methods
12689         if they exist. Test 23 passes again.
12690
12691         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
12692         call to EmitArguments as we are sure there aren't any params arguments. 
12693         Test 32 passes again.
12694
12695         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
12696         IndexOutOfRangeException. 
12697
12698         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
12699         Test 33 now passes again.
12700
12701 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
12702
12703         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
12704         broke a bunch of things.  Will have to come up with a better way
12705         of tracking locations.
12706
12707         * statement.cs: Implemented foreach for single dimension arrays.
12708
12709 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12710
12711         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
12712         an error.  This removes the lookup from the critical path.
12713
12714         * cs-parser.jay: Removed use of temporary_loc, which is completely
12715         broken. 
12716
12717 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
12718
12719         * support.cs (ReflectionParameters.ParameterModifier): Report
12720         whether the argument is a PARAMS argument or not.
12721
12722         * class.cs: Set the attribute `ParamArrayAttribute' on the
12723         parameter argument.
12724
12725         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
12726         and cons_param_array_attribute (ConstructorInfo for
12727         ParamArrayAttribute)., 
12728
12729         * codegen.cs: Emit the return using the `Return' statement, that
12730         way we can report the error correctly for missing return values. 
12731
12732         * class.cs (Method.Emit): Clean up.
12733
12734         * expression.cs (Argument.Resolve): Take another argument: the
12735         location where this argument is used.  Notice that this is not
12736         part of the "Argument" class as to reduce the size of the
12737         structure (we know the approximate location anyways).
12738
12739         Test if the argument is a variable-reference, if not, then
12740         complain with a 206.
12741
12742         (Argument.Emit): Emit addresses of variables.
12743
12744         (Argument.FullDesc): Simplify.
12745
12746         (Invocation.DoResolve): Update for Argument.Resolve.
12747
12748         (ElementAccess.DoResolve): ditto.
12749
12750         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
12751         method should be virtual, as this method is always virtual.
12752
12753         (NewDelegate.DoResolve): Update for Argument.Resolve.
12754
12755         * class.cs (ConstructorInitializer.DoResolve): ditto.
12756
12757         * attribute.cs (Attribute.Resolve): ditto.
12758
12759 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
12760
12761         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
12762
12763         * expression.cs (ParameterReference): Drop IStackStorage and implement
12764         IAssignMethod instead. 
12765
12766         (LocalVariableReference): ditto.
12767
12768         * ecore.cs (FieldExpr): Drop IStackStorage and implement
12769         IAssignMethod instead. 
12770
12771 2001-11-13  Miguel de Icaza <miguel@ximian.com>
12772
12773         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
12774         enumerations that are used in heavily used structures derive from
12775         byte in a laughable and pathetic attempt to reduce memory usage.
12776         This is the kind of pre-optimzations that you should not do at
12777         home without adult supervision.
12778
12779         * expression.cs (UnaryMutator): New class, used to handle ++ and
12780         -- separatedly from the other unary operators.  Cleans up the
12781         code, and kills the ExpressionStatement dependency in Unary.
12782
12783         (Unary): Removed `method' and `Arguments' from this class, making
12784         it smaller, and moving it all to SimpleCall, so I can reuse this
12785         code in other locations and avoid creating a lot of transient data
12786         strucutres when not required.
12787
12788         * cs-parser.jay: Adjust for new changes.
12789
12790 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
12791
12792         * enum.cs (Enum.Populate): If there is a failure during
12793         definition, return
12794
12795         * cs-parser.jay (opt_enum_base): we used to catch type errors
12796         here, but this is really incorrect.  The type error should be
12797         catched during semantic analysis.
12798
12799 2001-12-11  Ravi Pratap  <ravi@ximian.com>
12800
12801         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
12802         current_local_parameters as expected since I, in my stupidity, had forgotten
12803         to do this :-)
12804
12805         * attribute.cs (GetValidPlaces): Fix stupid bug.
12806
12807         * class.cs (Method::Emit): Perform check on applicability of attributes.
12808
12809         (Constructor::Emit): Ditto.
12810
12811         (Field::Emit): Ditto.
12812
12813         (Field.Location): Store location information.
12814
12815         (Property, Event, Indexer, Operator): Ditto.
12816
12817         * cs-parser.jay (field_declaration): Pass in location for each field.
12818
12819         * ../errors/cs0592.cs : Add.
12820
12821 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12822
12823         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
12824
12825         (InitCoreTypes): Update accordingly.
12826
12827         (RegisterAttrType, LookupAttr): Implement.
12828
12829         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
12830         info about the same.
12831
12832         (Resolve): Update to populate the above as necessary.
12833
12834         (Error592): Helper.
12835
12836         (GetValidPlaces): Helper to the above.
12837
12838         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
12839
12840         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
12841
12842 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12843
12844         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
12845
12846         * ../errors/cs0617.cs : Add.
12847
12848 2001-11-11  Ravi Pratap  <ravi@ximian.com>
12849
12850         * enum.cs (Emit): Rename to Populate to be more consistent with what
12851         we expect it to do and when exactly it is called.
12852
12853         * class.cs, rootcontext.cs : Update accordingly.
12854
12855         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
12856         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
12857
12858         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
12859
12860         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
12861         of a fieldinfo using the above, when dealing with a FieldBuilder.
12862
12863 2001-11-10  Ravi Pratap  <ravi@ximian.com>
12864
12865         * ../errors/cs0031.cs : Add.
12866
12867         * ../errors/cs1008.cs : Add.
12868
12869         * ../errrors/cs0543.cs : Add.
12870
12871         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
12872         enum type.
12873
12874         (FindMembers): Implement.
12875
12876         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
12877         enums and delegates too.
12878
12879         (enum_types): Rename to builder_to_enum.
12880
12881         (delegate_types): Rename to builder_to_delegate.
12882
12883         * delegate.cs (FindMembers): Implement.
12884
12885 2001-11-09  Ravi Pratap  <ravi@ximian.com>
12886
12887         * typemanager.cs (IsEnumType): Implement.
12888
12889         * enum.cs (Emit): Re-write parts to account for the underlying type
12890         better and perform checking etc.
12891
12892         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
12893         of the underlying type.
12894
12895         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
12896         value
12897
12898         * enum.cs (error31): Helper to report error #31.
12899
12900         * cs-parser.jay (enum_declaration): Store location of each member too.
12901
12902         * enum.cs (member_to_location): New hashtable. 
12903
12904         (AddEnumMember): Update location hashtable.
12905
12906         (Emit): Use the location of each member while reporting errors.
12907
12908 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12909
12910         * cs-parser.jay: A for_initializer if is a
12911         local_variable_declaration really ammount to have an implicit
12912         block with the variable declaration and no initializer for for.
12913
12914         * statement.cs (For.Emit): Cope with null initializers.
12915
12916         This fixes the infinite loop on for initializers.
12917
12918 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
12919
12920         * enum.cs: More cleanup.
12921
12922         * ecore.cs: Remove dead code.
12923
12924         * class.cs (Property.Emit): More simplification.
12925         (Event.Emit): ditto.
12926
12927         Reworked to have less levels of indentation.
12928
12929 2001-11-08  Ravi Pratap  <ravi@ximian.com>
12930
12931         * class.cs (Property): Emit attributes.
12932
12933         (Field): Ditto.
12934
12935         (Event): Ditto.
12936
12937         (Indexer): Ditto.
12938
12939         (Operator): Ditto.
12940
12941         * enum.cs (Emit): Ditto.
12942
12943         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
12944         Enums too.
12945
12946         * class.cs (Field, Event, etc.): Move attribute generation into the
12947         Emit method everywhere.
12948
12949         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
12950         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
12951         as we had no way of defining nested enums !
12952
12953         * rootcontext.cs : Adjust code accordingly.
12954
12955         * typemanager.cs (AddEnumType): To keep track of enum types separately.
12956
12957 2001-11-07  Ravi Pratap  <ravi@ximian.com>
12958
12959         * expression.cs (EvalConstantExpression): Move into ecore.cs
12960
12961         * enum.cs (Enum): Rename some members and make them public and readonly
12962         according to our convention.
12963
12964         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
12965         nothing else.
12966
12967         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
12968
12969         (Enum::Emit): Write a simple version for now which doesn't try to compute
12970         expressions. I shall modify this to be more robust in just a while.
12971
12972         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
12973
12974         (TypeContainer::CloseType): Create the Enum types too.
12975
12976         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
12977
12978         * expression.cs (EvalConstantExpression): Get rid of completely.
12979
12980         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
12981         user-defined values and other cases.
12982
12983         (IsValidEnumLiteral): Helper function.
12984
12985         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
12986         out there in the case we had a literal FieldExpr.
12987
12988         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
12989
12990         (Literalize): Revamp a bit to take two arguments.
12991
12992         (EnumLiteral): New class which derives from Literal to wrap enum literals.
12993
12994 2001-11-06  Ravi Pratap  <ravi@ximian.com>
12995
12996         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
12997
12998         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
12999
13000         (Resolve): Use the above to ensure we have proper initializers.
13001
13002 2001-11-05  Ravi Pratap  <ravi@ximian.com>
13003
13004         * expression.cs (Expression::EvalConstantExpression): New method to 
13005         evaluate constant expressions.
13006
13007         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
13008
13009 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
13010
13011         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
13012         in an array.
13013
13014         (Binary.ResolveOperator): Handle operator != (object a, object b)
13015         and operator == (object a, object b);
13016
13017         (Binary.DoNumericPromotions): Indicate whether the numeric
13018         promotion was possible.
13019
13020         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
13021         Implement.  
13022
13023         Made the ArrayAccess implement interface IAssignMethod instead of
13024         IStackStore as the order in which arguments are passed reflects
13025         this.
13026
13027         * assign.cs: Instead of using expr.ExprClass to select the way of
13028         assinging, probe for the IStackStore/IAssignMethod interfaces.
13029
13030         * typemanager.cs: Load InitializeArray definition.
13031
13032         * rootcontext.cs (RootContext.MakeStaticData): Used to define
13033         static data that can be used to initialize arrays. 
13034
13035 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
13036
13037         * expression.cs: Handle operator== and operator!= for booleans.
13038
13039         (Conditioal.Reduce): Implement reducer for the ?: operator.
13040
13041         (Conditional.Resolve): Implement dead code elimination.
13042
13043         (Binary.Resolve): Catch string literals and return a new
13044         concatenated string.
13045
13046         (Unary.Reduce): Implement reduction of unary expressions.
13047
13048         * ecore.cs: Split out the expression core handling here.
13049
13050         (Expression.Reduce): New method used to perform constant folding
13051         and CSE.  This is needed to support constant-expressions. 
13052
13053         * statement.cs (Statement.EmitBoolExpression): Pass true and false
13054         targets, and optimize for !x.
13055
13056 2001-11-04  Ravi Pratap  <ravi@ximian.com>
13057
13058         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
13059         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
13060         set custom atttributes.
13061
13062         * literal.cs (Literal::GetValue): New abstract method to return the actual
13063         value of the literal, cast as an object.
13064
13065         (*Literal): Implement GetValue method.
13066
13067         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
13068         expressions to the arraylist but objects of type Argument.
13069
13070         * class.cs (TypeContainer::Emit): Emit our attributes too.
13071
13072         (Method::Emit, Constructor::Emit): Ditto.
13073
13074         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
13075         to be ignoring earlier.
13076
13077 2001-11-03  Ravi Pratap  <ravi@ximian.com>
13078
13079         * attribute.cs (AttributeSection::Define): Implement to do the business
13080         of constructing a CustomAttributeBuilder.
13081
13082         (Attribute): New trivial class. Increases readability of code.  
13083
13084         * cs-parser.jay : Update accordingly.
13085
13086         (positional_argument_list, named_argument_list, named_argument): New rules
13087
13088         (attribute_arguments): Use the above so that we are more correct.
13089
13090 2001-11-02  Ravi Pratap  <ravi@ximian.com>
13091
13092         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
13093         to perform all checks for a method with a params parameter.
13094
13095         (Invocation::OverloadResolve): Update to use the above method and therefore
13096         cope correctly with params method invocations.
13097
13098         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
13099         params too.
13100
13101         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
13102         constructors in our parent too because we can't afford to miss out on 
13103         protected ones ;-)
13104
13105         * attribute.cs (AttributeSection): New name for the class Attribute
13106
13107         Other trivial changes to improve readability.
13108
13109         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
13110         use the new class names.
13111
13112 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13113
13114         * class.cs (Method::Define): Complete definition for params types too
13115
13116         (Indexer::Define): Ditto.
13117
13118         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
13119         Cope everywhere with a request for info about the array parameter.
13120
13121 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13122
13123         * tree.cs (RecordNamespace): Fix up to check for the correct key.
13124
13125         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
13126         local_variable_type to extract the string corresponding to the type.
13127
13128         (local_variable_type): Fixup the action to use the new helper method.
13129
13130         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
13131         go.
13132
13133         * expression.cs : Clean out code which uses the above.
13134
13135 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13136
13137         * typemanager.cs (RegisterMethod): Check if we already have an existing key
13138         and bale out if necessary by returning a false.
13139
13140         (RegisterProperty): Ditto.
13141
13142         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
13143         and print out appropriate error messages.
13144
13145         * interface.cs (everywhere): Ditto.
13146
13147         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
13148         location to constructor.
13149
13150         * class.cs (Property, Event, Indexer): Update accordingly.
13151
13152         * ../errors/cs111.cs : Added.
13153
13154         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
13155         of a method, as laid down by the spec.
13156
13157         (Invocation::OverloadResolve): Use the above method.
13158
13159 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13160
13161         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
13162         now take a TypeContainer and a Parameters object.
13163
13164         (ParameterData): Modify return type of ParameterModifier method to be 
13165         Parameter.Modifier and not a string.
13166
13167         (ReflectionParameters, InternalParameters): Update accordingly.
13168
13169         * expression.cs (Argument::GetParameterModifier): Same here.
13170
13171         * support.cs (InternalParameters::ParameterType): Find a better way of determining
13172         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
13173         symbol in it at all so maybe this is only for now.
13174
13175 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13176
13177         * support.cs (InternalParameters): Constructor now takes an extra argument 
13178         which is the actual Parameters class.
13179
13180         (ParameterDesc): Update to provide info on ref/out modifiers.
13181
13182         * class.cs (everywhere): Update call to InternalParameters to pass in
13183         the second argument too.
13184
13185         * support.cs (ParameterData): Add ParameterModifier, which is a method 
13186         to return the modifier info [ref/out etc]
13187
13188         (InternalParameters, ReflectionParameters): Implement the above.
13189
13190         * expression.cs (Argument::ParameterModifier): Similar function to return
13191         info about the argument's modifiers.
13192
13193         (Invocation::OverloadResolve): Update to take into account matching modifiers 
13194         too.
13195
13196         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
13197         a new SetFormalParameters object which we pass to InternalParameters.
13198
13199 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13200
13201         * expression.cs (NewArray): Merge into the ArrayCreation class.
13202
13203 2001-10-29  Ravi Pratap  <ravi@ximian.com>
13204
13205         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
13206         NewUserdefinedArray into one as there wasn't much of a use in having
13207         two separate ones.
13208
13209         * expression.cs (Argument): Change field's name to ArgType from Type.
13210
13211         (Type): New readonly property which returns the proper type, taking into 
13212         account ref/out modifiers.
13213
13214         (everywhere): Adjust code accordingly for the above.
13215
13216         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
13217         whether we are emitting for a ref or out parameter.
13218
13219         * expression.cs (Argument::Emit): Use the above field to set the state.
13220
13221         (LocalVariableReference::Emit): Update to honour the flag and emit the
13222         right stuff.
13223
13224         * parameter.cs (Attributes): Set the correct flags for ref parameters.
13225
13226         * expression.cs (Argument::FullDesc): New function to provide a full desc.
13227
13228         * support.cs (ParameterData): Add method ParameterDesc to the interface.
13229
13230         (ReflectionParameters, InternalParameters): Implement the above method.
13231
13232         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
13233         reporting errors.
13234
13235         (Invocation::FullMethodDesc): Ditto. 
13236
13237 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
13238
13239         * cs-parser.jay: Add extra production for the second form of array
13240         creation. 
13241
13242         * expression.cs (ArrayCreation): Update to reflect the above
13243         change. 
13244
13245         * Small changes to prepare for Array initialization.
13246
13247 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
13248
13249         * typemanager.cs (ImplementsInterface): interface might be null;
13250         Deal with this problem;
13251
13252         Also, we do store negative hits on the cache (null values), so use
13253         this instead of calling t.GetInterfaces on the type everytime.
13254
13255 2001-10-28  Ravi Pratap  <ravi@ximian.com>
13256
13257         * typemanager.cs (IsBuiltinType): New method to help determine the same.
13258
13259         * expression.cs (New::DoResolve): Get rid of array creation code and instead
13260         split functionality out into different classes.
13261
13262         (New::FormArrayType): Move into NewBuiltinArray.
13263
13264         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
13265         quite useless.
13266
13267         (NewBuiltinArray): New class to handle creation of built-in arrays.
13268
13269         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
13270         account creation of one-dimensional arrays.
13271
13272         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
13273
13274         (NewUserdefinedArray::DoResolve): Implement.
13275
13276         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
13277
13278         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
13279         we maintain inside the TypeManager. This is necessary to perform lookups on the
13280         module builder.
13281
13282         (LookupType): Update to perform GetType on the module builders too.     
13283
13284         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
13285
13286         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
13287
13288 2001-10-23  Ravi Pratap  <ravi@ximian.com>
13289
13290         * expression.cs (New::DoResolve): Implement guts of array creation.
13291
13292         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
13293
13294 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
13295
13296         * expression.cs: Fix bug I introduced lsat night that broke
13297         Delegates. 
13298
13299         (Expression.Resolve): Report a 246 error (can not resolve name)
13300         if we find a SimpleName in the stream.
13301
13302         (Expression.ResolveLValue): Ditto.
13303
13304         (Expression.ResolveWithSimpleName): This function is a variant of
13305         ResolveName, this one allows SimpleNames to be returned without a
13306         warning.  The only consumer of SimpleNames is MemberAccess
13307
13308 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
13309
13310         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
13311         might arrive here.  I have my doubts that this is correct.
13312
13313         * statement.cs (Lock): Implement lock statement.
13314
13315         * cs-parser.jay: Small fixes to support `lock' and `using'
13316
13317         * cs-tokenizer.cs: Remove extra space
13318
13319         * driver.cs: New flag --checked, allows to turn on integer math
13320         checking. 
13321
13322         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
13323         Threading.Monitor.Exit 
13324
13325 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
13326
13327         * expression.cs (IndexerAccess::DoResolveLValue): Set the
13328         Expression Class to be IndexerAccess.
13329
13330         Notice that Indexer::DoResolve sets the eclass to Value.
13331
13332 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
13333
13334         * class.cs (TypeContainer::Emit): Emit code for indexers.
13335
13336         * assign.cs (IAssignMethod): New interface implemented by Indexers
13337         and Properties for handling assignment.
13338
13339         (Assign::Emit): Simplify and reuse code. 
13340
13341         * expression.cs (IndexerAccess, PropertyExpr): Implement
13342         IAssignMethod, clean up old code. 
13343
13344 2001-10-22  Ravi Pratap  <ravi@ximian.com>
13345
13346         * typemanager.cs (ImplementsInterface): New method to determine if a type
13347         implements a given interface. Provides a nice cache too.
13348
13349         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
13350         method.
13351
13352         (ConvertReferenceExplicit): Ditto.
13353
13354         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
13355         various methods, with correct names etc.
13356
13357         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
13358         Operator.UnaryNegation.
13359
13360         * cs-parser.jay (operator_declarator): Be a little clever in the case where
13361         we have a unary plus or minus operator.
13362
13363         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
13364         UnaryMinus.
13365
13366         * everywhere : update accordingly.
13367
13368         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
13369         respectively.
13370
13371         * class.cs (Method::Define): For the case where we are implementing a method
13372         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
13373         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
13374
13375 2001-10-21  Ravi Pratap  <ravi@ximian.com>
13376
13377         * interface.cs (FindMembers): Implement to work around S.R.E
13378         lameness.
13379
13380         * typemanager.cs (IsInterfaceType): Implement.
13381
13382         (FindMembers): Update to handle interface types too.
13383
13384         * expression.cs (ImplicitReferenceConversion): Re-write bits which
13385         use IsAssignableFrom as that is not correct - it doesn't work.
13386
13387         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
13388         and accordingly override EmitStatement.
13389
13390         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
13391         using the correct logic :-)
13392
13393 2001-10-19  Ravi Pratap  <ravi@ximian.com>
13394
13395         * ../errors/cs-11.cs : Add to demonstrate error -11 
13396
13397 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
13398
13399         * assign.cs (Assign::Resolve): Resolve right hand side first, and
13400         then pass this as a hint to ResolveLValue.
13401
13402         * expression.cs (FieldExpr): Add Location information
13403
13404         (FieldExpr::LValueResolve): Report assignment to readonly
13405         variable. 
13406
13407         (Expression::ExprClassFromMemberInfo): Pass location information.
13408
13409         (Expression::ResolveLValue): Add new method that resolves an
13410         LValue. 
13411
13412         (Expression::DoResolveLValue): Default invocation calls
13413         DoResolve. 
13414
13415         (Indexers): New class used to keep track of indexers in a given
13416         Type. 
13417
13418         (IStackStore): Renamed from LValue, as it did not really describe
13419         what this did.  Also ResolveLValue is gone from this interface and
13420         now is part of Expression.
13421
13422         (ElementAccess): Depending on the element access type
13423
13424         * typemanager.cs: Add `indexer_name_type' as a Core type
13425         (System.Runtime.CompilerServices.IndexerNameAttribute)
13426
13427         * statement.cs (Goto): Take a location.
13428
13429 2001-10-18  Ravi Pratap  <ravi@ximian.com>
13430
13431         * delegate.cs (Delegate::VerifyDelegate): New method to verify
13432         if two delegates are compatible.
13433
13434         (NewDelegate::DoResolve): Update to take care of the case when
13435         we instantiate a delegate from another delegate.
13436
13437         * typemanager.cs (FindMembers): Don't even try to look up members
13438         of Delegate types for now.
13439
13440 2001-10-18  Ravi Pratap  <ravi@ximian.com>
13441
13442         * delegate.cs (NewDelegate): New class to take care of delegate
13443         instantiation.
13444
13445         * expression.cs (New): Split the delegate related code out into 
13446         the NewDelegate class.
13447
13448         * delegate.cs (DelegateInvocation): New class to handle delegate 
13449         invocation.
13450
13451         * expression.cs (Invocation): Split out delegate related code into
13452         the DelegateInvocation class.
13453
13454 2001-10-17  Ravi Pratap  <ravi@ximian.com>
13455
13456         * expression.cs (New::DoResolve): Implement delegate creation fully
13457         and according to the spec.
13458
13459         (New::DoEmit): Update to handle delegates differently.
13460
13461         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
13462         because of which we were printing out arguments in reverse order !
13463
13464         * delegate.cs (VerifyMethod): Implement to check if the given method
13465         matches the delegate.
13466
13467         (FullDelegateDesc): Implement.
13468
13469         (VerifyApplicability): Implement.
13470
13471         * expression.cs (Invocation::DoResolve): Update to accordingly handle
13472         delegate invocations too.
13473
13474         (Invocation::Emit): Ditto.
13475
13476         * ../errors/cs1593.cs : Added.
13477
13478         * ../errors/cs1594.cs : Added.
13479
13480         * delegate.cs (InstanceExpression, TargetMethod): New properties.
13481
13482 2001-10-16  Ravi Pratap  <ravi@ximian.com>
13483
13484         * typemanager.cs (intptr_type): Core type for System.IntPtr
13485
13486         (InitCoreTypes): Update for the same.
13487
13488         (iasyncresult_type, asynccallback_type): Ditto.
13489
13490         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
13491         correct.
13492
13493         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
13494         too.
13495
13496         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
13497         the builders for the 4 members of a delegate type :-)
13498
13499         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
13500         type.
13501
13502         * expression.cs (New::DoResolve): Implement guts for delegate creation.
13503
13504         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
13505
13506 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
13507
13508         * statement.cs (Break::Emit): Implement.   
13509         (Continue::Emit): Implement.
13510
13511         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13512         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13513         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13514         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
13515         end loop
13516
13517         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
13518         properties that track the label for the current loop (begin of the
13519         loop and end of the loop).
13520
13521 2001-10-15  Ravi Pratap  <ravi@ximian.com>
13522
13523         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
13524         use of emitting anything at all.
13525
13526         * class.cs, rootcontext.cs : Get rid of calls to the same.
13527
13528         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
13529
13530         (Populate): Define the constructor correctly and set the implementation
13531         attributes.
13532
13533         * typemanager.cs (delegate_types): New hashtable to hold delegates that
13534         have been defined.
13535
13536         (AddDelegateType): Implement.
13537
13538         (IsDelegateType): Implement helper method.
13539
13540         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
13541
13542         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
13543         and accordingly handle it.
13544
13545         * delegate.cs (Populate): Take TypeContainer argument.
13546         Implement bits to define the Invoke method. However, I still haven't figured out
13547         how to take care of the native int bit :-(
13548
13549         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
13550         Qualify the name of the delegate, not its return type !
13551
13552         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
13553         conversion.
13554
13555         (StandardConversionExists): Checking for array types turns out to be recursive.
13556
13557         (ConvertReferenceExplicit): Implement array conversion.
13558
13559         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
13560
13561 2001-10-12  Ravi Pratap  <ravi@ximian.com>
13562
13563         * cs-parser.jay (delegate_declaration): Store the fully qualified
13564         name as it is a type declaration.
13565
13566         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
13567         readonly.
13568
13569         (DefineDelegate): Renamed from Define. Does the same thing essentially,
13570         as TypeContainer::DefineType.
13571
13572         (Populate): Method in which all the definition of the various methods (Invoke)
13573         etc is done.
13574
13575         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
13576         see.
13577
13578         (CloseDelegate): Finally creates the delegate.
13579
13580         * class.cs (TypeContainer::DefineType): Update to define delegates.
13581         (Populate, Emit and CloseType): Do the same thing here too.
13582
13583         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
13584         delegates in all these operations.
13585
13586 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
13587
13588         * expression.cs: LocalTemporary: a new expression used to
13589         reference a temporary that has been created.
13590
13591         * assign.cs: Handle PropertyAccess back here, so that we can
13592         provide the proper semantic access to properties.
13593
13594         * expression.cs (Expression::ConvertReferenceExplicit): Implement
13595         a few more explicit conversions. 
13596
13597         * modifiers.cs: `NEW' modifier maps to HideBySig.
13598
13599         * expression.cs (PropertyExpr): Make this into an
13600         ExpressionStatement, and support the EmitStatement code path. 
13601
13602         Perform get/set error checking, clean up the interface.
13603
13604         * assign.cs: recognize PropertyExprs as targets, and if so, turn
13605         them into toplevel access objects.
13606
13607 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
13608
13609         * expression.cs: PropertyExpr::PropertyExpr: use work around the
13610         SRE.
13611
13612         * typemanager.cs: Keep track here of our PropertyBuilders again to
13613         work around lameness in SRE.
13614
13615 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
13616
13617         * expression.cs (LValue::LValueResolve): New method in the
13618         interface, used to perform a second resolution pass for LValues. 
13619
13620         (This::DoResolve): Catch the use of this in static methods.
13621
13622         (This::LValueResolve): Implement.
13623
13624         (This::Store): Remove warning, assigning to `this' in structures
13625         is 
13626
13627         (Invocation::Emit): Deal with invocation of
13628         methods on value types.  We need to pass the address to structure
13629         methods rather than the object itself.  (The equivalent code to
13630         emit "this" for structures leaves the entire structure on the
13631         stack instead of a pointer to it). 
13632
13633         (ParameterReference::DoResolve): Compute the real index for the
13634         argument based on whether the method takes or not a `this' pointer
13635         (ie, the method is static).
13636
13637         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
13638         value types returned from functions when we need to invoke a
13639         method on the sturcture.
13640
13641
13642 2001-10-11  Ravi Pratap  <ravi@ximian.com>
13643
13644         * class.cs (TypeContainer::DefineType): Method to actually do the business of
13645         defining the type in the Modulebuilder or Typebuilder. This is to take
13646         care of nested types which need to be defined on the TypeBuilder using
13647         DefineNestedMethod.
13648
13649         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
13650         methods in RootContext, only ported to be part of TypeContainer.
13651
13652         (TypeContainer::GetInterfaceOrClass): Ditto.
13653
13654         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
13655
13656         * interface.cs (Interface::DefineInterface): New method. Does exactly
13657         what RootContext.CreateInterface did earlier, only it takes care of nested types 
13658         too.
13659
13660         (Interface::GetInterfaces): Move from RootContext here and port.
13661
13662         (Interface::GetInterfaceByName): Same here.
13663
13664         * rootcontext.cs (ResolveTree): Re-write.
13665
13666         (PopulateTypes): Re-write.
13667
13668         * class.cs (TypeContainer::Populate): Populate nested types too.
13669         (TypeContainer::Emit): Emit nested members too.
13670
13671         * typemanager.cs (AddUserType): Do not make use of the FullName property,
13672         instead just use the name argument passed in as it is already fully
13673         qualified.
13674
13675         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
13676         to TypeContainer mapping to see if a type is user-defined.
13677
13678         * class.cs (TypeContainer::CloseType): Implement. 
13679
13680         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
13681         the default constructor.
13682
13683         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
13684         twice.
13685
13686         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
13687
13688         * interface.cs (CloseType): Create the type here.
13689
13690         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
13691         the hierarchy.
13692
13693         Remove all the methods which are now in TypeContainer.
13694
13695 2001-10-10  Ravi Pratap  <ravi@ximian.com>
13696
13697         * delegate.cs (Define): Re-write bits to define the delegate
13698         correctly.
13699
13700 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
13701
13702         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
13703
13704         * expression.cs (ImplicitReferenceConversion): handle null as well
13705         as a source to convert to any reference type.
13706
13707         * statement.cs (Return): Perform any implicit conversions to
13708         expected return type.  
13709
13710         Validate use of return statement.  
13711
13712         * codegen.cs (EmitContext): Pass the expected return type here.
13713
13714         * class.cs (Method, Constructor, Property): Pass expected return
13715         type to EmitContext.
13716
13717 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
13718
13719         * expression.cs: Make DoResolve take an EmitContext instead of a
13720         TypeContainer.
13721
13722         Replaced `l' and `location' for `loc', for consistency.
13723
13724         (Error, Warning): Remove unneeded Tc argument.
13725
13726         * assign.cs, literal.cs, constant.cs: Update to new calling
13727         convention. 
13728
13729         * codegen.cs: EmitContext now contains a flag indicating whether
13730         code is being generated in a static method or not.
13731
13732         * cs-parser.jay: DecomposeQI, new function that replaces the old
13733         QualifiedIdentifier.  Now we always decompose the assembled
13734         strings from qualified_identifier productions into a group of
13735         memberaccesses.
13736
13737 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
13738
13739         * rootcontext.cs: Deal with field-less struct types correctly now
13740         by passing the size option to Define Type.
13741
13742         * class.cs: Removed hack that created one static field. 
13743
13744 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13745
13746         * statement.cs: Moved most of the code generation here. 
13747
13748 2001-10-09  Ravi Pratap  <ravi@ximian.com>
13749
13750         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
13751         seem very right.
13752
13753         (ElementAccess): Remove useless bits for now - keep checks as the spec
13754         says.
13755
13756 2001-10-08  Ravi Pratap  <ravi@ximian.com>
13757
13758         * expression.cs (ElementAccess::DoResolve): Remove my crap code
13759         and start performing checks according to the spec.
13760
13761 2001-10-07  Ravi Pratap  <ravi@ximian.com>
13762
13763         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
13764         rank_specifiers instead.
13765
13766         (rank_specifiers): Change the order in which the rank specifiers are stored
13767
13768         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
13769
13770         * expression.cs (ElementAccess): Implement the LValue interface too.
13771
13772 2001-10-06  Ravi Pratap  <ravi@ximian.com>
13773
13774         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
13775         except that user defined conversions are not included.
13776
13777         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
13778         perform the conversion of the return type, if necessary.
13779
13780         (New::DoResolve): Check whether we are creating an array or an object
13781         and accordingly do the needful.
13782
13783         (New::Emit): Same here.
13784
13785         (New::DoResolve): Implement guts of array creation.
13786
13787         (New::FormLookupType): Helper function.
13788
13789 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13790
13791         * codegen.cs: Removed most of the code generation here, and move the
13792         corresponding code generation bits to the statement classes. 
13793
13794         Added support for try/catch/finalize and throw.
13795
13796         * cs-parser.jay: Added support for try/catch/finalize.
13797
13798         * class.cs: Catch static methods having the flags override,
13799         virtual or abstract.
13800
13801         * expression.cs (UserCast): This user cast was not really doing
13802         what it was supposed to do.  Which is to be born in fully resolved
13803         state.  Parts of the resolution were being performed at Emit time! 
13804
13805         Fixed this code.
13806
13807 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13808
13809         * expression.cs: Implicity convert the result from UserCast.
13810
13811 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13812
13813         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
13814         prevented it from working correctly. 
13815
13816         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
13817         merely ConvertImplicit.
13818
13819 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13820
13821         * typemanager.cs: Make the LookupTypeContainer function static,
13822         and not per-instance.  
13823
13824         * class.cs: Make static FindMembers (the one that takes a Type
13825         argument). 
13826
13827         * codegen.cs: Add EmitForeach here.
13828
13829         * cs-parser.jay: Make foreach a toplevel object instead of the
13830         inline expansion, as we need to perform semantic analysis on it. 
13831
13832 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13833
13834         * expression.cs (Expression::ImplicitUserConversion): Rename to
13835         UserDefinedConversion.
13836
13837         (Expression::UserDefinedConversion): Take an extra argument specifying 
13838         whether we look for explicit user conversions too.
13839
13840         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
13841
13842         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
13843
13844         (ExplicitUserConversion): Make it a call to UserDefinedConversion
13845         with the appropriate arguments.
13846
13847         * cs-parser.jay (cast_expression): Record location too.
13848
13849         * expression.cs (Cast): Record location info.
13850
13851         (Expression::ConvertExplicit): Take location argument.
13852
13853         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
13854         to determine if we are doing explicit conversions.
13855
13856         (UserCast::Emit): Update accordingly.
13857
13858         (Expression::ConvertExplicit): Report an error if everything fails.
13859
13860         * ../errors/cs0030.cs : Add.
13861
13862 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
13863
13864         * modifiers.cs: If the ABSTRACT keyword is present, also set the
13865         virtual and newslot bits. 
13866
13867         * class.cs (TypeContainer::RegisterRequiredImplementations):
13868         Record methods we need.
13869
13870         (TypeContainer::MakeKey): Helper function to make keys for
13871         MethodBases, since the Methodbase key is useless.
13872
13873         (TypeContainer::Populate): Call RegisterRequiredImplementations
13874         before defining the methods.   
13875
13876         Create a mapping for method_builders_to_methods ahead of time
13877         instead of inside a tight loop.
13878
13879         (::RequireMethods):  Accept an object as the data to set into the
13880         hashtable so we can report interface vs abstract method mismatch.
13881
13882 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13883
13884         * report.cs: Make all of it static.
13885
13886         * rootcontext.cs: Drop object_type and value_type computations, as
13887         we have those in the TypeManager anyways.
13888
13889         Drop report instance variable too, now it is a global.
13890
13891         * driver.cs: Use try/catch on command line handling.
13892
13893         Add --probe option to debug the error reporting system with a test
13894         suite. 
13895
13896         * report.cs: Add support for exiting program when a probe
13897         condition is reached.
13898
13899 2001-10-03  Ravi Pratap  <ravi@ximian.com>
13900
13901         * expression.cs (Binary::DoNumericPromotions): Fix the case when
13902         we do a forcible conversion regardless of type, to check if 
13903         ForceConversion returns a null.
13904
13905         (Binary::error19): Use location to report error.
13906
13907         (Unary::error23): Use location here too.
13908
13909         * ../errors/cs0019.cs : Check in.
13910
13911         * ../errors/cs0023.cs : Check in.
13912
13913         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
13914         case of a non-null MethodInfo object with a length of 0 !
13915
13916         (Binary::ResolveOperator): Flag error if overload resolution fails to find
13917         an applicable member - according to the spec :-)
13918         Also fix logic to find members in base types.
13919
13920         (Unary::ResolveOperator): Same here.
13921
13922         (Unary::report23): Change name to error23 and make first argument a TypeContainer
13923         as I was getting thoroughly confused between this and error19 :-)
13924
13925         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
13926         (::FindMostEncompassedType): Implement.
13927         (::FindMostEncompassingType): Implement.
13928         (::StandardConversionExists): Implement.
13929
13930         (UserImplicitCast): Re-vamp. We now need info about most specific
13931         source and target types so that we can do the necessary conversions.
13932
13933         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
13934         mathematical union with no duplicates.
13935
13936 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13937
13938         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
13939         in order from base classes to child classes, so that we can in
13940         child classes look up in our parent for method names and
13941         attributes (required for handling abstract, virtual, new, override
13942         constructs: we need to instrospect our base class, and if we dont
13943         populate the classes in order, the introspection might be
13944         incorrect.  For example, a method could query its parent before
13945         the parent has any methods and would determine that the parent has
13946         no abstract methods (while it could have had them)).
13947
13948         (RootContext::CreateType): Record the order in which we define the
13949         classes.
13950
13951 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
13952
13953         * class.cs (TypeContainer::Populate): Also method definitions can
13954         fail now, keep track of this.
13955
13956         (TypeContainer::FindMembers): Implement support for
13957         DeclaredOnly/noDeclaredOnly flag.
13958
13959         (Constructor::Emit) Return the ConstructorBuilder.
13960
13961         (Method::Emit) Return the MethodBuilder. 
13962         Check for abstract or virtual methods to be public.
13963
13964         * rootcontext.cs (RootContext::CreateType): Register all the
13965         abstract methods required for the class to be complete and the
13966         interface methods that must be implemented. 
13967
13968         * cs-parser.jay: Report error 501 (method requires body if it is
13969         not marked abstract or extern).
13970
13971         * expression.cs (TypeOf::Emit): Implement.
13972
13973         * typemanager.cs: runtime_handle_type, new global type.
13974
13975         * class.cs (Property::Emit): Generate code for properties.
13976
13977 2001-10-02  Ravi Pratap  <ravi@ximian.com>
13978
13979         * expression.cs (Unary::ResolveOperator): Find operators on base type
13980         too - we now conform exactly to the spec.
13981
13982         (Binary::ResolveOperator): Same here.
13983
13984         * class.cs (Operator::Define): Fix minor quirk in the tests.
13985
13986         * ../errors/cs0215.cs : Added.
13987
13988         * ../errors/cs0556.cs : Added.
13989
13990         * ../errors/cs0555.cs : Added.
13991
13992 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
13993
13994         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
13995         single integer which is really efficient
13996
13997 2001-10-01  Ravi Pratap  <ravi@ximian.com>
13998
13999         *  expression.cs (Expression::ImplicitUserConversion): Use location
14000         even in the case when we are examining True operators.
14001  
14002         * class.cs (Operator::Define): Perform extensive checks to conform
14003         with the rules for operator overloading in the spec.
14004
14005         * expression.cs (Expression::ImplicitReferenceConversion): Implement
14006         some of the other conversions mentioned in the spec.
14007
14008         * typemanager.cs (array_type): New static member for the System.Array built-in
14009         type.
14010
14011         (cloneable_interface): For System.ICloneable interface.
14012
14013         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
14014         we start resolving the tree and populating types.
14015
14016         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
14017  
14018 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14019
14020         * expression.cs (Expression::ExprClassFromMemberInfo,
14021         Expression::Literalize): Create literal expressions from
14022         FieldInfos which are literals.
14023
14024         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
14025         type casts, because they were wrong.  The test suite in tests
14026         caught these ones.
14027
14028         (ImplicitNumericConversion): ushort to ulong requires a widening
14029         cast. 
14030
14031         Int32 constant to long requires widening cast as well.
14032
14033         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
14034         for integers because the type on the stack is not i4.
14035
14036 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
14037
14038         * expression.cs (report118): require location argument. 
14039
14040         * parameter.cs: Do not dereference potential null value.
14041
14042         * class.cs: Catch methods that lack the `new' keyword when
14043         overriding a name.  Report warnings when `new' is used without
14044         anything being there to override.
14045
14046         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
14047
14048         * class.cs: Only add constructor to hashtable if it is non-null
14049         (as now constructors can fail on define).
14050
14051         (TypeManager, Class, Struct): Take location arguments.
14052
14053         Catch field instance initialization in structs as errors.
14054
14055         accepting_filter: a new filter for FindMembers that is static so
14056         that we dont create an instance per invocation.
14057
14058         (Constructor::Define): Catch errors where a struct constructor is
14059         parameterless 
14060
14061         * cs-parser.jay: Pass location information for various new
14062         constructs. 
14063
14064         * delegate.cs (Delegate): take a location argument.
14065
14066         * driver.cs: Do not call EmitCode if there were problesm in the
14067         Definition of the types, as many Builders wont be there. 
14068
14069         * decl.cs (Decl::Decl): Require a location argument.
14070
14071         * cs-tokenizer.cs: Handle properly hex constants that can not fit
14072         into integers, and find the most appropiate integer for it.
14073
14074         * literal.cs: Implement ULongLiteral.
14075
14076         * rootcontext.cs: Provide better information about the location of
14077         failure when CreateType fails.
14078
14079 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
14080
14081         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
14082         as well.
14083
14084         * expression.cs (Binary::CheckShiftArguments): Add missing type
14085         computation.
14086         (Binary::ResolveOperator): Add type to the logical and and logical
14087         or, Bitwise And/Or and Exclusive Or code paths, it was missing
14088         before.
14089
14090         (Binary::DoNumericPromotions): In the case where either argument
14091         is ulong (and most signed types combined with ulong cause an
14092         error) perform implicit integer constant conversions as well.
14093
14094 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14095
14096         * expression.cs (UserImplicitCast): Method should always be
14097         non-null. 
14098         (Invocation::BetterConversion): Simplified test for IntLiteral.
14099
14100         (Expression::ImplicitNumericConversion): Split this routine out.
14101         Put the code that performs implicit constant integer conversions
14102         here. 
14103
14104         (Expression::Resolve): Become a wrapper around DoResolve so we can
14105         check eclass and type being set after resolve.
14106
14107         (Invocation::Badness): Remove this dead function
14108
14109         (Binary::ResolveOperator): Do not compute the expensive argumnets
14110         unless we have a union for it.
14111
14112         (Probe::Emit): Is needs to do an isinst and then
14113         compare against null.
14114
14115         (::CanConvert): Added Location argument.  If the Location argument
14116         is null (Location.Null), then we do not report errors.  This is
14117         used by the `probe' mechanism of the Explicit conversion.  We do
14118         not want to generate an error for something that the user
14119         explicitly requested to be casted.  But the pipeline for an
14120         explicit cast first tests for potential implicit casts.
14121
14122         So for now, if the Location is null, it means `Probe only' to
14123         avoid adding another argument.   Might have to revise this
14124         strategy later.
14125
14126         (ClassCast): New class used to type cast objects into arbitrary
14127         classes (used in Explicit Reference Conversions).
14128
14129         Implement `as' as well.
14130
14131         Reverted all the patches from Ravi below: they were broken:
14132
14133                 * The use of `level' as a mechanism to stop recursive
14134                   invocations is wrong.  That was there just to catch the
14135                   bug with a strack trace but not as a way of addressing
14136                   the problem.
14137
14138                   To fix the problem we have to *understand* what is going
14139                   on and the interactions and come up with a plan, not
14140                   just get things going.
14141
14142                 * The use of the type conversion cache that I proposed
14143                   last night had an open topic: How does this work across
14144                   protection domains.  A user defined conversion might not
14145                   be public in the location where we are applying the
14146                   conversion, a different conversion might be selected
14147                   (ie, private A->B (better) but public B->A (worse),
14148                   inside A, A->B applies, but outside it, B->A will
14149                   apply).
14150
14151                 * On top of that (ie, even if the above is solved),
14152                   conversions in a cache need to be abstract.  Ie, `To
14153                   convert from an Int to a Short use an OpcodeCast', not
14154                   `To convert from an Int to a Short use the OpcodeCast on
14155                   the variable 5' (which is what this patch was doing).
14156
14157 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14158
14159         * expression.cs (Invocation::ConversionExists): Re-write to use
14160         the conversion cache
14161
14162         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
14163         cache all conversions done, not just user-defined ones.
14164
14165         (Invocation::BetterConversion): The real culprit. Use ConversionExists
14166         to determine if a conversion exists instead of acutually trying to 
14167         perform the conversion. It's faster too.
14168
14169         (Expression::ConvertExplicit): Modify to use ConversionExists to check
14170         and only then attempt the implicit conversion.
14171
14172 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14173
14174         * expression.cs (ConvertImplicit): Use a cache for conversions
14175         already found. Check level of recursion and bail out if necessary.
14176
14177 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14178
14179         * typemanager.cs (string_concat_string_string, string_concat_object_object):
14180         Export standard methods that we expect for string operations.
14181
14182         * statement.cs (Block::UsageWarning): Track usage of variables and
14183         report the errors for not used variables.
14184
14185         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
14186         operator. 
14187
14188 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14189
14190         * codegen.cs: remove unnneded code 
14191
14192         * expression.cs: Removed BuiltinTypeAccess class
14193
14194         Fix the order in which implicit conversions are
14195         done.  
14196
14197         The previous fixed dropped support for boxed conversions (adding a
14198         test to the test suite now)
14199
14200         (UserImplicitCast::CanConvert): Remove test for source being null,
14201         that code is broken.  We should not feed a null to begin with, if
14202         we do, then we should track the bug where the problem originates
14203         and not try to cover it up here.
14204
14205         Return a resolved expression of type UserImplicitCast on success
14206         rather than true/false.  Ravi: this is what I was talking about,
14207         the pattern is to use a static method as a "constructor" for
14208         objects. 
14209
14210         Also, do not create arguments until the very last minute,
14211         otherwise we always create the arguments even for lookups that
14212         will never be performed. 
14213
14214         (UserImplicitCast::Resolve): Eliminate, objects of type
14215         UserImplicitCast are born in a fully resolved state. 
14216
14217         * typemanager.cs (InitCoreTypes): Init also value_type
14218         (System.ValueType). 
14219
14220         * expression.cs (Cast::Resolve): First resolve the child expression.
14221
14222         (LValue): Add new method AddressOf to be used by
14223         the `&' operator.  
14224
14225         Change the argument of Store to take an EmitContext instead of an
14226         ILGenerator, because things like FieldExpr need to be able to call
14227         their children expression to generate the instance code. 
14228
14229         (Expression::Error, Expression::Warning): Sugar functions for
14230         reporting errors.
14231
14232         (Expression::MemberLookup): Accept a TypeContainer instead of a
14233         Report as the first argument.
14234
14235         (Expression::ResolvePrimary): Killed.  I still want to improve
14236         this as currently the code is just not right.
14237
14238         (Expression::ResolveMemberAccess): Simplify, but it is still
14239         wrong. 
14240
14241         (Unary::Resolve): Catch errors in AddressOf operators.
14242
14243         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
14244         index to a byte for the short-version, or the compiler will choose
14245         the wrong Emit call, which generates the wrong data.
14246
14247         (ParameterReference::Emit, ::Store): same.
14248
14249         (FieldExpr::AddressOf): Implement.
14250
14251         * typemanager.cs: TypeManager: made public variable instead of
14252         property.
14253
14254         * driver.cs: document --fatal.
14255
14256         * report.cs (ErrorMessage, WarningMessage): new names for the old
14257         Error and Warning classes.
14258
14259         * cs-parser.jay (member_access): Turn built-in access to types
14260         into a normal simplename
14261
14262 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14263
14264         * expression.cs (Invocation::BetterConversion): Fix to cope
14265         with q being null, since this was introducing a bug.
14266
14267         * expression.cs (ConvertImplicit): Do built-in conversions first.
14268
14269 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14270
14271         * expression.cs (UserImplicitCast::Resolve): Fix bug.
14272
14273 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14274
14275         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
14276         I had introduced long ago (what's new ?).
14277
14278         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
14279         the work of all the checking. 
14280         (ConvertImplicit): Call CanConvert and only then create object if necessary.
14281         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
14282
14283         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
14284         that is the right way. 
14285
14286         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
14287         overloading resolution. Use everywhere instead of cutting and pasting code.
14288
14289         (Binary::ResolveOperator): Use MakeUnionSet.
14290
14291         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
14292         we have to convert to bool types. Not complete yet.
14293
14294 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14295
14296         * typemanager.cs (TypeManager::CSharpName): support ushort.
14297
14298         * expression.cs (Expression::TryImplicitIntConversion): Attempts
14299         to provide an expression that performsn an implicit constant int
14300         conversion (section 6.1.6).
14301         (Expression::ConvertImplicitRequired): Reworked to include
14302         implicit constant expression conversions.
14303
14304         (Expression::ConvertNumericExplicit): Finished.
14305
14306         (Invocation::Emit): If InstanceExpression is null, then it means
14307         that we perform a call on this.
14308
14309 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14310
14311         * expression.cs (Unary::Emit): Remove some dead code.
14312         (Probe): Implement Resolve and Emit for `is'.
14313         (Expression::ConvertImplicitRequired): Attempt to do constant
14314         expression conversions here.  Maybe should be moved to
14315         ConvertImplicit, but I am not sure.
14316         (Expression::ImplicitLongConstantConversionPossible,
14317         Expression::ImplicitIntConstantConversionPossible): New functions
14318         that tell whether is it possible to apply an implicit constant
14319         expression conversion.
14320
14321         (ConvertNumericExplicit): Started work on explicit numeric
14322         conversions.
14323
14324         * cs-parser.jay: Update operator constants.
14325
14326         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
14327         (Parameters::GetSignature): Hook up VerifyArgs here.
14328         (Parameters::VerifyArgs): Verifies that no two arguments have the
14329         same name. 
14330
14331         * class.cs (Operator): Update the operator names to reflect the
14332         ones that the spec expects (as we are just stringizing the
14333         operator names).
14334
14335         * expression.cs (Unary::ResolveOperator): Fix bug: Use
14336         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
14337         previous usage did only work for our methods.
14338         (Expression::ConvertImplicit): Handle decimal implicit numeric
14339         conversions as well.
14340         (Expression::InternalTypeConstructor): Used to invoke constructors
14341         on internal types for default promotions.
14342
14343         (Unary::Emit): Implement special handling for the pre/post
14344         increment/decrement for overloaded operators, as they need to have
14345         the same semantics as the other operators.
14346
14347         (Binary::ResolveOperator): ditto.
14348         (Invocation::ConversionExists): ditto.
14349         (UserImplicitCast::Resolve): ditto.
14350
14351 2001-09-26  Ravi Pratap  <ravi@ximian.com>
14352
14353         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
14354         operator, return after emitting body. Regression tests pass again !
14355
14356         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
14357         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
14358         (Invocation::OverloadResolve): Ditto.
14359         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
14360
14361         * everywhere : update calls to the above methods accordingly.
14362
14363 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14364
14365         * assign.cs (Assign): Make it inherit from ExpressionStatement.
14366
14367         * expression.cs (ExpressionStatement): New base class used for
14368         expressions that can appear in statements, so that we can provide
14369         an alternate path to generate expression that do not leave a value
14370         on the stack.
14371
14372         (Expression::Emit, and all the derivatives): We no longer return
14373         whether a value is left on the stack or not.  Every expression
14374         after being emitted leaves a single value on the stack.
14375
14376         * codegen.cs (EmitContext::EmitStatementExpression): Use the
14377         facilties of ExpressionStatement if possible.
14378
14379         * cs-parser.jay: Update statement_expression.
14380
14381 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
14382
14383         * driver.cs: Change the wording of message
14384
14385 2001-09-25  Ravi Pratap  <ravi@ximian.com>
14386
14387         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
14388         the type of the expression to the return type of the method if
14389         we have an overloaded operator match ! The regression tests pass again !
14390         (Unary::ResolveOperator): Ditto.
14391
14392         * expression.cs (Invocation::ConversionExists): Correct the member lookup
14393         to find "op_Implicit", not "implicit" ;-)
14394         (UserImplicitCast): New class to take care of user-defined implicit conversions.
14395         (ConvertImplicit, ForceConversion): Take TypeContainer argument
14396
14397         * everywhere : Correct calls to the above accordingly.
14398
14399         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
14400         (ConvertImplicit): Do user-defined conversion if it exists.
14401
14402 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
14403
14404         * assign.cs: track location.
14405         (Resolve): Use implicit conversions on assignment.
14406
14407         * literal.cs: Oops.  Not good, Emit of short access values should
14408         pass (Bytes) or the wrong argument will be selected.
14409
14410         * expression.cs (Unary::Emit): Emit code for -expr.
14411
14412         (Unary::ResolveOperator): Handle `Substract' for non-constants
14413         (substract from zero from the non-constants).
14414         Deal with Doubles as well. 
14415
14416         (Expression::ConvertImplicitRequired): New routine that reports an
14417         error if no implicit conversion exists. 
14418
14419         (Invocation::OverloadResolve): Store the converted implicit
14420         expressions if we make them
14421
14422 2001-09-24  Ravi Pratap  <ravi@ximian.com>
14423
14424         * class.cs (ConstructorInitializer): Take a Location argument.
14425         (ConstructorBaseInitializer): Same here.
14426         (ConstructorThisInitializer): Same here.
14427
14428         * cs-parser.jay : Update all calls accordingly.
14429
14430         * expression.cs (Unary, Binary, New): Take location argument.
14431         Update accordingly everywhere.
14432
14433         * cs-parser.jay : Update all calls to the above to take a location
14434         argument.
14435
14436         * class.cs : Ditto.
14437
14438 2001-09-24  Ravi Pratap  <ravi@ximian.com>
14439
14440         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
14441         (Invocation::BetterConversion): Same here
14442         (Invocation::ConversionExists): Ditto.
14443
14444         (Invocation::ConversionExists): Implement.
14445
14446 2001-09-22  Ravi Pratap  <ravi@ximian.com>
14447
14448         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
14449         Also take an additional TypeContainer argument.
14450
14451         * All over : Pass in TypeContainer as argument to OverloadResolve.
14452
14453         * typemanager.cs (CSharpName): Update to check for the string type and return
14454         that too.
14455
14456         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
14457         a given method.
14458
14459 2001-09-21  Ravi Pratap  <ravi@ximian.com>
14460
14461         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
14462         (Invocation::BetterFunction): Implement.
14463         (Invocation::BetterConversion): Implement.
14464         (Invocation::ConversionExists): Skeleton, no implementation yet.
14465
14466         Okay, things work fine !
14467
14468 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
14469
14470         * typemanager.cs: declare and load enum_type, delegate_type and
14471         void_type. 
14472
14473         * expression.cs (Expression::Emit): Now emit returns a value that
14474         tells whether a value is left on the stack or not.  This strategy
14475         might be reveted tomorrow with a mechanism that would address
14476         multiple assignments.
14477         (Expression::report118): Utility routine to report mismatches on
14478         the ExprClass.
14479
14480         (Unary::Report23): Report impossible type/operator combination
14481         utility function.
14482
14483         (Unary::IsIncrementableNumber): Whether the type can be
14484         incremented or decremented with add.
14485         (Unary::ResolveOperator): Also allow enumerations to be bitwise
14486         complemented. 
14487         (Unary::ResolveOperator): Implement ++, !, ~,
14488
14489         (Invocation::Emit): Deal with new Emit convetion.
14490
14491         * All Expression derivatives: Updated their Emit method to return
14492         whether they leave values on the stack or not.
14493
14494         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
14495         stack for expressions that are statements. 
14496
14497 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
14498
14499         * expression.cs (LValue): New interface.  Must be implemented by
14500         LValue objects.
14501         (LocalVariableReference, ParameterReference, FieldExpr): Implement
14502         LValue interface.
14503
14504         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
14505         interface for generating code, simplifies the code.
14506
14507 2001-09-20  Ravi Pratap  <ravi@ximian.com>
14508
14509         * expression.cs (everywhere): Comment out return statements in ::Resolve
14510         methods to avoid the warnings.
14511
14512 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
14513
14514         * driver.cs (parse): Report error 2001 if we can not open the
14515         source file.
14516
14517         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
14518         not resolve it.
14519
14520         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
14521         object. 
14522
14523         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
14524         otherwise nested blocks end up with the same index.
14525
14526         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
14527
14528         * expression.cs:  Instead of having FIXMEs in the Resolve
14529         functions, throw exceptions so it is obvious that we are facing a
14530         bug. 
14531
14532         * cs-parser.jay (invocation_expression): Pass Location information.
14533
14534         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
14535         Use a basename for those routines because .NET does not like paths
14536         on them. 
14537
14538         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
14539         already defined.
14540
14541 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
14542
14543         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
14544         are loading the correct data types (throws an exception if not).
14545         (TypeManager::InitCoreTypes): Use CoreLookupType
14546
14547         * expression.cs (Unary::ResolveOperator): return the child
14548         expression for expressions which are just +expr.
14549         (Unary::ResolveOperator): Return negative literals for -LITERAL
14550         expressions (otherwise they are Unary {Literal}).
14551         (Invocation::Badness): Take into account `Implicit constant
14552         expression conversions'.
14553
14554         * literal.cs (LongLiteral): Implement long literal class.
14555         (IntLiteral): export the `Value' of the intliteral. 
14556
14557 2001-09-19  Ravi Pratap  <ravi@ximian.com>
14558
14559         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
14560
14561         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
14562         instead of 'Operator'
14563
14564         * expression.cs (Binary::ResolveOperator): Update accordingly.
14565         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
14566         and 'Minus'
14567
14568         * cs-parser.jay (unary_expression): Update to use the new names.
14569
14570         * gen-treedump.cs (GetUnary): Same here.
14571
14572         * expression.cs (Unary::Resolve): Implement.
14573         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
14574         operators are found instead of making noise ;-)
14575         (Unary::ResolveOperator): New method to do precisely the same thing which
14576         Binary::ResolveOperator does for Binary expressions.
14577         (Unary.method, .Arguments): Add.
14578         (Unary::OperName): Implement.   
14579         (Unary::ForceConversion): Copy and Paste !
14580
14581         * class.cs (Operator::Define): Fix a small bug for the case when we have 
14582         a unary operator.
14583
14584         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
14585         for the inbuilt operators. Only overloading works for now ;-)
14586
14587 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
14588
14589         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
14590         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
14591
14592         * expression.cs (This::Emit): Implement. 
14593         (This::Resolve): Implement.
14594         (TypeOf:Resolve): Implement.
14595         (Expression::ResolveSimpleName): Add an implicit this to instance
14596         field references. 
14597         (MemberAccess::Resolve): Deal with Parameters and Fields. 
14598         Bind instance variable to Field expressions.
14599         (FieldExpr::Instance): New field used to track the expression that
14600         represents the object instance.
14601         (FieldExpr::Resolve): Track potential errors from MemberLookup not
14602         binding 
14603         (FieldExpr::Emit): Implement.
14604
14605         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
14606         the last instruction contains a return opcode to avoid generating
14607         the last `ret' instruction (this generates correct code, and it is
14608         nice to pass the peverify output).
14609
14610         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
14611         initializer for static and instance variables.
14612         (Constructor::Emit): Allow initializer to be null in the case of
14613         static constructors.  Only emit initializer for instance
14614         constructors. 
14615
14616         (TypeContainer::FindMembers): Return a null array if there are no
14617         matches.
14618
14619         Also fix the code for the MemberTypes.Method branch, as it was not
14620         scanning that for operators (or tried to access null variables before).
14621
14622         * assign.cs (Assign::Emit): Handle instance and static fields. 
14623
14624         * TODO: Updated.
14625
14626         * driver.cs: Stop compilation if there are parse errors.
14627
14628         * cs-parser.jay (constructor_declaration): Provide default base
14629         initializer for non-static constructors.
14630         (constructor_declarator): Do not provide a default base
14631         initializers if none was specified.
14632         Catch the fact that constructors should not have parameters.
14633
14634         * class.cs: Do not emit parent class initializers for static
14635         constructors, that should be flagged as an error.
14636
14637 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14638
14639         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
14640         Move back code into TypeContainer::Populate.
14641
14642 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14643
14644         * class.cs (TypeContainer::AddConstructor): Fix the check to
14645         compare against Name, not Basename. 
14646         (Operator::OpType): Change Plus and Minus to Add and Subtract.
14647
14648         * cs-parser.jay : Update accordingly.
14649
14650         * class.cs (TypeContainer::FindMembers): For the case where we are searching
14651         for methods, don't forget to look into the operators too.
14652         (RegisterMethodBuilder): Helper method to take care of this for
14653         methods, constructors and operators.
14654         (Operator::Define): Completely revamp.
14655         (Operator.OperatorMethod, MethodName): New fields.
14656         (TypeContainer::Populate): Move the registering of builders into
14657         RegisterMethodBuilder.
14658         (Operator::Emit): Re-write.
14659
14660         * expression.cs (Binary::Emit): Comment out code path to emit method
14661         invocation stuff for the case when we have a user defined operator. I am
14662         just not able to get it right !
14663
14664 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14665
14666         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
14667         argument. 
14668
14669         (Expression::MemberLookup): Provide a version that allows to
14670         specify the MemberTypes and BindingFlags. 
14671
14672         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
14673         so it was not fetching variable information from outer blocks.
14674
14675         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
14676         Beforefieldinit as it was buggy.
14677
14678         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
14679         that Ravi put here.  
14680
14681         * class.cs (Constructor::Emit): Only emit if block is not null.
14682         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
14683         deal with this by semantically definining it as if the user had
14684         done it.
14685
14686         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
14687         constructors as we now "emit" them at a higher level.
14688
14689         (TypeContainer::DefineDefaultConstructor): Used to define the
14690         default constructors if none was provided.
14691
14692         (ConstructorInitializer): Add methods Resolve and Emit. 
14693
14694         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
14695
14696 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14697
14698         * class.cs (TypeContainer::EmitDefaultConstructor): Register
14699         the default constructor builder with our hashtable for methodbuilders
14700         to methodcores.
14701
14702         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
14703         and argument_count is 0 in which case we have a match.
14704         (Binary::ResolveOperator): More null checking and miscellaneous coding
14705         style cleanup.
14706
14707 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14708
14709         * rootcontext.cs (IsNameSpace): Compare against null.
14710
14711         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
14712
14713         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
14714         and Unary::Operator.
14715
14716         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
14717         accordingly.
14718
14719         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
14720         we have overloaded operators.
14721         (Binary::ResolveOperator): Implement the part which does the operator overload
14722         resolution.
14723
14724         * class.cs (Operator::Emit): Implement.
14725         (TypeContainer::Emit): Emit the operators we have too.
14726
14727         * expression.cs (Binary::Emit): Update to emit the appropriate code for
14728         the case when we have a user-defined operator.
14729
14730 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14731
14732         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
14733
14734 2001-09-16  Ravi Pratap  <ravi@ximian.com>
14735
14736         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
14737         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
14738         (Constructor::Emit): Implement.
14739         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
14740         if we have no work to do. 
14741         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
14742         Emit method.
14743
14744         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
14745         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
14746
14747         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
14748         of parent.parent.
14749
14750 2001-09-15  Ravi Pratap  <ravi@ximian.com>
14751
14752         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
14753         in the source.
14754         (Tree::RecordNamespace): Method to do what the name says ;-)
14755         (Tree::Namespaces): Property to get at the namespaces hashtable.
14756
14757         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
14758         keep track.
14759
14760         * rootcontext.cs (IsNamespace): Fixed it :-)
14761
14762 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14763
14764         * class.cs (TypeContainer::FindMembers): Add support for
14765         constructors. 
14766         (MethodCore): New class that encapsulates both the shared aspects
14767         of a Constructor and a Method.  
14768         (Method, Constructor): Factored pieces into MethodCore.
14769
14770         * driver.cs: Added --fatal which makes errors throw exceptions.
14771         Load System assembly as well as part of the standard library.
14772
14773         * report.cs: Allow throwing exceptions on errors for debugging.
14774
14775         * modifiers.cs: Do not use `parent', instead use the real type
14776         container to evaluate permission settings.
14777
14778         * class.cs: Put Ravi's patch back in.  He is right, and we will
14779         have to cope with the
14780
14781 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14782
14783         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
14784         FamORAssem, not FamANDAssem.
14785
14786 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14787
14788         * driver.cs: Added --parse option that only parses its input files
14789         and terminates.
14790
14791         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
14792         incorrect.  IsTopLevel is not used to tell whether an object is
14793         root_types or not (that can be achieved by testing this ==
14794         root_types).  But to see if this is a top-level *class* (not
14795         necessarly our "toplevel" container). 
14796
14797 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14798
14799         * enum.cs (Enum::Define): Modify to call the Lookup method on the
14800         parent instead of a direct call to GetType.
14801
14802 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14803
14804         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
14805         Modifiers.TypeAttr. This should just be a call to that method.
14806
14807         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
14808         object so that we can determine if we are top-level or not.
14809
14810         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
14811         TypeContainer too.
14812
14813         * enum.cs (Enum::Define): Ditto.
14814
14815         * modifiers.cs (FieldAttr): Re-write.
14816
14817         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
14818         (TypeContainer::HaveStaticConstructor): New property to provide access
14819         to precisely that info.
14820
14821         * modifiers.cs (MethodAttr): Re-write.
14822         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
14823
14824         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
14825         of top-level types as claimed.
14826
14827 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14828
14829         * expression.cs (MemberLookup): Fruitless attempt to lookup
14830         constructors.  Maybe I need to emit default constructors?  That
14831         might be it (currently .NET emits this for me automatically).
14832         (Invocation::OverloadResolve): Cope with Arguments == null.
14833         (Invocation::EmitArguments): new function, shared by the new
14834         constructor and us.
14835         (Invocation::Emit): Handle static and instance methods.  Emit
14836         proper call instruction for virtual or non-virtual invocations.
14837         (New::Emit): Implement.
14838         (New::Resolve): Implement.
14839         (MemberAccess:Resolve): Implement.
14840         (MethodGroupExpr::InstanceExpression): used conforming to the spec
14841         to track instances.
14842         (FieldExpr::Resolve): Set type.
14843
14844         * support.cs: Handle empty arguments.
14845                 
14846         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
14847         SimpleLookup): Auxiliary routines to help parse a qualifier
14848         identifier.  
14849
14850         Update qualifier_identifier rule.
14851
14852         * codegen.cs: Removed debugging messages.
14853
14854         * class.cs: Make this a global thing, this acts just as a "key" to
14855         objects that we might have around.
14856
14857         (Populate): Only initialize method_builders_to_methods once.
14858
14859         * expression.cs (PropertyExpr): Initialize type from the
14860         PropertyType. 
14861
14862         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
14863         Resolve pattern.  Attempt to implicitly convert value to boolean.
14864         Emit code.
14865
14866         * expression.cs: Set the type for the int32/int32 argument case.
14867         (Binary::ResolveOperator): Set the return type to boolean for
14868         comparission operators
14869
14870         * typemanager.cs: Remove debugging print code.
14871
14872         (Invocation::Resolve): resolve type.
14873
14874         * class.cs: Allocate a MemberInfo of the correct size, as the code
14875         elsewhere depends on the test to reflect the correct contents.
14876
14877         (Method::) Keep track of parameters, due to System.Reflection holes
14878
14879         (TypeContainer::Populate): Keep track of MethodBuilders to Method
14880         mapping here.
14881
14882         (TypeContainer::FindMembers): Use ArrayList and then copy an array
14883         of the exact size and return that.
14884
14885         (Class::LookupMethodByBuilder): New function that maps
14886         MethodBuilders to its methods.  Required to locate the information
14887         on methods because System.Reflection bit us again.
14888
14889         * support.cs: New file, contains an interface ParameterData and
14890         two implementations: ReflectionParameters and InternalParameters
14891         used to access Parameter information.  We will need to grow this
14892         as required.
14893
14894         * expression.cs (Invocation::GetParameterData): implement a cache
14895         and a wrapper around the ParameterData creation for methods. 
14896         (Invocation::OverloadResolve): Use new code.
14897
14898 2001-09-13  Ravi Pratap  <ravi@ximian.com>
14899
14900         * class.cs (TypeContainer::EmitField): Remove and move into 
14901         (Field::Define): here and modify accordingly.
14902         (Field.FieldBuilder): New member.
14903         (TypeContainer::Populate): Update accordingly.
14904         (TypeContainer::FindMembers): Implement.
14905
14906 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14907
14908         * statement.cs: (VariableInfo::VariableType): New field to be
14909         initialized with the full type once it is resolved. 
14910
14911 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
14912
14913         * parameter.cs (GetParameterInfo): Use a type cache to compute
14914         things only once, and to reuse this information
14915
14916         * expression.cs (LocalVariableReference::Emit): Implement.
14917         (OpcodeCast::Emit): fix.
14918
14919         (ParameterReference::Resolve): Implement.
14920         (ParameterReference::Emit): Implement.
14921
14922         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
14923         that are expressions need to stay as Expressions.
14924
14925         * typemanager.cs (CSharpName): Returns the C# name of a type if
14926         possible. 
14927
14928         * expression.cs (Expression::ConvertImplicit): New function that
14929         implements implicit type conversions.
14930
14931         (Expression::ImplicitReferenceConversion): Implements implicit
14932         reference conversions.
14933
14934         (EmptyCast): New type for transparent casts.
14935
14936         (OpcodeCast): New type for casts of types that are performed with
14937         a sequence of bytecodes.
14938
14939         (BoxedCast): New type used for casting value types into reference
14940         types.  Emits a box opcode.
14941
14942         (Binary::DoNumericPromotions): Implements numeric promotions of
14943         and computation of the Binary::Type.
14944
14945         (Binary::EmitBranchable): Optimization.
14946
14947         (Binary::Emit): Implement code emission for expressions.
14948
14949         * typemanager.cs (TypeManager): Added two new core types: sbyte
14950         and byte.
14951
14952 2001-09-12  Ravi Pratap  <ravi@ximian.com>
14953
14954         * class.cs (TypeContainer::FindMembers): Method which does exactly
14955         what Type.FindMembers does, only we don't have to use reflection. No
14956         implementation yet.
14957
14958         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
14959         typecontainer objects as we need to get at them.
14960         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
14961
14962         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
14963         typecontainer object.
14964
14965         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
14966         of just a Report object.
14967
14968 2001-09-11  Ravi Pratap  <ravi@ximian.com>
14969
14970         * class.cs (Event::Define): Go back to using the prefixes "add_" and
14971         "remove_"
14972         (TypeContainer::Populate): Now define the delegates of the type too.
14973         (TypeContainer.Delegates): Property to access the list of delegates defined
14974         in the type.
14975
14976         * delegates.cs (Delegate::Define): Implement partially.
14977
14978         * modifiers.cs (TypeAttr): Handle more flags.
14979
14980 2001-09-11  Ravi Pratap  <ravi@ximian.com>
14981
14982         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
14983         and not <=
14984         (Operator::Define): Re-write logic to get types by using the LookupType method
14985         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
14986         (Indexer::Define): Ditto.
14987         (Event::Define): Ditto.
14988         (Property::Define): Ditto.
14989
14990 2001-09-10  Ravi Pratap  <ravi@ximian.com>
14991
14992         * class.cs (TypeContainer::Populate): Now define operators too. 
14993         (TypeContainer.Operators): New property to access the list of operators
14994         in a type.
14995         (Operator.OperatorMethodBuilder): New member to hold the method builder
14996         for the operator we are defining.
14997         (Operator::Define): Implement.
14998
14999 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15000
15001         * class.cs (Event::Define): Make the prefixes of the accessor methods
15002         addOn_ and removeOn_ 
15003
15004         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
15005         of the location being passed in too. Ideally, this should go later since all
15006         error reporting should be done through the Report object.
15007
15008         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
15009         (Populate): Iterate thru the indexers we have and define them too.
15010         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
15011         for the get and set accessors.
15012         (Indexer::Define): Implement.
15013
15014 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
15015
15016         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
15017         my previous implementation, did not work.
15018
15019         * typemanager.cs: Add a couple of missing types (the longs).
15020
15021         * literal.cs: Use TypeManager.bool_type instead of getting it.
15022
15023         * expression.cs (EventExpr): New kind of expressions.
15024         (Expressio::ExprClassFromMemberInfo): finish
15025
15026 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
15027
15028         * assign.cs: Emit stores to static fields differently.
15029
15030 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15031
15032         * Merge in changes and adjust code to tackle conflicts. Backed out my
15033         code in Assign::Resolve ;-) 
15034
15035 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15036
15037         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
15038         instead Report.Error and also pass in the location.
15039         (CSharpParser::Lexer): New readonly property to return the reference
15040         to the Tokenizer object.
15041         (declare_local_variables): Use Report.Error with location instead of plain 
15042         old error.
15043         (CheckDef): Ditto.
15044
15045         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
15046         (Operator.CheckBinaryOperator): Ditto.
15047
15048         * cs-parser.jay (operator_declarator): Update accordingly.
15049
15050         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
15051         (CheckBinaryOperator): Same here.
15052
15053         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
15054         on the name without any prefixes of namespace names etc. This is because we
15055         already might have something already fully qualified like 
15056         'System.Console.WriteLine'
15057
15058         * assign.cs (Resolve): Begin implementation. Stuck ;-)
15059
15060 2001-09-07  Ravi Pratap  <ravi@ximian.com>
15061
15062         * cs-tokenizer.cs (location): Return a string which also contains
15063         the file name.
15064
15065         * expression.cs (ElementAccess): New class for expressions of the
15066         type 'element access.'
15067         (BaseAccess): New class for expressions of the type 'base access.'
15068         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
15069         respectively.
15070
15071         * cs-parser.jay (element_access): Implement action.
15072         (base_access): Implement actions.
15073         (checked_expression, unchecked_expression): Implement.
15074
15075         * cs-parser.jay (local_variable_type): Correct and implement.
15076         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
15077
15078         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
15079
15080         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
15081         name and the specifiers.
15082
15083         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
15084
15085         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
15086         making them all public ;-)
15087
15088         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
15089         class anyways.
15090
15091 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
15092
15093         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
15094         PropertyExprs.
15095         (FieldExpr, PropertyExprs): New resolved expressions.
15096         (SimpleName::MemberStaticCheck): Perform static checks for access
15097         to non-static fields on static methods. Maybe this should be
15098         generalized for MemberAccesses. 
15099         (SimpleName::ResolveSimpleName): More work on simple name
15100         resolution. 
15101
15102         * cs-parser.jay (primary_expression/qualified_identifier): track
15103         the parameter index.
15104
15105         * codegen.cs (CodeGen::Save): Catch save exception, report error.
15106         (EmitContext::EmitBoolExpression): Chain to expression generation
15107         instead of temporary hack.
15108         (::EmitStatementExpression): Put generic expression code generation.
15109
15110         * assign.cs (Assign::Emit): Implement variable assignments to
15111         local variables, parameters and fields.
15112
15113 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
15114
15115         * statement.cs (Block::GetVariableInfo): New method, returns the
15116         VariableInfo for a variable name in a block.
15117         (Block::GetVariableType): Implement in terms of GetVariableInfo
15118
15119         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
15120         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
15121
15122 2001-09-06  Ravi Pratap  <ravi@ximian.com>
15123
15124         * cs-parser.jay (operator_declaration): Continue on my quest : update
15125         to take attributes argument.
15126         (event_declaration): Ditto.
15127         (enum_declaration): Ditto.
15128         (indexer_declaration): Ditto.
15129
15130         * class.cs (Operator::Operator): Update constructor accordingly.
15131         (Event::Event): Ditto.
15132
15133         * delegate.cs (Delegate::Delegate): Same here.
15134
15135         * enum.cs (Enum::Enum): Same here.
15136
15137 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15138
15139         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
15140
15141         * ../tests/cs0658.cs : New file to demonstrate error 0658.
15142
15143         * attribute.cs (Attributes): New class to encapsulate all attributes which were
15144         being passed around as an arraylist.
15145         (Attributes::AddAttribute): Method to add attribute sections.
15146
15147         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
15148         (struct_declaration): Update accordingly.
15149         (constant_declaration): Update.
15150         (field_declaration): Update.
15151         (method_header): Update.
15152         (fixed_parameter): Update.
15153         (parameter_array): Ditto.
15154         (property_declaration): Ditto.
15155         (destructor_declaration): Ditto.
15156
15157         * class.cs (Struct::Struct): Update constructors accordingly.
15158         (Class::Class): Ditto.
15159         (Field::Field): Ditto.
15160         (Method::Method): Ditto.
15161         (Property::Property): Ditto.
15162         (TypeContainer::OptAttribute): update property's return type.
15163
15164         * interface.cs (Interface.opt_attributes): New member.
15165         (Interface::Interface): Update to take the extra Attributes argument.
15166
15167         * parameter.cs (Parameter::Parameter): Ditto.
15168
15169         * constant.cs (Constant::Constant): Ditto.
15170
15171         * interface.cs (InterfaceMemberBase): New OptAttributes field.
15172         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
15173         the attributes as a parameter.
15174         (InterfaceProperty): Update constructor call.
15175         (InterfaceEvent): Ditto.
15176         (InterfaceMethod): Ditto.
15177         (InterfaceIndexer): Ditto.
15178
15179         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
15180         pass the attributes too.
15181         (interface_event_declaration): Ditto.
15182         (interface_property_declaration): Ditto.
15183         (interface_method_declaration): Ditto.
15184         (interface_declaration): Ditto.
15185
15186 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
15187
15188         * class.cs (Method::Define): Track the "static Main" definition to
15189         create an entry point. 
15190
15191         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
15192         EntryPoint if we find it. 
15193
15194         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
15195         (EmitContext::ig): Make this variable public.
15196
15197         * driver.cs: Make the default output file be the first file name
15198         with the .exe extension.  
15199
15200         Detect empty compilations
15201
15202         Handle various kinds of output targets.  Handle --target and
15203         rename -t to --dumper.
15204
15205         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
15206         methods inherited from Expression return now an Expression.  This
15207         will is used during the tree rewriting as we resolve them during
15208         semantic analysis.
15209
15210         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
15211         the spec.  Missing entirely is the information about
15212         accessability of elements of it.
15213
15214         (Expression::ExprClassFromMemberInfo): New constructor for
15215         Expressions that creates a fully initialized Expression based on
15216         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
15217         a Type.
15218
15219         (Invocation::Resolve): Begin implementing resolution of invocations.
15220
15221         * literal.cs (StringLiteral):  Implement Emit.
15222
15223 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15224
15225         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
15226         member.
15227
15228 2001-09-04  Ravi Pratap  <ravi@ximian.com>
15229
15230         * cs-parser.jay (attribute_arguments): Implement actions.
15231         (attribute): Fix bug in production. Implement action.
15232         (attribute_list): Implement.
15233         (attribute_target): Implement.
15234         (attribute_target_specifier, opt_target_specifier): Implement
15235         (CheckAttributeTarget): New method to check if the attribute target
15236         is valid.
15237         (attribute_section): Implement.
15238         (opt_attributes): Implement.
15239
15240         * attribute.cs : New file to handle attributes.
15241         (Attribute): Class to hold attribute info.
15242
15243         * cs-parser.jay (opt_attribute_target_specifier): Remove production
15244         (attribute_section): Modify production to use 2 different rules to 
15245         achieve the same thing. 1 s/r conflict down !
15246         Clean out commented, useless, non-reducing dimension_separator rules.
15247
15248         * class.cs (TypeContainer.attributes): New member to hold list
15249         of attributes for a type.
15250         (Struct::Struct): Modify to take one more argument, the attribute list.
15251         (Class::Class): Ditto.
15252         (Field::Field): Ditto.
15253         (Method::Method): Ditto.
15254         (Property::Property): Ditto.
15255
15256         * cs-parser.jay (struct_declaration): Update constructor call to
15257         pass in the attributes too.
15258         (class_declaration): Ditto.
15259         (constant_declaration): Ditto.
15260         (field_declaration): Ditto.
15261         (method_header): Ditto.
15262         (fixed_parameter): Ditto.
15263         (parameter_array): Ditto.
15264         (property_declaration): Ditto.
15265
15266         * constant.cs (Constant::Constant): Update constructor similarly.
15267         Use System.Collections.
15268
15269         * parameter.cs (Parameter::Parameter): Update as above.
15270
15271 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15272
15273         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
15274         (TypeContainer.delegates): New member to hold list of delegates.
15275
15276         * cs-parser.jay (delegate_declaration): Implement the action correctly 
15277         this time as I seem to be on crack ;-)
15278
15279 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
15280
15281         * rootcontext.cs (RootContext::IsNamespace): new function, used to
15282         tell whether an identifier represents a namespace.
15283
15284         * expression.cs (NamespaceExpr): A namespace expression, used only
15285         temporarly during expression resolution.
15286         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
15287         utility functions to resolve names on expressions.
15288
15289 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
15290
15291         * codegen.cs: Add hook for StatementExpressions. 
15292
15293         * class.cs: Fix inverted test for static flag in methods.
15294
15295 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15296
15297         * class.cs (Operator::CheckUnaryOperator): Correct error number used
15298         to make it coincide with MS' number.
15299         (Operator::CheckBinaryOperator): Ditto.
15300
15301         * ../errors/errors.txt : Remove error numbers added earlier.
15302
15303         * ../errors/cs1019.cs : Test case for error # 1019
15304
15305         * ../errros/cs1020.cs : Test case for error # 1020
15306
15307         * cs-parser.jay : Clean out commented cruft.
15308         (dimension_separators, dimension_separator): Comment out. Ostensibly not
15309         used anywhere - non-reducing rule.
15310         (namespace_declarations): Non-reducing rule - comment out.
15311
15312         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
15313         with TypeContainer::AddEnum.
15314
15315         * delegate.cs : New file for delegate handling classes.
15316         (Delegate): Class for declaring delegates.
15317
15318         * makefile : Update.
15319
15320         * cs-parser.jay (delegate_declaration): Implement.
15321
15322 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
15323
15324         * class.cs (Event::Define): Implement.
15325         (Event.EventBuilder): New member.
15326
15327         * class.cs (TypeContainer::Populate): Update to define all enums and events
15328         we have.
15329         (Events): New property for the events arraylist we hold. Shouldn't we move to using
15330         readonly fields for all these cases ?
15331
15332 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15333
15334         * class.cs (Property): Revamp to use the convention of making fields readonly.
15335         Accordingly modify code elsewhere.
15336
15337         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
15338         the Define method of the Property class.
15339
15340         * class.cs : Clean up applied patch and update references to variables etc. Fix 
15341         trivial bug.
15342         (TypeContainer::Populate): Update to define all the properties we have. Also
15343         define all enumerations.
15344
15345         * enum.cs (Define): Implement.
15346
15347 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15348
15349         * cs-parser.jay (overloadable_operator): The semantic value is an
15350         enum of the Operator class.
15351         (operator_declarator): Implement actions.
15352         (operator_declaration): Implement.
15353
15354         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
15355         validity of definitions.
15356         (Operator::CheckBinaryOperator): Static method to check for binary operators
15357         (TypeContainer::AddOperator): New method to add an operator to a type.
15358
15359         * cs-parser.jay (indexer_declaration): Added line to actually call the
15360         AddIndexer method so it gets added ;-)
15361
15362         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
15363         already taken care of by the MS compiler ?  
15364
15365 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15366
15367         * class.cs (Operator): New class for operator declarations.
15368         (Operator::OpType): Enum for the various operators.
15369
15370 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15371
15372         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
15373         ostensibly handle this in semantic analysis.
15374
15375         * cs-parser.jay (general_catch_clause): Comment out
15376         (specific_catch_clauses, specific_catch_clause): Ditto.
15377         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
15378         (catch_args, opt_catch_args): New productions.
15379         (catch_clause): Rewrite to use the new productions above
15380         (catch_clauses): Modify accordingly.
15381         (opt_catch_clauses): New production to use in try_statement
15382         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
15383         and re-write the code in the actions to extract the specific and
15384         general catch clauses by being a little smart ;-)
15385
15386         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
15387         Hooray, try and catch statements parse fine !
15388
15389 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15390
15391         * statement.cs (Block::GetVariableType): Fix logic to extract the type
15392         string from the hashtable of variables.
15393
15394         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
15395         I end up making that mistake ;-)
15396         (catch_clauses): Fixed gross error which made Key and Value of the 
15397         DictionaryEntry the same : $1 !!
15398
15399 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15400
15401         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
15402
15403         * cs-parser.jay (event_declaration): Correct to remove the semicolon
15404         when the add and remove accessors are specified. 
15405
15406 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15407
15408         * cs-parser.jay (IndexerDeclaration): New helper class to hold
15409         information about indexer_declarator.
15410         (indexer_declarator): Implement actions.
15411         (parsing_indexer): New local boolean used to keep track of whether
15412         we are parsing indexers or properties. This is necessary because 
15413         implicit_parameters come into picture even for the get accessor in the 
15414         case of an indexer.
15415         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
15416
15417         * class.cs (Indexer): New class for indexer declarations.
15418         (TypeContainer::AddIndexer): New method to add an indexer to a type.
15419         (TypeContainer::indexers): New member to hold list of indexers for the
15420         type.
15421
15422 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
15423
15424         * cs-parser.jay (add_accessor_declaration): Implement action.
15425         (remove_accessor_declaration): Implement action.
15426         (event_accessors_declaration): Implement
15427         (variable_declarators): swap statements for first rule - trivial.
15428
15429         * class.cs (Event): New class to hold information about event
15430         declarations.
15431         (TypeContainer::AddEvent): New method to add an event to a type
15432         (TypeContainer::events): New member to hold list of events.
15433
15434         * cs-parser.jay (event_declaration): Implement actions.
15435
15436 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
15437
15438         * cs-parser.jay (dim_separators): Implement. Make it a string
15439         concatenating all the commas together, just as they appear.
15440         (opt_dim_separators): Modify accordingly
15441         (rank_specifiers): Update accordingly. Basically do the same
15442         thing - instead, collect the brackets here.
15443         (opt_rank_sepcifiers): Modify accordingly.
15444         (array_type): Modify to actually return the complete type string
15445         instead of ignoring the rank_specifiers.
15446         (expression_list): Implement to collect the expressions
15447         (variable_initializer): Implement. We make it a list of expressions
15448         essentially so that we can handle the array_initializer case neatly too.
15449         (variable_initializer_list): Implement.
15450         (array_initializer): Make it a list of variable_initializers
15451         (opt_array_initializer): Modify accordingly.
15452
15453         * expression.cs (New::NType): Add enumeration to help us
15454         keep track of whether we have an object/delegate creation
15455         or an array creation.
15456         (New:NewType, New::Rank, New::Indices, New::Initializers): New
15457         members to hold data about array creation.
15458         (New:New): Modify to update NewType
15459         (New:New): New Overloaded contructor for the array creation
15460         case.
15461
15462         * cs-parser.jay (array_creation_expression): Implement to call
15463         the overloaded New constructor.
15464
15465 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
15466
15467         * class.cs (TypeContainer::Constructors): Return member
15468         constructors instead of returning null.
15469
15470 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
15471
15472         * typemanager.cs (InitCoreTypes): Initialize the various core
15473         types after we have populated the type manager with the user
15474         defined types (this distinction will be important later while
15475         compiling corlib.dll)
15476
15477         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
15478         on Expression Classification.  Now all expressions have a method
15479         `Resolve' and a method `Emit'.
15480
15481         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
15482         generation from working.     Also add some temporary debugging
15483         code. 
15484
15485 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
15486
15487         * codegen.cs: Lots of code generation pieces.  This is only the
15488         beginning, will continue tomorrow with more touches of polish.  We
15489         handle the fundamentals of if, while, do, for, return.  Others are
15490         trickier and I need to start working on invocations soon.
15491
15492         * gen-treedump.cs: Bug fix, use s.Increment here instead of
15493         s.InitStatement. 
15494
15495         * codegen.cs (EmitContext): New struct, used during code
15496         emission to keep a context.   Most of the code generation will be
15497         here. 
15498
15499         * cs-parser.jay: Add embedded blocks to the list of statements of
15500         this block.  So code generation proceeds in a top down fashion.
15501
15502 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
15503
15504         * statement.cs: Add support for multiple child blocks.
15505
15506 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
15507
15508         * codegen.cs (EmitCode): New function, will emit the code for a
15509         Block of code given a TypeContainer and its ILGenerator. 
15510
15511         * statement.cs (Block): Standard public readonly optimization.
15512         (Block::Block constructors): Link children. 
15513         (Block::Child): Child Linker.
15514         (Block::EmitVariables): Emits IL variable declarations.
15515
15516         * class.cs: Drop support for MethodGroups here, delay until
15517         Semantic Analysis.
15518         (Method::): Applied the same simplification that I did before, and
15519         move from Properties to public readonly fields.
15520         (Method::ParameterTypes): Returns the parameter types for the
15521         function, and implements a cache that will be useful later when I
15522         do error checking and the semantic analysis on the methods is
15523         performed.
15524         (Constructor::GetCallingConvention): Renamed from CallingConvetion
15525         and made a method, optional argument tells whether this is a class
15526         or a structure to apply the `has-this' bit.
15527         (Method::GetCallingConvention): Implement, returns the calling
15528         convention. 
15529         (Method::Define): Defines the type, a second pass is performed
15530         later to populate the methods.
15531
15532         (Constructor::ParameterTypes): implement a cache similar to the
15533         one on Method::ParameterTypes, useful later when we do semantic
15534         analysis. 
15535
15536         (TypeContainer::EmitMethod):  New method.  Emits methods.
15537
15538         * expression.cs: Removed MethodGroup class from here.
15539
15540         * parameter.cs (Parameters::GetCallingConvention): new method.
15541
15542 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
15543
15544         * class.cs (TypeContainer::Populate): Drop RootContext from the
15545         argument. 
15546
15547         (Constructor::CallingConvention): Returns the calling convention.
15548         (Constructor::ParameterTypes): Returns the constructor parameter
15549         types. 
15550
15551         (TypeContainer::AddConstructor): Keep track of default constructor
15552         and the default static constructor.
15553
15554         (Constructor::) Another class that starts using `public readonly'
15555         instead of properties. 
15556
15557         (Constructor::IsDefault): Whether this is a default constructor. 
15558
15559         (Field::) use readonly public fields instead of properties also.
15560
15561         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
15562         track of static constructors;  If none is used, turn on
15563         BeforeFieldInit in the TypeAttributes. 
15564
15565         * cs-parser.jay (opt_argument_list): now the return can be null
15566         for the cases where there are no arguments. 
15567
15568         (constructor_declarator): If there is no implicit `base' or
15569         `this', then invoke the default parent constructor. 
15570
15571         * modifiers.cs (MethodAttr): New static function maps a set of
15572         modifiers flags into a MethodAttributes enum
15573         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
15574         MethodAttr, TypeAttr to represent the various mappings where the
15575         modifiers are used.
15576         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
15577
15578 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
15579
15580         * parameter.cs (GetParameterInfo): Fix bug where there would be no
15581         method arguments.
15582
15583         * interface.cs (PopulateIndexer): Implemented the code generator
15584         for interface indexers.
15585
15586 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
15587
15588         * interface.cs (InterfaceMemberBase): Now we track the new status
15589         here.  
15590
15591         (PopulateProperty): Implement property population.  Woohoo!  Got
15592         Methods and Properties going today. 
15593
15594         Removed all the properties for interfaces, and replaced them with
15595         `public readonly' fields. 
15596
15597 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
15598
15599         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
15600         initialize their hashtables/arraylists only when they are needed
15601         instead of doing this always.
15602
15603         * parameter.cs: Handle refs and out parameters.
15604
15605         * cs-parser.jay: Use an ArrayList to construct the arguments
15606         instead of the ParameterCollection, and then cast that to a
15607         Parameter[] array.
15608
15609         * parameter.cs: Drop the use of ParameterCollection and use
15610         instead arrays of Parameters.
15611
15612         (GetParameterInfo): Use the Type, not the Name when resolving
15613         types. 
15614
15615 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
15616
15617         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
15618         and instead use public readonly fields.
15619
15620         * class.cs: Put back walking code for type containers.
15621
15622 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
15623
15624         * class.cs (MakeConstant): Code to define constants.
15625
15626         * rootcontext.cs (LookupType): New function.  Used to locate types 
15627
15628
15629 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
15630
15631         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
15632         this System.Reflection code is.  Kudos to Microsoft
15633
15634         * typemanager.cs: Implement a type cache and avoid loading all
15635         types at boot time.  Wrap in LookupType the internals.  This made
15636         the compiler so much faster.  Wow.  I rule!
15637
15638         * driver.cs: Make sure we always load mscorlib first (for
15639         debugging purposes, nothing really important).
15640
15641         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
15642         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
15643
15644         * rootcontext.cs: Lookup types on their namespace;  Lookup types
15645         on namespaces that have been imported using the `using' keyword.
15646
15647         * class.cs (TypeContainer::TypeAttr): Virtualize.
15648         (Class::TypeAttr): Return attributes suitable for this bad boy.
15649         (Struct::TypeAttr): ditto.
15650         Handle nested classes.
15651         (TypeContainer::) Remove all the type visiting code, it is now
15652         replaced with the rootcontext.cs code
15653
15654         * rootcontext.cs (GetClassBases): Added support for structs. 
15655
15656 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
15657
15658         * interface.cs, statement.cs, class.cs, parameter.cs,
15659         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
15660         Drop use of TypeRefs, and use strings instead.
15661
15662 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
15663
15664         * rootcontext.cs: 
15665
15666         * class.cs (Struct::Struct): set the SEALED flags after
15667         checking the modifiers.
15668         (TypeContainer::TypeAttr): new property, returns the
15669         TypeAttributes for a class.  
15670
15671         * cs-parser.jay (type_list): Oops, list production was creating a
15672         new list of base types.
15673
15674         * rootcontext.cs (StdLib): New property.
15675         (GetInterfaceTypeByName): returns an interface by type name, and
15676         encapsulates error handling here.
15677         (GetInterfaces): simplified.
15678         (ResolveTree): Encapsulated all the tree resolution here.
15679         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
15680         types. 
15681
15682         * driver.cs: Add support for --nostdlib, to avoid loading the
15683         default assemblies.
15684         (Main): Do not put tree resolution here. 
15685
15686         * rootcontext.cs: Beginning of the class resolution.
15687
15688 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
15689
15690         * rootcontext.cs: Provide better error reporting. 
15691
15692         * cs-parser.jay (interface_base): set our $$ to be interfaces.
15693
15694         * rootcontext.cs (CreateInterface): Handle the case where there
15695         are no parent interfaces.
15696
15697         (CloseTypes): Routine to flush types at the end.
15698         (CreateInterface): Track types.
15699         (GetInterfaces): Returns an array of Types from the list of
15700         defined interfaces.
15701
15702         * typemanager.c (AddUserType): Mechanism to track user types (puts
15703         the type on the global type hash, and allows us to close it at the
15704         end). 
15705
15706 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
15707
15708         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
15709         RecordInterface instead.
15710
15711         * cs-parser.jay: Updated to reflect changes above.
15712
15713         * decl.cs (Definition): Keep track of the TypeBuilder type that
15714         represents this type here.  Not sure we will use it in the long
15715         run, but wont hurt for now.
15716
15717         * driver.cs: Smaller changes to accomodate the new code.
15718
15719         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
15720         when done. 
15721
15722         * rootcontext.cs (CreateInterface):  New method, used to create
15723         the System.TypeBuilder type for interfaces.
15724         (ResolveInterfaces): new entry point to resolve the interface
15725         hierarchy. 
15726         (CodeGen): Property, used to keep track of the code generator.
15727
15728 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
15729
15730         * cs-parser.jay: Add a second production for delegate_declaration
15731         with `VOID'.
15732
15733         (enum_body): Put an opt_comma here instead of putting it on
15734         enum_body or enum_member_declarations so we can handle trailing
15735         commas on enumeration members.  Gets rid of a shift/reduce.
15736
15737         (type_list): Need a COMMA in the middle.
15738
15739         (indexer_declaration): Tell tokenizer to recognize get/set
15740
15741         * Remove old targets.
15742
15743         * Re-add the parser target.
15744
15745 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15746
15747         * cs-parser.jay: Add precendence rules for a number of operators
15748         ot reduce the number of shift/reduce conflicts in the grammar.
15749
15750 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
15751
15752         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
15753         and put it here.
15754
15755         Get rid of old crufty code.
15756
15757         * rootcontext.cs: Use this to keep track of the parsed
15758         representation and the defined types available to the program. 
15759
15760         * gen-treedump.cs: adjust for new convention.
15761
15762         * type.cs: Split out the type manager, and the assembly builder
15763         from here. 
15764
15765         * typemanager.cs: the type manager will live here now.
15766
15767         * cil-codegen.cs: And the code generator here. 
15768
15769 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
15770
15771         * makefile: Fixed up for easy making.
15772
15773 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15774
15775         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
15776         the 
15777
15778         (unary_expression): Expand pre_increment_expression and
15779         post_decrement_expression to reduce a shift/reduce.
15780
15781 2001-07-11  Simon Cozens
15782
15783         * cs-tokenizer.cs: Hex numbers should begin with a 0.
15784
15785         Improve allow_keyword_as_indent name.
15786
15787 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
15788
15789         * Adjustments for Beta2. 
15790
15791 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
15792
15793         * decl.cs: Added `Define' abstract method.
15794         (InTransit): new property, used to catch recursive definitions. 
15795
15796         * interface.cs: Implement `Define'. 
15797
15798         * modifiers.cs: Map Modifiers.constants to
15799         System.Reflection.TypeAttribute flags.
15800
15801         * class.cs: Keep track of types and user-defined types.
15802         (BuilderInit): New method for creating an assembly
15803         (ResolveType): New function to launch the resolution process, only
15804         used by interfaces for now.
15805
15806         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
15807         that are inserted into the name space. 
15808
15809 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
15810
15811         * ARGH.  I have screwed up my tree so many times due to the use of
15812         rsync rather than using CVS.  Going to fix this at once. 
15813
15814         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
15815         load types.
15816
15817 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
15818
15819         * Experiment successful: Use System.Type rather that our own
15820         version of Type.  
15821
15822 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
15823
15824         * cs-parser.jay: Removed nsAliases from here.
15825
15826         Use new namespaces, handle `using XXX;' 
15827
15828         * namespace.cs: Reimplemented namespace handling, use a recursive
15829         definition of the class.  Now we can keep track of using clauses
15830         and catch invalid using clauses.
15831
15832 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
15833
15834         * gen-treedump.cs: Adapted for all the renaming.
15835
15836         * expression.cs (Expression): this class now has a Type property
15837         which returns an expression Type.
15838
15839         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
15840         `Type', as this has a different meaning now in the base
15841
15842 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
15843
15844         * interface.cs, class.cs: Removed from all the sources the
15845         references to signature computation, as we can not do method
15846         signature computation during the parsing time, as we are not
15847         trying to solve at that point distinguishing:
15848
15849         class X {
15850                 void a (Blah x) {}
15851                 void a (NS.Blah x) {}
15852         }
15853
15854         Which depending on the context might be valid or not, as we do not
15855         know if Blah is the same thing as NS.Blah at that point.
15856
15857         * Redid everything so the code uses TypeRefs now instead of
15858         Types.  TypeRefs are just temporary type placeholders, that need
15859         to be resolved.  They initially have a pointer to a string and the
15860         current scope in which they are used.  This is used later by the
15861         compiler to resolve the reference to an actual Type. 
15862
15863         * DeclSpace is no longer a CIR.Type, and neither are
15864         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
15865         are all DeclSpaces, but no Types. 
15866
15867         * type.cs (TypeRefManager): This implements the TypeRef manager,
15868         which keeps track of all the types that need to be resolved after
15869         the parsing has finished. 
15870
15871 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
15872
15873         * ARGH.  We are going to have to store `foreach' as a class rather
15874         than resolving it, as we need to verify error 1579 after name
15875         resolution.   *OR* we could keep a flag that says `This request to
15876         IEnumerator comes from a foreach statement' which we can then use
15877         to generate the error.
15878
15879 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
15880
15881         * class.cs (TypeContainer.AddMethod): we now add methods to the
15882         MethodGroup instead of the method hashtable.  
15883
15884         * expression.cs: Add MethodGroup abstraction, which gets us one
15885         step closer to the specification in the way we handle method
15886         declarations.  
15887
15888         * cs-parser.jay (primary_expression): qualified_identifier now
15889         tried to match up an identifier to a local variable reference or
15890         to a parameter reference.
15891
15892         current_local_parameters is now a parser global variable that
15893         points to the current parameters for the block, used during name
15894         lookup.
15895
15896         (property_declaration): Now creates an implicit `value' argument to
15897         the set accessor.
15898
15899 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
15900
15901         * parameter.cs: Do not use `param' arguments as part of the
15902         signature, per the spec.
15903
15904 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
15905
15906         * decl.cs: Base class for classes, structs and interfaces.  This
15907         is the "Declaration Space" 
15908
15909         * cs-parser.jay: Use CheckDef for checking declaration errors
15910         instead of having one on each function.
15911
15912         * class.cs: Factor out some code for handling error handling in
15913         accordance to the "Declarations" section in the "Basic Concepts"
15914         chapter in the ECMA C# spec.
15915
15916         * interface.cs: Make all interface member classes derive from
15917         InterfaceMemberBase.
15918
15919 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
15920
15921         * Many things: all interfaces are parsed and generated in
15922         gen-treedump.  Support for member variables, constructors,
15923         destructors, properties, constants is there.
15924
15925         Beginning of the IL backend, but very little done, just there for
15926         testing purposes. 
15927
15928 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
15929
15930         * cs-parser.jay: Fix labeled statement.
15931
15932         * cs-tokenizer.cs (escape): Escape " and ' always.
15933         ref_line, ref_name: keep track of the line/filename as instructed
15934         by #line by the compiler.
15935         Parse #line.
15936
15937 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
15938
15939         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
15940         to match the values in System.CodeDOM.
15941
15942         Divid renamed to Divide.
15943
15944         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
15945         statements. 
15946         (Statements.set): remove.
15947
15948         * System.CodeDOM/CodeCatchClause.cs: always have a valid
15949         statements. 
15950
15951         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
15952         falseStatements always have valid values. 
15953
15954         * cs-parser.jay: Use System.CodeDOM now.
15955