This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / mcs / ChangeLog
1 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
2
3         * driver.cs: Strip the path from the names of embedded resources. Fixes
4         #68519.
5
6 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
7
8         * expression.cs (StringConcat): Handle being called twice,
9         as when we have a concat in a field init with more than two
10         ctors in the class
11
12 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
13
14         * assign.cs (Assign.DoResolve): Only do the transform of
15         assignment into a New if the types are compatible, if not, fall
16         through and let the implicit code deal with the errors and with
17         the necessary conversions. 
18
19 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
20
21         * namespace.cs (NamespaceEntry.Using): No matter which warning
22         level is set, check if this namespace name has already been added.
23
24 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
25  
26         * expression.cs: reftype [!=]= null should always use br[true,false].
27         # 67410
28
29 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
30
31         * cs-parser.jay: Do not report the stack trace, it is useless
32         anyways for the production compiler.
33
34 2004-09-15  Raja R Harinath  <rharinath@novell.com>
35
36         * cs-parser.jay (fixed_statement): Introduce a scope for the
37         declaration in a 'fixed' statement.
38
39 2004-09-10  Raja R Harinath  <rharinath@novell.com>
40
41         Fix test-290.cs.
42         * cs-parser.jay (delegate_declaration): Record a delegate
43         declaration as a type declaration.
44
45 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
46
47         * expression.cs: Return false if we fail to resolve the inner
48         expression. 
49
50 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
51
52         * expression.cs: Report errors with unsafe pointers, fixes #64896
53
54
55 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
56
57         * expression.cs: Pointer arith always needs to do a conv.i
58         if the operand is a long. fix 65320
59
60 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
61
62         * PointerArithmetic (Resolve): make sure we are not doing
63         pointer arith on void*. Also, make sure we are resolved
64         by not setting eclass until resolve.
65
66         All callers: Make sure that PointerArithmetic gets resolved.
67
68 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
69
70         * ArrayCreation (LookupType): If the type does not resolve 
71         to an array, give an error.
72
73 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
74  
75         * cfold.cs: Synchronize the folding with the code in expression.cs
76         Binary.DoNumericPromotions for uint operands.
77
78
79 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
80
81         * ecore.cs (MethodGroupExpr): new IsBase property.
82
83         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
84
85         * delegate.cs (DelegateCreation): store a MethodGroupExpr
86         rather than an instance expr.
87
88         (DelegateCreation.Emit): Use the method group rather than
89         the instance expression. Also, if you have base.Foo as the
90         method for a delegate, make sure to emit ldftn, not ldftnvirt.
91
92         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
93
94         (NewDelegate.DoResolve): Only check for the existance of Invoke
95         if the method is going to be needed. Use MethodGroupExpr.
96
97         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
98
99         * expression.cs: For pointer arith., make sure to use
100         the size of the type, not the size of the pointer to
101         the type.
102
103 2004-08-03  Martin Baulig  <martin@ximian.com>
104
105         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
106         use a user-defined operator; we still need to do numeric
107         promotions in case one argument is a builtin type and the other
108         one has an implicit conversion to that type.  Fixes #62322.
109
110 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
111
112         * expression.cs: Resolve the constant expression before returning
113         it.  Fixes: 61702
114
115 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
116
117         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
118         `true' for preprocessing directives that we parse.  The return
119         value indicates whether we should return to regular tokenizing or
120         not, not whether it was parsed successfully.
121
122         In the past if we were in: #if false ... #line #endif, we would
123         resume parsing after `#line'.  See bug 61604.
124         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
125         building: IsEnumType should return true only for enums, not for
126         enums or System.Enum itself.  This fixes #61593.
127
128         Likely what happened is that corlib was wrong: mcs depended on
129         this bug in some places.  The bug got fixed, we had to add the
130         hack, which caused bug 61593.
131
132         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
133         that was a workaround for the older conditions.
134         
135 2004-07-14  Martin Baulig  <martin@ximian.com>
136
137         * iterators.cs: Use real error numbers.
138
139 2004-07-14  Martin Baulig  <martin@ximian.com>
140
141         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
142         requires this to be a System.Collection.IEnumerable and not a
143         class implementing that interface.
144         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
145
146 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
147
148         * class.cs: Fixed previous fix, it broke some error tests.
149
150 2004-07-12  Martin Baulig  <martin@ximian.com>
151
152         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
153         Fixes #61293.
154
155 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
156
157         * assign.cs (LocalTemporary): Add new argument: is_address,If
158         `is_address' is true, then the value that we store is the address
159         to the real value, and not the value itself.
160         
161         * ecore.cs (PropertyExpr): use the new local temporary
162         stuff to allow us to handle X.Y += z (where X is a struct)
163
164 2004-07-08  Martin Baulig  <martin@ximian.com>
165
166         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
167         not always return, just like we're doing in Using.Resolve().
168
169 2004-06-24  Raja R Harinath  <rharinath@novell.com>
170
171         * expression.cs (BetterConversion): Remove buggy special-case
172         handling of "implicit constant expression conversions".  At this
173         point, we already know that the conversion is possible -- we're
174         only checking to see which is better.
175
176 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
177
178         * cs-parser.jay: Added error CS0210 test.
179
180 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
181
182         * cs-parser.jay: Added error CS0134 test.
183
184 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
185
186         Fix bug #52507
187         * cs-parser.jay: Added error CS0145 test.
188
189 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
190
191         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
192
193 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
194         
195         * expression.cs (StackAlloc.Resolve): The argument may not
196         be a constant; deal with this case.
197         
198 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
199
200         * attribute.cs (IndexerName_GetIndexerName): Renamed to
201         GetIndexerAttributeValue.
202         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
203
204         * class.cs (Indexer.Define): Added error tests for CS0415,
205         CS0609.
206
207 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
208
209         * attribute.cs (Attribute.Resolve): Keep field code in sync with
210         property code.
211
212 2004-06-23  Martin Baulig  <martin@ximian.com>
213
214         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
215         neither return nor throw, reset the barrier as well.  Fixes #60457.
216
217 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
218
219         * class.cs : EventAttributes is now set to None by default.
220           This fixes bug #60459.
221
222 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
223
224         Fix bug #60219
225         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
226         Don't throw exception but return null (it's sufficient now).
227
228 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
229
230         * typemanager.cs (GetArgumentTypes): Faster implementation.
231
232 2004-06-18  Martin Baulig  <martin@ximian.com>
233
234         * attribute.cs (Attribute.Resolve): Check whether we're an
235         EmptyCast which a Constant child.  Fixes #60333.
236
237 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
238
239         * statement.cs (EmitCollectionForeach): Account for the fact that
240         not all valuetypes are in areas which we can take the address of.
241         For these variables, we store to a temporary variable. Also, make
242         sure that we dont emit a `callvirt' on a valuetype method.
243
244 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
245
246         * expression.cs (StackAlloc.DoReSolve): Added test for
247         negative parameter (CS0247).
248
249 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
250
251         Fix bug #59792
252         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
253
254 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
255
256         Fix bug #59781
257         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
258         ulong.
259
260 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
261
262         Fix bug #58254 & cs1555.cs, cs1556.cs
263         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
264
265 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
266
267         * cs-parser.jay: Added error CS1669 test for indexers.
268
269 2004-06-11  Martin Baulig  <martin@ximian.com>
270
271         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
272         call this twice: for params and varargs methods.
273
274 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
275
276         * class.cs:
277         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
278
279 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
280
281         * attribute.cs (Attribute.GetValidTargets): Made public.
282
283         * class.cs: 
284         (AbstractPropertyEventMethod): New class for better code sharing.
285         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
286         CS1667 report.
287         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
288
289 2004-06-11  Raja R Harinath  <rharinath@novell.com>
290
291         Fix bug #59477.
292         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
293         that the call to Resolve is part of a MemberAccess.
294         (Expression.Resolve): Use it for SimpleName resolution.
295         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
296         Add 'intermediate' boolean argument.
297         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
298         error message when the SimpleName can be resolved ambiguously
299         between an expression and a type.
300         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
301         public.
302         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
303         call on the left-side.
304
305 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
306
307         * class.cs:
308         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
309
310 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
311
312         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
313
314 2004-06-11  Martin Baulig  <martin@ximian.com>
315
316         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
317         varargs methods if applicable.
318
319 2004-06-11  Martin Baulig  <martin@ximian.com>
320
321         * expression.cs (Invocation.EmitCall): Don't use
322         `method.CallingConvention == CallingConventions.VarArgs' since the
323         method could also have `CallingConventions.HasThis'.
324
325 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
326
327         * class.cs (Event.GetSignatureForError): Implemented.
328         Fixed crash in error test cs3010.cs
329
330 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
331
332         * cs-tokenizer.cs: Change the way we track __arglist to be
333         consistent with the other keywords.
334
335 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
336
337         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
338         tomorrow.
339
340 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
341
342         * codegen.cs: Check that all referenced assemblies have a strongname
343         before strongnaming the compiled assembly. If not report error CS1577.
344         Fix bug #56563. Patch by Jackson Harper.
345         * typemanager.cs: Added a method to return all referenced assemblies.
346         Fix bug #56563. Patch by Jackson Harper.
347
348 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
349
350         * class.cs:
351         (Method.ApplyAttributeBuilder): Moved and added conditional
352         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
353
354         * delegate.cs:
355         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
356
357 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
358
359         Fixed #59640
360         * class.cs: (EventField.attribute_targets): Changed default target.
361
362 2004-06-08  Martin Baulig  <martin@ximian.com>
363
364         * expression.cs (Invocation.EmitCall): Enable varargs methods.
365
366 2004-06-08  Martin Baulig  <martin@ximian.com>
367
368         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
369
370 2004-06-07  Martin Baulig  <martin@ximian.com>
371
372         Added support for varargs methods.
373
374         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
375         keyword.
376
377         * cs-parser.jay: Added support for `__arglist'.
378
379         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
380
381         * expression.cs (Argument.AType): Added `ArgList'.
382         (Invocation): Added support for varargs methods.
383         (ArglistAccess): New public class.
384         (Arglist): New public class.
385
386         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
387
388         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
389         a method's top-level block if the method has varargs.
390
391         * support.cs (ReflectionParameters, InternalParameters): Added
392         support for varargs methods.    
393
394 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
395
396         * class.cs: Provide location in indexer error report.
397
398         * driver.cs: Use standard names.
399
400         * namespace.cs: Catch the use of using after a namespace has been
401         declared also on using aliases.
402
403 2004-06-03  Raja R Harinath  <rharinath@novell.com>
404
405         Bug #50820.
406         * typemanager.cs (closure_private_ok, closure_invocation_type)
407         (closure_qualifier_type, closure_invocation_assembly)
408         (FilterWithClosure): Move to ...
409         (Closure): New internal nested class.
410         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
411         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
412         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
413         (MemberLookup, MemberLookupFailed): Use it.
414         * expression.cs (New.DoResolve): Treat the lookup for the
415         constructor as being qualified by the 'new'ed type.
416         (Indexers.GetIndexersForTypeOrInterface): Update.
417
418 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
419
420         * attribute.cs
421         (GetConditionalAttributeValue): New method. Returns
422         condition of ConditionalAttribute.
423         (SearchMulti): New method.  Returns all attributes of type 't'.
424         Use it when attribute is AllowMultiple = true.
425         (IsConditionalMethodExcluded): New method.
426
427         * class.cs
428         (Method.IsExcluded): Implemented. Returns true if method has conditional
429         attribute and the conditions is not defined (method is excluded).
430         (IMethodData): Extended interface for ConditionalAttribute support.
431         (PropertyMethod.IsExcluded): Implemented.
432
433         * decl.cs
434         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
435
436         * expression.cs
437         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
438         on the method.
439
440 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
441
442         * expression.cs (ArrayCreationExpression): Make this just an
443         `expression'. It can't be a statement, so the code here was
444         dead.
445
446 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
447
448         Fixed #59072
449         * typemanager.cs (GetFullNameSignature): New method for
450         MethodBase types.
451
452 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
453
454         Fixed #56452
455         * class.cs (MemberBase.GetSignatureForError): New virtual method.
456         Use this method when MethodBuilder is null.
457         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
458         Added test for error CS0626 (MONO reports error for this situation).
459         (IMethodData.GetSignatureForError): Extended interface.
460
461 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
462
463         * attribute.cs
464         (AttributeTester.GetObsoleteAttribute): Returns instance of
465         ObsoleteAttribute when type is obsolete.
466
467         * class.cs
468         (TypeContainer.VerifyObsoleteAttribute): Override.
469         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
470         (MethodCode.VerifyObsoleteAttribute): Override.
471         (MemberBase.VerifyObsoleteAttribute): Override.
472
473         * decl.cs
474         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
475         and report proper error.
476
477         *delegate.cs
478         Delegate.VerifyObsoleteAttribute): Override.
479
480         * ecore.cs
481         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
482         and report proper error.
483         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
484
485         * enum.cs
486         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
487         and enum member.
488
489         * expression.cs
490         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
491         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
492         Added test for ObsoleteAttribute.
493
494         * statement.cs
495         (Catch): Derived from Statement.
496
497 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
498  
499         Fixed bug #59071 & cs0160.cs
500  
501         * statement.cs (Try.Resolve): Check here whether order of catch
502         clauses matches their dependencies.
503
504 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
505
506         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
507         caused a regression: #59343.  Referencing nested classes from an
508         assembly stopped working.
509
510 2004-05-31  Martin Baulig  <martin@ximian.com>
511
512         MCS is now frozen for beta 2.
513
514 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
515
516         * convert.cs: add a trivial cache for overload operator resolution.
517
518 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
519
520         * decl.cs: If possible, use lookuptypedirect here. We can only do
521         this if there is no `.' after the namespace. Avoids using
522         LookupType, which does lots of slow processing.
523         (FindNestedType) New method, does what it says :-).
524         * namespace.cs: use LookupTypeDirect.
525         * rootcontext.cs: use membercache, if possible.
526         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
527
528 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
529
530         * expression.cs:
531         According to the spec, 
532
533         In a member access of the form E.I, if E is a single identifier,
534         and if the meaning of E as a simple-name (§7.5.2) is a constant,
535         field, property, localvariable, or parameter with the same type as
536         the meaning of E as a type-name (§3.8), then both possible
537         meanings of E are permitted.
538
539         We did not check that E as a simple-name had the same type as E as
540         a type name.
541
542         This trivial check gives us 5-7% on bootstrap time.
543
544 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
545
546         * expression.cs (Invocation.OverloadResolve): Avoid the
547         use of hashtables and boxing here by allocating on demand.
548
549 2004-05-30  Martin Baulig  <martin@ximian.com>
550
551         * rootcontext.cs (RootContext.LookupType): Don't cache things if
552         we're doing a silent lookup.  Don't try to lookup nested types in
553         TypeManager.object_type (thanks to Ben Maurer).
554
555 2004-05-30  Martin Baulig  <martin@ximian.com>
556
557         Committing a patch from Ben Maurer.
558
559         * rootcontext.cs (RootContext.LookupType): Cache negative results.
560
561 2004-05-29  Martin Baulig  <martin@ximian.com>
562
563         * class.cs (IMethodData.ShouldIgnore): New method.
564
565         * typemanager.cs (TypeManager.MethodFlags): Don't take a
566         `Location' argument, we don't need it anywhere.  Use
567         `IMethodData.ShouldIgnore ()' instead of
568         `MethodData.GetMethodFlags ()'.
569         (TypeManager.AddMethod): Removed.
570         (TypeManager.AddMethod2): Renamed to AddMethod.
571
572 2004-05-29  Martin Baulig  <martin@ximian.com>
573
574         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
575
576         * convert.cs (Convert.ImplicitReferenceConversion): If we're
577         converting from a class type S to an interface type and we already
578         have an object on the stack, don't box it again.  Fixes #52578.
579
580 2004-05-29  Martin Baulig  <martin@ximian.com>
581
582         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
583         Added support for `params' parameters.  Fixes #59267.
584
585 2004-05-29  Martin Baulig  <martin@ximian.com>
586
587         * literal.cs (NullPointer): Provide a private .ctor which sets
588         `type' to TypeManager.object_type.  Fixes #59048.
589
590 2004-05-29  Martin Baulig  <martin@ximian.com>
591
592         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
593         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
594
595         * ecore.cs (EventExpr.instance_expr): Make the field private.
596
597 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
598
599         Fixed bug #50080 & cs0214-2.cs
600         * expression.cs (Cast.DoResolve): Check unsafe context here.
601         
602         * statement.cs (Resolve.DoResolve): Likewise.
603
604 2004-05-26  Martin Baulig  <martin@ximian.com>
605
606         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
607
608         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
609         (RootContext.LookupType): Pass down the `silent' flag.
610
611 2004-05-25  Martin Baulig  <martin@ximian.com>
612
613         * expression.cs
614         (MethodGroupExpr.IdenticalTypeName): New public property.
615         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
616         expression actually refers to a type.
617
618 2004-05-25  Martin Baulig  <martin@ximian.com>
619
620         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
621         for #56176 and made it actually work.
622
623 2004-05-25  Martin Baulig  <martin@ximian.com>
624
625         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
626         (FieldExpr, PropertyExpr): Override and implement
627         CacheTemporaries.  Fixes #52279.
628
629 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
630
631         * location.cs: In the new compiler listing a file twice is a
632         warning, not an error.
633
634 2004-05-24  Martin Baulig  <martin@ximian.com>
635
636         * enum.cs (Enum.DefineType): For the `BaseType' to be a
637         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
638
639 2004-05-24  Martin Baulig  <martin@ximian.com>
640
641         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
642         walking the `using' list.  Fixes #53921.
643
644 2004-05-24  Martin Baulig  <martin@ximian.com>
645
646         * const.cs (Const.LookupConstantValue): Added support for
647         EmptyCast's; fixes #55251.
648
649 2004-05-24  Martin Baulig  <martin@ximian.com>
650
651         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
652         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
653         which does the CS0135 check.  The reason is that we first need to
654         check whether the variable actually exists.
655
656 2004-05-24  Martin Baulig  <martin@ximian.com>
657
658         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
659         than RootContext.LookupType() to find the explicit interface
660         type.  Fixes #58584.
661
662 2004-05-24  Raja R Harinath  <rharinath@novell.com>
663
664         * Makefile: Simplify.  Use executable.make.
665         * mcs.exe.sources: New file.  List of sources of mcs.exe.
666
667 2004-05-24  Anders Carlsson  <andersca@gnome.org>
668
669         * decl.cs:
670         * enum.cs:
671         Use the invariant culture when doing String.Compare for CLS case
672         sensitivity.
673         
674 2004-05-23  Martin Baulig  <martin@ximian.com>
675
676         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
677         don't have any dots.  Fixes #52622, added cs0246-8.cs.
678
679         * namespace.cs (NamespaceEntry.Lookup): Likewise.
680         
681 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
682
683         * class.cs (MemberBase.Define): Reuse MemberType member for 
684         resolved type. Other methods can use it too.
685
686 2004-05-23  Martin Baulig  <martin@ximian.com>
687
688         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
689         the variable also exists in the current block (otherwise, we need
690         to report a CS0103).  Fixes #58670.
691
692 2004-05-23  Martin Baulig  <martin@ximian.com>
693
694         * flowanalysis.cs (Reachability.Reachable): Compute this
695         on-the-fly rather than storing it as a field.
696
697 2004-05-23  Martin Baulig  <martin@ximian.com>
698
699         * flowanalysis.cs (Reachability.And): Manually compute the
700         resulting `barrier' from the reachability.      
701        
702 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
703
704         Fix bug #57835
705         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
706         instance of ObsoleteAttribute when symbol is obsolete.
707
708         * class.cs
709         (IMethodData): Extended interface for ObsoleteAttribute support.
710
711 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
712
713         * attribute.cs: Fix bug #55970
714
715 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
716
717         Fix bug #52705
718         * attribute.cs
719         (GetObsoleteAttribute): New method. Creates the instance of
720         ObsoleteAttribute.
721         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
722         ObsoleteAttribute when member is obsolete.
723         (AttributeTester.Report_ObsoleteMessage): Common method for
724         Obsolete error/warning reporting.
725
726         * class.cs
727         (TypeContainer.base_classs_type): New member for storing parent type.
728
729         * decl.cs
730         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
731         for this MemberCore.
732
733 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
734
735         * attribute.cs, const.cs: Fix bug #58590
736
737 2004-05-21  Martin Baulig  <martin@ximian.com>
738
739         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
740         out parameters if the end of the method is unreachable.  Fixes
741         #58098. 
742
743 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
744
745         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
746         Hari was right, why extra method.
747
748 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
749
750         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
751
752 2004-05-20  Martin Baulig  <martin@ximian.com>
753
754         Merged this back from gmcs to keep the differences to a minumum.
755
756         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
757         instead of a Declspace.
758         (Attribute.ResolveType): Likewise.
759         (Attributes.Search): Likewise.
760         (Attributes.Contains): Likewise.
761         (Attributes.GetClsCompliantAttribute): Likewise.
762
763         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
764         argument.
765         (MethodData.ApplyAttributes): Take an EmitContext instead of a
766         DeclSpace.
767
768 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
769
770         Fix bug #58688 (MCS does not report error when the same attribute
771         is assigned twice)
772
773         * attribute.cs (Attribute.Emit): Distinction between null and default.
774
775 2004-05-19  Raja R Harinath  <rharinath@novell.com>
776
777         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
778         of a top-level attribute without an attribute target.
779         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
780         Make non-static.
781         (Attribute.Conditional_GetConditionName), 
782         (Attribute.Obsolete_GetObsoleteMessage): Update.
783         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
784         part of ScanForIndexerName.
785         (Attribute.CanIgnoreInvalidAttribute): New function.
786         (Attribute.ScanForIndexerName): Move to ...
787         (Attributes.ScanForIndexerName): ... here.
788         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
789         (Attributes.Search): New internal variant that can choose not to
790         complain if types aren't resolved.  The original signature now
791         complains.
792         (Attributes.GetClsCompliantAttribute): Use internal variant, with
793         complaints suppressed.
794         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
795         only if it not useful.
796         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
797         top-level for attributes that are shared between the assembly
798         and a top-level class.
799         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
800         * class.cs: Update to reflect changes.
801         (DefineIndexers): Fuse loops.
802         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
803         a couple more variants of attribute names.
804
805 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
806
807         Fix bug #52585 (Implemented explicit attribute declaration)
808
809         * attribute.cs:
810         (Attributable.ValidAttributeTargets): New abstract method. It gets
811         list of valid attribute targets for explicit target declaration.
812         (Attribute.Target): It holds target itself.
813         (AttributeSection): Removed.
814         (Attribute.CheckTargets): New method. It checks whether attribute
815         target is valid for the current element.
816
817         * class.cs:
818         (EventProperty): New class. For events that are declared like
819         property (with add and remove accessors).
820         (EventField): New class. For events that are declared like field.
821         class.cs
822
823         * cs-parser.jay: Implemented explicit attribute target declaration.
824
825         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
826         Override ValidAttributeTargets.
827
828         * parameter.cs:
829         (ReturnParameter): Class for applying custom attributes on 
830         the return type.
831         (ParameterAtribute): New class. Class for applying custom
832         attributes on the parameter type.
833
834 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
835
836         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
837         definitions. 
838
839         (Method): Allow UNSAFE here.
840
841         * modifiers.cs: Support unsafe reporting.
842
843 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
844
845         * decl.cs: Fix bug #58478.
846
847 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
848
849         * statement.cs: When checking for unreachable code on an EmptyStatement,
850         set the location. Fixes bug #58488.
851
852 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
853
854         * driver.cs: Add -pkg handling.
855
856         From Gonzalo: UseShelLExecute=false
857
858 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
859
860         * attribute.cs:
861         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
862         for attribute.
863         (Attribute.IsClsCompliaceRequired): Moved to base for better
864         accesibility.
865         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
866         when attribute is AttributeUsageAttribute.
867         (Attribute.GetValidTargets): Simplified.
868         (Attribute.GetAttributeUsage): New method returns AttributeUsage
869         attribute for this type.
870         (Attribute.ApplyAttributes): Method renamed to Emit and make
871         non-static.
872         (GlobalAttributeSection): New class for special handling of global
873         attributes (assembly, module).
874         (AttributeSection.Emit): New method.
875
876         * class.cs: Implemented Attributable abstract methods.
877         (MethodCore.LabelParameters): Moved to Parameter class.
878         (Accessor): Is back simple class.
879         (PropertyMethod): Implemented Attributable abstract class.
880         (DelegateMethod): Implemented Attributable abstract class.
881         (Event): New constructor for disctintion between normal Event
882         and Event with accessors.
883
884         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
885
886         * codegen.cs, const.cs, decl.cs, delegate.cs:
887         (CommonAssemblyModulClass): Implemented Attributable abstract class
888         and simplified.
889
890         * enum.cs: Implement IAttributeSupport interface.
891         (EnumMember): New class for emum members. Implemented Attributable
892         abstract class
893
894         * parameter.cs:
895         (ParameterBase): Is abstract.
896         (ReturnParameter): New class for easier [return:] attribute handling.
897
898         * typemanager.cs: Removed builder_to_attr.
899
900 2004-05-11  Raja R Harinath  <rharinath@novell.com>
901
902         Fix bug #57151.
903         * attribute.cs (Attribute.GetPositionalValue): New function.
904         * class.cs (TypeContainer.VerifyMembers): New function.
905         (TypeContainer.Emit): Use it.
906         (ClassOrStruct): New base class for Class and Struct.
907         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
908         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
909         class.
910         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
911         then each non-static field should have a FieldOffset attribute.
912         Otherwise, none of the fields should have a FieldOffset attribute.
913         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
914         and FieldOffset attributes.
915         * typemanager.cs (TypeManager.struct_layout_attribute_type)
916         (TypeManager.field_offset_attribute_type): New core types.
917         (TypeManager.InitCoreTypes): Initialize them.
918
919 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
920
921         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
922         Return correct type.
923         From bug #58270.
924
925 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
926
927         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
928         be implicitly converted to ulong.
929         
930         * expression.cs: The logic for allowing operator &, | and ^ worked
931         was wrong, it worked before because we did not report an error in
932         an else branch.  Fixes 57895.
933
934         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
935         allow volatile fields to be reference types.
936
937 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
938
939         * driver.cs: Add support for /debug-
940
941 2004-05-07  Raja R Harinath  <rharinath@novell.com>
942
943         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
944         Add a 'complain' parameter to silence errors.
945         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
946         silently overlooked type-resolutions.
947         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
948         to reflect changes.
949         (Attributes.Search): New function.
950         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
951         (Attributes.GetAttributeFullName): Remove hack.
952         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
953         Update to reflect changes.
954         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
955         Use Attributes.Search instead of nested loops.
956
957 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
958
959         * decl.cs:
960         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
961         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
962         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
963
964         * report.cs: (Report.Warning): Renamed to Warning_T because of
965         parameter collision.
966
967 2004-05-05  Raja R Harinath  <rharinath@novell.com>
968
969         * expression.cs (MemberAccess.ResolveMemberAccess):
970         Exit with non-zero status after Report.Error.
971         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
972         Likewise.
973         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
974
975 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
976
977         * support.cs: Don't hang when the file is empty.
978
979 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
980
981         * support.cs: In SeekableStreamReader, compute the preamble size of the
982           underlying stream. Position changes should take into account that initial
983           count of bytes.
984
985 2004-05-03  Todd Berman  <tberman@sevenl.net>
986
987         * driver.cs: remove unused GetSysVersion function.
988
989 2004-05-03  Todd Berman  <tberman@sevenl.net>
990
991         * driver.cs: Remove the hack from saturday, as well as the hack
992         from jackson (LoadAssemblyFromGac), also adds the CWD to the
993         link_paths to get that bit proper.
994
995 2004-05-01  Todd Berman  <tberman@sevenl.net>
996
997         * driver.cs: Try a LoadFrom before a Load, this checks the current
998         path. This is currently a bug in mono that is be fixed, however, this
999         provides a workaround for now. This will be removed when the bug
1000         is fixed.
1001
1002 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1003
1004         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1005         incomplete key pairs (#57941).
1006
1007 2004-05-01  Todd Berman  <tberman@sevenl.net>
1008
1009         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1010         from the GAC
1011
1012 2004-04-30  Jackson Harper  <jackson@ximian.com>
1013
1014         * codegen.cs: Open keys readonly.
1015         
1016 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1017
1018         * typemanager.cs: don't report cyclic struct layout when a struct
1019         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1020         which has 2 Pango.Rectangle fields.
1021
1022 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1023
1024         * expression.cs: Handle IntPtr comparisons with IL code
1025         rather than a method call.
1026
1027 2004-04-29  Martin Baulig  <martin@ximian.com>
1028
1029         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1030         the list of PropertyInfo's in class hierarchy and find the
1031         accessor.  Fixes #56013.
1032
1033 2004-04-29  Martin Baulig  <martin@ximian.com>
1034
1035         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
1036
1037 2004-04-29  Martin Baulig  <martin@ximian.com>
1038
1039         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1040
1041         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
1042
1043 2004-04-29  Martin Baulig  <martin@ximian.com>
1044
1045         * class.cs (ConstructorInitializer.Resolve): Check whether the
1046         parent .ctor is accessible.  Fixes #52146.
1047
1048 2004-04-29  Martin Baulig  <martin@ximian.com>
1049
1050         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1051
1052         * statement.cs (Using.EmitLocalVariableDecls): Use
1053         TypeManager.idisposable_type, not typeof (IDisposable).
1054         (Foreach.EmitCollectionForeach): Added support for valuetypes.
1055
1056 2004-04-29  Martin Baulig  <martin@ximian.com>
1057
1058         * class.cs (Event.Define): Don't emit the field and don't set
1059         RTSpecialName and SpecialName for events on interfaces.  Fixes
1060         #57703. 
1061
1062 2004-04-29  Raja R Harinath  <rharinath@novell.com>
1063
1064         Refactor Attribute.ApplyAttributes.
1065         * attribute.cs (Attributable): New base class for objects that can
1066         have Attributes applied on them.
1067         (Attribute): Make AttributeUsage fields public.
1068         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
1069         (Attribute.IsInternalCall): New property.
1070         (Attribute.UsageAttr): Convert to a public read-only property.
1071         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
1072         (Attribute.ResolveType, Attribute.Resolve)
1073         (Attribute.ScanForIndexerName): Update to reflect changes.
1074         (Attribute.CheckAttributeTarget): Re-format.
1075         (Attribute.ApplyAttributes): Refactor, to various
1076         Attributable.ApplyAttributeBuilder methods.
1077         * decl.cs (MemberCore): Make Attributable.
1078         * class.cs (Accessor): Make Attributable.
1079         (MethodData.ApplyAttributes): Use proper attribute types, not
1080         attribute names.
1081         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
1082         (TypeContainer.ApplyAttributeBuilder)
1083         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
1084         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
1085         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
1086         (Operator.ApplyAttributeBuilder): New factored-out methods.
1087         * const.cs (Const.ApplyAttributeBuilder): Likewise.
1088         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
1089         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
1090         * parameter.cs (ParameterBase): New Attributable base class
1091         that can also represent Return types.
1092         (Parameter): Update to the changes.
1093
1094 2004-04-29  Jackson Harper  <jackson@ximian.com>
1095
1096         * driver.cs: Prefer the corlib system version when looking for
1097         assemblies in the GAC. This is still a hack, but its a better hack
1098         now.
1099         
1100 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
1101
1102         * decl.cs, enum.cs: Improved error 3005 reporting.
1103   
1104         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
1105         (related_symbols): New private member for list of symbols
1106         related to reported error/warning.
1107         
1108         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
1109
1110 2004-04-29  Martin Baulig  <martin@ximian.com>
1111
1112         * ecore.cs (Expression.Constantify): If we're an enum and
1113         TypeManager.TypeToCoreType() doesn't give us another type, use
1114         t.UnderlyingSystemType.  Fixes #56178.  
1115
1116 2004-04-29  Martin Baulig  <martin@ximian.com>
1117
1118         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
1119         interfaces and for each interface, only add members directly
1120         declared in that interface.  Fixes #53255.
1121
1122 2004-04-28  Martin Baulig  <martin@ximian.com>
1123
1124         * expression.cs (ConditionalLogicalOperator): Use a temporary
1125         variable for `left' to avoid that we evaluate it more than once;
1126         bug #52588.
1127
1128 2004-04-28  Martin Baulig  <martin@ximian.com>
1129
1130         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
1131         `void[]' (CS1547).
1132
1133 2004-04-28  Martin Baulig  <martin@ximian.com>
1134
1135         * statement.cs (LocalInfo.Resolve): Check whether the type is not
1136         void (CS1547).
1137
1138         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
1139         whether the type is not void (CS1547).
1140
1141 2004-04-28  Martin Baulig  <martin@ximian.com>
1142
1143         * expression.cs (Unary.DoResolveLValue): Override this and report
1144         CS0131 for anything but Operator.Indirection.
1145
1146 2004-04-28  Martin Baulig  <martin@ximian.com>
1147
1148         Committing a patch from Ben Maurer; see bug #50820.
1149
1150         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
1151         check for classes.
1152
1153         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
1154         classes.        
1155
1156 2004-04-28  Martin Baulig  <martin@ximian.com>
1157
1158         Committing a patch from Ben Maurer; see bug #50820.
1159
1160         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
1161         check for classes.
1162
1163         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
1164         classes.        
1165
1166 2004-04-28  Martin Baulig  <martin@ximian.com>
1167
1168         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
1169         (Block.AddLabel): Call DoLookupLabel() to only search in the
1170         current block.
1171
1172 2004-04-28  Martin Baulig  <martin@ximian.com>
1173
1174         * cfold.cs (ConstantFold.BinaryFold): Added special support for
1175         comparing StringConstants and NullLiterals in Equality and Inequality.
1176
1177 2004-04-28  Jackson Harper  <jackson@ximian.com>
1178
1179         * driver.cs: Attempt to load referenced assemblies from the
1180         GAC. This is the quick and dirty version of this method that
1181         doesnt take into account versions and just takes the first
1182         canidate found. Will be good enough for now as we will not have more
1183         then one version installed into the GAC until I update this method.
1184
1185 2004-04-28  Martin Baulig  <martin@ximian.com>
1186
1187         * typemanager.cs (TypeManager.CheckStructCycles): New public
1188         static method to check for cycles in the struct layout.
1189
1190         * rootcontext.cs (RootContext.PopulateTypes): Call
1191         TypeManager.CheckStructCycles() for each TypeContainer.
1192         [Note: We only need to visit each type once.]
1193
1194 2004-04-28  Martin Baulig  <martin@ximian.com>
1195
1196         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
1197
1198         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
1199         success and added `out object value'.  Use a `bool resolved' field
1200         to check whether we've already been called rather than
1201         `ConstantValue != null' since this breaks for NullLiterals.
1202
1203 2004-04-28  Raja R Harinath  <rharinath@novell.com>
1204
1205         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
1206         setting of this flag, since the 'set' method may be non-public.
1207
1208 2004-04-28  Raja R Harinath  <rharinath@novell.com>
1209
1210         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
1211         check on current_vector.Block.
1212
1213 2004-04-27  Martin Baulig  <martin@ximian.com>
1214
1215         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
1216         a field initializer.  Fixes #56459.
1217
1218 2004-04-27  Martin Baulig  <martin@ximian.com>
1219
1220         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
1221         we're not attempting to use an indexer.  Fixes #52154.
1222
1223 2004-04-27  Martin Baulig  <martin@ximian.com>
1224
1225         * statement.cs (Return): Don't create a return label if we don't
1226         need it; reverts my change from January 20th.  Thanks to Ben
1227         Maurer for this.
1228
1229 2004-04-27  Martin Baulig  <martin@ximian.com>
1230
1231         According to the spec, `goto' can only leave a nested scope, but
1232         never enter it.
1233
1234         * statement.cs (Block.LookupLabel): Only lookup in the current
1235         block, don't recurse into parent or child blocks.
1236         (Block.AddLabel): Check in parent and child blocks, report
1237         CS0140/CS0158 if we find a duplicate.
1238         (Block): Removed this indexer for label lookups.
1239         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
1240         this already does the error reporting for us.
1241
1242         * flowanalysis.cs
1243         (FlowBranching.UsageVector.Block): New public variable; may be null.
1244         (FlowBranching.CreateSibling): Added `Block' argument.
1245         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
1246         label for the target of a `goto' and check whether we're not
1247         leaving a `finally'.
1248
1249 2004-04-27  Martin Baulig  <martin@ximian.com>
1250
1251         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1252         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
1253         just for returns).
1254
1255 2004-04-27  Martin Baulig  <martin@ximian.com>
1256
1257         * statement.cs (Block.AddLabel): Also check for implicit blocks
1258         and added a CS0158 check.
1259
1260 2004-04-27  Martin Baulig  <martin@ximian.com>
1261
1262         * flowanalysis.cs (FlowBranchingLoop): New class.
1263         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
1264         UsageVector's instead of an ArrayList.
1265         (FlowBranching.Label): Likewise.
1266         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
1267         (FlowBranching.AddBreakVector): New method.
1268
1269 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
1270
1271         * attribute.cs: Small regression fix: only convert the type if we
1272         the type is different, fixes System.Drawing build.
1273
1274 2004-04-27  Martin Baulig  <martin@ximian.com>
1275
1276         * attribute.cs (Attribute.Resolve): If we have a constant value
1277         for a named field or property, implicity convert it to the correct
1278         type.
1279
1280 2004-04-27  Raja R Harinath  <rharinath@novell.com>
1281
1282         * statement.cs (Block.Block): Implicit blocks share
1283         'child_variable_names' fields with parent blocks.
1284         (Block.AddChildVariableNames): Remove.
1285         (Block.AddVariable): Mark variable as "used by a child block" in
1286         every surrounding block.
1287         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
1288         been used in a child block, complain about violation of "Invariant
1289         meaning in blocks" rule.
1290         * cs-parser.jay (declare_local_variables): Don't use
1291         AddChildVariableNames.
1292         (foreach_statement): Don't create an implicit block: 'foreach'
1293         introduces a scope.
1294
1295 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
1296
1297         * convert.cs (ImplicitNumericConversion): 0 is also positive when
1298         converting from 0L to ulong.  Fixes 57522.
1299
1300 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
1301
1302         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
1303         derived class hides via 'new' keyword field from base class (test-242.cs).
1304         TODO: Handle this in the more general way.
1305         
1306         * class.cs (CheckBase): Ditto.
1307
1308 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
1309
1310         * decl.cs (caching_flags): New member for storing cached values
1311         as bit flags.
1312         (MemberCore.Flags): New enum where bit flags for caching_flags
1313         are defined.
1314         (MemberCore.cls_compliance): Moved to caching_flags.
1315         (DeclSpace.Created): Moved to caching_flags.
1316
1317         * class.cs: Use caching_flags instead of DeclSpace.Created
1318         
1319 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
1320
1321         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
1322         if we are only a derived class, not a nested class.
1323
1324         * typemanager.cs: Same as above, but do this at the MemberLookup
1325         level (used by field and methods, properties are handled in
1326         PropertyExpr).   Allow for the qualified access if we are a nested
1327         method. 
1328
1329 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
1330
1331         * class.cs: Refactoring.
1332         (IMethodData): New inteface; Holds links to parent members
1333         to avoid member duplication (reduced memory allocation).
1334         (Method): Implemented IMethodData interface.
1335         (PropertyBase): New inner classes for get/set methods.
1336         (PropertyBase.PropertyMethod): Implemented IMethodData interface
1337         (Event): New inner classes for add/remove methods.
1338         (Event.DelegateMethod): Implemented IMethodData interface.
1339
1340         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
1341         EmitContext (related to class.cs refactoring).
1342
1343 2004-04-21  Raja R Harinath  <rharinath@novell.com>
1344
1345         * delegate.cs (Delegate.VerifyApplicability): If the number of
1346         arguments are the same as the number of parameters, first try to
1347         verify applicability ignoring  any 'params' modifier on the last
1348         parameter.
1349         Fixes #56442.
1350
1351 2004-04-16  Raja R Harinath  <rharinath@novell.com>
1352
1353         * class.cs (TypeContainer.AddIndexer): Use
1354         'ExplicitInterfaceName' to determine if interface name was
1355         explicitly specified.  'InterfaceType' is not initialized at this time.
1356         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
1357         Indexers array is already in the required order.  Initialize
1358         'IndexerName' only if there are normal indexers.
1359         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
1360         (TypeContainer.Emit): Emit DefaultMember attribute only if
1361         IndexerName is initialized.
1362         Fixes #56300.
1363
1364 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
1365
1366         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
1367         Fixes #57007
1368
1369 2004-04-15  Raja R Harinath  <rharinath@novell.com>
1370
1371         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
1372         attributes.
1373         Fix for #56456.
1374
1375         * attribute.cs (Attribute.Resolve): Check for duplicate named
1376         attributes.
1377         Fix for #56463.
1378
1379 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
1380
1381         * iterators.cs (MarkYield): track whether we are in an exception,
1382         and generate code accordingly.  Use a temporary value to store the
1383         result for our state.
1384
1385         I had ignored a bit the interaction of try/catch with iterators
1386         since their behavior was not entirely obvious, but now it is
1387         possible to verify that our behavior is the same as MS .NET 2.0
1388
1389         Fixes 54814
1390
1391 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
1392
1393         * iterators.cs: Avoid creating temporaries if there is no work to
1394         do. 
1395
1396         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
1397         Enumerations, use TypeManager.EnumToUnderlying and call
1398         recursively. 
1399
1400         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
1401         bug #57013
1402
1403         (This.Emit): Use EmitContext.EmitThis to emit our
1404         instance variable.
1405
1406         (This.EmitAssign): Ditto.
1407
1408         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
1409         codepaths, we will move all the functionality into
1410         Mono.CSharp.This 
1411
1412         (FieldExpr.EmitAssign): Ditto.
1413
1414         This fixes several hidden bugs that I uncovered while doing a code
1415         review of this today.
1416
1417         * codegen.cs (EmitThis): reworked so the semantics are more clear
1418         and also support value types "this" instances.
1419
1420         * iterators.cs: Changed so that for iterators in value types, we
1421         do not pass the value type as a parameter.  
1422
1423         Initialization of the enumerator helpers is now done in the caller
1424         instead of passing the parameters to the constructors and having
1425         the constructor set the fields.
1426
1427         The fields have now `assembly' visibility instead of private.
1428
1429 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
1430
1431         * expression.cs (Argument.Resolve): Check if fields passed as ref
1432         or out are contained in a MarshalByRefObject.
1433
1434         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
1435         another compiler type.
1436
1437 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1438
1439         * class.cs (Indexer.Define): use the new name checking method.
1440         Also, return false on an error.
1441         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
1442         (is_identifier_[start/part]_character): make static.
1443
1444 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
1445
1446         * expression.cs (Binary.ResolveOperator): Do no append strings
1447         twice: since we can be invoked more than once (array evaluation)
1448         on the same concatenation, take care of this here.  Based on a fix
1449         from Ben (bug #56454)
1450
1451 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
1452
1453         * codegen.cs: Fix another case where CS1548 must be reported (when 
1454         delay-sign isn't specified and no private is available #56564). Fix
1455         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
1456         error when MCS is used on the MS runtime and we need to delay-sign 
1457         (which seems unsupported by AssemblyBuilder - see #56621).
1458
1459 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
1460
1461         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
1462         (TypeManager.ComputeNamespaces): Faster implementation for
1463         Microsoft runtime.
1464
1465         * compiler.csproj: Updated AssemblyName to mcs.
1466
1467 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
1468
1469         * rootcontext.cs: Add new types to the boot resolution.
1470
1471         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
1472         MulticastDelegate is not allowed.
1473
1474         * typemanager.cs: Add new types to lookup: System.TypedReference
1475         and ArgIterator.
1476
1477         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
1478         check for TypedReference or ArgIterator, they are not allowed. 
1479
1480         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
1481         makes us properly catch 1510 in some conditions (see bug 56016 for
1482         details). 
1483
1484 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
1485
1486         * CryptoConvert.cs: update from corlib version
1487         with endian fixes.
1488
1489 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
1490
1491         * class.cs (Indexer.Define): Check indexername declaration
1492
1493 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
1494
1495         * attribute.cs (IsClsCompliant): Fixed problem with handling
1496         all three states (compliant, not-compliant, undetected).
1497
1498 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
1499
1500         * attribute.cs (Attribute): Location is now public.
1501         (Resolve): Store resolved arguments (pos_values) in attribute class.
1502         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
1503         (GetClsCompliantAttributeValue): New method that gets
1504         CLSCompliantAttribute value.
1505         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
1506         if exists else null.
1507         (AttributeTester): New class for CLS-Compliant verification routines.
1508
1509         * class.cs (Emit): Add CLS-Compliant verification.
1510         (Method.GetSignatureForError): Implemented.
1511         (Constructor.GetSignatureForError): Implemented
1512         (Constructor.HasCompliantArgs): Returns if constructor has
1513         CLS-Compliant arguments.
1514         (Constructor.Emit): Override.
1515         (Construcor.IsIdentifierClsCompliant): New method; For constructors
1516         is needed to test only parameters.
1517         (FieldBase.GetSignatureForError): Implemented.
1518         (TypeContainer): New member for storing base interfaces.
1519         (TypeContainer.FindMembers): Search in base interfaces too.
1520
1521         * codegen.cs (GetClsComplianceAttribute): New method that gets
1522         assembly or module CLSCompliantAttribute value.
1523         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
1524         for assembly.
1525         (ModuleClass.Emit): Add error 3012 test.
1526
1527         * const.cs (Emit): Override and call base for CLS-Compliant tests.
1528
1529         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
1530         state for all decl types.
1531         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
1532         if CLS-Compliant tests are required.
1533         (IsClsCompliaceRequired): New method. Analyze whether code
1534         must be CLS-Compliant.
1535         (IsExposedFromAssembly): New method. Returns true when MemberCore
1536         is exposed from assembly.
1537         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
1538         value or gets cached value.
1539         (HasClsCompliantAttribute): New method. Returns true if MemberCore
1540         is explicitly marked with CLSCompliantAttribute.
1541         (IsIdentifierClsCompliant): New abstract method. This method is
1542         used to testing error 3005.
1543         (IsIdentifierAndParamClsCompliant): New method. Common helper method
1544         for identifier and parameters CLS-Compliant testing.
1545         (VerifyClsCompliance): New method. The main virtual method for
1546         CLS-Compliant verifications.
1547         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
1548         null. I don't know why is null (too many public members !).
1549         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
1550         and get value of first CLSCompliantAttribute that found.
1551
1552         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
1553         (VerifyClsCompliance): Override and add extra tests.
1554
1555         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
1556         clscheck- disable CLS-Compliant verification event if assembly is has
1557         CLSCompliantAttribute(true).
1558
1559         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
1560         ApllyAttribute is now called in emit section as in the other cases.
1561         Possible future Emit integration.
1562         (IsIdentifierClsCompliant): New override.
1563         (VerifyClsCompliance): New override.
1564         (GetEnumeratorName): Returns full enum name.
1565
1566         * parameter.cs (GetSignatureForError): Implemented.
1567
1568         * report.cs (WarningData): New struct for Warning message information.
1569         (LocationOfPreviousError): New method.
1570         (Warning): New method. Reports warning based on the warning table.
1571         (Error_T): New method. Reports error based on the error table.
1572
1573         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
1574         verifications are done here.
1575
1576         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
1577
1578         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
1579         CLSCompliantAttribute.
1580         (all_imported_types): New member holds all imported types from other
1581         assemblies.
1582         (LoadAllImportedTypes): New method fills static table with exported types
1583         from all referenced assemblies.
1584         (Modules): New property returns all assembly modules.
1585
1586 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
1587
1588         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
1589         throwing a parser error.
1590
1591         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
1592         which removes the hardcoded get_/set_ prefixes for properties, as
1593         IL allows for the properties to be named something else.  
1594
1595         Bug #56013
1596
1597         * expression.cs: Do not override operand before we know if it is
1598         non-null.  Fix 56207
1599
1600 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1601
1602         * typemanager.cs: support for pinned variables.
1603
1604 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1605
1606         * decl.cs, typemanager.cs: Avoid using an arraylist
1607         as a buffer if there is only one result set.
1608
1609 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1610
1611         * expression.cs: Make sure you cant call a static method
1612         with an instance expression, bug #56174.
1613
1614 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
1615
1616         * class.cs (IsDuplicateImplementation): Improve error reporting to
1617         flag 663 (method only differs in parameter modifier).
1618
1619         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
1620         in preprocessor directives.
1621
1622         * location.cs (LookupFile): Allow for the empty path.
1623
1624         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
1625         better approach for some of that patch, but its failing with the
1626         CharSet enumeration.  For now try/catch will do.
1627
1628         * typemanager.cs: Do not crash if a struct does not have fields.
1629         Fixes 56150.
1630
1631 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1632
1633         * expression.cs: cs0213, cant fix a fixed expression.
1634         fixes 50231.
1635
1636 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1637
1638         * cs-parser.jay: detect invalid embeded statements gracefully.
1639         bug #51113.
1640
1641 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
1642
1643         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
1644         As a regex:
1645         s/
1646         the invocation type may not be a subclass of the tye of the item/
1647         The type of the item must be a subclass of the invocation item.
1648         /g
1649
1650         Fixes bug #50820.
1651
1652 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
1653
1654         * attribute.cs: Added methods to get a string and a bool from an
1655         attribute. Required to information from AssemblyKeyFileAttribute,
1656         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
1657         * codegen.cs: Modified AssemblyName creation to include support for
1658         strongnames. Catch additional exceptions to report them as CS1548.
1659         * compiler.csproj: Updated include CryptoConvert.cs.
1660         * compiler.csproj.user: Removed file - user specific configuration.
1661         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
1662         Mono.Security assembly. The original class is maintained and tested in
1663         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
1664         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
1665         like CSC 8.0 (C# v2) supports.
1666         * Makefile: Added CryptoConvert.cs to mcs sources.
1667         * rootcontext.cs: Added new options for strongnames.
1668
1669 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
1670
1671         * driver.cs: For --expect-error, report error code `2'
1672         if the program compiled with no errors, error code `1' if
1673         it compiled with an error other than the one expected.
1674
1675 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
1676
1677         * compiler.csproj: Updated for Visual Studio .NET 2003.
1678         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
1679         * compiler.sln: Updated for Visual Studio .NET 2003.
1680
1681 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
1682
1683         * expression.cs: Fix bug #47234. We basically need to apply the
1684         rule that we prefer the conversion of null to a reference type
1685         when faced with a conversion to 'object' (csc behaviour).
1686
1687 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1688
1689         * statement.cs: Shorter form for foreach, eliminates
1690         a local variable. r=Martin.
1691
1692 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1693
1694         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
1695         checks if we can use brtrue/brfalse to test for 0.
1696         * expression.cs: use the above in the test for using brtrue/brfalse.
1697         cleanup code a bit.
1698
1699 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1700
1701         * expression.cs: Rewrite string concat stuff. Benefits:
1702
1703         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
1704         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
1705         rather than a concat chain.
1706
1707         * typemanager.cs: Add lookups for more concat overloads.
1708
1709 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
1710
1711         * expression.cs: Emit shorter il code for array init.
1712
1713         newarr
1714         dup
1715         // set 1
1716
1717         // set 2
1718
1719         newarr
1720         stloc.x
1721
1722         ldloc.x
1723         // set 1
1724
1725         ldloc.x
1726         // set 2
1727
1728 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
1729
1730         * statement.cs: Before, two switch blocks would be merged if the
1731         total size of the blocks (end_item - begin_item + 1) was less than
1732         two times the combined sizes of the blocks.
1733
1734         Now, it will only merge if after the merge at least half of the
1735         slots are filled.
1736
1737         fixes 55885.
1738
1739 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
1740
1741         * class.cs : csc build fix for GetMethods(). See bug #52503.
1742
1743 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
1744
1745         * expression.cs: Make sure fp comparisons work with NaN.
1746         This fixes bug #54303. Mig approved this patch a long
1747         time ago, but we were not able to test b/c the runtime
1748         had a related bug.
1749
1750 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
1751
1752         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
1753
1754 2004-03-19  Martin Baulig  <martin@ximian.com>
1755
1756         * class.cs (MemberCore.IsDuplicateImplementation): Report the
1757         error here and not in our caller.
1758
1759 2004-03-19  Martin Baulig  <martin@ximian.com>
1760
1761         * interface.cs: Completely killed this file.
1762         (Interface): We're now a TypeContainer and live in class.cs.
1763
1764         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
1765         argument; we're now also called for interfaces.
1766         (TypeContainer.DefineMembers): Allow this method being called
1767         multiple times.
1768         (TypeContainer.GetMethods): New public method; formerly known as
1769         Interface.GetMethod().  This is used by PendingImplementation.
1770         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
1771         it's now private and non-static.
1772         (Interface): Moved this here; it's now implemented similar to
1773         Class and Struct.
1774         (Method, Property, Event, Indexer): Added `bool is_interface'
1775         argument to their .ctor's.
1776         (MemberBase.IsInterface): New public field.
1777
1778         * cs-parser.jay: Create normal Method, Property, Event, Indexer
1779         instances instead of InterfaceMethod, InterfaceProperty, etc.
1780         (opt_interface_base): Removed; we now use `opt_class_base' instead.
1781         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
1782
1783 2004-03-19  Martin Baulig  <martin@ximian.com>
1784
1785         * class.cs (MethodCore.IsDuplicateImplementation): New private
1786         method which does the CS0111 checking.
1787         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
1788         Use IsDuplicateImplementation().
1789
1790 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
1791
1792         * decl.cs (FindMemberToOverride): New method to find the correct
1793         method or property to override in the base class.
1794         * class.cs
1795             - Make Method/Property use the above method to find the
1796               version in the base class.
1797             - Remove the InheritableMemberSignatureCompare as it is now
1798               dead code.
1799
1800         This patch makes large code bases much faster to compile, as it is
1801         O(n) rather than O(n^2) to do this validation.
1802
1803         Also, it fixes bug 52458 which is that nested classes are not
1804         taken into account when finding the base class member.
1805
1806         Reviewed/Approved by Martin.
1807
1808 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
1809
1810         * interface.cs: In all interface classes removed redundant
1811         member initialization.
1812
1813 2004-03-16  Martin Baulig  <martin@ximian.com>
1814
1815         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
1816
1817 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
1818
1819         * decl.cs (DefineTypeAndParents): New helper method to define a
1820         type's containers before the type itself is defined;  This is a
1821         bug exposed by the recent changes to Windows.Forms when an
1822         implemented interface was defined inside a class that had not been
1823         built yet.   
1824
1825         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
1826
1827         (Check): Loop correctly to report errors modifiers
1828         (UNSAFE was not in the loop, since it was the same as TOP).
1829
1830         * interface.cs: Every interface member now takes a ModFlags,
1831         instead of a "is_new" bool, which we set on the base MemberCore. 
1832
1833         Every place where we called "UnsafeOk" in the interface, now we
1834         call the proper member (InterfaceMethod.UnsafeOK) instead to get
1835         the unsafe settings from the member declaration instead of the
1836         container interface. 
1837
1838         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
1839
1840         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
1841         `set_indexer_name' to the pending bits (one per type).
1842
1843         We fixed a bug today that was picking the wrong method to
1844         override, since for properties the existing InterfaceMethod code
1845         basically ignored the method name.  Now we make sure that the
1846         method name is one of the valid indexer names.
1847
1848 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
1849  
1850         * support.cs (SeekableStreamReader): Keep track of stream byte
1851         positions and don't mix them with character offsets to the buffer.
1852
1853         Patch from Gustavo Giráldez
1854
1855 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
1856
1857         * interface.cs (InterfaceSetGetBase): Removed double member
1858         initialization, base class does it as well.
1859
1860 2004-03-13  Martin Baulig  <martin@ximian.com>
1861
1862         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
1863         when compiling corlib.
1864
1865 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
1866
1867         * convert.cs (ExplicitConversion): We were reporting an error on
1868         certain conversions (object_type source to a value type, when the
1869         expression was `null') before we had a chance to pass it through
1870         the user defined conversions.
1871
1872         * driver.cs: Replace / and \ in resource specifications to dots.
1873         Fixes 50752
1874
1875         * class.cs: Add check for duplicate operators.  Fixes 52477
1876
1877 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
1878
1879         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
1880         that are in the middle of the statements, not only at the end.
1881         Fixes #54987
1882
1883         * class.cs (TypeContainer.AddField): No longer set the
1884         `HaveStaticConstructor' flag, now we call it
1885         `UserDefineStaticConstructor' to diferentiate the slightly
1886         semantic difference.
1887
1888         The situation is that we were not adding BeforeFieldInit (from
1889         Modifiers.TypeAttr) to classes that could have it.
1890         BeforeFieldInit should be set to classes that have no static
1891         constructor. 
1892
1893         See:
1894
1895         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
1896
1897         And most importantly Zoltan's comment:
1898
1899         http://bugzilla.ximian.com/show_bug.cgi?id=44229
1900
1901         "I think beforefieldinit means 'it's ok to initialize the type sometime 
1902          before its static fields are used', i.e. initialization does not need
1903          to be triggered by the first access to the type. Setting this flag
1904          helps the JIT to compile better code, since it can run the static
1905          constructor at JIT time, and does not need to generate code to call it
1906          (possibly lots of times) at runtime. Unfortunately, mcs does not set
1907          this flag for lots of classes like String. 
1908          
1909          csc sets this flag if the type does not have an explicit static 
1910          constructor. The reasoning seems to be that if there are only static
1911          initalizers for a type, and no static constructor, then the programmer
1912          does not care when this initialization happens, so beforefieldinit
1913          can be used.
1914          
1915          This bug prevents the AOT compiler from being usable, since it 
1916          generates so many calls to mono_runtime_class_init that the AOT code
1917          is much slower than the JITted code. The JITted code is faster, 
1918          because it does not generate these calls if the vtable is type is
1919          already initialized, which is true in the majority of cases. But the
1920          AOT compiler can't do this."
1921
1922 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
1923
1924         * class.cs (MethodData.Emit): Refactor the code so symbolic
1925         information is generated for destructors;  For some reasons we
1926         were taking a code path that did not generate symbolic information
1927         before. 
1928
1929 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
1930
1931         * class.cs: Create a Constructor.CheckBase method that
1932         takes care of all validation type code. The method
1933         contains some code that was moved from Define.
1934
1935         It also includes new code that checks for duplicate ctors.
1936         This fixes bug #55148.
1937
1938 2004-03-09  Joshua Tauberer <tauberer@for.net>
1939
1940         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
1941         a { ... }-style array creation invokes EmitStaticInitializers
1942         which is not good for reference-type arrays.  String, decimal
1943         and now null constants (NullCast) are not counted toward
1944         static initializers.
1945
1946 2004-03-05  Martin Baulig  <martin@ximian.com>
1947
1948         * location.cs (SourceFile.HasLineDirective): New public field;
1949         specifies whether the file contains or is referenced by a "#line"
1950         directive.
1951         (Location.DefineSymbolDocuments): Ignore source files which
1952         either contain or are referenced by a "#line" directive.        
1953
1954 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
1955
1956         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
1957         direct access to our parent, so check the method inline there.
1958
1959 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
1960
1961         * expression.cs (Invocation.EmitCall): Miguel's last commit
1962         caused a regression. If you had:
1963
1964             T t = null;
1965             t.Foo ();
1966
1967         In Foo the implict this would be null.
1968
1969 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
1970
1971         * expression.cs (Invocation.EmitCall): If the method is not
1972         virtual, do not emit a CallVirt to it, use Call.
1973
1974         * typemanager.cs (GetFullNameSignature): Improve the method to
1975         cope with ".ctor" and replace it with the type name.
1976
1977         * class.cs (ConstructorInitializer.Resolve): Now the method takes
1978         as an argument the ConstructorBuilder where it is being defined,
1979         to catch the recursive constructor invocations.
1980
1981 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
1982
1983         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
1984         routines to check if a type is an enumerable/enumerator allow
1985         classes that implement the IEnumerable or IEnumerator interfaces.
1986
1987         * class.cs (Property, Operator): Implement IIteratorContainer, and
1988         implement SetYields.
1989
1990         (Property.Define): Do the block swapping for get_methods in the
1991         context of iterators.   We need to check if Properties also
1992         include indexers or not.
1993
1994         (Operator): Assign the Block before invoking the
1995         OperatorMethod.Define, so we can trigger the Iterator code
1996         replacement. 
1997
1998         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
1999         Property and Operator classes are not created when we parse the
2000         declarator but until we have the block completed, so we use a
2001         singleton SimpleIteratorContainer.Simple to flag whether the
2002         SetYields has been invoked.
2003
2004         We propagate this setting then to the Property or the Operator to
2005         allow the `yield' to function.
2006
2007 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
2008
2009         * codegen.cs: Implemented attribute support for modules.
2010         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
2011         Assembly/Module functionality.
2012
2013         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
2014         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
2015         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
2016
2017 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
2018
2019         * interface.cs (FindMembers): The operation is performed on all base
2020         interfaces and not only on the first. It is required for future CLS Compliance patch.
2021
2022 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2023
2024         * statement.cs, codegen.cs:
2025         This patch deals with patterns such as:
2026
2027         public class List : IEnumerable {
2028
2029                 public MyEnumerator GetEnumerator () {
2030                         return new MyEnumerator(this);
2031                 }
2032
2033                 IEnumerator IEnumerable.GetEnumerator () {
2034                         ...
2035                 }
2036                 
2037                 public struct MyEnumerator : IEnumerator {
2038                         ...
2039                 }
2040         }
2041
2042         Before, there were a few things we did wrong:
2043         1) we would emit callvirt on a struct, which is illegal
2044         2) we emited ldarg when we needed to emit ldarga
2045         3) we would mistakenly call the interface methods on an enumerator
2046         type that derived from IEnumerator and was in another assembly. For example:
2047
2048         public class MyEnumerator : IEnumerator
2049
2050         Would have the interface methods called, even if there were public impls of the
2051         method. In a struct, this lead to invalid IL code.
2052
2053 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
2054
2055         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
2056           renamed to Emit.
2057
2058         * delegate.cs (Define): Fixed crash when delegate type is undefined.
2059
2060 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
2061
2062         * cs-parser.jay: Fix small regression: we were not testing V2
2063         compiler features correctly.
2064
2065         * interface.cs: If the emit context is null, then create one
2066
2067 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
2068
2069         * decl.cs (GetSignatureForError): New virtual method to get full name
2070           for error messages.
2071
2072         * attribute.cs (IAttributeSupport): New interface for attribute setting.
2073           Now it is possible to rewrite ApplyAttributes method to be less if/else.
2074
2075         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
2076           Duplicated members and code in these classes has been removed.
2077           Better encapsulation in these classes.
2078
2079 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
2080
2081         * assign.cs (Assign.DoResolve): When dealing with compound
2082         assignments, there is a new rule in ECMA C# 2.4 (might have been
2083         there before, but it is documented here) that states that in:
2084
2085         a op= b;
2086
2087         If b is of type int, and the `op' is a shift-operator, then the
2088         above is evaluated as:
2089
2090         a = (int) a op b 
2091
2092         * expression.cs (Binary.ResolveOperator): Instead of testing for
2093         int/uint/long/ulong, try to implicitly convert to any of those
2094         types and use that in pointer arithmetic.
2095
2096         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
2097         method to print information for from the type, not from the
2098         null-method we were given.
2099
2100 2004-02-01  Duncan Mak  <duncan@ximian.com>
2101
2102         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
2103         parsing for cmd, fixes bug #53694.
2104
2105 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
2106
2107         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
2108         in the member name duplication tests. Property and operator name duplication
2109         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
2110
2111 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
2112
2113         * interface.cs (PopulateMethod): Fixed crash when interface method
2114         returns not existing type (error test cs0246-3.cs).
2115
2116 2004-02-02  Ravi Pratap M <ravi@ximian.com>
2117
2118         * cs-parser.jay (interface_accessors): Re-write actions to also
2119         store attributes attached to get and set methods. Fix spelling
2120         while at it.
2121
2122         (inteface_property_declaration): Modify accordingly.
2123
2124         (InterfaceAccessorInfo): New helper class to store information to pass
2125         around between rules that use interface_accessors.
2126
2127         * interface.cs (Emit): Apply attributes on the get and set
2128         accessors of properties and indexers too.
2129
2130         * attribute.cs (ApplyAttributes): Modify accordingly to use the
2131         right MethodBuilder when applying attributes to the get and set accessors.
2132
2133 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
2134
2135         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
2136
2137 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
2138
2139         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
2140
2141 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
2142
2143         * cs-parser.jay: Remove YIELD token, instead use the new grammar
2144         changes that treat `yield' specially when present before `break'
2145         or `return' tokens.
2146
2147         * cs-tokenizer.cs: yield is no longer a keyword.
2148
2149 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
2150
2151         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
2152         setting for default constructors.
2153         For default constructors are almost every time set wrong Modifier. The
2154         generated IL code has been alright. But inside mcs this values was
2155         wrong and this was reason why several of my CLS Compliance tests
2156         failed.
2157
2158 2004-01-22  Martin Baulig  <martin@ximian.com>
2159
2160         * cs-parser.jay (namespace_or_type_name): Return an Expression,
2161         not a QualifiedIdentifier.  This is what `type_name_expression'
2162         was previously doing.
2163         (type_name_expression): Removed; the code is now in
2164         `namespace_or_type_name'.
2165         (qualified_identifier): Removed, use `namespace_or_type_name'
2166         instead.
2167         (QualifiedIdentifier): Removed this class.      
2168
2169 2004-01-22  Martin Baulig  <martin@ximian.com>
2170
2171         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
2172         not a string as alias name.
2173
2174 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
2175
2176         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
2177         #52730 bug, and instead compute correctly the need to use a
2178         temporary variable when requesting an address based on the
2179         static/instace modified of the field and the constructor.
2180  
2181 2004-01-21  Martin Baulig  <martin@ximian.com>
2182
2183         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
2184         class and namespace before looking up aliases.  Fixes #52517.
2185
2186 2004-01-21  Martin Baulig  <martin@ximian.com>
2187
2188         * flowanalysis.cs (UsageVector.Merge): Allow variables being
2189         assinged in a 'try'; fixes exception4.cs.
2190
2191 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2192         * class.cs : Implemented parameter-less constructor for TypeContainer
2193
2194         * decl.cs: Attributes are now stored here. New property OptAttributes
2195
2196         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
2197
2198         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
2199
2200 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2201
2202         * typemanager.cs (CSharpSignature): Now reports also inner class name.
2203           (CSharpSignature): New method for indexer and property signature.
2204
2205 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2206
2207         * pending.cs (IsVirtualFilter): Faster implementation.
2208
2209 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2210
2211         * typemanager.cs: Avoid inclusion of same assembly more than once.
2212
2213 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2214
2215         * cs-parser.jay: Fixed problem where the last assembly attribute
2216           has been applied also to following declaration (class, struct, etc.)
2217           
2218 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2219
2220         * class.cs: Added error CS0538, CS0539 reporting.
2221         Fixed crash on Microsoft runtime when field type is void.
2222
2223         * cs-parser.jay: Added error CS0537 reporting.
2224
2225         * pending.cs: Added error CS0535 reporting.
2226         Improved error report for errors CS0536, CS0534.
2227
2228 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
2229
2230         Merge a few bits from the Anonymous Method MCS tree.
2231
2232         * statement.cs (ToplevelBlock): New class for toplevel methods,
2233         will hold anonymous methods, lifted variables.
2234
2235         * cs-parser.jay: Create toplevel blocks for delegates and for
2236         regular blocks of code. 
2237
2238 2004-01-20  Martin Baulig  <martin@ximian.com>
2239
2240         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
2241         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
2242         and `NeedExplicitReturn'; added `IsLastStatement'.
2243         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
2244         have a `ReturnLabel' or we're not unreachable.
2245
2246         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
2247         child's reachability; don't just override ours with it.  Fixes
2248         #58058 (lluis's example).
2249         (FlowBranching): Added public InTryOrCatch(), InCatch(),
2250         InFinally(), InLoop(), InSwitch() and
2251         BreakCrossesTryCatchBoundary() methods.
2252
2253         * statement.cs (Return): Do all error checking in Resolve().
2254         Unless we are the last statement in a top-level block, always
2255         create a return label and jump to it.
2256         (Break, Continue): Do all error checking in Resolve(); also make
2257         sure we aren't leaving a `finally'.
2258         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
2259         statement in a top-level block.
2260         (Block.Flags): Added `IsDestructor'.
2261         (Block.IsDestructor): New public property.
2262
2263 2004-01-20  Martin Baulig  <martin@ximian.com>
2264
2265         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
2266
2267 2004-01-20  Martin Baulig  <martin@ximian.com>
2268
2269         * statement.cs (Statement.ResolveUnreachable): New public method.
2270         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
2271         (Block.Resolve): Resolve unreachable statements.
2272
2273 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
2274
2275         * expression.cs: We need to fix the case where we do
2276         not have a temp variable here.
2277
2278         * assign.cs: Only expression compound assignments need
2279         temporary variables.
2280
2281 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
2282
2283         * flowanalysis.cs: Reduce memory allocation in a few ways:
2284           - A block with no variables should not allocate a bit
2285             vector for itself.
2286           - A method with no out parameters does not need any tracking
2287             for assignment of the parameters, so we need not allocate
2288             any data for it.
2289           - The arrays:
2290                 public readonly Type[] VariableTypes;
2291                 public readonly string[] VariableNames;
2292             Are redundant. The data is already stored in the variable
2293             map, so we need not allocate another array for it.
2294           - We need to add alot of checks for if (params | locals) == null
2295             due to the first two changes.
2296
2297 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
2298
2299         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
2300         implement IMemoryLocation, we store a copy on a local variable and
2301         take the address of it.  Patch from Benjamin Jemlich
2302
2303         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
2304         to use a special "type_name_expression" rule which reduces the
2305         number of "QualifiedIdentifier" classes created, and instead
2306         directly creates MemberAccess expressions.
2307
2308 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
2309
2310         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
2311         that fixes #52853.  Null literal assignment to ValueType
2312
2313         * class.cs (MethodData.Emit): Instead of checking the name of the
2314         method to determine if its a destructor, create a new derived
2315         class from Method called Destructor, and test for that.  
2316
2317         * cs-parser.jay: Create a Destructor object instead of a Method.  
2318
2319         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
2320
2321         Fixes: 52933
2322
2323 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
2324
2325         * expression.cs (Binary.ResolveOperator): Perform an implicit
2326         conversion from MethodGroups to their delegate types on the
2327         Addition operation.
2328
2329         * delegate.cs: Introduce a new class DelegateCreation that is the
2330         base class for `NewDelegate' and `ImplicitDelegateCreation',
2331         factor some code in here.
2332
2333         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
2334         conversion from MethodGroups to compatible delegate types. 
2335
2336         * ecore.cs (Expression.Resolve): Do not flag error 654
2337         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
2338         we allow conversions from MethodGroups to delegate types now.
2339
2340         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
2341         assignments in v2 either.
2342
2343 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
2344
2345         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
2346         static read-only fields in ctors.
2347
2348         Applied patch from Benjamin Jemlich 
2349
2350         * expression.cs (UnaryMutator): Avoid leaking local variables. 
2351
2352 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
2353
2354         * cs-tokenizer.cs (IsCastToken): Allow the various native types
2355         here to return true, as they can be used like this:
2356
2357                 (XXX) int.MEMBER ()
2358
2359         Fixed 49836 and all the other dups
2360
2361 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
2362
2363         * driver.cs: Implement /win32res and /win32icon.
2364
2365 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
2366
2367         * cs-parser.jay: Add a rule to improve error handling for the
2368         common mistake of placing modifiers after the type.
2369
2370 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
2371
2372         * cs-parser.jay (interface_event_declaration): Catch
2373         initialization of events on interfaces, and report cs0068
2374
2375         * cs-parser.jay (interface_event_declaration): Catch
2376         initialization of events. 
2377
2378         * ecore.cs: Better report missing constructors.
2379
2380         * expression.cs (Binary.ResolveOperator): My previous bug fix had
2381         the error reporting done in the wrong place.  Fix.
2382
2383         * expression.cs (Binary.ResolveOperator): Catch the 
2384         operator + (E x, E y) error earlier, and later allow for implicit
2385         conversions in operator +/- (E e, U x) from U to the underlying
2386         type of E.
2387
2388         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
2389         52596, if the container class is abstract, the default constructor
2390         is protected otherwise its public (before, we were always public).
2391
2392         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
2393         fixed statement.
2394
2395         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
2396         Jemlich that fixes bug #52597, MCS was generating invalid code for
2397         idisposable structs.   Thanks to Ben for following up with this
2398         bug as well.
2399
2400 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
2401
2402         * driver.cs: Allow assemblies without code to be generated, fixes
2403         52230.
2404
2405 2004-01-07  Nick Drochak <ndrochak@gol.com>
2406
2407         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
2408
2409 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
2410
2411         * cs-parser.jay: Add rules to improve error reporting if fields or
2412         methods are declared at the namespace level (error 116)
2413
2414         * Add rules to catch event add/remove
2415
2416 2004-01-04  David Sheldon <dave-mono@earth.li>
2417
2418   * expression.cs: Added matching ")" to error message for 
2419   CS0077
2420
2421 2004-01-03 Todd Berman <tberman@gentoo.org>
2422
2423         * ecore.cs, attribute.cs:
2424         Applying fix from #52429.
2425
2426 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2427
2428         * ecore.cs, expression.cs, statement.cs:
2429         Total rewrite of how we handle branching. We
2430         now handle complex boolean expressions with fewer
2431         jumps. As well if (x == 0) no longer emits a ceq.
2432
2433         if (x is Foo) is much faster now, because we generate
2434         better code.
2435
2436         Overall, we get a pretty big improvement on our benchmark
2437         tests. The code we generate is smaller and more readable.
2438
2439         I did a full two-stage bootstrap. The patch was reviewed
2440         by Martin and Miguel.
2441
2442 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2443
2444         * cs-parser.jay: Make primary_expression not take a QI.
2445         we dont need this because the member_access rule covers
2446         us here. So we replace the rule with just IDENTIFIER.
2447
2448         This has two good effects. First, we remove a s/r conflict.
2449         Second, we allocate many fewer QualifiedIdentifier objects.
2450
2451 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2452
2453         * attribute.cs: Handle MarshalAs attributes as pseudo, and
2454         set the correct information via SRE. This prevents
2455         hanging on the MS runtime. Fixes #29374.
2456
2457 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
2458
2459         * convert.cs: correctly handle conversions to value types
2460         from Enum and ValueType as unboxing conversions.
2461
2462         Fixes bug #52569. Patch by Benjamin Jemlich.
2463
2464 2004-01-02  Ravi Pratap  <ravi@ximian.com>
2465
2466         * expression.cs (BetterConversion): Prefer int -> uint
2467         over int -> ulong (csc's behaviour). This fixed bug #52046.
2468
2469 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2470
2471         * decl.cs (MemberCache.FindMembers): now returns a
2472         MemberInfo [].
2473
2474         * typemanager.cs: In general, go with with ^^.
2475         (CopyNewMethods): take an IList.
2476         (RealMemberLookup): Only allocate an arraylist
2477         if we copy from two sets of methods.
2478
2479         This change basically does two things:
2480         1) Fewer array lists allocated due to CopyNewMethods.
2481         2) the explicit cast in MemberList costed ALOT.
2482
2483 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
2484
2485         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
2486         a hashtable to avoid needless string allocations when an identifier is
2487         used more than once (the common case).
2488
2489 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2490
2491         * pending.cs: MS's TypeBuilder.GetInterfaces ()
2492         is broken, it will not return anything. So, we
2493         have to use the information we have in mcs to
2494         do the task.
2495
2496         * typemanager.cs: Add a cache for GetInterfaces,
2497         since this will now be used more often (due to ^^)
2498
2499         (GetExplicitInterfaces) New method that gets the
2500         declared, not effective, interfaces on a type
2501         builder (eg, if you have interface IFoo, interface
2502         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
2503         { IBar }.
2504
2505         This patch makes MCS able to bootstrap itself on
2506         Windows again.
2507
2508 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
2509
2510         * expression.cs: Remove the Nop's that Miguel put
2511         in by mistake.
2512
2513 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2514
2515         * report.cs, codegen.cs: Give the real stack trace to
2516         the error when an exception is thrown.
2517
2518 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2519
2520         * decl.cs: only allocate hashtables for ifaces if 
2521         it is an iface!
2522
2523 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2524
2525         * expression.cs: fix the error from cs0121-2.cs
2526         (a parent interface has two child interfaces that
2527         have a function with the same name and 0 params
2528         and the function is called through the parent).
2529
2530 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2531
2532         * class.cs, rootcontext.cs, typmanager.cs: do not
2533         leak pointers.
2534
2535 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2536
2537         * codegen.cs: remove stack for the ec flow branching.
2538         It is already a linked list, so no need.
2539
2540 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
2541
2542         * Makefile: Allow custom profiler here.
2543
2544 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2545
2546         * typemanager.cs (LookupType):
2547           - Use a static char [], because split takes
2548             a param array for args, so it was allocating
2549             every time.
2550           - Do not store true in a hashtable, it boxes.
2551
2552 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
2553
2554         * flowanalysis.cs: bytify common enums.
2555
2556 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2557
2558         * modifiers.cs: Add a new set of flags for the
2559         flags allowed on explicit interface impls.
2560         * cs-parser.jay: catch the use of modifiers in
2561         interfaces correctly.
2562         * class.cs: catch private void IFoo.Blah ().
2563
2564         All related to bug #50572.
2565
2566 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2567
2568         * decl.cs: Rewrite the consistant accessability checking.
2569         Accessability is not linear, it must be implemented in
2570         a tableish way. Fixes #49704.
2571
2572 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
2573
2574         * expression.cs: Handle negation in a checked context.
2575         We must use subtraction from zero. Fixes #38674.
2576
2577 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2578
2579         * class.cs: Ignore static void main in DLLs.
2580         * rootcontext.cs: Handle the target type here,
2581         since we are have to access it from class.cs
2582         * driver.cs: account for the above.
2583
2584 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2585
2586         * report.cs: Give line numbers and files if available.
2587
2588 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
2589
2590         * driver.cs: Implement /addmodule.
2591
2592         * typemanager.cs:  Change 'modules' field so it now contains Modules not
2593         ModuleBuilders.
2594
2595 2003-12-20  Martin Baulig  <martin@ximian.com>
2596
2597         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
2598         (FieldBase.IsAssigned): Removed this field.
2599         (FieldBase.SetAssigned): New public method.
2600         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
2601
2602 2003-12-20  Martin Baulig  <martin@ximian.com>
2603
2604         * expression.cs (LocalVariableReference.DoResolve): Don't set
2605         `vi.Used' if we're called from DoResolveLValue().
2606
2607         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
2608         returns the usage vector it just merged into the current one -
2609         pass this one to UsageWarning().
2610         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
2611         of the `EmitContext', don't call this recursively on our children.
2612
2613 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
2614
2615         * driver.cs: Implement /target:module.
2616
2617 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
2618
2619         * support.cs (CharArrayHashtable): New helper class.
2620
2621         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
2622         char arrays, not strings, so we can avoid creating a string in
2623         consume_identifier if the identifier is a keyword.
2624
2625 2003-12-16  Martin Baulig  <martin@ximian.com>
2626
2627         * statement.cs (LocalInfo.Assigned): Removed this property.
2628         (LocalInfo.Flags): Removed `Assigned'.
2629         (LocalInfo.IsAssigned): New public method; takes the EmitContext
2630         and uses flow analysis.
2631         (Block.UsageWarning): Made this method private.
2632         (Block.Resolve): Call UsageWarning() if appropriate.
2633
2634         * expression.cs (LocalVariableReference.DoResolve): Always set
2635         LocalInfo.Used here.
2636
2637 2003-12-13  Martin Baulig  <martin@ximian.com>
2638
2639         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
2640         any value here; we're now using flow analysis to figure out
2641         whether a statement/block returns a value.
2642
2643 2003-12-13  Martin Baulig  <martin@ximian.com>
2644
2645         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
2646         working again.
2647         (FlowBranching.MergeFinally): Don't call
2648         `branching.CheckOutParameters()' here, this is called in
2649         MergeTopBlock().
2650         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
2651         when adding the `finally' vector.       
2652
2653 2003-12-13  Martin Baulig  <martin@ximian.com>
2654
2655         * flowanalysis.cs
2656         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
2657         actually work and also fix #48962.
2658
2659 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2660
2661         * decl.cs: Do not check System.Object for nested types,
2662         since we know it does not have any. Big bang for buck:
2663
2664         BEFORE:
2665            Run 1:   8.35 seconds
2666            Run 2:   8.32 seconds
2667            corlib:  17.99 seconds
2668         AFTER:
2669            Run 1:   8.17 seconds
2670            Run 2:   8.17 seconds
2671            corlib:  17.39 seconds
2672
2673 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
2674
2675         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
2676         time we are returning 0 members, so we save alot here.
2677
2678 2003-12-11  Martin Baulig  <martin@ximian.com>
2679
2680         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
2681         `MergeChild()', also just take the `FlowBranching' as argument;
2682         call Merge() on it and return the result.
2683         (FlowBranching.Merge): We don't need to do anything if we just
2684         have one sibling.
2685
2686 2003-12-11  Martin Baulig  <martin@ximian.com>
2687
2688         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
2689         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
2690         Maurer for this idea.
2691
2692 2003-12-11  Martin Baulig  <martin@ximian.com>
2693
2694         * flowanalysis.cs (MergeResult): This class is now gone; we now
2695         use the `UsageVector' for this.  The reason for this is that if a
2696         branching just has one sibling, we don't need to "merge" them at
2697         all - that's the next step to do.
2698         (FlowBranching.Merge): We now return a `UsageVector' instead of a
2699         `MergeResult'.
2700
2701 2003-12-11  Martin Baulig  <martin@ximian.com>
2702
2703         Reworked flow analyis and made it more precise and bug-free.  The
2704         most important change is that we're now using a special `Reachability'
2705         class instead of having "magic" meanings of `FlowReturns'.  I'll
2706         do some more cleanups and optimizations and also add some more
2707         documentation this week.
2708
2709         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
2710         largely reworked this class.
2711         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
2712         the new `Reachability' class instead of having "magic" values here.
2713         (FlowBranching): We're now using an instance of `Reachability'
2714         instead of having separate `Returns', `Breaks' etc. fields.
2715
2716         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
2717         based on flow analysis; ignore the return value of block.Emit ().
2718
2719 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
2720
2721         * driver.cs typemanager.cs: Find the mono extensions to corlib even
2722         if they are private.
2723
2724 2003-12-09  Martin Baulig  <martin@ximian.com>
2725
2726         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
2727         call them directly on the UsageVector.
2728
2729 2003-12-09  Martin Baulig  <martin@ximian.com>
2730
2731         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
2732         Changed return type from `FlowReturns' to `Reachability'.
2733
2734 2003-12-09  Martin Baulig  <martin@ximian.com>
2735
2736         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
2737         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
2738         `Reachable' fields with a single `Reachability' one.
2739
2740 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2741
2742         * class.cs (FindMembers): Remove foreach's.
2743
2744         Bootstrap times:
2745
2746         BEFORE
2747                 Run 1:   8.74 seconds
2748                 Run 2:   8.71 seconds
2749
2750         AFTER
2751                 Run 1:   8.64 seconds
2752                 Run 2:   8.58 seconds
2753
2754
2755 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2756
2757         * cs-parser.jay:
2758         * gen-treedump.cs:
2759         * statement.cs:
2760         This patch does a few things:
2761                 1. EmptyStatement is now a singleton, so it is never reallocated.
2762                 2. All blah is EmptyStatement constructs have been changed to
2763                    blah == EmptyStatement.Value, which is much faster and valid
2764                    now that EmptyStatement is a singleton.
2765                 3. When resolving a block, rather than allocating a new array for
2766                    the non-empty statements, empty statements are replaced with
2767                    EmptyStatement.Value
2768                 4. Some recursive functions have been made non-recursive.
2769         Mainly the performance impact is from (3), however (1) and (2) are needed for
2770         this to work. (4) does not make a big difference in normal situations, however
2771         it makes the profile look saner.
2772
2773         Bootstrap times:
2774
2775         BEFORE
2776         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2777         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
2778         Total memory allocated: 56397 KB
2779
2780         AFTER
2781         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
2782         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
2783         Total memory allocated: 55666 KB
2784
2785 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2786
2787         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
2788         than the hashtable in a hashtable version
2789
2790         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
2791         we always end up concating a string. This results in a huge perf
2792         loss, because many strings have to be tracked by the GC. In this
2793         patch, we first use a hashtable that works with two keys, so that
2794         the strings do not need to be concat'ed.
2795
2796         Bootstrap times:
2797         BEFORE
2798                 Run 1:   8.74 seconds
2799                 Run 2:   8.71 seconds
2800
2801         AFTER
2802                 Run 1:   8.65 seconds
2803                 Run 2:   8.56 seconds
2804
2805 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
2806
2807         * Makefile: Add a new target `do-time' that does a quick and simple
2808         profile, leaving easy to parse output.
2809
2810 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
2811
2812         * codegen.cs (Init): Create the dynamic assembly with 
2813         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
2814
2815 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2816
2817         * support.cs: Make the PtrHashtable use only one
2818         instance of its comparer.
2819
2820 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
2821
2822         * typemanager.cs: Fix lookup of GetNamespaces.
2823
2824 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
2825
2826         * expression.cs: Removed redundant line.
2827
2828         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
2829         ArrayLists, use for loops with bounds.  
2830
2831         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
2832         arraylist.
2833
2834         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
2835         arraylists, use for loop with bounds.
2836
2837         The above three changes give us a 0.071 second performance
2838         improvement out of 3.294 seconds down to 3.223.  On my machine
2839         the above changes reduced the memory usage by 1,387 KB during
2840         compiler bootstrap.
2841
2842         * cs-parser.jay (QualifiedIdentifier): New class used to represent
2843         QualifiedIdentifiers.  Before we created a new string through
2844         concatenation, and mostly later on, the result would be
2845         manipulated by DecomposeQI through string manipulation.
2846
2847         This reduced the compiler memory usage for bootstrapping from
2848         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
2849         compile times in 0.05 seconds.
2850
2851 2003-11-28  Dick Porter  <dick@ximian.com>
2852
2853         * support.cs: Do string compares with the Invariant culture.
2854
2855         * rootcontext.cs: 
2856         * gen-treedump.cs: 
2857         * expression.cs: 
2858         * driver.cs: 
2859         * decl.cs: 
2860         * codegen.cs: 
2861         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
2862         the comparison is done with the Invariant culture.
2863
2864 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
2865
2866         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
2867         GetEnumerator method.
2868
2869         (ProbeCollectionType): Iterate starting at the most specific type
2870         upwards looking for a GetEnumerator
2871
2872         * expression.cs: Shift count can be up to 31 for int/uint and 63
2873         for long/ulong.
2874
2875 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
2876
2877         * statement.cs (Block.LookupLabel): Also look for the label on the
2878         children blocks.  Use a hash table to keep track of visited
2879         nodes. 
2880
2881         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
2882         we actually did transform the other operand, otherwise fall back
2883         to the common codepath that casts to long.
2884
2885         * cs-tokenizer.cs: Use the same code pattern as the int case.
2886         Maybe I should do the parsing myself, and avoid depending on the
2887         Parse routines to get this done.
2888
2889 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
2890
2891         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
2892         which fixes bug 51347.  This time test it.
2893
2894         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
2895         attributes for example can not tell the difference between these.
2896         The difference was only a syntax feature of the language. 
2897
2898         * attribute.cs: Apply attributes to delegates.
2899
2900         * delegate.cs: Call the apply attributes method.
2901
2902 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
2903
2904         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
2905         comparing 0 vs Byte.MinValue, not the value
2906
2907         (ImplicitConversionRequired): When reporting a conversion error,
2908         use error 31 to print out the constant error instead of the
2909         simpler 29.
2910
2911         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
2912         which fixes bug 51347.
2913
2914 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
2915
2916         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
2917         which fixes the -warnaserror command line option.
2918
2919 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
2920
2921         * cfold.cs (DoNumericPromotions): During constant folding of
2922         additions on UIntConstant, special case intconstants with
2923         IntConstants like we do on the expression binary operator. 
2924
2925 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
2926
2927         * convert.cs (ImplicitReferenceConversion): We were missing a case
2928         (System.Enum are not value types or class types, so we need to
2929         classify them separatedly).
2930
2931         * driver.cs: We do not support error 2007.
2932
2933 2003-11-12 Jackson Harper <jackson@ximian.com>
2934
2935         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
2936         system directory. Also use the full file name so users can
2937         libraries names mscorlib-o-tron.dll in a non system dir.
2938
2939 2003-11-10  Martin Baulig  <martin@ximian.com>
2940
2941         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
2942         (TypeManager.InitCoreTypes): Initialize them here, but instead of
2943         calling `ResolveType()' on them, directly assign their `Type'.
2944
2945 2003-11-08  Martin Baulig  <martin@ximian.com>
2946
2947         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
2948         return value and the `out parent' parameter.
2949         (TypeContainer.DefineType): Moved the CS0644 check into
2950         GetClassBases().  Don't pass the interface types to the
2951         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
2952         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
2953
2954         * ecore.cs (TypeExpr.IsAttribute): New property.
2955         (TypeExpr.GetInterfaces): New method.
2956
2957         * interface.cs (Interface.GetInterfaceTypeByName): Return a
2958         TypeExpr instead of a Type.
2959         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
2960         (Interface.DefineType): Don't pass the interface types to the
2961         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
2962         them later and then call `TypeBulider.AddInterfaceImplementation()'.
2963
2964         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
2965         instead of a `Type[]'.
2966         (TypeManager.RegisterBuilder): Likewise.
2967         (TypeManager.AddUserInterface): Likewise.
2968         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
2969         `Type[]' and also return a `TypeExpr[]'.
2970         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
2971
2972 2003-11-08  Martin Baulig  <martin@ximian.com>
2973
2974         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
2975         Expression.     
2976
2977 2003-11-08  Martin Baulig  <martin@ximian.com>
2978
2979         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
2980         TypeManager.ResolveExpressionTypes().
2981
2982         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
2983         instead of an Expression.
2984         (TypeExpr): This is now an abstract base class for `TypeExpression'.
2985         (TypeExpression): New public class; formerly known as `TypeExpr'.
2986
2987         * expression.cs (ComposedCast): Derive from TypeExpr.
2988
2989         * typemanager.cs (TypeManager.system_*_expr): These are now
2990         TypExpr's instead of Expression's.
2991         (TypeManager.ResolveExpressionTypes): New public static function;
2992         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
2993         of them.        
2994
2995 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
2996
2997         * expression.cs (New.DoResolve): Do not dereference value that
2998         might be a null return.
2999
3000         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
3001         sure that the constant value has the right type.  Fixes an
3002         unreported bug, similar to 50425.
3003
3004         * const.cs (Const.LookupConstantValue): Call
3005         ImplicitStandardConversionExists before doing a conversion to
3006         avoid havng the TypeManager.ChangeType do conversions.
3007
3008         Reduced the number of casts used
3009
3010         (Const.ChangeType): New routine to enable reuse of the constant
3011         type changing code from statement.
3012
3013         * typemanager.cs (ChangeType): Move common initialization to
3014         static global variables.
3015
3016         Fixes #50425.
3017
3018         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
3019         every value type to go through, even if it was void.  Fix that. 
3020
3021         * cs-tokenizer.cs: Use is_identifier_start_character on the start
3022         character of the define, and the is_identifier_part_character for
3023         the rest of the string.
3024
3025 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
3026
3027         * expression.cs (UnaryMutator.EmitCode): When I updated
3028         LocalVariableReference.DoResolve, I overdid it, and dropped an
3029         optimization done on local variable references.
3030
3031 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
3032
3033         * ecore.cs: Convert the return from Ldlen into an int.
3034
3035 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
3036
3037         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
3038         the accessibility, this is a special case for toplevel non-public
3039         classes (internal for instance).
3040
3041 2003-10-20  Nick Drochak <ndrochak@gol.com>
3042
3043         * ecore.cs: Fix typo and build.  Needed another right paren.
3044
3045 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
3046
3047         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
3048         `internal' case regular and protected, but not allowing protected
3049         to be evaluated later.  Bug 49840
3050
3051 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
3052
3053         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
3054         to kb.Nlast, and not the kb.nFirst to isolate the switch
3055         statement.
3056
3057         Extract the underlying type, so enumerations of long/ulong are
3058         treated like long/ulong.
3059
3060 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
3061
3062         * expression.cs (New): Overload the meaning of RequestedType to
3063         track the possible creation of the NewDelegate type, since
3064         DoResolve is invoked more than once for new constructors on field
3065         initialization.
3066
3067         See bugs: #48800 and #37014
3068
3069         * cs-parser.jay (declare_local_constants): Take an arraylist
3070         instead of a single constant.
3071
3072         (local_constant_declaration): It should take a
3073         constant_declarators, not a constant_declarator.  Fixes 49487
3074
3075         * convert.cs: Fix error report.
3076
3077 2003-10-13 Jackson Harper <jackson@ximian.com>
3078
3079         * typemanager.cs (TypeToCoreType): Add float and double this fixes
3080         bug #49611
3081
3082 2003-10-09  Martin Baulig  <martin@ximian.com>
3083
3084         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
3085         to the .ctor.
3086         (MethodCore.DoDefineParameters): Removed the TypeContainer
3087         argument; use the DeclSpace which was passed to the .ctor instead.
3088         (MethodCore.CheckParameter): Take a DeclSpace instead of a
3089         TypeContainer; we only need a DeclSpace here.
3090
3091 2003-10-09  Martin Baulig  <martin@ximian.com>
3092
3093         * class.cs (MethodData): Added additional `DeclSpace ds' argument
3094         to the .ctor.
3095         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
3096         EmitContext's .ctor.    
3097
3098 2003-10-09  Martin Baulig  <martin@ximian.com>
3099
3100         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
3101         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
3102         AsAccessible(), moved them as well.
3103
3104         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
3105
3106 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
3107
3108         * cs-parser.jay : Renamed yyName to yyNames related to jay.
3109
3110 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
3111
3112         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
3113         generation for >=, as spotted by Paolo, bug 48679.  
3114         Patch from David Waite.
3115
3116         * cs-tokenizer.cs: Add handling for #pragma.
3117
3118         * cs-parser.jay: Allow for both yield and yield return in the
3119         syntax.  The anti-cobolization of C# fight will go on!
3120
3121         * class.cs (TypeBuilder.DefineType): Catch error condition here
3122         (Parent.DefineType erroring out and returning null).
3123
3124         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
3125         coping with enumerations variables, we were mistakenly processing
3126         them as a regular value type instead of built-in types.  Fixes the
3127         bug #48063
3128
3129         * typemanager.cs (IsBuiltinOrEnum): New method.
3130
3131 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
3132
3133         * cs-parser.jay: Upgrade: yield now needs the return clause.
3134
3135 2003-09-19  Martin Baulig  <martin@ximian.com>
3136
3137         * decl.cs (MemberCache.SetupCacheForInterface): Take a
3138         `MemberCache parent' argument.  Normally, an interface doesn't
3139         have a parent type except System.Object, but we use this in gmcs
3140         for generic type parameters.
3141
3142 2003-09-18  Martin Baulig  <martin@ximian.com>
3143
3144         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
3145         on `type.IsInterface'; don't check whether the type has a parent
3146         to determine whether it's an interface.
3147
3148 2003-09-15  Martin Baulig  <martin@ximian.com>
3149
3150         * class.cs (TypeContainer.DefineType): Added an error flag to
3151         avoid reporting duplicate CS0146's ("class definition is
3152         circular.").
3153
3154         * driver.cs (Driver.MainDriver): Abort if
3155         RootContext.ResolveTree() reported any errors.
3156
3157 2003-09-07  Martin Baulig  <martin@ximian.com>
3158
3159         * report.cs (Error, Warning): Added overloaded versions which take
3160         a `params object[] args' and call String.Format().
3161
3162 2003-09-07  Martin Baulig  <martin@ximian.com>
3163
3164         * decl.cs (DeclSpace..ctor): Don't call
3165         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
3166         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
3167         (DeclSpace.RecordDecl): New method.
3168
3169         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
3170
3171 2003-09-02  Ravi Pratap  <ravi@ximian.com>
3172
3173         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
3174         value attributes to be applied to ParameterBuilders.
3175
3176         * class.cs (MethodCore.LabelParameters): Make static and more
3177         generic so that it can be used from other places - like interface
3178         methods, for instance.
3179
3180         * interface.cs (Interface.Emit): Call LabelParameters before
3181         emitting attributes on the InterfaceMethod.
3182
3183 2003-08-26  Martin Baulig  <martin@ximian.com>
3184
3185         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
3186         resolving aliases; fixes #47927.
3187
3188 2003-08-26  Martin Baulig  <martin@ximian.com>
3189
3190         * statement.cs (Using.DoResolve): This is internally emitting a
3191         try/finally clause, so we need to set ec.NeedExplicitReturn if we
3192         do not always return.  Fixes #47681.
3193
3194 2003-08-26  Martin Baulig  <martin@ximian.com>
3195
3196         * decl.cs (MemberCore): Moved WarningNotHiding(),
3197         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
3198         into MemberBase.
3199         (AdditionResult): Make this nested in DeclSpace.
3200         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
3201         argument; call NamespaceEntry.Define() unless we're nested in a
3202         class or struct.
3203
3204         * namespace.cs (Namespace.DefineName): New public function.  This
3205         is called from DeclSpace's .ctor to add 
3206         (Namespace.Lookup): Include DeclSpaces in the lookup.
3207
3208         * class.cs (Operator): Derive from MemberBase, not MemberCore.
3209
3210         * const.cs (Const): Derive from MemberBase, not MemberCore.     
3211
3212 2003-08-25  Martin Baulig  <martin@ximian.com>
3213
3214         * convert.cs (Convert.ExplicitReferenceConversion): When
3215         converting from an interface type to a class, unbox if the target
3216         type is a struct type.  Fixes #47822.
3217
3218 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3219
3220         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
3221         #47854.
3222
3223 2003-08-22  Martin Baulig  <martin@ximian.com>
3224
3225         * class.cs (TypeManager.DefineType): When defining a nested type,
3226         call DefineType() on our parent; fixes #47801.
3227
3228 2003-08-22  Martin Baulig  <martin@ximian.com>
3229
3230         * class.cs (MethodData.Define): While checking if a method is an
3231         interface implementation, improve the test a bit more to fix #47654.
3232
3233 2003-08-22  Martin Baulig  <martin@ximian.com>
3234
3235         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
3236         correctly; fixes #47722.
3237
3238 2003-08-22  Martin Baulig  <martin@ximian.com>
3239
3240         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
3241         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
3242
3243         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
3244
3245 2003-08-22  Martin Baulig  <martin@ximian.com>
3246
3247         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
3248         can only be assigned in static constructors.  Fixes #47161.
3249
3250 2003-08-22  Martin Baulig  <martin@ximian.com>
3251
3252         Rewrote and improved the flow analysis code.
3253
3254         * flowbranching.cs (FlowBranching): Make this class abstract.
3255         (FlowBranching.CreateBranching): New static function to create a
3256         new flow branching.
3257         (FlowBranchingBlock, FlowBranchingException): New classes.
3258         (FlowBranching.UsageVector.Type): New public readonly field.
3259         (FlowBranching.UsageVector.Breaks): Removed the setter.
3260         (FlowBranching.UsageVector.Returns): Removed the setter.
3261         (FlowBranching.UsageVector): Added Break(), Return(),
3262         NeverReachable() and Throw() methods to modify the reachability.
3263         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
3264         done by FlowBranching.Merge().
3265         (FlowBranching.UsageVector.MergeChild): New method; merges the
3266         merge result into the current vector.
3267         (FlowBranching.Merge): New abstract method to merge a branching.
3268
3269 2003-08-12  Martin Baulig  <martin@ximian.com>
3270
3271         * expression.cs (Indirection.CacheTemporaries): Create the
3272         LocalTemporary with the pointer type, not its element type.
3273
3274 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
3275
3276         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
3277         token was a keyword or not.
3278
3279         Add `error' options where an IDENTIFIER was expected;  Provide
3280         CheckToken and CheckIdentifierToken convenience error reporting
3281         functions. 
3282
3283         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
3284
3285         * decl.cs: Rename `NamespaceEntry Namespace' public field into
3286         NameSpaceEntry NameSpaceEntry.
3287
3288         (LookupInterfaceOrClass): Avoid creating a full qualified name
3289         from namespace and name: avoid doing lookups when we know the
3290         namespace is non-existant.   Use new Tree.LookupByNamespace which
3291         looks up DeclSpaces based on their namespace, name pair.
3292
3293         * driver.cs: Provide a new `parser verbose' to display the
3294         exception thrown during parsing.  This is turned off by default
3295         now, so the output of a failure from mcs is more graceful.
3296
3297         * namespace.cs: Track all the namespaces defined in a hashtable
3298         for quick lookup.
3299
3300         (IsNamespace): New method
3301
3302 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
3303
3304         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
3305         we know that we need to concatenate (full typename can never be
3306         null). 
3307
3308         * class.cs: ditto.
3309
3310         * statement.cs: Use a bitfield;  Do not initialize to null things
3311         which are done by the constructor by default.
3312
3313         * cs-parser.jay: bug fix, parameter was 4, not 3.
3314
3315         * expression.cs: Just use the property;
3316
3317         * statement.cs: No need for GetVariableInfo method.
3318
3319 2003-08-08  Martin Baulig  <martin@ximian.com>
3320
3321         * flowanalysis.cs (FlowReturns): This is now nested in the
3322         `FlowBranching' class.
3323         (MyBitVector): Moved this here from statement.cs.
3324         (FlowBranching.SiblingType): New enum type.
3325         (FlowBranching.CreateSibling): Added `SiblingType' argument.
3326
3327 2003-08-07  Martin Baulig  <martin@ximian.com>
3328
3329         * flowanalysis.cs (FlowBranchingType): This is now nested in the
3330         `FlowBranching' class and called `BranchingType'.
3331
3332 2003-08-07  Martin Baulig  <martin@ximian.com>
3333
3334         * flowanalysis.cs: Moved all the control flow analysis code into
3335         its own file.
3336
3337 2003-08-07  Martin Baulig  <martin@ximian.com>
3338
3339         * assign.cs (Assign.DoResolve): `target' must either be an
3340         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
3341         #37319.
3342
3343 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
3344
3345         * expression.cs (BinaryMethod): This kind of expression is created by the
3346         Binary class if it determines that the operator has to be handled
3347         by a method.
3348
3349         (BinaryDelegate): This kind of expression is created if we are
3350         dealing with a + or - operator on delegates.
3351
3352         (Binary): remove method, argumetns, and DelegateOperator: when
3353         dealing with methods, 
3354
3355         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
3356
3357         * statement.cs (Block): use bitfields for the three extra booleans
3358         we had in use.   Remove unused topblock parameter.
3359
3360         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
3361
3362         * assign.cs: Drop extra unneeded tests.
3363
3364 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
3365
3366         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
3367
3368         * statement.cs (Foreach): Use VariableStorage instead of
3369         LocalBuilders.   
3370
3371         * codegen.cs (VariableStorage): New class used by clients that
3372         require a variable stored: locals or fields for variables that
3373         need to live across yield.
3374
3375         Maybe provide a convenience api for EmitThis+EmitLoad?
3376
3377         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
3378         these bad boys.
3379
3380 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
3381
3382         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
3383         RemapParameterLValue): New methods that are used to turn a
3384         precomputed FieldInfo into an expression like this:
3385
3386                 instance.FieldInfo
3387
3388         The idea is to use this instead of making LocalVariableReference
3389         have more than one meaning.
3390
3391         * cs-parser.jay: Add error production to BASE.
3392
3393         * ecore.cs: Deal with TypeManager.GetField returning null, which
3394         is now a valid return value.
3395
3396         (FieldExprNoAddress): New expression for Fields whose address can
3397         not be taken.
3398
3399         * expression.cs (LocalVariableReference): During the resolve
3400         phases, create new expressions if we are in a remapping context.
3401         Remove code that dealt with remapping here.
3402
3403         (ParameterReference): same.
3404
3405         (ProxyInstance): New expression, like the `This' expression, but
3406         it is born fully resolved.  We know what we are doing, so remove
3407         the errors that are targeted to user-provided uses of `this'.
3408
3409         * statement.cs (Foreach): our variable is now stored as an
3410         Expression;  During resolution, follow the protocol, dont just
3411         assume it will return this.
3412
3413 2003-08-06  Martin Baulig  <martin@ximian.com>
3414
3415         * support.cs (SeekableStreamReader.cs): New public class.
3416
3417         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
3418         SeekableStreamReader instead of the normal StreamReader.
3419
3420 2003-08-04  Martin Baulig  <martin@ximian.com>
3421
3422         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
3423         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
3424         deambiguate casts and delegate invocations.
3425         (parenthesized_expression): Use the new tokens to ensure this is
3426         not a cast of method invocation.
3427
3428         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
3429         when reading a `)' and Deambiguate_CloseParens () was previously
3430         called.
3431
3432         * expression.cs (ParenthesizedExpression): New class.  This is
3433         just used for the CS0075 test.
3434         (Binary.DoResolve): Check for CS0075.   
3435
3436 2003-07-29  Ravi Pratap  <ravi@ximian.com>
3437
3438         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
3439         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
3440         reference comparison.
3441
3442         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
3443         examine the ReturnType for equality - this is necessary in the
3444         cases of implicit and explicit operators whose signature also
3445         includes the return type.
3446
3447 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
3448
3449         * namespace.cs: Cache the result of the namespace computation,
3450         instead of computing it every time.
3451
3452 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
3453
3454         * decl.cs: Use a global arraylist that we reuse over invocations
3455         to avoid excesive memory consumption.  Reduces memory usage on an
3456         mcs compile by one meg (45 average).
3457
3458         * typemanager.cs (LookupTypeReflection): In .NET pointers are
3459         private, work around that.
3460
3461 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
3462
3463         * literal.cs (IntLiteral): Define Zero and One static literals. 
3464
3465         * cs-parser.jay (integer_literal): use static literals to reduce
3466         memory usage for the most used literals (0, 1 and -1).  211kb
3467         reduced in memory usage.
3468
3469         Replace all calls to `new ArrayList' with `new
3470         ArrayList(4)' which is a good average number for most allocations,
3471         and also requires only 16 bytes of memory for its buffer by
3472         default. 
3473
3474         This reduced MCS memory usage in seven megabytes for the RSS after
3475         bootstrapping.
3476
3477 2003-07-28  Ravi Pratap  <ravi@ximian.com>
3478
3479         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
3480         handle params methods the correct way by forming only one
3481         applicable set with params and normal methods in them. Earlier we
3482         were looking at params methods only if we found no normal methods
3483         which was not the correct thing to do.
3484
3485         (Invocation.BetterFunction): Take separate arguments indicating
3486         when candidate and the best method are params methods in their
3487         expanded form.
3488
3489         This fixes bugs #43367 and #46199.
3490
3491         * attribute.cs: Documentation updates.
3492
3493         (CheckAttribute): Rename to CheckAttributeTarget.
3494         (GetValidPlaces): Rename to GetValidTargets.
3495
3496         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
3497         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
3498
3499         Fixes bug #44468.
3500
3501 2003-07-28  Martin Baulig  <martin@ximian.com>
3502
3503         * class.cs (TypeContainer.DefineMembers): Use the base type's full
3504         name when looking up the base class of a nested class.  Fixes #46977.
3505
3506 2003-07-26  Martin Baulig  <martin@ximian.com>
3507
3508         * expression.cs (Indexers.Indexer): New nested struct; contains
3509         getter, setter and the indexer's type.
3510         (Indexers.Properties): This is now an ArrayList of
3511         Indexers.Indexer's.
3512         (IndexerAccess.DoResolveLValue): Correctly set the type if the
3513         indexer doesn't have any getters.
3514
3515         * assign.cs (Assign.DoResolve): Also do the implicit conversions
3516         for embedded property and indexer assignments.
3517
3518 2003-07-26  Martin Baulig  <martin@ximian.com>
3519
3520         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
3521         preprocessor directive is not the first non-whitespace character
3522         on a line.
3523
3524 2003-07-26  Martin Baulig  <martin@ximian.com>
3525
3526         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
3527         namespace parsing, follow the spec more closely.
3528
3529         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
3530         NamespaceEntry.Lookup().
3531
3532 2003-07-25  Martin Baulig  <martin@ximian.com>
3533
3534         * MethodCore.cs (OverridesSomething): New public field; it's set
3535         from TypeContainer.DefineMembers if this method overrides
3536         something (which doesn't need to be a method).  Fix #39462.
3537
3538 2003-07-25  Ravi Pratap  <ravi@ximian.com>
3539
3540         * typemanager.cs (GetMembers): Ensure that the list of members is
3541         reversed. This keeps things in sync.
3542
3543         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
3544         find an AttributeUsage attribute.
3545
3546         * expression.cs (Invocation.OverloadResolve): Perform the check
3547         which disallows Invoke to be directly called on a Delegate.
3548
3549         (Error_InvokeOnDelegate): Report error cs1533.
3550
3551 2003-07-25  Martin Baulig  <martin@ximian.com>
3552
3553         * expression.cs (Indexers.GetIndexersForType): Only look in the
3554         interface hierarchy if the requested type is already an
3555         interface.  Fixes #46788 while keeping #46502 fixed.
3556
3557 2003-07-25  Martin Baulig  <martin@ximian.com>
3558
3559         * class.cs (TypeContainer.DefineMembers): Check whether all
3560         readonly fields have been assigned and report warning CS0649 if
3561         not.
3562
3563         * statement.cs (LocalInfo.IsFixed): Always return true if this is
3564         a valuetype.
3565
3566 2003-07-24  Ravi Pratap  <ravi@ximian.com>
3567
3568         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
3569         returned from GetMethods to make things consistent with the
3570         assumptions MCS makes about ordering of methods.
3571
3572         This should comprehensively fix bug #45127 and it does :-)
3573
3574         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
3575         ordering is actually reverse.
3576
3577         * Clean up some debug messages I left lying around.
3578
3579         * interface.cs (Populate*): Get rid of code which emits attributes
3580         since the stage in which we emit attributes is the 'Emit' stage,
3581         not the define stage.
3582
3583         (Emit): Move attribute emission for interface members here.
3584
3585 2003-07-22  Ravi Pratap  <ravi@ximian.com>
3586
3587         * expression.cs (Invocation.OverloadResolve): Follow the spec more
3588         closely: we eliminate methods in base types when we have an
3589         applicable method in a top-level type.
3590
3591         Please see section 14.5.5.1 for an exact description of what goes
3592         on. 
3593
3594         This fixes bug #45127 and a host of other related to corlib compilation.
3595
3596         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
3597         array is the method corresponding to the top-level type (this is
3598         because of the changes made to icall.c) so we change this
3599         accordingly.
3600
3601         (MethodGroupExpr.Name): This too.
3602
3603         * typemanager.cs (GetElementType): New method which does the right
3604         thing when compiling corlib. 
3605
3606         * everywhere: Make use of the above in the relevant places.
3607
3608 2003-07-22  Martin Baulig  <martin@ximian.com>
3609
3610         * cs-parser.jay (invocation_expression): Moved
3611         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
3612         `cast_expression', but create a InvocationOrCast which later
3613         resolves to either an Invocation or a Cast.
3614
3615         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
3616         method; call this before EmitStatement() to make sure that this
3617         expression can be used as a statement.
3618
3619         * expression.cs (InvocationOrCast): New class; resolves to either
3620         an Invocation or a Cast.
3621
3622         * statement.cs (StatementExpression): Call ResolveStatement() on
3623         the ExpressionStatement before emitting it.
3624
3625 2003-07-21  Martin Baulig  <martin@ximian.com>
3626
3627         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
3628         `ref' and `out' attributes match; fixes #46220.
3629         (MemberAccess.ResolveMemberAccess): You can't reference a type
3630         through an expression; fixes #33180.
3631         (Indexers.GetIndexersForType): Don't return the indexers from
3632         interfaces the class implements; fixes #46502.
3633
3634 2003-07-21  Martin Baulig  <martin@ximian.com>
3635
3636         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
3637         CS0661 checks; fixes bug #30442.
3638
3639 2003-07-21  Martin Baulig  <martin@ximian.com>
3640
3641         * decl.cs (AdditionResult): Added `Error'.
3642
3643         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
3644
3645         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
3646         makes cs0031.cs actually work.
3647
3648 2003-07-20  Martin Baulig  <martin@ximian.com>
3649
3650         * namespace.cs: Fixed that bug which caused a crash when compiling
3651         the debugger's GUI.
3652
3653 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
3654
3655         * typemanager.cs (LookupTypeReflection): Never expose types which
3656         are NotPublic, NestedPrivate, NestedAssembly, or
3657         NestedFamANDAssem.  We used to return these, and later do a check
3658         that would report a meaningful error, but the problem is that we
3659         would not get the real match, if there was a name override.
3660
3661 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
3662
3663         * namespace.cs (Namespace, Name): Do not compute the namespace
3664         name dynamically, compute it in the constructor.  This reduced
3665         memory usage by 1697 KB.
3666
3667         * driver.cs: Use --pause to pause at the end.
3668
3669 2003-07-17  Peter Williams  <peter@newton.cx>
3670
3671         * Makefile: Change the name of the test target so that it doesn't
3672         conflict with the recursive test target.
3673
3674 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
3675
3676         * expression.cs (LocalVariableReference.Emit, EmitAssign,
3677         AddressOf): Do not use EmitThis, that was wrong, use the actual
3678         this pointer.
3679
3680 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
3681
3682         * class.cs (MethodData.Define): While checking if a method is an
3683         interface implementation, improve the test: If we are not public
3684         (use new test here: use the computed MethodAttributes directly,
3685         instead of the parsed modifier flags) check if the `implementing'
3686         method comes from an interface or not.
3687
3688         * pending.cs (VerifyPendingMethods): Slightly better error
3689         message.
3690
3691         * makefile: add test target that does the mcs bootstrap.
3692
3693 2003-07-16  Ravi Pratap  <ravi@ximian.com>
3694
3695         * interface.cs (Define): Do nothing here since there are no
3696         members to populate etc. Move the attribute emission out of here
3697         since this was just totally the wrong place to put it. Attribute
3698         application happens during the 'Emit' phase, not in the 'Define'
3699         phase.
3700
3701         (Emit): Add this method and move the attribute emission here
3702
3703         * rootcontext.cs (EmitCode): Call the Emit method on interface
3704         types too.
3705
3706 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3707
3708         * expression.cs (OverloadResolve): Report error only if Location
3709         is not 'Null' which means that there was a probe going on.
3710
3711 2003-07-14  Martin Baulig  <martin@ximian.com>
3712
3713         * expression.cs (ConditionalLogicalOperator): New public class to
3714         implement user defined conditional logical operators.
3715         This is section 14.11.2 in the spec and bug #40505.
3716
3717 2003-07-14  Martin Baulig  <martin@ximian.com>
3718
3719         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
3720
3721 2003-07-14  Martin Baulig  <martin@ximian.com>
3722
3723         * codegen.cs (EmitContext.InFixedInitializer): New public field.
3724
3725         * ecore.cs (IVariable.VerifyFixed): New interface method.
3726
3727         * expression.cs (Unary.ResolveOperator): When resolving the `&'
3728         operator, check whether the variable is actually fixed.  Fixes bug
3729         #36055.  Set a variable definitely assigned when taking its
3730         address as required by the spec.
3731
3732         * statement.cs (LocalInfo.IsFixed): New field.
3733         (LocalInfo.MakePinned): Set `IsFixed' to true.
3734
3735 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
3736
3737         * attribute.cs (Attribute.Resolve): While doing a Member lookup
3738         for .ctors, ensure that we only ask for members declared in the
3739         attribute type (BindingFlags.DeclaredOnly).
3740
3741         Fixes bug #43632.
3742
3743         * expression.cs (Error_WrongNumArguments): Report error 1501
3744         correctly the way CSC does.
3745
3746 2003-07-13  Martin Baulig  <martin@ximian.com>
3747
3748         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
3749         lookup on the fully qualified name, to make things like "X.X" work
3750         where "X.X" is a fully qualified type name, but we also have a
3751         namespace "X" in the using list.  Fixes #41975.
3752
3753 2003-07-13  Martin Baulig  <martin@ximian.com>
3754
3755         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
3756         function. If we're a CompoundAssign, we need to create an embedded
3757         CompoundAssign, not an embedded Assign.
3758         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
3759         Fixes #45854.
3760
3761 2003-07-13  Martin Baulig  <martin@ximian.com>
3762
3763         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
3764         work to fix bug #46088.
3765
3766 2003-07-13  Ravi Pratap <ravi@ximian.com>
3767
3768         * class.cs (Operator.Emit): Do not emit attributes here - it is
3769         taken care of by the Method class that we delegate too. This takes
3770         care of bug #45876.
3771
3772 2003-07-10  Martin Baulig  <martin@ximian.com>
3773
3774         * expression.cs (TypeOfVoid): New class.
3775         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
3776
3777 2003-07-10  Martin Baulig  <martin@ximian.com>
3778
3779         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
3780         bug #35957.
3781
3782 2003-07-10  Martin Baulig  <martin@ximian.com>
3783
3784         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
3785         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
3786
3787         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
3788
3789         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
3790
3791 2003-07-10  Martin Baulig  <martin@ximian.com>
3792
3793         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
3794         of decimal.  Fixes #42850.
3795
3796         NOTE: I also fixed the created byte blob, but this doesn't work on
3797         the MS runtime and csc never produces any byte blobs for decimal
3798         arrays.
3799
3800 2003-07-10  Martin Baulig  <martin@ximian.com>
3801
3802         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
3803         structs; fixes #32068.
3804         (Block.AddChildVariableNames): Fixed #44302.
3805
3806 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3807
3808         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
3809
3810 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3811
3812         * attribute.cs: And this test is onger needed.
3813
3814 2003-07-08  Martin Baulig  <martin@ximian.com>
3815
3816         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
3817         inaccessible types.  Fixes #36313.
3818
3819         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
3820
3821         * namespace.cs (NamespaceEntry): Create implicit entries for all
3822         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
3823         implicit entries for N1.N2 and N1.
3824
3825 2003-07-08  Martin Baulig  <martin@ximian.com>
3826
3827         Rewrote the handling of namespaces to fix a lot of the issues
3828         wrt. `using' aliases etc.
3829
3830         * namespace.cs (Namespace): Splitted this class into a
3831         per-assembly `Namespace' and a per-file `NamespaceEntry'.
3832
3833         * typemanager.cs (TypeManager.IsNamespace): Removed.
3834         (TypeManager.ComputeNamespaces): Only compute namespaces from
3835         loaded assemblies here, not the namespaces from the assembly we're
3836         currently compiling.
3837
3838 2003-07-08  Martin Baulig  <martin@ximian.com>
3839
3840         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
3841
3842 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3843
3844         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
3845         already fixed it.  
3846
3847         I thought about the memory savings here, but LookupTypeReflection
3848         is used under already very constrained scenarios.  Compiling
3849         corlib or mcs only exposes one hit, so it would not really reduce
3850         any memory consumption.
3851
3852 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3853
3854         * typemanager.cs: fixes bug #45889 by only adding public types from
3855         other assemblies to the list of known types.
3856
3857 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
3858
3859         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
3860         on the type we resolved.
3861
3862 2003-07-05  Martin Baulig  <martin@ximian.com>
3863
3864         * pending.cs (PendingImplementation.ParentImplements): Don't
3865         create the proxy if the parent is abstract.
3866
3867         * class.cs (TypeContainer.DefineIndexers): Process explicit
3868         interface implementations first.  Fixes #37714.
3869
3870 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
3871
3872         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
3873         defined recursively;  but since we modify the input parameters
3874         (left is set to `this' temporarily), we reset this value if the
3875         left_is_explicit is false, which gives the original semantics to
3876         the code.  
3877
3878         * literal.cs (NullPointer): new class used to represent a null
3879         literal in a pointer context.
3880
3881         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
3882         type is a pointer, use a NullPointer object instead of a
3883         NullLiteral.   Closes 43687
3884
3885         (ExplicitConversion): Convert pointer values using
3886         the conv opcode to the proper type.
3887
3888         * ecore.cs (New): change ValueTypeVariable property into a method,
3889         that returns whether the valuetype is suitable for being used.
3890
3891         * expression.cs (Binary.DoNumericPromotions): Only return if we
3892         the int constant was a valid uint, and we can return both left and
3893         right as uints.  If not, we continue processing, to trigger the
3894         type conversion.  This fixes 39018.
3895
3896         * statement.cs (Block.EmitMeta): During constant resolution, set
3897         the CurrentBlock property on the emitcontext, so that we resolve
3898         constants propertly.
3899
3900 2003-07-02  Martin Baulig  <martin@ximian.com>
3901
3902         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
3903         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
3904
3905         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
3906         than emitting it here.
3907
3908         * statement.cs: Fixed some more flow analysis bugs.
3909
3910 2003-07-02  Martin Baulig  <martin@ximian.com>
3911
3912         * class.cs (MethodData.Define): When implementing interface
3913         methods, set Final unless we're Virtual.
3914
3915         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
3916         check work for interface methods.
3917
3918 2003-07-01  Martin Baulig  <martin@ximian.com>
3919
3920         * ecore.cs (EmitContext.This): Replaced this property with a
3921         GetThis() method which takes a Location argument.  This ensures
3922         that we get the correct error location for a CS0188.
3923
3924 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
3925
3926         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
3927         ImplicitStandardConversion.
3928
3929         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
3930
3931 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
3932
3933         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
3934         optimization.
3935
3936 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
3937
3938         * class.cs (Constructor.Define): Turn off initlocals for unsafe
3939         constructors.
3940
3941         (MethodData.Define): Turn off initlocals for unsafe methods.
3942
3943 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
3944
3945         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
3946         complete;  Fixes #37521.
3947
3948         * delegate.cs: Use Modifiers.TypeAttr to compute the
3949         TypeAttributes, instead of rolling our own.  This makes the flags
3950         correct for the delegates.
3951
3952 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
3953
3954         * class.cs (Constructor.Define): Set the private flag for static
3955         constructors as well.
3956
3957         * cs-parser.jay (statement_expression): Set the return value to
3958         null, to avoid a crash when we catch an error.
3959
3960 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
3961
3962         * cs-parser.jay: Applied patch from Jackson that adds support for
3963         extern and unsafe modifiers to destructor declarations.
3964
3965         * expression.cs: Report error 21 if the user is trying to index a
3966         System.Array.
3967
3968         * driver.cs: Add an error message, suggested by the bug report.
3969
3970         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
3971         if we do not have a ": this ()" constructor initializer.  Fixes 45149
3972
3973 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
3974
3975         * namespace.cs: Add some information to reduce FAQs.
3976
3977 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
3978
3979         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
3980         underlying enumeration types.  Fixes #43915.
3981
3982         * expression.cs: Treat ushort/short as legal values to be used in
3983         bitwise operations.
3984
3985 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
3986
3987         * delegate.cs: transfer custom attributes for paramenters from
3988         the delegate declaration to Invoke and BeginInvoke.
3989
3990 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
3991
3992         * attribute.cs: handle custom marshalers and emit marshal info
3993         for fields, too.
3994
3995 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
3996
3997         * makefile.gnu: Added anonymous.cs to the compiler sources.
3998
3999 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
4000
4001         * iterators.cs: Change the name of the proxy class to include two
4002         underscores.
4003
4004         * cs-parser.jay: Update grammar to include anonymous methods.
4005
4006         * anonymous.cs: new file.
4007
4008 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
4009
4010         * class.cs (Field.Define): Add missing test for pointers and
4011         safety. 
4012
4013 2003-05-27  Ravi Pratap  <ravi@ximian.com>
4014
4015         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
4016         we use the stobj opcode.
4017
4018         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
4019         since it wasn't the correct fix. 
4020
4021         It still is puzzling that we are required to use stobj for IntPtr
4022         which seems to be a ValueType.
4023
4024 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
4025
4026         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
4027         during regular simple name resolution.   Now, the trick is that
4028         instead of returning for processing the simplename, we do a
4029         TypeManager.LookupType (ie, a rooted lookup as opposed to a
4030         contextual lookup type).   If a match is found, return that, if
4031         not, return for further composition.
4032
4033         This fixes long-standing 30485.
4034
4035         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4036         using the address to initialize an object, do an Stobj instead of
4037         using the regular Stelem.
4038
4039         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
4040         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
4041         Because if we are a BaseIndexerAccess that value will be true.
4042         Fixes 43643.
4043
4044         * statement.cs (GotoCase.Resolve): Return after reporting an
4045         error, do not attempt to continue. 
4046
4047         * expression.cs (PointerArithmetic.Emit): If our operand is a
4048         long, convert our constants to match the operand before
4049         multiplying.  Convert to I type before adding.   Fixes 43670.
4050
4051 2003-05-14  Ravi Pratap  <ravi@ximian.com>
4052
4053         * enum.cs (ImplicitConversionExists) : Rename to
4054         ImplicitEnumConversionExists to remove ambiguity. 
4055
4056         * ecore.cs (NullCast): New type of cast expression class which
4057         basically is very similar to EmptyCast with the difference being
4058         it still is a constant since it is used only to cast a null to
4059         something else
4060         (eg. (string) null)
4061
4062         * convert.cs (ImplicitReferenceConversion): When casting a null
4063         literal, we return a NullCast.
4064
4065         * literal.cs (NullLiteralTyped): Remove - I don't see why this
4066         should be around anymore.
4067
4068         The renaming (reported was slightly wrong). Corrections:
4069
4070         ConvertImplicitStandard -> ImplicitConversionStandard
4071         ConvertExplicitStandard -> ExplicitConversionStandard
4072
4073         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
4074         before passing them in !
4075
4076         * convert.cs (ImplicitConversionStandard): When comparing for
4077         equal expr and target types, ensure that expr is not a
4078         NullLiteral.
4079
4080         In general, we must not be checking (expr_type ==
4081         target_type) in the top level conversion methods
4082         (ImplicitConversion, ExplicitConversion etc). This checking is
4083         done in the methods that they delegate to.
4084
4085 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
4086
4087         * convert.cs: Move Error_CannotConvertType,
4088         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
4089         ImplicitNumericConversion, ImplicitConversionExists,
4090         ImplicitUserConversionExists, StandardConversionExists,
4091         FindMostEncompassedType, FindMostSpecificSource,
4092         FindMostSpecificTarget, ImplicitUserConversion,
4093         ExplicitUserConversion, GetConversionOperators,
4094         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
4095         TryImplicitIntConversion, Error_CannotConvertImplicit,
4096         ConvertImplicitRequired, ConvertNumericExplicit,
4097         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
4098         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
4099         its own file.
4100
4101         Perform the following renames:
4102
4103         StandardConversionExists -> ImplicitStandardConversionExists
4104         ConvertImplicit -> ImplicitConversion
4105         ConvertImplicitStandard -> ImplicitStandardConversion
4106         TryImplicitIntConversion -> ImplicitIntConversion
4107         ConvertImplicitRequired -> ImplicitConversionRequired
4108         ConvertNumericExplicit -> ExplicitNumericConversion
4109         ConvertReferenceExplicit -> ExplicitReferenceConversion
4110         ConvertExplicit -> ExplicitConversion
4111         ConvertExplicitStandard -> ExplicitStandardConversion
4112
4113 2003-05-19  Martin Baulig  <martin@ximian.com>
4114
4115         * statement.cs (TypeInfo.StructInfo): Made this type protected.
4116         (TypeInfo): Added support for structs having structs as fields.
4117
4118         * ecore.cs (FieldExpr): Implement IVariable.
4119         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
4120         VariableInfo for the field.
4121
4122 2003-05-18  Martin Baulig  <martin@ximian.com>
4123
4124         * expression.cs (This.DoResolve): Report a CS0027 if we're
4125         emitting a field initializer.
4126
4127 2003-05-18  Martin Baulig  <martin@ximian.com>
4128
4129         * expression.cs (This.ResolveBase): New public function.
4130         (This.DoResolve): Check for CS0188.
4131
4132         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
4133         This.Resolve().
4134
4135         * ecore.cs (MethodGroupExpr.DoResolve): Set the
4136         `instance_expression' to null if we don't have any non-static
4137         methods.
4138
4139 2003-05-18  Martin Baulig  <martin@ximian.com>
4140
4141         Reworked the way how local variables and parameters are handled by
4142         the flow analysis code.
4143
4144         * statement.cs (TypeInfo, VariableMap): New public classes.
4145         (VariableInfo): New public class.  This is now responsible for
4146         checking whether a variable has been assigned.  It is used for
4147         parameters and local variables.
4148         (Block.EmitMeta): Take the InternalParameters as argument; compute
4149         the layout of the flow vectors here.
4150         (Block.LocalMap, Block.ParameterMap): New public properties.
4151         (FlowBranching): The .ctor doesn't get the InternalParameters
4152         anymore since Block.EmitMeta() now computes the layout of the flow
4153         vector.
4154         (MyStructInfo): This class is now known as `StructInfo' and nested
4155         in `TypeInfo'; we don't access this directly anymore.
4156
4157         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
4158         property and removed IsAssigned(), IsFieldAssigned(),
4159         SetAssigned() and SetFieldAssigned(); we now call them on the
4160         VariableInfo so we don't need to duplicate this code everywhere.
4161
4162         * expression.cs (ParameterReference): Added `Block block' argument
4163         to the .ctor.
4164         (LocalVariableReference, ParameterReference, This): The new
4165         VariableInfo class is now responsible for all the definite
4166         assignment stuff.
4167
4168         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
4169         IsParameterAssigned, SetParameterAssigned): Removed.
4170
4171 2003-05-18  Martin Baulig  <martin@ximian.com>
4172
4173         * typemanager.cs (InitCoreTypes): Try calling
4174         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
4175         the 3-args-version.  Corlib now also needs our `void_type'.
4176         (GetMethod): Added overloaded version which takes an optional
4177         `bool report_errors' to allow lookups of optional methods.
4178
4179 2003-05-12  Martin Baulig  <martin@ximian.com>
4180
4181         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
4182         only used for locals and not for parameters.
4183
4184 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
4185
4186         * support.cs (InternalParameters.ParameterType): Return the
4187         ExternalType of the parameter.
4188
4189         * parameter.cs (Parameter.ExternalType): drop the two arguments,
4190         they were unused.
4191
4192 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
4193
4194         * class.cs (MethodData.Define): Do not set the `newslot' on
4195         interface members, if they are also flagged as "override".
4196
4197         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
4198         better code for ++i and i++.  This only works for static fields
4199         and local variables.
4200
4201         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
4202         want to pull the DeclSpace out of the builder_to_declspace instead
4203         of the TypeBuilder (like in TypeContainer.FindMembers).
4204
4205         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
4206         instead of LookupTypeContainer.  Fixes the crash on .NET for
4207         looking up interface members.
4208
4209         * const.cs: Create our own emit context during the Definition
4210         stage, so that constants are evaluated in the proper context, when
4211         a recursive definition happens.
4212
4213 2003-05-11  Martin Baulig  <martin@ximian.com>
4214
4215         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
4216         new block for a switch section.
4217         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
4218         the adding/lookup in the switch block.  Fixes #39828.
4219
4220 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
4221
4222         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
4223         functionality: I needed to convert the data after I had performed
4224         the add/sub operation into the operands type size.
4225
4226         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
4227         pass the type for the box operation, otherwise the resulting
4228         object would have been of type object.
4229
4230         (BoxedCast): Add constructor to specify the type to box as.
4231
4232 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
4233
4234         * iterators.cs: I was reusing the `count' variable inadvertently,
4235         take steps to not allow this to happen.
4236
4237 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
4238
4239         * attribute.cs (Attribute.Resolve): Params attributes are encoded
4240         by creating an array at the point where the params starts and
4241         putting all those arguments there, then adjusting the size of the
4242         array.
4243
4244 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
4245
4246         * expression.cs (New.AddressOf): Implement interface
4247         IMemoryLocation.  This is used when the `new' operator is used in
4248         the context of an invocation to a method on a value type.
4249
4250         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
4251         example. 
4252
4253         * namespace.cs: Also check the using aliases here.
4254
4255         * driver.cs: Move the test for using validity after the types have
4256         been entered, so we do a single pass that also includes the using
4257         aliases. 
4258
4259         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
4260         in the regular case.   CreateSiblingForFinally is doing extra
4261         error checking.
4262
4263         * attribute.cs (GetAttributeArgumentExpression): Store the result
4264         on an out value, and use the return value to indicate failure
4265         instead of using null (which is a valid return for Constant.GetValue).
4266
4267         * statement.cs: Perform the analysis flow for the increment
4268         portion after the statement, because this will be the real flow of
4269         execution.  Fixes #42385
4270
4271         * codegen.cs (EmitContext.EmitArgument,
4272         EmitContext.EmitStoreArgument): New helper functions when the
4273         RemapToProxy flag is set.
4274
4275         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
4276         function.
4277
4278         Add support for remapping parameters. 
4279
4280         * iterators.cs: Propagate parameter values;  Store parameter
4281         values in the proxy classes.
4282
4283 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
4284
4285         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
4286         need a proxy reference;  I do not know what I was thinking
4287
4288         * cs-parser.jay (constructor_initializer): catch another error,
4289         and display nice message.
4290
4291         (field_declaration): catch void field declaration
4292         to flag a better error. 
4293
4294         * class.cs (MemberBase.CheckBase): Report an error instead of a
4295         warning if a new protected member is declared in a struct. 
4296         (Field.Define): catch the error of readonly/volatile.
4297
4298         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
4299
4300         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
4301         volatile variable is taken
4302
4303 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
4304
4305         * statement.cs (Fixed.Resolve): Report an error if we are not in
4306         an unsafe context.
4307
4308 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
4309
4310         * typemanager.cs: reuse the code that handles type clashes for
4311         delegates and enumerations.
4312
4313         * class.cs (Report28): Always report.
4314
4315         * expression.cs (EncodeAsAttribute): Allow nulls here.
4316
4317 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
4318
4319         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
4320         the functionality for testing whether an expression is valid for
4321         an attribute here.  Also handle the case of arrays of elements
4322         being stored. 
4323
4324         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
4325         encoding a linear array into an array of objects that are suitable
4326         to be passed to an CustomAttributeBuilder.
4327
4328         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
4329
4330         * ecore.cs: (FieldExpr): Handle field remapping here.
4331
4332         * iteratators.cs: Pass the instance variable (if the method is an
4333         instance method) to the constructors, so we can access the field
4334         variables on the class.
4335
4336         TODO: Test this with structs.  I think the THIS variable on
4337         structs might have to be a pointer, and not a refenrece
4338
4339 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
4340
4341         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
4342         local variables to fields in a proxy class.
4343
4344         * iterators.cs (PopulateProxy): Rename our internal fields to
4345         <XXX>.  
4346         Create a <THIS> field if we are an instance method, so we can
4347         reference our parent container variables.
4348         (MapVariable): Called back from the EmitContext code to enter a
4349         new variable to field mapping into the proxy class (we just create
4350         a FieldBuilder).
4351
4352         * expression.cs
4353         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
4354         for using the remapped locals to fields.
4355
4356         I placed the code here, because that gives the same semantics to
4357         local variables, and only changes the Emit code.
4358
4359         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
4360         statements inside iterators.
4361         (VariableInfo): Add a FieldBuilder for the cases when we are
4362         remapping local variables to fields in a proxy class
4363
4364         * ecore.cs (SimpleNameResolve): Avoid testing two times for
4365         current_block != null.
4366
4367         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
4368         not cope with strings, as it has been moved to the
4369         TableSwitchEmit.  Fixed bug in switch generation.
4370
4371         * expression.cs (New.DoResolve): Provide more context for the user
4372         when reporting an error.
4373
4374         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
4375         pointers. 
4376
4377         * expression.cs (MemberAccess.DoResolve): When we get a type back,
4378         check the permissions for it.  Note than in a type-resolution
4379         context the check was already present in DeclSpace.ResolveType,
4380         but was missing from the MemberAccess.
4381
4382         (ArrayCreation.CheckIndices): warn if the user has
4383         more nested levels of expressions, but there are no more
4384         dimensions specified.  Avoids crash on bug 41906.
4385
4386 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
4387
4388         * statement.cs (Block): replace Implicit bool, for a generic
4389         flags.   
4390         New flag: `Unchecked'.  This is used during the EmitMeta phase
4391         (which is out-of-line with the regular Resolve/Emit process for a
4392         statement, as this is done ahead of time, but still gets a chance
4393         to call constant resolve).
4394
4395         (Block.Flags): new enum for adding a new flag.
4396
4397         (Block.EmitMeta): track the state of unchecked.
4398
4399         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
4400         to enable constant resolution to work there as well.
4401
4402 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
4403
4404         * typemanager.cs (ienumerable_type): Also look up
4405         System.Collections.IEnumerable. 
4406
4407 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
4408
4409         TODO: Test more than one conditional per method.
4410
4411         * class.cs (Indexer.Define): Report the location where the user is
4412         referencing the unsupported feature.
4413
4414         (MethodData): Overload the use of `conditionals' to
4415         minimize the creation of needless ArrayLists.   This saves roughly
4416         212kb on my machine.
4417
4418         (Method): Implement the new IIteratorContainer interface.
4419         (Method.SetYields): Implement the method by setting the ModFlags
4420         to contain METHOD_YIELDS.
4421
4422         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
4423         which just got set to null.
4424
4425         * iterators.cs: New file.
4426
4427         (Yield, YieldBreak): New statements.
4428
4429         * statement.cs (Return.Resolve): Flag an error if we are used in
4430         an iterator method.
4431
4432         * codegen.cs (InIterator): New flag set if the code is being
4433         compiled in an iterator method.
4434
4435         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
4436         internal modifier, and we just use it to avoid adding extra
4437         fields, as this is seldom used.  
4438
4439         * cs-parser.jay: Add yield_statement (yield and yield break).
4440
4441         * driver.cs: New flag -v2 to turn on version 2 features. 
4442
4443         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
4444         hashtable when v2 is enabled.
4445
4446 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
4447
4448         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
4449         there is already a namespace defined with this name.
4450
4451         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
4452         people upgraded their corlibs.
4453
4454         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
4455         always use fully qualified types, no need to use the compiler
4456         front end.
4457
4458         (TypeManager.IsNamespace): Use binarysearch.
4459
4460         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
4461         AddDelegate): I did not quite use the new IsValid API properly: I
4462         have to pass the short-name and the fullname.  I was passing only
4463         the basename instead of the fullname sometimes. 
4464
4465         (TypeContainer.DefineType): call NamespaceClash.
4466
4467         * interface.cs (Interface.DefineType): use NamespaceClash before
4468         defining the type.
4469
4470         * delegate.cs (Delegate.DefineType): use NamespaceClash before
4471         defining the type.
4472
4473         * enum.cs: (Enum.DefineType): use NamespaceClash before
4474         defining the type.
4475
4476         * typemanager.cs (: 3-line patch that gives us some tasty 11%
4477         speed increase.  First, use the negative_hits cache when we get a
4478         negative.  Second, add the type with its full original name
4479         instead of the new . and + encoded name (reflection uses + to
4480         separate type from a nested type).  Use LookupTypeReflection
4481         directly which bypasses the type->name hashtable (that we already
4482         know does not contain the type.
4483
4484         * decl.cs (DeclSpace.ResolveTypeExpr): track the
4485         location/container type. 
4486
4487         * driver.cs: When passing utf8, use directly the UTF8Encoding.
4488
4489 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
4490
4491         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
4492
4493         * delegate.cs (NewDelegate.Resolve): Test whether an instance
4494         method is being referenced in the method group from a static
4495         context, and report error 120 if so.
4496
4497         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
4498         Error118. 
4499
4500         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
4501         is created, we create the A namespace).
4502
4503         * cs-parser.jay: A namespace also introduces a DeclarationFound.
4504         Fixes #41591
4505
4506 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
4507
4508         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
4509         invocation to ModuleBuilder.GetType with the same values will
4510         return a new type instance, so we need to cache its return
4511         values. 
4512
4513         * expression.cs (Binary.ResolveOperator): Only allow the compare
4514         operators on enums if they are of the same type.
4515
4516         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
4517         types of ValueType on their own case.  Before we were giving them
4518         the same treatment as objects.
4519
4520         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
4521         fullname.  Short name is used to compare against container name.
4522         Fullname is used to check against defined namespace names.
4523
4524         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
4525         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
4526
4527         (Method.CheckBase): Call parent.
4528         (MemberBase.CheckBase): Check for protected members on sealed
4529         classes.
4530         (PropertyBase.CheckBase): Call parent.
4531         (Field.Define): Call parent.
4532
4533         * report.cs: Negative error codes are now mapped to 8000 - code,
4534         so that the display is render more nicely.
4535
4536         * typemanager.cs: Do not use try/catch, instead report a regular
4537         error. 
4538
4539         (GetPointerType, GetReferenceType): These methods provide
4540         mechanisms to obtain the T* and T& from a T.  We had the code
4541         previously scattered around the code base, and it also used
4542         TypeManager.LookupType that would go through plenty of caches.
4543         This one goes directly to the type source.
4544
4545         In some places we did the Type.GetType followed by
4546         ModuleBuilder.GetType, but not in others, so this unifies the
4547         processing as well.
4548
4549         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
4550         statements now that we have namespace information.
4551
4552         * typemanager.cs (IsNamespace): New method, returns whether the
4553         string presented is a namespace or not.
4554
4555         (ComputeNamespaces): New public entry point, computes the list of
4556         available namespaces, using the GetNamespaces API call in Mono, or
4557         the slower version in MS.NET.   
4558
4559         Now before we start the semantic analysis phase, we have a
4560         complete list of namespaces including everything that the user has
4561         provided.
4562
4563         Deleted old code to cache namespaces in .nsc files.
4564
4565 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
4566
4567         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
4568         class/struct location definition Location for the implicit
4569         constructor location.
4570
4571         (Operator.Define): Use the location of the operator for the
4572         implicit Method definition.
4573
4574         (Constructor.Emit): use the constructor location for the implicit
4575         base initializer constructor.
4576
4577         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
4578         and the Expression class now contains two new methods:
4579
4580         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
4581         isolate type lookup from the rest of the resolution process.
4582
4583         Since we use Expressions to hold type definitions due to the way
4584         we parse the input we have historically overloaded Resolve to
4585         perform the Type lookups if a special flag is passed.  Now this is
4586         eliminated and two methods take their place. 
4587
4588         The differences in the two methods between xStep and xTerminal is
4589         that xStep is involved in our current lookup system that uses
4590         SimpleNames to compose a name, while xTerminal is used just to
4591         catch the case where the simplename lookup failed.
4592
4593 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
4594
4595         * expression.cs (ResolveMemberAccess): Remove redundant code.
4596         TypeExpr expressions are always born fully resolved.
4597
4598         * interface.cs (PopulateMethod): Do not lookup the types twice.
4599         We were doing it once during SemanticAnalysis and once during
4600         PopulateMethod.
4601
4602         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
4603         in local variable type definitions, were being returned as a
4604         SimpleName (we decomposed everything into a string), that is
4605         because primary_expression was being used instead of a type in the
4606         grammar (reduce/reduce conflicts).
4607
4608         The part that was wrong is that we converted the expression into a
4609         string (an oversimplification in one hand, compounded with primary
4610         expressions doing string concatenation).
4611
4612         So things like:
4613
4614         A.B.C [] x;
4615
4616         Would return "A.B.C[]" as a SimpleName.  This stopped things like
4617         using clauses from working on this particular context.  And a type
4618         was being matched directly against "A.B.C[]".
4619
4620         We now use the correct approach, and allow for ComposedCast to be
4621         part of the unary expression.  So the "A.B.C []" become a composed
4622         cast of "A.B.C" (as a nested group of MemberAccess with a
4623         SimpleName at the end) plus the rank composition "[]". 
4624
4625         Also fixes 35567
4626
4627 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
4628
4629         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
4630         for the access level checking.
4631
4632         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
4633         `TypeContainer container', because I kept getting confused when I
4634         was debugging this code.
4635
4636         * expression.cs (Indexers): Instead of tracking getters/setters,
4637         we now track them in parallel.  We create one arraylist less, but
4638         most importantly it is possible now for the LValue code to find a
4639         matching get for a set.
4640
4641         (IndexerAccess.DoResolveLValue): Update the code.
4642         GetIndexersForType has been modified already to extract all the
4643         indexers from a type.  The code assumed it did not.
4644
4645         Also make the code set the correct return type for the indexer.
4646         This was fixed a long time ago for properties, but was missing for
4647         indexers.  It used to be void_type.
4648
4649         (Binary.Emit): Test first for doubles instead of
4650         floats, as they are more common.
4651
4652         (Binary.EmitBranchable): Use the .un version of the branch opcodes
4653         when dealing with floats and the <=, >= operators.  This fixes bug
4654         #39314 
4655
4656         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
4657         to load the array value by emitting a load on the foreach variable
4658         type.  This was incorrect.  
4659
4660         We now emit the code to load an element using the the array
4661         variable type, and then we emit the conversion operator.
4662
4663         Fixed #40176
4664
4665 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
4666
4667         * attribute.cs: Avoid allocation of ArrayLists in the common case.
4668
4669 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
4670
4671         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
4672         test for protection before we test for signatures. 
4673
4674         (MethodSignature.ToString): implement.
4675
4676         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
4677         to the case where we reduced into a LongConstant.
4678
4679         * decl.cs (CheckAccessLevel): If the type is an array, we can not
4680         depend on whether the information is acurrate, because the
4681         Microsoft runtime will always claim that the array type is public,
4682         regardless of the real state.
4683
4684         If the type is a pointer, another problem happens: the type is
4685         reported as non-public in Microsoft.  
4686
4687         In both cases we have to call CheckAccessLevel recursively with
4688         the underlying type as the argument to be tested.
4689
4690 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
4691
4692         * assign.cs (Assign.Emit): If we are dealing with a compound
4693         assignment expression, we should use the code path that stores the
4694         intermediate result in a temporary value.  This fixes #40903.
4695
4696         *expression.cs (Indirection.ToString): Provide ToString method for
4697         debugging. 
4698
4699 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
4700
4701         * class.cs: Null out fields holding references to Block objects so
4702         they can be garbage collected.
4703
4704         * expression.cs (OverloadResolve): Remove unused local.
4705
4706 2003-04-07  Martin Baulig  <martin@ximian.com>
4707
4708         * codegen.cs (EmitContext.CurrentFile): New public field.
4709         (EmitContext.Mark): Use the CurrentFile to check whether the
4710         location is in the correct file.
4711         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
4712
4713 2003-04-07  Martin Baulig  <martin@ximian.com>
4714
4715         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
4716
4717         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
4718         location.  [FIXME: The location argument which gets passed to this
4719         method is sometimes wrong!]
4720
4721 2003-04-07  Nick Drochak <ndrochak@gol.com>
4722
4723         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
4724
4725 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
4726
4727         * expression.cs (Indirection.EmitAssign): We were using the
4728         temporary, but returning immediately instead of continuing the
4729         EmitAssing flow.
4730
4731 2003-04-06  Martin Baulig  <martin@ximian.com>
4732
4733         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
4734         if it's a nested child, but also deriving from the outer class.
4735         See test 190.cs.
4736
4737         * typemanager.cs (IsNestedChildOf): Make this work if it's a
4738         nested child, but also deriving from the outer class.  See
4739         test-190.cs.
4740         (FilterWithClosure): We may access private members of the outer
4741         class if we're a nested child and deriving from the outer class.
4742         (RealMemberLookup): Only set `closure_private_ok' if the
4743         `original_bf' contained BindingFlags.NonPublic.
4744
4745 2003-04-05  Martin Baulig  <martin@ximian.com>
4746
4747         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
4748
4749 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
4750
4751         * class.cs (Event.Define): Do not allow abstract events to have
4752         initializers. 
4753
4754 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
4755
4756         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
4757         block in event declarations.
4758
4759         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
4760         value type, get its address.
4761
4762         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
4763         leaving a class on the stack instead of a boolean value (int
4764         0/1).  Change the code so we compare against null, and then the
4765         result against zero.
4766
4767         * class.cs (TypeContainer.GetClassBases): We were checking for the
4768         parent class being sealed too late.
4769
4770         * expression.cs (Binary.Emit): For <= and >= when dealing with
4771         floating point values, use cgt.un and clt.un instead of cgt and
4772         clt alone.
4773
4774 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
4775
4776         * statement.cs: Apply the same optimization as MS: skip the 
4777         GetEnumerator returning an IEnumerator, and use the one returning a 
4778         CharEnumerator instead. This allows us to avoid the try-finally block 
4779         and the boxing.
4780
4781 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
4782
4783         * cs-parser.jay: Attributes cannot be applied to
4784                          namespaces. Fixes #40473
4785
4786 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4787
4788         * class.cs:
4789         (Add*): check if the name is valid using the full name for constants,
4790         fields, properties and events.
4791
4792 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
4793
4794         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
4795         char constants to be part of the enumeration.
4796
4797         * expression.cs (Conditional.DoResolve): Add support for operator
4798         true. Implements the missing functionality from 14.12
4799
4800         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
4801         operator true/false as required by the spec.
4802
4803         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
4804         implicit conversion to boolean.
4805
4806         * statement.cs (Statement.ResolveBoolean): A boolean expression is
4807         also one where the type implements `operator true'. 
4808
4809         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
4810         get an expression that will invoke operator true based on an
4811         expression.  
4812
4813         (GetConversionOperators): Removed the hack that called op_True
4814         here.  
4815
4816         (Expression.ResolveBoolean): Move this from Statement.
4817
4818 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
4819
4820         * ecore.cs (FieldExpr): do not allow initialization of initonly
4821         fields on derived classes
4822
4823 2003-03-13  Martin Baulig  <martin@ximian.com>
4824
4825         * statement.cs (Block.Emit): Call ig.BeginScope() and
4826         ig.EndScope() when compiling with debugging info; call
4827         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
4828
4829 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
4830
4831         * expression.cs (Indexers): Do not construct immediately, allow
4832         for new members to be appended as we go.  Fixes 38143
4833
4834 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4835
4836         * expression.cs: save/restore context when resolving an unchecked
4837         expression.
4838
4839 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
4840
4841         * cfold.cs: Catch division by zero in modulus operator during
4842         constant folding.
4843
4844 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
4845
4846         * interface.cs (Interface.DefineMembers): Avoid defining members
4847         twice. 
4848
4849 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
4850
4851         * driver.cs: handle the +/- options for -noconfig
4852
4853         * statement.cs (Unckeched.Resolve): Also track the state of
4854         unchecked in the Resolve phase.
4855
4856 2003-02-27  Martin Baulig  <martin@ximian.com>
4857
4858         * ecore.cs (Expression.MemberLookup): Don't create a
4859         MethodGroupExpr for something which is not a method.  Fixes #38291.
4860
4861 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
4862
4863         * class.cs (MemberBase.CheckParameters): Also check that the type
4864         is unmanaged if it is a pointer.
4865
4866         * expression.cs (SizeOf.Resolve): Add location information.
4867
4868         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
4869         a managed type is declared.
4870
4871         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
4872         parameter modifiers as well.  Fixes bug 38606
4873
4874         * class.cs: Very sad.  Am backing out the speed up changes
4875         introduced by the ArrayList -> Array in the TypeContainer, as they
4876         were not actually that much faster, and introduced a bug (no error
4877         reports on duplicated methods).
4878
4879         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
4880         source first, this will guarantee that we have a valid expression
4881         before calling in lower levels functions that will require a
4882         resolved object.  Then use this original_source in the
4883         target.ResolveLValue instead of the original source that was
4884         passed to us.
4885
4886         Another change.  Use target.Resolve instead of LValueResolve.
4887         Although we are resolving for LValues, we will let the Assign code
4888         take care of that (it will be called again from Resolve).  This
4889         basically allows code like this:
4890
4891         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
4892         class Y { void A (X x) { x [0] += o; }
4893
4894         The problem was that the indexer was trying to resolve for
4895         set_Item (idx, object o) and never finding one.  The real set_Item
4896         was set_Item (idx, X).  By delaying the process we get the right
4897         semantics. 
4898
4899         Fixes bug 36505
4900
4901 2003-02-23  Martin Baulig  <martin@ximian.com>
4902
4903         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
4904         while calling DoEmit ().
4905
4906         * codegen.cs (EmitContext.Mark): Don't mark locations in other
4907         source files; if you use the #line directive inside a method, the
4908         compiler stops emitting line numbers for the debugger until it
4909         reaches the end of the method or another #line directive which
4910         restores the original file.
4911
4912 2003-02-23  Martin Baulig  <martin@ximian.com>
4913
4914         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
4915
4916 2003-02-23  Martin Baulig  <martin@ximian.com>
4917
4918         * statement.cs (Block.AddChildVariableNames): We need to call this
4919         recursively, not just for our immediate children.
4920
4921 2003-02-23  Martin Baulig  <martin@ximian.com>
4922
4923         * class.cs (Event.Define): Always make the field private, like csc does.
4924
4925         * typemanager.cs (TypeManager.RealMemberLookup): Make events
4926         actually work, fixes bug #37521.
4927
4928 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
4929
4930         * delegate.cs: When creating the various temporary "Parameters"
4931         classes, make sure that we call the ComputeAndDefineParameterTypes
4932         on those new parameters (just like we do with the formal ones), to
4933         allow them to be resolved in the context of the DeclSpace.
4934
4935         This fixes the bug that Dick observed in Bugzilla #38530.
4936
4937 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
4938
4939         * expression.cs (ResolveMemberAccess): When resolving a constant,
4940         do not attempt to pull a constant if the value was not able to
4941         generate a valid constant.
4942
4943         * const.cs (LookupConstantValue): Do not report more errors than required.
4944
4945 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4946
4947         * expression.cs: fixes bug #38328.
4948
4949 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
4950
4951         * class.cs: Changed all the various members that can be part of a
4952         class from being an ArrayList to be an Array of the right type.
4953         During the DefineType type_list, interface_list, delegate_list and
4954         enum_list are turned into types, interfaces, delegates and enums
4955         arrays.  
4956
4957         And during the member population, indexer_list, event_list,
4958         constant_list, field_list, instance_constructor_list, method_list,
4959         operator_list and property_list are turned into their real arrays.
4960
4961         Although we could probably perform this operation earlier, for
4962         good error reporting we need to keep the lists and remove the
4963         lists for longer than required.
4964
4965         This optimization was triggered by Paolo profiling the compiler
4966         speed on the output of `gen-sample-program.pl' perl script. 
4967
4968         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
4969         not crash in methods like MemberLookupFailed that use this field.  
4970
4971         This problem arises when the compiler fails to resolve a type
4972         during interface type definition for example.
4973
4974 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
4975
4976         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
4977         inherit from System.Object, so we have to stop at null, not only
4978         when reaching System.Object.
4979
4980 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
4981
4982         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
4983         DeclaredOnly because the parent indexer might have had a different
4984         name, but did not loop until the top of the hierarchy was reached.
4985
4986         The problem this one fixes is 35492: when a class implemented an
4987         indexer from an interface, we were getting the interface method
4988         (which was abstract) and we were flagging an error (can not invoke
4989         abstract method).
4990
4991         This also keeps bug 33089 functioning, and test-148 functioning.
4992
4993         * typemanager.cs (IsSpecialMethod): The correct way of figuring
4994         out if a method is special is to see if it is declared in a
4995         property or event, or whether it is one of the predefined operator
4996         names.   This should fix correctly #36804.
4997
4998 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
4999
5000         The goal here is to remove the dependency on EmptyCast.Peel ().
5001         Killing it completely.
5002
5003         The problem is that currently in a number of places where
5004         constants are expected, we have to "probe" for an EmptyCast, and
5005         Peel, which is not the correct thing to do, as this will be
5006         repetitive and will likely lead to errors. 
5007
5008         The idea is to remove any EmptyCasts that are used in casts that
5009         can be reduced to constants, so we only have to cope with
5010         constants. 
5011
5012         This bug hunt was triggered by Bug 37363 and the desire to remove
5013         the duplicate pattern where we were "peeling" emptycasts to check
5014         whether they were constants.  Now constants will always be
5015         constants.
5016
5017         * ecore.cs: Use an enumconstant here instead of wrapping with
5018         EmptyCast.  
5019
5020         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
5021         throwing me off.  By handling this we can get rid of a few hacks.
5022
5023         * statement.cs (Switch): Removed Peel() code.
5024
5025 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
5026
5027         * class.cs: Location information for error 508
5028
5029         * expression.cs (New.DoResolve): Add a guard against double
5030         resolution of an expression.  
5031
5032         The New DoResolve might be called twice when initializing field
5033         expressions (see EmitFieldInitializers, the call to
5034         GetInitializerExpression will perform a resolve on the expression,
5035         and later the assign will trigger another resolution
5036
5037         This leads to bugs (#37014)
5038
5039         * delegate.cs: The signature for EndInvoke should contain any ref
5040         or out parameters as well.  We were not doing this in the past. 
5041
5042         * class.cs (Field.Define): Do not overwrite the type definition
5043         inside the `volatile' group.  Turns out that volatile enumerations
5044         were changing the type here to perform a validity test, which
5045         broke conversions. 
5046
5047 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
5048
5049         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
5050         and structs, we do not want to load the instance variable
5051
5052         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
5053         enum_type has to be handled like an object reference (implicit
5054         conversions exists from this to object), but the regular IsClass
5055         and IsValueType tests will never return true for this one.
5056
5057         Also we use TypeManager.IsValueType instead of type.IsValueType,
5058         just for consistency with the rest of the code (this is only
5059         needed if we ever use the construct exposed by test-180.cs inside
5060         corlib, which we dont today).
5061
5062 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
5063
5064         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
5065         just InternalCall.
5066
5067 2003-02-09  Martin Baulig  <martin@ximian.com>
5068
5069         * namespace.cs (Namespace..ctor): Added SourceFile argument.
5070         (Namespace.DefineNamespaces): New static public method; this is
5071         called when we're compiling with debugging to add all namespaces
5072         to the symbol file.
5073
5074         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
5075         pass it to the Namespace's .ctor.
5076
5077         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
5078         and MethodBase arguments; pass the namespace ID to the symwriter;
5079         pass the MethodBase instead of the token to the symwriter.
5080         (SymbolWriter.DefineNamespace): New method to add a namespace to
5081         the symbol file.
5082
5083 2003-02-09  Martin Baulig  <martin@ximian.com>
5084
5085         * symbolwriter.cs: New file.  This is a wrapper around
5086         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
5087         methods here in near future.
5088
5089 2003-02-09  Martin Baulig  <martin@ximian.com>
5090
5091         * codegen.cs (EmitContext.Mark): Just pass the arguments to
5092         ILGenerator.MarkSequencePoint() which are actually used by the
5093         symbol writer.
5094
5095 2003-02-09  Martin Baulig  <martin@ximian.com>
5096
5097         * location.cs (SourceFile): New public sealed class.  This
5098         contains the name and an index which is used in the location's token.
5099         (Location): Reserve an appropriate number of bits in the token for
5100         the source file instead of walking over that list, this gives us a
5101         really huge performance improvement when compiling with debugging.
5102
5103         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
5104         `SourceFile' argument instead of a string.
5105         (Driver.ProcessFile): Add all the files via Location.AddFile(),
5106         but don't parse/tokenize here, we need to generate the list of all
5107         source files before we do that.
5108         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
5109         the files.
5110
5111         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
5112         instead of a string.
5113
5114         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
5115         of a string.
5116
5117 2003-02-09  Martin Baulig  <martin@ximian.com>
5118
5119         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
5120         filename on `#line default'.
5121
5122 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
5123
5124         * statement.cs: don't clear the pinned var when the fixed statement
5125         returns from the method (fixes bug#37752).
5126
5127 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
5128
5129         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
5130         to IsValueType.
5131
5132 2003-02-07  Martin Baulig  <martin@ximian.com>
5133
5134         * driver.cs: Removed the `--debug-args' command line argument.
5135
5136         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
5137         automatically by the AsssemblyBuilder.
5138         (CodeGen.InitializeSymbolWriter): We don't need to call any
5139         initialization function on the symbol writer anymore.  This method
5140         doesn't take any arguments.
5141
5142 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
5143
5144         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
5145         from referenced assemblies as well.
5146
5147 2003-02-02  Martin Baulig  <martin@ximian.com>
5148
5149         * class.cs (MethodData.Emit): Generate debugging info for external methods.
5150
5151 2003-02-02  Martin Baulig  <martin@ximian.com>
5152
5153         * class.cs (Constructor.Emit): Open the symbol writer before
5154         emitting the constructor initializer.
5155         (ConstructorInitializer.Emit): Call ec.Mark() to allow
5156         single-stepping through constructor initializers.
5157
5158 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
5159
5160         * class.cs: Handle error 549: do not allow virtual methods in
5161         sealed classes. 
5162
5163 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
5164
5165         * decl.cs: Check access levels when resolving types
5166
5167 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
5168
5169         * statement.cs: Add parameters and locals set in catch blocks that might 
5170         return to set vector
5171
5172 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
5173
5174         * class.cs (Operator): Set the SpecialName flags for operators.
5175
5176         * expression.cs (Invocation.DoResolve): Only block calls to
5177         accessors and operators on SpecialName methods.
5178
5179         (Cast.TryReduce): Handle conversions from char constants.
5180
5181
5182 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
5183
5184         * statement.cs: small memory and time optimization in FlowBranching.
5185
5186 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
5187
5188         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
5189         problem that the last fix but in the other sid (Set).
5190
5191         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
5192         access when there is no indexer in the hierarchy.
5193
5194 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
5195
5196         * class.cs: Combine some if statements.
5197
5198 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5199
5200         * driver.cs: fixed bug #37187.
5201
5202 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
5203
5204         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
5205         any indexer, it's needed to build a list with all the indexers in the
5206         hierarchy (AllGetters), else we have problems. Fixes #35653.
5207
5208 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
5209
5210         * class.cs (MethodData.Define): It is wrong for an interface
5211         implementation to be static in both cases: explicit and implicit.
5212         We were only handling this in one case.
5213
5214         Improve the if situation there to not have negations.
5215
5216         * class.cs (Field.Define): Turns out that we do not need to check
5217         the unsafe bit on field definition, only on usage.  Remove the test.
5218
5219 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5220
5221         * driver.cs: use assembly.Location instead of Codebase (the latest
5222         patch made mcs fail when using MS assemblies).
5223
5224 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
5225
5226         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
5227         get the path to *corlib.dll.
5228
5229 2003-01-21  Nick Drochak <ndrochak@gol.com>
5230
5231         * cs-tokenizer.cs:
5232         * pending.cs:
5233         * typemanager.cs: Remove compiler warnings
5234
5235 2003-01-20  Duncan Mak  <duncan@ximian.com>
5236
5237         * AssemblyInfo.cs: Bump the version number to 0.19.
5238
5239 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5240
5241         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
5242
5243 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
5244
5245         * class.cs (Constructor::Emit): Emit debugging info for constructors.
5246
5247 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
5248
5249         * cs-parser.jay: Small fix: we were not comparing the constructor
5250         name correctly.   Thanks to Zoltan for the initial pointer.
5251
5252 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
5253
5254         * cs-tokenizer.cs: Set file name when specified with #line
5255
5256 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
5257
5258         * cs-parser.jay: Only perform the constructor checks here if we
5259         are named like the class;  This will help provider a better
5260         error.  The constructor path is taken when a type definition is
5261         not found, but most likely the user forgot to add the type, so
5262         report that rather than the constructor error.
5263
5264 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
5265
5266         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
5267         allocations.
5268
5269 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
5270
5271         * cs-parser.jay: Add cleanup call.
5272
5273 2003-01-13  Duncan Mak  <duncan@ximian.com>
5274
5275         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
5276         consistent with other methods.
5277
5278 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
5279
5280         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
5281
5282 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
5283
5284         * attribute.cs: only set GuidAttr to true when we have a
5285         GuidAttribute.
5286
5287 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5288
5289         * ecore.cs:
5290         * expression.cs:
5291         * typemanager.cs: fixes to allow mcs compile corlib with the new
5292         Type.IsSubclassOf fix.
5293
5294 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
5295
5296         * expression.cs (LocalVariableReference.DoResolve): Classify a
5297         constant as a value, not as a variable.   Also, set the type for
5298         the variable.
5299
5300         * cs-parser.jay (fixed_statement): take a type instead of a
5301         pointer_type, so we can produce a better error message later.
5302
5303         * statement.cs (Fixed.Resolve): Flag types that are not pointers
5304         as an error.  
5305
5306         (For.DoEmit): Make inifinite loops have a
5307         non-conditional branch back.
5308
5309         (Fixed.DoEmit): First populate the pinned variables, then emit the
5310         statement, then clear the variables.  Before I was emitting the
5311         code once for each fixed piece.
5312
5313
5314 2003-01-08  Martin Baulig  <martin@ximian.com>
5315
5316         * statement.cs (FlowBranching.MergeChild): A break in a
5317         SWITCH_SECTION does not leave a loop.  Fixes #36155.
5318
5319 2003-01-08  Martin Baulig  <martin@ximian.com>
5320
5321         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
5322         lives in the same number space than `param_map'.  Fixes #36154.
5323
5324 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
5325
5326         * cs-parser.jay (constructor_declaration): Set the
5327         Constructor.ModFlags before probing for it.  This makes the
5328         compiler report 514, 515 and 132 (the code was there, but got
5329         broken). 
5330
5331         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
5332         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
5333         (GotoCase.Resolve): Set `Returns' to ALWAYS.
5334
5335 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
5336
5337         * enum.cs: create the enum static fields using the enum type.
5338
5339 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
5340
5341         * class.cs: don't try to create the ParamBuilder for the return
5342         type if it's not needed (and handle it breaking for the ms runtime
5343         anyway).
5344
5345 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
5346
5347         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
5348
5349 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
5350
5351         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
5352         the command.   This showed up while compiling the JANET source
5353         code, which used \r as its only newline separator.
5354
5355 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
5356
5357         * class.cs (Method.Define): If we are an operator (because it
5358         reuses our code), then set the SpecialName and HideBySig.  #36128
5359
5360 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
5361
5362         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
5363         exception, report error 120 `object reference required'.
5364
5365         * driver.cs: Add --pause option, used during to measure the size
5366         of the process as it goes with --timestamp.
5367
5368         * expression.cs (Invocation.DoResolve): Do not allow methods with
5369         SpecialName to be invoked.
5370
5371 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
5372
5373         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
5374         number before adding it.
5375
5376 2002-12-21  Ravi Pratap  <ravi@ximian.com>
5377
5378         * ecore.cs (StandardImplicitConversion): When in an unsafe
5379         context, we allow conversion between void * to any other pointer
5380         type. This fixes bug #35973.
5381
5382 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
5383
5384         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
5385         is not thrown when extensionless outputs are used 
5386
5387 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5388
5389         * rootcontext.cs: fixed compilation of corlib.
5390
5391 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
5392
5393         * attribute.cs (Attributes.Contains): Add new method.
5394
5395         * class.cs (MethodCore.LabelParameters): if the parameter is an
5396         `out' parameter, check that no attribute `[In]' has been passed.
5397
5398         * enum.cs: Handle the `value__' name in an enumeration.
5399
5400 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
5401
5402         * decl.cs: Added special case to allow overrides on "protected
5403         internal" methods
5404
5405 2002-12-18  Ravi Pratap  <ravi@ximian.com>
5406
5407         * attribute.cs (Attributes.AddAttributeSection): Rename to this
5408         since it makes much more sense.
5409
5410         (Attributes.ctor): Don't require a Location parameter.
5411
5412         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
5413
5414         * attribute.cs (ApplyAttributes): Remove extra Location parameters
5415         since we already have that information per attribute.
5416
5417         * everywhere : make appropriate changes.
5418
5419         * class.cs (LabelParameters): Write the code which actually
5420         applies attributes to the return type. We can't do this on the MS
5421         .NET runtime so we flag a warning in the case an exception is
5422         thrown.
5423
5424 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
5425
5426         * const.cs: Handle implicit null conversions here too.
5427
5428 2002-12-17  Ravi Pratap  <ravi@ximian.com>
5429
5430         * class.cs (MethodCore.LabelParameters): Remove the extra
5431         Type [] parameter since it is completely unnecessary. Instead
5432         pass in the method's attributes so that we can extract
5433         the "return" attribute.
5434
5435 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
5436
5437         * cs-parser.jay (parse): Use Report.Error to flag errors instead
5438         of ignoring it and letting the compile continue.
5439
5440         * typemanager.cs (ChangeType): use an extra argument to return an
5441         error condition instead of throwing an exception.
5442
5443 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
5444
5445         * expression.cs (Unary.TryReduce): mimic the code for the regular
5446         code path.  Perform an implicit cast in the cases where we can
5447         implicitly convert to one of the integral types, and then reduce
5448         based on that constant.   This fixes bug #35483.
5449
5450 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5451
5452         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
5453
5454 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5455
5456         * namespace.cs: fixed bug #35489.
5457
5458 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
5459
5460         * class.cs: Remove some dead code.
5461
5462         * cs-parser.jay: Estimate the number of methods needed
5463         (RootContext.MethodCount);
5464
5465         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
5466         numbers instead of StringBuilders.
5467
5468         * support.cs (PtrHashtable): Add constructor with initial size;
5469         We can now reduce reallocations of the method table.
5470
5471 2002-12-10  Ravi Pratap  <ravi@ximian.com>
5472
5473         * attribute.cs (ApplyAttributes): Keep track of the emitted
5474         attributes on a per-target basis. This fixes bug #35413.
5475
5476 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
5477
5478         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
5479         default to the Windows 1252 encoding.
5480
5481         (UnixParseOption): Support version, thanks to Alp for the missing
5482         pointer. 
5483
5484         * AssemblyInfo.cs: Add nice assembly information.
5485
5486         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
5487         (bug 35169).
5488
5489         * cs-parser.jay: Allow a trailing comma before the close bracked
5490         in the attribute_section production.
5491
5492         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
5493         address of the instance was being taken, I will take this out,
5494         because we take the address of the object immediately here.
5495
5496 2002-12-09  Ravi Pratap  <ravi@ximian.com>
5497
5498         * typemanager.cs (AreMultipleAllowed): Take care of the most
5499         obvious case where attribute type is not in the current assembly -
5500         stupid me ;-)
5501
5502 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
5503
5504         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
5505         definitions, instead of doing that afterwards.  
5506
5507         Also we use a nice little hack, depending on the constructor, we
5508         know if we are a "composed" name or a simple name.  Hence, we
5509         avoid the IndexOf test, and we avoid 
5510
5511         * codegen.cs: Add code to assist in a bug reporter to track down
5512         the source of a compiler crash. 
5513
5514 2002-12-07  Ravi Pratap  <ravi@ximian.com>
5515
5516         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
5517         types have been emitted for a given element and flag an error
5518         if something which does not have AllowMultiple set is used more
5519         than once.
5520
5521         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
5522         attribute types and their corresponding AllowMultiple properties
5523
5524         (AreMultipleAllowed): Check the property for a given type.
5525
5526         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
5527         property in the case we have a TypeContainer.
5528
5529         (Attributes.AddAttribute): Detect duplicates and just skip on
5530         adding them. This trivial fix catches a pretty gross error in our
5531         attribute emission - global attributes were being emitted twice!
5532
5533         Bugzilla bug #33187 is now fixed.
5534
5535 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
5536
5537         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
5538         instead of pp_and).
5539
5540         * expression.cs (Binary.ResolveOperator): I can only use the
5541         Concat (string, string, string) and Concat (string, string,
5542         string, string) if the child is actually a concatenation of
5543         strings. 
5544
5545 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
5546
5547         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
5548         context where we need a 2-character lookahead.
5549
5550         * pending.cs (PendingImplementation): Rework so we can keep track
5551         of interface types all the time, and flag those which were
5552         implemented by parents as optional.
5553
5554 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
5555
5556         * expression.cs (Binary.ResolveOperator): Use
5557         String.Concat(string,string,string) or
5558         String.Concat(string,string,string,string) when possible. 
5559
5560         * typemanager: More helper methods.
5561
5562
5563 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
5564
5565         * pending.cs: remove the bogus return from GetMissingInterfaces()
5566         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
5567
5568 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5569
5570         * namespace.cs: avoid duplicated 'using xxx' being added to
5571         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
5572         when we get more than one 'using' statement for the same namespace.
5573         Report a CS0105 warning for it.
5574
5575 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
5576
5577         * cs-tokenizer.cs (consume_identifier): use read directly, instead
5578         of calling getChar/putback, uses internal knowledge of it.    
5579
5580         (xtoken): Reorder tokenizer so most common patterns are checked
5581         first.  This reduces the compilation time in another 5% (from 8.11s
5582         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
5583
5584         The parsing time is 22% of the compilation in mcs, and from that
5585         64% is spent on the tokenization process.  
5586
5587         I tried using a binary search for keywords, but this is slower
5588         than the hashtable.  Another option would be to do a couple of
5589         things:
5590
5591                 * Not use a StringBuilder, instead use an array of chars,
5592                   with a set value.  Notice that this way we could catch
5593                   the 645 error without having to do it *afterwards*.
5594
5595                 * We could write a hand-parser to avoid the hashtable
5596                   compares altogether.
5597
5598         The identifier consumption process takes 37% of the tokenization
5599         time.  Another 15% is spent on is_number.  56% of the time spent
5600         on is_number is spent on Int64.Parse:
5601
5602                 * We could probably choose based on the string length to
5603                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
5604                   computations. 
5605
5606         Another 3% is spend on wrapping `xtoken' in the `token' function.
5607
5608         Handle 0xa0 as whitespace (#34752)
5609
5610 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
5611
5612         * typemanager.cs (IsCLRType): New routine to tell whether a type
5613         is one of the builtin types.  
5614
5615         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
5616         typecode in more places instead of doing pointer comparissions.
5617         We could leverage some knowledge about the way the typecodes are
5618         laid out.
5619
5620         New code to cache namespaces in assemblies, it is currently not
5621         invoked, to be used soon.
5622
5623         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
5624
5625         * expression.cs (Binary.ResolveOperator): specially handle
5626         strings, and do not perform user-defined operator overloading for
5627         built-in types.
5628
5629 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
5630
5631         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
5632         internalcall as it is a pretty simple operation;  Avoid whenever
5633         possible to call Char.IsLetter.
5634
5635         (consume_identifier): Cut by half the number of
5636         hashtable calls by merging the is_keyword and GetKeyword behavior.
5637
5638         Do not short-circuit, because if we do, we
5639         report errors (ie, #if false && true would produce an invalid
5640         directive error);
5641
5642
5643 2002-11-24  Martin Baulig  <martin@ximian.com>
5644
5645         * expression.cs (Cast.TryReduce): If we're in checked syntax,
5646         check constant ranges and report a CS0221.  Fixes #33186.
5647
5648 2002-11-24  Martin Baulig  <martin@ximian.com>
5649
5650         * cs-parser.jay: Make this work for uninitialized variable
5651         declarations in the `for' initializer.  Fixes #32416.
5652
5653 2002-11-24  Martin Baulig  <martin@ximian.com>
5654
5655         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
5656         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
5657
5658 2002-11-24  Martin Baulig  <martin@ximian.com>
5659
5660         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
5661         argument; if true, we also check for user-defined conversions.
5662         This is only needed if both arguments are of a user-defined type.
5663         Fixes #30443, added test-175.cs.
5664         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
5665
5666         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
5667
5668 2002-11-24  Martin Baulig  <martin@ximian.com>
5669
5670         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
5671         function to get the store opcode.
5672         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
5673         only emit the Ldelema if the store opcode is Stobj.  You must run
5674         both test-34 and test-167 to test this.  Fixes #34529.
5675
5676 2002-11-23  Martin Baulig  <martin@ximian.com>
5677
5678         * ecore.cs (Expression.MemberLookup): Added additional
5679         `qualifier_type' argument which is used when we're being called
5680         from MemberAccess.DoResolve() and null if we're called from a
5681         SimpleName lookup.
5682         (Expression.MemberLookupFailed): New method to report errors; this
5683         does the CS1540 check and reports the correct error message.
5684
5685         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
5686         argument for the CS1540 check and redone the way how we're dealing
5687         with private members.  See the comment in the source code for details.
5688         (FilterWithClosure): Reverted this back to revision 1.197; renamed
5689         `closure_start_type' to `closure_qualifier_type' and check whether
5690         it's not null.  It was not this filter being broken, it was just
5691         being called with the wrong arguments.
5692
5693         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
5694         and pass it the correct `qualifier_type'; this also does the error
5695         handling for us.
5696
5697 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
5698
5699         * expression.cs (Invocation.EmitParams): If the we are dealing
5700         with a non-built-in value type, load its address as well.
5701
5702         (ArrayCreation): Use a a pretty constant instead
5703         of the hardcoded value 2.   Use 6 instead of 2 for the number of
5704         static initializers.  
5705
5706         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
5707         because they are not really value types, just glorified integers. 
5708
5709         * driver.cs: Do not append .exe, the CSC compiler does not do it.
5710
5711         * ecore.cs: Remove redundant code for enumerations, make them use
5712         the same code path as everything else, fixes the casting issue
5713         with enumerations in Windows.Forms.
5714
5715         * attribute.cs: Do only cast to string if it is a string, the
5716         validation happens later.
5717
5718         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
5719         people upgrade their corlibs.
5720
5721         * ecore.cs: Oops, enumerations were not following the entire code path
5722
5723 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
5724
5725         * typemanager.cs (FilterWithClosure): Commented out the test for
5726         1540 in typemanager.cs, as it has problems when accessing
5727         protected methods from a parent class (see test-174.cs). 
5728
5729         * attribute.cs (Attribute.ValidateGuid): new method.
5730         (Attribute.Resolve): Use above.
5731
5732 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
5733
5734         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
5735
5736         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
5737         handling for enumerations, as we only needed the TypeContainer
5738         functionality to begin with (this is required for the fix below to
5739         work for enums that reference constants in a container class for
5740         example). 
5741
5742         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
5743
5744         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
5745         a valid TypeBuilder to perform lookups on.o
5746
5747         * class.cs (InheritableMemberSignatureCompare): Use true in the
5748         call to GetGetMethod and GetSetMethod, because we are comparing
5749         the signature, and we need to get the methods *even* if they are
5750         private. 
5751
5752         (PropertyBase.CheckBase): ditto.
5753
5754         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
5755         GotoCase.Resolve): Use Peel on EmpytCasts.
5756
5757         * ecore.cs (EmptyCast): drop child, add Peel method.
5758
5759 2002-11-17  Martin Baulig  <martin@ximian.com>
5760
5761         * ecore.cs (EmptyCast.Child): New public property.
5762
5763         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
5764         label resolved to an EmptyCast.  Fixes #34162.
5765         (GotoCase.Resolve): Likewise.
5766         (Block.EmitMeta): Likewise.
5767
5768 2002-11-17  Martin Baulig  <martin@ximian.com>
5769
5770         * expression.cs (Invocation.BetterConversion): Prefer int over
5771         uint; short over ushort; long over ulong for integer literals.
5772         Use ImplicitConversionExists instead of StandardConversionExists
5773         since we also need to check for user-defined implicit conversions.
5774         Fixes #34165.  Added test-173.cs.
5775
5776 2002-11-16  Martin Baulig  <martin@ximian.com>
5777
5778         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
5779         with the `true' and `false' literals.  Fixes #33151.
5780
5781 2002-11-16  Martin Baulig  <martin@ximian.com>
5782
5783         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
5784         October 22nd; don't do the cs1540 check for static members.
5785
5786         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
5787         now using our own filter here and doing the cs1540 check again.
5788
5789 2002-11-16  Martin Baulig  <martin@ximian.com>
5790
5791         * support.cs (InternalParameters): Don't crash if we don't have
5792         any fixed parameters.  Fixes #33532.
5793
5794 2002-11-16  Martin Baulig  <martin@ximian.com>
5795
5796         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
5797         when looking up static methods to make this work on Windows.
5798         Fixes #33773.
5799
5800 2002-11-16  Martin Baulig  <martin@ximian.com>
5801
5802         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
5803         a setter rather than using PropertyInfo.CanWrite.
5804
5805 2002-11-15  Nick Drochak  <ndrochak@gol.com>
5806
5807         * class.cs: Allow acces to block member by subclasses. Fixes build
5808         breaker.
5809
5810 2002-11-14  Martin Baulig  <martin@ximian.com>
5811
5812         * class.cs (Constructor.Emit): Added the extern/block check.
5813         Fixes bug #33678.
5814
5815 2002-11-14  Martin Baulig  <martin@ximian.com>
5816
5817         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
5818         iteration while looking for indexers, this is needed because the
5819         indexer may have a different name in our base classes.  Fixed the
5820         error reporting (no indexers at all, not get accessor, no
5821         overloaded match).  Fixes bug #33089.
5822         (IndexerAccess.DoResolveLValue): Likewise.
5823
5824 2002-11-14  Martin Baulig  <martin@ximian.com>
5825
5826         * class.cs (PropertyBase.CheckBase): Make this work for multiple
5827         indexers.  Fixes the first part of bug #33089.
5828         (MethodSignature.InheritableMemberSignatureCompare): Added support
5829         for properties.
5830
5831 2002-11-13  Ravi Pratap  <ravi@ximian.com>
5832
5833         * attribute.cs (Attribute.Resolve): Catch the
5834         NullReferenceException and report it since it isn't supposed to
5835         happen. 
5836
5837 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
5838
5839         * expression.cs (Binary.EmitBranchable): Also handle the cases for
5840         LogicalOr and LogicalAnd that can benefit from recursively
5841         handling EmitBranchable.  The code now should be nice for Paolo.
5842
5843 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
5844
5845         * typemanager.cs (LookupType): Added a negative-hit hashtable for
5846         the Type lookups, as we perform quite a number of lookups on
5847         non-Types.  This can be removed once we can deterministically tell
5848         whether we have a type or a namespace in advance.
5849
5850         But this might require special hacks from our corlib.
5851
5852         * TODO: updated.
5853
5854         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
5855         and double which avoids a conversion from an integer to a double.
5856
5857         * expression.cs: tiny optimization, avoid calling IsConstant,
5858         because it effectively performs the lookup twice.
5859
5860 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
5861
5862         But a bogus return here to keep the semantics of the old code
5863         until the Mono runtime is fixed.
5864
5865         * pending.cs (GetMissingInterfaces): New method used to remove all
5866         the interfaces that are already implemented by our parent
5867         classes from the list of pending methods. 
5868
5869         * interface.cs: Add checks for calls after ResolveTypeExpr.
5870
5871 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
5872
5873         * class.cs (Class.Emit): Report warning 67: event not used if the
5874         warning level is beyond 3.
5875
5876         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
5877         being a NullLiteral.
5878
5879         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
5880         specifiers. 
5881
5882         * class.cs (TypeContainer.GetClassBases): Cover a missing code
5883         path that might fail if a type can not be resolved.
5884
5885         * expression.cs (Binary.Emit): Emit unsigned versions of the
5886         operators. 
5887
5888         * driver.cs: use error 5.
5889
5890 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
5891
5892         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
5893
5894 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
5895
5896         * cs-parser.jay (switch_section): A beautiful patch from Martin
5897         Baulig that fixed 33094.
5898
5899 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
5900
5901         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
5902         Check whether the base is abstract and report an error if so.
5903
5904         * expression.cs (IndexerAccess.DoResolveLValue,
5905         IndexerAccess.DoResolve): ditto. 
5906
5907         (Invocation.DoResolve): ditto.
5908
5909         (Invocation.FullMethodDesc): Improve the report string.
5910
5911         * statement.cs (Block): Eliminate IsVariableDefined as it is
5912         basically just a wrapper for GetVariableInfo.
5913
5914         * ecore.cs (SimpleName): Use new 
5915
5916         * support.cs (ReflectionParamter.ParameterType): We unwrap the
5917         type, as we return the actual parameter ref/unref state on a
5918         different call.
5919
5920 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
5921
5922         * support.cs: Return proper flags REF/OUT fixing the previous
5923         commit.  
5924
5925         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
5926         not used to mean `ref' but `ref or out' in ParameterReference
5927
5928         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
5929         full type signature instead of calling TypeManger.CSharpName
5930         ourselves. 
5931
5932         * support.cs (InternalParameters.ParameterDesc): Do not compare
5933         directly to the modflags, because REF/OUT will actually be bitsets
5934         if set. 
5935
5936         * delegate.cs (VerifyMethod): Check also the modifiers.
5937
5938         * cs-tokenizer.cs: Fix bug where floating point values with an
5939         exponent where a sign was missing was ignored.
5940
5941         * driver.cs: Allow multiple assemblies to be specified in a single
5942         /r: argument
5943
5944 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
5945
5946         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
5947         because identifiers after a parenthesis would end up in this kind
5948         of production, and we needed to desamiguate it for having casts
5949         like:
5950
5951                 (UserDefinedType *) xxx
5952
5953 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
5954
5955         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
5956         we should set on the Bindingflags.NonPublic, but not turn on
5957         private_ok.  private_ok controls whether a Private member is
5958         returned (this is chekced on the filter routine), while the
5959         BindingFlags.NonPublic just controls whether private/protected
5960         will be allowed.   This fixes the problem part of the problem of
5961         private properties being allowed to be used in derived classes.
5962
5963         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
5964         so we can call the children DoResolveLValue method (this will
5965         properly signal errors on lvalue assignments to base properties)
5966
5967         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
5968         getter are null, and we have a property info, we know that this
5969         happened because the lookup failed, so we report an error 122 for
5970         protection level violation.
5971
5972         We also silently return if setter and getter are null in the
5973         resolve functions, this condition only happens if we have flagged
5974         the error before.  This is the other half of the problem. 
5975
5976         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
5977         not have accessibility information, that is why we were returning
5978         true in the filter function in typemanager.cs.
5979
5980         To properly report 122 (property is inaccessible because of its
5981         protection level) correctly, we report this error in ResolveAccess
5982         by failing if both the setter and the getter are lacking (ie, the
5983         lookup failed). 
5984
5985         DoResolve and DoLResolve have been modified to check for both
5986         setter/getter being null and returning silently, the reason being
5987         that I did not want to put the knowledge about this error in upper
5988         layers, like:
5989
5990         int old = Report.Errors;
5991         x = new PropertyExpr (...);
5992         if (old != Report.Errors)
5993                 return null;
5994         else
5995                 return x;
5996
5997         So the property expr is returned, but it is invalid, so the error
5998         will be flagged during the resolve process. 
5999
6000         * class.cs: Remove InheritablePropertySignatureCompare from the
6001         class, as we no longer depend on the property signature to compute
6002         whether it is possible to implement a method or not.
6003
6004         The reason is that calling PropertyInfo.GetGetMethod will return
6005         null (in .NET, in Mono it works, and we should change this), in
6006         cases where the Get Method does not exist in that particular
6007         class.
6008
6009         So this code:
6010
6011         class X { public virtual int A { get { return 1; } } }
6012         class Y : X { }
6013         class Z : Y { public override int A { get { return 2; } } }
6014
6015         Would fail in Z because the parent (Y) would not have the property
6016         defined.  So we avoid this completely now (because the alternative
6017         fix was ugly and slow), and we now depend exclusively on the
6018         method names.
6019
6020         (PropertyBase.CheckBase): Use a method-base mechanism to find our
6021         reference method, instead of using the property.
6022
6023         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
6024         routines are gone now.
6025
6026         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
6027         names, they were incorrectly named.
6028
6029         * cs-tokenizer.cs: Return are more gentle token on failure. 
6030
6031         * pending.cs (PendingImplementation.InterfaceMethod): This routine
6032         had an out-of-sync index variable, which caused it to remove from
6033         the list of pending methods the wrong method sometimes.
6034
6035 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
6036
6037         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
6038         CanWrite, because those refer to this particular instance of the
6039         property, and do not take into account the fact that we can
6040         override single members of a property.
6041
6042         Constructor requires an EmitContext.  The resolution process does
6043         not happen here, but we need to compute the accessors before,
6044         because the resolution does not always happen for properties.
6045
6046         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
6047         subclass, before we did not update this flag, but we did update
6048         bindingflags. 
6049
6050         (GetAccessors): Drop this routine, as it did not work in the
6051         presence of partially overwritten set/get methods. 
6052
6053         Notice that this broke the cs1540 detection, but that will require
6054         more thinking. 
6055
6056 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6057
6058         * class.cs:
6059         * codegen.cs:
6060         * driver.cs: issue a warning instead of an error if we don't support
6061         debugging for the platform. Also ignore a couple of errors that may
6062         arise when trying to write the symbols. Undo my previous patch.
6063
6064 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6065
6066         * driver.cs: ignore /debug switch except for Unix platforms.
6067
6068 2002-10-23  Nick Drochak  <ndrochak@gol.com>
6069
6070         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
6071
6072 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
6073
6074         * driver.cs: Do not make mcs-debug conditional, so we do not break
6075         builds that use it.
6076
6077         * statement.cs (UsageVector.MergeChildren): I would like Martin to
6078         review this patch.  But basically after all the children variables
6079         have been merged, the value of "Breaks" was not being set to
6080         new_breaks for Switch blocks.  I think that it should be set after
6081         it has executed.  Currently I set this to the value of new_breaks,
6082         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
6083         conservative, but I do not understand this code very well.
6084
6085         I did not break anything in the build, so that is good ;-)
6086
6087         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
6088
6089 2002-10-20  Mark Crichton  <crichton@gimp.org>
6090
6091         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
6092
6093 2002-10-20  Nick Drochak  <ndrochak@gol.com>
6094
6095         * cfold.cs: Fixed compile blocker.
6096
6097 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
6098
6099         * driver.cs: I was chekcing the key, not the file.
6100
6101 2002-10-19  Ravi Pratap  <ravi@ximian.com>
6102
6103         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
6104         message that we were generating - we just need to silently return
6105         a null.
6106
6107 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
6108
6109         * class.cs (Event.Define): Change my previous commit, as this
6110         breaks the debugger.  This is a temporary hack, as it seems like
6111         the compiler is generating events incorrectly to begin with.
6112
6113         * expression.cs (Binary.ResolveOperator): Added support for 
6114         "U operator - (E x, E y)"
6115
6116         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
6117         y)".
6118
6119         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
6120         init-only variables, but this path did not take into account that
6121         there might be also instance readonly variables.  Correct this
6122         problem. 
6123
6124         This fixes bug 32253
6125
6126         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
6127         delegates as well.
6128
6129         * driver.cs: Change the extension for modules to `netmodule'
6130
6131         * cs-parser.jay: Improved slightly the location tracking for
6132         the debugger symbols.
6133
6134         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
6135         modifiers that were specified instead of the hardcoded value
6136         (FamAndAssem).  This was basically ignoring the static modifier,
6137         and others.  Fixes 32429.
6138
6139         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
6140         fixed a bug in the process (32476)
6141
6142         * expression.cs (ArrayAccess.EmitAssign): Patch from
6143         hwang_rob@yahoo.ca that fixes bug 31834.3
6144
6145 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
6146
6147         * driver.cs: Make the module extension .netmodule.
6148
6149 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
6150
6151         * driver.cs: Report an error if the resource file is not found
6152         instead of crashing.
6153
6154         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
6155         false, like Emit does.
6156
6157 2002-10-16  Nick Drochak  <ndrochak@gol.com>
6158
6159         * typemanager.cs: Remove unused private member.  Also reported mcs
6160         bug to report this as a warning like csc.
6161
6162 2002-10-15  Martin Baulig  <martin@gnome.org>
6163
6164         * statement.cs (Statement.Emit): Made this a virtual method; emits
6165         the line number info and calls DoEmit().
6166         (Statement.DoEmit): New protected abstract method, formerly knows
6167         as Statement.Emit().
6168
6169         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
6170
6171 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
6172
6173         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
6174         have fixed a remaining problem: not every AddXXXX was adding a
6175         fully qualified name.  
6176
6177         Now everyone registers a fully qualified name in the DeclSpace as
6178         being defined instead of the partial name.  
6179
6180         Downsides: we are slower than we need to be due to the excess
6181         copies and the names being registered this way.  
6182
6183         The reason for this is that we currently depend (on the corlib
6184         bootstrap for instance) that types are fully qualified, because
6185         we dump all the types in the namespace, and we should really have
6186         types inserted into the proper namespace, so we can only store the
6187         basenames in the defined_names array.
6188
6189 2002-10-10  Martin Baulig  <martin@gnome.org>
6190
6191         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
6192         from bug #31834, see the bug report for a testcase which is
6193         miscompiled.
6194
6195 2002-10-10  Martin Baulig  <martin@gnome.org>
6196
6197         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
6198         flow analysis code for this.
6199
6200         * statement.cs (Do, While, For): Tell the flow analysis code about
6201         infinite loops.
6202         (FlowBranching.UsageVector): Added support for infinite loops.
6203         (Block.Resolve): Moved the dead code elimination here and use flow
6204         analysis to do it.
6205
6206 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
6207
6208         * class.cs (Field.Define): Catch cycles on struct type
6209         definitions. 
6210
6211         * typemanager.cs (IsUnmanagedtype): Do not recursively check
6212         fields if the fields are static.  We only need to check instance
6213         fields. 
6214
6215         * expression.cs (As.DoResolve): Test for reference type.
6216
6217         * statement.cs (Using.ResolveExpression): Use
6218         ConvertImplicitRequired, not ConvertImplicit which reports an
6219         error on failture
6220         (Using.ResolveLocalVariableDecls): ditto.
6221
6222         * expression.cs (Binary.ResolveOperator): Report errors in a few
6223         places where we had to.
6224
6225         * typemanager.cs (IsUnmanagedtype): Finish implementation.
6226
6227 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
6228
6229         * expression.cs: Use StoreFromPtr instead of extracting the type
6230         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
6231
6232         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
6233         an enumeration value to a System.Enum, but System.Enum is not a
6234         value type, but an class type, so we need to box.
6235
6236         (Expression.ConvertExplicit): One codepath could return
6237         errors but not flag them.  Fix this.  Fixes #31853
6238
6239         * parameter.cs (Resolve): Do not allow void as a parameter type.
6240
6241 2002-10-06  Martin Baulig  <martin@gnome.org>
6242
6243         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
6244         if it's a class type and not a struct.  Fixes #31815.
6245
6246 2002-10-06  Martin Baulig  <martin@gnome.org>
6247
6248         * statement.cs: Reworked the flow analysis code a bit to make it
6249         usable for dead code elimination.
6250
6251 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6252
6253         * cs-parser.jay: allow empty source files. Fixes bug #31781.
6254
6255 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
6256
6257         * expression.cs (ComposedCast.DoResolveType): A quick workaround
6258         to fix the test 165, will investigate deeper.
6259
6260 2002-10-04  Martin Baulig  <martin@gnome.org>
6261
6262         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
6263         finally blocks actually work.
6264         (Try.Resolve): We don't need to create a sibling for `finally' if
6265         there is no finally block.
6266
6267 2002-10-04  Martin Baulig  <martin@gnome.org>
6268
6269         * class.cs (Constructor.Define): The default accessibility for a
6270         non-default constructor is private, not public.
6271
6272 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
6273
6274         * class.cs (Constructor): Make AllowedModifiers public, add
6275         EXTERN.
6276
6277         * cs-parser.jay: Perform the modifiers test here, as the
6278         constructor for the Constructor class usually receives a zero
6279         because of the way we create it (first we create, later we
6280         customize, and we were never checking the modifiers).
6281
6282         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
6283         is a version of LookupTypeReflection that includes the type-name
6284         cache.  This can be used as a fast path for functions that know
6285         the fully qualified name and are only calling into *.GetType() to
6286         obtain a composed type.
6287
6288         This is also used by TypeManager.LookupType during its type
6289         composition.
6290
6291         (LookupType): We now also track the real type name, as sometimes
6292         we can get a quey for the real type name from things like
6293         ComposedCast.  This fixes bug 31422.
6294
6295         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
6296         complete type fullname, it does not have to go through the type
6297         resolution system to obtain the composed version of the type (for
6298         obtaining arrays or pointers).
6299
6300         (Conditional.Emit): Use the EmitBoolExpression to
6301         generate nicer code, as requested by Paolo.
6302
6303         (ArrayCreation.CheckIndices): Use the patch from
6304         hwang_rob@yahoo.ca to validate the array initializers. 
6305
6306 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
6307
6308         * class.cs (ConstructorInitializer.Emit): simplify code by using
6309         Invocation.EmitCall, and at the same time, fix the bugs in calling
6310         parent constructors that took variable arguments. 
6311
6312         * ecore.cs (Expression.ConvertNumericExplicit,
6313         Expression.ImplicitNumericConversion): Remove the code that
6314         manually wrapped decimal (InternalTypeConstructor call is now gone
6315         as well).
6316
6317         * expression.cs (Cast.TryReduce): Also handle decimal types when
6318         trying to perform a constant fold on the type.
6319
6320         * typemanager.cs (IsUnmanagedtype): Partially implemented.
6321
6322         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
6323         that only turned off an error report, and did nothing else. 
6324
6325 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
6326
6327         * driver.cs: Handle and ignore /fullpaths
6328
6329 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
6330
6331         * expression.cs (Binary.ResolveOperator): Catch the case where
6332         DoNumericPromotions returns true, 
6333
6334         (Binary.DoNumericPromotions): Simplify the code, and the tests.
6335
6336 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
6337
6338         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
6339         report error 70.
6340
6341 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
6342
6343         * ecore.cs (ConvertNumericExplicit): It is not enough that the
6344         conversion exists, but it is also required that the conversion be
6345         performed.  This manifested in "(Type64Enum) 2".  
6346
6347         * class.cs (TypeManager.AddMethod): The fix is not to change
6348         AddEnum, because that one was using a fully qualified name (every
6349         DeclSpace derivative does), but to change the AddMethod routine
6350         that was using an un-namespaced name.  This now correctly reports
6351         the duplicated name.
6352
6353         Revert patch until I can properly fix it.  The issue
6354         is that we have a shared Type space across all namespaces
6355         currently, which is wrong.
6356
6357         Options include making the Namespace a DeclSpace, and merge
6358         current_namespace/current_container in the parser.
6359
6360 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
6361
6362         * cs-parser.jay: Improve error reporting when we get a different
6363         kind of expression in local_variable_type and
6364         local_variable_pointer_type. 
6365
6366         Propagate this to avoid missleading errors being reported.
6367
6368         * ecore.cs (ImplicitReferenceConversion): treat
6369         TypeManager.value_type as a target just like object_type.   As
6370         code like this:
6371
6372         ValueType v = 1;
6373
6374         Is valid, and needs to result in the int 1 being boxed before it
6375         is assigned to the value type v.
6376
6377         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
6378         to validate the enumeration name.
6379
6380         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
6381         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
6382         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
6383
6384         * ecore.cs (TryImplicitIntConversion): When doing an
6385         implicit-enumeration-conversion, check if the type is 64-bits and
6386         perform a conversion before passing to EnumConstant.
6387
6388 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
6389
6390         * decl.cs (Error_AmbiguousTypeReference); New routine used to
6391         report ambiguous type references.  Unlike the MS version, we
6392         report what the ambiguity is.   Innovation at work ;-)
6393
6394         (DeclSpace.FindType): Require a location argument to
6395         display when we display an ambiguous error.
6396
6397         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
6398
6399         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
6400
6401         * expression.cs (EmitDynamicInitializers): Apply patch from
6402         hwang_rob@yahoo.ca that fixes the order in which we emit our
6403         initializers. 
6404
6405 2002-09-21  Martin Baulig  <martin@gnome.org>
6406
6407         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
6408         delegate takes no arguments.
6409
6410 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
6411
6412         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
6413         from integers.
6414
6415         * expression.cs: Extract the underlying type.
6416
6417         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
6418
6419         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
6420
6421 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
6422
6423         * class.cs (TypeContainer.DefineType): We can not use the nice
6424         PackingSize with the size set to 1 DefineType method, because it
6425         will not allow us to define the interfaces that the struct
6426         implements.
6427
6428         This completes the fixing of bug 27287
6429
6430         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
6431         means also structs.  This fixes part of the problem. 
6432         (Expresion.ImplicitReferenceConversionExists): ditto.
6433
6434         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
6435         error if there were no errors reported during the type lookup
6436         process, to avoid duplicates or redundant errors.  Without this
6437         you would get an ambiguous errors plus a type not found.  We have
6438         beaten the user enough with the first error.  
6439
6440         (DeclSparce.FindType): Emit a warning if we have an ambiguous
6441         reference. 
6442
6443         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
6444         during the resolution process, stop the lookup, this avoids
6445         repeated error reports (same error twice).
6446
6447         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
6448
6449         * typemanager.cs (LookupType): Redo the type lookup code to match
6450         the needs of System.Reflection.  
6451
6452         The issue is that System.Reflection requires references to nested
6453         types to begin with a "+" sign instead of a dot.  So toplevel
6454         types look like: "NameSpace.TopLevelClass", and nested ones look
6455         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
6456         levels. 
6457
6458 2002-09-19  Martin Baulig  <martin@gnome.org>
6459
6460         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
6461         says that a method always returns or always throws an exception,
6462         don't report the CS0161.
6463
6464         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
6465         set `Returns = new_returns'.
6466
6467 2002-09-19  Martin Baulig  <martin@gnome.org>
6468
6469         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
6470         to an enum constant, check for a CS0176.
6471
6472 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
6473
6474         * class.cs (TypeContainer.CheckPairedOperators): Now we check
6475         for operators that must be in pairs and report errors.
6476
6477         * ecore.cs (SimpleName.DoResolveType): During the initial type
6478         resolution process, when we define types recursively, we must
6479         check first for types in our current scope before we perform
6480         lookups in the enclosing scopes.
6481
6482         * expression.cs (MakeByteBlob): Handle Decimal blobs.
6483
6484         (Invocation.VerifyArgumentsCompat): Call
6485         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
6486         I thought we were supposed to always call this, but there are a
6487         few places in the code where we dont do it.
6488
6489 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
6490
6491         * driver.cs: Add support in -linkres and -resource to specify the
6492         name of the identifier.
6493
6494 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6495
6496         * ecore.cs (StandardConversionExists): Sync with the conversion
6497         code: allow anything-* to void* conversions.
6498
6499         (FindMostSpecificSource): Use an Expression argument
6500         instead of a Type, because we might be handed over a Literal which
6501         gets a few more implicit conversions that plain types do not.  So
6502         this information was being lost.
6503
6504         Also, we drop the temporary type-holder expression when not
6505         required.
6506
6507 2002-09-17  Martin Baulig  <martin@gnome.org>
6508
6509         * class.cs (PropertyBase.CheckBase): Don't check the base class if
6510         this is an explicit interface implementation.
6511
6512 2002-09-17  Martin Baulig  <martin@gnome.org>
6513
6514         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
6515         different `IndexerName' attributes.
6516
6517         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
6518         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
6519         virtual CommonResolve().
6520
6521 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
6522
6523         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
6524         and convert that to the UnderlyingType.
6525
6526         * statement.cs (Foreach.Resolve): Indexers are just like variables
6527         or PropertyAccesses.
6528
6529         * cs-tokenizer.cs (consume_string): Track line numbers and columns
6530         inside quoted strings, we were not doing this before.
6531
6532 2002-09-16  Martin Baulig  <martin@gnome.org>
6533
6534         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
6535         resolve it.  This is needed for the definite assignment check of the
6536         instance expression, fixes bug #29846.
6537         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
6538
6539 2002-09-16  Nick Drochak  <ndrochak@gol.com>
6540
6541         * parameter.cs: Fix compile error.  Cannot reference static member
6542         from an instance object.  Is this an mcs bug?
6543
6544 2002-09-14  Martin Baulig  <martin@gnome.org>
6545
6546         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
6547         multiple times.  Fixes bug #30295, added test-166.cs.
6548
6549 2002-09-14  Martin Baulig  <martin@gnome.org>
6550
6551         * statement.cs (Block.Emit): Don't emit unreachable code.
6552         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
6553         `break' statements.
6554         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
6555
6556 2002-09-14  Martin Baulig  <martin@gnome.org>
6557
6558         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
6559         is set.
6560
6561 2002-09-14  Martin Baulig  <martin@gnome.org>
6562
6563         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
6564         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
6565         be false on the ms runtime.
6566
6567 2002-09-13  Martin Baulig  <martin@gnome.org>
6568
6569         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
6570         the CS0038 error message.
6571
6572 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
6573
6574         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
6575         constant inside, return it.
6576
6577 2002-09-12  Martin Baulig  <martin@gnome.org>
6578
6579         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
6580         implicit conversion can be done between enum types.
6581
6582         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
6583         check whether an implicit conversion to the current enum's UnderlyingType
6584         exists and report an error if not.
6585
6586         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
6587         without debugging support.
6588
6589         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
6590         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
6591
6592 2002-09-12  Martin Baulig  <martin@gnome.org>
6593
6594         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
6595
6596         * ecore.cs (IMemberExpr.DeclaringType): New property.
6597         (SimpleName.SimpleNameResolve): Check whether we're accessing a
6598         nonstatic member of an outer type (CS0038).
6599
6600 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
6601
6602         * driver.cs: Activate the using-error detector at warning level
6603         4 (at least for MS-compatible APIs).
6604
6605         * namespace.cs (VerifyUsing): Small buglett fix.
6606
6607         * pending.cs (PendingImplementation): pass the container pointer. 
6608
6609         * interface.cs (GetMethods): Allow for recursive definition.  Long
6610         term, I would like to move every type to support recursive
6611         definitions, not the current ordering mechanism that we have right
6612         now.
6613
6614         The situation is this: Attributes are handled before interfaces,
6615         so we can apply attributes to interfaces.  But some attributes
6616         implement interfaces, we will now handle the simple cases
6617         (recursive definitions will just get an error).  
6618
6619         * parameter.cs: Only invalidate types at the end if we fail to
6620         lookup all types.  
6621
6622 2002-09-09  Martin Baulig  <martin@gnome.org>
6623
6624         * ecore.cs (PropertyExpr.Emit): Also check for
6625         TypeManager.system_int_array_get_length so this'll also work when
6626         compiling corlib.  Fixes #30003.
6627
6628 2002-09-09  Martin Baulig  <martin@gnome.org>
6629
6630         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
6631         and throw an exception if we can't get the type's size.  Fixed #30040,
6632         added test-165.cs.
6633
6634 2002-09-09  Martin Baulig  <martin@gnome.org>
6635
6636         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
6637
6638         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
6639         context.  Fixes bug #30027.
6640
6641         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
6642         virtual functions.  Fixes bug #30043, added test-164.cs.
6643
6644 2002-09-08  Ravi Pratap  <ravi@ximian.com>
6645
6646         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
6647
6648 2002-09-08  Nick Drochak  <ndrochak@gol.com>
6649
6650         * driver.cs: Use an object to get the windows codepage since it's not a
6651         static property.
6652
6653 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
6654
6655         * statement.cs (For.Emit): for infinite loops (test == null)
6656         return whether there is a break inside, not always "true".
6657
6658         * namespace.cs (UsingEntry): New struct to hold the name of the
6659         using definition, the location where it is defined, and whether it
6660         has been used in a successful type lookup.
6661
6662         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
6663         strings.
6664
6665         * decl.cs: ditto.
6666
6667 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6668
6669         * attribute.cs : Fix incorrect code which relied on catching
6670         a NullReferenceException to detect a null being passed in
6671         where an object was expected.
6672
6673 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
6674
6675         * statement.cs (Try): flag the catch variable as assigned
6676
6677         * expression.cs (Cast): Simplified by using ResolveType instead of
6678         manually resolving.
6679
6680         * statement.cs (Catch): Fix bug by using ResolveType.
6681
6682 2002-09-06  Ravi Pratap  <ravi@ximian.com>
6683
6684         * expression.cs (BetterConversion): Special case for when we have
6685         a NullLiteral as the argument and we have to choose between string
6686         and object types - we choose string the way csc does.
6687
6688         * attribute.cs (Attribute.Resolve): Catch the
6689         NullReferenceException and report error #182 since the Mono
6690         runtime no more has the bug and having this exception raised means
6691         we tried to select a constructor which takes an object and is
6692         passed a null.
6693
6694 2002-09-05  Ravi Pratap  <ravi@ximian.com>
6695
6696         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
6697         message (1502, 1503) when we can't locate a method after overload
6698         resolution. This is much more informative and closes the bug
6699         Miguel reported.
6700
6701         * interface.cs (PopulateMethod): Return if there are no argument
6702         types. Fixes a NullReferenceException bug.
6703
6704         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
6705         expressions too. Previously we were checking only in one place for
6706         positional arguments leaving out named arguments.
6707
6708         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
6709         type to the enum type is not allowed. Remove code corresponding to
6710         that.
6711
6712         (ConvertNumericExplicit): Allow explicit conversions from
6713         the underlying type to enum type. This precisely follows the spec
6714         and closes a bug filed by Gonzalo.
6715
6716 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6717
6718         * compiler.csproj:
6719         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
6720
6721 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
6722
6723         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
6724         it was important that we stored the right value after the
6725         reduction in `converted'.
6726
6727 2002-09-04  Martin Baulig  <martin@gnome.org>
6728
6729         * location.cs (Location.SymbolDocument): Use full pathnames for the
6730         source files.
6731
6732 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
6733
6734         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
6735         of the expression resolve mechanism, because that will catch the
6736         SimpleName error failures.
6737
6738         (Conditional): If we can not resolve the
6739         expression, return, do not crash.
6740
6741 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6742
6743         * cs-tokenizer.cs:
6744         (location): display token name instead of its number.
6745
6746 2002-08-28  Martin Baulig  <martin@gnome.org>
6747
6748         * expression.cs (Binary.ResolveOperator): Don't silently return
6749         but return an error if an operator cannot be applied between two
6750         enum types.
6751
6752 2002-08-28  Martin Baulig  <martin@gnome.org>
6753
6754         * class.cs (Constructor.Define): Set the permission attributes
6755         correctly instead of making all constructors public.
6756
6757 2002-08-28  Martin Baulig  <martin@gnome.org>
6758
6759         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
6760         for private members before reporting a CS0103; if we find anything,
6761         it's a CS0122.
6762
6763 2002-08-28  Martin Baulig  <martin@gnome.org>
6764
6765         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
6766         to check whether `closure_start_type == closure_invocation_type',
6767         we also need to check whether `m.DeclaringType == closure_invocation_type'
6768         before bypassing the permission checks.  We might be accessing
6769         protected/private members from the base class.
6770         (TypeManager.RealMemberLookup): Only set private_ok if private
6771         members were requested via BindingFlags.NonPublic.
6772
6773         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
6774
6775         * expression.cs (MemberAccess.ResolveMemberAccess): Set
6776         MethodGroupExpr.IsExplicitImpl if appropriate.
6777         (Invocation.DoResolve): Don't report the CS0120 for explicit
6778         interface implementations.
6779
6780 2002-08-27  Martin Baulig  <martin@gnome.org>
6781
6782         * expression.cs (Invocation.DoResolve): If this is a static
6783         method and we don't have an InstanceExpression, we must report
6784         a CS0120.
6785
6786 2002-08-25  Martin Baulig  <martin@gnome.org>
6787
6788         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
6789         `==' between a valuetype and an object.
6790
6791 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
6792
6793         * ecore.cs (TypeExpr): Provide a ToString method.
6794
6795 2002-08-24  Martin Baulig  <martin@gnome.org>
6796
6797         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
6798         now called proggie.dbg and it's a binary file.
6799
6800 2002-08-23  Martin Baulig  <martin@gnome.org>
6801
6802         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
6803
6804 2002-08-23  Martin Baulig  <martin@gnome.org>
6805
6806         * struct.cs (MyStructInfo.ctor): Make this work with empty
6807         structs; it's not allowed to use foreach() on null.
6808
6809 2002-08-23  Martin Baulig  <martin@gnome.org>
6810
6811         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
6812         writer the full pathname of the generated assembly.
6813
6814 2002-08-23  Martin Baulig  <martin@gnome.org>
6815
6816         * statements.cs (FlowBranching.UsageVector.MergeChildren):
6817         A `finally' block never returns or breaks; improved handling of
6818         unreachable code.
6819
6820 2002-08-23  Martin Baulig  <martin@gnome.org>
6821
6822         * statement.cs (Throw.Resolve): Allow `throw null'.
6823
6824 2002-08-23  Martin Baulig  <martin@gnome.org>
6825
6826         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
6827         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
6828         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
6829         MemberLookup would return a wrong event if this is an explicit
6830         interface implementation and the class has an event with the same
6831         name.
6832
6833 2002-08-23  Martin Baulig  <martin@gnome.org>
6834
6835         * statement.cs (Block.AddChildVariableNames): New public method.
6836         (Block.AddChildVariableName): Likewise.
6837         (Block.IsVariableNameUsedInChildBlock): Likewise.
6838         (Block.AddVariable): Check whether a variable name has already
6839         been used in a child block.
6840
6841         * cs-parser.jay (declare_local_variables): Mark all variable names
6842         from the current block as being used in a child block in the
6843         implicit block.
6844
6845 2002-08-23  Martin Baulig  <martin@gnome.org>
6846
6847         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
6848         find the symbol writer.
6849
6850         * driver.cs: csc also allows the arguments to /define being
6851         separated by commas, not only by semicolons.
6852
6853 2002-08-23  Martin Baulig  <martin@gnome.org>
6854
6855         * interface.cs (Interface.GetMembers): Added static check for events.
6856
6857 2002-08-15  Martin Baulig  <martin@gnome.org>
6858
6859         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
6860         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
6861
6862         * ecore.cs (Expression.MemberLookup): Added documentation and explained
6863         why the MethodData.EmitDestructor() change was necessary.
6864
6865 2002-08-20  Martin Baulig  <martin@gnome.org>
6866
6867         * class.cs (TypeContainer.FindMembers): Added static check for events.
6868
6869         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
6870
6871         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
6872         use Type.GetEvents(), not Type.FindMembers().
6873
6874 2002-08-20  Martin Baulig  <martin@gnome.org>
6875
6876         * decl.cs (MemberCache): Added a special method cache which will
6877         be used for method-only searched.  This ensures that a method
6878         search will return a MethodInfo with the correct ReflectedType for
6879         inherited methods.      
6880
6881 2002-08-20  Martin Baulig  <martin@gnome.org>
6882
6883         * decl.cs (DeclSpace.FindMembers): Made this public.
6884
6885 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6886
6887         * delegate.cs: fixed build on windows.
6888         [FIXME:  Filed as bug #29150: MCS must report these errors.]
6889
6890 2002-08-19  Ravi Pratap  <ravi@ximian.com>
6891
6892         * ecore.cs (StandardConversionExists): Return a false
6893         if we are trying to convert the void type to anything else
6894         since that is not allowed.
6895
6896         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
6897         we flag error 70 in the event an event is trying to be accessed
6898         directly from outside the declaring type.
6899
6900 2002-08-20  Martin Baulig  <martin@gnome.org>
6901
6902         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
6903         MemberCache from typemanager.cs to decl.cs.
6904
6905 2002-08-19  Martin Baulig  <martin@gnome.org>
6906
6907         * class.cs (TypeContainer): Implement IMemberContainer.
6908         (TypeContainer.DefineMembers): Create the MemberCache.
6909         (TypeContainer.FindMembers): Do better BindingFlags checking; only
6910         return public members if BindingFlags.Public was given, check
6911         whether members are static.
6912
6913 2002-08-16  Martin Baulig  <martin@gnome.org>
6914
6915         * decl.cs (DeclSpace.Define): Splitted this in Define and
6916         DefineMembers.  DefineMembers is called first and initializes the
6917         MemberCache.
6918
6919         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
6920         DefineMembers() on all our DeclSpaces.
6921
6922         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
6923         but call DefineMembers() on all nested interfaces.  We call their
6924         Define() in our new Define() function.
6925
6926         * interface.cs (Interface): Implement IMemberContainer.
6927         (Interface.Define): Moved all code except the attribute stuf to
6928         DefineMembers().
6929         (Interface.DefineMembers): Initialize the member cache.
6930
6931         * typemanager.cs (IMemberFinder): Removed this interface, we don't
6932         need this anymore since we can use MemberCache.FindMembers directly.
6933
6934 2002-08-19  Martin Baulig  <martin@gnome.org>
6935
6936         * typemanager.cs (MemberCache): When creating the cache for an
6937         interface type, add all inherited members.
6938         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
6939         to `out bool used_cache' and documented it.
6940         (TypeManager.MemberLookup): If we already used the cache in the first
6941         iteration, we don't need to do the interfaces check.
6942
6943 2002-08-19  Martin Baulig  <martin@gnome.org>
6944
6945         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
6946         here from IMemberFinder and don't implement this interface anymore.
6947         (DeclSpace.MemberCache): Moved here from IMemberFinder.
6948
6949         * typemanager.cs (IMemberFinder): This interface is now only used by
6950         classes which actually support the member cache.
6951         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
6952         since we only put DeclSpaces into this Hashtable.
6953         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
6954         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
6955
6956 2002-08-16  Martin Baulig  <martin@gnome.org>
6957
6958         * typemanager.cs (ICachingMemberFinder): Removed.
6959         (IMemberFinder.MemberCache): New property.
6960         (TypeManager.FindMembers): Merged this with RealFindMembers().
6961         This function will never be called from TypeManager.MemberLookup()
6962         so we can't use the cache here, just the IMemberFinder.
6963         (TypeManager.MemberLookup_FindMembers): Check whether the
6964         IMemberFinder has a MemberCache and call the cache's FindMembers
6965         function.
6966         (MemberCache): Rewrote larger parts of this yet another time and
6967         cleaned it up a bit.
6968
6969 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
6970
6971         * driver.cs (LoadArgs): Support quoting.
6972
6973         (Usage): Show the CSC-like command line arguments.
6974
6975         Improved a few error messages.
6976
6977 2002-08-15  Martin Baulig  <martin@gnome.org>
6978
6979         * typemanager.cs (IMemberContainer.Type): New property.
6980         (IMemberContainer.IsInterface): New property.
6981
6982         The following changes are conditional to BROKEN_RUNTIME, which is
6983         defined at the top of the file.
6984
6985         * typemanager.cs (MemberCache.MemberCache): Don't add the base
6986         class'es members, but add all members from TypeHandle.ObjectType
6987         if we're an interface.
6988         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
6989         is the current type.
6990         (MemberCache.CacheEntry.Container): Removed this field.
6991         (TypeHandle.GetMembers): Include inherited members.
6992
6993 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6994
6995         * typemanager.cs: fixed compilation and added a comment on a field that
6996         is never used.
6997
6998 2002-08-15  Martin Baulig  <martin@gnome.org>
6999
7000         * class.cs (ConstructorInitializer.Resolve): In the
7001         Expression.MemberLookup call, use the queried_type as
7002         invocation_type.
7003
7004         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
7005         declared' attribute, it's always true.
7006         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
7007         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
7008         temporary wrapper for FindMembers which tells MemberLookup whether
7009         members from the base classes are included in the return value.
7010         This will go away soon.
7011         (TypeManager.MemberLookup): Use this temporary hack here; once the
7012         new MemberCache is completed, we don't need to do the DeclaredOnly
7013         looping here anymore since the MemberCache will take care of this.
7014         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
7015         (MemberCache): When creating the MemberCache for a class, get
7016         members from the current class and all its base classes.
7017         (MemberCache.CacheEntry.Container): New field.  This is a
7018         temporary hack until the Mono runtime is fixed to distinguish
7019         between ReflectedType and DeclaringType.  It allows us to use MCS
7020         with both the MS runtime and the unfixed Mono runtime without
7021         problems and without accecting performance.
7022         (MemberCache.SearchMembers): The DeclaredOnly looping from
7023         TypeManager.MemberLookup is now done here.      
7024
7025 2002-08-14  Martin Baulig  <martin@gnome.org>
7026
7027         * statement.cs (MyStructInfo.MyStructInfo): Don't call
7028         Type.GetFields on dynamic types but get the fields from the
7029         corresponding TypeContainer.
7030         (MyStructInfo.GetStructInfo): Added check for enum types.
7031
7032         * typemanager.cs (MemberList.IsSynchronized): Implemented.
7033         (MemberList.SyncRoot): Implemented.
7034         (TypeManager.FilterWithClosure): No need to check permissions if
7035         closure_start_type == closure_invocation_type, don't crash if
7036         closure_invocation_type is null.
7037
7038 2002-08-13  Martin Baulig  <martin@gnome.org>
7039
7040         Rewrote TypeContainer.FindMembers to use a member cache.  This
7041         gives us a speed increase of about 35% for the self-hosting MCS
7042         build and of about 15-20% for the class libs (both on GNU/Linux).
7043
7044         * report.cs (Timer): New class to get enhanced profiling.  This
7045         whole class is "TIMER" conditional since it remarkably slows down
7046         compilation speed.
7047
7048         * class.cs (MemberList): New class.  This is an IList wrapper
7049         which we're now using instead of passing MemberInfo[]'s around to
7050         avoid copying this array unnecessarily.
7051         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
7052         (ICachingMemberFinder, IMemberContainer): New interface.
7053         (TypeManager.FilterWithClosure): If `criteria' is null, the name
7054         has already been checked, otherwise use it for the name comparision.
7055         (TypeManager.FindMembers): Renamed to RealMemberFinder and
7056         provided wrapper which tries to use ICachingMemberFinder.FindMembers
7057         if possible.  Returns a MemberList, not a MemberInfo [].
7058         (TypeHandle): New class, implements IMemberContainer.  We create
7059         one instance of this class per type, it contains a MemberCache
7060         which is used to do the member lookups.
7061         (MemberCache): New class.  Each instance of this class contains
7062         all members of a type and a name-based hash table.
7063         (MemberCache.FindMembers): This is our new member lookup
7064         function.  First, it looks up all members of the requested name in
7065         the hash table.  Then, it walks this list and sorts out all
7066         applicable members and returns them.
7067
7068 2002-08-13  Martin Baulig  <martin@gnome.org>
7069
7070         In addition to a nice code cleanup, this gives us a performance
7071         increase of about 1.4% on GNU/Linux - not much, but it's already
7072         half a second for the self-hosting MCS compilation.
7073
7074         * typemanager.cs (IMemberFinder): New interface.  It is used by
7075         TypeManager.FindMembers to call FindMembers on a TypeContainer,
7076         Enum, Delegate or Interface.
7077         (TypeManager.finder_to_member_finder): New PtrHashtable.
7078         (TypeManager.finder_to_container): Removed.
7079         (TypeManager.finder_to_delegate): Removed.
7080         (TypeManager.finder_to_interface): Removed.
7081         (TypeManager.finder_to_enum): Removed.
7082
7083         * interface.cs (Interface): Implement IMemberFinder.
7084
7085         * delegate.cs (Delegate): Implement IMemberFinder.
7086
7087         * enum.cs (Enum): Implement IMemberFinder.
7088
7089         * class.cs (TypeContainer): Implement IMemberFinder.
7090
7091 2002-08-12  Martin Baulig  <martin@gnome.org>
7092
7093         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
7094
7095 2002-08-12  Martin Baulig  <martin@gnome.org>
7096
7097         * ecore.cs (ITypeExpression): New interface for expressions which
7098         resolve to a type.
7099         (TypeExpression): Renamed to TypeLookupExpression.
7100         (Expression.DoResolve): If we're doing a types-only lookup, the
7101         expression must implement the ITypeExpression interface and we
7102         call DoResolveType() on it.
7103         (SimpleName): Implement the new ITypeExpression interface.
7104         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
7105         hack, the situation that we're only looking up types can't happen
7106         anymore when this method is called.  Moved the type lookup code to
7107         DoResolveType() and call it.
7108         (SimpleName.DoResolveType): This ITypeExpression interface method
7109         is now doing the types-only lookup.
7110         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
7111         (ResolveFlags): Added MaskExprClass.
7112
7113         * expression.cs (MemberAccess): Implement the ITypeExpression
7114         interface.
7115         (MemberAccess.DoResolve): Added support for a types-only lookup
7116         when we're called via ITypeExpression.DoResolveType().
7117         (ComposedCast): Implement the ITypeExpression interface.
7118
7119         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
7120         Expression.Resolve() with ResolveFlags.Type instead.
7121
7122 2002-08-12  Martin Baulig  <martin@gnome.org>
7123
7124         * interface.cs (Interface.Define): Apply attributes.
7125
7126         * attribute.cs (Attribute.ApplyAttributes): Added support for
7127         interface attributes.
7128
7129 2002-08-11  Martin Baulig  <martin@gnome.org>
7130
7131         * statement.cs (Block.Emit): Only check the "this" variable if we
7132         do not always throw an exception.
7133
7134         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
7135         whether the property has a set accessor.
7136
7137 2002-08-11  Martin Baulig  <martin@gnome.org>
7138
7139         Added control flow analysis support for structs.
7140
7141         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
7142         with control flow analysis turned off.
7143         (IVariable): New interface.
7144         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
7145         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
7146         (FieldExpr.DoResolve): Resolve the instance expression with flow
7147         analysis turned off and do the definite assignment check after the
7148         resolving when we know what the expression will resolve to.
7149
7150         * expression.cs (LocalVariableReference, ParameterReference):
7151         Implement the new IVariable interface, only call the flow analysis
7152         code if ec.DoFlowAnalysis is true.
7153         (This): Added constructor which takes a Block argument.  Implement
7154         the new IVariable interface.
7155         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
7156         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
7157         This does the definite assignment checks for struct members.
7158
7159         * class.cs (Constructor.Emit): If this is a non-static `struct'
7160         constructor which doesn't have any initializer, call
7161         Block.AddThisVariable() to tell the flow analysis code that all
7162         struct elements must be initialized before control returns from
7163         the constructor.
7164
7165         * statement.cs (MyStructInfo): New public class.
7166         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
7167         argument to this indexer.  If non-zero, check an individual struct
7168         member, not the whole struct.
7169         (FlowBranching.CheckOutParameters): Check struct members.
7170         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
7171         overloaded versions of these methods which take an additional
7172         `int field_idx' argument to check struct members.
7173         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
7174         overloaded versions of these methods which take an additional
7175         `string field_name' argument to check struct member.s
7176         (VariableInfo): Implement the IVariable interface.
7177         (VariableInfo.StructInfo): New public property.  Returns the
7178         MyStructInfo instance of the variable if it's a struct or null.
7179         (Block.AddThisVariable): New public method.  This is called from
7180         Constructor.Emit() for non-static `struct' constructor which do
7181         not have any initializer.  It creates a special variable for the
7182         "this" instance variable which will be checked by the flow
7183         analysis code to ensure that all of the struct's fields are
7184         initialized before control returns from the constructor.
7185         (UsageVector): Added support for struct members.  If a
7186         variable/parameter is a struct with N members, we reserve a slot
7187         in the usage vector for each member.  A struct is considered fully
7188         initialized if either the struct itself (slot 0) or all its
7189         members are initialized.
7190
7191 2002-08-08  Martin Baulig  <martin@gnome.org>
7192
7193         * driver.cs (Driver.MainDriver): Only report an error CS5001
7194         if there were no compilation errors.
7195
7196         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
7197         `UnsafeContext' property to determine whether the parent is in
7198         unsafe context rather than checking the parent's ModFlags:
7199         classes nested in an unsafe class are unsafe as well.
7200
7201 2002-08-08  Martin Baulig  <martin@gnome.org>
7202
7203         * statement.cs (UsageVector.MergeChildren): Distinguish between
7204         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
7205         we return.  Added test17() and test18() to test-154.cs.
7206
7207 2002-08-08  Martin Baulig  <martin@gnome.org>
7208
7209         * typemanager.cs (TypeManager.FilterWithClosure): If we have
7210         Family access, make sure the invoking type isn't a subclass of the
7211         queried type (that'd be a CS1540).
7212
7213         * ecore.cs (Expression.MemberLookup): Added overloaded version of
7214         this method which takes an additional `Type invocation_type'.
7215
7216         * expression.cs (BaseAccess.DoResolve): Use the base type as
7217         invocation and query type.
7218         (MemberAccess.DoResolve): If the lookup failed and we're about to
7219         report a CS0122, try a lookup with the ec.ContainerType - if this
7220         succeeds, we must report a CS1540.
7221
7222 2002-08-08  Martin Baulig  <martin@gnome.org>
7223
7224         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
7225         (MethodGroupExpr): Implement the IMemberExpr interface.
7226
7227         * expression (MemberAccess.ResolveMemberAccess): No need to have
7228         any special code for MethodGroupExprs anymore, they're now
7229         IMemberExprs.   
7230
7231 2002-08-08  Martin Baulig  <martin@gnome.org>
7232
7233         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
7234         Family, FamANDAssem and FamORAssem permissions.
7235         (TypeManager.IsSubclassOrNestedChildOf): New public method.
7236
7237 2002-08-08  Martin Baulig  <martin@gnome.org>
7238
7239         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
7240         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
7241         or loop block.
7242
7243 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
7244
7245         * driver.cs: implemented /resource option to embed managed resources.
7246
7247 2002-08-07  Martin Baulig  <martin@gnome.org>
7248
7249         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
7250         (FieldBase.HasFieldInitializer): New public property.
7251         (FieldBase.GetInitializerExpression): New public method.  Resolves and
7252         returns the field initializer and makes sure it is only resolved once.
7253         (TypeContainer.EmitFieldInitializers): Call
7254         FieldBase.GetInitializerExpression to get the initializer, this ensures
7255         that it isn't resolved multiple times.
7256
7257         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
7258         the resolving process (SimpleName/MemberLookup) that we're currently
7259         emitting a field initializer (which must not access any instance members,
7260         this is an error CS0236).
7261
7262         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
7263         argument, if the `IsFieldInitializer' flag is set, we must report and
7264         error CS0236 and not an error CS0120.   
7265
7266 2002-08-07  Martin Baulig  <martin@gnome.org>
7267
7268         * ecore.cs (IMemberExpr): New public interface.
7269         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
7270         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
7271         if the expression is an IMemberExpr.
7272
7273         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
7274         to be null, implicitly default to `this' if we're non-static in
7275         this case.  Simplified the code a lot by using the new IMemberExpr
7276         interface.  Also fixed bug #28176 here.
7277
7278 2002-08-06  Martin Baulig  <martin@gnome.org>
7279
7280         * cs-parser.jay (SimpleLookup): Removed.  We need to create
7281         ParameterReferences during semantic analysis so that we can do a
7282         type-only search when resolving Cast, TypeOf and SizeOf.
7283         (block): Pass the `current_local_parameters' to the Block's
7284         constructor.
7285
7286         * class.cs (ConstructorInitializer): Added `Parameters parameters'
7287         argument to the constructor.
7288         (ConstructorInitializer.Resolve): Create a temporary implicit
7289         block with the parameters.
7290
7291         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
7292         references here if we aren't doing a type-only search.
7293
7294         * statement.cs (Block): Added constructor which takes a
7295         `Parameters parameters' argument.
7296         (Block.Parameters): New public property.
7297
7298         * support.cs (InternalParameters.Parameters): Renamed `parameters'
7299         to `Parameters' and made it public readonly.
7300
7301 2002-08-06  Martin Baulig  <martin@gnome.org>
7302
7303         * ecore.cs (Expression.Warning): Made this public as well.
7304
7305         * report.cs (Report.Debug): Print the contents of collections.
7306
7307 2002-08-06  Martin Baulig  <martin@gnome.org>
7308
7309         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
7310         used to tell Resolve() which kinds of expressions it may return.
7311         (Expression.Resolve): Added overloaded version of this method which
7312         takes a `ResolveFlags flags' argument.  This can be used to tell
7313         Resolve() which kinds of expressions it may return.  Reports a
7314         CS0118 on error.
7315         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
7316         ResolveFlags.SimpleName.
7317         (Expression.Error118): Added overloaded version of this method which
7318         takes a `ResolveFlags flags' argument.  It uses the flags to determine
7319         which kinds of expressions are allowed.
7320
7321         * expression.cs (Argument.ResolveMethodGroup): New public method.
7322         Resolves an argument, but allows a MethodGroup to be returned.
7323         This is used when invoking a delegate.
7324
7325         * TODO: Updated a bit.
7326
7327 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7328
7329         Fixed compilation with csc.
7330
7331         * ecore.cs: Expression.Error made public. Is this correct? Should
7332         Warning be made public too?
7333
7334         * expression.cs: use ea.Location instead of ea.loc.
7335         [FIXME:  Filed as bug #28607: MCS must report these errors.]
7336
7337 2002-08-06  Martin Baulig  <martin@gnome.org>
7338
7339         * ecore.cs (Expression.loc): Moved the location here instead of
7340         duplicating it in all derived classes.
7341         (Expression.Location): New public property.
7342         (Expression.Error, Expression.Warning): Made them non-static and
7343         removed the location argument.
7344         (Expression.Warning): Added overloaded version which takes an
7345         `int level' argument.
7346         (Expression.Error118): Make this non-static and removed the
7347         expression and location arguments.
7348         (TypeExpr): Added location argument to the constructor.
7349
7350         * expression.cs (StaticCallExpr): Added location argument to
7351         the constructor.
7352         (Indirection, PointerArithmetic): Likewise.
7353         (CheckedExpr, UnCheckedExpr): Likewise.
7354         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
7355         (StringPtr): Likewise.
7356
7357
7358 2002-08-05  Martin Baulig  <martin@gnome.org>
7359
7360         * expression.cs (BaseAccess.DoResolve): Actually report errors.
7361
7362         * assign.cs (Assign.DoResolve): Check whether the source
7363         expression is a value or variable.
7364
7365         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
7366         while resolving the corresponding blocks.
7367
7368         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
7369         an error, don't silently return null.
7370
7371         * statement.cs (Block.AddVariable): Do the error reporting here
7372         and distinguish between CS0128 and CS0136.
7373         (Block.DoResolve): Report all unused labels (warning CS0164).
7374         (LabeledStatement): Pass the location to the constructor.
7375         (LabeledStatement.HasBeenReferenced): New property.
7376         (LabeledStatement.Resolve): Set it to true here.
7377
7378         * statement.cs (Return.Emit): Return success even after reporting
7379         a type mismatch error (CS0126 or CS0127), this is what csc does and
7380         it avoids confusing the users with any consecutive errors.
7381
7382 2002-08-05  Martin Baulig  <martin@gnome.org>
7383
7384         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
7385
7386         * const.cs (Const.LookupConstantValue): Catch circular definitions.
7387
7388         * expression.cs (MemberAccess.DoResolve): Silently return if an
7389         error has already been reported.
7390
7391         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
7392         error has already been reported.
7393
7394 2002-08-05  Martin Baulig  <martin@gnome.org>
7395
7396         * statement.cs (UsageVector): Only initialize the `parameters'
7397         vector if we actually have any "out" parameters.
7398
7399 2002-08-05  Martin Baulig  <martin@gnome.org>
7400
7401         * expression.cs (Binary.ResolveOperator): When combining delegates,
7402         they must have the same type.
7403
7404 2002-08-05  Martin Baulig  <martin@gnome.org>
7405
7406         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
7407         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
7408         work with the ms runtime and we also don't need it: if we're a
7409         PropertyBuilder and not in the `indexer_arguments' hash, then we
7410         are a property and not an indexer.
7411
7412         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
7413         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
7414         since the latter one doesn't work with the ms runtime.
7415
7416 2002-08-03  Martin Baulig  <martin@gnome.org>
7417
7418         Fixed bugs #27998 and #22735.
7419
7420         * class.cs (Method.IsOperator): New public field.
7421         (Method.CheckBase): Report CS0111 if there's already a method
7422         with the same parameters in the current class.  Report CS0508 when
7423         attempting to change the return type of an inherited method.
7424         (MethodData.Emit): Report CS0179 if a method doesn't have a body
7425         and it's not marked abstract or extern.
7426         (PropertyBase): New abstract base class for Property and Indexer.
7427         (PropertyBase.CheckBase): Moved here from Property and made it work
7428         for indexers.
7429         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
7430         the same so we can reuse it there.
7431         (Property, Indexer): Derive from PropertyBase.
7432         (MethodSignature.inheritable_property_signature_filter): New delegate
7433         to find properties and indexers.
7434
7435         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
7436         argument and improved error reporting.
7437
7438         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
7439         EmptyReadOnlyParameters and made it a property.
7440
7441         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
7442         version of this method which takes a `PropertyInfo indexer'.
7443         (TypeManager.RegisterIndexer): New method.
7444
7445         * class.cs: Added myself as author of this file :-)
7446
7447 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7448
7449         * class.cs: fixed compilation on windoze.
7450
7451 2002-08-03  Martin Baulig  <martin@gnome.org>
7452
7453         * interface.cs (Interface.GetInterfaceBases): Check whether all
7454         base interfaces are at least as accessible than the current one.
7455
7456         * class.cs (TypeContainer.GetClassBases): Check whether base types
7457         are at least as accessible than the current type.
7458         (TypeContainer.AsAccessible): Implemented and made non-static.
7459         (MemberBase.CheckParameters): Report errors if the accessibility
7460         checks fail.
7461
7462         * delegate.cs (Delegate.Delegate): The default visibility is
7463         internal for top-level types and private for nested types.
7464         (Delegate.Define): Report errors if the accessibility checks fail.
7465
7466         * enum.cs (Enum.Enum): The default visibility is internal for
7467         top-level types and private for nested types.
7468         (Enum.DefineType): Compute the correct visibility.
7469
7470         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
7471         function which takes a `bool is_toplevel' instead of a TypeContainer.
7472
7473         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
7474         builtin type.
7475
7476 2002-08-02  Martin Baulig  <martin@gnome.org>
7477
7478         * expression.cs (LocalVariableReferenc): Added constructor which
7479         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
7480         (LocalVariableReference.IsReadOnly): New property.
7481         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
7482         variable is readonly, use our own readonly flag to do this; you can
7483         use the new constructor to get a writable reference to a read-only
7484         variable.
7485
7486         * cs-parser.jay (foreach_statement, using_statement): Get a writable
7487         reference to the local variable.
7488
7489 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
7490
7491         * rootcontext.cs (ResolveCore): Also include System.Exception
7492
7493         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
7494         we reach an EmptyStatement.
7495
7496         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
7497         is also fine.
7498
7499         * expression.cs (Binary.ResolveOperator): Check error result in
7500         two places.
7501
7502         use brtrue/brfalse directly and avoid compares to null.
7503
7504 2002-08-02  Martin Baulig  <martin@gnome.org>
7505
7506         * class.cs (TypeContainer.Define): Define all nested interfaces here.
7507         Fixes bug #28407, added test-155.cs.
7508
7509 2002-08-01  Martin Baulig  <martin@gnome.org>
7510
7511         * class.cs (Event.EmitDefaultMethod): Make this work with static
7512         events.  Fixes #28311, added verify-3.cs.
7513
7514 2002-08-01  Martin Baulig  <martin@gnome.org>
7515
7516         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
7517         `is_disposable' fields.
7518         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
7519         `hm.is_disposable' if we're using the collection pattern.
7520         (Foreach.EmitCollectionForeach): Use the correct type for the
7521         enumerator's local variable, only emit the try/finally block if
7522         necessary (fixes #27713).
7523
7524 2002-08-01  Martin Baulig  <martin@gnome.org>
7525
7526         * ecore.cs (Expression.report118): Renamed to Error118 and made
7527         it public static.
7528
7529         * statement.cs (Throw.Resolve): Check whether the expression is of
7530         the correct type (CS0118) and whether the type derives from
7531         System.Exception (CS0155).
7532         (Catch.Resolve): New method.  Do the type lookup here and check
7533         whether it derives from System.Exception (CS0155).
7534         (Catch.CatchType, Catch.IsGeneral): New public properties.
7535
7536         * typemanager.cs (TypeManager.exception_type): Added.
7537
7538 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
7539
7540         * driver.cs: Updated About function.
7541
7542 2002-07-31  Martin Baulig  <martin@gnome.org>
7543
7544         Implemented Control Flow Analysis.
7545
7546         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
7547         (EmitContext.CurrentBranching): Added.
7548         (EmitContext.StartFlowBranching): Added.
7549         (EmitContext.EndFlowBranching): Added.
7550         (EmitContext.KillFlowBranching): Added.
7551         (EmitContext.IsVariableAssigned): Added.
7552         (EmitContext.SetVariableAssigned): Added.
7553         (EmitContext.IsParameterAssigned): Added.
7554         (EmitContext.SetParameterAssigned): Added.
7555         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
7556         Added control flow analysis stuff here.
7557
7558         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
7559         resolve the expression as lvalue.
7560         (LocalVariableReference.DoResolve): Check whether the variable has
7561         already been assigned.
7562         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
7563         the parameter as assigned here.
7564         (ParameterReference.DoResolve): Check whether the parameter has already
7565         been assigned.
7566         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
7567         expression as lvalue.
7568
7569         * statement.cs (FlowBranching): New class for the flow analysis code.
7570         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
7571         (LabeledStatement.IsDefined): New public property.
7572         (LabeledStatement.AddUsageVector): New public method to tell flow
7573         analyis that the label may be reached via a forward jump.
7574         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
7575         flow analysis.
7576         (VariableInfo.Number): New public field.  This is used by flow analysis
7577         to number all locals of a block.
7578         (Block.CountVariables): New public property.  This is the number of
7579         local variables in this block (including the locals from all parent
7580         blocks).
7581         (Block.EmitMeta): Number all the variables.
7582
7583         * statement.cs: Added flow analysis support to all classes.
7584
7585 2002-07-31  Martin Baulig  <martin@gnome.org>
7586
7587         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
7588         To get debugging messages, compile mcs with /define:MCS_DEBUG and
7589         then use this argument.
7590
7591         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
7592
7593         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
7594         use this to specify /define options.
7595
7596 2002-07-29  Martin Baulig  <martin@gnome.org>
7597
7598         * statement.cs (Fixed): Moved all code that does variable lookups
7599         and resolvings from Emit to Resolve.
7600
7601         * statement.cs (For): Moved all code that does variable lookups
7602         and resolvings from Emit to Resolve.
7603
7604         * statement.cs (Using): Moved all code that does variable lookups
7605         and resolvings from Emit to Resolve.
7606
7607 2002-07-29  Martin Baulig  <martin@gnome.org>
7608
7609         * attribute.cs (Attribute.Resolve): Explicitly catch a
7610         System.NullReferenceException when creating the
7611         CustromAttributeBuilder and report a different warning message.
7612
7613 2002-07-29  Martin Baulig  <martin@gnome.org>
7614
7615         * support.cs (ParameterData.ParameterName): Added method to
7616         get the name of a parameter.
7617
7618         * typemanager.cs (TypeManager.IsValueType): New public method.
7619
7620 2002-07-29  Martin Baulig  <martin@gnome.org>
7621
7622         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
7623         is a flag which specifies that it's either ref or out.
7624         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
7625         the out parameter to `out Parameter.Modifier mod', also set the
7626         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
7627
7628         * support.cs (InternalParameters.ParameterModifier): Distinguish
7629         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7630         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7631
7632         * expression.cs (Argument.GetParameterModifier): Distinguish
7633         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
7634         Parameter.Modifier.ISBYREF flag if it's either ref or out.
7635
7636 2002-07-29  Martin Baulig  <martin@gnome.org>
7637
7638         * expression.cs (ParameterReference.ParameterReference): Added
7639         `Location loc' argument to the constructor.
7640
7641         * cs-parser.jay: Pass location to ParameterReference.
7642
7643 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
7644
7645         * statement.cs (Try): Initialize the location.
7646
7647         * cs-parser.jay: pass location to Try.
7648
7649         * expression.cs (Unary.Reduce): Change the prototype to return
7650         whether a constant fold could be performed or not.  The result is
7651         returned in an out parameters.  In the case of Indirection and
7652         AddressOf, we want to perform the full tests.
7653
7654 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
7655
7656         * statement.cs (Statement.Emit): Flag dead code.
7657
7658 2002-07-27  Andrew Birkett  <andy@nobugs.org>
7659
7660         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
7661
7662 2002-07-27  Martin Baulig  <martin@gnome.org>
7663
7664         * class.cs (MethodData.Define): Put back call to
7665         TypeManager.AddMethod(), accidentally commented this out.
7666
7667         * report.cs (Debug): New public method to print debugging information,
7668         this is `[Conditional ("DEBUG")]'.
7669
7670 2002-07-26  Martin Baulig  <martin@gnome.org>
7671
7672         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
7673         (switch_statement): Push the current_block to the switch_stack and
7674         pop it again when we're done with the switch.
7675         (switch_section): The new block is a child of the current_block.
7676         Fixes bug #24007, added test-152.cs.
7677
7678 2002-07-27  Martin Baulig  <martin@gnome.org>
7679
7680         * expression.cs (Invocation.EmitArguments): When calling a varargs
7681         function with only its fixed arguments, we need to pass an empty
7682         array.
7683
7684 2002-07-27  Martin Baulig  <martin@gnome.org>
7685
7686         Mono 0.13 has been released.
7687
7688 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
7689
7690         * driver.cs: Rename --resource to --linkres, because that is what
7691         we do currently, we dont support --resource yet.
7692
7693         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
7694
7695 2002-07-25  Martin Baulig  <martin@gnome.org>
7696
7697         * class.cs (MethodData): New public class.  This is a `method builder'
7698         class for a method or one accessor of a Property/Indexer/Event.
7699         (MethodData.GetMethodFlags): Moved here from MemberBase.
7700         (MethodData.ApplyAttributes): Likewise.
7701         (MethodData.ApplyObsoleteAttribute): Likewise.
7702         (MethodData.ApplyConditionalAttribute): Likewise.
7703         (MethodData.ApplyDllImportAttribute): Likewise.
7704         (MethodData.CheckAbstractAndExternal): Likewise.
7705         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
7706         (MethodData.Emit): Formerly known as Method.Emit().
7707         (MemberBase): Moved everything which was specific to a single
7708         accessor/method to MethodData.
7709         (Method): Create a new MethodData and call Define() and Emit() on it.
7710         (Property, Indexer, Event): Create a new MethodData objects for each
7711         accessor and call Define() and Emit() on them.
7712
7713 2002-07-25  Martin Baulig  <martin@gnome.org>
7714
7715         Made MethodCore derive from MemberBase to reuse the code from there.
7716         MemberBase now also checks for attributes.
7717
7718         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
7719         (MemberBase.GetMethodFlags): Moved here from class Method and marked
7720         as virtual.
7721         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
7722         `CallingConventions cc' and `Attributes opt_attrs' arguments.
7723         (MemberBase.ApplyAttributes): New virtual method; applies the
7724         attributes to a method or accessor.
7725         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
7726         (MemberBase.ApplyConditionalAttribute): Likewise.
7727         (MemberBase.ApplyDllImportAttribute): Likewise.
7728         (MemberBase.CheckAbstractAndExternal): Likewise.
7729         (MethodCore.ParameterTypes): This is now a property instead of a
7730         method, it's initialized from DoDefineParameters().
7731         (MethodCore.ParameterInfo): Removed the set accessor.
7732         (MethodCore.DoDefineParameters): New protected virtual method to
7733         initialize ParameterTypes and ParameterInfo.
7734         (Method.GetReturnType): We can now simply return the MemberType.
7735         (Method.GetMethodFlags): Override the MemberBase version and add
7736         the conditional flags.
7737         (Method.CheckBase): Moved some code from Define() here, call
7738         DoDefineParameters() here.
7739         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
7740         here to avoid some larger code duplication.
7741         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
7742         ensure that abstract and external accessors don't declare a body.
7743
7744         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
7745         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
7746         lookup in the attribute's parent classes, so we need to abort as soon
7747         as we found the first match.
7748         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
7749         the attribute has no arguments.
7750
7751         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
7752         of a Method.
7753
7754 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7755
7756         * cs-parser.jay: reverted previous patch.
7757
7758 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7759
7760         * cs-parser.jay: fixed bug #22119.
7761
7762 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7763
7764         * attribute.cs: fixed compilation. The error was:
7765         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
7766         be assigned to before control leaves the current method."
7767         [FIXME:  Filed as bug #28186: MCS must report this error.]
7768
7769 2002-07-25  Martin Baulig  <martin@gnome.org>
7770
7771         * attribute.cs (Attribute.Conditional_GetConditionName): New static
7772         method to pull the condition name ouf of a Conditional attribute.
7773         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
7774         the obsolete message and error flag out of an Obsolete attribute.
7775
7776         * class.cs (Method.GetMethodFlags): New public method to get the
7777         TypeManager.MethodFlags for this method.
7778         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
7779         private methods.
7780         (Method.Define): Get and apply the Obsolete and Conditional attributes;
7781         if we're overriding a virtual function, set the new private variable
7782         `parent_method'; call the new TypeManager.AddMethod().
7783
7784         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
7785         the MethodBuilder and the Method in a PtrHashtable.
7786         (TypeManager.builder_to_method): Added for this purpose.
7787         (TypeManager.MethodFlags): Added IsObsoleteError.
7788         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
7789         Obsolete and Conditional arguments in MethodBuilders.  If we discover
7790         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
7791         the message from the attribute.
7792
7793 2002-07-24  Martin Baulig  <martin@gnome.org>
7794
7795         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
7796         preprocessor directives, ensure that the argument to #define/#undef is
7797         exactly one identifier and that it's actually an identifier.
7798
7799         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
7800         did not work ....
7801
7802 2002-07-24  Martin Baulig  <martin@gnome.org>
7803
7804         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
7805         initialize it to TypeManager.object_type in the constructor.
7806         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
7807         of the `hm.get_current' method if we're using the collection pattern.
7808         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
7809         for the explicit conversion to make it work when we're using the collection
7810         pattern and the `Current' property has a different return type than `object'.
7811         Fixes #27713.
7812
7813 2002-07-24  Martin Baulig  <martin@gnome.org>
7814
7815         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
7816         does not match, but don't report any errors.  This method is called in
7817         order for all methods in a MethodGroupExpr until a matching method is
7818         found, so we don't want to bail out if the first method doesn't match.
7819         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
7820         matches, report the 123.  Fixes #28070.
7821
7822 2002-07-24  Martin Baulig  <martin@gnome.org>
7823
7824         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
7825         TypeManager.TypeToCoreType() to the top of the method so the
7826         following equality checks will work.  Fixes #28107.
7827
7828 2002-07-24  Martin Baulig  <martin@gnome.org>
7829
7830         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
7831         operand is of type uint, and the other operand is of type sbyte,
7832         short or int, the operands are converted to type long." -
7833         Actually do what this comment already told us.  Fixes bug #28106,
7834         added test-150.cs.
7835
7836 2002-07-24  Martin Baulig  <martin@gnome.org>
7837
7838         * class.cs (MethodBase): New abstract class.  This is now a base
7839         class for Property, Indexer and Event to avoid some code duplication
7840         in their Define() and DefineMethods() methods.
7841         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
7842         generic methods for Define() and DefineMethods().
7843         (FieldBase): Derive from MemberBase, not MemberCore.
7844         (Property): Derive from MemberBase, not MemberCore.
7845         (Property.DefineMethod): Moved all the code from this method to the
7846         new MethodBase.DefineAccessor(), just call it with appropriate
7847         argumetnts.
7848         (Property.Define): Call the new Property.DoDefine(), this does some
7849         sanity checks and we don't need to duplicate the code everywhere.
7850         (Event): Derive from MemberBase, not MemberCore.
7851         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
7852         accessors, this will also make them work with interface events.
7853         (Indexer): Derive from MemberBase, not MemberCore.
7854         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
7855         (Indexer.Define): Use the new MethodBase functions.
7856
7857         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
7858         argument to the constructor.
7859         (Interface.FindMembers): Added support for interface events.
7860         (Interface.PopluateEvent): Implemented.
7861
7862         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
7863
7864 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
7865
7866         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
7867         but this is required to check for a method name being the same as
7868         the containing class.  
7869
7870         Handle this now.
7871
7872 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7873
7874         * interface.cs: initialize variable.
7875
7876 2002-07-23  Martin Baulig  <martin@gnome.org>
7877
7878         Implemented the IndexerName attribute in interfaces.
7879
7880         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
7881         name if this is an explicit interface implementation.
7882         (Indexer.InterfaceIndexerName): New public variable.  If we're
7883         implementing an interface indexer, this is the IndexerName in that
7884         interface.  Otherwise, it's the IndexerName.
7885         (Indexer.DefineMethod): If we're implementing interface indexer,
7886         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
7887         and Pending.ImplementIndexer methods.
7888         (Indexer.Define): Also define the PropertyBuilder if we're
7889         implementing an interface indexer and this is neither an explicit
7890         interface implementation nor do the IndexerName match the one in
7891         the interface.
7892
7893         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
7894         If a method is defined here, then we always need to create a proxy
7895         for it.  This is used when implementing interface indexers.
7896         (Pending.IsInterfaceIndexer): New public method.
7897         (Pending.ImplementIndexer): New public method.
7898         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
7899         This is used when implementing interface indexers to define a proxy
7900         if necessary.
7901         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
7902         define a proxy if necessary.
7903
7904         * interface.cs (Interface.IndexerName): New public variable.
7905         (Interface.PopulateIndexer): Set the IndexerName.
7906         (Interface.DefineIndexers): New private method.  Populate all the
7907         indexers and make sure their IndexerNames match.
7908
7909         * typemanager.cs (IndexerPropertyName): Added support for interface
7910         indexers.
7911
7912 2002-07-22  Martin Baulig  <martin@gnome.org>
7913
7914         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
7915         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
7916         ret if HasReturnLabel.
7917         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
7918         variables.
7919
7920         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
7921         and set the ec.LoopBeginTryCatchLevel.
7922         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
7923         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
7924         the current ec.TryCatchLevel, the branch goes out of an exception
7925         block.  In this case, we need to use Leave and not Br.
7926
7927 2002-07-22  Martin Baulig  <martin@gnome.org>
7928
7929         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
7930         block unless the block does not always return or it is contained in
7931         another try { ... } catch { ... } block.  Fixes bug #26506.
7932         Added verify-1.cs to the test suite.
7933
7934 2002-07-22  Martin Baulig  <martin@gnome.org>
7935
7936         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
7937         then we do not always return.  Fixes bug #24985.
7938
7939 2002-07-22  Martin Baulig  <martin@gnome.org>
7940
7941         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
7942         lookup on a per-class level; ie. walk up the class hierarchy until we
7943         found at least one applicable method, then choose the best among them.
7944         Fixes bug #24463 and test-29.cs.
7945
7946 2002-07-22  Martin Baulig  <martin@gnome.org>
7947
7948         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
7949         return types of the methods.  The return type is not part of the
7950         signature and we must not check it to make the `new' modifier work.
7951         Fixes bug #27999, also added test-147.cs.
7952         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
7953
7954         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
7955         on the method's return type.
7956
7957 2002-07-21  Martin Baulig  <martin@gnome.org>
7958
7959         * assign.cs: Make this work if the rightmost source is a constant and
7960         we need to do an implicit type conversion.  Also adding a few more tests
7961         to test-38.cs which should have caught this.
7962
7963         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
7964         target in the makefile for this.  The makefile.gnu is primarily intended
7965         for end-users who don't want to debug the compiler.
7966
7967 2002-07-21  Martin Baulig  <martin@gnome.org>
7968
7969         * assign.cs: Improved the Assign class so it can now handle embedded
7970         assignments (X = Y = Z = something).  As a side-effect this'll now also
7971         consume less local variables.  test-38.cs now passes with MCS, added
7972         a few new test cases to that test.
7973
7974 2002-07-20  Martin Baulig  <martin@gnome.org>
7975
7976         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
7977         instructions.  Fixes bug #27977, also added test-146.cs.
7978
7979 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7980
7981         * cs-tokenizer.cs: fixed getHex ().
7982
7983 2002-07-19  Martin Baulig  <martin@gnome.org>
7984
7985         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
7986         not Type.GetType() to lookup the array type.  This is needed when
7987         we're constructing an array of a user-defined type.
7988         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
7989         single-dimensional arrays, but also for single-dimensial arrays of
7990         type decimal.
7991
7992 2002-07-19  Martin Baulig  <martin@gnome.org>
7993
7994         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
7995         this function is called, it's not allowed to share LocalBuilders
7996         among ILGenerators.
7997
7998 2002-07-19  Martin Baulig  <martin@gnome.org>
7999
8000         * expression.cs (Argument.Resolve): Report an error 118 when trying
8001         to pass a type as argument.
8002
8003 2002-07-18  Martin Baulig  <martin@gnome.org>
8004
8005         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
8006         Conv_R_Un for the signed `long' type.
8007
8008 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
8009
8010         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
8011         `expr' for the temporary result, as that will fail if we do
8012         multiple resolves on the same expression.
8013
8014 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
8015
8016         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
8017         ec.TypeContainer for looking up aliases. 
8018
8019         * class.cs (TypeContainer): Remove LookupAlias from here.
8020
8021         * decl.cs (DeclSpace); Move here.
8022
8023 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
8024
8025         * class.cs (FindMembers): Only call filter if the constructor
8026         bulider is not null.
8027
8028         Also handle delegates in `NestedTypes' now.  Now we will perform
8029         type lookups using the standard resolution process.  This also
8030         fixes a bug.
8031
8032         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
8033         This uses Expressions (the limited kind that can be parsed by the
8034         tree) instead of strings.
8035
8036         * expression.cs (ComposedCast.ToString): Implement, used to flag
8037         errors since now we have to render expressions.
8038
8039         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
8040         FormArrayType. 
8041
8042         * ecore.cs (SimpleName.ToString): ditto.
8043
8044         * cs-parser.jay: Instead of using strings to assemble types, use
8045         Expressions to assemble the type (using SimpleName, ComposedCast,
8046         MemberAccess).  This should fix the type lookups in declarations,
8047         because we were using a different code path for this.
8048
8049         * statement.cs (Block.Resolve): Continue processing statements
8050         even when there is an error.
8051
8052 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
8053
8054         * class.cs (Event.Define): Also remove the `remove' method from
8055         the list of pending items.
8056
8057         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
8058         generate more compact code. 
8059
8060 2002-07-17  Martin Baulig  <martin@gnome.org>
8061
8062         * const.cs (Const.LookupConstantValue): Add support for constant
8063         `unchecked' and `checked' expressions.
8064         Also adding test case test-140.cs for this.
8065
8066 2002-07-17  Martin Baulig  <martin@gnome.org>
8067
8068         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
8069         check whether mi.ReturnType implements the IEnumerator interface; the
8070         `==' and the IsAssignableFrom() will fail in this situation.
8071
8072 2002-07-16  Ravi Pratap  <ravi@ximian.com>
8073
8074         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
8075         here too.
8076
8077 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8078
8079         * expression.cs: fixed bug #27811.
8080
8081 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
8082
8083         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
8084         Molaro: when we are a ref, the value already contains a pointer
8085         value, do not take the address of it.
8086
8087 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
8088         * removed mb-parser.jay and mb-tokenizer.cs
8089
8090 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
8091
8092         * expression.cs: check against the building corlib void type.
8093
8094 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
8095
8096         * ecore.cs: fix for valuetype static readonly fields: when 
8097         initializing them, we need their address, not the address of a copy.
8098
8099 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
8100
8101         * typemanager.cs: register also enum_type in corlib.
8102
8103 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
8104
8105         * class.cs: allow calling this (but not base) initializers in structs.
8106
8107 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
8108
8109         * ecore.cs: make sure we compare against the building base types
8110         in GetTypeSize ().
8111
8112 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
8113
8114         * typemanager.cs: fix TypeToCoreType() to handle void and object
8115         (corlib gets no more typerefs after this change).
8116
8117 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
8118
8119         * expression.cs (ArrayCreation.EmitArrayArguments): use
8120         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
8121
8122         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
8123         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
8124         array indexes, the runtime actually forbids them.
8125
8126         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
8127         for array arguments here.
8128
8129         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
8130         instead of the default for ValueTypes.
8131
8132         (New.DoEmit): Use IsValueType instead of
8133         IsSubclassOf (value_type)
8134         (New.DoResolve): ditto.
8135         (Invocation.EmitCall): ditto.
8136
8137         * assign.cs (Assign): ditto.
8138
8139         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
8140         Statements *are* currently doing part of their resolution during
8141         Emit.  
8142
8143         Expressions do always resolve during resolve, but statements are
8144         only required to propagate resolution to their children.
8145
8146 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
8147
8148         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
8149
8150         (LoadAssembly): Do not add the dll if it is already specified
8151
8152         (MainDriver): Add the System directory to the link path at the end,
8153         after all the other -L arguments. 
8154
8155         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
8156         wrong opcode for loading bytes and bools (ldelem.i1 instead of
8157         ldelem.u1) and using the opposite for sbytes.
8158
8159         This fixes Digger, and we can finally run it.
8160
8161         * driver.cs (UnixParseOption): Move the option parsing here.  
8162         (CSCParseOption): Implement CSC-like parsing of options.
8163
8164         We now support both modes of operation, the old Unix way, and the
8165         new CSC-like way.  This should help those who wanted to make cross
8166         platform makefiles.
8167
8168         The only thing broken is that /r:, /reference: and /lib: are not
8169         implemented, because I want to make those have the same semantics
8170         as the CSC compiler has, and kill once and for all the confussion
8171         around this.   Will be doing this tomorrow.
8172
8173         * statement.cs (Unsafe.Resolve): The state is checked during
8174         resolve, not emit, so we have to set the flags for IsUnsfe here.
8175
8176 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
8177
8178         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
8179         not catch the Error_ObjectRefRequired in SimpleName (as it is
8180         possible to have a class/instance variable name that later gets
8181         deambiguated), we have to check this here.      
8182
8183 2002-07-10  Ravi Pratap  <ravi@ximian.com>
8184
8185         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
8186         make static and put into Expression.
8187
8188         (Event.Define): Register the private field of the event with the 
8189         TypeManager so that GetFieldFromEvent can get at it.
8190
8191         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
8192         keep track of the private field associated with an event which
8193         has no accessors.
8194
8195         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
8196         private field.
8197
8198         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
8199
8200 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
8201
8202         * expression.cs (Binary.EmitBranchable): this routine emits the
8203         Binary expression in a branchable context.  This basically means:
8204         we need to branch somewhere, not just get the value on the stack.
8205
8206         This works together with Statement.EmitBoolExpression.
8207
8208         * statement.cs (Statement.EmitBoolExpression): Use
8209         EmitBranchable. 
8210
8211 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
8212
8213         * statement.cs (For): Reduce the number of jumps in loops.
8214
8215         (For): Implement loop inversion for the For statement.
8216
8217         (Break): We can be breaking out of a Try/Catch controlled section
8218         (foreach might have an implicit try/catch clause), so we need to
8219         use Leave instead of Br.
8220
8221         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
8222         now).  If the instace expression supports IMemoryLocation, we use
8223         the AddressOf method from the IMemoryLocation to extract the
8224         address instead of emitting the instance.
8225
8226         This showed up with `This', as we were emitting the instance
8227         always (Emit) instead of the Address of This.  Particularly
8228         interesting when This is a value type, as we dont want the Emit
8229         effect (which was to load the object).
8230
8231 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
8232
8233         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
8234
8235         * statement.cs (Checked): Set the CheckedState during the resolve
8236         process too, as the ConvCast operations track the checked state on
8237         the resolve process, and not emit.
8238
8239         * cs-parser.jay (namespace_member_declaration): Flag that we have
8240         found a declaration when we do.  This is used to flag error 1529
8241
8242         * driver.cs: Report ok when we display the help only.
8243
8244 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
8245
8246         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
8247
8248 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
8249
8250         * cs-tokenizer.cs (define): We also have to track locally the
8251         defines.  AllDefines is just used for the Conditional Attribute,
8252         but we also need the local defines for the current source code. 
8253
8254 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
8255
8256         * statement.cs (While, For, Do): These loops can exit through a
8257         Break statement, use this information to tell whether the
8258         statement is the last piece of code.
8259
8260         (Break): Flag that we break.
8261
8262         * codegen.cs (EmitContexts): New `Breaks' state variable.
8263
8264 2002-07-03  Martin Baulig  <martin@gnome.org>
8265
8266         * class.cs (TypeContainer.MethodModifiersValid): Allow override
8267         modifiers in method declarations in structs.  Otherwise, you won't
8268         be able to override things like Object.Equals().
8269
8270 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
8271
8272         * class.cs (Method, Property, Indexer): Do not allow the public
8273         modifier to be used in explicit interface implementations.
8274
8275         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
8276         override modifiers in method declarations in structs
8277
8278 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
8279
8280         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
8281         integer or real overflow, report an error
8282
8283 2002-07-02  Martin Baulig  <martin@gnome.org>
8284
8285         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
8286         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
8287         to tell the runtime about our newly created System.Object and
8288         System.ValueType types.
8289
8290 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
8291
8292         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
8293         struct instead of Ldarg/Starg.
8294
8295 2002-07-02  Martin Baulig  <martin@gnome.org>
8296
8297         * expression.cs (Indirection.Indirection): Call
8298         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
8299
8300 2002-07-02  Martin Baulig  <martin@gnome.org>
8301
8302         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
8303         ValueType, call TypeManager.TypeToCoreType() on it.
8304         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
8305         the OpCodes.Newarr argument.
8306
8307 2002-07-02  Martin Baulig  <martin@gnome.org>
8308
8309         * expression.cs (Invocation.EmitCall): When compiling corlib,
8310         replace all calls to the system's System.Array type to calls to
8311         the newly created one.
8312
8313         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
8314         System.Array methods.
8315         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
8316         from the system's System.Array type which must be replaced.
8317
8318 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
8319
8320         * typemanager.cs: load unverifiable_code_ctor so we can build
8321         corlib using the correct type. Avoid using GetTypeCode() with
8322         TypeBuilders.
8323         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
8324         TypeManager.object_type to allow building corlib.
8325
8326 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
8327
8328         * ecore.cs: handle System.Enum separately in LoadFromPtr().
8329
8330 2002-07-01  Martin Baulig  <martin@gnome.org>
8331
8332         * class.cs: Make the last change actually work, we need to check
8333         whether `ifaces != null' to avoid a crash.
8334
8335 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
8336
8337         * class.cs: when we build structs without fields that implement
8338         interfaces, we need to add the interfaces separately, since there is
8339         no API to both set the size and add the interfaces at type creation
8340         time.
8341
8342 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
8343
8344         * expression.cs: the dimension arguments to the array constructors
8345         need to be converted if they are a long.
8346
8347 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
8348
8349         * class.cs: don't emit ldarg.0 if there is no parent constructor
8350         (fixes showstopper for corlib).
8351
8352 2002-06-29  Martin Baulig  <martin@gnome.org>
8353
8354         MCS now compiles corlib on GNU/Linux :-)
8355
8356         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
8357         ie. check for MethodImplOptions.InternalCall.
8358
8359         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
8360         and TypeManager.attribute_type are null, so we must explicitly check
8361         whether parent is not null to find out whether it's an attribute type.
8362         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
8363         and SetBuilder, not only if the property is neither abstract nor external.
8364         This is necessary to set the MethodImplOptions on the accessor methods.
8365         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
8366         SetBuilder, see Property.Emit().
8367
8368         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
8369         populate "System.Object", "System.ValueType" and "System.Attribute" since
8370         they've already been populated from BootCorlib_PopulateCoreTypes().
8371
8372 2002-06-29  Martin Baulig  <martin@gnome.org>
8373
8374         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
8375         is the NullLiteral, we also need to make sure that target_type is not
8376         an enum type.   
8377
8378 2002-06-29  Martin Baulig  <martin@gnome.org>
8379
8380         * rootcontext.cs (RootContext.ResolveCore): We must initialize
8381         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
8382         before calling BootstrapCorlib_ResolveDelegate ().
8383
8384 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8385
8386         * statement.cs: fixed build-breaker. All tests passed ok.
8387
8388 2002-06-27  Martin Baulig  <martin@gnome.org>
8389
8390         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
8391         for System.Decimal when compiling corlib.
8392
8393 2002-06-27  Martin Baulig  <martin@gnome.org>
8394
8395         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
8396         switch blocks which contain nothing but a default clause.
8397
8398 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
8399
8400        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
8401
8402 2002-06-27  Martin Baulig  <martin@gnome.org>
8403
8404         * ecore.cs (PropertyExpr.PropertyExpr): Call
8405         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
8406
8407         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
8408         is already a TypeBuilder.
8409
8410 2002-06-27  Martin Baulig  <martin@gnome.org>
8411
8412         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
8413         `target_type == TypeManager.array_type', not IsAssignableFrom() in
8414         the "from an array-type to System.Array" case.  This makes it work
8415         when compiling corlib.
8416
8417 2002-06-27  Martin Baulig  <martin@gnome.org>
8418
8419         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
8420         non-static PropertyExpr, set its InstanceExpression.  This makes
8421         the `ICollection.Count' property work in System/Array.cs.
8422
8423 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
8424
8425         * driver.cs: Made error handling more consistent.  Errors now
8426         tracked by Report class, so many methods which used to return int
8427         now return void.  Main() now prints success/failure and 
8428         errors/warnings message.
8429
8430         Renamed '--probe' compiler argument to '--expect-error'.  Removed
8431         the magic number return values (123 and 124).  Now, if the
8432         expected error occurs, the compiler exits with success (exit value
8433         0).  If the compilation completes without seeing that particular
8434         error, the compiler exits with failure (exit value 1).  The
8435         makefile in mcs/errors has been changed to handle the new behaviour.
8436
8437         * report.cs: Made 'expected error' number a property and renamed
8438         it from 'Probe' to 'ExpectedError'.
8439
8440         * genericparser.cs: Removed error handling support, since it is
8441         now all done by Report class.
8442
8443         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
8444         class, so parse() no longer returns an int.
8445
8446         * namespace.cs: Use Report.Error instead of GenericParser.error
8447
8448 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
8449
8450         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
8451         TypeContainer.AddOperator): At the front of the list put the
8452         explicit implementations, so they get resolved/defined first. 
8453
8454 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
8455
8456         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
8457         interface type is implemented by this TypeContainer.  Used during
8458         explicit interface implementation.
8459
8460         (Property.Define, Indexer.Define, Method.Define): Validate that
8461         the given interface in the explicit implementation is one of the
8462         base classes for the containing type.
8463
8464         Also if we are explicitly implementing an interface, but there is
8465         no match in the pending implementation table, report an error.
8466
8467         (Property.Define): Only define the property if we are
8468         not explicitly implementing a property from an interface.  Use the
8469         correct name also for those properties (the same CSC uses,
8470         although that is really not needed).
8471
8472         (Property.Emit): Do not emit attributes for explicitly implemented
8473         properties, as there is no TypeBuilder.
8474
8475         (Indexer.Emit): ditto.
8476
8477         Hiding then means that we do not really *implement* a pending
8478         implementation, which makes code fail.
8479
8480 2002-06-22  Martin Baulig  <martin@gnome.org>
8481
8482         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
8483         the return value of Object.GetType().  [FIXME: we need to do this whenever
8484         we get a type back from the reflection library].
8485
8486 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
8487
8488         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
8489
8490 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
8491
8492         * attribute.cs: Return null if we can not look up the type.
8493
8494         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
8495         the interface types found.
8496
8497         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
8498         interface types found.
8499
8500         * typemanager.cs (GetInterfaces): Make this routine returns alll
8501         the interfaces and work around the lame differences between
8502         System.Type and System.Reflection.Emit.TypeBuilder in the results
8503         result for GetInterfaces.
8504
8505         (ExpandInterfaces): Given an array of interface types, expand and
8506         eliminate repeated ocurrences of an interface.  This expands in
8507         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
8508         be IA, IB, IC.
8509
8510 2002-06-21  Martin Baulig  <martin@gnome.org>
8511
8512         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
8513         on System.Enum.
8514
8515 2002-06-21  Martin Baulig  <martin@gnome.org>
8516
8517         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
8518         and called with one of the core types, return the corresponding typebuilder for
8519         that type.
8520
8521         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
8522         element type.
8523
8524 2002-06-21  Martin Baulig  <martin@gnome.org>
8525
8526         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
8527         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
8528         (Expression.ConvertReferenceExplicit): Likewise.
8529
8530         * expression.cs (ElementAccess.DoResolve): Likewise.
8531         (ElementAccess.DoResolveLValue): Likewise.
8532
8533 2002-06-10  Martin Baulig  <martin@gnome.org>
8534
8535         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
8536         add the "value" parameter to the parameter list.
8537
8538         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
8539         to our caller.
8540
8541 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
8542
8543         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
8544         the argument to an int, uint, long or ulong, per the spec.  Also
8545         catch negative constants in array creation.
8546
8547 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
8548
8549         * class.cs: do not allow the same interface to appear twice in
8550         the definition list.
8551
8552 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
8553
8554         * ecore.cs: don't use ldlen with System.Array.
8555
8556 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
8557
8558         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
8559
8560 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
8561
8562         * modifiers.cs: produce correct field attributes for protected
8563         internal. Easy fix so miguel can work on ther harder stuff:-)
8564
8565 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
8566
8567         * pending.cs: New file.  Move the code from class.cs here.
8568         Support clearning the pending flag for all methods (when not doing
8569         explicit interface implementation).
8570
8571 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
8572
8573         * rootcontext.cs: added a couple more types needed to bootstrap.
8574
8575 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
8576
8577         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
8578         constructor in the type, instead of any constructor in the type
8579         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
8580         a bug in the Mono runtime when applying the params attribute). 
8581
8582 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
8583         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
8584
8585 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
8586
8587         * expression.cs (Unary.ResolveOperator): Use TypeManager
8588         to resolve the type.
8589
8590 2002-06-13  Ravi Pratap  <ravi@ximian.com>
8591
8592         * cs-parser.jay (enum_member_declaration): Pass in the attributes
8593         attached.
8594
8595         * enum.cs (AddEnumMember): Add support to store the attributes associated 
8596         with each member too.
8597
8598         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
8599         field builders too - this takes care of the enum member case.
8600
8601 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
8602
8603         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
8604         address-of operator on both value types and pointers.
8605
8606 2002-06-10  Martin Baulig  <martin@gnome.org>
8607
8608         * interface.cs (Interface.PopulateIndexer): Add the indexer's
8609         PropertyBuilder to the `property_builders' list.
8610
8611         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
8612         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
8613         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
8614         find any indexers which are inherited from an interface.
8615
8616 2002-06-09  Martin Baulig  <martin@gnome.org>
8617
8618         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
8619         the same type as the constant if necessary.  There's also a test-130.cs
8620         for this.
8621
8622         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
8623
8624         * typemanager.cs (TypeManager.ChangeType): Previously known as
8625         Enum.ChangeEnumType().
8626
8627 2002-06-09  Martin Baulig  <martin@gnome.org>
8628
8629         * expression.cs (Cast.TryReduce): Added support for consts.
8630
8631 2002-06-08  Ravi Pratap  <ravi@ximian.com>
8632
8633         * class.cs (Accessor): Hold attributes information so we can pass
8634         it along.
8635
8636         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
8637         Modify to pass in attributes attached to the methods.
8638
8639         (add_accessor_declaration, remove_accessor_declaration): Ditto.
8640
8641         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
8642         to handle the Accessor kind :-)
8643
8644         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
8645
8646 2002-06-08  Martin Baulig  <martin@gnome.org>
8647
8648         * expression.cs (Unary.TryReduceNegative): Added support for
8649         ULongConstants.
8650
8651 2002-06-08  Martin Baulig  <martin@gnome.org>
8652
8653         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
8654         name can't be found in the `defined_names' - the caller will do a
8655         MemberLookup in this case and thus find methods in System.Enum
8656         such as Enum.IsDefined().
8657
8658 2002-06-08  Martin Baulig  <martin@gnome.org>
8659
8660         * enum.cs (Enum.ChangeEnumType): This is a custom version of
8661         Convert.ChangeType() which works with TypeBuilder created types.
8662         (Enum.LookupEnumValue, Enum.Define): Use it here.
8663
8664         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
8665         `TypeBuilder.BaseType != null' check.
8666         (TypeContainer.FindMembers): Only lookup parent members if we
8667         actually have a parent.
8668         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
8669         (ConstructorInitializer.Resolve): Likewise.
8670
8671         * interface.cs (Interface.FindMembers): Added
8672         `TypeBuilder.BaseType != null' check.
8673
8674         * rootcontext.cs (RootContext.ResolveCore): Added
8675         "System.Runtime.CompilerServices.IndexerNameAttribute" to
8676         classes_second_stage.
8677
8678         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
8679         debug_type and trace_type when compiling with --nostdlib.       
8680
8681 2002-06-07  Martin Baulig  <martin@gnome.org>
8682
8683         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
8684         (AddField): Set it to true when adding a non-static field.
8685         (DefineType): Use `have_nonstatic_fields' to find out whether we
8686         have non-static fields, not `Fields != null'.
8687
8688 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
8689
8690         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
8691         dereferencing a null on the static-field code path)
8692
8693 2002-05-30  Martin Baulig  <martin@gnome.org>
8694
8695         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
8696         to take command line arguments.  Use reflection to call the new
8697         custom `Initialize' function on the symbol writer and pass it the
8698         command line arguments.
8699
8700         * driver.cs (--debug-args): New command line argument to pass command
8701         line arguments to the symbol writer.
8702
8703 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
8704
8705         * assign.cs (DoResolve): Forgot to do the implicit conversion to
8706         the target type for indexers and properties.  Thanks to Joe for
8707         catching this.
8708
8709 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
8710
8711         * typemanager.cs (MethodFlags): returns the method flags
8712         (Obsolete/ShouldIgnore) that control warning emission and whether
8713         the invocation should be made, or ignored. 
8714
8715         * expression.cs (Invocation.Emit): Remove previous hack, we should
8716         not do this on matching a base type, we should do this based on an attribute
8717
8718         Only emit calls to System.Diagnostics.Debug and
8719         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
8720         on the command line.
8721
8722         * rootcontext.cs: Global settings for tracing and debugging.
8723
8724         * cs-tokenizer.cs (define): New utility function to track
8725         defines.   Set the global settings for TRACE and DEBUG if found.
8726
8727 2002-05-25  Ravi Pratap  <ravi@ximian.com>
8728
8729         * interface.cs (Populate*): Pass in the TypeContainer as well as
8730         the DeclSpace as parameters so that we can create EmitContexts and
8731         then use that to apply attributes etc.
8732
8733         (PopulateMethod, PopulateEvent, PopulateProperty)
8734         (PopulateIndexer): Apply attributes everywhere.
8735
8736         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
8737         etc.
8738
8739         (ApplyAttributes): Update accordingly.
8740
8741         We now apply interface attributes for all members too.
8742
8743 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
8744
8745         * class.cs (Indexer.Define); Correctly check if we are explicit
8746         implementation (instead of checking the Name for a ".", we
8747         directly look up if the InterfaceType was specified).
8748
8749         Delay the creation of the PropertyBuilder.
8750
8751         Only create the PropertyBuilder if we are not an explicit
8752         interface implementation.   This means that explicit interface
8753         implementation members do not participate in regular function
8754         lookups, and hence fixes another major ambiguity problem in
8755         overload resolution (that was the visible effect).
8756
8757         (DefineMethod): Return whether we are doing an interface
8758         implementation. 
8759
8760         * typemanager.cs: Temporary hack until we get attributes in
8761         interfaces (Ravi is working on that) and we get IndexerName
8762         support in interfaces.
8763
8764         * interface.cs: Register the indexers as properties.
8765
8766         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
8767         warning, I have verified that this is a bug in the .NET runtime
8768         (JavaScript suffers of the same problem).
8769
8770         * typemanager.cs (MemberLookup): When looking up members for
8771         interfaces, the parent of an interface is the implicit
8772         System.Object (so we succeed in searches of Object methods in an
8773         interface method invocation.  Example:  IEnumerable x;  x.ToString
8774         ()) 
8775
8776 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
8777
8778         * class.cs (Event): Events should also register if they do
8779         implement the methods that an interface requires.
8780
8781         * typemanager.cs (MemberLookup); use the new GetInterfaces
8782         method. 
8783
8784         (GetInterfaces): The code used to lookup interfaces for a type is
8785         used in more than one place, factor it here. 
8786
8787         * driver.cs: Track the errors at the bottom of the file, we kept
8788         on going.
8789
8790         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
8791         instance if the method we are calling is static!
8792
8793 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
8794
8795         * attribute.cs (ApplyAttributes): Make this function filter out
8796         the IndexerName attribute (as that attribute in reality is never
8797         applied) and return the string constant for the IndexerName
8798         attribute. 
8799
8800         * class.cs (TypeContainer.Emit): Validate that all the indexers
8801         have the same IndexerName attribute, and if so, set the
8802         DefaultName attribute on the class. 
8803
8804         * typemanager.cs: The return value might contain other stuff (not
8805         only methods).  For instance, consider a method with an "Item"
8806         property and an Item method.
8807
8808         * class.cs: If there is a problem with the parameter types,
8809         return. 
8810
8811 2002-05-24  Ravi Pratap  <ravi@ximian.com>
8812
8813         * ecore.cs (ImplicitConversionExists): Wrapper function which also
8814         looks at user defined conversion after making a call to 
8815         StandardConversionExists - we need this for overload resolution.
8816
8817         * expression.cs : Update accordingly the various method calls.
8818
8819         This fixes 2 bugs filed against implicit user defined conversions 
8820
8821 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
8822
8823         * statement.cs: Track the result of the assignment.
8824
8825 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
8826
8827         * expression.cs (MemberAccess): Improved error reporting for
8828         inaccessible members.
8829
8830 2002-05-22  Martin Baulig  <martin@gnome.org>
8831
8832         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
8833         itself with debugging support.
8834
8835 2002-05-22  Martin Baulig  <martin@gnome.org>
8836
8837         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
8838         Removed, this isn't needed anymore.
8839
8840 2002-05-20  Martin Baulig  <martin@gnome.org>
8841
8842         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
8843         be underlying type for an enum.
8844
8845 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
8846
8847         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
8848         that splits out the loading of just the core types.
8849
8850         * rootcontext.cs (ResolveCore): Split the struct resolution in
8851         two, so we can load the enumeration underlying types before any
8852         enums are used.
8853
8854         * expression.cs (Is): Bandaid until we fix properly Switch (see
8855         bug #24985 for details).
8856
8857         * typemanager.cs (ImplementsInterface): The hashtable will contain
8858         a null if there are no interfaces implemented.
8859
8860 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
8861
8862         * cs-parser.jay (indexer_declarator): It is fine to have array
8863         parameters
8864
8865 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
8866
8867         * typemanager.cs: (RegisterBuilder): New function used to register
8868         TypeBuilders that implement interfaces.  Since
8869         TypeBuilder.GetInterfaces (as usual) does not work with lame
8870         Reflection.Emit. 
8871         (AddUserType): register interfaces.
8872
8873         (ImplementsInterface): Use the builder_to_ifaces hash if we are
8874         dealing with TypeBuilder.  Also, arrays are showing up as
8875         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
8876         methods can not be invoked on them!
8877
8878         * ecore.cs (ExplicitReferenceConversionExists): Made public.
8879         (ImplicitReferenceConversionExists): Split out from
8880         StandardConversionExists. 
8881
8882         * expression.cs (As): We were only implementing one of the three
8883         cases for the as operator.  We now implement them all.
8884         (Is): Implement the various other cases for Is as well.
8885
8886         * typemanager.cs (CACHE): New define used to control if we want or
8887         not the FindMembers cache.  Seems to have a negative impact on
8888         performance currently
8889
8890         (MemberLookup): Nested types have full acess to
8891         enclosing type members
8892
8893         Remove code that coped with instance/static returns for events, we
8894         now catch this in RealFindMembers.
8895
8896         (RealFindMembers): only perform static lookup if the instance
8897         lookup did not return a type or an event.  
8898
8899 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
8900
8901         * assign.cs (CompoundAssign): We pass more semantic information
8902         now to Compound Assignments than we did before: now we have all
8903         the information at hand, and now we resolve the target *before* we
8904         do the expression expansion, which allows the "CacheValue" method
8905         to have the effect we intended (before, a [x] += 1 would generate
8906         two differen ArrayAccess expressions from the ElementAccess,
8907         during the resolution process).
8908
8909         (CompoundAssign.DoResolve): Resolve target and original_source here.
8910
8911 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
8912
8913         * expression.cs (ArrayAccess): dropped debugging information. 
8914
8915         * typemanager.cs: Small bug fix: I was always returning i_members,
8916         instead of one of i_members or s_members (depending on which had
8917         the content).
8918
8919         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
8920         method is invoked before any code generation takes place, and it
8921         is a mechanism to inform that the expression will be invoked more
8922         than once, and that the method should use temporary values to
8923         avoid having side effects
8924
8925         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
8926
8927         * ecore.cs (Expression.CacheTemporaries): Provide empty default
8928         implementation.
8929
8930         * expression.cs (Indirection, ArrayAccess): Add support for
8931         CacheTemporaries in these two bad boys. 
8932
8933         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
8934         ldobj or ldind_ref.  
8935         (StoreFromPtr): Handle stobj as well.
8936
8937         * expression.cs (UnaryMutator): Share more code.
8938
8939         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
8940         down: I was not tracking the Filter function as well, which
8941         was affecting the results of the cache.
8942
8943 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
8944
8945         * attribute.cs: Remove the hack to handle the CharSet property on
8946         StructLayouts. 
8947
8948 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
8949
8950         * attribute.cs (DoResolve): More uglyness, we now only try to
8951         resolve the attribute partially, to extract the CharSet
8952         information (only if we are a StructLayout attribute).  Otherwise 
8953
8954         (GetExtraTypeInfo): Add some code to conditionally kill in the
8955         future this.   I am more and more convinced that the .NET
8956         framework has special code to handle the attribute setting on
8957         certain elements.
8958
8959         * expression.cs (IsParamsMethodApplicable): Revert my previous
8960         foreach change here, it was wrong.
8961
8962 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
8963
8964         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
8965         (pp_expr): do not abort on unknown input, just return.
8966         (eval): abort if there are pending chars.
8967
8968         * attribute.cs (Attribute.Resolve): Positional parameters are
8969         optional.  Deal with that case.
8970
8971         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
8972         the Ansi/Unicode/Auto information for the type.
8973
8974         (TypeContainer.DefineType): instantiate the EmitContext here, as
8975         we will be using it during the type definition (to resolve
8976         attributes) and during the emit phase.
8977
8978         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
8979         to pull type information out of the attributes
8980
8981         (Attribute.Resolve): track the constructor builder, and allow for
8982         multiple invocations (structs and classes will use this).
8983
8984         * ecore.cs (MemberLookupFinal): new version with all the
8985         parameters customizable.
8986
8987         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
8988         constructors.  Return if the result value is null (as the error
8989         would have been flagged already by MemberLookupFinal)
8990
8991         Do not allow instances of abstract classes or interfaces to be
8992         created.
8993
8994         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
8995         We have to compare the assembly property here when dealing with
8996         FamANDAssem and Assembly access modifiers, because we might be
8997         creating an assembly from *modules* (that means that we are not
8998         getting TypeBuilders for types defined in other modules that are
8999         part of this assembly).
9000
9001         (Method.Emit): If the method is marked abstract and has a body,
9002         emit an error. 
9003
9004         (TypeContainer.DefineMembers): If both the defined member and the
9005         parent name match are methods, then do not emit any warnings: let
9006         the Method.Define routine take care of flagging warnings.  But if
9007         there is a mismatch (method overrides something else, or method is
9008         overriwritten by something, then emit warning).
9009
9010         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
9011         set to null, this means `do not check for the return type on the
9012         signature'. 
9013
9014         (Method.Define): set the return type for the method signature to
9015         null, so that we get methods with the same name and parameters and
9016         different return types.  This is used to flag warning 114 (you are
9017         hiding a method, and you probably want to use the new/override
9018         keywords instead).
9019
9020         * typemanager.cs (MemberLookup): Implemented proper access
9021         control, closing a long standing set of bug reports.  The problem
9022         was that the Framework only has two bits: Public and NonPublic,
9023         and NonPublic includes private and protected methods, but we need
9024         to enforce the FamANDAssem, FamOrAssem and Family. 
9025
9026 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
9027
9028         * statement.cs (GotoCase): Return true: Ammounts to giving up
9029         knowledge on whether we return or not, and letting the other case
9030         be responsible for it.
9031
9032 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
9033
9034         * driver.cs: Do not load directories for each file processed, only
9035         do it if there is a pattern.
9036
9037         * ecore.cs: Report readonly assigns here as well, as we might have
9038         been resolved only by MemberAccess.
9039
9040         (SimpleName.SimpleNameResolve): Also be useful for LValue
9041         resolution.   We need this to propagate assign to local readonly variables
9042
9043         * typemanager.cs: Use a ptrhashtable for the criteria, because we
9044         do not want to reuse potential criteria memory.
9045
9046         * class.cs (MyEventBuilder): Set reflected_type;
9047
9048         * ecore.cs (Constantify): Added support for constifying bools.
9049
9050         (RootContext.LookupType): Added a cache for values looked up in
9051         the declaration space.
9052
9053         * typemanager.cs (FindMembers): Now is a front-end to
9054         RealFindMembers, and provides a two-level hashtable-based cache to
9055         the request.  
9056
9057         15% performance improvement: from 22.5 to 19.2 seconds.
9058
9059         * expression.cs (IsParamsMethodApplicable): use foreach.
9060         (Invocation.DoResolve): ditto.
9061         (New.DoResolve): ditto.
9062         (ArrayCreation.DoResolve): ditto.
9063
9064         * ecore.cs (FindMostEncompassingType): use foreach.
9065
9066         * delegate.cs (NewDelegate.DoResolve): Use foreach
9067
9068         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
9069         (RemoveMethods): use foreach.
9070
9071         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
9072         nested foreach statements instead of for, and also break out of
9073         the inner loop once a match is found.
9074
9075         (Invocation.OverloadResolve): Use foreach, simplify the code. 
9076
9077 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
9078
9079         * cfold.cs (BinaryFold): During an enumeration evaluation context,
9080         we actually unwrap the expression to allow for extra information
9081         to be extracted. 
9082
9083         * expression.cs: Use Shr_Un on unsigned operations. 
9084
9085 2002-05-08  Ravi Pratap  <ravi@ximian.com>
9086
9087         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
9088         applicable operators was not being considered correctly. This closes
9089         the bug Miguel reported.
9090
9091 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
9092
9093         * attribute.cs: check that the type derives from System.Attribute
9094         and report the correct error in that case (moved the duplicate code to
9095         its own method, too).
9096
9097 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
9098
9099         * attribute.cs: lookup attribute type name as the spec says: first the
9100         bare attribute name and then name + "Attribute" (nant compiles with
9101         mcs after this fix).
9102
9103 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
9104
9105         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
9106         Because of the way we parse things, we should try to see if a
9107         UIntConstant can fit in an integer.
9108
9109 2002-05-07  Ravi Pratap  <ravi@ximian.com>
9110
9111         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
9112         when we are in an explicit context.
9113
9114         (ConvertReferenceExplicit): When converting from Iface type S to Class
9115         T make sure the rules are implemented as an OR.
9116
9117         * parameter.cs (ParameterType): Make it a property for now although the
9118         purpose really isn't anything immediate.
9119
9120         * expression.cs (Is*Applicable): Do better checking on the parameter type
9121         of a ref/out parameter. The ones from the system assemblies are already 
9122         marked with the correct type so we don't need to do any correction.
9123
9124         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
9125         the object type is standard too so include that.
9126
9127 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9128
9129         * ecore.cs (StandardConversionExists): Augment with missing code:
9130         deal with IntConstant, LongConstants and Enumerations.
9131
9132         * assign.cs: Report the error, instead of failing silently
9133
9134         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
9135         typecontainer that they are declared, because the
9136         typecontainer/namespace will have the list of using clauses that
9137         need to be applied.
9138
9139         Assembly Attributes were escaping the normal registration
9140         mechanism. 
9141
9142         (EmitCode): Apply attributes within an EmitContext that represents
9143         the container they were declared on.
9144
9145         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
9146
9147 2002-05-06  Ravi Pratap  <ravi@ximian.com>
9148
9149         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
9150         Revamp completely - make much cleaner as we now operate only
9151         on a set of Types.
9152
9153         (FindMostSpecificSource, FindMostSpecificTarget): New methods
9154         to implement the logic detailed in the spec more correctly.
9155
9156         (UserDefinedConversion): Update accordingly.
9157
9158 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9159
9160         * statement.cs: Return flow analysis information up.
9161
9162         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
9163         and the default.
9164
9165         (token): Do not consume an extra character before calling
9166         decimal_digits.
9167
9168 2002-05-06  Piers Haken <piersh@friskit.com>
9169
9170         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
9171
9172 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9173
9174         * class.cs (Constructor.Emit): Set the IsStatic flag in the
9175         EmitContext during the instance constructor initializer
9176         resolution, to stop access to instance variables.
9177
9178         This is mandated by the spec, last paragraph of the `constructor
9179         initializers' section. 
9180
9181 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
9182
9183         * cs-parser.jay, class.cs (Accessor): new class used to represent
9184         an accessor (get or set).  In the past we used `null' to represent
9185         a missing accessor.  But this is ambiguous because there was no
9186         way to tell in abstract indexers/properties if one of them was
9187         specified.
9188
9189         Now there is a way of addressing that.
9190
9191         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
9192         instead of FindMembers.
9193
9194         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
9195         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
9196
9197         * attribute.cs: Treat indexers and properties as the same in terms
9198         of applying attributes
9199
9200         * ecore.cs (FindMostEncompassedType): Use statically initialized
9201         EmptyExpressions()s like we do elsewhere to avoid creating useless
9202         objects (and we take this out of the tight loop).
9203
9204         (GetConversionOperators): Move the code to extract the actual
9205         operators to a separate routine to clean things up.
9206
9207 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
9208
9209         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
9210         events are always registered FieldBuilders.
9211
9212         * class.cs (FieldBase): New class shared by Fields 
9213
9214         * delegate.cs: If we are a toplevel delegate, use our full name.
9215         If we are a nested delegate, then only use our tail name.
9216
9217 2002-05-02  Ravi Pratap  <ravi@ximian.com>
9218
9219         * expression.cs (IsApplicable): Ensure that we add the "&" to
9220         ref/out types before comparing it with the type of the argument.
9221
9222         (IsParamsMethodApplicable): Ditto.
9223
9224         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
9225         silly me ;-)
9226
9227         * delegate.cs : Handle the case when we have more than one applicable
9228         method. Flag an error only when we finish checking all.
9229
9230 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
9231
9232         * expression.cs: Add support for boolean static initializers.
9233
9234 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
9235
9236         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
9237
9238         * parameter.cs (ComputeParameterTypes,
9239         ComputeAndDefineParameterTypes): Better error handling: now we
9240         clear the `types' cache if we fail during any of the type lookups.
9241         We also return the status code correctly to our caller
9242
9243         * delegate.cs: If we fail to define a delegate, abort the extra
9244         steps. 
9245
9246         * expression.cs (Binary.ResolveOperator): for
9247         operator==(object,object) and operator !=(object, object) we also
9248         have to verify that there is an implicit conversion from one to
9249         the other.
9250
9251         (ArrayAccess.DoResolve): Array Access can operate on
9252         non-variables. 
9253
9254 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
9255
9256         * assign.cs (CompoundAssign): A new class used as a "flag" that
9257         the assignment actually is happening as part of a compound
9258         assignment operator.
9259
9260         During compound assignment, a few new rules exist to enable things
9261         like:
9262
9263         byte b |= 1 + 2
9264
9265         From the spec:
9266
9267         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
9268         to the type of x) if y is implicitly convertible to the type of x,
9269         and the operator is a builtin operator and the return type of the
9270         operator is explicitly convertible to the type of x. 
9271
9272         * rootcontext.cs: Reset warning level to 2.  4 catches various
9273         "interesting" features in mcs, we must clean this up at some
9274         point, but currently am trying to kill other bugs ;-)
9275
9276         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
9277         in container classes as well.  
9278
9279         * expression.cs (Binary.ResolveOperator): Handle string case
9280         before anything else (as operator overloading does emit an error
9281         before doing anything else).
9282
9283         This code could go away when we move to a table driven model, but
9284         i could not come up with a good plan last night.
9285
9286 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
9287
9288         * typemanager.cs (CSharpName): reimplementation using regex.
9289         * class.cs: added null check for fields in Emit
9290         * rootcontext.cs: set warninglevel to 4
9291
9292 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
9293
9294         * typemanager.cs (CSharpName): reimplemented with Lupus
9295         suggestion.
9296
9297 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
9298
9299         * statement.cs (If): correclty implement Resolve, because we were
9300         not catching sem errors in there.  The same process is needed
9301         everywhere else. 
9302         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
9303
9304
9305         (Statement.Warning_DeadCodeFound): Factorize code.
9306         (While): Report dead code here too.
9307
9308         (Statement): Added Resolve virtual method to allow
9309         for resolution split from the emit code.
9310
9311 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
9312
9313         * statement.cs (EmitBoolExpression): No longer try to resolve the
9314         expression here.    
9315         (MakeBoolean): New utility function that resolve, implicitly
9316         converts to boolean and tags the expression. 
9317
9318
9319         (If, Do): Implement dead code elimination.
9320         (While): Implement loop inversion
9321
9322         (Do, While, For, If): Resolve the expression prior to calling our
9323         code generation.
9324
9325 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
9326
9327         * class.cs:
9328           - added method Report28 (warning: program has more than one entry point)
9329           - added method IsEntryPoint, implements paragraph 10.1 of the spec
9330           - modified method Method.Define, the part at the end of the method
9331
9332         * rootcontext.cs: added static public Location EntryPointLocation;
9333           
9334         * ../errors/cs0028.cs : Add test case for the above warning.              
9335
9336         * typemanager.cs:
9337           - modified method CSharpName to allow arrays of primitive type to
9338             be printed nicely (e.g. instead of System.Int32[][] it now prints
9339             int[][])
9340           - added method CSharpSignature: returns the signature of a method
9341             in string format to be used in reporting errors, warnings, etc.
9342
9343         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
9344         with String.Empty.
9345
9346 2002-04-26  Ravi Pratap  <ravi@ximian.com>
9347
9348         * delegate.cs (Define): Fix extremely silly bug where I was
9349         setting the type of the 'object' parameter of the BeginInvoke
9350         method to System.IAsyncResult instead of System.Object ;-)
9351
9352 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
9353
9354         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
9355         here. 
9356
9357         (Constructor.Emit): return if we fail to initialize the
9358         constructor.  Another door closed!  
9359
9360         * expression.cs (New.DoResolve): Improve error message (from -6 to
9361         1501).  Use DeclaredOnly lookup to find the exact constructor.
9362
9363         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
9364         loop.  This is useful.
9365
9366         * cs-parser.jay: Adjust the default parameters so that destructors
9367         have the proper signature.
9368
9369 2002-04-26  Martin Baulig  <martin@gnome.org>
9370
9371         * driver.cs (LoadAssembly): If `assembly' contains any characters
9372         which are only valid in path names and not in assembly names
9373         (currently slash, backslash and point), use Assembly.LoadFrom ()
9374         instead of Assembly.Load () on the `assembly' (before iteration
9375         over the link_paths).
9376
9377 2002-04-26  Martin Baulig  <martin@gnome.org>
9378
9379         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
9380
9381 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
9382
9383         * class.cs (Property): use the new typemanager.MemberLookup
9384
9385         (TypeContainer.MemberLookup): Implement using the
9386         TypeManager.MemberLookup now. 
9387
9388         * typemanager.cs: Make MemberLookup a function of the TypeManager,
9389         and return MemberInfos, so that these can be used without an
9390         EmitContext (what we had before).
9391
9392 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
9393
9394         * expression.cs: Fix the case where the argument to params if the
9395         type of the params.  I omitted handling this before.   Fixed
9396
9397 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9398
9399         * driver.cs: Call BootCorlib_PopulateCoreType
9400
9401         * class.cs (Property.CheckBase): Check for properties only, not
9402         for all members. 
9403
9404         * interface.cs: Temporary hack: try/catch around the
9405         CustomAttributeBuilder, because I am getting an exception that I
9406         do not understand.
9407
9408         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
9409         types whose definitions are required to be there (attributes are
9410         defined before standard types).
9411
9412         Compute definitions as we boot the various types, as they are used
9413         immediately (value_type class will need object_type, but if we do
9414         not initialize object_type, we will pass a null, which will let
9415         the runtime pick the System.Object from the existing corlib, which
9416         is not what we want).
9417
9418 2002-04-22  Patrik Torstensson <totte@labs2.com>
9419
9420         * cs-tokenizer.cs: fixed a number of trim() issues.
9421
9422 2002-04-22  Ravi Pratap  <ravi@ximian.com>
9423
9424         * expression.cs (Argument.Type): Ensure that we return the correct
9425         type when we have out or ref parameters [in which case we 
9426         append a "&"].
9427
9428 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
9429
9430         * class.cs (Property, Indexer): Allow extern modifier in there. 
9431
9432         * typemanager.cs (InitBaseTypes): Initializes object_type and
9433         value_type, since those will be used early on during the bootstrap
9434         process to compile corlib.
9435
9436         (InitCoreTypes): Move code from here to InitBaseTypes.
9437
9438 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
9439
9440         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
9441         single-dimension arrays as using the ldlen opcode.  
9442
9443         Daniel Lewis discovered this optimization.  
9444
9445         * typemanager.cs: Add signature for System.Array::get_Length
9446
9447 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9448
9449         * statement.cs: report the error when the foreach does not apply to an
9450         array nor a collection.
9451
9452 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
9453
9454         * expression.cs: Add implicit conversions to the operator ~.
9455
9456         * constant.cs (DecimalConstant.Emit): Emit decimal value.
9457
9458         * typemanager.cs: Locate the decimal constructor.
9459
9460 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9461
9462         * attribute.cs: use the new property of TypeOf.
9463         * expression.cs: added 'get' property around typearg.
9464
9465         These changes fix a build breaker reported by NickD. Is this the
9466         correct way to fix?  If not, please, revert my changes and make it
9467         work :-).
9468
9469 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
9470
9471         * attribute.cs: Add support for typeof in attribute invocations.
9472         I am not sure that this is right though.
9473
9474 2002-04-14  Duncan Mak  <duncan@ximian.com>
9475
9476         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
9477         Binary.Operator.Division case.
9478
9479 2002-04-13  Ravi Pratap  <ravi@ximian.com>
9480
9481         * class.cs (DefineType): Ensure that we do a proper check on
9482         attribute types and also register it with the TypeManager.
9483
9484         (TypeContainer.Targets): The default for attribute types is
9485         AttributeTargets.All.
9486
9487         * attribute.cs (ApplyAttributes): Registering the attribute type
9488         is done elsewhere, not when we discover we have a Usage attribute.
9489
9490 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9491
9492         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
9493         and get rid of is_delegate parameter.
9494
9495         * everywhere : update.
9496
9497 2002-04-12  Ravi Pratap  <ravi@ximian.com>
9498
9499         * cs-parser.jay (compilation_unit): Revamp completely to use
9500         some new ideas that I got from Rhys' grammar to solve the problems
9501         with assembly level attributes.
9502
9503         (outer_declaration): New grammar production.
9504
9505         (attribute_sections): Add.
9506
9507         (opt_attributes): Base on attribute_sections
9508
9509         (namespace_declaration): Allow opt_attributes to tackle the case
9510         when we have assembly level attributes - we are clever in this
9511         regard now ;-)
9512
9513         * attribute.cs (ApplyAttributes): Do not worry about assembly 
9514         attributes in the non-global context.
9515
9516         * rootcontext.cs (AddGlobalAttributes): Go back to using this
9517         instead of SetGlobalAttributes.
9518
9519         * class.cs, rootcontext.cs : Ensure we define and generate 
9520         attribute types before anything else.
9521
9522         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
9523         and flag the new error -20 for the case when the attribute type
9524         does not have valid targets specified. csc does not catch this.
9525
9526         * ../errors/errors.txt : update for error # -20
9527
9528 2002-04-11  Ravi Pratap  <ravi@ximian.com>
9529
9530         * support.cs (InternalParameters.ParameterModifier): Do some null
9531         checking and return sane values.
9532
9533         * class.cs (Method.Define): If we are a PInvoke method, ensure
9534         that we are static and extern. Report error # 601
9535
9536         * ../errors/cs0601.cs : Add test case for the above error.
9537
9538 2002-04-07  Ravi Pratap  <ravi@ximian.com>
9539
9540         * rootcontext.cs (attribute_types): We need to keep type of
9541         all attribute types separately and emit code for them first.
9542
9543         (RegisterAttribute) : Implement.
9544
9545         * class.cs (DefineType): Check if the current Type is a custom
9546         attribute type and register it accordingly.
9547
9548         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
9549         adding the first attribute twice and rename to
9550
9551         (SetGlobalAttributes): this.
9552
9553         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
9554         lookups.
9555
9556         * attribute.cs (ApplyAttributes): Take an additional argument telling us
9557         if we are processing global arguments. Hmm, I am unsure of this.
9558
9559 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9560
9561         * expression.cs: added static array of strings to avoid calling
9562         Enum.ToString () for Operator in Binary. Significant recover of
9563         performance.
9564
9565 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
9566
9567         * class.cs (FindMembers): Allow the Builders of the various
9568         members to be null.  If they are skip them.  This only happens
9569         during the PInvoke declaration.
9570
9571 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
9572
9573         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
9574         failure, so we do not keep going afterwards.
9575
9576         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
9577         wanted to pass `false' as the `is_delegate' argument.  If this is
9578         the case, why not use delegate_type == null to mean `is_delegate =
9579         false' and anything else as is_delegate = true.
9580
9581 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
9582
9583         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
9584         code for the section, not the beginning of the tests.
9585
9586 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
9587
9588         * cfold.cs: Handle operator + (Enum x, Underlying x) 
9589
9590         * expression.cs (Binary): same.  Warn about errors where we have
9591         Enum/Enum in operator + as well.
9592
9593 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
9594
9595         * statement.cs:
9596                 - added support for switch(bool)
9597                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
9598                 - add TableSwitchEmit() to handle table-based switch statements
9599
9600 2002-04-05  Ravi Pratap  <ravi@ximian.com>
9601
9602         * expression.cs (Invocation.OverloadResolve): Factor out code which
9603         does parameter compatibility checking with arguments so that we can 
9604         re-use the code even from Delegate.VerifyApplicability
9605
9606         (VerifyArgumentsCompat): Move above code here.
9607
9608         * delegate.cs (VerifyApplicability): Get rid of duplicate code
9609         and instead make a call to the above method.
9610
9611 2002-03-31  Ravi Pratap  <ravi@ximian.com>
9612
9613         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
9614         We use it to keep track of classes which are attribute types.
9615
9616 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
9617
9618         * delegate.cs (Delegate.Define): Correctly define the types in the
9619         presence of fixed and array parameters.
9620
9621         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
9622         doing FindMembers.
9623
9624         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
9625         include NonPublic after the first iteration.
9626
9627         * class.cs (Indexer.CheckBase): Only check if both parents are
9628         non-null. 
9629
9630         * cs-parser.jay (accessor_body): If empty, set to null.
9631
9632         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
9633         same code path here to resolve constants names that we did have in
9634         MemberAccess.DoResolve.  There is too much code duplicated here.
9635
9636 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
9637
9638         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
9639
9640         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
9641         to MakeUnionSet.
9642
9643         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
9644         tokens, numbers and strings.
9645
9646         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
9647         parenthesis.
9648
9649         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
9650         asyncronous parameters and the regular parameters.  
9651
9652         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
9653         specify the target directory.
9654
9655         * expression.cs: (This.DoResolve): Simplify
9656         (As.Emit): Optimize, do not generate IsInst if the expression is
9657         always of the given type.
9658
9659         (Is.DoResolve): Bug fix, we were reporting both always/never for
9660         the is expression.
9661
9662         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
9663         creating too many unnecessary arrays.
9664
9665 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
9666
9667         * class.cs (EmitFieldInitializer): Use Assign expression to assign
9668         fields instead of rolling our own initializer.   Takes care of all
9669         implicit conversions, and drops unnecessary static checks/argument.
9670
9671 2002-03-31  Dick Porter  <dick@ximian.com>
9672
9673         * driver.cs: use the GetDirectories() return values properly, and
9674         use "/" as path separator.
9675
9676 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
9677
9678         * expression.cs (Unary): Optimize - - expr into expr.
9679         (Binary): Optimize a + (-b) into a -b.
9680
9681         * codegen.cs (CodeGen): Made all methods static.
9682
9683 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
9684
9685         * rootcontext.cs: 
9686
9687         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
9688         TypeBuilder property.
9689
9690         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
9691         instead. 
9692
9693         * tree.cs: Removed the various RecordXXXX, and replaced with a
9694         single RecordDecl.  Removed all the accessor methods, and just
9695         left a single access point Type 
9696
9697         * enum.cs: Rename DefineEnum to DefineType.
9698
9699         * decl.cs: New abstract method `DefineType' used to unify the
9700         Defines for Enumerations, Interfaces, TypeContainers and
9701         Delegates.
9702
9703         (FindType): Moved LookupInterfaceOrClass here.  Moved the
9704         LookupBaseClasses method that used to live in class.cs and
9705         interface.cs here, and renamed to FindType.
9706
9707         * delegate.cs: Implement DefineType.  Take advantage of the
9708         refactored pattern for locating the parent builder without taking
9709         the parent_builder argument (which we know does not work if we are
9710         nested, and triggering a toplevel definition).
9711
9712 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9713
9714         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
9715         accessibility of a member has changed during override and report
9716         an error if so.
9717
9718         * class.cs (Method.Define, Property.Define): Only complain on
9719         overrides if the method is private, any other accessibility is
9720         fine (and since we just checked the permission is the same, we are
9721         good to go).
9722
9723         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
9724         and elif are processed always.  The other pre-processing
9725         directives are only processed if we are "taking" the path
9726
9727 2002-03-29  Martin Baulig  <martin@gnome.org>
9728
9729         * class.cs (Method.Emit): Only emit symbolic debugging info if the
9730         current location is not Null.
9731
9732         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
9733         a separate method so we can profile it.
9734
9735         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
9736         `span.Seconds' are just seconds, but no minutes or hours.
9737         (MainDriver): Profile the CodeGen.SaveSymbols calls.
9738
9739 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9740
9741         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
9742         Remove the gratuitous set of Final:
9743
9744                                 // If an interface implementation, then we can set Final.
9745                                 if (((flags & MethodAttributes.Abstract) == 0) &&
9746                                     implementing.DeclaringType.IsInterface)
9747                                         flags |= MethodAttributes.Final;
9748
9749         I do not know what I was smoking when I used that.
9750
9751
9752         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
9753         step into fixing the name resolution issues for delegates and
9754         unifying the toplevel name resolution.
9755
9756 2002-03-28  Martin Baulig  <martin@gnome.org>
9757
9758         * class.cs (Method.Emit): If we have a symbol writer, call its
9759         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
9760         tell it about the current method.
9761
9762         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
9763         writer that we're going to emit the first byte of IL code for a new
9764         statement (a new source line).
9765         (EmitContext.EmitTopBlock): If we have a symbol writer, call
9766         EmitContext.Mark() before emitting any code.
9767
9768         * location.cs (SymbolDocument): Return null when we're Null.
9769
9770         * statement.cs (Statement): Moved the `Location loc' variable here.
9771         (Statement.EmitBoolExpression): If we have a symbol writer, call
9772         ec.Mark() before emitting any code to tell it that we're at the
9773         beginning of a new statement.
9774         (StatementExpression): Added `Location' argument to the constructor.
9775         (Block): Added public readonly variable `StartLocation' and public
9776         variable `EndLocation'.  The latter is to be set using SetEndLocation().
9777         (Block): Added constructor which takes a start and end location.
9778         (Block.SetEndLocation): New method. This sets the end location.
9779         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
9780         local variables we create.
9781         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
9782         each statement and do also mark the begin and end of the block.
9783
9784         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
9785         tell it the current lexer.Location, use Location.Null for the end of the
9786         block.
9787         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
9788         current block, set its end location using SetEndLocation().
9789         (statement_expression): StatementExpression constructor now takes the
9790         lexer.Location as additional argument.
9791         (for_statement, declare_local_variables): Likewise.
9792         (declare_local_variables): When creating a new implicit block, use the
9793         new Block constructor and pass it the lexer.Location.
9794
9795 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
9796
9797         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
9798         members also on the parent interfaces recursively.
9799
9800 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
9801
9802         * report.cs: Use new formats, since Gonzalo finished the missing
9803         bits. 
9804
9805         * expression.cs (Binary.ResolveOperator): added missing operator|
9806         operator& and operator^ for bool/bool.
9807
9808         * cs-parser.jay: CheckDef now takes a Location argument that is
9809         used to report errors more precisly (instead of reporting the end
9810         of a definition, we try to track something which is a lot closer
9811         to the source of the problem).
9812
9813         * cs-tokenizer.cs: Track global token use, so we can properly flag
9814         the use of #define/#undef after the first token has been seen.
9815
9816         Also, rename the reportXXXX to Error_DescriptiveName
9817
9818         * decl.cs (DeclSpace.IsTopLevel): Move property here from
9819         TypeContainer, so that Enum and Interface can use this too.
9820
9821         * class.cs (TypeContainer.LookupInterfaceOrClass,
9822         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
9823         `builder' argument.  Typically this was used to pass the parent
9824         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
9825         the definition).  
9826
9827         The problem is that a nested class could trigger the definition of
9828         a toplevel class, and the builder would be obviously wrong in that
9829         case. 
9830
9831         So we drop this argument, and we compute dynamically the
9832         TypeBuilder/ModuleBuilder (the correct information was available
9833         to us anyways from DeclSpace.Parent)
9834
9835         * interface.cs (Interface.DefineInterface): Drop builder
9836         parameter cleanup like class.cs
9837
9838         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
9839         like class.cs
9840
9841         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
9842         values. 
9843
9844         (Try.Emit): Propagate the returns value from the statement.
9845
9846         (Return.Emit): Even if we are leavning 
9847
9848         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
9849
9850         * modifiers.cs: Fix the computation of MethodAttributes flags.
9851
9852 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
9853
9854         * driver.cs: allow compilation of files that start with '/'.
9855         Add a default case when checking the argument of --target.
9856
9857 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
9858
9859         * interface.cs: Implement the same search algorithm for types in
9860         the interface code.
9861
9862         * delegate.cs: Do not allow multiple definition.
9863
9864         * Recovered ChangeLog that got accidentally amputated
9865
9866         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
9867
9868         * rootcontext.cs: Load manually enum to allow core classes to
9869         contain enumerations.
9870
9871         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
9872         Update to new static methods in TypeManager.
9873
9874         * typemanager.cs (GetMethod, GetConstructor): Use our
9875         implementation of FindMembers to find the members, since during
9876         corlib compilation, the types are TypeBuilders and GetMethod and
9877         GetConstructor do not work.
9878
9879         Make all methods in TypeManager static.
9880
9881         (InitCodeHelpers): Split the functionality from
9882         the InitCodeTypes function.
9883
9884         * driver.cs: Call InitCodeHelpers after we have populated the
9885         types. 
9886
9887         * cs-parser.jay (delegate_declaration): we did not used to compute
9888         the delegate name correctly for void delegates.
9889
9890 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
9891
9892         * rootcontext.cs (RootContext): Init the interface_resolve_order
9893         and type_container_resolve_order always.
9894
9895         (ResolveCore, BootstrapCorlib_ResolveClass,
9896         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
9897         compiler when compiling with --nostdlib
9898
9899         * class.cs (TypeContainer.DefineType): Check that our parent is
9900         not null.  This test is most important when we are bootstraping
9901         the core types.
9902
9903         * codegen.cs: Split out the symbol writing code.
9904
9905 2002-03-25  Martin Baulig  <martin@gnome.org>
9906
9907         * driver.cs (-g): Made -g an alias for --debug.
9908
9909 2002-03-24  Martin Baulig  <martin@gnome.org>
9910
9911         * codegen.cs (SymbolWriter): New public variable. Returns the
9912         current symbol writer.
9913         (CodeGen): Added `bool want_debugging_support' argument to the
9914          constructor. If true, tell the ModuleBuild that we want debugging
9915         support and ask it for the ISymbolWriter.
9916         (Save): If we have a symbol writer, call it's Close() method after
9917         saving the assembly.
9918
9919         * driver.c (--debug): New command line argument to create a
9920         debugger information file.
9921
9922         * location.cs (SymbolDocument): New public property. Returns an
9923         ISymbolDocumentWriter object for the current source file or null
9924         if we don't have a symbol writer.
9925
9926 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
9927
9928         * driver.cs (LoadAssembly): Correctly return when all the paths
9929         have been tried and not before.
9930
9931         * statement.cs (Switch.Emit): return the actual coverage for this
9932         statement (returns/not-returns)
9933
9934         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
9935         switch of the statement if we are the last switch section.  That
9936         kills two problems: try/catch problems (we used to emit an empty
9937         nop at the end) and switch statements where all branches would
9938         return. 
9939
9940 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
9941
9942         * driver.cs: Add default assemblies (the equivalent to the
9943         Microsoft CSC.RSP file)
9944
9945         * cs-tokenizer.cs: When updating `cols and setting it to zero,
9946         also update tokens_seen and set it to false.
9947
9948         * driver.cs: Implement --recurse for Mike.
9949
9950         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
9951         correctly splitting out the paths.
9952
9953 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
9954
9955         * interface.cs (Interface.PopulateProperty): Instead of using
9956         `parent' as the declaration space for the set parameters, use
9957         `this' 
9958
9959         * support.cs (InternalParameters): InternalParameters constructor
9960         takes a DeclSpace instead of a TypeContainer.
9961
9962         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
9963         types are being initialized, load the address of it before calling
9964         the function.  
9965
9966         (New): Provide a mechanism to disable the generation of local
9967         value type temporaries when the caller will be providing us with
9968         an address to store it.
9969
9970         (ArrayCreation.EmitDynamicInitializers): Use it.
9971
9972 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
9973
9974         * expression.cs (Invocation.EmitArguments): Only probe for array
9975         property if there is more than one argument.  Sorry about that.
9976
9977         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
9978         empty param arrays.
9979
9980         * class.cs (Method.LabelParameters): Fix incorrect code path that
9981         prevented the `ParamArrayAttribute' from being applied to the
9982         params attribute.
9983
9984 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
9985
9986         * support.cs (ReflectionParameters): Correctly compute whether the
9987         last argument is a params array.  Fixes the problem with
9988         string.Split ('a')
9989
9990         * typemanager.cs: Make the assemblies array always be non-null
9991         (empty, but non-null)
9992
9993         * tree.cs (RecordDecl): New function that abstracts the recording
9994         of names.  This reports error 101, and provides a pointer to the
9995         previous declaration.  Fixes a crash in the compiler.
9996
9997         * cs-parser.jay (constructor_declaration): Update to new grammar,
9998         and provide a constructor_body that can be empty.
9999
10000 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
10001
10002         * driver.cs: Add support for --resources.
10003
10004         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
10005         Make all types for the various array helper methods be integer.
10006
10007         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
10008         CheckState to ConvCast.
10009
10010         (ConvCast): Now it takes a `checked' state argument, to avoid
10011         depending on the emit context for the conversion, and just using
10012         the resolve time setting.
10013
10014         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
10015         instead of Invocation.EmitArguments.  We do not emit the original
10016         arguments, instead we emit those which have been converted to
10017         unsigned int expressions.
10018
10019         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
10020
10021         * codegen.cs: ditto.
10022
10023         * expression.cs (LocalVariableReference): Drop the use of the
10024         Store function that depended on the variable index.
10025
10026         * statement.cs (VariableInfo): Drop the `Idx' property from this
10027         class, as this is not taking into account the indexes for
10028         temporaries tat we generate during the execution, getting the
10029         indexes wrong.
10030
10031         * class.cs: First emit class initializers, then call the parent
10032         constructor. 
10033
10034         * expression.cs (Binary): Fix opcode emision.
10035         (UnaryMutator.EmitCode): Support checked code generation
10036
10037         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
10038         matches for events for both the Static and Instance scans,
10039         pointing to the same element.   Fix that.
10040
10041 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
10042
10043         * rootcontext.cs (ResolveTree): Always set the
10044         interface_resolve_order, because nested interfaces will be calling
10045         into us.
10046
10047         * class.cs (GetInterfaceOrClass): Track the same resolution
10048         process used by TypeManager.LookupType.  This fixes the nested
10049         type lookups in class declarations (separate path from
10050         LookupType). 
10051
10052         (TypeContainer.DefineType): Also define nested interfaces.
10053         (TypeContainer.RegisterOrder): New public function used to
10054         register the order in which child interfaces need to be closed.
10055
10056         Nested interfaces need to be closed after their parents have been
10057         created. 
10058
10059         * interface.cs (InterfaceAttr): Put all the logic for computing
10060         the interface attribute here. 
10061
10062         (DefineInterface): Register our interface order with the
10063         RootContext or with the TypeContainer depending on the case.
10064
10065 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10066
10067         * cs-parser.jay: rework foreach statement to work with the new
10068         changes to the policy on SimpleNames.
10069
10070         * report.cs: support Stacktrace on warnings as well.
10071
10072         * makefile: drop --unsafe and /unsafe from the compile.
10073
10074 2002-03-13  Ravi Pratap  <ravi@ximian.com>
10075
10076         * ecore.cs (StandardConversionExists): Modify to take an Expression
10077         as the first parameter. Ensure we do null -> reference type conversion
10078         checking.
10079
10080         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
10081         temporary Expression objects.
10082
10083 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
10084
10085         * interface.cs: workaround bug in method overloading resolution
10086         (there is already a bugzilla bug for it).
10087
10088 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10089
10090         We could also solve this problem by having a separate path for
10091         performing type lookups, instead of DoResolve, we could have a
10092         ResolveType entry point, and only participating pieces of the
10093         production (simplename, deref, array) would implement this. 
10094
10095         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
10096         signal SimpleName to only resolve type names and not attempt to
10097         resolve anything else.
10098
10099         * expression.cs (Cast): Set the flag.
10100
10101         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
10102
10103         * class.cs: Only report 108 if there is no `new' modifier.
10104
10105         * cs-parser.jay: rework foreach statement to work with the new
10106         changes to the policy on SimpleNames.
10107
10108         * report.cs: support Stacktrace on warnings as well.
10109
10110         * makefile: drop --unsafe and /unsafe from the compile.
10111
10112 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
10113
10114         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10115         lookups here, instead of doing that at parse time.  This means
10116         that our grammar will not introduce `LocalVariableReferences' as
10117         expressions at this point.  That solves the problem of code like
10118         this:
10119
10120         class X {
10121            static void Main ()
10122            { int X = 1;
10123             { X x = null }}}
10124
10125         This is only half the fix.  The full fix requires parameters to
10126         also be handled in this way.
10127
10128         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
10129         makes the use more obvious of the DeclSpace.  The
10130         ec.TypeContainer.TypeBuilder is now only used to pull the
10131         TypeBuilder for it.
10132
10133         My theory is that I can get rid of the TypeBuilder completely from
10134         the EmitContext, and have typecasts where it is used (from
10135         DeclSpace to where it matters).  
10136
10137         The only pending problem is that the code that implements Aliases
10138         is on TypeContainer, and probably should go in DeclSpace.
10139
10140         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10141         lookups here, instead of doing that at parse time.  This means
10142         that our grammar will not introduce `LocalVariableReferences' as
10143         expressions at this point.  That solves the problem of code like
10144         this:
10145
10146         class X {
10147            static void Main ()
10148            { int X = 1;
10149             { X x = null }}}
10150
10151         This is only half the fix.  The full fix requires parameters to
10152         also be handled in this way.
10153
10154         * class.cs (Property.DefineMethod): When implementing an interface
10155         method, set newslot, when implementing an abstract method, do not
10156         set the flag (before we tried never setting it, or always setting
10157         it, which is the difference).
10158         (Indexer.DefineMethod): same.
10159         (Method.DefineMethod): same.
10160
10161         * ecore.cs: Only set the status used flag if we get back a Field.
10162
10163         * attribute.cs: Temporary hack, so Paolo can keep working.
10164
10165 2002-03-08  Ravi Pratap  <ravi@ximian.com>
10166
10167         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
10168         the unmanaged type in the case we have a MarshalAs attribute.
10169
10170         (Resolve): Handle the case when we are parsing the special MarshalAs
10171         attribute [we need to store the unmanaged type to use later]
10172
10173         * typemanager.cs (marshal_as_attr_type): Built in type for the 
10174         MarshalAs Attribute.
10175
10176         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
10177         on parameters and accordingly set the marshalling info.
10178
10179 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
10180
10181         * class.cs: Optimizing slightly by removing redundant code after
10182         we switched to the `NoTypes' return value.
10183         (Property.DefineMethod): use NoTypes here too.
10184
10185         This fixes the bug I introduced in my last batch of changes.
10186
10187 2002-03-05  Ravi Pratap  <ravi@ximian.com>
10188
10189         * tree.cs (RecordEnum): Add. We now keep track of enums too.
10190
10191         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
10192         Enums since those are types too. 
10193
10194         * cs-parser.jay (enum_declaration): Record enums as we parse them.
10195
10196         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
10197         thanks to a call during the lookup process.
10198
10199 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
10200
10201         * statement.cs (Foreach): Lots of work to accomodate a particular
10202         kind of foreach statement that I had not kept in mind.  It is
10203         possible to have foreachs on classes that provide a GetEnumerator
10204         method that return objects that implement the "pattern" for using
10205         a foreach, there is no need to support GetEnumerator
10206         specifically. 
10207
10208         This is needed to compile nant.
10209
10210         * decl.cs: Only report 114 if the member is not `Finalize' and if
10211         the warning level is at least 2.
10212
10213         * class.cs: Moved the compare function from Method to
10214         MethodSignature. 
10215
10216         (MethodSignature.InheritableMemberSignatureCompare): Add new
10217         filter function that is used to extract inheritable methods from a
10218         class. 
10219
10220         (Method.Define): Use the new `inheritable_method_signature_filter'
10221         delegate
10222
10223         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
10224         command. 
10225
10226 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
10227
10228         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
10229
10230         * cs-parser.jay: Add opt_semicolon to the interface declaration.
10231
10232         * expression.cs: Pass location information to
10233         ConvertImplicitStandard. 
10234
10235         * class.cs: Added debugging code to track return values from
10236         interfaces. 
10237
10238 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
10239
10240         * expression.cs (Is.DoResolve): If either side of the `is' is an
10241         interface, do not flag the warning.
10242
10243         * ecore.cs (ImplicitReferenceConversion): We need a separate test
10244         for interfaces
10245
10246         * report.cs: Allow for --fatal to be used with --probe.
10247
10248         * typemanager.cs (NoTypes): Move the definition for the empty Type
10249         array here. 
10250
10251         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
10252         properties. 
10253         (TypeContainer.DefineProxy): New function used to proxy to parent
10254         implementations when implementing interfaces.
10255         (TypeContainer.ParentImplements): used to lookup if our parent
10256         implements a public function that is required by an interface.
10257         (TypeContainer.VerifyPendingMethods): Hook this up.
10258
10259         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
10260         `modules' and `assemblies' arraylists into arrays.  We only grow
10261         these are the very early start up of the program, so this improves
10262         the speedof LookupType (nicely measured).
10263
10264         * expression.cs (MakeByteBlob): Replaced unsafe code with
10265         BitConverter, as suggested by Paolo.
10266
10267         * cfold.cs (ConstantFold.Binary): Special case: perform constant
10268         folding of string concatenation, but if either side is a string,
10269         and the other is not, then return null, and let the runtime use
10270         the concatenation on the string plus the object (using
10271         `Object.ToString'). 
10272
10273 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
10274
10275         Constant Folding has been implemented now.
10276
10277         * expression.cs (Unary.Reduce): Do not throw an exception, catch
10278         the error instead on types that are not supported in one's
10279         complement. 
10280
10281         * constant.cs (Constant and all children): New set of functions to
10282         perform implict and explicit conversions.
10283
10284         * ecore.cs (EnumConstant): Implement the new functions to perform
10285         conversion by proxying to the child expression.
10286
10287         * codegen.cs: (ConstantCheckState): Constant evaluation has its
10288         own separate setting that can not be turned off from the command
10289         line using --unchecked or --checked and is only controlled using
10290         the checked/unchecked statements and expressions.  This setting is
10291         used by the constant folder to flag errors.
10292
10293         * expression.cs (CheckedExpr, UncheckedExpr): Set the
10294         ConstantCheckState as well.   
10295
10296         During Resolve, they also have to flag the state, because the
10297         constant folder runs completely in the Resolve phase.
10298
10299         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
10300         well.
10301
10302 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
10303
10304         * cfold.cs: New file, this file contains the constant folder.
10305
10306         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
10307         argument to track whether we are using the resulting address to
10308         load or store a value and provide better error messages. 
10309
10310         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
10311         new AddressOf arguments.
10312
10313         * statement.cs (Foreach.EmitCollectionForeach): Update
10314
10315         * expression.cs (Argument.Emit): Call AddressOf with proper
10316         arguments to track usage.
10317
10318         (New.DoEmit): Call AddressOf with new arguments.
10319
10320         (Unary.Emit): Adjust AddressOf call.
10321
10322 2002-03-01  Ravi Pratap  <ravi@ximian.com>
10323
10324         * cs-parser.jay (member_access): Change the case for pre-defined types
10325         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
10326         this suggestion.
10327
10328         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
10329         a method body.
10330
10331         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
10332         essentially like methods and apply attributes like MethodImplOptions to them too.
10333
10334         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
10335         not being null.
10336
10337         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
10338         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
10339         is the DeclSpace.
10340
10341         * Update code everywhere accordingly.
10342
10343         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
10344
10345         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
10346
10347 2002-02-28  Ravi Pratap  <ravi@ximian.com>
10348
10349         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
10350         try performing lookups against those instead of jumping straight into using
10351         the 'using' clauses.
10352
10353         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
10354
10355         (LookupType): Perform lookups in implicit parents too.
10356
10357         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
10358         sequence as RootContext.LookupType. 
10359
10360         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
10361         the various cases of namespace lookups into this method.
10362
10363 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
10364
10365         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
10366         in positional arguments)
10367
10368         * class.cs (Operator): Update the AllowedModifiers to contain
10369         extern. 
10370
10371         * cs-parser.jay: Update operator declaration to allow for the
10372         operator body to be empty.
10373
10374         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
10375         values. 
10376
10377 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
10378
10379         * class.cs (Method.Emit): Label parameters.
10380
10381         * driver.cs: Return 1 or 0 as the program exit code.
10382
10383 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
10384
10385         * expression.cs: Special case the `null' object when trying to
10386         auto-compute the type, as anything can be explicitly converted to
10387         that. 
10388
10389         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
10390         spotting this Paolo.
10391
10392         (Expression.ImplicitNumericConversion): Perform comparissions of
10393         the type using the underlying type in the case of an enumeration
10394         rather than using the enumeration type for the compare.
10395
10396         Cope with the underlying == type case, which is not possible to
10397         catch before. 
10398
10399         (Expression.ConvertNumericExplicit): Perform comparissions of
10400         the type using the underlying type in the case of an enumeration
10401         rather than using the enumeration type for the compare.
10402
10403         * driver.cs: If the user does not supply an extension, assume .exe
10404
10405         * cs-parser.jay (if_statement): Rewrote so that we can track the
10406         location for the if statement.
10407
10408         * expression.cs (Binary.ConstantFold): Only concat strings when
10409         the operation is "+", not everything ;-)
10410
10411         * statement.cs (Statement.EmitBoolExpression): Take a location
10412         argument. 
10413         (If, While, Do): Track location.
10414
10415         * expression.cs (Binary.ResolveOperator): In the object + string
10416         case, I was missing a call to ConvertImplicit
10417
10418 2002-02-25  Ravi Pratap  <ravi@ximian.com>
10419
10420         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
10421         Location arguments. Ensure we use RootContext.LookupType to do our work
10422         and not try to do a direct Type.GetType and ModuleBuilder.GetType
10423
10424         * interface.cs (PopulateMethod): Handle the type of the parameter being
10425         null gracefully.
10426
10427         * expression.cs (Invocation.BetterFunction): Handle the case when we 
10428         have a params method with no fixed arguments and a call is made with no
10429         arguments.
10430
10431 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
10432
10433         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
10434         the verbatim-string-literal
10435
10436         * support.cs (InternalParameters.ParameterModifier): handle null
10437         fixed parameters.
10438         (InternalParameters.ParameterType): ditto.
10439
10440         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
10441         duplicating the name of the variable parameter.
10442         (GetParameterByName): Fix bug where we were not looking up array
10443         paramters if they were the only present (thanks Paolo!).
10444         (GetParameterInfo): We only have an empty set of types if both
10445         fixed and array are set to null.
10446         (GetParameterInfo-idx): Handle FixedParameter == null
10447
10448         * cs-parser.jay: Handle the case where there is no catch
10449         statements (missing null test).
10450
10451 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
10452
10453         * driver.cs (MainDriver): Be conservative on our command line
10454         handling.
10455
10456         Catch DirectoryNotFoundException when calling GetFiles.
10457
10458         (SplitPathAndPattern): Used to split the input specification into
10459         a path and a pattern that we can feed to Directory.GetFiles.
10460
10461 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
10462
10463         * statement.cs (Fixed): Implement the last case of the Fixed
10464         statement (string handling).
10465
10466         * expression.cs (StringPtr): New class used to return a char * to
10467         a string;  Used by the Fixed statement.
10468
10469         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
10470
10471         * expression.cs (Binary.ResolveOperator): Remove redundant
10472         MemberLookup pn parent type.
10473         Optimize union call, we do not need a union if the types are the same.
10474         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
10475         type.
10476
10477         Specialize the use of MemberLookup everywhere, instead of using
10478         the default settings. 
10479
10480         (StackAlloc): Implement stackalloc keyword.
10481
10482         * cs-parser.jay: Add rule to parse stackalloc.
10483
10484         * driver.cs: Handle /h, /help, /?
10485
10486         * expression.cs (MakeByteBlob): Removed the hacks we had in place
10487         before we supported unsafe code.
10488
10489         * makefile: add --unsafe to the self compilation of mcs.
10490
10491 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
10492
10493         * expression.cs (PointerArithmetic): New class that is used to
10494         perform pointer arithmetic.
10495         (Binary.Resolve): Handle pointer arithmetic
10496         Handle pointer comparission.
10497         (ArrayPtr): Utility expression class that is used to take the
10498         address of an array.
10499
10500         (ElementAccess): Implement array access for pointers
10501
10502         * statement.cs (Fixed): Implement fixed statement for arrays, we
10503         are missing one more case before we are done.
10504
10505         * expression.cs (Indirection): Implement EmitAssign and set the
10506         ExprClass to Variable.  This allows pointer dereferences to be
10507         treated as variables, and to have values assigned to them.
10508
10509         * ecore.cs (Expression.StoreFromPtr): New utility function to
10510         store values dereferencing.
10511
10512 2002-02-20  Ravi Pratap  <ravi@ximian.com>
10513
10514         * expression.cs (Binary.ResolveOperator): Ensure that we are
10515         not trying to operate on a void type - this fixes the reported
10516         bug.
10517
10518         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
10519         the parent implementation is sealed.
10520
10521         * ../errors/cs0239.cs : Add.
10522
10523         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
10524
10525         * typemanager.cs (unverifiable_code_type): Corresponds to 
10526         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
10527         which have unsafe code in them.
10528
10529         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
10530         unsafe context.
10531
10532 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
10533
10534         * cs-tokenizer.cs: Add support for @"litreal strings"
10535
10536         Make tokenizer accept pre-processor directives
10537         on any column (remove the old C-like limitation). 
10538
10539         * rootcontext.cs (EmitCode): Emit any global attributes.
10540         (AddGlobalAttributes): Used to keep track of assembly attributes. 
10541
10542         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
10543
10544         * cs-parser.jay: Add support for global attributes.  
10545
10546 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
10547
10548         * expression.cs (Indirection): New helper class.  Unary will
10549         create Indirection classes to be able to implement the
10550         IMemoryLocation interface on it.
10551
10552 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
10553
10554         * cs-parser.jay (fixed_statement): reference the right statement.
10555
10556         * statement.cs (Fixed.Emit): Finish implementing the fixed
10557         statement for the &x case.
10558
10559 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
10560
10561         * class.cs (Property.Define, Method.Define): Remove newslot when
10562         `implementing'.  
10563
10564         * modifiers.cs: My use of NewSlot when `Abstract' was set was
10565         wrong.  NewSlot should only be used if the `new' keyword is present.
10566
10567         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
10568         locating our system dir.  Sorry about this.
10569
10570 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10571
10572         * driver.cs (GetSystemDir): Compute correctly the location of our
10573         system assemblies.  I was using the compiler directory instead of
10574         the library directory.
10575
10576 2002-02-13  Ravi Pratap  <ravi@ximian.com>
10577
10578         * expression.cs (BetterFunction): Put back in what Miguel commented out
10579         since it is the correct fix. The problem is elsewhere ;-)
10580
10581         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
10582         parameters of the parms method are themselves compatible or not !
10583
10584         (StandardConversionExists): Fix very dangerous bug where we were forgetting
10585         to check that a class implements an interface before saying that an implicit
10586         conversion was allowed. Use ImplementsInterface to do the checking.
10587
10588 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
10589
10590         * class.cs (Method.Define): Track whether we are an explicit
10591         implementation or not.  And only call DefineMethodOverride if we
10592         are an explicit implementation.
10593
10594         (Property.DefineMethod): Ditto.
10595
10596 2002-02-11  Ravi Pratap  <ravi@ximian.com>
10597
10598         * expression.cs (BetterFunction): Catch hideous bug which was
10599          preventing us from detecting ambiguous calls due to implicit casts i.e
10600         cs0121.
10601
10602 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
10603
10604         * support.cs (Pair): Remove un-needed method.  I figured why I was
10605         getting the error in cs-parser.jay, the variable in a foreach loop
10606         is readonly, and the compiler does not really treat this as a variable.
10607
10608         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
10609         instead of EQUALS in grammar.  
10610
10611         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
10612
10613         * expression.cs (Unary.DoResolve): Check whether the argument is
10614         managed or not.
10615
10616 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
10617
10618         * support.cs: Api for Pair to set a value.  Despite the fact that
10619         the variables are public the MS C# compiler refuses to compile
10620         code that accesses the field if the variable is part of a foreach
10621         statement. 
10622
10623         * statement.cs (Fixed): Begin implementation of the fixed
10624         statement.
10625
10626         (Block.AddVariable): Return the VariableInfo on success and null
10627         on failure instead of true/false. 
10628
10629         * cs-parser.jay (foreach): Catch errors on variables already
10630         defined (we were ignoring this value before) and properly unwind
10631         the block hierarchy
10632
10633         (fixed_statement): grammar for the fixed statement.
10634
10635 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
10636
10637         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
10638         pointer types to be incretemented.
10639
10640         (SizeOf): Implement.
10641
10642         * cs-parser.jay (pointer_member_access): Implement
10643         expr->IDENTIFIER production.
10644
10645         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
10646         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
10647         on safe contexts.
10648
10649         (Unary): Implement indirection.
10650
10651         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
10652         use in non-unsafe context).
10653
10654         (SimpleName.DoResolve): Check for pointers in field access on safe
10655         contexts. 
10656
10657         (Expression.LoadFromPtr): Factor the load-indirect code in this
10658         function.  This was duplicated in UnboxCast and ParameterReference
10659
10660 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
10661
10662         * expression.cs (ComposedCast): report an error if a pointer cast
10663         is used in a safe region.
10664
10665         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
10666         pointer type casts in unsafe context.
10667
10668         * codegen.cs (EmitContext): Set up IsUnsafe.
10669
10670         * cs-parser.jay (non_expression_type): Add productions for pointer
10671         casts. 
10672
10673         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
10674         code.  We should not use force into static mode if the method is
10675         not virtual.  Fixes bug in MIS
10676
10677         * statement.cs (Do.Emit, While.Emit, For.Emit,
10678         Statement.EmitBoolExpression): Add support to Do and While to
10679         propagate infinite loop as `I do return' semantics.
10680
10681         Improve the For case to also test for boolean constants.
10682
10683         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
10684         to the list of attributes we can add.
10685
10686         Remove `EmitContext' argument.
10687
10688         * class.cs (Method.Define): Apply parameter attributes.
10689         (Constructor.Define): Apply parameter attributes.
10690         (MethodCore.LabelParameters): Move here the core of labeling
10691         parameters. 
10692
10693         * support.cs (ReflectionParameters.ParameterModifier,
10694         InternalParameters.ParameterModifier): Use IsByRef on the type and
10695         only return the OUT bit for these parameters instead of in/out/ref
10696         flags.
10697
10698         This is because I miss-understood things.  The ParameterInfo.IsIn
10699         and IsOut represent whether the parameter has the [In] and [Out]
10700         attributes set.  
10701
10702 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
10703
10704         * ecore.cs (FieldExpr.Emit): Release temporaries.
10705
10706         * assign.cs (LocalTemporary.Release): new function.
10707
10708         * codegen.cs (EmitContext.GetTemporaryStorage,
10709         EmitContext.FreeTemporaryStorage): Rework the way we deal with
10710         temporary storage.  Now we can "put back" localbuilders when we
10711         are done with them
10712
10713 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
10714
10715         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
10716         need to make a copy of the variable to generate verifiable code.
10717
10718 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
10719
10720         * driver.cs: Compute dynamically the system directory.
10721
10722         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
10723         Slower, but more generally useful.  Used by the abstract
10724         registering implementation. 
10725
10726         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
10727         the rules for the special rule on Type/instances.  First check if
10728         we have the same name, and if so, try that special static path
10729         rather than the instance path.
10730
10731 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
10732
10733         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
10734         for, while and if.
10735
10736         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
10737         Enum, ValueType, Delegate or Array for non-corlib compiles.
10738
10739         * cs-tokenizer.cs: Catch long identifiers (645)
10740
10741         * typemanager.cs (IndexerPropetyName): Ravi never tested this
10742         piece of code.
10743
10744         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
10745         fix, we were returning too early, so we were not registering
10746         pending methods from abstract classes.
10747
10748         Do not register pending methods if the class is abstract.
10749
10750         * expression.cs (Conditional.DoResolve): Report circular implicit
10751         conversions when we neecd to compute it for conditional
10752         expressions. 
10753
10754         (Is.DoResolve): If the expression is always of the provided type,
10755         flag warning 183.  If the expression can not ever be of the
10756         provided type flag warning 184.
10757
10758         * class.cs: Catch 169 as well.
10759
10760         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
10761         read. 
10762
10763 2002-01-18  Nick Drochak  <ndrochak@gol.com>
10764
10765         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
10766
10767 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
10768
10769         * interface.cs: (PopulateMethod): Check for pointers being defined
10770         only if the unsafe context is active.
10771         (PopulateProperty): ditto.
10772         (PopulateIndexer): ditto.
10773
10774         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
10775         specified.  If pointers are present, make sure that they are
10776         present in an unsafe context.
10777         (Constructor, Constructor.Define): ditto.
10778         (Field, Field.Define): ditto.
10779         (Property, Property.Define): ditto.
10780         (Event, Event.Define): ditto.
10781
10782         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
10783         hashtable if there are classes or structs defined.
10784
10785         * expression.cs (LocalVariableReference.DoResolve): Simplify this
10786         code, as the constant resolution moved.
10787
10788         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
10789         the metadata, so we can flag error 133. 
10790
10791         * decl.cs (MemberCore.UnsafeOK): New function to test that a
10792         pointer is being declared in an unsafe context.
10793
10794 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
10795
10796         * modifiers.cs (Modifiers.Check): Require a Location argument.
10797         Report error 227 for Unsafe use.
10798
10799         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
10800
10801         * statement.cs (For.Emit): If the test is null, then report that
10802         we do `return', as we wont reach anything afterwards.
10803
10804         (Switch.SwitchGoverningType): Track the expression that matched
10805         the conversion.
10806
10807         * driver.cs: Allow negative numbers as an error code to flag.
10808
10809         * cs-parser.jay: Handle 1551.
10810
10811         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
10812
10813 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
10814
10815         * cs-parser.jay: Report 1518 (type declaration can only contain
10816         class, struct, interface, enum or delegate)
10817
10818         (switch_label): Report 1523 (keywords `case' or `default' must
10819         preced code)
10820
10821         (opt_switch_sections): Report 1522 (empty switch)
10822
10823         * driver.cs: Report 1515 (response file specified multiple times)
10824         Report 1516 (Source file specified multiple times).
10825
10826         * expression.cs (Argument.Resolve): Signal 1510
10827
10828         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
10829         access not allowed in static code)
10830
10831 2002-01-11  Ravi Pratap  <ravi@ximian.com>
10832
10833         * typemanager.cs (IsPointerType): Utility method which we are going
10834         to need a lot.
10835
10836         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
10837         the object type, so we take care of that.
10838
10839         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
10840
10841         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
10842         added to non-params parameters :-)
10843
10844         * typemanager.cs (CSharpName): Include 'void' type too. 
10845
10846         (void_ptr_type): Include in the set of core types.
10847
10848         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
10849         duplicating code.
10850
10851         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
10852         an unsafe context.
10853
10854         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
10855         completely forgotten about it.
10856
10857 2002-01-10  Ravi Pratap  <ravi@ximian.com>
10858
10859         * cs-parser.jay (pointer_type): Add. This begins our implementation
10860         of parsing rules for unsafe code.
10861
10862         (unsafe_statement): Implement.
10863
10864         (embedded_statement): Modify to include the above.
10865
10866         * statement.cs (Unsafe): Implement new class for unsafe blocks.
10867
10868         * codegen.cs (EmitContext.InUnsafe): Add. This determines
10869         if the current context is an unsafe one.
10870
10871         * cs-parser.jay (local_variable_pointer_type): Since local variable types
10872         are handled differently, we need separate rules for them.
10873
10874         (local_variable_declaration): Update to use local_variable_pointer_type
10875         to allow variable declarations of unmanaged pointer types.
10876
10877         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
10878         in unsafe contexts.
10879
10880         * ../errors/cs0214.cs : Add.
10881
10882 2002-01-16  Nick Drochak  <ndrochak@gol.com>
10883
10884         * makefile: remove 'response' file when cleaning.
10885
10886 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
10887
10888         * cs-parser.jay: Report 1524.
10889
10890 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
10891
10892         * typemanager.cs (RegisterMethod): drop checking if we have
10893         registered this from here
10894
10895 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
10896
10897         * class.cs (Method.EmitDestructor): Implement calling our base
10898         destructor. 
10899
10900         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
10901         value of InFinally.
10902
10903         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
10904         this routine and will wrap the call in a try/catch block.  Deal
10905         with the case.
10906
10907 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
10908
10909         * ecore.cs (Expression.MemberLookup): instead of taking a
10910         parameter `same_type' that was used to tell whether we could
10911         access private members we compute our containing type from the
10912         EmitContext.
10913
10914         (FieldExpr): Added partial support for volatile fields.  This does
10915         not work for volatile fields exposed from assemblies, as I can not
10916         figure out how to extract the modreq from it.
10917
10918         Updated all the source files to use this.
10919
10920         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
10921         because it is referenced by MemberLookup very often. 
10922
10923 2002-01-09  Ravi Pratap  <ravi@ximian.com>
10924
10925         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
10926         TypeBuilder.GetCustomAttributes to retrieve what we need.
10927
10928         Get rid of redundant default_member_attr_type as this is the same as
10929         default_member_type which already exists.
10930
10931         * interface.cs, attribute.cs : Update accordingly.
10932
10933 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
10934
10935         * typemanager.cs: Enable IndexerPropertyName again.  It does not
10936         work for TYpeBuilders though.  Ravi, can you please fix this?
10937
10938         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
10939
10940         * expression.cs (Argument.Emit): Handle the case of ref objects
10941         being passed to ref functions;  
10942
10943         (ParameterReference.EmitLoad): Loads the content of the pointer
10944         without dereferencing.
10945
10946 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
10947
10948         * cs-tokenizer.cs: Implemented the pre-processing expressions.
10949
10950 2002-01-08  Ravi Pratap  <ravi@ximian.com>
10951
10952         * class.cs (Indexer.DefineMethod): Incorporate the interface
10953         type in the name of the method if we are doing explicit interface
10954         implementation.
10955
10956         * expression.cs (ConversionExists): Remove as it is completely obsolete.
10957
10958         (BetterConversion): Fix extremely trivial bug where we were referring to
10959         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
10960         again !
10961
10962         * ../errors/bug16.cs : Add although we have fixed it.
10963
10964 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
10965
10966         * expression.cs (BaseIndexer): Begin implementation.
10967
10968         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
10969
10970         * cs-parser.jay (indexer_declarator): Use qualified_identifier
10971         production directly to remove a shift/reduce, and implement
10972         explicit interface implementation.
10973
10974         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
10975         after a floating point suffix.
10976
10977         * expression.cs (DoNumericPromotions): Improved the conversion for
10978         uint/uint.  If we have a constant, we avoid doing a typecast to a
10979         larger type.
10980
10981         * class.cs (Indexer): Implement explicit interface implementation
10982         for indexers.
10983
10984 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
10985
10986         * class.cs: make the default instance constructor public and hidebysig.
10987
10988 2001-01-03  Ravi Pratap  <ravi@ximian.com>
10989
10990         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
10991         so we can call it from elsewhere.
10992
10993         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
10994         we emit it internally if the class has a defined indexer; otherwise the user
10995         emits it by decorating the class definition with the DefaultMemberAttribute.
10996
10997         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
10998         attribute is not used on a type which defines an indexer.
10999
11000         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
11001         character when we skip whitespace.
11002
11003         * ../errors/cs0646.cs : Add.
11004
11005 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
11006
11007         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
11008         again. 
11009
11010         * makefile: Add practical target `mcs3.exe' which builds the third
11011         generation compiler. 
11012
11013         * expression.cs (New): Fix structures constructor calling.
11014
11015         * class.cs (Property, Method, Indexer): Emit Final flag on the
11016         method if we are an interface implementation and we are not
11017         abstract. 
11018
11019         * ecore.cs (PropertyExpr): New public field `IsBase', tells
11020         whether this property is referencing a `base' method.
11021
11022         * expression.cs (Invocation.EmitCall): take an extra argument:
11023         is_base, this is used to determine whether the `call' or
11024         `callvirt' opcode should be used.
11025
11026
11027         * delegate.cs: update EmitCall.
11028
11029         * class.cs (Method.Define): Set NewSlot for the cases where we are
11030         not implementing an interface method.
11031
11032         (Property.Define): ditto.
11033
11034 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
11035
11036         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
11037         'r'.  Allows mcs to parse itself fully.
11038
11039 2002-01-02  Ravi Pratap  <ravi@ximian.com>
11040
11041         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
11042         of the number of initializers that require the InitializeArray method.
11043
11044         (CheckIndices): Store the Expression in all cases - not the plain value. Also
11045         update the above field where necessary.
11046
11047         (MakeByteBlob): Update accordingly.
11048
11049         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
11050         greater than 2.
11051
11052         (EmitDynamicInitializers): Update in accordance with the new optimization.
11053
11054         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
11055         same OpCode applies.
11056
11057         * cs-parser.jay : Fix some glaring errors I introduced.
11058
11059 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
11060
11061         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
11062         so that we can check for name clashes there too.
11063
11064         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
11065         for interface indexers.
11066
11067         * interfaces.cs (Define): Emit the default member attribute.
11068
11069         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
11070         variable was being referred to while setting the value ;-)
11071
11072 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
11073
11074         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
11075         byte-by-byte information when we know the data is zero.
11076
11077         Make the block always a multiple of 4, because
11078         DefineInitializedData has a bug.
11079
11080         * assign.cs: Fix, we should assign from the temporary, not from
11081         the source. 
11082
11083         * expression.cs (MakeByteBlob): Fix my incorrect code.
11084
11085 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
11086
11087         * typemanager.cs (EnumToUnderlying): This function is used to get
11088         the underlying type from an enumeration, because it does not
11089         always work. 
11090
11091         * constant.cs: Use the I4_S form for values between -128 and 127.
11092
11093         * statement.cs (Block.LookupLabel): Looks up a label.
11094         (Block): Drop support for labeled blocks.
11095
11096         (LabeledStatement): New kind of statement that represents a label
11097         only.
11098
11099         (Goto): Finally implement this bad boy.
11100
11101         * cs-parser.jay: Update to reflect new mechanism to implement
11102         labels.
11103
11104 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
11105
11106         * codegen.cs (EmitContext.This): a codegen property that keeps the
11107         a single instance of this instead of creating many different this
11108         instances. 
11109
11110         * delegate.cs (Delegate.DoResolve): Update to use the property;
11111
11112         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
11113
11114         * expression.cs (BaseAccess.DoResolve): Ditto.
11115
11116 2001-12-29  Ravi Pratap  <ravi@ximian.com>
11117
11118         * typemanager.cs (methodimpl_attr_type): Add to hold the type
11119         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
11120
11121         (InitCoreTypes): Update accordingly.
11122
11123         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
11124         so we can quickly store the state.
11125
11126         (ApplyAttributes): Set the correct implementation flags
11127         for InternalCall methods.
11128
11129 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
11130
11131         * expression.cs (EmitCall): if a method is not virtual, then do
11132         not use callvirt on it.
11133
11134         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
11135         user defined stuff) requires the use of stobj, which takes an
11136         address on the stack instead of an array and an index.  So emit
11137         the Ldelema operation for it.
11138
11139         (EmitStoreOpcode): Use stobj for valuetypes.
11140
11141         (UnaryMutator.EmitCode): Use the right 1 value depending on
11142         whether we are dealing with int64/uint64, float or doubles.
11143
11144         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
11145         constructors that I implemented last night.
11146
11147         (Constructor.IsDefault): Fix to work properly for static
11148         constructors.
11149
11150         * cs-parser.jay (CheckDef): report method signature errors.
11151         Update error number 103 to be 132.
11152
11153         * decl.cs: New AdditionResult enumeration value: MethodExists.
11154         Although we do this check for methods later on in the semantic
11155         analysis, catching repeated default constructors is so easy that
11156         we catch these here. 
11157
11158         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
11159         promotions code.
11160
11161         (ParameterReference.EmitAssign, Emit): handle
11162         bools as bytes.
11163
11164         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
11165         (ArrayAccess.EmitStoreOpcode): ditto.
11166
11167         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
11168
11169         * expression.cs (MakeByteBlob): Complete all the missing types
11170         (uint, short, ushort, byte, sbyte)
11171
11172         * class.cs: Only init instance field initializers on instance
11173         constructors. 
11174
11175         Rename `constructors' to instance_constructors. 
11176
11177         (TypeContainer.AddConstructor): Only add constructors to the list
11178         if it is not static.
11179
11180         Make sure that we handle default_static_constructor independently
11181         everywhere where we handle instance_constructors
11182
11183 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
11184
11185         * class.cs: Do not lookup or create a base initializer for a
11186         static constructor.
11187
11188         (ConstructorInitializer.Resolve): use the proper type to lookup
11189         for constructors.
11190
11191         * cs-parser.jay: Report error 1585 (modifiers between type and name).
11192
11193         * enum.cs, interface.cs: Remove CloseType, this is taken care by
11194         in DeclSpace. 
11195
11196         * decl.cs: CloseType is now an virtual method, the default
11197         implementation just closes this type.
11198
11199 2001-12-28  Ravi Pratap  <ravi@ximian.com>
11200
11201         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
11202         to PreserveSig by default. Also emit HideBySig on such methods.
11203
11204         Basically, set the defaults to standard values.
11205
11206         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
11207         argument, if candidate is better, it can't be worse than the best !
11208
11209         (Invocation): Re-write bits to differentiate between methods being
11210         applicable in their expanded form and their normal form - for params
11211         methods of course.
11212
11213         Get rid of use_standard everywhere as only standard conversions are allowed
11214         in overload resolution. 
11215
11216         More spec conformance.
11217
11218 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
11219
11220         * driver.cs: Add --timestamp, to see where the compiler spends
11221         most of its time.
11222
11223         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
11224         `this' in static code.
11225
11226         (SimpleName.DoResolve): Implement in terms of a helper function
11227         that allows static-references to be passed upstream to
11228         MemberAccess.
11229
11230         (Expression.ResolveWithSimpleName): Resolve specially simple
11231         names when called by MemberAccess to implement the special
11232         semantics. 
11233
11234         (Expression.ImplicitReferenceConversion): Handle conversions from
11235         Null to reference types before others, as Null's type is
11236         System.Object. 
11237
11238         * expression.cs (Invocation.EmitCall): Handle the special case of
11239         calling methods declared on a reference type from a ValueType
11240         (Base classes System.Object and System.Enum)
11241
11242         (MemberAccess.Resolve): Only perform lookups on Enumerations if
11243         the left hand side is a TypeExpr, not on every enumeration. 
11244
11245         (Binary.Resolve): If types are reference types, then do a cast to
11246         object on operators != and == of both arguments.
11247
11248         * typemanager.cs (FindMembers): Extract instance and static
11249         members if requested.
11250
11251         * interface.cs (PopulateProperty): Use void_type instead of null
11252         as the return type for the setter method.
11253
11254         (PopulateIndexer): ditto.
11255
11256 2001-12-27  Ravi Pratap  <ravi@ximian.com>
11257
11258         * support.cs (ReflectionParameters): Fix minor bug where we
11259         were examining the wrong parameter for the ParamArray attribute.
11260
11261         Cope with requests for the type of the parameter at position
11262         greater than the params parameter's. We now return the element
11263         type of the params array as that makes more sense.
11264
11265         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
11266         accordingly as we no longer have to extract the element type
11267         ourselves.
11268
11269         (Invocation.OverloadResolve): Update.
11270
11271 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
11272
11273         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
11274         against IEnumerator, test whether the return value is a descendant
11275         of the IEnumerator interface.
11276
11277         * class.cs (Indexer.Define): Use an auxiliary method to implement
11278         the other bits of the method definition.  Begin support for
11279         explicit interface implementation.
11280
11281         (Property.DefineMethod): Use TypeManager.void_type instead of null
11282         for an empty return value.
11283
11284 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
11285
11286         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
11287         dealing with a FieldExpr which is composed of a FieldBuilder, in
11288         the code path we did extract the constant, but we should have
11289         obtained the underlying value to be able to cast it (otherwise we
11290         end up in an infinite loop, this is what Ravi was running into).
11291
11292         (ArrayCreation.UpdateIndices): Arrays might be empty.
11293
11294         (MemberAccess.ResolveMemberAccess): Add support for section
11295         14.5.4.1 that deals with the special case of E.I when E is a type
11296         and something else, that I can be a reference to a static member.
11297
11298         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
11299         handle a particular array type to create byte blobs, it is just
11300         something we dont generate byteblobs for.
11301
11302         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
11303         arguments. 
11304
11305         * location.cs (Push): remove the key from the hashtable that we
11306         are about to add.   This happens for empty files.
11307
11308         * driver.cs: Dispose files after we have parsed them.
11309
11310         (tokenize): new function that only runs the tokenizer on its
11311         input, for speed testing.
11312
11313 2001-12-26  Ravi Pratap  <ravi@ximian.com>
11314
11315         * class.cs (Event.Define): Define the private field only if there
11316         are no accessors defined.
11317
11318         * expression.cs (ResolveMemberAccess): If there is no associated
11319         field with the event, that means we have an event defined with its
11320         own accessors and we should flag error cs0070 since transforming
11321         ourselves into a field is not valid in that case.
11322
11323         * ecore.cs (SimpleName.DoResolve): Same as above.
11324
11325         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
11326         and charset to sane values.
11327
11328 2001-12-25  Ravi Pratap  <ravi@ximian.com>
11329
11330         * assign.cs (DoResolve): Perform check on events only if they 
11331         are being accessed outside the declaring type.
11332
11333         * cs-parser.jay (event_declarations): Update rules to correctly
11334         set the type of the implicit parameter etc.
11335
11336         (add_accessor, remove_accessor): Set current local parameters.
11337
11338         * expression.cs (Binary): For delegate addition and subtraction,
11339         cast the return value from the method into the appropriate delegate
11340         type.
11341
11342 2001-12-24  Ravi Pratap  <ravi@ximian.com>
11343
11344         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
11345         of these as the workaround is unnecessary.
11346
11347         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
11348         delegate data - none of that is needed at all.
11349
11350         Re-write bits to extract the instance expression and the delegate method
11351         correctly.
11352
11353         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
11354         on delegates too.
11355
11356         * attribute.cs (ApplyAttributes): New method to take care of common tasks
11357         of attaching attributes instead of duplicating code everywhere.
11358
11359         * everywhere : Update code to do attribute emission using the above method.
11360
11361 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11362
11363         * expression.cs (IsParamsMethodApplicable): if there are not
11364         parameters, return immediately.
11365
11366         * ecore.cs: The 0 literal can be implicity converted to an enum
11367         type. 
11368
11369         (SimpleName.DoResolve): First lookup the type, then lookup the
11370         members. 
11371
11372         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
11373         want to get its address.  If the InstanceExpression is not
11374         addressable, store the result in a temporary variable, then get
11375         the address of it.
11376
11377         * codegen.cs: Only display 219 errors on warning level or above. 
11378
11379         * expression.cs (ArrayAccess): Make it implement the
11380         IMemoryLocation interface.
11381
11382         (Binary.DoResolve): handle the operator == (object a, object b)
11383         and operator != (object a, object b) without incurring into a
11384         BoxedCast (because 5 != o should never be performed).
11385
11386         Handle binary enumerator operators.
11387
11388         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
11389         value type, otherwise use Ldelem_ref.
11390
11391         Use precomputed names;
11392
11393         (AddressOf): Implement address of
11394
11395         * cs-parser.jay (labeled_statement): Fix recursive block
11396         addition by reworking the production.
11397
11398         * expression.cs (New.DoEmit): New has a special case:
11399                 
11400                  If we are dealing with a ValueType, we have a few
11401                  situations to deal with:
11402                 
11403                     * The target of New is a ValueType variable, that is
11404                       easy, we just pass this as the variable reference
11405                 
11406                     * The target of New is being passed as an argument,
11407                       to a boxing operation or a function that takes a
11408                       ValueType.
11409                 
11410                       In this case, we need to create a temporary variable
11411                       that is the argument of New.
11412
11413
11414 2001-12-23  Ravi Pratap  <ravi@ximian.com>
11415
11416         * rootcontext.cs (LookupType): Check that current_type is not null before
11417         going about looking at nested types.
11418
11419         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
11420         not implement the IAssignMethod interface any more.
11421
11422         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
11423         where we tranform them into FieldExprs if they are being resolved from within
11424         the declaring type.
11425
11426         * ecore.cs (SimpleName.DoResolve): Do the same here.
11427
11428         * assign.cs (DoResolve, Emit): Clean up code considerably. 
11429
11430         * ../errors/bug10.cs : Add.
11431
11432         * ../errors/cs0070.cs : Add.
11433
11434         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
11435
11436         * assign.cs : Get rid of EventIsLocal everywhere.
11437
11438 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
11439
11440         * ecore.cs (ConvertIntLiteral): finished the implementation.
11441
11442         * statement.cs (SwitchLabel): Convert the value we are using as a
11443         key before looking up the table.
11444
11445 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11446
11447         * codegen.cs (EmitTopBlock): Require a Location argument now.
11448
11449         * cs-parser.jay (constructor_declarator): We need to setup
11450         current_local_parameters before we parse the
11451         opt_constructor_initializer, to allow the variables to be bound
11452         to the constructor arguments.
11453
11454         * rootcontext.cs (LookupType): First lookup nested classes in our
11455         class and our parents before we go looking outside our class.
11456
11457         * expression.cs (ConstantFold): Extract/debox the values at the
11458         beginnning. 
11459
11460         * rootcontext.cs (EmitCode): Resolve the constants first before we
11461         resolve the types.  This is not really needed, but it helps debugging.
11462
11463         * statement.cs: report location.
11464
11465         * cs-parser.jay: pass location to throw statement.
11466
11467         * driver.cs: Small bug fix.
11468
11469         * report.cs: Updated format to be 4-zero filled digits.
11470
11471 2001-12-22  Ravi Pratap  <ravi@ximian.com>
11472
11473         * expression.cs (CheckIndices): Fix minor bug where the wrong
11474         variable was being referred to ;-)
11475
11476         (DoEmit): Do not call EmitStaticInitializers when the 
11477         underlying type is System.Object.
11478
11479 2001-12-21  Ravi Pratap  <ravi@ximian.com>
11480
11481         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
11482         and do the usual workaround for SRE.
11483
11484         * class.cs (MyEventBuilder.EventType): New member to get at the type
11485         of the event, quickly.
11486
11487         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
11488
11489         * assign.cs (Assign.DoResolve): Handle the case when the target
11490         is an EventExpr and perform the necessary checks.
11491
11492         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
11493         interface.
11494
11495         (SimpleName.MemberStaticCheck): Include check for EventExpr.
11496
11497         (EventExpr): Set the type in the constructor itself since we 
11498         are meant to be born fully resolved.
11499
11500         (EventExpr.Define): Revert code I wrote earlier.
11501                 
11502         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
11503         instance expression is null. The instance expression is a This in that case
11504         or a null, depending on whether it is a static method or not.
11505
11506         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
11507         refers to more than one method.
11508
11509         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
11510         and accordingly flag errors.
11511
11512 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11513
11514         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
11515
11516 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
11517
11518         * location.cs (ToString): Provide useful rutine.
11519
11520 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
11521
11522         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
11523         objects, return the actual integral boxed.
11524
11525         * statement.cs (SwitchLabel): define an ILLabel for each
11526         SwitchLabel. 
11527
11528         (Switch.CheckSwitch): If the value is a Literal, extract
11529         the underlying literal.
11530
11531         Also in the unused hashtable we had, add the SwitchLabel so we can
11532         quickly look this value up.
11533
11534         * constant.cs: Implement a bunch of new constants.  Rewrite
11535         Literal based on this.  Made changes everywhere to adapt to this.
11536
11537         * expression.cs (Expression.MakeByteBlob): Optimize routine by
11538         dereferencing array only once, and also copes with enumrations.
11539
11540         bytes are two bytes wide, not one.
11541
11542         (Cast): Perform constant conversions.
11543
11544         * ecore.cs (TryImplicitIntConversion): Return literals instead of
11545         wrappers to the literals here.
11546
11547         * expression.cs (DoNumericPromotions): long literals can converted
11548         to ulong implicity (this is taken care of elsewhere, but I was
11549         missing this spot).
11550
11551         * ecore.cs (Expression.Literalize): Make the return type Literal,
11552         to improve type checking.
11553
11554         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
11555
11556 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11557
11558         * literal.cs: Revert code from ravi that checked the bounds.  The
11559         bounds are sane by the definition of the type itself. 
11560
11561         * typemanager.cs: Fix implementation of ImplementsInterface.  We
11562         need to actually look up in our parent hierarchy for interfaces
11563         implemented. 
11564
11565         * const.cs: Use the underlying type for enumerations
11566
11567         * delegate.cs: Compute the basename for the delegate creation,
11568         that should fix the delegate test case, and restore the correct
11569         Type Lookup semantics in rootcontext
11570
11571         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
11572         referencing a nested type with the Reflection API is using the "+"
11573         sign. 
11574
11575         * cs-parser.jay: Do not require EOF token at the end.
11576
11577 2001-12-20  Ravi Pratap  <ravi@ximian.com>
11578
11579         * rootcontext.cs (LookupType): Concatenate type names with
11580         a '.' instead of a '+' The test suite passes again.
11581
11582         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
11583         field of the enumeration.
11584
11585         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
11586         the case when the member is an EventExpr.
11587
11588         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
11589         static has an associated instance expression.
11590
11591         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
11592
11593         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
11594
11595         * class.cs (Event.Define): Register event and perform appropriate checks
11596         for error #111.
11597
11598         We define the Add and Remove methods even if the use provides none because
11599         in that case, we provide default implementations ourselves.
11600
11601         Define a private field of the type of the event. This is done by the CSC compiler
11602         and we should be doing it too ;-)
11603
11604         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
11605         More methods we use in code we generate.
11606
11607         (multicast_delegate_type, delegate_type): Two separate types since the distinction
11608         is important.
11609
11610         (InitCoreTypes): Update accordingly for the above.
11611
11612         * class.cs (Event.Emit): Generate code for default accessors that we provide
11613
11614         (EmitDefaultMethod): Do the job in the above.
11615
11616         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
11617         appropriate place.
11618
11619 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
11620
11621         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
11622         builders even if we were missing one.
11623
11624         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
11625         pass the Basename as our class name instead of the Name.  The
11626         basename will be correctly composed for us.
11627
11628         * parameter.cs (Paramters): Now takes a Location argument.
11629
11630         * decl.cs (DeclSpace.LookupType): Removed convenience function and
11631         make all the code call directly LookupType in RootContext and take
11632         this chance to pass the Location information everywhere.
11633
11634         * Everywhere: pass Location information.
11635
11636 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
11637
11638         * class.cs (Constructor.Define): Updated way of detecting the
11639         length of the parameters.
11640
11641         (TypeContainer.DefineType): Use basename as the type name for
11642         nested types.
11643
11644         (TypeContainer.Define): Do not recursively define types here, as
11645         definition is taken care in order by the RootContext.
11646
11647         * tree.cs: Keep track of namespaces in a per-file basis.
11648
11649         * parameter.cs (Parameter.ComputeSignature): Update to use
11650         DeclSpace. 
11651
11652         (Parameters.GetSignature): ditto.
11653
11654         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
11655         instead of a TypeContainer.
11656
11657         (Interface.SemanticAnalysis): Use `this' instead of our parent to
11658         resolve names.  Because we need to be resolve in our context, not
11659         our parents.
11660
11661         * driver.cs: Implement response files.
11662
11663         * class.cs (TypeContainer.DefineType): If we are defined, do not
11664         redefine ourselves.
11665
11666         (Event.Emit): Emit the code for add/remove handlers.
11667         (Event.Define): Save the MethodBuilders for add/remove.
11668
11669         * typemanager.cs: Use pair here too.
11670
11671         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
11672         DictionaryEntry requires the first argument to be non-null.  
11673
11674         (enum_declaration): Compute full name for registering the
11675         enumeration.
11676
11677         (delegate_declaration): Instead of using
11678         formal_parameter_list, use opt_formal_parameter_list as the list
11679         can be empty.
11680
11681         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
11682         (EventParsing): New property that controls whether `add' and
11683         `remove' are returned as tokens or identifiers (for events);
11684
11685 2001-12-19  Ravi Pratap  <ravi@ximian.com>
11686
11687         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
11688         use MyEventBuilder only and let it wrap the real builder for us.
11689
11690         (MyEventBuilder): Revamp constructor etc.
11691
11692         Implement all operations that we perform on EventBuilder in precisely the same
11693         way here too.
11694
11695         (FindMembers): Update to use the EventBuilder member.
11696
11697         (Event.Emit): Update accordingly.
11698
11699 2001-12-18  Ravi Pratap  <ravi@ximian.com>
11700
11701         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
11702         by calling the appropriate methods.
11703
11704         (GetCustomAttributes): Make stubs as they cannot possibly do anything
11705         useful.
11706
11707         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
11708
11709 2001-12-17  Ravi Pratap  <ravi@ximian.com>
11710
11711         * delegate.cs (Delegate.Populate): Check that the return type
11712         and various parameters types are indeed accessible.
11713
11714         * class.cs (Constructor.Define): Same here.
11715
11716         (Field.Define): Ditto.
11717
11718         (Event.Define): Ditto.
11719
11720         (Operator.Define): Check that the underlying Method defined itself
11721         correctly - so it's MethodBuilder should not be null.
11722
11723         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
11724         expression happens to be null.
11725
11726         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
11727         members but as of now we don't seem to be able to do anything really useful with it.
11728
11729         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
11730         not the EventBuilder.
11731
11732 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
11733
11734         * cs-tokenizer.cs: Add support for defines.
11735         Add support for #if, #elif, #else, #endif
11736
11737         (eval_var): evaluates a variable.
11738         (eval): stubbed for evaluating functions.
11739
11740         * cs-parser.jay: Pass the defines information
11741
11742         * driver.cs: Add --define command line option.
11743
11744         * decl.cs: Move MemberCore here.
11745
11746         Make it the base class for DeclSpace.  This allows us to catch and
11747         report 108 and 109 for everything now.
11748
11749         * class.cs (TypeContainer.Define): Extract all the members
11750         before populating and emit the warning 108 (new keyword required
11751         to override) instead of having each member implement this.
11752
11753         (MemberCore.Define): New abstract method, we will be using this in
11754         the warning reporting engine in Populate.
11755
11756         (Operator.Define): Adjust to new MemberCore protocol. 
11757
11758         * const.cs (Const): This does not derive from Expression, it is a
11759         temporary object we use to create fields, it is a MemberCore. 
11760
11761         * class.cs (Method.Define): Allow the entry point to be in a
11762         specific class.
11763
11764         * driver.cs: Rewrite the argument handler to clean it up a bit.
11765
11766         * rootcontext.cs: Made it just an auxiliary namespace feature by
11767         making everything static.
11768
11769         * driver.cs: Adapt code to use RootContext type name instead of
11770         instance variable.
11771
11772         * delegate.cs: Remove RootContext argument.
11773
11774         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
11775         argument. 
11776
11777         * class.cs (Event.Define): The lookup can fail.
11778
11779         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
11780
11781         * expression.cs: Resolve the this instance before invoking the code.
11782
11783 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
11784
11785         * cs-parser.jay: Add a production in element_access that allows
11786         the thing to become a "type" reference.  This way we can parse
11787         things like "(string [])" as a type.
11788
11789         Note that this still does not handle the more complex rules of
11790         casts. 
11791
11792
11793         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
11794
11795         * ecore.cs: (CopyNewMethods): new utility function used to
11796         assemble the list of methods from running FindMembers.
11797
11798         (MemberLookup): Rework FindMembers so that 
11799
11800 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
11801
11802         * class.cs (TypeContainer): Remove Delegates who fail to be
11803         defined.
11804
11805         * delegate.cs (Populate): Verify that we dont get null return
11806         values.   TODO: Check for AsAccessible.
11807
11808         * cs-parser.jay: Use basename to emit error 574 (destructor should
11809         have the same name as container class), not the full name.
11810
11811         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
11812         possible representation.  
11813
11814         Also implements integer type suffixes U and L.
11815
11816 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
11817
11818         * expression.cs (ArrayCreation.DoResolve): We need to do the
11819         argument resolution *always*.
11820
11821         * decl.cs: Make this hold the namespace.  Hold the root context as
11822         well.
11823         (LookupType): Move here.
11824
11825         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
11826
11827         * location.cs (Row, Name): Fixed the code, it was always returning
11828         references to the first file.
11829
11830         * interface.cs: Register properties defined through interfaces.
11831
11832         * driver.cs: Add support for globbing on the command line
11833
11834         * class.cs (Field): Make it derive from MemberCore as well.
11835         (Event): ditto.
11836
11837 2001-12-15  Ravi Pratap  <ravi@ximian.com>
11838
11839         * class.cs (Event::Define): Check that the type of the event is a delegate
11840         type else flag error #66.
11841
11842         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
11843         same.
11844
11845         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
11846         values of EntryPoint, CharSet etc etc.
11847
11848         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
11849
11850         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
11851         be null and we should ignore this. I am not sure if this is really clean. Apparently,
11852         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
11853         which needs this to do its work.
11854
11855         * ../errors/cs0066.cs : Add.
11856
11857 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
11858
11859         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
11860         helper functions.
11861
11862         * class.cs: (MethodSignature.MethodSignature): Removed hack that
11863         clears out the parameters field.
11864         (MemberSignatureCompare): Cleanup
11865
11866         (MemberCore): New base class used to share code between MethodCore
11867         and Property.
11868
11869         (RegisterRequiredImplementations) BindingFlags.Public requires
11870         either BindingFlags.Instace or Static.  Use instance here.
11871
11872         (Property): Refactored code to cope better with the full spec.
11873
11874         * parameter.cs (GetParameterInfo): Return an empty array instead
11875         of null on error.
11876
11877         * class.cs (Property): Abstract or extern properties have no bodies.
11878
11879         * parameter.cs (GetParameterInfo): return a zero-sized array.
11880
11881         * class.cs (TypeContainer.MethodModifiersValid): Move all the
11882         method modifier validation to the typecontainer so we can reuse
11883         this on properties.
11884
11885         (MethodCore.ParameterTypes): return an empty sized array of types.
11886
11887         (Property.Define): Test property modifier validity.
11888
11889         Add tests for sealed/override too.
11890
11891         (Method.Emit): abstract or extern methods have no bodies.
11892
11893 2001-12-14  Ravi Pratap  <ravi@ximian.com>
11894
11895         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
11896         thing.
11897
11898         (Method::Define, ::Emit): Modify accordingly.
11899
11900         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
11901
11902         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
11903
11904         * makefile: Pass in /unsafe.
11905
11906 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
11907
11908         * class.cs (MakeKey): Kill routine.
11909
11910         * class.cs (TypeContainer.Define): Correctly define explicit
11911         method implementations (they require the full interface name plus
11912         the method name).
11913
11914         * typemanager.cs: Deply the PtrHashtable here and stop using the
11915         lame keys.  Things work so much better.
11916
11917         This of course broke everyone who depended on `RegisterMethod' to
11918         do the `test for existance' test.  This has to be done elsewhere.
11919
11920         * support.cs (PtrHashtable): A hashtable that avoid comparing with
11921         the object stupid Equals method (because, that like fails all over
11922         the place).  We still do not use it.
11923
11924         * class.cs (TypeContainer.SetRequiredInterface,
11925         TypeContainer.RequireMethods): Killed these two routines and moved
11926         all the functionality to RegisterRequiredImplementations.
11927
11928         (TypeContainer.RegisterRequiredImplementations): This routine now
11929         registers all the implementations required in an array for the
11930         interfaces and abstract methods.  We use an array of structures
11931         which can be computed ahead of time to reduce memory usage and we
11932         also assume that lookups are cheap as most classes will not
11933         implement too many interfaces.
11934
11935         We also avoid creating too many MethodSignatures.
11936
11937         (TypeContainer.IsInterfaceMethod): Update and optionally does not
11938         clear the "pending" bit if we find that there are problems with
11939         the declaration.
11940
11941         (TypeContainer.VerifyPendingMethods): Update to report errors of
11942         methods that look like implementations but are not.
11943
11944         (TypeContainer.Define): Add support for explicit interface method
11945         implementation. 
11946
11947 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
11948
11949         * typemanager.cs: Keep track of the parameters here instead of
11950         being a feature of the TypeContainer.
11951
11952         * class.cs: Drop the registration of parameters here, as
11953         InterfaceMethods are also interface declarations.
11954
11955         * delegate.cs: Register methods with the TypeManager not only with
11956         the TypeContainer.  This code was buggy.
11957
11958         * interface.cs: Full registation here.
11959
11960 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
11961
11962         * expression.cs: Remove reducer for binary expressions, it can not
11963         be done this way.
11964
11965         * const.cs: Put here the code that used to go into constant.cs
11966
11967         * constant.cs: Put here the code for constants, this is a new base
11968         class for Literals.
11969
11970         * literal.cs: Make Literal derive from Constant.
11971
11972 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
11973
11974         * statement.cs (Return.Emit): Report error 157 if the user
11975         attempts to return from a finally block.
11976
11977         (Return.Emit): Instead of emitting a return, jump to the end of
11978         the function.
11979
11980         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
11981         LocalBuilder to store the result of the function.  ReturnLabel is
11982         the target where we jump.
11983
11984
11985 2001-12-09  Radek Doulik  <rodo@ximian.com>
11986
11987         * cs-parser.jay: remember alias in current namespace
11988
11989         * ecore.cs (SimpleName::DoResolve): use aliases for types or
11990         namespaces
11991
11992         * class.cs (LookupAlias): lookup alias in my_namespace
11993
11994         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
11995         aliases hashtable
11996         (LookupAlias): lookup alias in this and if needed in parent
11997         namespaces
11998
11999 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
12000
12001         * support.cs: 
12002
12003         * rootcontext.cs: (ModuleBuilder) Made static, first step into
12004         making things static.  I need this to avoid passing the
12005         TypeContainer when calling ParameterType.
12006
12007         * support.cs (InternalParameters.ParameterType): Remove ugly hack
12008         that did string manipulation to compute the type and then call
12009         GetType.  Use Parameter.ParameterType instead.
12010
12011         * cs-tokenizer.cs: Consume the suffix for floating values.
12012
12013         * expression.cs (ParameterReference): figure out whether this is a
12014         reference parameter or not.  Kill an extra variable by computing
12015         the arg_idx during emission.
12016
12017         * parameter.cs (Parameters.GetParameterInfo): New overloaded
12018         function that returns whether a parameter is an out/ref value or not.
12019
12020         (Parameter.ParameterType): The type of the parameter (base,
12021         without ref/out applied).
12022
12023         (Parameter.Resolve): Perform resolution here.
12024         (Parameter.ExternalType): The full type (with ref/out applied).
12025
12026         * statement.cs (Using.Emit, Using.EmitExpression): Implement
12027         support for expressions on the using statement.
12028
12029 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
12030
12031         * statement.cs (Using.EmitLocalVariableDecls): Split the
12032         localvariable handling of the using statement.
12033
12034         (Block.EmitMeta): Keep track of variable count across blocks.  We
12035         were reusing slots on separate branches of blocks.
12036
12037         (Try.Emit): Emit the general code block, we were not emitting it. 
12038
12039         Check the type of the declaration to be an IDisposable or
12040         something that can be implicity converted to it. 
12041
12042         Emit conversions if required.
12043
12044         * ecore.cs (EmptyExpression): New utility class.
12045         (Expression.ImplicitConversionExists): New utility function.
12046
12047 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
12048
12049         * statement.cs (Using): Implement.
12050
12051         * expression.cs (LocalVariableReference): Support read only variables.
12052
12053         * statement.cs: Remove the explicit emit for the Leave opcode.
12054         (VariableInfo): Add a readonly field.
12055
12056 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
12057
12058         * ecore.cs (ConvCast): new class used to encapsulate the various
12059         explicit integer conversions that works in both checked and
12060         unchecked contexts.
12061
12062         (Expression.ConvertNumericExplicit): Use new ConvCast class to
12063         properly generate the overflow opcodes.
12064
12065 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12066
12067         * statement.cs: The correct type for the EmptyExpression is the
12068         element_type, not the variable type.  Ravi pointed this out.
12069
12070 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12071
12072         * class.cs (Method::Define): Handle PInvoke methods specially
12073         by using DefinePInvokeMethod instead of the usual one.
12074
12075         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
12076         above to do the task of extracting information and defining the method.
12077
12078 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12079
12080         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
12081         of the condition for string type.
12082
12083         (Emit): Move that here. 
12084
12085         (ArrayCreation::CheckIndices): Keep string literals in their expression
12086         form.
12087
12088         (EmitDynamicInitializers): Handle strings appropriately.
12089
12090 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12091
12092         * codegen.cs (EmitContext): Replace multiple variables with a
12093         single pointer to the current Switch statement.
12094
12095         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
12096         EmitContext.
12097
12098 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12099
12100         * statement.cs 
12101
12102         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
12103         default'.
12104
12105         (Foreach.Emit): Foreach on arrays was not setting
12106         up the loop variables (for break/continue).
12107
12108         (GotoCase): Semi-implented.
12109
12110 2001-12-03  Ravi Pratap  <ravi@ximian.com>
12111
12112         * attribute.cs (CheckAttribute): Handle system attributes by using
12113         Attribute.GetAttributes to examine information we need.
12114
12115         (GetValidPlaces): Same here.
12116
12117         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
12118
12119         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
12120
12121         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
12122
12123         (Method::Define): Set appropriate flags if we have a DllImport attribute.
12124
12125         (Method::Emit): Handle the case when we are a PInvoke method.
12126
12127 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12128
12129         * expression.cs: Use ResolveWithSimpleName on compound names.
12130
12131 2001-12-02  Ravi Pratap  <ravi@ximian.com>
12132
12133         * constant.cs (EmitConstant): Make sure we resolve the associated expression
12134         before trying to reduce it.
12135
12136         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
12137
12138         * constant.cs (LookupConstantValue): Implement.
12139
12140         (EmitConstant): Use the above in emitting the constant.
12141
12142         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
12143         that are user-defined by doing a LookupConstantValue on them.
12144
12145         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
12146         too, like above.
12147
12148 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
12149
12150         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
12151
12152         (BaseAccess.DoResolve): Implement.
12153
12154         (MemberAccess.DoResolve): Split this routine into a
12155         ResolveMemberAccess routine that can be used independently
12156
12157 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
12158
12159         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
12160         As that share bits of the implementation.  Is returns a boolean,
12161         while As returns the Type that is being probed.
12162
12163 2001-12-01  Ravi Pratap  <ravi@ximian.com>
12164
12165         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
12166         instead of a Literal - much easier.
12167
12168         (EnumInTransit): Remove - utterly useless :-)
12169
12170         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
12171
12172         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
12173
12174         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
12175         chain when we have no associated expression.
12176
12177 2001-11-30  Ravi Pratap  <ravi@ximian.com>
12178
12179         * constant.cs (Define): Use Location while reporting the errror.
12180
12181         Also emit a warning when 'new' is used and there is no inherited
12182         member to hide.
12183
12184         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
12185         populated.
12186
12187         (LookupEnumValue): Implement to lookup an enum member's value and define it
12188         if necessary.
12189
12190         (Populate): Re-write accordingly to use the above routine.
12191
12192 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
12193
12194         * expression.cs (This): Fix prototype for DoResolveLValue to
12195         override the base class DoResolveLValue.
12196
12197         * cs-parser.cs: Report errors cs574 and cs575 (destructor
12198         declarations) 
12199
12200         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
12201         (we need to load the address of the field here).  This fixes
12202         test-22. 
12203
12204         (FieldExpr.DoResolveLValue): Call the DoResolve
12205         function to initialize the Instance expression.
12206
12207         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
12208         correctly the GetEnumerator operation on a value type.
12209
12210         * cs-parser.jay: Add more simple parsing error catches.
12211
12212         * statement.cs (Switch): Add support for string switches.
12213         Handle null specially.
12214
12215         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
12216
12217 2001-11-28  Ravi Pratap  <ravi@ximian.com>
12218
12219         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
12220
12221         (declare_local_constant): New helper function.
12222
12223         * statement.cs (AddConstant): Keep a separate record of constants
12224
12225         (IsConstant): Implement to determine if a variable is a constant.
12226
12227         (GetConstantExpression): Implement.
12228
12229         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
12230
12231         * statement.cs (IsVariableDefined): Re-write.
12232
12233 2001-11-27  Ravi Pratap  <ravi@ximian.com>
12234
12235         * class.cs (TypeContainer::FindMembers): Look for constants
12236         in the case when we are looking for MemberTypes.Field
12237
12238         * expression.cs (MemberAccess::DoResolve): Check that in the
12239         case we are a FieldExpr and a Literal, we are not being accessed
12240         by an instance reference.
12241
12242         * cs-parser.jay (local_constant_declaration): Implement.
12243
12244         (declaration_statement): Implement for constant declarations.
12245
12246 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
12247
12248         * statement.cs (Switch): Catch double defaults.
12249
12250         (Switch): More work on the switch() statement
12251         implementation.  It works for integral values now, need to finish
12252         string support.
12253
12254
12255 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
12256
12257         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
12258         integer literals into other integer literals.  To be used by
12259         switch. 
12260
12261 2001-11-24  Ravi Pratap  <ravi@ximian.com>
12262
12263         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
12264         some memory.
12265
12266         (EmitDynamicInitializers): Cope with the above since we extract data
12267         directly from ArrayData now.
12268
12269         (ExpectInitializers): Keep track of whether initializers are mandatory
12270         or not.
12271
12272         (Bounds): Make it a hashtable to prevent the same dimension being 
12273         recorded for every element in that dimension.
12274
12275         (EmitDynamicInitializers): Fix bug which prevented the Set array method
12276         from being found.
12277
12278         Also fix bug which was causing the indices to be emitted in the reverse
12279         order.
12280
12281 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
12282
12283         * expression.cs (ArrayCreation): Implement the bits that Ravi left
12284         unfinished.  They do not work, because the underlying code is
12285         sloppy.
12286
12287 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12288
12289         * cs-parser.jay: Remove bogus fixme.
12290
12291         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
12292         on Switch statement.
12293
12294 2001-11-23  Ravi Pratap  <ravi@ximian.com>
12295
12296         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
12297         the same. 
12298
12299         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
12300         parameter. Apparently, any expression is allowed. 
12301
12302         (ValidateInitializers): Update accordingly.
12303
12304         (CheckIndices): Fix some tricky bugs thanks to recursion.
12305
12306         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
12307         I was being completely brain-dead.
12308
12309         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
12310         and re-write acordingly.
12311
12312         (DelegateInvocation): Re-write accordingly.
12313
12314         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
12315
12316         (MakeByteBlob): Handle types more correctly.
12317
12318         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
12319         initialization from expressions but it is incomplete because I am a complete
12320         Dodo :-|
12321
12322 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12323
12324         * statement.cs (If.Emit): Fix a bug that generated incorrect code
12325         on If.  Basically, we have to return `true' (ie, we do return to
12326         our caller) only if both branches of the if return.
12327
12328         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
12329         short-circuit operators, handle them as short circuit operators. 
12330
12331         (Cast.DoResolve): Resolve type.
12332         (Cast.Cast): Take an expression as the target type.
12333
12334         * cs-parser.jay (cast_expression): Remove old hack that only
12335         allowed a limited set of types to be handled.  Now we take a
12336         unary_expression and we resolve to a type during semantic
12337         analysis.
12338
12339         Use the grammar productions from Rhys to handle casts (this is
12340         not complete like Rhys syntax yet, we fail to handle that corner
12341         case that C# has regarding (-x), but we will get there.
12342
12343 2001-11-22  Ravi Pratap  <ravi@ximian.com>
12344
12345         * class.cs (EmitFieldInitializer): Take care of the case when we have a
12346         field which is an array type.
12347
12348         * cs-parser.jay (declare_local_variables): Support array initialization too.
12349
12350         * typemanager.cs (MakeKey): Implement.
12351
12352         (everywhere): Use the above appropriately.
12353
12354         * cs-parser.jay (for_statement): Update for array initialization while
12355         declaring variables.
12356
12357         * ecore.cs : The error message was correct, it's the variable's names that
12358         were misleading ;-) Make the code more readable.
12359
12360         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
12361         the correct type etc.
12362
12363         (ConvertExplicit): Handle Enum types by examining the underlying type.
12364
12365 2001-11-21  Ravi Pratap  <ravi@ximian.com>
12366
12367         * parameter.cs (GetCallingConvention): Always return
12368         CallingConventions.Standard for now.
12369
12370 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
12371
12372         * expression.cs (Binary.ResolveOperator): Update the values of `l'
12373         and `r' after calling DoNumericPromotions.
12374
12375         * ecore.cs: Fix error message (the types were in the wrong order).
12376
12377         * statement.cs (Foreach.ProbeCollectionType): Need to pass
12378         BindingFlags.Instance as well 
12379
12380         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
12381         implicit int literal conversion in an empty cast so that we
12382         propagate the right type upstream.
12383
12384         (UnboxCast): new class used to unbox value types.
12385         (Expression.ConvertExplicit): Add explicit type conversions done
12386         by unboxing.
12387
12388         (Expression.ImplicitNumericConversion): Oops, forgot to test for
12389         the target type before applying the implicit LongLiterals to ULong
12390         literal cast.
12391
12392 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
12393
12394         * cs-parser.jay (for_statement): Reworked the way For works: now
12395         we declare manually any variables that are introduced in
12396         for_initializer to solve the problem of having out-of-band code
12397         emition (that is what got for broken).
12398
12399         (declaration_statement): Perform the actual variable declaration
12400         that used to be done in local_variable_declaration here.
12401
12402         (local_variable_declaration): Do not declare anything, just pass
12403         the information on a DictionaryEntry
12404
12405 2001-11-20  Ravi Pratap  <ravi@ximian.com>
12406
12407         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
12408         re-write of the logic to now make it recursive.
12409
12410         (UpdateIndices): Re-write accordingly.
12411
12412         Store element data in a separate ArrayData list in the above methods.
12413
12414         (MakeByteBlob): Implement to dump the array data into a byte array.
12415
12416 2001-11-19  Ravi Pratap  <ravi@ximian.com>
12417
12418         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
12419         into CheckIndices.
12420
12421         * constant.cs (Define): Implement.
12422
12423         (EmitConstant): Re-write fully.
12424
12425         Pass in location info.
12426
12427         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
12428         respectively.
12429
12430         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
12431         DictionaryEntry since we need location info too.
12432
12433         (constant_declaration): Update accordingly.
12434
12435         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
12436         code into another method : UpdateIndices.
12437
12438 2001-11-18  Ravi Pratap  <ravi@ximian.com>
12439
12440         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
12441         some type checking etc.
12442
12443 2001-11-17  Ravi Pratap  <ravi@ximian.com>
12444
12445         * expression.cs (ArrayCreation::ValidateInitializers): Implement
12446         bits to provide dimension info if the user skips doing that.
12447
12448         Update second constructor to store the rank correctly.
12449
12450 2001-11-16  Ravi Pratap  <ravi@ximian.com>
12451
12452         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
12453         and try to implement.
12454
12455         * ../errors/cs0150.cs : Add.
12456
12457         * ../errors/cs0178.cs : Add.
12458
12459 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
12460
12461         * statement.cs: Implement foreach on multi-dimensional arrays. 
12462
12463         * parameter.cs (Parameters.GetParameterByName): Also lookup the
12464         name of the params argument.
12465
12466         * expression.cs: Use EmitStoreOpcode to get the right opcode while
12467         initializing the array.
12468
12469         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
12470         we can use this elsewhere.
12471
12472         * statement.cs: Finish implementation of foreach for single
12473         dimension arrays.
12474
12475         * cs-parser.jay: Use an out-of-band stack to pass information
12476         around, I wonder why I need this.
12477
12478         foreach_block: Make the new foreach_block the current_block.
12479
12480         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
12481         function used to return a static Parameters structure.  Used for
12482         empty parameters, as those are created very frequently.
12483
12484         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
12485
12486 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12487
12488         * interface.cs : Default modifier is private, not public. The
12489         make verify test passes again.
12490
12491 2001-11-15  Ravi Pratap  <ravi@ximian.com>
12492
12493         * support.cs (ReflectionParameters): Fix logic to determine
12494         whether the last parameter is a params one. Test 9 passes again.
12495
12496         * delegate.cs (Populate): Register the builders we define with
12497         RegisterParameterForBuilder. Test 19 passes again.
12498
12499         * cs-parser.jay (property_declaration): Reference $6 instead
12500         of $$ to get at the location.
12501
12502         (indexer_declaration): Similar stuff.
12503
12504         (attribute): Ditto.
12505
12506         * class.cs (Property): Register parameters for the Get and Set methods
12507         if they exist. Test 23 passes again.
12508
12509         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
12510         call to EmitArguments as we are sure there aren't any params arguments. 
12511         Test 32 passes again.
12512
12513         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
12514         IndexOutOfRangeException. 
12515
12516         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
12517         Test 33 now passes again.
12518
12519 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
12520
12521         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
12522         broke a bunch of things.  Will have to come up with a better way
12523         of tracking locations.
12524
12525         * statement.cs: Implemented foreach for single dimension arrays.
12526
12527 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12528
12529         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
12530         an error.  This removes the lookup from the critical path.
12531
12532         * cs-parser.jay: Removed use of temporary_loc, which is completely
12533         broken. 
12534
12535 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
12536
12537         * support.cs (ReflectionParameters.ParameterModifier): Report
12538         whether the argument is a PARAMS argument or not.
12539
12540         * class.cs: Set the attribute `ParamArrayAttribute' on the
12541         parameter argument.
12542
12543         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
12544         and cons_param_array_attribute (ConstructorInfo for
12545         ParamArrayAttribute)., 
12546
12547         * codegen.cs: Emit the return using the `Return' statement, that
12548         way we can report the error correctly for missing return values. 
12549
12550         * class.cs (Method.Emit): Clean up.
12551
12552         * expression.cs (Argument.Resolve): Take another argument: the
12553         location where this argument is used.  Notice that this is not
12554         part of the "Argument" class as to reduce the size of the
12555         structure (we know the approximate location anyways).
12556
12557         Test if the argument is a variable-reference, if not, then
12558         complain with a 206.
12559
12560         (Argument.Emit): Emit addresses of variables.
12561
12562         (Argument.FullDesc): Simplify.
12563
12564         (Invocation.DoResolve): Update for Argument.Resolve.
12565
12566         (ElementAccess.DoResolve): ditto.
12567
12568         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
12569         method should be virtual, as this method is always virtual.
12570
12571         (NewDelegate.DoResolve): Update for Argument.Resolve.
12572
12573         * class.cs (ConstructorInitializer.DoResolve): ditto.
12574
12575         * attribute.cs (Attribute.Resolve): ditto.
12576
12577 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
12578
12579         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
12580
12581         * expression.cs (ParameterReference): Drop IStackStorage and implement
12582         IAssignMethod instead. 
12583
12584         (LocalVariableReference): ditto.
12585
12586         * ecore.cs (FieldExpr): Drop IStackStorage and implement
12587         IAssignMethod instead. 
12588
12589 2001-11-13  Miguel de Icaza <miguel@ximian.com>
12590
12591         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
12592         enumerations that are used in heavily used structures derive from
12593         byte in a laughable and pathetic attempt to reduce memory usage.
12594         This is the kind of pre-optimzations that you should not do at
12595         home without adult supervision.
12596
12597         * expression.cs (UnaryMutator): New class, used to handle ++ and
12598         -- separatedly from the other unary operators.  Cleans up the
12599         code, and kills the ExpressionStatement dependency in Unary.
12600
12601         (Unary): Removed `method' and `Arguments' from this class, making
12602         it smaller, and moving it all to SimpleCall, so I can reuse this
12603         code in other locations and avoid creating a lot of transient data
12604         strucutres when not required.
12605
12606         * cs-parser.jay: Adjust for new changes.
12607
12608 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
12609
12610         * enum.cs (Enum.Populate): If there is a failure during
12611         definition, return
12612
12613         * cs-parser.jay (opt_enum_base): we used to catch type errors
12614         here, but this is really incorrect.  The type error should be
12615         catched during semantic analysis.
12616
12617 2001-12-11  Ravi Pratap  <ravi@ximian.com>
12618
12619         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
12620         current_local_parameters as expected since I, in my stupidity, had forgotten
12621         to do this :-)
12622
12623         * attribute.cs (GetValidPlaces): Fix stupid bug.
12624
12625         * class.cs (Method::Emit): Perform check on applicability of attributes.
12626
12627         (Constructor::Emit): Ditto.
12628
12629         (Field::Emit): Ditto.
12630
12631         (Field.Location): Store location information.
12632
12633         (Property, Event, Indexer, Operator): Ditto.
12634
12635         * cs-parser.jay (field_declaration): Pass in location for each field.
12636
12637         * ../errors/cs0592.cs : Add.
12638
12639 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12640
12641         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
12642
12643         (InitCoreTypes): Update accordingly.
12644
12645         (RegisterAttrType, LookupAttr): Implement.
12646
12647         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
12648         info about the same.
12649
12650         (Resolve): Update to populate the above as necessary.
12651
12652         (Error592): Helper.
12653
12654         (GetValidPlaces): Helper to the above.
12655
12656         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
12657
12658         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
12659
12660 2001-11-12  Ravi Pratap  <ravi@ximian.com>
12661
12662         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
12663
12664         * ../errors/cs0617.cs : Add.
12665
12666 2001-11-11  Ravi Pratap  <ravi@ximian.com>
12667
12668         * enum.cs (Emit): Rename to Populate to be more consistent with what
12669         we expect it to do and when exactly it is called.
12670
12671         * class.cs, rootcontext.cs : Update accordingly.
12672
12673         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
12674         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
12675
12676         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
12677
12678         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
12679         of a fieldinfo using the above, when dealing with a FieldBuilder.
12680
12681 2001-11-10  Ravi Pratap  <ravi@ximian.com>
12682
12683         * ../errors/cs0031.cs : Add.
12684
12685         * ../errors/cs1008.cs : Add.
12686
12687         * ../errrors/cs0543.cs : Add.
12688
12689         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
12690         enum type.
12691
12692         (FindMembers): Implement.
12693
12694         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
12695         enums and delegates too.
12696
12697         (enum_types): Rename to builder_to_enum.
12698
12699         (delegate_types): Rename to builder_to_delegate.
12700
12701         * delegate.cs (FindMembers): Implement.
12702
12703 2001-11-09  Ravi Pratap  <ravi@ximian.com>
12704
12705         * typemanager.cs (IsEnumType): Implement.
12706
12707         * enum.cs (Emit): Re-write parts to account for the underlying type
12708         better and perform checking etc.
12709
12710         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
12711         of the underlying type.
12712
12713         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
12714         value
12715
12716         * enum.cs (error31): Helper to report error #31.
12717
12718         * cs-parser.jay (enum_declaration): Store location of each member too.
12719
12720         * enum.cs (member_to_location): New hashtable. 
12721
12722         (AddEnumMember): Update location hashtable.
12723
12724         (Emit): Use the location of each member while reporting errors.
12725
12726 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
12727
12728         * cs-parser.jay: A for_initializer if is a
12729         local_variable_declaration really ammount to have an implicit
12730         block with the variable declaration and no initializer for for.
12731
12732         * statement.cs (For.Emit): Cope with null initializers.
12733
12734         This fixes the infinite loop on for initializers.
12735
12736 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
12737
12738         * enum.cs: More cleanup.
12739
12740         * ecore.cs: Remove dead code.
12741
12742         * class.cs (Property.Emit): More simplification.
12743         (Event.Emit): ditto.
12744
12745         Reworked to have less levels of indentation.
12746
12747 2001-11-08  Ravi Pratap  <ravi@ximian.com>
12748
12749         * class.cs (Property): Emit attributes.
12750
12751         (Field): Ditto.
12752
12753         (Event): Ditto.
12754
12755         (Indexer): Ditto.
12756
12757         (Operator): Ditto.
12758
12759         * enum.cs (Emit): Ditto.
12760
12761         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
12762         Enums too.
12763
12764         * class.cs (Field, Event, etc.): Move attribute generation into the
12765         Emit method everywhere.
12766
12767         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
12768         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
12769         as we had no way of defining nested enums !
12770
12771         * rootcontext.cs : Adjust code accordingly.
12772
12773         * typemanager.cs (AddEnumType): To keep track of enum types separately.
12774
12775 2001-11-07  Ravi Pratap  <ravi@ximian.com>
12776
12777         * expression.cs (EvalConstantExpression): Move into ecore.cs
12778
12779         * enum.cs (Enum): Rename some members and make them public and readonly
12780         according to our convention.
12781
12782         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
12783         nothing else.
12784
12785         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
12786
12787         (Enum::Emit): Write a simple version for now which doesn't try to compute
12788         expressions. I shall modify this to be more robust in just a while.
12789
12790         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
12791
12792         (TypeContainer::CloseType): Create the Enum types too.
12793
12794         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
12795
12796         * expression.cs (EvalConstantExpression): Get rid of completely.
12797
12798         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
12799         user-defined values and other cases.
12800
12801         (IsValidEnumLiteral): Helper function.
12802
12803         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
12804         out there in the case we had a literal FieldExpr.
12805
12806         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
12807
12808         (Literalize): Revamp a bit to take two arguments.
12809
12810         (EnumLiteral): New class which derives from Literal to wrap enum literals.
12811
12812 2001-11-06  Ravi Pratap  <ravi@ximian.com>
12813
12814         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
12815
12816         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
12817
12818         (Resolve): Use the above to ensure we have proper initializers.
12819
12820 2001-11-05  Ravi Pratap  <ravi@ximian.com>
12821
12822         * expression.cs (Expression::EvalConstantExpression): New method to 
12823         evaluate constant expressions.
12824
12825         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
12826
12827 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
12828
12829         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
12830         in an array.
12831
12832         (Binary.ResolveOperator): Handle operator != (object a, object b)
12833         and operator == (object a, object b);
12834
12835         (Binary.DoNumericPromotions): Indicate whether the numeric
12836         promotion was possible.
12837
12838         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
12839         Implement.  
12840
12841         Made the ArrayAccess implement interface IAssignMethod instead of
12842         IStackStore as the order in which arguments are passed reflects
12843         this.
12844
12845         * assign.cs: Instead of using expr.ExprClass to select the way of
12846         assinging, probe for the IStackStore/IAssignMethod interfaces.
12847
12848         * typemanager.cs: Load InitializeArray definition.
12849
12850         * rootcontext.cs (RootContext.MakeStaticData): Used to define
12851         static data that can be used to initialize arrays. 
12852
12853 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
12854
12855         * expression.cs: Handle operator== and operator!= for booleans.
12856
12857         (Conditioal.Reduce): Implement reducer for the ?: operator.
12858
12859         (Conditional.Resolve): Implement dead code elimination.
12860
12861         (Binary.Resolve): Catch string literals and return a new
12862         concatenated string.
12863
12864         (Unary.Reduce): Implement reduction of unary expressions.
12865
12866         * ecore.cs: Split out the expression core handling here.
12867
12868         (Expression.Reduce): New method used to perform constant folding
12869         and CSE.  This is needed to support constant-expressions. 
12870
12871         * statement.cs (Statement.EmitBoolExpression): Pass true and false
12872         targets, and optimize for !x.
12873
12874 2001-11-04  Ravi Pratap  <ravi@ximian.com>
12875
12876         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
12877         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
12878         set custom atttributes.
12879
12880         * literal.cs (Literal::GetValue): New abstract method to return the actual
12881         value of the literal, cast as an object.
12882
12883         (*Literal): Implement GetValue method.
12884
12885         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
12886         expressions to the arraylist but objects of type Argument.
12887
12888         * class.cs (TypeContainer::Emit): Emit our attributes too.
12889
12890         (Method::Emit, Constructor::Emit): Ditto.
12891
12892         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
12893         to be ignoring earlier.
12894
12895 2001-11-03  Ravi Pratap  <ravi@ximian.com>
12896
12897         * attribute.cs (AttributeSection::Define): Implement to do the business
12898         of constructing a CustomAttributeBuilder.
12899
12900         (Attribute): New trivial class. Increases readability of code.  
12901
12902         * cs-parser.jay : Update accordingly.
12903
12904         (positional_argument_list, named_argument_list, named_argument): New rules
12905
12906         (attribute_arguments): Use the above so that we are more correct.
12907
12908 2001-11-02  Ravi Pratap  <ravi@ximian.com>
12909
12910         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
12911         to perform all checks for a method with a params parameter.
12912
12913         (Invocation::OverloadResolve): Update to use the above method and therefore
12914         cope correctly with params method invocations.
12915
12916         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
12917         params too.
12918
12919         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
12920         constructors in our parent too because we can't afford to miss out on 
12921         protected ones ;-)
12922
12923         * attribute.cs (AttributeSection): New name for the class Attribute
12924
12925         Other trivial changes to improve readability.
12926
12927         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
12928         use the new class names.
12929
12930 2001-11-01  Ravi Pratap  <ravi@ximian.com>
12931
12932         * class.cs (Method::Define): Complete definition for params types too
12933
12934         (Indexer::Define): Ditto.
12935
12936         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
12937         Cope everywhere with a request for info about the array parameter.
12938
12939 2001-11-01  Ravi Pratap  <ravi@ximian.com>
12940
12941         * tree.cs (RecordNamespace): Fix up to check for the correct key.
12942
12943         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
12944         local_variable_type to extract the string corresponding to the type.
12945
12946         (local_variable_type): Fixup the action to use the new helper method.
12947
12948         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
12949         go.
12950
12951         * expression.cs : Clean out code which uses the above.
12952
12953 2001-10-31  Ravi Pratap  <ravi@ximian.com>
12954
12955         * typemanager.cs (RegisterMethod): Check if we already have an existing key
12956         and bale out if necessary by returning a false.
12957
12958         (RegisterProperty): Ditto.
12959
12960         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
12961         and print out appropriate error messages.
12962
12963         * interface.cs (everywhere): Ditto.
12964
12965         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
12966         location to constructor.
12967
12968         * class.cs (Property, Event, Indexer): Update accordingly.
12969
12970         * ../errors/cs111.cs : Added.
12971
12972         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
12973         of a method, as laid down by the spec.
12974
12975         (Invocation::OverloadResolve): Use the above method.
12976
12977 2001-10-31  Ravi Pratap  <ravi@ximian.com>
12978
12979         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
12980         now take a TypeContainer and a Parameters object.
12981
12982         (ParameterData): Modify return type of ParameterModifier method to be 
12983         Parameter.Modifier and not a string.
12984
12985         (ReflectionParameters, InternalParameters): Update accordingly.
12986
12987         * expression.cs (Argument::GetParameterModifier): Same here.
12988
12989         * support.cs (InternalParameters::ParameterType): Find a better way of determining
12990         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
12991         symbol in it at all so maybe this is only for now.
12992
12993 2001-10-30  Ravi Pratap  <ravi@ximian.com>
12994
12995         * support.cs (InternalParameters): Constructor now takes an extra argument 
12996         which is the actual Parameters class.
12997
12998         (ParameterDesc): Update to provide info on ref/out modifiers.
12999
13000         * class.cs (everywhere): Update call to InternalParameters to pass in
13001         the second argument too.
13002
13003         * support.cs (ParameterData): Add ParameterModifier, which is a method 
13004         to return the modifier info [ref/out etc]
13005
13006         (InternalParameters, ReflectionParameters): Implement the above.
13007
13008         * expression.cs (Argument::ParameterModifier): Similar function to return
13009         info about the argument's modifiers.
13010
13011         (Invocation::OverloadResolve): Update to take into account matching modifiers 
13012         too.
13013
13014         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
13015         a new SetFormalParameters object which we pass to InternalParameters.
13016
13017 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13018
13019         * expression.cs (NewArray): Merge into the ArrayCreation class.
13020
13021 2001-10-29  Ravi Pratap  <ravi@ximian.com>
13022
13023         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
13024         NewUserdefinedArray into one as there wasn't much of a use in having
13025         two separate ones.
13026
13027         * expression.cs (Argument): Change field's name to ArgType from Type.
13028
13029         (Type): New readonly property which returns the proper type, taking into 
13030         account ref/out modifiers.
13031
13032         (everywhere): Adjust code accordingly for the above.
13033
13034         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
13035         whether we are emitting for a ref or out parameter.
13036
13037         * expression.cs (Argument::Emit): Use the above field to set the state.
13038
13039         (LocalVariableReference::Emit): Update to honour the flag and emit the
13040         right stuff.
13041
13042         * parameter.cs (Attributes): Set the correct flags for ref parameters.
13043
13044         * expression.cs (Argument::FullDesc): New function to provide a full desc.
13045
13046         * support.cs (ParameterData): Add method ParameterDesc to the interface.
13047
13048         (ReflectionParameters, InternalParameters): Implement the above method.
13049
13050         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
13051         reporting errors.
13052
13053         (Invocation::FullMethodDesc): Ditto. 
13054
13055 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
13056
13057         * cs-parser.jay: Add extra production for the second form of array
13058         creation. 
13059
13060         * expression.cs (ArrayCreation): Update to reflect the above
13061         change. 
13062
13063         * Small changes to prepare for Array initialization.
13064
13065 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
13066
13067         * typemanager.cs (ImplementsInterface): interface might be null;
13068         Deal with this problem;
13069
13070         Also, we do store negative hits on the cache (null values), so use
13071         this instead of calling t.GetInterfaces on the type everytime.
13072
13073 2001-10-28  Ravi Pratap  <ravi@ximian.com>
13074
13075         * typemanager.cs (IsBuiltinType): New method to help determine the same.
13076
13077         * expression.cs (New::DoResolve): Get rid of array creation code and instead
13078         split functionality out into different classes.
13079
13080         (New::FormArrayType): Move into NewBuiltinArray.
13081
13082         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
13083         quite useless.
13084
13085         (NewBuiltinArray): New class to handle creation of built-in arrays.
13086
13087         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
13088         account creation of one-dimensional arrays.
13089
13090         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
13091
13092         (NewUserdefinedArray::DoResolve): Implement.
13093
13094         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
13095
13096         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
13097         we maintain inside the TypeManager. This is necessary to perform lookups on the
13098         module builder.
13099
13100         (LookupType): Update to perform GetType on the module builders too.     
13101
13102         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
13103
13104         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
13105
13106 2001-10-23  Ravi Pratap  <ravi@ximian.com>
13107
13108         * expression.cs (New::DoResolve): Implement guts of array creation.
13109
13110         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
13111
13112 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
13113
13114         * expression.cs: Fix bug I introduced lsat night that broke
13115         Delegates. 
13116
13117         (Expression.Resolve): Report a 246 error (can not resolve name)
13118         if we find a SimpleName in the stream.
13119
13120         (Expression.ResolveLValue): Ditto.
13121
13122         (Expression.ResolveWithSimpleName): This function is a variant of
13123         ResolveName, this one allows SimpleNames to be returned without a
13124         warning.  The only consumer of SimpleNames is MemberAccess
13125
13126 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
13127
13128         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
13129         might arrive here.  I have my doubts that this is correct.
13130
13131         * statement.cs (Lock): Implement lock statement.
13132
13133         * cs-parser.jay: Small fixes to support `lock' and `using'
13134
13135         * cs-tokenizer.cs: Remove extra space
13136
13137         * driver.cs: New flag --checked, allows to turn on integer math
13138         checking. 
13139
13140         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
13141         Threading.Monitor.Exit 
13142
13143 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
13144
13145         * expression.cs (IndexerAccess::DoResolveLValue): Set the
13146         Expression Class to be IndexerAccess.
13147
13148         Notice that Indexer::DoResolve sets the eclass to Value.
13149
13150 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
13151
13152         * class.cs (TypeContainer::Emit): Emit code for indexers.
13153
13154         * assign.cs (IAssignMethod): New interface implemented by Indexers
13155         and Properties for handling assignment.
13156
13157         (Assign::Emit): Simplify and reuse code. 
13158
13159         * expression.cs (IndexerAccess, PropertyExpr): Implement
13160         IAssignMethod, clean up old code. 
13161
13162 2001-10-22  Ravi Pratap  <ravi@ximian.com>
13163
13164         * typemanager.cs (ImplementsInterface): New method to determine if a type
13165         implements a given interface. Provides a nice cache too.
13166
13167         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
13168         method.
13169
13170         (ConvertReferenceExplicit): Ditto.
13171
13172         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
13173         various methods, with correct names etc.
13174
13175         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
13176         Operator.UnaryNegation.
13177
13178         * cs-parser.jay (operator_declarator): Be a little clever in the case where
13179         we have a unary plus or minus operator.
13180
13181         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
13182         UnaryMinus.
13183
13184         * everywhere : update accordingly.
13185
13186         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
13187         respectively.
13188
13189         * class.cs (Method::Define): For the case where we are implementing a method
13190         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
13191         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
13192
13193 2001-10-21  Ravi Pratap  <ravi@ximian.com>
13194
13195         * interface.cs (FindMembers): Implement to work around S.R.E
13196         lameness.
13197
13198         * typemanager.cs (IsInterfaceType): Implement.
13199
13200         (FindMembers): Update to handle interface types too.
13201
13202         * expression.cs (ImplicitReferenceConversion): Re-write bits which
13203         use IsAssignableFrom as that is not correct - it doesn't work.
13204
13205         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
13206         and accordingly override EmitStatement.
13207
13208         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
13209         using the correct logic :-)
13210
13211 2001-10-19  Ravi Pratap  <ravi@ximian.com>
13212
13213         * ../errors/cs-11.cs : Add to demonstrate error -11 
13214
13215 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
13216
13217         * assign.cs (Assign::Resolve): Resolve right hand side first, and
13218         then pass this as a hint to ResolveLValue.
13219
13220         * expression.cs (FieldExpr): Add Location information
13221
13222         (FieldExpr::LValueResolve): Report assignment to readonly
13223         variable. 
13224
13225         (Expression::ExprClassFromMemberInfo): Pass location information.
13226
13227         (Expression::ResolveLValue): Add new method that resolves an
13228         LValue. 
13229
13230         (Expression::DoResolveLValue): Default invocation calls
13231         DoResolve. 
13232
13233         (Indexers): New class used to keep track of indexers in a given
13234         Type. 
13235
13236         (IStackStore): Renamed from LValue, as it did not really describe
13237         what this did.  Also ResolveLValue is gone from this interface and
13238         now is part of Expression.
13239
13240         (ElementAccess): Depending on the element access type
13241
13242         * typemanager.cs: Add `indexer_name_type' as a Core type
13243         (System.Runtime.CompilerServices.IndexerNameAttribute)
13244
13245         * statement.cs (Goto): Take a location.
13246
13247 2001-10-18  Ravi Pratap  <ravi@ximian.com>
13248
13249         * delegate.cs (Delegate::VerifyDelegate): New method to verify
13250         if two delegates are compatible.
13251
13252         (NewDelegate::DoResolve): Update to take care of the case when
13253         we instantiate a delegate from another delegate.
13254
13255         * typemanager.cs (FindMembers): Don't even try to look up members
13256         of Delegate types for now.
13257
13258 2001-10-18  Ravi Pratap  <ravi@ximian.com>
13259
13260         * delegate.cs (NewDelegate): New class to take care of delegate
13261         instantiation.
13262
13263         * expression.cs (New): Split the delegate related code out into 
13264         the NewDelegate class.
13265
13266         * delegate.cs (DelegateInvocation): New class to handle delegate 
13267         invocation.
13268
13269         * expression.cs (Invocation): Split out delegate related code into
13270         the DelegateInvocation class.
13271
13272 2001-10-17  Ravi Pratap  <ravi@ximian.com>
13273
13274         * expression.cs (New::DoResolve): Implement delegate creation fully
13275         and according to the spec.
13276
13277         (New::DoEmit): Update to handle delegates differently.
13278
13279         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
13280         because of which we were printing out arguments in reverse order !
13281
13282         * delegate.cs (VerifyMethod): Implement to check if the given method
13283         matches the delegate.
13284
13285         (FullDelegateDesc): Implement.
13286
13287         (VerifyApplicability): Implement.
13288
13289         * expression.cs (Invocation::DoResolve): Update to accordingly handle
13290         delegate invocations too.
13291
13292         (Invocation::Emit): Ditto.
13293
13294         * ../errors/cs1593.cs : Added.
13295
13296         * ../errors/cs1594.cs : Added.
13297
13298         * delegate.cs (InstanceExpression, TargetMethod): New properties.
13299
13300 2001-10-16  Ravi Pratap  <ravi@ximian.com>
13301
13302         * typemanager.cs (intptr_type): Core type for System.IntPtr
13303
13304         (InitCoreTypes): Update for the same.
13305
13306         (iasyncresult_type, asynccallback_type): Ditto.
13307
13308         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
13309         correct.
13310
13311         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
13312         too.
13313
13314         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
13315         the builders for the 4 members of a delegate type :-)
13316
13317         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
13318         type.
13319
13320         * expression.cs (New::DoResolve): Implement guts for delegate creation.
13321
13322         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
13323
13324 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
13325
13326         * statement.cs (Break::Emit): Implement.   
13327         (Continue::Emit): Implement.
13328
13329         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13330         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13331         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
13332         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
13333         end loop
13334
13335         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
13336         properties that track the label for the current loop (begin of the
13337         loop and end of the loop).
13338
13339 2001-10-15  Ravi Pratap  <ravi@ximian.com>
13340
13341         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
13342         use of emitting anything at all.
13343
13344         * class.cs, rootcontext.cs : Get rid of calls to the same.
13345
13346         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
13347
13348         (Populate): Define the constructor correctly and set the implementation
13349         attributes.
13350
13351         * typemanager.cs (delegate_types): New hashtable to hold delegates that
13352         have been defined.
13353
13354         (AddDelegateType): Implement.
13355
13356         (IsDelegateType): Implement helper method.
13357
13358         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
13359
13360         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
13361         and accordingly handle it.
13362
13363         * delegate.cs (Populate): Take TypeContainer argument.
13364         Implement bits to define the Invoke method. However, I still haven't figured out
13365         how to take care of the native int bit :-(
13366
13367         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
13368         Qualify the name of the delegate, not its return type !
13369
13370         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
13371         conversion.
13372
13373         (StandardConversionExists): Checking for array types turns out to be recursive.
13374
13375         (ConvertReferenceExplicit): Implement array conversion.
13376
13377         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
13378
13379 2001-10-12  Ravi Pratap  <ravi@ximian.com>
13380
13381         * cs-parser.jay (delegate_declaration): Store the fully qualified
13382         name as it is a type declaration.
13383
13384         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
13385         readonly.
13386
13387         (DefineDelegate): Renamed from Define. Does the same thing essentially,
13388         as TypeContainer::DefineType.
13389
13390         (Populate): Method in which all the definition of the various methods (Invoke)
13391         etc is done.
13392
13393         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
13394         see.
13395
13396         (CloseDelegate): Finally creates the delegate.
13397
13398         * class.cs (TypeContainer::DefineType): Update to define delegates.
13399         (Populate, Emit and CloseType): Do the same thing here too.
13400
13401         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
13402         delegates in all these operations.
13403
13404 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
13405
13406         * expression.cs: LocalTemporary: a new expression used to
13407         reference a temporary that has been created.
13408
13409         * assign.cs: Handle PropertyAccess back here, so that we can
13410         provide the proper semantic access to properties.
13411
13412         * expression.cs (Expression::ConvertReferenceExplicit): Implement
13413         a few more explicit conversions. 
13414
13415         * modifiers.cs: `NEW' modifier maps to HideBySig.
13416
13417         * expression.cs (PropertyExpr): Make this into an
13418         ExpressionStatement, and support the EmitStatement code path. 
13419
13420         Perform get/set error checking, clean up the interface.
13421
13422         * assign.cs: recognize PropertyExprs as targets, and if so, turn
13423         them into toplevel access objects.
13424
13425 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
13426
13427         * expression.cs: PropertyExpr::PropertyExpr: use work around the
13428         SRE.
13429
13430         * typemanager.cs: Keep track here of our PropertyBuilders again to
13431         work around lameness in SRE.
13432
13433 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
13434
13435         * expression.cs (LValue::LValueResolve): New method in the
13436         interface, used to perform a second resolution pass for LValues. 
13437
13438         (This::DoResolve): Catch the use of this in static methods.
13439
13440         (This::LValueResolve): Implement.
13441
13442         (This::Store): Remove warning, assigning to `this' in structures
13443         is 
13444
13445         (Invocation::Emit): Deal with invocation of
13446         methods on value types.  We need to pass the address to structure
13447         methods rather than the object itself.  (The equivalent code to
13448         emit "this" for structures leaves the entire structure on the
13449         stack instead of a pointer to it). 
13450
13451         (ParameterReference::DoResolve): Compute the real index for the
13452         argument based on whether the method takes or not a `this' pointer
13453         (ie, the method is static).
13454
13455         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
13456         value types returned from functions when we need to invoke a
13457         method on the sturcture.
13458
13459
13460 2001-10-11  Ravi Pratap  <ravi@ximian.com>
13461
13462         * class.cs (TypeContainer::DefineType): Method to actually do the business of
13463         defining the type in the Modulebuilder or Typebuilder. This is to take
13464         care of nested types which need to be defined on the TypeBuilder using
13465         DefineNestedMethod.
13466
13467         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
13468         methods in RootContext, only ported to be part of TypeContainer.
13469
13470         (TypeContainer::GetInterfaceOrClass): Ditto.
13471
13472         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
13473
13474         * interface.cs (Interface::DefineInterface): New method. Does exactly
13475         what RootContext.CreateInterface did earlier, only it takes care of nested types 
13476         too.
13477
13478         (Interface::GetInterfaces): Move from RootContext here and port.
13479
13480         (Interface::GetInterfaceByName): Same here.
13481
13482         * rootcontext.cs (ResolveTree): Re-write.
13483
13484         (PopulateTypes): Re-write.
13485
13486         * class.cs (TypeContainer::Populate): Populate nested types too.
13487         (TypeContainer::Emit): Emit nested members too.
13488
13489         * typemanager.cs (AddUserType): Do not make use of the FullName property,
13490         instead just use the name argument passed in as it is already fully
13491         qualified.
13492
13493         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
13494         to TypeContainer mapping to see if a type is user-defined.
13495
13496         * class.cs (TypeContainer::CloseType): Implement. 
13497
13498         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
13499         the default constructor.
13500
13501         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
13502         twice.
13503
13504         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
13505
13506         * interface.cs (CloseType): Create the type here.
13507
13508         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
13509         the hierarchy.
13510
13511         Remove all the methods which are now in TypeContainer.
13512
13513 2001-10-10  Ravi Pratap  <ravi@ximian.com>
13514
13515         * delegate.cs (Define): Re-write bits to define the delegate
13516         correctly.
13517
13518 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
13519
13520         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
13521
13522         * expression.cs (ImplicitReferenceConversion): handle null as well
13523         as a source to convert to any reference type.
13524
13525         * statement.cs (Return): Perform any implicit conversions to
13526         expected return type.  
13527
13528         Validate use of return statement.  
13529
13530         * codegen.cs (EmitContext): Pass the expected return type here.
13531
13532         * class.cs (Method, Constructor, Property): Pass expected return
13533         type to EmitContext.
13534
13535 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
13536
13537         * expression.cs: Make DoResolve take an EmitContext instead of a
13538         TypeContainer.
13539
13540         Replaced `l' and `location' for `loc', for consistency.
13541
13542         (Error, Warning): Remove unneeded Tc argument.
13543
13544         * assign.cs, literal.cs, constant.cs: Update to new calling
13545         convention. 
13546
13547         * codegen.cs: EmitContext now contains a flag indicating whether
13548         code is being generated in a static method or not.
13549
13550         * cs-parser.jay: DecomposeQI, new function that replaces the old
13551         QualifiedIdentifier.  Now we always decompose the assembled
13552         strings from qualified_identifier productions into a group of
13553         memberaccesses.
13554
13555 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
13556
13557         * rootcontext.cs: Deal with field-less struct types correctly now
13558         by passing the size option to Define Type.
13559
13560         * class.cs: Removed hack that created one static field. 
13561
13562 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13563
13564         * statement.cs: Moved most of the code generation here. 
13565
13566 2001-10-09  Ravi Pratap  <ravi@ximian.com>
13567
13568         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
13569         seem very right.
13570
13571         (ElementAccess): Remove useless bits for now - keep checks as the spec
13572         says.
13573
13574 2001-10-08  Ravi Pratap  <ravi@ximian.com>
13575
13576         * expression.cs (ElementAccess::DoResolve): Remove my crap code
13577         and start performing checks according to the spec.
13578
13579 2001-10-07  Ravi Pratap  <ravi@ximian.com>
13580
13581         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
13582         rank_specifiers instead.
13583
13584         (rank_specifiers): Change the order in which the rank specifiers are stored
13585
13586         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
13587
13588         * expression.cs (ElementAccess): Implement the LValue interface too.
13589
13590 2001-10-06  Ravi Pratap  <ravi@ximian.com>
13591
13592         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
13593         except that user defined conversions are not included.
13594
13595         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
13596         perform the conversion of the return type, if necessary.
13597
13598         (New::DoResolve): Check whether we are creating an array or an object
13599         and accordingly do the needful.
13600
13601         (New::Emit): Same here.
13602
13603         (New::DoResolve): Implement guts of array creation.
13604
13605         (New::FormLookupType): Helper function.
13606
13607 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
13608
13609         * codegen.cs: Removed most of the code generation here, and move the
13610         corresponding code generation bits to the statement classes. 
13611
13612         Added support for try/catch/finalize and throw.
13613
13614         * cs-parser.jay: Added support for try/catch/finalize.
13615
13616         * class.cs: Catch static methods having the flags override,
13617         virtual or abstract.
13618
13619         * expression.cs (UserCast): This user cast was not really doing
13620         what it was supposed to do.  Which is to be born in fully resolved
13621         state.  Parts of the resolution were being performed at Emit time! 
13622
13623         Fixed this code.
13624
13625 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13626
13627         * expression.cs: Implicity convert the result from UserCast.
13628
13629 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13630
13631         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
13632         prevented it from working correctly. 
13633
13634         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
13635         merely ConvertImplicit.
13636
13637 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
13638
13639         * typemanager.cs: Make the LookupTypeContainer function static,
13640         and not per-instance.  
13641
13642         * class.cs: Make static FindMembers (the one that takes a Type
13643         argument). 
13644
13645         * codegen.cs: Add EmitForeach here.
13646
13647         * cs-parser.jay: Make foreach a toplevel object instead of the
13648         inline expansion, as we need to perform semantic analysis on it. 
13649
13650 2001-10-05  Ravi Pratap  <ravi@ximian.com>
13651
13652         * expression.cs (Expression::ImplicitUserConversion): Rename to
13653         UserDefinedConversion.
13654
13655         (Expression::UserDefinedConversion): Take an extra argument specifying 
13656         whether we look for explicit user conversions too.
13657
13658         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
13659
13660         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
13661
13662         (ExplicitUserConversion): Make it a call to UserDefinedConversion
13663         with the appropriate arguments.
13664
13665         * cs-parser.jay (cast_expression): Record location too.
13666
13667         * expression.cs (Cast): Record location info.
13668
13669         (Expression::ConvertExplicit): Take location argument.
13670
13671         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
13672         to determine if we are doing explicit conversions.
13673
13674         (UserCast::Emit): Update accordingly.
13675
13676         (Expression::ConvertExplicit): Report an error if everything fails.
13677
13678         * ../errors/cs0030.cs : Add.
13679
13680 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
13681
13682         * modifiers.cs: If the ABSTRACT keyword is present, also set the
13683         virtual and newslot bits. 
13684
13685         * class.cs (TypeContainer::RegisterRequiredImplementations):
13686         Record methods we need.
13687
13688         (TypeContainer::MakeKey): Helper function to make keys for
13689         MethodBases, since the Methodbase key is useless.
13690
13691         (TypeContainer::Populate): Call RegisterRequiredImplementations
13692         before defining the methods.   
13693
13694         Create a mapping for method_builders_to_methods ahead of time
13695         instead of inside a tight loop.
13696
13697         (::RequireMethods):  Accept an object as the data to set into the
13698         hashtable so we can report interface vs abstract method mismatch.
13699
13700 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13701
13702         * report.cs: Make all of it static.
13703
13704         * rootcontext.cs: Drop object_type and value_type computations, as
13705         we have those in the TypeManager anyways.
13706
13707         Drop report instance variable too, now it is a global.
13708
13709         * driver.cs: Use try/catch on command line handling.
13710
13711         Add --probe option to debug the error reporting system with a test
13712         suite. 
13713
13714         * report.cs: Add support for exiting program when a probe
13715         condition is reached.
13716
13717 2001-10-03  Ravi Pratap  <ravi@ximian.com>
13718
13719         * expression.cs (Binary::DoNumericPromotions): Fix the case when
13720         we do a forcible conversion regardless of type, to check if 
13721         ForceConversion returns a null.
13722
13723         (Binary::error19): Use location to report error.
13724
13725         (Unary::error23): Use location here too.
13726
13727         * ../errors/cs0019.cs : Check in.
13728
13729         * ../errors/cs0023.cs : Check in.
13730
13731         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
13732         case of a non-null MethodInfo object with a length of 0 !
13733
13734         (Binary::ResolveOperator): Flag error if overload resolution fails to find
13735         an applicable member - according to the spec :-)
13736         Also fix logic to find members in base types.
13737
13738         (Unary::ResolveOperator): Same here.
13739
13740         (Unary::report23): Change name to error23 and make first argument a TypeContainer
13741         as I was getting thoroughly confused between this and error19 :-)
13742
13743         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
13744         (::FindMostEncompassedType): Implement.
13745         (::FindMostEncompassingType): Implement.
13746         (::StandardConversionExists): Implement.
13747
13748         (UserImplicitCast): Re-vamp. We now need info about most specific
13749         source and target types so that we can do the necessary conversions.
13750
13751         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
13752         mathematical union with no duplicates.
13753
13754 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
13755
13756         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
13757         in order from base classes to child classes, so that we can in
13758         child classes look up in our parent for method names and
13759         attributes (required for handling abstract, virtual, new, override
13760         constructs: we need to instrospect our base class, and if we dont
13761         populate the classes in order, the introspection might be
13762         incorrect.  For example, a method could query its parent before
13763         the parent has any methods and would determine that the parent has
13764         no abstract methods (while it could have had them)).
13765
13766         (RootContext::CreateType): Record the order in which we define the
13767         classes.
13768
13769 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
13770
13771         * class.cs (TypeContainer::Populate): Also method definitions can
13772         fail now, keep track of this.
13773
13774         (TypeContainer::FindMembers): Implement support for
13775         DeclaredOnly/noDeclaredOnly flag.
13776
13777         (Constructor::Emit) Return the ConstructorBuilder.
13778
13779         (Method::Emit) Return the MethodBuilder. 
13780         Check for abstract or virtual methods to be public.
13781
13782         * rootcontext.cs (RootContext::CreateType): Register all the
13783         abstract methods required for the class to be complete and the
13784         interface methods that must be implemented. 
13785
13786         * cs-parser.jay: Report error 501 (method requires body if it is
13787         not marked abstract or extern).
13788
13789         * expression.cs (TypeOf::Emit): Implement.
13790
13791         * typemanager.cs: runtime_handle_type, new global type.
13792
13793         * class.cs (Property::Emit): Generate code for properties.
13794
13795 2001-10-02  Ravi Pratap  <ravi@ximian.com>
13796
13797         * expression.cs (Unary::ResolveOperator): Find operators on base type
13798         too - we now conform exactly to the spec.
13799
13800         (Binary::ResolveOperator): Same here.
13801
13802         * class.cs (Operator::Define): Fix minor quirk in the tests.
13803
13804         * ../errors/cs0215.cs : Added.
13805
13806         * ../errors/cs0556.cs : Added.
13807
13808         * ../errors/cs0555.cs : Added.
13809
13810 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
13811
13812         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
13813         single integer which is really efficient
13814
13815 2001-10-01  Ravi Pratap  <ravi@ximian.com>
13816
13817         *  expression.cs (Expression::ImplicitUserConversion): Use location
13818         even in the case when we are examining True operators.
13819  
13820         * class.cs (Operator::Define): Perform extensive checks to conform
13821         with the rules for operator overloading in the spec.
13822
13823         * expression.cs (Expression::ImplicitReferenceConversion): Implement
13824         some of the other conversions mentioned in the spec.
13825
13826         * typemanager.cs (array_type): New static member for the System.Array built-in
13827         type.
13828
13829         (cloneable_interface): For System.ICloneable interface.
13830
13831         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
13832         we start resolving the tree and populating types.
13833
13834         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
13835  
13836 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
13837
13838         * expression.cs (Expression::ExprClassFromMemberInfo,
13839         Expression::Literalize): Create literal expressions from
13840         FieldInfos which are literals.
13841
13842         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
13843         type casts, because they were wrong.  The test suite in tests
13844         caught these ones.
13845
13846         (ImplicitNumericConversion): ushort to ulong requires a widening
13847         cast. 
13848
13849         Int32 constant to long requires widening cast as well.
13850
13851         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
13852         for integers because the type on the stack is not i4.
13853
13854 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
13855
13856         * expression.cs (report118): require location argument. 
13857
13858         * parameter.cs: Do not dereference potential null value.
13859
13860         * class.cs: Catch methods that lack the `new' keyword when
13861         overriding a name.  Report warnings when `new' is used without
13862         anything being there to override.
13863
13864         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
13865
13866         * class.cs: Only add constructor to hashtable if it is non-null
13867         (as now constructors can fail on define).
13868
13869         (TypeManager, Class, Struct): Take location arguments.
13870
13871         Catch field instance initialization in structs as errors.
13872
13873         accepting_filter: a new filter for FindMembers that is static so
13874         that we dont create an instance per invocation.
13875
13876         (Constructor::Define): Catch errors where a struct constructor is
13877         parameterless 
13878
13879         * cs-parser.jay: Pass location information for various new
13880         constructs. 
13881
13882         * delegate.cs (Delegate): take a location argument.
13883
13884         * driver.cs: Do not call EmitCode if there were problesm in the
13885         Definition of the types, as many Builders wont be there. 
13886
13887         * decl.cs (Decl::Decl): Require a location argument.
13888
13889         * cs-tokenizer.cs: Handle properly hex constants that can not fit
13890         into integers, and find the most appropiate integer for it.
13891
13892         * literal.cs: Implement ULongLiteral.
13893
13894         * rootcontext.cs: Provide better information about the location of
13895         failure when CreateType fails.
13896
13897 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
13898
13899         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
13900         as well.
13901
13902         * expression.cs (Binary::CheckShiftArguments): Add missing type
13903         computation.
13904         (Binary::ResolveOperator): Add type to the logical and and logical
13905         or, Bitwise And/Or and Exclusive Or code paths, it was missing
13906         before.
13907
13908         (Binary::DoNumericPromotions): In the case where either argument
13909         is ulong (and most signed types combined with ulong cause an
13910         error) perform implicit integer constant conversions as well.
13911
13912 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
13913
13914         * expression.cs (UserImplicitCast): Method should always be
13915         non-null. 
13916         (Invocation::BetterConversion): Simplified test for IntLiteral.
13917
13918         (Expression::ImplicitNumericConversion): Split this routine out.
13919         Put the code that performs implicit constant integer conversions
13920         here. 
13921
13922         (Expression::Resolve): Become a wrapper around DoResolve so we can
13923         check eclass and type being set after resolve.
13924
13925         (Invocation::Badness): Remove this dead function
13926
13927         (Binary::ResolveOperator): Do not compute the expensive argumnets
13928         unless we have a union for it.
13929
13930         (Probe::Emit): Is needs to do an isinst and then
13931         compare against null.
13932
13933         (::CanConvert): Added Location argument.  If the Location argument
13934         is null (Location.Null), then we do not report errors.  This is
13935         used by the `probe' mechanism of the Explicit conversion.  We do
13936         not want to generate an error for something that the user
13937         explicitly requested to be casted.  But the pipeline for an
13938         explicit cast first tests for potential implicit casts.
13939
13940         So for now, if the Location is null, it means `Probe only' to
13941         avoid adding another argument.   Might have to revise this
13942         strategy later.
13943
13944         (ClassCast): New class used to type cast objects into arbitrary
13945         classes (used in Explicit Reference Conversions).
13946
13947         Implement `as' as well.
13948
13949         Reverted all the patches from Ravi below: they were broken:
13950
13951                 * The use of `level' as a mechanism to stop recursive
13952                   invocations is wrong.  That was there just to catch the
13953                   bug with a strack trace but not as a way of addressing
13954                   the problem.
13955
13956                   To fix the problem we have to *understand* what is going
13957                   on and the interactions and come up with a plan, not
13958                   just get things going.
13959
13960                 * The use of the type conversion cache that I proposed
13961                   last night had an open topic: How does this work across
13962                   protection domains.  A user defined conversion might not
13963                   be public in the location where we are applying the
13964                   conversion, a different conversion might be selected
13965                   (ie, private A->B (better) but public B->A (worse),
13966                   inside A, A->B applies, but outside it, B->A will
13967                   apply).
13968
13969                 * On top of that (ie, even if the above is solved),
13970                   conversions in a cache need to be abstract.  Ie, `To
13971                   convert from an Int to a Short use an OpcodeCast', not
13972                   `To convert from an Int to a Short use the OpcodeCast on
13973                   the variable 5' (which is what this patch was doing).
13974
13975 2001-09-28  Ravi Pratap  <ravi@ximian.com>
13976
13977         * expression.cs (Invocation::ConversionExists): Re-write to use
13978         the conversion cache
13979
13980         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
13981         cache all conversions done, not just user-defined ones.
13982
13983         (Invocation::BetterConversion): The real culprit. Use ConversionExists
13984         to determine if a conversion exists instead of acutually trying to 
13985         perform the conversion. It's faster too.
13986
13987         (Expression::ConvertExplicit): Modify to use ConversionExists to check
13988         and only then attempt the implicit conversion.
13989
13990 2001-09-28  Ravi Pratap  <ravi@ximian.com>
13991
13992         * expression.cs (ConvertImplicit): Use a cache for conversions
13993         already found. Check level of recursion and bail out if necessary.
13994
13995 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
13996
13997         * typemanager.cs (string_concat_string_string, string_concat_object_object):
13998         Export standard methods that we expect for string operations.
13999
14000         * statement.cs (Block::UsageWarning): Track usage of variables and
14001         report the errors for not used variables.
14002
14003         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
14004         operator. 
14005
14006 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14007
14008         * codegen.cs: remove unnneded code 
14009
14010         * expression.cs: Removed BuiltinTypeAccess class
14011
14012         Fix the order in which implicit conversions are
14013         done.  
14014
14015         The previous fixed dropped support for boxed conversions (adding a
14016         test to the test suite now)
14017
14018         (UserImplicitCast::CanConvert): Remove test for source being null,
14019         that code is broken.  We should not feed a null to begin with, if
14020         we do, then we should track the bug where the problem originates
14021         and not try to cover it up here.
14022
14023         Return a resolved expression of type UserImplicitCast on success
14024         rather than true/false.  Ravi: this is what I was talking about,
14025         the pattern is to use a static method as a "constructor" for
14026         objects. 
14027
14028         Also, do not create arguments until the very last minute,
14029         otherwise we always create the arguments even for lookups that
14030         will never be performed. 
14031
14032         (UserImplicitCast::Resolve): Eliminate, objects of type
14033         UserImplicitCast are born in a fully resolved state. 
14034
14035         * typemanager.cs (InitCoreTypes): Init also value_type
14036         (System.ValueType). 
14037
14038         * expression.cs (Cast::Resolve): First resolve the child expression.
14039
14040         (LValue): Add new method AddressOf to be used by
14041         the `&' operator.  
14042
14043         Change the argument of Store to take an EmitContext instead of an
14044         ILGenerator, because things like FieldExpr need to be able to call
14045         their children expression to generate the instance code. 
14046
14047         (Expression::Error, Expression::Warning): Sugar functions for
14048         reporting errors.
14049
14050         (Expression::MemberLookup): Accept a TypeContainer instead of a
14051         Report as the first argument.
14052
14053         (Expression::ResolvePrimary): Killed.  I still want to improve
14054         this as currently the code is just not right.
14055
14056         (Expression::ResolveMemberAccess): Simplify, but it is still
14057         wrong. 
14058
14059         (Unary::Resolve): Catch errors in AddressOf operators.
14060
14061         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
14062         index to a byte for the short-version, or the compiler will choose
14063         the wrong Emit call, which generates the wrong data.
14064
14065         (ParameterReference::Emit, ::Store): same.
14066
14067         (FieldExpr::AddressOf): Implement.
14068
14069         * typemanager.cs: TypeManager: made public variable instead of
14070         property.
14071
14072         * driver.cs: document --fatal.
14073
14074         * report.cs (ErrorMessage, WarningMessage): new names for the old
14075         Error and Warning classes.
14076
14077         * cs-parser.jay (member_access): Turn built-in access to types
14078         into a normal simplename
14079
14080 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14081
14082         * expression.cs (Invocation::BetterConversion): Fix to cope
14083         with q being null, since this was introducing a bug.
14084
14085         * expression.cs (ConvertImplicit): Do built-in conversions first.
14086
14087 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14088
14089         * expression.cs (UserImplicitCast::Resolve): Fix bug.
14090
14091 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14092
14093         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
14094         I had introduced long ago (what's new ?).
14095
14096         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
14097         the work of all the checking. 
14098         (ConvertImplicit): Call CanConvert and only then create object if necessary.
14099         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
14100
14101         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
14102         that is the right way. 
14103
14104         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
14105         overloading resolution. Use everywhere instead of cutting and pasting code.
14106
14107         (Binary::ResolveOperator): Use MakeUnionSet.
14108
14109         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
14110         we have to convert to bool types. Not complete yet.
14111
14112 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14113
14114         * typemanager.cs (TypeManager::CSharpName): support ushort.
14115
14116         * expression.cs (Expression::TryImplicitIntConversion): Attempts
14117         to provide an expression that performsn an implicit constant int
14118         conversion (section 6.1.6).
14119         (Expression::ConvertImplicitRequired): Reworked to include
14120         implicit constant expression conversions.
14121
14122         (Expression::ConvertNumericExplicit): Finished.
14123
14124         (Invocation::Emit): If InstanceExpression is null, then it means
14125         that we perform a call on this.
14126
14127 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14128
14129         * expression.cs (Unary::Emit): Remove some dead code.
14130         (Probe): Implement Resolve and Emit for `is'.
14131         (Expression::ConvertImplicitRequired): Attempt to do constant
14132         expression conversions here.  Maybe should be moved to
14133         ConvertImplicit, but I am not sure.
14134         (Expression::ImplicitLongConstantConversionPossible,
14135         Expression::ImplicitIntConstantConversionPossible): New functions
14136         that tell whether is it possible to apply an implicit constant
14137         expression conversion.
14138
14139         (ConvertNumericExplicit): Started work on explicit numeric
14140         conversions.
14141
14142         * cs-parser.jay: Update operator constants.
14143
14144         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
14145         (Parameters::GetSignature): Hook up VerifyArgs here.
14146         (Parameters::VerifyArgs): Verifies that no two arguments have the
14147         same name. 
14148
14149         * class.cs (Operator): Update the operator names to reflect the
14150         ones that the spec expects (as we are just stringizing the
14151         operator names).
14152
14153         * expression.cs (Unary::ResolveOperator): Fix bug: Use
14154         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
14155         previous usage did only work for our methods.
14156         (Expression::ConvertImplicit): Handle decimal implicit numeric
14157         conversions as well.
14158         (Expression::InternalTypeConstructor): Used to invoke constructors
14159         on internal types for default promotions.
14160
14161         (Unary::Emit): Implement special handling for the pre/post
14162         increment/decrement for overloaded operators, as they need to have
14163         the same semantics as the other operators.
14164
14165         (Binary::ResolveOperator): ditto.
14166         (Invocation::ConversionExists): ditto.
14167         (UserImplicitCast::Resolve): ditto.
14168
14169 2001-09-26  Ravi Pratap  <ravi@ximian.com>
14170
14171         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
14172         operator, return after emitting body. Regression tests pass again !
14173
14174         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
14175         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
14176         (Invocation::OverloadResolve): Ditto.
14177         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
14178
14179         * everywhere : update calls to the above methods accordingly.
14180
14181 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14182
14183         * assign.cs (Assign): Make it inherit from ExpressionStatement.
14184
14185         * expression.cs (ExpressionStatement): New base class used for
14186         expressions that can appear in statements, so that we can provide
14187         an alternate path to generate expression that do not leave a value
14188         on the stack.
14189
14190         (Expression::Emit, and all the derivatives): We no longer return
14191         whether a value is left on the stack or not.  Every expression
14192         after being emitted leaves a single value on the stack.
14193
14194         * codegen.cs (EmitContext::EmitStatementExpression): Use the
14195         facilties of ExpressionStatement if possible.
14196
14197         * cs-parser.jay: Update statement_expression.
14198
14199 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
14200
14201         * driver.cs: Change the wording of message
14202
14203 2001-09-25  Ravi Pratap  <ravi@ximian.com>
14204
14205         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
14206         the type of the expression to the return type of the method if
14207         we have an overloaded operator match ! The regression tests pass again !
14208         (Unary::ResolveOperator): Ditto.
14209
14210         * expression.cs (Invocation::ConversionExists): Correct the member lookup
14211         to find "op_Implicit", not "implicit" ;-)
14212         (UserImplicitCast): New class to take care of user-defined implicit conversions.
14213         (ConvertImplicit, ForceConversion): Take TypeContainer argument
14214
14215         * everywhere : Correct calls to the above accordingly.
14216
14217         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
14218         (ConvertImplicit): Do user-defined conversion if it exists.
14219
14220 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
14221
14222         * assign.cs: track location.
14223         (Resolve): Use implicit conversions on assignment.
14224
14225         * literal.cs: Oops.  Not good, Emit of short access values should
14226         pass (Bytes) or the wrong argument will be selected.
14227
14228         * expression.cs (Unary::Emit): Emit code for -expr.
14229
14230         (Unary::ResolveOperator): Handle `Substract' for non-constants
14231         (substract from zero from the non-constants).
14232         Deal with Doubles as well. 
14233
14234         (Expression::ConvertImplicitRequired): New routine that reports an
14235         error if no implicit conversion exists. 
14236
14237         (Invocation::OverloadResolve): Store the converted implicit
14238         expressions if we make them
14239
14240 2001-09-24  Ravi Pratap  <ravi@ximian.com>
14241
14242         * class.cs (ConstructorInitializer): Take a Location argument.
14243         (ConstructorBaseInitializer): Same here.
14244         (ConstructorThisInitializer): Same here.
14245
14246         * cs-parser.jay : Update all calls accordingly.
14247
14248         * expression.cs (Unary, Binary, New): Take location argument.
14249         Update accordingly everywhere.
14250
14251         * cs-parser.jay : Update all calls to the above to take a location
14252         argument.
14253
14254         * class.cs : Ditto.
14255
14256 2001-09-24  Ravi Pratap  <ravi@ximian.com>
14257
14258         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
14259         (Invocation::BetterConversion): Same here
14260         (Invocation::ConversionExists): Ditto.
14261
14262         (Invocation::ConversionExists): Implement.
14263
14264 2001-09-22  Ravi Pratap  <ravi@ximian.com>
14265
14266         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
14267         Also take an additional TypeContainer argument.
14268
14269         * All over : Pass in TypeContainer as argument to OverloadResolve.
14270
14271         * typemanager.cs (CSharpName): Update to check for the string type and return
14272         that too.
14273
14274         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
14275         a given method.
14276
14277 2001-09-21  Ravi Pratap  <ravi@ximian.com>
14278
14279         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
14280         (Invocation::BetterFunction): Implement.
14281         (Invocation::BetterConversion): Implement.
14282         (Invocation::ConversionExists): Skeleton, no implementation yet.
14283
14284         Okay, things work fine !
14285
14286 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
14287
14288         * typemanager.cs: declare and load enum_type, delegate_type and
14289         void_type. 
14290
14291         * expression.cs (Expression::Emit): Now emit returns a value that
14292         tells whether a value is left on the stack or not.  This strategy
14293         might be reveted tomorrow with a mechanism that would address
14294         multiple assignments.
14295         (Expression::report118): Utility routine to report mismatches on
14296         the ExprClass.
14297
14298         (Unary::Report23): Report impossible type/operator combination
14299         utility function.
14300
14301         (Unary::IsIncrementableNumber): Whether the type can be
14302         incremented or decremented with add.
14303         (Unary::ResolveOperator): Also allow enumerations to be bitwise
14304         complemented. 
14305         (Unary::ResolveOperator): Implement ++, !, ~,
14306
14307         (Invocation::Emit): Deal with new Emit convetion.
14308
14309         * All Expression derivatives: Updated their Emit method to return
14310         whether they leave values on the stack or not.
14311
14312         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
14313         stack for expressions that are statements. 
14314
14315 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
14316
14317         * expression.cs (LValue): New interface.  Must be implemented by
14318         LValue objects.
14319         (LocalVariableReference, ParameterReference, FieldExpr): Implement
14320         LValue interface.
14321
14322         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
14323         interface for generating code, simplifies the code.
14324
14325 2001-09-20  Ravi Pratap  <ravi@ximian.com>
14326
14327         * expression.cs (everywhere): Comment out return statements in ::Resolve
14328         methods to avoid the warnings.
14329
14330 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
14331
14332         * driver.cs (parse): Report error 2001 if we can not open the
14333         source file.
14334
14335         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
14336         not resolve it.
14337
14338         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
14339         object. 
14340
14341         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
14342         otherwise nested blocks end up with the same index.
14343
14344         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
14345
14346         * expression.cs:  Instead of having FIXMEs in the Resolve
14347         functions, throw exceptions so it is obvious that we are facing a
14348         bug. 
14349
14350         * cs-parser.jay (invocation_expression): Pass Location information.
14351
14352         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
14353         Use a basename for those routines because .NET does not like paths
14354         on them. 
14355
14356         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
14357         already defined.
14358
14359 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
14360
14361         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
14362         are loading the correct data types (throws an exception if not).
14363         (TypeManager::InitCoreTypes): Use CoreLookupType
14364
14365         * expression.cs (Unary::ResolveOperator): return the child
14366         expression for expressions which are just +expr.
14367         (Unary::ResolveOperator): Return negative literals for -LITERAL
14368         expressions (otherwise they are Unary {Literal}).
14369         (Invocation::Badness): Take into account `Implicit constant
14370         expression conversions'.
14371
14372         * literal.cs (LongLiteral): Implement long literal class.
14373         (IntLiteral): export the `Value' of the intliteral. 
14374
14375 2001-09-19  Ravi Pratap  <ravi@ximian.com>
14376
14377         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
14378
14379         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
14380         instead of 'Operator'
14381
14382         * expression.cs (Binary::ResolveOperator): Update accordingly.
14383         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
14384         and 'Minus'
14385
14386         * cs-parser.jay (unary_expression): Update to use the new names.
14387
14388         * gen-treedump.cs (GetUnary): Same here.
14389
14390         * expression.cs (Unary::Resolve): Implement.
14391         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
14392         operators are found instead of making noise ;-)
14393         (Unary::ResolveOperator): New method to do precisely the same thing which
14394         Binary::ResolveOperator does for Binary expressions.
14395         (Unary.method, .Arguments): Add.
14396         (Unary::OperName): Implement.   
14397         (Unary::ForceConversion): Copy and Paste !
14398
14399         * class.cs (Operator::Define): Fix a small bug for the case when we have 
14400         a unary operator.
14401
14402         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
14403         for the inbuilt operators. Only overloading works for now ;-)
14404
14405 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
14406
14407         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
14408         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
14409
14410         * expression.cs (This::Emit): Implement. 
14411         (This::Resolve): Implement.
14412         (TypeOf:Resolve): Implement.
14413         (Expression::ResolveSimpleName): Add an implicit this to instance
14414         field references. 
14415         (MemberAccess::Resolve): Deal with Parameters and Fields. 
14416         Bind instance variable to Field expressions.
14417         (FieldExpr::Instance): New field used to track the expression that
14418         represents the object instance.
14419         (FieldExpr::Resolve): Track potential errors from MemberLookup not
14420         binding 
14421         (FieldExpr::Emit): Implement.
14422
14423         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
14424         the last instruction contains a return opcode to avoid generating
14425         the last `ret' instruction (this generates correct code, and it is
14426         nice to pass the peverify output).
14427
14428         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
14429         initializer for static and instance variables.
14430         (Constructor::Emit): Allow initializer to be null in the case of
14431         static constructors.  Only emit initializer for instance
14432         constructors. 
14433
14434         (TypeContainer::FindMembers): Return a null array if there are no
14435         matches.
14436
14437         Also fix the code for the MemberTypes.Method branch, as it was not
14438         scanning that for operators (or tried to access null variables before).
14439
14440         * assign.cs (Assign::Emit): Handle instance and static fields. 
14441
14442         * TODO: Updated.
14443
14444         * driver.cs: Stop compilation if there are parse errors.
14445
14446         * cs-parser.jay (constructor_declaration): Provide default base
14447         initializer for non-static constructors.
14448         (constructor_declarator): Do not provide a default base
14449         initializers if none was specified.
14450         Catch the fact that constructors should not have parameters.
14451
14452         * class.cs: Do not emit parent class initializers for static
14453         constructors, that should be flagged as an error.
14454
14455 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14456
14457         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
14458         Move back code into TypeContainer::Populate.
14459
14460 2001-09-18  Ravi Pratap  <ravi@ximian.com>
14461
14462         * class.cs (TypeContainer::AddConstructor): Fix the check to
14463         compare against Name, not Basename. 
14464         (Operator::OpType): Change Plus and Minus to Add and Subtract.
14465
14466         * cs-parser.jay : Update accordingly.
14467
14468         * class.cs (TypeContainer::FindMembers): For the case where we are searching
14469         for methods, don't forget to look into the operators too.
14470         (RegisterMethodBuilder): Helper method to take care of this for
14471         methods, constructors and operators.
14472         (Operator::Define): Completely revamp.
14473         (Operator.OperatorMethod, MethodName): New fields.
14474         (TypeContainer::Populate): Move the registering of builders into
14475         RegisterMethodBuilder.
14476         (Operator::Emit): Re-write.
14477
14478         * expression.cs (Binary::Emit): Comment out code path to emit method
14479         invocation stuff for the case when we have a user defined operator. I am
14480         just not able to get it right !
14481
14482 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14483
14484         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
14485         argument. 
14486
14487         (Expression::MemberLookup): Provide a version that allows to
14488         specify the MemberTypes and BindingFlags. 
14489
14490         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
14491         so it was not fetching variable information from outer blocks.
14492
14493         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
14494         Beforefieldinit as it was buggy.
14495
14496         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
14497         that Ravi put here.  
14498
14499         * class.cs (Constructor::Emit): Only emit if block is not null.
14500         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
14501         deal with this by semantically definining it as if the user had
14502         done it.
14503
14504         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
14505         constructors as we now "emit" them at a higher level.
14506
14507         (TypeContainer::DefineDefaultConstructor): Used to define the
14508         default constructors if none was provided.
14509
14510         (ConstructorInitializer): Add methods Resolve and Emit. 
14511
14512         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
14513
14514 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14515
14516         * class.cs (TypeContainer::EmitDefaultConstructor): Register
14517         the default constructor builder with our hashtable for methodbuilders
14518         to methodcores.
14519
14520         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
14521         and argument_count is 0 in which case we have a match.
14522         (Binary::ResolveOperator): More null checking and miscellaneous coding
14523         style cleanup.
14524
14525 2001-09-17  Ravi Pratap  <ravi@ximian.com>
14526
14527         * rootcontext.cs (IsNameSpace): Compare against null.
14528
14529         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
14530
14531         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
14532         and Unary::Operator.
14533
14534         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
14535         accordingly.
14536
14537         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
14538         we have overloaded operators.
14539         (Binary::ResolveOperator): Implement the part which does the operator overload
14540         resolution.
14541
14542         * class.cs (Operator::Emit): Implement.
14543         (TypeContainer::Emit): Emit the operators we have too.
14544
14545         * expression.cs (Binary::Emit): Update to emit the appropriate code for
14546         the case when we have a user-defined operator.
14547
14548 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
14549
14550         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
14551
14552 2001-09-16  Ravi Pratap  <ravi@ximian.com>
14553
14554         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
14555         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
14556         (Constructor::Emit): Implement.
14557         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
14558         if we have no work to do. 
14559         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
14560         Emit method.
14561
14562         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
14563         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
14564
14565         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
14566         of parent.parent.
14567
14568 2001-09-15  Ravi Pratap  <ravi@ximian.com>
14569
14570         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
14571         in the source.
14572         (Tree::RecordNamespace): Method to do what the name says ;-)
14573         (Tree::Namespaces): Property to get at the namespaces hashtable.
14574
14575         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
14576         keep track.
14577
14578         * rootcontext.cs (IsNamespace): Fixed it :-)
14579
14580 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14581
14582         * class.cs (TypeContainer::FindMembers): Add support for
14583         constructors. 
14584         (MethodCore): New class that encapsulates both the shared aspects
14585         of a Constructor and a Method.  
14586         (Method, Constructor): Factored pieces into MethodCore.
14587
14588         * driver.cs: Added --fatal which makes errors throw exceptions.
14589         Load System assembly as well as part of the standard library.
14590
14591         * report.cs: Allow throwing exceptions on errors for debugging.
14592
14593         * modifiers.cs: Do not use `parent', instead use the real type
14594         container to evaluate permission settings.
14595
14596         * class.cs: Put Ravi's patch back in.  He is right, and we will
14597         have to cope with the
14598
14599 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14600
14601         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
14602         FamORAssem, not FamANDAssem.
14603
14604 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
14605
14606         * driver.cs: Added --parse option that only parses its input files
14607         and terminates.
14608
14609         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
14610         incorrect.  IsTopLevel is not used to tell whether an object is
14611         root_types or not (that can be achieved by testing this ==
14612         root_types).  But to see if this is a top-level *class* (not
14613         necessarly our "toplevel" container). 
14614
14615 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14616
14617         * enum.cs (Enum::Define): Modify to call the Lookup method on the
14618         parent instead of a direct call to GetType.
14619
14620 2001-09-14  Ravi Pratap  <ravi@ximian.com>
14621
14622         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
14623         Modifiers.TypeAttr. This should just be a call to that method.
14624
14625         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
14626         object so that we can determine if we are top-level or not.
14627
14628         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
14629         TypeContainer too.
14630
14631         * enum.cs (Enum::Define): Ditto.
14632
14633         * modifiers.cs (FieldAttr): Re-write.
14634
14635         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
14636         (TypeContainer::HaveStaticConstructor): New property to provide access
14637         to precisely that info.
14638
14639         * modifiers.cs (MethodAttr): Re-write.
14640         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
14641
14642         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
14643         of top-level types as claimed.
14644
14645 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14646
14647         * expression.cs (MemberLookup): Fruitless attempt to lookup
14648         constructors.  Maybe I need to emit default constructors?  That
14649         might be it (currently .NET emits this for me automatically).
14650         (Invocation::OverloadResolve): Cope with Arguments == null.
14651         (Invocation::EmitArguments): new function, shared by the new
14652         constructor and us.
14653         (Invocation::Emit): Handle static and instance methods.  Emit
14654         proper call instruction for virtual or non-virtual invocations.
14655         (New::Emit): Implement.
14656         (New::Resolve): Implement.
14657         (MemberAccess:Resolve): Implement.
14658         (MethodGroupExpr::InstanceExpression): used conforming to the spec
14659         to track instances.
14660         (FieldExpr::Resolve): Set type.
14661
14662         * support.cs: Handle empty arguments.
14663                 
14664         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
14665         SimpleLookup): Auxiliary routines to help parse a qualifier
14666         identifier.  
14667
14668         Update qualifier_identifier rule.
14669
14670         * codegen.cs: Removed debugging messages.
14671
14672         * class.cs: Make this a global thing, this acts just as a "key" to
14673         objects that we might have around.
14674
14675         (Populate): Only initialize method_builders_to_methods once.
14676
14677         * expression.cs (PropertyExpr): Initialize type from the
14678         PropertyType. 
14679
14680         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
14681         Resolve pattern.  Attempt to implicitly convert value to boolean.
14682         Emit code.
14683
14684         * expression.cs: Set the type for the int32/int32 argument case.
14685         (Binary::ResolveOperator): Set the return type to boolean for
14686         comparission operators
14687
14688         * typemanager.cs: Remove debugging print code.
14689
14690         (Invocation::Resolve): resolve type.
14691
14692         * class.cs: Allocate a MemberInfo of the correct size, as the code
14693         elsewhere depends on the test to reflect the correct contents.
14694
14695         (Method::) Keep track of parameters, due to System.Reflection holes
14696
14697         (TypeContainer::Populate): Keep track of MethodBuilders to Method
14698         mapping here.
14699
14700         (TypeContainer::FindMembers): Use ArrayList and then copy an array
14701         of the exact size and return that.
14702
14703         (Class::LookupMethodByBuilder): New function that maps
14704         MethodBuilders to its methods.  Required to locate the information
14705         on methods because System.Reflection bit us again.
14706
14707         * support.cs: New file, contains an interface ParameterData and
14708         two implementations: ReflectionParameters and InternalParameters
14709         used to access Parameter information.  We will need to grow this
14710         as required.
14711
14712         * expression.cs (Invocation::GetParameterData): implement a cache
14713         and a wrapper around the ParameterData creation for methods. 
14714         (Invocation::OverloadResolve): Use new code.
14715
14716 2001-09-13  Ravi Pratap  <ravi@ximian.com>
14717
14718         * class.cs (TypeContainer::EmitField): Remove and move into 
14719         (Field::Define): here and modify accordingly.
14720         (Field.FieldBuilder): New member.
14721         (TypeContainer::Populate): Update accordingly.
14722         (TypeContainer::FindMembers): Implement.
14723
14724 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
14725
14726         * statement.cs: (VariableInfo::VariableType): New field to be
14727         initialized with the full type once it is resolved. 
14728
14729 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
14730
14731         * parameter.cs (GetParameterInfo): Use a type cache to compute
14732         things only once, and to reuse this information
14733
14734         * expression.cs (LocalVariableReference::Emit): Implement.
14735         (OpcodeCast::Emit): fix.
14736
14737         (ParameterReference::Resolve): Implement.
14738         (ParameterReference::Emit): Implement.
14739
14740         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
14741         that are expressions need to stay as Expressions.
14742
14743         * typemanager.cs (CSharpName): Returns the C# name of a type if
14744         possible. 
14745
14746         * expression.cs (Expression::ConvertImplicit): New function that
14747         implements implicit type conversions.
14748
14749         (Expression::ImplicitReferenceConversion): Implements implicit
14750         reference conversions.
14751
14752         (EmptyCast): New type for transparent casts.
14753
14754         (OpcodeCast): New type for casts of types that are performed with
14755         a sequence of bytecodes.
14756
14757         (BoxedCast): New type used for casting value types into reference
14758         types.  Emits a box opcode.
14759
14760         (Binary::DoNumericPromotions): Implements numeric promotions of
14761         and computation of the Binary::Type.
14762
14763         (Binary::EmitBranchable): Optimization.
14764
14765         (Binary::Emit): Implement code emission for expressions.
14766
14767         * typemanager.cs (TypeManager): Added two new core types: sbyte
14768         and byte.
14769
14770 2001-09-12  Ravi Pratap  <ravi@ximian.com>
14771
14772         * class.cs (TypeContainer::FindMembers): Method which does exactly
14773         what Type.FindMembers does, only we don't have to use reflection. No
14774         implementation yet.
14775
14776         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
14777         typecontainer objects as we need to get at them.
14778         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
14779
14780         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
14781         typecontainer object.
14782
14783         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
14784         of just a Report object.
14785
14786 2001-09-11  Ravi Pratap  <ravi@ximian.com>
14787
14788         * class.cs (Event::Define): Go back to using the prefixes "add_" and
14789         "remove_"
14790         (TypeContainer::Populate): Now define the delegates of the type too.
14791         (TypeContainer.Delegates): Property to access the list of delegates defined
14792         in the type.
14793
14794         * delegates.cs (Delegate::Define): Implement partially.
14795
14796         * modifiers.cs (TypeAttr): Handle more flags.
14797
14798 2001-09-11  Ravi Pratap  <ravi@ximian.com>
14799
14800         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
14801         and not <=
14802         (Operator::Define): Re-write logic to get types by using the LookupType method
14803         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
14804         (Indexer::Define): Ditto.
14805         (Event::Define): Ditto.
14806         (Property::Define): Ditto.
14807
14808 2001-09-10  Ravi Pratap  <ravi@ximian.com>
14809
14810         * class.cs (TypeContainer::Populate): Now define operators too. 
14811         (TypeContainer.Operators): New property to access the list of operators
14812         in a type.
14813         (Operator.OperatorMethodBuilder): New member to hold the method builder
14814         for the operator we are defining.
14815         (Operator::Define): Implement.
14816
14817 2001-09-10  Ravi Pratap  <ravi@ximian.com>
14818
14819         * class.cs (Event::Define): Make the prefixes of the accessor methods
14820         addOn_ and removeOn_ 
14821
14822         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
14823         of the location being passed in too. Ideally, this should go later since all
14824         error reporting should be done through the Report object.
14825
14826         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
14827         (Populate): Iterate thru the indexers we have and define them too.
14828         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
14829         for the get and set accessors.
14830         (Indexer::Define): Implement.
14831
14832 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
14833
14834         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
14835         my previous implementation, did not work.
14836
14837         * typemanager.cs: Add a couple of missing types (the longs).
14838
14839         * literal.cs: Use TypeManager.bool_type instead of getting it.
14840
14841         * expression.cs (EventExpr): New kind of expressions.
14842         (Expressio::ExprClassFromMemberInfo): finish
14843
14844 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
14845
14846         * assign.cs: Emit stores to static fields differently.
14847
14848 2001-09-08  Ravi Pratap  <ravi@ximian.com>
14849
14850         * Merge in changes and adjust code to tackle conflicts. Backed out my
14851         code in Assign::Resolve ;-) 
14852
14853 2001-09-08  Ravi Pratap  <ravi@ximian.com>
14854
14855         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
14856         instead Report.Error and also pass in the location.
14857         (CSharpParser::Lexer): New readonly property to return the reference
14858         to the Tokenizer object.
14859         (declare_local_variables): Use Report.Error with location instead of plain 
14860         old error.
14861         (CheckDef): Ditto.
14862
14863         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
14864         (Operator.CheckBinaryOperator): Ditto.
14865
14866         * cs-parser.jay (operator_declarator): Update accordingly.
14867
14868         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
14869         (CheckBinaryOperator): Same here.
14870
14871         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
14872         on the name without any prefixes of namespace names etc. This is because we
14873         already might have something already fully qualified like 
14874         'System.Console.WriteLine'
14875
14876         * assign.cs (Resolve): Begin implementation. Stuck ;-)
14877
14878 2001-09-07  Ravi Pratap  <ravi@ximian.com>
14879
14880         * cs-tokenizer.cs (location): Return a string which also contains
14881         the file name.
14882
14883         * expression.cs (ElementAccess): New class for expressions of the
14884         type 'element access.'
14885         (BaseAccess): New class for expressions of the type 'base access.'
14886         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
14887         respectively.
14888
14889         * cs-parser.jay (element_access): Implement action.
14890         (base_access): Implement actions.
14891         (checked_expression, unchecked_expression): Implement.
14892
14893         * cs-parser.jay (local_variable_type): Correct and implement.
14894         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
14895
14896         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
14897
14898         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
14899         name and the specifiers.
14900
14901         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
14902
14903         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
14904         making them all public ;-)
14905
14906         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
14907         class anyways.
14908
14909 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
14910
14911         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
14912         PropertyExprs.
14913         (FieldExpr, PropertyExprs): New resolved expressions.
14914         (SimpleName::MemberStaticCheck): Perform static checks for access
14915         to non-static fields on static methods. Maybe this should be
14916         generalized for MemberAccesses. 
14917         (SimpleName::ResolveSimpleName): More work on simple name
14918         resolution. 
14919
14920         * cs-parser.jay (primary_expression/qualified_identifier): track
14921         the parameter index.
14922
14923         * codegen.cs (CodeGen::Save): Catch save exception, report error.
14924         (EmitContext::EmitBoolExpression): Chain to expression generation
14925         instead of temporary hack.
14926         (::EmitStatementExpression): Put generic expression code generation.
14927
14928         * assign.cs (Assign::Emit): Implement variable assignments to
14929         local variables, parameters and fields.
14930
14931 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
14932
14933         * statement.cs (Block::GetVariableInfo): New method, returns the
14934         VariableInfo for a variable name in a block.
14935         (Block::GetVariableType): Implement in terms of GetVariableInfo
14936
14937         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
14938         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
14939
14940 2001-09-06  Ravi Pratap  <ravi@ximian.com>
14941
14942         * cs-parser.jay (operator_declaration): Continue on my quest : update
14943         to take attributes argument.
14944         (event_declaration): Ditto.
14945         (enum_declaration): Ditto.
14946         (indexer_declaration): Ditto.
14947
14948         * class.cs (Operator::Operator): Update constructor accordingly.
14949         (Event::Event): Ditto.
14950
14951         * delegate.cs (Delegate::Delegate): Same here.
14952
14953         * enum.cs (Enum::Enum): Same here.
14954
14955 2001-09-05  Ravi Pratap  <ravi@ximian.com>
14956
14957         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
14958
14959         * ../tests/cs0658.cs : New file to demonstrate error 0658.
14960
14961         * attribute.cs (Attributes): New class to encapsulate all attributes which were
14962         being passed around as an arraylist.
14963         (Attributes::AddAttribute): Method to add attribute sections.
14964
14965         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
14966         (struct_declaration): Update accordingly.
14967         (constant_declaration): Update.
14968         (field_declaration): Update.
14969         (method_header): Update.
14970         (fixed_parameter): Update.
14971         (parameter_array): Ditto.
14972         (property_declaration): Ditto.
14973         (destructor_declaration): Ditto.
14974
14975         * class.cs (Struct::Struct): Update constructors accordingly.
14976         (Class::Class): Ditto.
14977         (Field::Field): Ditto.
14978         (Method::Method): Ditto.
14979         (Property::Property): Ditto.
14980         (TypeContainer::OptAttribute): update property's return type.
14981
14982         * interface.cs (Interface.opt_attributes): New member.
14983         (Interface::Interface): Update to take the extra Attributes argument.
14984
14985         * parameter.cs (Parameter::Parameter): Ditto.
14986
14987         * constant.cs (Constant::Constant): Ditto.
14988
14989         * interface.cs (InterfaceMemberBase): New OptAttributes field.
14990         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
14991         the attributes as a parameter.
14992         (InterfaceProperty): Update constructor call.
14993         (InterfaceEvent): Ditto.
14994         (InterfaceMethod): Ditto.
14995         (InterfaceIndexer): Ditto.
14996
14997         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
14998         pass the attributes too.
14999         (interface_event_declaration): Ditto.
15000         (interface_property_declaration): Ditto.
15001         (interface_method_declaration): Ditto.
15002         (interface_declaration): Ditto.
15003
15004 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
15005
15006         * class.cs (Method::Define): Track the "static Main" definition to
15007         create an entry point. 
15008
15009         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
15010         EntryPoint if we find it. 
15011
15012         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
15013         (EmitContext::ig): Make this variable public.
15014
15015         * driver.cs: Make the default output file be the first file name
15016         with the .exe extension.  
15017
15018         Detect empty compilations
15019
15020         Handle various kinds of output targets.  Handle --target and
15021         rename -t to --dumper.
15022
15023         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
15024         methods inherited from Expression return now an Expression.  This
15025         will is used during the tree rewriting as we resolve them during
15026         semantic analysis.
15027
15028         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
15029         the spec.  Missing entirely is the information about
15030         accessability of elements of it.
15031
15032         (Expression::ExprClassFromMemberInfo): New constructor for
15033         Expressions that creates a fully initialized Expression based on
15034         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
15035         a Type.
15036
15037         (Invocation::Resolve): Begin implementing resolution of invocations.
15038
15039         * literal.cs (StringLiteral):  Implement Emit.
15040
15041 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15042
15043         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
15044         member.
15045
15046 2001-09-04  Ravi Pratap  <ravi@ximian.com>
15047
15048         * cs-parser.jay (attribute_arguments): Implement actions.
15049         (attribute): Fix bug in production. Implement action.
15050         (attribute_list): Implement.
15051         (attribute_target): Implement.
15052         (attribute_target_specifier, opt_target_specifier): Implement
15053         (CheckAttributeTarget): New method to check if the attribute target
15054         is valid.
15055         (attribute_section): Implement.
15056         (opt_attributes): Implement.
15057
15058         * attribute.cs : New file to handle attributes.
15059         (Attribute): Class to hold attribute info.
15060
15061         * cs-parser.jay (opt_attribute_target_specifier): Remove production
15062         (attribute_section): Modify production to use 2 different rules to 
15063         achieve the same thing. 1 s/r conflict down !
15064         Clean out commented, useless, non-reducing dimension_separator rules.
15065
15066         * class.cs (TypeContainer.attributes): New member to hold list
15067         of attributes for a type.
15068         (Struct::Struct): Modify to take one more argument, the attribute list.
15069         (Class::Class): Ditto.
15070         (Field::Field): Ditto.
15071         (Method::Method): Ditto.
15072         (Property::Property): Ditto.
15073
15074         * cs-parser.jay (struct_declaration): Update constructor call to
15075         pass in the attributes too.
15076         (class_declaration): Ditto.
15077         (constant_declaration): Ditto.
15078         (field_declaration): Ditto.
15079         (method_header): Ditto.
15080         (fixed_parameter): Ditto.
15081         (parameter_array): Ditto.
15082         (property_declaration): Ditto.
15083
15084         * constant.cs (Constant::Constant): Update constructor similarly.
15085         Use System.Collections.
15086
15087         * parameter.cs (Parameter::Parameter): Update as above.
15088
15089 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15090
15091         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
15092         (TypeContainer.delegates): New member to hold list of delegates.
15093
15094         * cs-parser.jay (delegate_declaration): Implement the action correctly 
15095         this time as I seem to be on crack ;-)
15096
15097 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
15098
15099         * rootcontext.cs (RootContext::IsNamespace): new function, used to
15100         tell whether an identifier represents a namespace.
15101
15102         * expression.cs (NamespaceExpr): A namespace expression, used only
15103         temporarly during expression resolution.
15104         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
15105         utility functions to resolve names on expressions.
15106
15107 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
15108
15109         * codegen.cs: Add hook for StatementExpressions. 
15110
15111         * class.cs: Fix inverted test for static flag in methods.
15112
15113 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15114
15115         * class.cs (Operator::CheckUnaryOperator): Correct error number used
15116         to make it coincide with MS' number.
15117         (Operator::CheckBinaryOperator): Ditto.
15118
15119         * ../errors/errors.txt : Remove error numbers added earlier.
15120
15121         * ../errors/cs1019.cs : Test case for error # 1019
15122
15123         * ../errros/cs1020.cs : Test case for error # 1020
15124
15125         * cs-parser.jay : Clean out commented cruft.
15126         (dimension_separators, dimension_separator): Comment out. Ostensibly not
15127         used anywhere - non-reducing rule.
15128         (namespace_declarations): Non-reducing rule - comment out.
15129
15130         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
15131         with TypeContainer::AddEnum.
15132
15133         * delegate.cs : New file for delegate handling classes.
15134         (Delegate): Class for declaring delegates.
15135
15136         * makefile : Update.
15137
15138         * cs-parser.jay (delegate_declaration): Implement.
15139
15140 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
15141
15142         * class.cs (Event::Define): Implement.
15143         (Event.EventBuilder): New member.
15144
15145         * class.cs (TypeContainer::Populate): Update to define all enums and events
15146         we have.
15147         (Events): New property for the events arraylist we hold. Shouldn't we move to using
15148         readonly fields for all these cases ?
15149
15150 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15151
15152         * class.cs (Property): Revamp to use the convention of making fields readonly.
15153         Accordingly modify code elsewhere.
15154
15155         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
15156         the Define method of the Property class.
15157
15158         * class.cs : Clean up applied patch and update references to variables etc. Fix 
15159         trivial bug.
15160         (TypeContainer::Populate): Update to define all the properties we have. Also
15161         define all enumerations.
15162
15163         * enum.cs (Define): Implement.
15164
15165 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15166
15167         * cs-parser.jay (overloadable_operator): The semantic value is an
15168         enum of the Operator class.
15169         (operator_declarator): Implement actions.
15170         (operator_declaration): Implement.
15171
15172         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
15173         validity of definitions.
15174         (Operator::CheckBinaryOperator): Static method to check for binary operators
15175         (TypeContainer::AddOperator): New method to add an operator to a type.
15176
15177         * cs-parser.jay (indexer_declaration): Added line to actually call the
15178         AddIndexer method so it gets added ;-)
15179
15180         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
15181         already taken care of by the MS compiler ?  
15182
15183 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15184
15185         * class.cs (Operator): New class for operator declarations.
15186         (Operator::OpType): Enum for the various operators.
15187
15188 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15189
15190         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
15191         ostensibly handle this in semantic analysis.
15192
15193         * cs-parser.jay (general_catch_clause): Comment out
15194         (specific_catch_clauses, specific_catch_clause): Ditto.
15195         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
15196         (catch_args, opt_catch_args): New productions.
15197         (catch_clause): Rewrite to use the new productions above
15198         (catch_clauses): Modify accordingly.
15199         (opt_catch_clauses): New production to use in try_statement
15200         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
15201         and re-write the code in the actions to extract the specific and
15202         general catch clauses by being a little smart ;-)
15203
15204         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
15205         Hooray, try and catch statements parse fine !
15206
15207 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15208
15209         * statement.cs (Block::GetVariableType): Fix logic to extract the type
15210         string from the hashtable of variables.
15211
15212         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
15213         I end up making that mistake ;-)
15214         (catch_clauses): Fixed gross error which made Key and Value of the 
15215         DictionaryEntry the same : $1 !!
15216
15217 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15218
15219         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
15220
15221         * cs-parser.jay (event_declaration): Correct to remove the semicolon
15222         when the add and remove accessors are specified. 
15223
15224 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
15225
15226         * cs-parser.jay (IndexerDeclaration): New helper class to hold
15227         information about indexer_declarator.
15228         (indexer_declarator): Implement actions.
15229         (parsing_indexer): New local boolean used to keep track of whether
15230         we are parsing indexers or properties. This is necessary because 
15231         implicit_parameters come into picture even for the get accessor in the 
15232         case of an indexer.
15233         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
15234
15235         * class.cs (Indexer): New class for indexer declarations.
15236         (TypeContainer::AddIndexer): New method to add an indexer to a type.
15237         (TypeContainer::indexers): New member to hold list of indexers for the
15238         type.
15239
15240 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
15241
15242         * cs-parser.jay (add_accessor_declaration): Implement action.
15243         (remove_accessor_declaration): Implement action.
15244         (event_accessors_declaration): Implement
15245         (variable_declarators): swap statements for first rule - trivial.
15246
15247         * class.cs (Event): New class to hold information about event
15248         declarations.
15249         (TypeContainer::AddEvent): New method to add an event to a type
15250         (TypeContainer::events): New member to hold list of events.
15251
15252         * cs-parser.jay (event_declaration): Implement actions.
15253
15254 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
15255
15256         * cs-parser.jay (dim_separators): Implement. Make it a string
15257         concatenating all the commas together, just as they appear.
15258         (opt_dim_separators): Modify accordingly
15259         (rank_specifiers): Update accordingly. Basically do the same
15260         thing - instead, collect the brackets here.
15261         (opt_rank_sepcifiers): Modify accordingly.
15262         (array_type): Modify to actually return the complete type string
15263         instead of ignoring the rank_specifiers.
15264         (expression_list): Implement to collect the expressions
15265         (variable_initializer): Implement. We make it a list of expressions
15266         essentially so that we can handle the array_initializer case neatly too.
15267         (variable_initializer_list): Implement.
15268         (array_initializer): Make it a list of variable_initializers
15269         (opt_array_initializer): Modify accordingly.
15270
15271         * expression.cs (New::NType): Add enumeration to help us
15272         keep track of whether we have an object/delegate creation
15273         or an array creation.
15274         (New:NewType, New::Rank, New::Indices, New::Initializers): New
15275         members to hold data about array creation.
15276         (New:New): Modify to update NewType
15277         (New:New): New Overloaded contructor for the array creation
15278         case.
15279
15280         * cs-parser.jay (array_creation_expression): Implement to call
15281         the overloaded New constructor.
15282
15283 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
15284
15285         * class.cs (TypeContainer::Constructors): Return member
15286         constructors instead of returning null.
15287
15288 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
15289
15290         * typemanager.cs (InitCoreTypes): Initialize the various core
15291         types after we have populated the type manager with the user
15292         defined types (this distinction will be important later while
15293         compiling corlib.dll)
15294
15295         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
15296         on Expression Classification.  Now all expressions have a method
15297         `Resolve' and a method `Emit'.
15298
15299         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
15300         generation from working.     Also add some temporary debugging
15301         code. 
15302
15303 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
15304
15305         * codegen.cs: Lots of code generation pieces.  This is only the
15306         beginning, will continue tomorrow with more touches of polish.  We
15307         handle the fundamentals of if, while, do, for, return.  Others are
15308         trickier and I need to start working on invocations soon.
15309
15310         * gen-treedump.cs: Bug fix, use s.Increment here instead of
15311         s.InitStatement. 
15312
15313         * codegen.cs (EmitContext): New struct, used during code
15314         emission to keep a context.   Most of the code generation will be
15315         here. 
15316
15317         * cs-parser.jay: Add embedded blocks to the list of statements of
15318         this block.  So code generation proceeds in a top down fashion.
15319
15320 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
15321
15322         * statement.cs: Add support for multiple child blocks.
15323
15324 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
15325
15326         * codegen.cs (EmitCode): New function, will emit the code for a
15327         Block of code given a TypeContainer and its ILGenerator. 
15328
15329         * statement.cs (Block): Standard public readonly optimization.
15330         (Block::Block constructors): Link children. 
15331         (Block::Child): Child Linker.
15332         (Block::EmitVariables): Emits IL variable declarations.
15333
15334         * class.cs: Drop support for MethodGroups here, delay until
15335         Semantic Analysis.
15336         (Method::): Applied the same simplification that I did before, and
15337         move from Properties to public readonly fields.
15338         (Method::ParameterTypes): Returns the parameter types for the
15339         function, and implements a cache that will be useful later when I
15340         do error checking and the semantic analysis on the methods is
15341         performed.
15342         (Constructor::GetCallingConvention): Renamed from CallingConvetion
15343         and made a method, optional argument tells whether this is a class
15344         or a structure to apply the `has-this' bit.
15345         (Method::GetCallingConvention): Implement, returns the calling
15346         convention. 
15347         (Method::Define): Defines the type, a second pass is performed
15348         later to populate the methods.
15349
15350         (Constructor::ParameterTypes): implement a cache similar to the
15351         one on Method::ParameterTypes, useful later when we do semantic
15352         analysis. 
15353
15354         (TypeContainer::EmitMethod):  New method.  Emits methods.
15355
15356         * expression.cs: Removed MethodGroup class from here.
15357
15358         * parameter.cs (Parameters::GetCallingConvention): new method.
15359
15360 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
15361
15362         * class.cs (TypeContainer::Populate): Drop RootContext from the
15363         argument. 
15364
15365         (Constructor::CallingConvention): Returns the calling convention.
15366         (Constructor::ParameterTypes): Returns the constructor parameter
15367         types. 
15368
15369         (TypeContainer::AddConstructor): Keep track of default constructor
15370         and the default static constructor.
15371
15372         (Constructor::) Another class that starts using `public readonly'
15373         instead of properties. 
15374
15375         (Constructor::IsDefault): Whether this is a default constructor. 
15376
15377         (Field::) use readonly public fields instead of properties also.
15378
15379         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
15380         track of static constructors;  If none is used, turn on
15381         BeforeFieldInit in the TypeAttributes. 
15382
15383         * cs-parser.jay (opt_argument_list): now the return can be null
15384         for the cases where there are no arguments. 
15385
15386         (constructor_declarator): If there is no implicit `base' or
15387         `this', then invoke the default parent constructor. 
15388
15389         * modifiers.cs (MethodAttr): New static function maps a set of
15390         modifiers flags into a MethodAttributes enum
15391         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
15392         MethodAttr, TypeAttr to represent the various mappings where the
15393         modifiers are used.
15394         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
15395
15396 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
15397
15398         * parameter.cs (GetParameterInfo): Fix bug where there would be no
15399         method arguments.
15400
15401         * interface.cs (PopulateIndexer): Implemented the code generator
15402         for interface indexers.
15403
15404 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
15405
15406         * interface.cs (InterfaceMemberBase): Now we track the new status
15407         here.  
15408
15409         (PopulateProperty): Implement property population.  Woohoo!  Got
15410         Methods and Properties going today. 
15411
15412         Removed all the properties for interfaces, and replaced them with
15413         `public readonly' fields. 
15414
15415 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
15416
15417         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
15418         initialize their hashtables/arraylists only when they are needed
15419         instead of doing this always.
15420
15421         * parameter.cs: Handle refs and out parameters.
15422
15423         * cs-parser.jay: Use an ArrayList to construct the arguments
15424         instead of the ParameterCollection, and then cast that to a
15425         Parameter[] array.
15426
15427         * parameter.cs: Drop the use of ParameterCollection and use
15428         instead arrays of Parameters.
15429
15430         (GetParameterInfo): Use the Type, not the Name when resolving
15431         types. 
15432
15433 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
15434
15435         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
15436         and instead use public readonly fields.
15437
15438         * class.cs: Put back walking code for type containers.
15439
15440 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
15441
15442         * class.cs (MakeConstant): Code to define constants.
15443
15444         * rootcontext.cs (LookupType): New function.  Used to locate types 
15445
15446
15447 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
15448
15449         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
15450         this System.Reflection code is.  Kudos to Microsoft
15451
15452         * typemanager.cs: Implement a type cache and avoid loading all
15453         types at boot time.  Wrap in LookupType the internals.  This made
15454         the compiler so much faster.  Wow.  I rule!
15455
15456         * driver.cs: Make sure we always load mscorlib first (for
15457         debugging purposes, nothing really important).
15458
15459         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
15460         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
15461
15462         * rootcontext.cs: Lookup types on their namespace;  Lookup types
15463         on namespaces that have been imported using the `using' keyword.
15464
15465         * class.cs (TypeContainer::TypeAttr): Virtualize.
15466         (Class::TypeAttr): Return attributes suitable for this bad boy.
15467         (Struct::TypeAttr): ditto.
15468         Handle nested classes.
15469         (TypeContainer::) Remove all the type visiting code, it is now
15470         replaced with the rootcontext.cs code
15471
15472         * rootcontext.cs (GetClassBases): Added support for structs. 
15473
15474 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
15475
15476         * interface.cs, statement.cs, class.cs, parameter.cs,
15477         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
15478         Drop use of TypeRefs, and use strings instead.
15479
15480 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
15481
15482         * rootcontext.cs: 
15483
15484         * class.cs (Struct::Struct): set the SEALED flags after
15485         checking the modifiers.
15486         (TypeContainer::TypeAttr): new property, returns the
15487         TypeAttributes for a class.  
15488
15489         * cs-parser.jay (type_list): Oops, list production was creating a
15490         new list of base types.
15491
15492         * rootcontext.cs (StdLib): New property.
15493         (GetInterfaceTypeByName): returns an interface by type name, and
15494         encapsulates error handling here.
15495         (GetInterfaces): simplified.
15496         (ResolveTree): Encapsulated all the tree resolution here.
15497         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
15498         types. 
15499
15500         * driver.cs: Add support for --nostdlib, to avoid loading the
15501         default assemblies.
15502         (Main): Do not put tree resolution here. 
15503
15504         * rootcontext.cs: Beginning of the class resolution.
15505
15506 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
15507
15508         * rootcontext.cs: Provide better error reporting. 
15509
15510         * cs-parser.jay (interface_base): set our $$ to be interfaces.
15511
15512         * rootcontext.cs (CreateInterface): Handle the case where there
15513         are no parent interfaces.
15514
15515         (CloseTypes): Routine to flush types at the end.
15516         (CreateInterface): Track types.
15517         (GetInterfaces): Returns an array of Types from the list of
15518         defined interfaces.
15519
15520         * typemanager.c (AddUserType): Mechanism to track user types (puts
15521         the type on the global type hash, and allows us to close it at the
15522         end). 
15523
15524 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
15525
15526         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
15527         RecordInterface instead.
15528
15529         * cs-parser.jay: Updated to reflect changes above.
15530
15531         * decl.cs (Definition): Keep track of the TypeBuilder type that
15532         represents this type here.  Not sure we will use it in the long
15533         run, but wont hurt for now.
15534
15535         * driver.cs: Smaller changes to accomodate the new code.
15536
15537         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
15538         when done. 
15539
15540         * rootcontext.cs (CreateInterface):  New method, used to create
15541         the System.TypeBuilder type for interfaces.
15542         (ResolveInterfaces): new entry point to resolve the interface
15543         hierarchy. 
15544         (CodeGen): Property, used to keep track of the code generator.
15545
15546 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
15547
15548         * cs-parser.jay: Add a second production for delegate_declaration
15549         with `VOID'.
15550
15551         (enum_body): Put an opt_comma here instead of putting it on
15552         enum_body or enum_member_declarations so we can handle trailing
15553         commas on enumeration members.  Gets rid of a shift/reduce.
15554
15555         (type_list): Need a COMMA in the middle.
15556
15557         (indexer_declaration): Tell tokenizer to recognize get/set
15558
15559         * Remove old targets.
15560
15561         * Re-add the parser target.
15562
15563 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15564
15565         * cs-parser.jay: Add precendence rules for a number of operators
15566         ot reduce the number of shift/reduce conflicts in the grammar.
15567
15568 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
15569
15570         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
15571         and put it here.
15572
15573         Get rid of old crufty code.
15574
15575         * rootcontext.cs: Use this to keep track of the parsed
15576         representation and the defined types available to the program. 
15577
15578         * gen-treedump.cs: adjust for new convention.
15579
15580         * type.cs: Split out the type manager, and the assembly builder
15581         from here. 
15582
15583         * typemanager.cs: the type manager will live here now.
15584
15585         * cil-codegen.cs: And the code generator here. 
15586
15587 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
15588
15589         * makefile: Fixed up for easy making.
15590
15591 2001-07-13  Simon Cozens <simon@simon-cozens.org>
15592
15593         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
15594         the 
15595
15596         (unary_expression): Expand pre_increment_expression and
15597         post_decrement_expression to reduce a shift/reduce.
15598
15599 2001-07-11  Simon Cozens
15600
15601         * cs-tokenizer.cs: Hex numbers should begin with a 0.
15602
15603         Improve allow_keyword_as_indent name.
15604
15605 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
15606
15607         * Adjustments for Beta2. 
15608
15609 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
15610
15611         * decl.cs: Added `Define' abstract method.
15612         (InTransit): new property, used to catch recursive definitions. 
15613
15614         * interface.cs: Implement `Define'. 
15615
15616         * modifiers.cs: Map Modifiers.constants to
15617         System.Reflection.TypeAttribute flags.
15618
15619         * class.cs: Keep track of types and user-defined types.
15620         (BuilderInit): New method for creating an assembly
15621         (ResolveType): New function to launch the resolution process, only
15622         used by interfaces for now.
15623
15624         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
15625         that are inserted into the name space. 
15626
15627 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
15628
15629         * ARGH.  I have screwed up my tree so many times due to the use of
15630         rsync rather than using CVS.  Going to fix this at once. 
15631
15632         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
15633         load types.
15634
15635 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
15636
15637         * Experiment successful: Use System.Type rather that our own
15638         version of Type.  
15639
15640 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
15641
15642         * cs-parser.jay: Removed nsAliases from here.
15643
15644         Use new namespaces, handle `using XXX;' 
15645
15646         * namespace.cs: Reimplemented namespace handling, use a recursive
15647         definition of the class.  Now we can keep track of using clauses
15648         and catch invalid using clauses.
15649
15650 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
15651
15652         * gen-treedump.cs: Adapted for all the renaming.
15653
15654         * expression.cs (Expression): this class now has a Type property
15655         which returns an expression Type.
15656
15657         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
15658         `Type', as this has a different meaning now in the base
15659
15660 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
15661
15662         * interface.cs, class.cs: Removed from all the sources the
15663         references to signature computation, as we can not do method
15664         signature computation during the parsing time, as we are not
15665         trying to solve at that point distinguishing:
15666
15667         class X {
15668                 void a (Blah x) {}
15669                 void a (NS.Blah x) {}
15670         }
15671
15672         Which depending on the context might be valid or not, as we do not
15673         know if Blah is the same thing as NS.Blah at that point.
15674
15675         * Redid everything so the code uses TypeRefs now instead of
15676         Types.  TypeRefs are just temporary type placeholders, that need
15677         to be resolved.  They initially have a pointer to a string and the
15678         current scope in which they are used.  This is used later by the
15679         compiler to resolve the reference to an actual Type. 
15680
15681         * DeclSpace is no longer a CIR.Type, and neither are
15682         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
15683         are all DeclSpaces, but no Types. 
15684
15685         * type.cs (TypeRefManager): This implements the TypeRef manager,
15686         which keeps track of all the types that need to be resolved after
15687         the parsing has finished. 
15688
15689 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
15690
15691         * ARGH.  We are going to have to store `foreach' as a class rather
15692         than resolving it, as we need to verify error 1579 after name
15693         resolution.   *OR* we could keep a flag that says `This request to
15694         IEnumerator comes from a foreach statement' which we can then use
15695         to generate the error.
15696
15697 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
15698
15699         * class.cs (TypeContainer.AddMethod): we now add methods to the
15700         MethodGroup instead of the method hashtable.  
15701
15702         * expression.cs: Add MethodGroup abstraction, which gets us one
15703         step closer to the specification in the way we handle method
15704         declarations.  
15705
15706         * cs-parser.jay (primary_expression): qualified_identifier now
15707         tried to match up an identifier to a local variable reference or
15708         to a parameter reference.
15709
15710         current_local_parameters is now a parser global variable that
15711         points to the current parameters for the block, used during name
15712         lookup.
15713
15714         (property_declaration): Now creates an implicit `value' argument to
15715         the set accessor.
15716
15717 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
15718
15719         * parameter.cs: Do not use `param' arguments as part of the
15720         signature, per the spec.
15721
15722 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
15723
15724         * decl.cs: Base class for classes, structs and interfaces.  This
15725         is the "Declaration Space" 
15726
15727         * cs-parser.jay: Use CheckDef for checking declaration errors
15728         instead of having one on each function.
15729
15730         * class.cs: Factor out some code for handling error handling in
15731         accordance to the "Declarations" section in the "Basic Concepts"
15732         chapter in the ECMA C# spec.
15733
15734         * interface.cs: Make all interface member classes derive from
15735         InterfaceMemberBase.
15736
15737 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
15738
15739         * Many things: all interfaces are parsed and generated in
15740         gen-treedump.  Support for member variables, constructors,
15741         destructors, properties, constants is there.
15742
15743         Beginning of the IL backend, but very little done, just there for
15744         testing purposes. 
15745
15746 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
15747
15748         * cs-parser.jay: Fix labeled statement.
15749
15750         * cs-tokenizer.cs (escape): Escape " and ' always.
15751         ref_line, ref_name: keep track of the line/filename as instructed
15752         by #line by the compiler.
15753         Parse #line.
15754
15755 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
15756
15757         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
15758         to match the values in System.CodeDOM.
15759
15760         Divid renamed to Divide.
15761
15762         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
15763         statements. 
15764         (Statements.set): remove.
15765
15766         * System.CodeDOM/CodeCatchClause.cs: always have a valid
15767         statements. 
15768
15769         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
15770         falseStatements always have valid values. 
15771
15772         * cs-parser.jay: Use System.CodeDOM now.
15773