2004-12-10 Marek Safar <marek.safar@seznam.cz>
[mono.git] / mcs / mcs / ChangeLog
1 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
2
3         * attributes.cs (Attribute.Resolve): Avoid multiple error report
4         and report exception as error 182.
5
6 2004-12-10  Raja R Harinath  <rharinath@novell.com>
7
8         * driver.cs (Main): Fix message when there are warnings.
9
10 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
11
12         * delegate.cs: Fixed my fix from yesterday, sorry about that.
13
14 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
15
16         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
17         Reduced number of warnings.
18         
19         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
20
21 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
22
23         * driver.cs: Removed message.
24
25         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
26
27 2004-12-08    <vargaz@freemail.hu>
28
29         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
30
31 2004-12-08  Martin Baulig  <martin@ximian.com>
32
33         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
34         instead of a CS3002 for properties and indexer.
35
36 2004-12-08  Martin Baulig  <martin@ximian.com>
37
38         * decl.cs (MemberName.ToString): Make this work again.
39
40 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
41
42         * attribute.cs (Resolve): Add error 591 detection.
43
44         * class.cs (FieldMember.Define): Add error 1547 detection.
45         (Indexer.Define): Add error 620 detection.
46         (Operator.Define): Add error 590 detection.
47
48         * ecore.cs: Missing argument for error 79.
49
50         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
51         detection.
52
53 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
54
55         Fix #70106
56         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
57         only.
58
59 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
60
61         * cs-parser.jay : handle doc comments on implicit/explicit operators.
62           Some operator comments were suppressed.
63         * doc.cs : Implicit/explicit operator name in doc comments are like
64           "op_Explicit(type)~returnType", so added suffix handling.
65
66 2004-12-07  Martin Baulig  <martin@ximian.com>
67
68         * decl.cs
69         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
70         (MemberCore.GetClsCompliantAttributeValue): Likewise.
71         (DeclSpace.ec): New protected field; store the EmitContext here.
72         (DeclSpace.EmitContext): New public property; moved here from
73         `TypeContainer'.
74         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
75         EmitContext.
76
77         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
78         (Enum.Emit): Don't create a new EmitContext.
79
80         * delegate.cs (Delegate.DefineType): Always create the
81         EmitContext.
82
83         * iterators.cs (Iterators.DefineIterator): Create a new
84         EmitContext and store it in `ec'.
85
86 2004-08-24  Martin Baulig  <martin@ximian.com>
87
88         * typemanager.cs
89         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
90         this for accessibility checks.
91         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
92         IsNestedFamilyAccessible.
93         (TypeManager.IsSubclassOf): New method, do what the name actually
94         says.   
95
96 2004-12-06  Raja R Harinath  <rharinath@novell.com>
97
98         Fix crash on cs0657-17.cs.
99         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
100         Use RootContext.Tree.Types, not 'new RootTypes ()'.
101         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
102         the case where the NamespaceEntry gets overwritten.
103
104 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
105
106         Fixed #69195, #56821
107         * ecore.cs (ResolveBoolean): Tiny refactoring.
108
109         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
110         of right expression resolving when left is false constant and
111         operator is LogicalAnd OR true constant and operator is LogicalOr.
112
113         * statement.cs (ResolveUnreachable): Always reports warning.
114
115 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
116
117         * class.cs: Distinguish between 1721 and 1722 (just a little help
118         for the programmer).
119
120 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
121
122         * delegate.cs: Only allow this on new versions of the language. 
123
124 2004-12-02  Duncan Mak  <duncan@ximian.com>
125
126         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
127         Expression class.
128         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
129         here as a static method. Take an additional bool out parameter
130         `must_do_cs1540_check' for signaling to InstanceResolve.
131         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
132         member field from PropertyExpr class and made it an argument of
133         the method instead.
134         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
135         check for MarshalByRefObject, and report CS0122 instead of CS1540.
136         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
137         and `remove_accessor' as well as InstanceResolve: report CS0122
138         where applicable.
139
140         Fixes #70129.
141
142 2004-12-03  Raja R Harinath  <rharinath@novell.com>
143
144         Fix test-327.cs, test-328.cs, and put in early infrastructure
145         for eventually fixing #52697.
146         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
147         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
148         from other methods.
149         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
150         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
151         (VerifyUsing, error246): Update.
152         * rootcontext.cs (RootContext.NamespaceLookup): Just use
153         'NamespaceEntry.LookupNamespaceOrType'.
154
155 2004-12-03  Martin Baulig  <martin@ximian.com>
156
157         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
158         method as our child, call AnonymousMethod.Compatible() on it.
159
160 2004-12-03  Raja R Harinath  <rharinath@novell.com>
161
162         Disable XML documentation support in 'basic' profile.
163         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
164         Redirect XmlElement to System.Object.
165         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
166         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
167         * mcs.exe.sources: Add doc-bootstrap.cs.
168         * doc-bootstrap.cs: New file.  Contains empty stub implementation
169         of doc.cs.
170
171 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
172
173         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
174           comments are allowed.
175
176 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
177
178         * delegate.cs: Add checks for subtypes in paramaters and return values
179         in VerifyMethod () to add support for Covariance/Contravariance
180         in delegates.
181         
182 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
183
184         * report.cs: Remove extra closing parenthesis.
185
186         * convert.cs (Error_CannotImplicitConversion): If the name of the
187         types are the same, provide some extra information.
188
189         * class.cs (FieldBase): Use an unused bit field from the field to
190         encode the `has_offset' property from the FieldMember.  This saves
191         a couple of Ks on bootstrap compilation.
192
193         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
194         method as our child, return the AnonymousMethod resolved
195         expression.
196
197         * expression.cs (New.DoResolve): Allow return values from
198         NewDelegate to also include AnonymousMethods.
199
200         Fixes #70150.
201
202 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
203
204         Fix bug #70102
205         * attribute.cs (Resolve): Improved implementation of params
206         attribute arguments.
207
208         * support.cs (ParameterData): Add HasParams to be faster.
209
210 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
211
212         all things are for /doc support:
213
214         * doc.cs: new file that supports XML documentation generation.
215         * mcs.exe.sources: added doc.cs.
216         * driver.cs:
217           Handle /doc command line option.
218           Report error 2006 instead of 5 for missing file name for /doc.
219           Generate XML documentation when required, after type resolution.
220         * cs-tokenizer.cs:
221           Added support for picking up documentation (/// and /** ... */),
222           including a new XmlCommentState enumeration.
223         * cs-parser.jay:
224           Added lines to fill Documentation element for field, constant,
225           property, indexer, method, constructor, destructor, operator, event
226           and class, struct, interface, delegate, enum.
227           Added lines to warn incorrect comment.
228         * rootcontext.cs :
229           Added Documentation field (passed only when /doc was specified).
230         * decl.cs:
231           Added DocComment, DocCommentHeader, GenerateDocComment() and
232           OnGenerateDocComment() and some supporting private members for
233           /doc feature to MemberCore.
234         * class.cs:
235           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
236         * delegate.cs:
237           Added overriden DocCommentHeader.
238         * enum.cs:
239           Added overriden DocCommentHeader and GenerateDocComment().
240
241 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
242
243         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
244         unwrapping the enumeration values, chain to
245         DoConstantNumericPromotions again, so we can promote things to the
246         fundamental types (takes care of enums that are bytes, sbytes).
247
248         Fixes bug #62054.
249
250 2004-12-01  Raja R Harinath  <rharinath@novell.com>
251
252         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
253         Fix long-standing bug in type-lookup.  Use FindType instead of
254         LookupType when ec.ResolvingTypeTree.
255         (Attribute.ResolveType, Attribute.Resolve)
256         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
257         Update to changes.
258         (Attributes.Search): Remove internal version.  Update.
259         (Attributes.SearchMulti): Update.
260         (Attributes.GetClsCompliantAttribute): Remove.
261         (Attributes.GetIndexerNameAttribute): Remove.
262         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
263         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
264         * class.cs (Indexer.Define): Likewise.
265
266 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
267
268         Fix bug #68790
269         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
270         MarshallByReference members access.
271
272         * expression.cs: Use CheckMarshallByRefAccess;
273         Better error CS0197 message.
274
275         * report.cs: Print whole related error message.
276
277 2004-11-30  Raja R Harinath  <rharinath@novell.com>
278
279         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
280         the current directory to help debugging.
281
282 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
283
284         * class (GetClassBases): Better error 60 report.
285         (EventProperty): Disabled warning 67 detection.
286
287 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
288
289         Fix bug #60324
290         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
291
292         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
293         precise values.
294
295 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
296
297         Fix bug #49488
298         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
299
300         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
301
302 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
303
304         * attribute.cs (Attribute.Resolve): Refine error reporting and
305         report a cs0117 if the identifier does not exist, to distinguish
306         from 0617 which is a miss-use of the actual identifier.
307
308         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
309         between cs0070 and cs0079.
310
311         * class.cs (MemberBase.DoDefine): When reporting a wrong
312         accessibility level, we use MethodCore to compare instead of
313         Method (this was a regression in some refactoring effort).
314
315         So now we correctly report cs0056 again.
316
317         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
318         testing the target_type (which was known to be object_type) and
319         not the source type (which is anonymous_method).
320
321         Fixed reporting of error cs1660.
322
323         * expression.cs (UserCast.Source): Expose the underlying cast.
324
325         * statement.cs (Switch.SwitchGoverningType): Sort the list of
326         allowed types to find a match to int32 first (most common).
327
328         In addition, it ignores any ImplicitUserConversions that did an
329         internal implicit conversion (as the switch statement allows only
330         one integral conversion to exist).
331
332         * class.cs (PartialContainer.Create): rename `name' to
333         `member_name' for clarity.  Then replace the string calls with a
334         call to MemberName.GetPartialName, as now using
335         MemberName.ToString is an error (this is due to the side effects
336         it had, that were fixed in the past).
337
338         This will restore the error reporting on a number of partial class
339         errors that were missusing this (and getting an exception as a
340         results, which is now just a plain textual warning, because
341         yyparse debug output would crash otherwise).
342
343 2004-11-26  Raja R Harinath  <rharinath@novell.com>
344
345         * Makefile (PROGRAM_INSTALL_DIR): Remove.
346
347 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
348
349         * rootcontext.cs (LookupType): Make sure to cache lookups that
350         don't give us a negative result. This saves about 5% of corlib
351         compilation time.
352
353 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
354
355         * report.cs (AbstractMessage.Print): messages are sent to stderr
356
357         * class.cs (TypeContainer.GetClassBases): It is an error to have a
358         non-interface in the list of interfaces (at this point, either
359         parent was properly set, or a base class is being listed in the
360         interfaces section).
361
362         This flags error 1722, and resolves the crash from bug 69259.
363
364 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
365
366         * statement.cs (Using.EmitExpressionFinally): make this work right
367         for valuetypes. Fixes 69926.
368
369 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
370
371         * const.cs (Const.ChangeType): Cope with the "0 literal can be
372         converted to an enum" here, before we try to change the underlying
373         type.  This code exists, but it is a different code path than the
374         one used while encoding constants.
375
376         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
377         old bug: when converting from the null literal to a pointer,
378         return an EmptyCast, not the NullLiteral.
379
380         This fixes #69921, the recent null_type changes probably made this
381         bug more prominent.
382
383         (ImplicitReferenceConversionExists): In addition, resynchronized
384         the code here, so it matches the same code in
385         ImplicitReferenceConversionExists for the `from any class-type S
386         to any interface-type T'.
387         
388
389 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
390
391         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
392
393 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
394
395         * cs-parser.jay: Use verbosity accordingly. 
396
397 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
398
399         * expression.cs (Unary.ResolveOperator): Do not report warning;
400         AddressOf reads from variable.
401         
402         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
403
404 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
405
406         Fix bug #69462
407
408         * attribute.cs (Attributable): Removed CheckTargets.
409         (Attributes.Emit): Explicit attribute targets are tested here.
410
411         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
412         not enabled for interfaces.
413
414         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
415         (GetAssemblyName): Ouch next bug there.
416
417 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
418
419         * expression.cs: Error 275 added.
420         
421 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
422
423         Fix bug #69177 (Implemented decimal constant support)
424
425         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
426         (BinaryFold): Add DecimalConstant.
427
428         * const.cs (Define): Decimal constant 
429         (is not constant.
430         (ChangeType): Add decimal type handling.
431         (LookupConstantValue): Don't set value for decimal type but
432         emit DecimalConstantAttribute. Needed for constant optimization.
433
434         * constant.cs (ToDecimal): New method.
435         (ConvertToDecimal): New method.
436         (IntConstant): Implemented ConvertToDecimal.
437         (DecimalConstant.Emit): Emit optimized version for decimals in
438         int range.
439
440         * expression.cs (ResolveOperator): Changed order of constant
441         reduction to work correctly with native types which have
442         overloaded operators.
443         (ResolveMemberAccess): Extract constant value from attribute
444         for decimal type.
445
446         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
447
448         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
449         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
450         (ChangeType): Decimal is special.
451         (TypeToCoreType): Add decimal type.
452
453 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
454
455         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
456         decimal types.
457
458 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
459
460         * class.cs (EventField.ApplyAttributeBuilder): Fix error
461         test cs1667-5.cs.
462
463 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
464
465         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
466
467         * pending.cs (PendingImplementation): Grab only interfaces.
468
469 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
470
471         * statement.cs (ForeachHelperMethods): Add location member and
472         error 202 detection.
473
474 2004-11-19  Raja R Harinath  <rharinath@novell.com>
475
476         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
477         automatically handled by executable.make.
478         (PROGRAM): Make profile-specific.
479
480 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
481
482         * expression.cs (DoResolveBase): Fixed wrong warning for out
483         variables.
484
485 2004-11-18  Martin Baulig  <martin@ximian.com>
486
487         Merged latest changes into gmcs.  Please keep this comment in
488         here, it makes it easier for me to see what changed in MCS since
489         the last time I merged.
490
491 2004-11-17  Raja R Harinath  <rharinath@novell.com>
492
493         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
494         (TypeHandle.GetMemberCache): New.
495         (TypeHandle.TypeHandle): Update.
496         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
497         (TypeManager.LookupParentInterfacesCache):
498         Rename from LookupInterfaceCache.  Optimize slightly.
499         (TypeManager.MemberLookup_FindMembers): Update.
500         * decl.cs (MemberCache.MemberCache): Set Container to null in the
501         multi-type variant.
502         (AddCacheContents): Rename from AddHashtable.
503         * class.cs (TypeContainer.parent_container): Remove.
504         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
505         (TypeContainer.DoDefineMembers): Don't initialize it.
506         Update to name changes.
507         
508 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
509
510         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
511         that factors the code to check access modifiers on override.  
512
513         (PropertyBase): Use the code here.
514
515         Patch from Lluis S'anchez, fixes bug #69361.
516
517 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
518
519         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
520         routine that is used to report the use of a captured variable
521         whose address has been taken.
522
523         There are two checks: one when variables are being captured and
524         the other check is when the address of a variable is taken. 
525         
526         (because an anonymous methods might be resolved before *or* after
527         the address has been taken) and 
528
529         * expression.cs (Conditional.DoResolve): Remove the special
530         casing that Martin added to trueExpr and falseExpr being both
531         NullLiteral.  We get the right behavior now just by introducing
532         the null_type into the compiler. 
533
534         * convert.cs (ExplicitConversion): Change the code to use
535         null_type instead of testing `expr is NullLiteral'.
536         (ImplicitConversionStandard): use null_type too.
537         (ImplicitReferenceConversionExists): use null_type too.
538         (ImplicitReferenceConversion): use null_type too.
539
540         * literal.cs: The type of `NullLiteral' is now null_type instead
541         of object_type. 
542         (Resolve): Set the type here.
543
544         * typemanager.cs: Introduce null_type.
545
546 2004-11-17  Martin Baulig  <martin@ximian.com>
547
548         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
549         direction, like FindMembers() does.  Fixes #69546, testcase is in
550         test-315.cs.    
551
552 2004-11-16  Martin Baulig  <martin@ximian.com>
553
554         This is based on a patch from Marek Safar, see bug #69082.
555         Fixes bugs #63705 and #67130.
556
557         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
558         method; create a MemberCache for an interface type and cache the
559         result.
560
561         * decl.cs (IMemberContainer.ParentContainer): Removed.
562         (IMemberContainer.ParentCache): New property.
563         (MemberCache.SetupCacheForInterface): Removed.
564         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
565         to create a cache for an interface's "parent".
566
567         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
568         interfaces too.
569
570 2004-11-16  Martin Baulig  <martin@ximian.com>
571
572         Merged back from gmcs; these changes already went into gmcs a
573         couple of weeks ago.
574
575         * typemanager.cs
576         (TypeManager.AddUserType): Removed the `ifaces' argument.
577         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
578         `TypeExpr []'.
579         (TypeManager.AddUserInterface): Removed.
580         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
581         `TypeExpr []'.
582         (TypeManager.GetInterfaces): Likewise.
583         (TypeManager.GetExplicitInterfaces): Likewise.
584
585         * ecore.cs (TypeExpr.GetInterfaces): Removed.
586
587         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
588         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
589
590 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
591
592         * statement.cs: Avoid adding bools to a hashtable.
593
594 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
595
596         * expression.cs (Invocation.OverloadResolve): Flag error if we are
597         calling an unsafe method from a safe location.
598
599 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
600
601         Fix #69167
602         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
603
604 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
605
606         * namespace.cs (VerifyUsing): use GetPartialName instead of
607         ToString. 
608
609 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
610
611         * statement.cs (Return.Resolve): Fix regression in typo: if
612         `in_exc', we have to request a NeedReturnLabel, this was a typo
613         introduced in the anonymous method check-in.  Fixes #69131.
614
615         * Indexers were using the ShortName when defining themselves,
616         causing a regression in the compiler bootstrap when applying the
617         patch from 2004-11-02 (first part), now they use their full name
618         and the bug is gone.
619
620 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
621
622         * driver.cs: Strip the path from the names of embedded resources. Fixes
623         #68519.
624
625 2004-11-04  Raja R Harinath  <rharinath@novell.com>
626
627         Fix error message regression: cs0104-2.cs.
628         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
629         (AliasEntry.Resolve): Update.
630         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
631         'silent' flag.
632         (RootContext.LookupType): Update.
633
634 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
635
636         * cs-parser.jay: Add support for handling accessor modifiers
637         * class: Add support port accessor modifiers and error checking,
638         define PropertyMethod.Define as virtual (not abstract anymore)
639         * ecore.cs: Add checking for proeprties access with access modifiers
640         * iterators.cs: Modify Accessor constructor call based in the modified
641         constructor
642 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
643
644         * expression.cs (StringConcat): Handle being called twice,
645         as when we have a concat in a field init with more than two
646         ctors in the class
647
648 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
649
650         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
651         special case explicit implementations, we should always produce
652         the .property or .event declaration.
653         
654         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
655         since it will not return correct data if people use this
656         unresolved in the presence of using statements (see test-313).
657
658         * class.cs (MethodData.Define): If we are an explicit interface
659         implementation, set the method name to the full name of the
660         interface plus the name of the method.  
661
662         Notice that using the method.MethodName.GetFullName() does not
663         work, as it will only contain the name as declared on the source
664         file (it can be a shorthand in the presence of using statements)
665         and not the fully qualifed type name, for example:
666
667         using System;
668
669         class D : ICloneable {
670                 object ICloneable.Clone ()  {
671                 }
672         }
673
674         Would produce a method called `ICloneable.Clone' instead of
675         `System.ICloneable.Clone'.
676
677         * namespace.cs (Alias.Resolve): Use GetPartialName.
678         
679 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
680
681         * cs-parser.jay: Add error 1055 report.
682
683 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
684
685         * assign.cs (Assign.DoResolve): Only do the transform of
686         assignment into a New if the types are compatible, if not, fall
687         through and let the implicit code deal with the errors and with
688         the necessary conversions. 
689
690 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
691
692         * cs-parser.jay: Add error 1031 report.
693
694         * cs-tokenizer.cs: Add location for error 1038.
695
696 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
697
698         * cs-parser.jay: Add error 1016 report.
699
700 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
701
702         * cs-parser.jay: Add errors 1575,1611 report.
703
704 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
705
706         * cs-parser.jay: Add error 1001 report.
707
708 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
709
710         Fix #68850
711         * attribute.cs (GetMarshal): Add method argument for
712         caller identification.
713
714         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
715         agument for GetMarshal and RuntimeMissingSupport.
716
717 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
718
719         * attribute.cs (ExtractSecurityPermissionSet): Removed
720         TypeManager.code_access_permission_type.
721
722         * typemanager.cs: Removed TypeManager.code_access_permission_type.
723
724 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
725
726         * expression.cs (LocalVariableReference.DoResolveLValue): Check
727         for obsolete use of a variable here.   Fixes regression on errors
728         cs0619-25 and cs0619-26.
729
730 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
731
732         Fix #62358, implemented security attribute encoding.
733
734         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
735         Tests permitted SecurityAction for assembly or other types.
736         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
737         data from SecurityPermissionAttribute to PermisionSet class.
738
739         * class.cs (ApplyAttributeBuilder): Added special handling
740         for System.Security.Permissions.SecurityAttribute based types.
741
742         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
743         special handling for System.Security.Permissions.SecurityAttribute
744         based types.
745
746         * enum.cs (ApplyAttributeBuilder): Added special handling
747         for System.Security.Permissions.SecurityAttribute based types.
748
749         * parameter.cs (ApplyAttributeBuilder): Added special handling
750         for System.Security.Permissions.SecurityAttribute based types.
751
752         * rootcontext.cs: Next 2 core types.
753
754         * typemanager.cs (TypeManager.security_permission_attr_type):
755         Built in type for the SecurityPermission Attribute.
756         (code_access_permission_type): Build in type.
757
758 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
759
760         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
761         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
762         all of this information into
763         EmitContext.EmitCapturedVariableInstance.
764         
765         * codegen.cs (EmitCapturedVariableInstance): move here the
766         funcionality of emitting an ldarg.0 in the presence of a
767         remapping.   This centralizes the instance emit code.
768
769         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
770         then emit a load of this: it means that we have reached the
771         topmost ScopeInfo: the one that contains the pointer to the
772         instance of the class hosting the anonymous method.
773
774         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
775         captures to the topmost CaptureContext.
776
777 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
778
779         * expression.cs (LocalVariableReference): Move the knowledge about
780         the iterators into codegen's EmitCapturedVariableInstance.
781
782 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
783
784         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
785         all code paths return a value from an anonymous method (it is the
786         same as the 161 error, but for anonymous methods).
787
788 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
789
790         The introduction of anonymous methods in the compiler changed
791         various ways of doing things in the compiler.  The most
792         significant one is the hard split between the resolution phase
793         and the emission phases of the compiler.
794
795         For instance, routines that referenced local variables no
796         longer can safely create temporary variables during the
797         resolution phase: they must do so from the emission phase,
798         since the variable might have been "captured", hence access to
799         it can not be done with the local-variable operations from the runtime.
800         
801         * statement.cs 
802
803         (Block.Flags): New flag `IsTopLevel' to indicate that this block
804         is a toplevel block.
805
806         (ToplevelBlock): A new kind of Block, these are the blocks that
807         are created by the parser for all toplevel method bodies.  These
808         include methods, accessors and anonymous methods.
809
810         These contain some extra information not found in regular blocks:
811         A pointer to an optional CaptureContext (for tracking captured
812         local variables and parameters).  A pointer to the parent
813         ToplevelBlock.
814         
815         (Return.Resolve): Catch missmatches when returning a value from an
816         anonymous method (error 1662).
817         Invoke NeedReturnLabel from the Resolve phase instead of the emit
818         phase.
819
820         (Break.Resolve): ditto.
821
822         (SwitchLabel): instead of defining the labels during the
823         resolution phase, we now turned the public ILLabel and ILLabelCode
824         labels into methods called GetILLabelCode() and GetILLabel() that
825         only define the label during the Emit phase.
826
827         (GotoCase): Track the SwitchLabel instead of the computed label
828         (its contained therein).  Emit the code by using
829         SwitchLabel.GetILLabelCode ().
830
831         (LocalInfo.Flags.Captured): A new flag has been introduce to track
832         whether the Local has been captured or not.
833
834         (LocalInfo.IsCaptured): New property, used to tell whether the
835         local has been captured.
836         
837         * anonymous.cs: Vastly updated to contain the anonymous method
838         support.
839
840         The main classes here are: CaptureContext which tracks any
841         captured information for a toplevel block and ScopeInfo used to
842         track the activation frames for various local variables.   
843
844         Each toplevel block has an optional capture context associated
845         with it.  When a method contains an anonymous method both the
846         toplevel method and the anonymous method will create a capture
847         context.   When variables or parameters are captured, they are
848         recorded on the CaptureContext that owns them, for example:
849
850         void Demo () {
851              int a;
852              MyDelegate d = delegate {
853                  a = 1;
854              }
855         }
856
857         Here `a' will be recorded as captured on the toplevel
858         CapturedContext, the inner captured context will not have anything
859         (it will only have data if local variables or parameters from it
860         are captured in a nested anonymous method.
861
862         The ScopeInfo is used to track the activation frames for local
863         variables, for example:
864
865         for (int i = 0; i < 10; i++)
866                 for (int j = 0; j < 10; j++){
867                    MyDelegate d = delegate {
868                         call (i, j);
869                    }
870                 }
871
872         At runtime this captures a single captured variable `i', but it
873         captures 10 different versions of the variable `j'.  The variable
874         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
875         recorded on a child.  
876
877         The toplevel ScopeInfo will also track information like the `this'
878         pointer if instance variables were referenced (this is necessary
879         as the anonymous method lives inside a nested class in the host
880         type of the method). 
881
882         (AnonymousMethod): Expanded to track the Toplevel, implement
883         `AnonymousMethod.Compatible' to tell whether an anonymous method
884         can be converted to a target delegate type. 
885
886         The routine now also produces the anonymous method content
887
888         (AnonymousDelegate): A helper class that derives from
889         DelegateCreation, this is used to generate the code necessary to
890         produce the delegate for the anonymous method that was created. 
891
892         * assign.cs: API adjustments for new changes in
893         Convert.ImplicitStandardConversionExists.
894
895         * class.cs: Adjustments to cope with the fact that now toplevel
896         blocks are of type `ToplevelBlock'. 
897
898         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
899         insteda of standard blocks.
900
901         Flag errors if params arguments are passed to anonymous methods.
902
903         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
904         `CurrentAnonymousMethod' which points to the current Anonymous
905         Method.  The variable points to the AnonymousMethod class that
906         holds the code being compiled.  It is set in the new EmitContext
907         created for the anonymous method.
908
909         (EmitContext.Phase): Introduce a variable and an enumeration to
910         assist in enforcing some rules about when and where we are allowed
911         to invoke certain methods (EmitContext.NeedsReturnLabel is the
912         only one that enfonces this right now).
913
914         (EmitContext.HaveCaptureInfo): new helper method that returns
915         whether we have a CapturedContext initialized.
916
917         (EmitContext.CaptureVariable): New method used to register that a
918         LocalInfo must be flagged for capturing. 
919
920         (EmitContext.CapturedParameter): New method used to register that a
921         parameters must be flagged for capturing. 
922         
923         (EmitContext.CapturedField): New method used to register that a
924         field must be flagged for capturing. 
925
926         (EmitContext.HaveCapturedVariables,
927         EmitContext.HaveCapturedFields): Return whether there are captured
928         variables or fields. 
929
930         (EmitContext.EmitMethodHostInstance): This is used to emit the
931         instance for the anonymous method.  The instance might be null
932         (static methods), this (for anonymous methods that capture nothing
933         and happen to live side-by-side with the current method body) or a
934         more complicated expression if the method has a CaptureContext.
935
936         (EmitContext.EmitTopBlock): Routine that drives the emission of
937         code: it will first resolve the top block, then emit any metadata
938         and then emit the code.  The split is done so that we can extract
939         any anonymous methods and flag any captured variables/parameters.
940         
941         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
942         during this phase, the ILGenerator should not be used as labels
943         and local variables declared here might not be accessible to any
944         code that is part of an anonymous method.  
945
946         Exceptions to this include the temporary variables that are
947         created by some statements internally for holding temporary
948         variables. 
949         
950         (EmitContext.EmitMeta): New routine, in charge of emitting all the
951         metadata for a cb
952
953         (EmitContext.TemporaryReturn): This method is typically called
954         from the Emit phase, and its the only place where we allow the
955         ReturnLabel to be defined other than the EmitMeta.  The reason is
956         that otherwise we would have to duplicate a lot of logic in the
957         Resolve phases of various methods that today is on the Emit
958         phase. 
959
960         (EmitContext.NeedReturnLabel): This no longer creates the label,
961         as the ILGenerator is not valid during the resolve phase.
962
963         (EmitContext.EmitThis): Extended the knowledge in this class to
964         work in anonymous methods in addition to iterators. 
965
966         (EmitContext.EmitCapturedVariableInstance): This emits whatever
967         code is necessary on the stack to access the instance to a local
968         variable (the variable will be accessed as a field).
969
970         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
971         EmitContext.EmitAddressOfParameter): Routines to support
972         parameters (not completed at this point). 
973         
974         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
975         will also remove the parameters.
976
977         * convert.cs (Convert): Define a `ConstantEC' which points to a
978         null.  This is just to prefity some code that uses
979         ImplicitStandardConversion code and do not have an EmitContext
980         handy.
981
982         The idea is to flag explicitly that at that point in time, it is
983         known that the conversion will not trigger the delegate checking
984         code in implicit conversions (which requires a valid
985         EmitContext). 
986
987         Everywhere: pass new EmitContext parameter since
988         ImplicitStandardConversionExists now requires it to check for
989         anonymous method conversions. 
990
991         (Convert.ImplicitStandardConversionExists): If the type of an
992         expression is the anonymous_method_type, and the type is a
993         delegate, we invoke the AnonymousMethod.Compatible method to check
994         whether an implicit conversion is possible. 
995
996         (Convert.ImplicitConversionStandard): Only do implicit method
997         group conversions if the language level is not ISO_1.
998
999         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1000         MethodInfo for the Invoke method.  used by Delegate and
1001         AnonymousDelegate.
1002
1003         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1004         method conversions if the target type is a delegate.
1005
1006         Removed extra debugging nops.
1007
1008         (LocalVariableReference): Turn the `local_info' into a public
1009         field. 
1010
1011         Add `prepared' field, the same hack used for FieldExprs to cope
1012         with composed assignments, as Local variables do not necessarily
1013         operate purely on the stack as they used to: they can be captured
1014         fields. 
1015
1016         Add `temp' for a temporary result, like fields.
1017
1018         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1019
1020         It now copes with Local variables that are captured and emits the
1021         proper instance variable to load it from a field in the captured
1022         case. 
1023
1024         (ParameterReference.DoResolveBase): During the resolve phase,
1025         capture parameters if we are in an anonymous method.
1026
1027         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1028         anonymous method, use the EmitContext helper routines to emit the
1029         parameter reference.
1030
1031         * iterators.cs: Set RemapToProxy to true/false during the
1032         EmitDispose class.
1033
1034         * parameters.cs (GetParameterByName): New helper method. 
1035
1036         * typemanager.cs (anonymous_method_type) a new type that
1037         represents an anonyous method.  This is always an internal type,
1038         used as a fencepost to test against the anonymous-methodness of an
1039         expression. 
1040         
1041 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1042
1043         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1044         561 report.
1045         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1046
1047 2004-10-18  Martin Baulig  <martin@ximian.com>
1048
1049         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1050         `Type' directly, but call ResolveType() on it.
1051         (Catch.Resolve): Likewise.
1052         (Foreach.Resolve): Likewise.
1053
1054 2004-10-18  Martin Baulig  <martin@ximian.com>
1055
1056         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1057         `Type' directly, but call ResolveType() on it.
1058         (Probe.DoResolve): Likewise.
1059         (ArrayCreation.LookupType): Likewise.
1060         (TypeOf.DoResolve): Likewise.
1061         (SizeOf.DoResolve): Likewise.
1062
1063 2004-10-18  Martin Baulig  <martin@ximian.com>
1064
1065         * expression.cs (Invocation.BetterFunction): Put back
1066         TypeManager.TypeToCoreType().
1067
1068 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1069
1070         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1071         the ResolveType.
1072
1073 2004-10-18  Martin Baulig  <martin@ximian.com>
1074
1075         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1076         `Type' directly, but call ResolveType() on it.
1077
1078 2004-10-18  Martin Baulig  <martin@ximian.com>
1079
1080         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1081         `Type' directly, but call ResolveType() on it.
1082         (MemberBase.DoDefine): Likewise.
1083
1084         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1085         `Type' directly, but call ResolveType() on it.
1086         (ComposedCast.DoResolveAsTypeStep): Likewise.
1087
1088         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1089         `Type' directly, but call ResolveType() on it.
1090
1091 2004-10-17  John Luke  <john.luke@gmail.com>
1092
1093         * class.cs (Operator.GetSignatureForError): use CSharpName
1094
1095         * parameter.cs (Parameter.GetSignatureForError): Returns
1096         correct name even if was not defined.
1097
1098 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1099
1100         Fix #65816.
1101         * class.cs (TypeContainer.EmitContext): New property.
1102         (DefineNestedTypes): Create an emitcontext for each part.
1103         (MethodCore.DoDefineParameters): Use container's emitcontext.
1104         Pass type array to InternalParameters.
1105         (MemberBase.DoDefine): Use container's emitcontext.
1106         (FieldMember.Define): Likewise.
1107         (Event.Define): Likewise.
1108         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1109         Pass type array to InternalParameters.
1110         (SetIndexerMethod.GetParameterInfo): Likewise.
1111         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1112         * delegate.cs (Define): Pass emitcontext to
1113         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1114         array to InternalParameters.
1115         * expression.cs (ParameterReference.DoResolveBase): Pass
1116         emitcontext to GetParameterInfo.
1117         (ComposedCast.DoResolveAsTypeStep): Remove check on
1118         ec.ResolvingTypeTree.
1119         * parameter.cs (Parameter.Resolve): Change argument to
1120         EmitContext.  Use ResolveAsTypeTerminal.
1121         (Parameter.GetSignature): Change argument to EmitContext.
1122         (Parameters.ComputeSignature): Likewise.
1123         (Parameters.ComputeParameterTypes): Likewise.
1124         (Parameters.GetParameterInfo): Likewise.
1125         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1126         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1127         * support.cs (InternalParameters..ctor): Remove variant that takes
1128         a DeclSpace.
1129         * typemanager.cs (system_intptr_expr): New.
1130         (InitExpressionTypes): Initialize it.
1131
1132 2004-10-12  Chris Toshok  <toshok@ximian.com>
1133
1134         * cs-parser.jay: fix location for try_statement and catch_clause.
1135
1136 2004-10-11  Martin Baulig  <martin@ximian.com>
1137
1138         * report.cs: Don't make --fatal abort on warnings, we have
1139         -warnaserror for that.
1140
1141 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1142
1143         More DeclSpace.ResolveType avoidance.
1144         * decl.cs (MemberCore.InUnsafe): New property.
1145         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1146         with newly created EmitContext.
1147         (FieldMember.Define): Likewise.
1148         * delegate.cs (Delegate.Define): Likewise.
1149         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1150         only if normal name-lookup fails.
1151         (TypeExpr.DoResolve): Enable error-checking.
1152         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1153         (SizeOf.DoResolve): Likewise.
1154         (ComposedCast.DoResolveAsTypeStep): Likewise.
1155         (StackAlloc.DoResolve): Likewise.
1156         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1157         (Block.Unsafe): New property.
1158         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1159         (Unsafe): Set 'unsafe' flag of contained block.
1160         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1161         (Fixed.Resolve): Likewise.
1162         (Catch.Resolve): Likewise.
1163         (Using.ResolveLocalVariableDecls): Likewise.
1164         (Foreach.Resolve): Likewise.
1165
1166 2004-10-05  John Luke <john.luke@gmail.com>
1167
1168         * cs-parser.jay: add location to error CS0175
1169
1170 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1171
1172         * ecore.cs (Expression.Constantity): Add support for turning null
1173         into a constant.
1174
1175         * const.cs (Const.Define): Allow constants to be reference types
1176         as long as the value is Null.
1177
1178 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1179
1180         * namespace.cs (NamespaceEntry.Using): No matter which warning
1181         level is set, check if this namespace name has already been added.
1182
1183 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1184
1185         * expression.cs: reftype [!=]= null should always use br[true,false].
1186         # 67410
1187
1188 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1189
1190         Fix #67108
1191         * attribute.cs: Enum conversion moved to 
1192         GetAttributeArgumentExpression to be applied to the all
1193         expressions.
1194
1195 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1196
1197         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1198         * class.c (TypeContainer.DefineType): Flag error if
1199         base types aren't accessible due to access permissions.
1200         * decl.cs (DeclSpace.ResolveType): Move logic to
1201         Expression.ResolveAsTypeTerminal.
1202         (DeclSpace.ResolveTypeExpr): Thin layer over
1203         Expression.ResolveAsTypeTerminal.
1204         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1205         Refactor code into NestedAccess.  Use it.
1206         (DeclSpace.NestedAccess): New.
1207         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1208         argument to silence errors.  Check access permissions.
1209         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1210         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1211         (Cast.DoResolve): Likewise.
1212         (New.DoResolve): Likewise.
1213         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1214         (TypeOf.DoResolve): Likewise.
1215
1216         * expression.cs (Invocation.BetterConversion): Return the Type of
1217         the better conversion.  Implement section 14.4.2.3 more faithfully.
1218         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1219         section 14.4.2.2 explicit.
1220         (Invocation.OverloadResolve): Update.
1221         (Invocation): Remove is_base field.
1222         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1223         (Invocation.Emit): Likewise.
1224
1225 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1226
1227         * README: Update to changes.
1228
1229 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1230
1231         * cs-parser.jay: Reverted 642 warning fix.
1232
1233 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1234
1235         Fix bug #66615
1236         * decl.cs (FindMemberWithSameName): Indexer can have more than
1237         1 argument.
1238
1239 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1240
1241         * expression.cs (LocalVariableReference.DoResolveLValue):
1242         Do not report warning 219 for out values.
1243         (EmptyExpression.Null): New member to avoid extra allocations.
1244
1245 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1246
1247         * cs-parser.jay: Fix wrong warning 642 report.
1248
1249         * cs-tokenizer.cs (CheckNextToken): New helper;
1250         Inspect next character if is same as expected.
1251
1252 2004-09-23  Martin Baulig  <martin@ximian.com>
1253
1254         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1255         (Convert.ImplicitReferenceConversionExists): Likewise.
1256
1257 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1258
1259         * class.cs (Operator.Define): Add error 448 and 559 report.
1260
1261 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1262
1263         * class.cs (MemberBase.IsTypePermitted): New protected
1264         method for checking error CS0610.
1265
1266 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1267
1268         * class.cs (TypeContainer.HasExplicitLayout): New property
1269         Returns whether container has StructLayout attribute set Explicit.
1270         (FieldMember): New abstract class for consts and fields.
1271         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1272         (Field): Reuse FieldMember.
1273
1274         * const.cs (Const): Reuse FieldMember.
1275
1276         * rootcontext.cs: EmitConstants call moved to class.
1277
1278 2004-09-22  Martin Baulig  <martin@ximian.com>
1279
1280         Thanks to Peter Sestoft for this bug report.
1281
1282         * expression.cs (Conditional): If both the `trueExpr' and the
1283         `falseExpr' is a NullLiteral, return a NullLiteral.
1284
1285 2004-09-22  Martin Baulig  <martin@ximian.com>
1286
1287         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1288         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1289         for the "get_Current" call.
1290
1291 2004-09-22  Martin Baulig  <martin@ximian.com>
1292
1293         Marek and me just fixed one of our oldest bugs: #28562 :-)
1294
1295         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1296
1297         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1298         we're an EnumConstant, just return that.
1299         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1300         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1301         to get the value which'll actually be written into the attribute.
1302         However, we have to use GetValue() to access the attribute's value
1303         in the compiler.        
1304
1305 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1306
1307         * constant.cs (Constant.IsNegative): New abstract property
1308         IsNegative.
1309
1310         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1311         (StackAlloc.DoResolve): Reused IsNegative.
1312
1313 2004-09-21  Martin Baulig  <martin@ximian.com>
1314
1315         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1316         if we're used in an iterator, we may be called from different
1317         methods.
1318
1319         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1320         we actually have an exception block.
1321
1322 2004-09-20  John Luke <jluke@cfl.rr.com>
1323
1324         * class.cs, cs-parser.jay: Improve the error report for 1520:
1325         report the actual line where the error happens, not where the
1326         class was declared.
1327
1328         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1329         Pass location information that was available elsewhere.
1330
1331 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1332
1333         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1334         runtime to delay sign assemblies.
1335
1336 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1337
1338         * cs-parser.jay: Do not report the stack trace, this is barely
1339         used nowadays.
1340
1341 2004-08-22  John Luke  <john.luke@gmail.com>
1342  
1343         * driver.cs : check that a resource id is not already used
1344         before adding it, report CS1508 if it is, bug #63637
1345
1346 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1347
1348         * ecore.cs: Removed dead code.
1349
1350 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1351
1352         * class.cs: Do not report warning CS0067 on the interfaces.
1353
1354 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1355
1356         * cs-parser.jay: Add error 504 report.
1357
1358 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1359
1360         * rootcontext.cs: WarningLevel is 4 by default now.
1361
1362         * statement.cs (Fixed.Resolve): Do not null
1363         VariableInfo.
1364
1365 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1366
1367         Fixed bug #55780
1368         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1369         deep search when property is not virtual.
1370         (PropertyExpr.ResolveAccessors): Make one call for both
1371         accessors.
1372
1373 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1374
1375         Fixed bug #65766
1376         * statement.cs: Error 152 report constains also location.
1377
1378 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1379
1380         Fixed bug #65766
1381         * const.cs: Explicitly set constant as static.
1382
1383 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1384
1385         Fixed bug #64226
1386         * cs-parser.jay: Add error 1017 report.
1387
1388 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1389
1390         Fixed bug #59980, #64224
1391         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1392
1393         * typemanager.cs (IsSpecialMethod): Simplified
1394
1395 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1396
1397         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1398         condition with better params.
1399
1400 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1401
1402         Fixed bug #65238
1403         * attribute.cs (Resolve): Property has to have both
1404         accessors.
1405
1406 2004-09-14  Martin Baulig  <martin@ximian.com>
1407
1408         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1409
1410 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1411
1412         Fixed bug #61902
1413         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1414         called and is obsolete then this member suppress message
1415         when call is inside next [Obsolete] method or type.
1416
1417         * expression.cs: Use TestObsoleteMethodUsage member.
1418
1419 2004-09-14  Martin Baulig  <martin@ximian.com>
1420
1421         * cs-parser.jay: Sync a bit with the GMCS version.
1422
1423 2004-09-14  Martin Baulig  <martin@ximian.com>
1424
1425         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1426         (CSharpParser.yacc_verbose_flag): New public field.
1427
1428         * genericparser.cs: Removed.
1429
1430 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1431
1432         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1433
1434 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1435
1436         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1437
1438 2004-09-10  Martin Baulig  <martin@ximian.com>
1439
1440         Backported my MemberName changes from GMCS into MCS.
1441
1442         - we are now using a special `MemberName' class instead of using
1443         strings; in GMCS, the `MemberName' also contains the type
1444         arguments.
1445
1446         - changed the grammar rules a bit:
1447           * the old `member_name' is now a `namespace_or_type_name':
1448             The rule is that we use `namespace_or_type_name' everywhere
1449             where we expect either a "member name" (GetEnumerator) or a
1450             "member name" with an explicit interface name
1451             (IEnumerable.GetEnumerator).
1452             In GMCS, the explicit interface name may include type arguments
1453             (IEnumerable<T>.GetEnumerator).
1454           * we use `member_name' instead of just `IDENTIFIER' for
1455             "member names":
1456             The rule is that we use `member_name' wherever a member may
1457             have type parameters in GMCS.       
1458
1459         * decl.cs (MemberName): New public class.
1460         (MemberCore.MemberName): New public readonly field.
1461         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1462         (DeclSpace): Likewise.
1463
1464         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1465         * enum.cs (Enum.ctor): Likewise.
1466
1467         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1468         MemberName.     
1469         (AliasEntry.ctor): Take a MemberName, not an Expression.
1470         (AliasEntry.UsingAlias): Likewise.
1471
1472         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1473         (IMethodData.MemberName): Changed type from string to MemberName.
1474         (MemberBase.ExplicitInterfaceName): Likewise.
1475         (AbstractPropertyEventMethod.SetupName): Make this private.
1476         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1477         argument; compute the member name here.
1478         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1479         on the `member.MemberName' and the `prefix'.
1480
1481         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1482         not `type_name'.
1483         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1484         thus, we get a `MemberName' instead of a `string'.  These
1485         declarations may have type parameters in GMCS.
1486         (interface_method_declaration, delegate_declaration): Likewise.
1487         (class_declaration, interface_declaration): Likewise.
1488         (method_header): Use `namespace_or_type_name' instead of
1489         `member_name'.  We may be an explicit interface implementation.
1490         (property_declaration, event_declaration): Likewise.
1491         (member_name): This is now just an `IDENTIFIER', not a
1492         `namespace_or_type_name'.
1493         (type_name, interface_type): Removed.
1494         (namespace_or_type_name): Return a MemberName, not an Expression.
1495         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1496         call GetTypeExpression() on the MemberName to get an expression.
1497         (IndexerDeclaration.interface_type): Changed type from string to
1498         MemberName.
1499         (MakeName): Operate on MemberName's instead of string's.
1500
1501 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1502
1503         Fix bug #55770.
1504         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1505         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1506         lookup to avoid symbols introduced by 'using'.
1507         * rootcontext.cs (NamespaceLookup): Update.
1508
1509 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1510
1511         * class.cs (TypeContainer.DoDefineMembers): Do not call
1512         DefineDefaultConstructor for static classes.
1513
1514 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1515
1516         * attribute.cs (Attribute.Resolve): Add error 653 report.
1517
1518         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1519         report.
1520         (Method.ApplyAttributeBuilder): Add error 685 report.
1521         (Operator.Define): Add error 564 report.
1522
1523         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1524
1525         * expression.cs (Invocation.DoResolve): Add error
1526         245 and 250 report.
1527
1528         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1529         error 674 report.
1530
1531 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1532
1533         * class.cs (ConstructorInitializer.Resolve):
1534         Wrong error number (515->516).
1535
1536 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1537
1538         * class.cs (Indexer.Define): Add error 631 report.
1539
1540 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1541
1542         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1543
1544 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1545
1546         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1547
1548 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1549
1550         * cs-parser.jay: Added error CS0241 report.
1551
1552 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1553
1554         * cs-parser.jay (fixed_statement): Introduce a scope for the
1555         declaration in the 'fixed' statement.
1556
1557 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1558
1559         * cs-parser.jay: Added CS0230 error report.
1560
1561 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1562
1563         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1564
1565 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1566
1567         * expression.cs (Argument.Resolve): Added error CS0192 and
1568         CS0199 report.
1569
1570 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1571
1572         C# 2.0 #pragma warning feature
1573
1574         * cs-tokenizer.cs (PreProcessPragma): New method; 
1575         Handles #pragma directive.
1576
1577         * report.cs (WarningRegions): New class; Support
1578         class for #pragma warning directive. It tests whether
1579         warning is enabled for a given line.
1580
1581 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1582
1583         * const.cs: Add more descriptive error report, tahnks to
1584         Sebastien. 
1585
1586 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1587
1588         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1589
1590 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1591
1592         * expression.cs: Apply patch from Ben: Remove dead code from
1593         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1594         as that code just threw an exception anwyays.
1595
1596         * const.cs: Remove the call to the turnintoconstant, for details
1597         see bug: #63144
1598         
1599         * literal.cs: The type of the null-literal is the null type;  So
1600         we use a placeholder type (literal.cs:System.Null, defined here)
1601         for it.
1602
1603         * expression.cs (Conditional.DoResolve): Remove some old code that
1604         is no longer needed, conversions have been fixed.
1605
1606         (ArrayCreationExpression.DoResolve): Return false if we fail to
1607         resolve the inner expression.
1608
1609 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1610
1611         Fix test-290.cs.
1612         * cs-parser.jay (delegate_declaration): Record a delegate
1613         declaration as a type declaration.
1614         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1615
1616 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1617
1618         * parameter.cs: Do not crash if the type can not be resolved. 
1619
1620         * expression.cs: Report errors with unsafe pointers, fixes #64896
1621
1622 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1623
1624         * expression.cs: Pointer arith always needs to do a conv.i
1625         if the operand is a long. fix 65320
1626
1627 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1628
1629         Fixed cs0619-37.cs, cs0619-38.cs
1630
1631         * enum.cs (GetObsoleteAttribute): Removed.
1632
1633         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1634         on Enum member is double staged. The first is tested member
1635         and then enum.
1636
1637 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1638
1639         Fixed #56986, #63631, #65231
1640
1641         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1642         adds member to name container.
1643         (TypeContainer.AddToTypeContainer): New method, adds type to
1644         name container.
1645         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1646         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1647         AddOperator): Simplified by reusing AddToMemberContainer.
1648         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1649         instead of field.
1650         (Method.CheckForDuplications): Fixed implementation to test all
1651         possibilities.
1652         (MemberBase): Detection whether member is explicit interface
1653         implementation is now in constructor.
1654         (MemberBase.UpdateMemberName): Handles IndexerName.
1655         (Accessor): Changed to keep also location information.
1656         (AbstractPropertyEventMethod): Is derived from MemberCore.
1657         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1658         will be emited or not.
1659         (PropertyBase.AreAccessorsDuplicateImplementation):
1660         Tests whether accessors are not in collision with some method.
1661         (Operator): Is derived from MethodCore to simplify common
1662         operations.
1663
1664         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1665         must be performed.
1666         (DeclSpace.AddToContainer): Adds the member to defined_names
1667         table. It tests for duplications and enclosing name conflicts.
1668
1669         * enum.cs (EnumMember): Clean up to reuse the base structures
1670
1671 2004-09-03  Martin Baulig  <martin@ximian.com>
1672
1673         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1674         into TypeContainer, to make partial classes work again.
1675
1676 2004-09-03  Martin Baulig  <martin@ximian.com>
1677
1678         * rootcontext.cs (RootContext.V2): Removed.
1679
1680 2004-03-23  Martin Baulig  <martin@ximian.com>
1681
1682         * expression.cs (Invocation.OverloadResolve): Added `bool
1683         may_fail' argument and use it instead of the Location.IsNull() hack.
1684
1685 2004-09-03  Martin Baulig  <martin@ximian.com>
1686
1687         Merged latest changes into gmcs.  Please keep this comment in
1688         here, it makes it easier for me to see what changed in MCS since
1689         the last time I merged.
1690
1691 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1692
1693         Fix #61128.
1694         * expression.cs (BetterConversion): Don't allow either conversion 
1695         to be null.  Remove redundant implicit conversion test when 'q ==
1696         null' -- when this function is invoked, we already know that the
1697         implicit conversion exists.
1698         (BetterFunction): Assume that 'best' is non-null.  Remove
1699         redundant reimplementation of IsApplicable when 'best' is null.
1700         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1701         number of arguments.
1702         (IsAncestralType): Extract from OverloadResolve.
1703         (OverloadResolve): Make robust to the MethodGroupExpr being
1704         unsorted.  Implement all the logic of Section 14.5.5.1, and
1705         support overloading of methods from multiple applicable types.
1706         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1707
1708         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1709         (RealError, Warning): Append type of report to related symbol.
1710
1711 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1712
1713         * enum.cs: Fixed CLS-Compliance checks for enum members.
1714         Error tests cs3008-8.cs, cs3014-8.cs
1715
1716 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1717
1718         Fixed bug #62342, #63102
1719         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1720         like ImplementMethod.
1721
1722 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1723
1724         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1725         Fixed bug #65170.
1726
1727 2004-09-02  Martin Baulig  <martin@ximian.com>
1728
1729         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1730         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1731         on the MethodBase.
1732
1733 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1734
1735         C# 2.0 Static classes implemented
1736
1737         * class.cs (TypeContainer): instance_constructors,
1738         initialized_fields, initialized_static_fields,
1739         default_constructor, base_inteface_types are protected to be
1740         accessible from StaticClass.
1741         (TypeContainer.DefineDefaultConstructor): New virtual method
1742         for custom default constructor generating
1743         (StaticClass): New class to handle "Static classes" feature.
1744
1745         * cs-parser.jay: Handle static keyword on class like instance
1746         of StaticClass.
1747
1748         * driver.cs: Added "/langversion" command line switch with two
1749         options (iso-1, default).
1750
1751 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1752
1753         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1754
1755 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1756
1757         * delegate.cs: Style.
1758
1759 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1760
1761         * delegate.cs: Add seperate instance expr field for miguel.
1762
1763 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1764
1765         * PointerArithmetic (Resolve): make sure we are not doing
1766         pointer arith on void*. Also, make sure we are resolved
1767         by not setting eclass until resolve.
1768
1769         All callers: Make sure that PointerArithmetic gets resolved.
1770
1771 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1772
1773         * ArrayCreation (LookupType): If the type does not resolve 
1774         to an array, give an error.
1775
1776 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1777
1778         * statement.cs (Try.Resolve): Fixed bug #64222
1779
1780 2004-08-27  Martin Baulig  <martin@ximian.com>
1781
1782         * class.cs
1783         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1784         crash here.     
1785
1786 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1787
1788         * ecore.cs (Constantify): Get underlying type via
1789         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1790         Windows in special cases.
1791
1792 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1793
1794         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1795         for obtaining also private methods.
1796         (GetRemoveMethod): Used GetRemoveMethod (true)
1797         for obtaining also private methods.
1798
1799 2004-08-24  Martin Baulig  <martin@ximian.com>
1800
1801         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1802         MethodAttributes.HideBySig for operators.
1803
1804 2004-08-23  Martin Baulig  <martin@ximian.com>
1805
1806         Back to the old error reporting system :-)
1807
1808         * report.cs (Message): Removed.
1809         (Report.MessageData, ErrorData, WarningData): Removed.
1810         (Report.Error, Warning): Back to the old system.
1811
1812 2004-08-23  Martin Baulig  <martin@ximian.com>
1813
1814         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1815
1816         * class.cs (TypeContainer.ParentContainer): New public virtual
1817         method; replaces the explicit interface implementation.
1818         (ClassPart.ParentContainer): Override.
1819
1820 2004-08-23  Martin Baulig  <martin@ximian.com>
1821
1822         * statement.cs (Switch): Added support for constant switches; see
1823         #59428 or test-285.cs.
1824
1825 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1826
1827         Fixed bug #62740.
1828         * statement.cs (GetEnumeratorFilter): Removed useless
1829         logic because C# specs is strict. GetEnumerator must be
1830         public.
1831
1832 2004-08-22  Martin Baulig  <martin@ximian.com>
1833
1834         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1835         a switch and may break, reset the barrier.  Fixes #59867.
1836
1837 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1838
1839         CLS-Compliance speed up (~5% for corlib)
1840
1841         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1842         New method. Tests container for CLS-Compliant names
1843
1844         * class.cs (TypeContainer.VerifyClsName): New method.
1845         Checks whether container name is CLS Compliant.
1846         (Constructor): Implements IMethodData.
1847
1848         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1849         low-case table for CLS Compliance test.
1850         (MemberCache.VerifyClsParameterConflict): New method.
1851         Checks method parameters for CS3006 error.
1852
1853         * enum.cs (EnumMember): Is derived from MemberCore.
1854         (Enum.VerifyClsName): Optimized for better performance.
1855
1856 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1857
1858         * report.cs: Renamed Error_T to Error and changed all
1859         references.
1860
1861 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1862
1863         * class.cs (TypeContainer.IndexerArrayList): New inner class
1864         container for indexers.
1865         (TypeContainer.DefaultIndexerName): New constant for default
1866         indexer name. Replaced all "Item" with this constant.
1867         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1868
1869         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1870         DefaultMemberAttribute constructor.
1871
1872 2004-08-05  Martin Baulig  <martin@ximian.com>
1873
1874         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1875         Fix bug #59429.
1876
1877 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1878
1879         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1880         multi platforms problem.
1881
1882         * compiler.csproj: Included shared files.
1883
1884 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1885
1886         Fix bug 60333, 55971 in the more general way
1887         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1888         Added arg_type argument for constant conversion.
1889         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1890
1891 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1892
1893         Fix bug #59760
1894         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1895         OperatorArrayList, MethodCoreArrayList for typecontainer
1896         containers. Changed class member types to these new types.
1897         (MethodArrayList.DefineMembers): Added test for CS0659.
1898
1899 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1900
1901         * cfold.cs: Synchronize the folding with the code in expression.cs
1902         Binary.DoNumericPromotions for uint operands.
1903
1904         * attribute.cs: Revert patch from Raja, it introduced a regression
1905         while building Blam-1.2.1 (hard to isolate a test case).
1906
1907 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1908
1909         Fix for #55382
1910         * class.cs:
1911         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1912         name collision.
1913         (MethodCore.parent_method): New member. The method we're overriding
1914         if this is an override method.
1915         (MethodCore.CheckBase): Moved from Method class and made common.
1916         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1917         private.
1918         (MethodCore.CheckForDuplications): New abstract method. For custom
1919         member duplication search in a container
1920         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1921         method and its return type.
1922         (Event.conflict_symbol): New member. Symbol with same name in the
1923         parent class.
1924
1925         * decl.cs:
1926         (MemberCache.FindMemberWithSameName): New method. The method
1927         is looking for conflict with inherited symbols.
1928
1929 2004-08-04  Martin Baulig  <martin@ximian.com>
1930
1931         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1932
1933         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1934
1935 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1936
1937         * report.cs (Message): New enum for better error, warning reference in
1938         the code.
1939         (MessageData): New inner abstract class. It generally handles printing of
1940         error and warning messages.
1941         Removed unused Error, Warning, Message methods.
1942
1943 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1944
1945         Fix for cs0592-8.cs test
1946         * attribute.cs
1947         (Attributable.ValidAttributeTargets): Made public.
1948         (Attribute.ExplicitTarget): New member for explicit target value.
1949         (Attribute.CheckTargets): Now we translate explicit attribute
1950         target to Target here.
1951
1952 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1953
1954         * ecore.cs (MethodGroupExpr): new IsBase property.
1955
1956         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1957
1958         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1959         rather than an instance expr.
1960
1961         (DelegateCreation.Emit): Use the method group rather than
1962         the instance expression. Also, if you have base.Foo as the
1963         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1964
1965         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1966
1967         (NewDelegate.DoResolve): Only check for the existance of Invoke
1968         if the method is going to be needed. Use MethodGroupExpr.
1969
1970         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1971
1972         * expression.cs: For pointer arith., make sure to use
1973         the size of the type, not the size of the pointer to
1974         the type.
1975
1976 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1977
1978         Fix for #60722
1979         * class.cs (Class): Added error CS0502 test.
1980
1981 2004-08-03  John Luke  <jluke@cfl.rr.com>
1982             Raja R Harinath  <rharinath@novell.com>
1983
1984         Fix for #60997.
1985         * attribute.cs (Attribute.complained_before): New flag.
1986         (Attribute.ResolveType, Attribute.Resolve),
1987         (Attribute.DefinePInvokeMethod): Set it.
1988         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1989         
1990 2004-08-03  Martin Baulig  <martin@ximian.com>
1991
1992         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1993         use a user-defined operator; we still need to do numeric
1994         promotions in case one argument is a builtin type and the other
1995         one has an implicit conversion to that type.  Fixes #62322.
1996
1997 2004-08-02  Martin Baulig  <martin@ximian.com>
1998
1999         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2000         (LocalInfo.IsThis): New public property.
2001         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2002
2003 2004-08-01  Martin Baulig  <martin@ximian.com>
2004
2005         * class.cs (TypeContainer.GetClassBases): Don't set the default
2006         here since we may get called from GetPartialBases().
2007         (TypeContainer.DefineType): If GetClassBases() didn't return a
2008         parent, use the default one.
2009
2010 2004-07-30  Duncan Mak  <duncan@ximian.com>
2011
2012         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2013
2014 2004-07-30  Martin Baulig  <martin@ximian.com>
2015
2016         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2017
2018         * class.cs (SourceMethod): New public class, derive from the
2019         symbol writer's ISourceMethod.
2020         (Method): Use the new symbol writer API.
2021
2022         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2023         as argument and use the new symbol writer.
2024
2025         * location.cs
2026         (SourceFile): Implement the symbol writer's ISourceFile.
2027         (Location.SymbolDocument): Removed.
2028         (Location.SourceFile): New public property.
2029
2030         * symbolwriter.cs: Use the new symbol writer API.
2031
2032 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2033
2034         * Makefile (install-local): Remove.  Functionality moved to
2035         executable.make.
2036
2037 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2038
2039         * Makefile: Install mcs.exe.config file together with mcs.exe.
2040         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2041         correct runtime version.
2042         
2043 2004-07-25  Martin Baulig  <martin@ximian.com>
2044
2045         * class.cs
2046         (TypeContainer.RegisterOrder): Removed, this was unused.
2047         (TypeContainer, interface_order): Removed.
2048         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2049         TypeContainer as argument since we can also be called with a
2050         `PartialContainer' for a partial class/struct/interface.
2051         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2052         of checking whether we're an `Interface' - we could be a
2053         `PartialContainer'.
2054         (PartialContainer.Register): Override; call
2055         AddClass()/AddStruct()/AddInterface() on our parent.
2056
2057         * cs-parser.jay (interface_member_declaration): Add things to the
2058         `current_container', not the `current_class'.
2059
2060         * rootcontext.cs (RegisterOrder): The overloaded version which
2061         takes an `Interface' was unused, removed.
2062
2063         * typemanager.cs (TypeManager.LookupInterface): Return a
2064         `TypeContainer', not an `Interface'.
2065         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2066         contain a `PartialContainer' for an interface, so check it's
2067         `Kind' to figure out what it is.
2068
2069 2004-07-25  Martin Baulig  <martin@ximian.com>
2070
2071         * class.cs (Class.DefaultTypeAttributes): New public constant.
2072         (Struct.DefaultTypeAttributes): Likewise.
2073         (Interface.DefaultTypeAttributes): Likewise.
2074         (PartialContainer.TypeAttr): Override this and add the
2075         DefaultTypeAttributes.
2076
2077 2004-07-25  Martin Baulig  <martin@ximian.com>
2078
2079         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2080         we can just use the `Parent' field instead.
2081
2082 2004-07-25  Martin Baulig  <martin@ximian.com>
2083
2084         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2085
2086 2004-07-25  Martin Baulig  <martin@ximian.com>
2087
2088         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2089         our parts before defining any methods.
2090         (TypeContainer.VerifyImplements): Make this virtual.
2091         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2092         on our PartialContainer.
2093
2094 2004-07-25  Martin Baulig  <martin@ximian.com>
2095
2096         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2097
2098         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2099         argument, we can just use the `Parent' field instead.
2100
2101         * class.cs
2102         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2103         (MemberBase.DoDefine): Likewise.
2104
2105 2004-07-24  Martin Baulig  <martin@ximian.com>
2106
2107         * decl.cs (MemberCore.Parent): New public field.
2108         (DeclSpace.Parent): Moved to MemberCore.
2109
2110         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2111         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2112         parent's .ctor.
2113         (FieldBase, Field, Operator): Likewise.
2114         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2115         (EventField, Event): Likewise.
2116
2117 2004-07-23  Martin Baulig  <martin@ximian.com>
2118
2119         * class.cs (PartialContainer): New public class.
2120         (ClassPart): New public class.
2121         (TypeContainer): Added support for partial classes.
2122         (TypeContainer.GetClassBases): Splitted some of the functionality
2123         out into GetNormalBases() and GetPartialBases().
2124
2125         * cs-tokenizer.cs (Token.PARTIAL): New token.
2126         (Tokenizer.consume_identifier): Added some hacks to recognize
2127         `partial', but only if it's immediately followed by `class',
2128         `struct' or `interface'.
2129
2130         * cs-parser.jay: Added support for partial clases.
2131
2132 2004-07-23  Martin Baulig  <martin@ximian.com>
2133
2134         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2135         a `DeclSpace' and also made it readonly.
2136         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2137         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2138         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2139
2140         * cs-parser.jay: Pass the `current_class', not the
2141         `current_container' (at the moment, this is still the same thing)
2142         to a new Method, Property, Event, Indexer or Constructor.
2143
2144 2004-07-23  Martin Baulig  <martin@ximian.com>
2145
2146         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2147         and removed the `current_interface' one.
2148         (struct_declaration, class_declaration, interface_declaration):
2149         Set `current_class' to the newly created class/struct/interface;
2150         set their `Bases' and call Register() before parsing their body.
2151
2152 2004-07-23  Martin Baulig  <martin@ximian.com>
2153
2154         * class.cs (Kind): New public enum.
2155         (TypeContainer): Made this class abstract.
2156         (TypeContainer.Kind): New public readonly field.
2157         (TypeContainer.CheckDef): New public method; moved here from
2158         cs-parser.jay.
2159         (TypeContainer.Register): New public abstract method.
2160         (TypeContainer.GetPendingImplementations): New public abstract
2161         method.
2162         (TypeContainer.GetClassBases): Removed the `is_class' and
2163         `is_iface' parameters.
2164         (TypeContainer.DefineNestedTypes): Formerly known as
2165         DoDefineType().
2166         (ClassOrStruct): Made this class abstract.
2167
2168         * tree.cs (RootTypes): New public type. 
2169
2170 2004-07-20  Martin Baulig  <martin@ximian.com>
2171
2172         * tree.cs (Tree.RecordNamespace): Removed.
2173         (Tree.Namespaces): Removed.
2174
2175         * rootcontext.cs (RootContext.IsNamespace): Removed.
2176
2177         * cs-parser.jay (namespace_declaration): Just create a new
2178         NamespaceEntry here.
2179
2180 2004-07-20  Martin Baulig  <martin@ximian.com>
2181
2182         * statement.cs (ExceptionStatement): New abstract class.  This is
2183         now used as a base class for everyone who's using `finally'.
2184         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2185         our local variables before using them.
2186
2187         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2188         virtual method.  This is used by Yield.Resolve() to "steal" an
2189         outer block's `finally' clauses.
2190         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2191         argument.
2192
2193         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2194         version which takes an ExceptionStatement.  This version must be
2195         used to create exception branchings.
2196
2197         * iterator.cs
2198         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2199         (Iterator.EmitMoveNext): Added exception support; protect the
2200         block with a `fault' clause, properly handle 'finally' clauses.
2201         (Iterator.EmitDispose): Run all the `finally' clauses here.
2202
2203 2004-07-20  Martin Baulig  <martin@ximian.com>
2204
2205         * iterator.cs: This is the first of a set of changes in the
2206         iterator code.  Match the spec more closely: if we're an
2207         IEnumerable, then GetEnumerator() must be called.  The first time
2208         GetEnumerator() is called, it returns the current instance; all
2209         subsequent invocations (if any) must create a copy.
2210
2211 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2212
2213         * expression.cs: Resolve the constant expression before returning
2214         it. 
2215
2216 2004-07-19  Martin Baulig  <martin@ximian.com>
2217
2218         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2219         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2220         the return type of the new EmitContext.
2221
2222 2004-07-18  Martin Baulig  <martin@ximian.com>
2223
2224         * class.cs (Property.Define): Fix iterators.
2225
2226         * iterators.cs (Iterator.Define): Moved the
2227         `container.AddInterator (this)' call here from the .ctor; only do
2228         it if we resolved successfully.
2229
2230 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2231
2232         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2233         `true' for preprocessing directives that we parse.  The return
2234         value indicates whether we should return to regular tokenizing or
2235         not, not whether it was parsed successfully.
2236
2237         In the past if we were in: #if false ... #line #endif, we would
2238         resume parsing after `#line'.  See bug 61604.
2239
2240         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2241         building: IsEnumType should return true only for enums, not for
2242         enums or System.Enum itself.  This fixes #61593.
2243
2244         Likely what happened is that corlib was wrong: mcs depended on
2245         this bug in some places.  The bug got fixed, we had to add the
2246         hack, which caused bug 61593.
2247
2248         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2249         that was a workaround for the older conditions.
2250
2251 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2252
2253         * assign.cs: IAssignMethod has a new interface, as documented
2254         inline. All assignment code now uses this new api.
2255
2256         * ecore.cs, expression.cs: All classes which implement
2257         IAssignMethod now use the new interface.
2258
2259         * expression.cs (Invocation): add a hack to EmitCall so that
2260         IndexerAccess can be the target of a compound assignment without
2261         evaluating its arguments twice.
2262
2263         * statement.cs: Handle changes in Invocation api.
2264
2265 2004-07-16  Martin Baulig  <martin@ximian.com>
2266
2267         * iterators.cs: Rewrote this.  We're now using one single Proxy
2268         class for both the IEnumerable and the IEnumerator interface and
2269         `Iterator' derives from Class so we can use the high-level API.
2270
2271         * class.cs (TypeContainer.AddIterator): New method.
2272         (TypeContainer.DoDefineType): New protected virtual method, which
2273         is called from DefineType().
2274         (TypeContainer.DoDefineMembers): Call DefineType() and
2275         DefineMembers() on all our iterators.
2276         (TypeContainer.Emit): Call Emit() on all our iterators.
2277         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2278
2279         * codegen.cs (EmitContext.CurrentIterator): New public field.
2280
2281 2004-07-15  Martin Baulig  <martin@ximian.com>
2282
2283         * typemanager.cs
2284         (TypeManager.not_supported_exception_type): New type.   
2285
2286 2004-07-14  Martin Baulig  <martin@ximian.com>
2287
2288         * iterators.cs: Use real error numbers.
2289
2290 2004-07-14  Martin Baulig  <martin@ximian.com>
2291
2292         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2293         requires this to be a System.Collection.IEnumerable and not a
2294         class implementing that interface.
2295         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2296
2297 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2298
2299         * class.cs: Fixed previous fix, it broke some error tests.
2300
2301 2004-07-12  Martin Baulig  <martin@ximian.com>
2302
2303         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2304         Fixes #61293.
2305
2306 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2307
2308         * assign.cs (LocalTemporary): Add new argument: is_address,If
2309         `is_address' is true, then the value that we store is the address
2310         to the real value, and not the value itself.
2311         
2312         * ecore.cs (PropertyExpr): use the new local temporary
2313         stuff to allow us to handle X.Y += z (where X is a struct)
2314
2315 2004-07-08  Martin Baulig  <martin@ximian.com>
2316
2317         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2318         not always return, just like we're doing in Using.Resolve().
2319
2320 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2321
2322         * cs-parser.jay (fixed_statement): flag this as Pinned.
2323
2324 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2325
2326         * typemanager.cs (TypeManager): Removed MakePinned method, this
2327         mechanism is replaced with the .NET 2.x compatible mechanism of
2328         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2329
2330         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2331         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2332         `IsFixed' property which has a different meaning.
2333
2334 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2335
2336         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2337         visible from inside a nested class, not just the names of the
2338         immediately enclosing class.
2339         Fix for bug #60730.
2340
2341 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2342
2343         * expression.cs (BetterConversion): Remove buggy special-case
2344         handling of "implicit constant expression conversions".  At this
2345         point, we already know that the conversion is possible -- we're
2346         only checking to see which is better.
2347
2348 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2349
2350         * cs-parser.jay: Added error CS0210 test.
2351
2352 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2353
2354         * cs-parser.jay: Added error CS0134 test.
2355
2356 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2357
2358         Fix bug #52507
2359         * cs-parser.jay: Added error CS0145 test.
2360
2361 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2362
2363         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2364
2365 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2366         
2367         * expression.cs (StackAlloc.Resolve): The argument may not
2368         be a constant; deal with this case.
2369         
2370 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2371
2372         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2373         GetIndexerAttributeValue.
2374         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2375
2376         * class.cs (Indexer.Define): Added error tests for CS0415,
2377         CS0609.
2378
2379 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2380
2381         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2382         property code.
2383
2384 2004-06-23  Martin Baulig  <martin@ximian.com>
2385
2386         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2387         neither return nor throw, reset the barrier as well.  Fixes #60457.
2388
2389 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2390
2391         * class.cs : EventAttributes is now set to None by default.
2392           This fixes bug #60459.
2393
2394 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2395
2396         Fix bug #60219
2397         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2398         Don't throw exception but return null (it's sufficient now).
2399
2400 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2401
2402         * typemanager.cs (GetArgumentTypes): Faster implementation.
2403
2404 2004-06-18  Martin Baulig  <martin@ximian.com>
2405
2406         * attribute.cs (Attribute.Resolve): Check whether we're an
2407         EmptyCast which a Constant child.  Fixes #60333.
2408
2409 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2410
2411         * statement.cs (EmitCollectionForeach): Account for the fact that
2412         not all valuetypes are in areas which we can take the address of.
2413         For these variables, we store to a temporary variable. Also, make
2414         sure that we dont emit a `callvirt' on a valuetype method.
2415
2416 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2417
2418         * expression.cs (StackAlloc.DoReSolve): Added test for
2419         negative parameter (CS0247).
2420
2421 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2422
2423         Fix bug #59792
2424         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2425
2426 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2427
2428         Fix bug #59781
2429         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2430         ulong.
2431
2432 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2433
2434         Fix bug #58254 & cs1555.cs, cs1556.cs
2435         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2436
2437 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2438
2439         * cs-parser.jay: Added error CS1669 test for indexers.
2440
2441 2004-06-11  Martin Baulig  <martin@ximian.com>
2442
2443         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2444         call this twice: for params and varargs methods.
2445
2446 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2447
2448         * class.cs:
2449         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2450
2451 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2452
2453         * attribute.cs (Attribute.GetValidTargets): Made public.
2454
2455         * class.cs: 
2456         (AbstractPropertyEventMethod): New class for better code sharing.
2457         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2458         CS1667 report.
2459         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2460
2461 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2462
2463         Fix bug #59477.
2464         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2465         that the call to Resolve is part of a MemberAccess.
2466         (Expression.Resolve): Use it for SimpleName resolution.
2467         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2468         Add 'intermediate' boolean argument.
2469         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2470         error message when the SimpleName can be resolved ambiguously
2471         between an expression and a type.
2472         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2473         public.
2474         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2475         call on the left-side.
2476
2477 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2478
2479         * class.cs:
2480         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2481
2482 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2483
2484         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2485
2486 2004-06-11  Martin Baulig  <martin@ximian.com>
2487
2488         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2489         varargs methods if applicable.
2490
2491 2004-06-11  Martin Baulig  <martin@ximian.com>
2492
2493         * expression.cs (Invocation.EmitCall): Don't use
2494         `method.CallingConvention == CallingConventions.VarArgs' since the
2495         method could also have `CallingConventions.HasThis'.
2496
2497 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2498
2499         * class.cs (Event.GetSignatureForError): Implemented.
2500         Fixed crash in error test cs3010.cs
2501
2502 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2503
2504         * cs-tokenizer.cs: Change the way we track __arglist to be
2505         consistent with the other keywords.
2506
2507 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2508
2509         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2510         tomorrow.
2511
2512 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2513
2514         * codegen.cs: Check that all referenced assemblies have a strongname
2515         before strongnaming the compiled assembly. If not report error CS1577.
2516         Fix bug #56563. Patch by Jackson Harper.
2517         * typemanager.cs: Added a method to return all referenced assemblies.
2518         Fix bug #56563. Patch by Jackson Harper.
2519
2520 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2521
2522         * class.cs:
2523         (Method.ApplyAttributeBuilder): Moved and added conditional
2524         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2525
2526         * delegate.cs:
2527         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2528
2529 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2530
2531         Fixed #59640
2532         * class.cs: (EventField.attribute_targets): Changed default target.
2533
2534 2004-06-08  Martin Baulig  <martin@ximian.com>
2535
2536         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2537
2538 2004-06-08  Martin Baulig  <martin@ximian.com>
2539
2540         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2541
2542 2004-06-07  Martin Baulig  <martin@ximian.com>
2543
2544         Added support for varargs methods.
2545
2546         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2547         keyword.
2548
2549         * cs-parser.jay: Added support for `__arglist'.
2550
2551         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2552
2553         * expression.cs (Argument.AType): Added `ArgList'.
2554         (Invocation): Added support for varargs methods.
2555         (ArglistAccess): New public class.
2556         (Arglist): New public class.
2557
2558         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2559
2560         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2561         a method's top-level block if the method has varargs.
2562
2563         * support.cs (ReflectionParameters, InternalParameters): Added
2564         support for varargs methods.    
2565
2566 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2567
2568         * class.cs: Provide location in indexer error report.
2569
2570         * driver.cs: Use standard names.
2571
2572         * namespace.cs: Catch the use of using after a namespace has been
2573         declared also on using aliases.
2574
2575 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2576
2577         Bug #50820.
2578         * typemanager.cs (closure_private_ok, closure_invocation_type)
2579         (closure_qualifier_type, closure_invocation_assembly)
2580         (FilterWithClosure): Move to ...
2581         (Closure): New internal nested class.
2582         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2583         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2584         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2585         (MemberLookup, MemberLookupFailed): Use it.
2586         * expression.cs (New.DoResolve): Treat the lookup for the
2587         constructor as being qualified by the 'new'ed type.
2588         (Indexers.GetIndexersForTypeOrInterface): Update.
2589
2590 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2591
2592         * attribute.cs
2593         (GetConditionalAttributeValue): New method. Returns
2594         condition of ConditionalAttribute.
2595         (SearchMulti): New method.  Returns all attributes of type 't'.
2596         Use it when attribute is AllowMultiple = true.
2597         (IsConditionalMethodExcluded): New method.
2598
2599         * class.cs
2600         (Method.IsExcluded): Implemented. Returns true if method has conditional
2601         attribute and the conditions is not defined (method is excluded).
2602         (IMethodData): Extended interface for ConditionalAttribute support.
2603         (PropertyMethod.IsExcluded): Implemented.
2604
2605         * decl.cs
2606         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2607
2608         * expression.cs
2609         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2610         on the method.
2611
2612 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2613
2614         * expression.cs (ArrayCreationExpression): Make this just an
2615         `expression'. It can't be a statement, so the code here was
2616         dead.
2617
2618 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2619
2620         Fixed #59072
2621         * typemanager.cs (GetFullNameSignature): New method for
2622         MethodBase types.
2623
2624 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2625
2626         Fixed #56452
2627         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2628         Use this method when MethodBuilder is null.
2629         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2630         Added test for error CS0626 (MONO reports error for this situation).
2631         (IMethodData.GetSignatureForError): Extended interface.
2632
2633 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2634
2635         * attribute.cs
2636         (AttributeTester.GetObsoleteAttribute): Returns instance of
2637         ObsoleteAttribute when type is obsolete.
2638
2639         * class.cs
2640         (TypeContainer.VerifyObsoleteAttribute): Override.
2641         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2642         (MethodCode.VerifyObsoleteAttribute): Override.
2643         (MemberBase.VerifyObsoleteAttribute): Override.
2644
2645         * decl.cs
2646         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2647         and report proper error.
2648
2649         *delegate.cs
2650         Delegate.VerifyObsoleteAttribute): Override.
2651
2652         * ecore.cs
2653         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2654         and report proper error.
2655         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2656
2657         * enum.cs
2658         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2659         and enum member.
2660
2661         * expression.cs
2662         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2663         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2664         Added test for ObsoleteAttribute.
2665
2666         * statement.cs
2667         (Catch): Derived from Statement.
2668
2669 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2670  
2671         Fixed bug #59071 & cs0160.cs
2672  
2673         * statement.cs (Try.Resolve): Check here whether order of catch
2674         clauses matches their dependencies.
2675
2676 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2677
2678         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2679         caused a regression: #59343.  Referencing nested classes from an
2680         assembly stopped working.
2681
2682 2004-05-31  Martin Baulig  <martin@ximian.com>
2683
2684         MCS is now frozen for beta 2.
2685
2686 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2687
2688         * convert.cs: add a trivial cache for overload operator resolution.
2689
2690 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2691
2692         * decl.cs: If possible, use lookuptypedirect here. We can only do
2693         this if there is no `.' after the namespace. Avoids using
2694         LookupType, which does lots of slow processing.
2695         (FindNestedType) New method, does what it says :-).
2696         * namespace.cs: use LookupTypeDirect.
2697         * rootcontext.cs: use membercache, if possible.
2698         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2699
2700 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2701
2702         * expression.cs:
2703         According to the spec, 
2704
2705         In a member access of the form E.I, if E is a single identifier,
2706         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2707         field, property, localvariable, or parameter with the same type as
2708         the meaning of E as a type-name (§3.8), then both possible
2709         meanings of E are permitted.
2710
2711         We did not check that E as a simple-name had the same type as E as
2712         a type name.
2713
2714         This trivial check gives us 5-7% on bootstrap time.
2715
2716 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2717
2718         * expression.cs (Invocation.OverloadResolve): Avoid the
2719         use of hashtables and boxing here by allocating on demand.
2720
2721 2004-05-30  Martin Baulig  <martin@ximian.com>
2722
2723         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2724         we're doing a silent lookup.  Don't try to lookup nested types in
2725         TypeManager.object_type (thanks to Ben Maurer).
2726
2727 2004-05-30  Martin Baulig  <martin@ximian.com>
2728
2729         Committing a patch from Ben Maurer.
2730
2731         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2732
2733 2004-05-29  Martin Baulig  <martin@ximian.com>
2734
2735         * class.cs (IMethodData.ShouldIgnore): New method.
2736
2737         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2738         `Location' argument, we don't need it anywhere.  Use
2739         `IMethodData.ShouldIgnore ()' instead of
2740         `MethodData.GetMethodFlags ()'.
2741         (TypeManager.AddMethod): Removed.
2742         (TypeManager.AddMethod2): Renamed to AddMethod.
2743
2744 2004-05-29  Martin Baulig  <martin@ximian.com>
2745
2746         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2747
2748         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2749         converting from a class type S to an interface type and we already
2750         have an object on the stack, don't box it again.  Fixes #52578.
2751
2752 2004-05-29  Martin Baulig  <martin@ximian.com>
2753
2754         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2755         Added support for `params' parameters.  Fixes #59267.
2756
2757 2004-05-29  Martin Baulig  <martin@ximian.com>
2758
2759         * literal.cs (NullPointer): Provide a private .ctor which sets
2760         `type' to TypeManager.object_type.  Fixes #59048.
2761
2762 2004-05-29  Martin Baulig  <martin@ximian.com>
2763
2764         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2765         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2766
2767         * ecore.cs (EventExpr.instance_expr): Make the field private.
2768
2769 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2770
2771         Fixed bug #50080 & cs0214-2.cs
2772         * expression.cs (Cast.DoResolve): Check unsafe context here.
2773         
2774         * statement.cs (Resolve.DoResolve): Likewise.
2775
2776 2004-05-26  Martin Baulig  <martin@ximian.com>
2777
2778         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2779
2780         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2781         (RootContext.LookupType): Pass down the `silent' flag.
2782
2783 2004-05-25  Martin Baulig  <martin@ximian.com>
2784
2785         * expression.cs
2786         (MethodGroupExpr.IdenticalTypeName): New public property.
2787         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2788         expression actually refers to a type.
2789
2790 2004-05-25  Martin Baulig  <martin@ximian.com>
2791
2792         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2793         for #56176 and made it actually work.
2794
2795 2004-05-25  Martin Baulig  <martin@ximian.com>
2796
2797         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2798         (FieldExpr, PropertyExpr): Override and implement
2799         CacheTemporaries.  Fixes #52279.
2800
2801 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2802
2803         * location.cs: In the new compiler listing a file twice is a
2804         warning, not an error.
2805
2806 2004-05-24  Martin Baulig  <martin@ximian.com>
2807
2808         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2809         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2810
2811 2004-05-24  Martin Baulig  <martin@ximian.com>
2812
2813         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2814         walking the `using' list.  Fixes #53921.
2815
2816 2004-05-24  Martin Baulig  <martin@ximian.com>
2817
2818         * const.cs (Const.LookupConstantValue): Added support for
2819         EmptyCast's; fixes #55251.
2820
2821 2004-05-24  Martin Baulig  <martin@ximian.com>
2822
2823         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2824         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2825         which does the CS0135 check.  The reason is that we first need to
2826         check whether the variable actually exists.
2827
2828 2004-05-24  Martin Baulig  <martin@ximian.com>
2829
2830         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2831         than RootContext.LookupType() to find the explicit interface
2832         type.  Fixes #58584.
2833
2834 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2835
2836         * Makefile: Simplify.  Use executable.make.
2837         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2838
2839 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2840
2841         * decl.cs:
2842         * enum.cs:
2843         Use the invariant culture when doing String.Compare for CLS case
2844         sensitivity.
2845         
2846 2004-05-23  Martin Baulig  <martin@ximian.com>
2847
2848         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2849         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2850
2851         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2852         
2853 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2854
2855         * class.cs (MemberBase.Define): Reuse MemberType member for 
2856         resolved type. Other methods can use it too.
2857
2858 2004-05-23  Martin Baulig  <martin@ximian.com>
2859
2860         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2861         the variable also exists in the current block (otherwise, we need
2862         to report a CS0103).  Fixes #58670.
2863
2864 2004-05-23  Martin Baulig  <martin@ximian.com>
2865
2866         * flowanalysis.cs (Reachability.Reachable): Compute this
2867         on-the-fly rather than storing it as a field.
2868
2869 2004-05-23  Martin Baulig  <martin@ximian.com>
2870
2871         * flowanalysis.cs (Reachability.And): Manually compute the
2872         resulting `barrier' from the reachability.      
2873        
2874 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2875
2876         Fix bug #57835
2877         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2878         instance of ObsoleteAttribute when symbol is obsolete.
2879
2880         * class.cs
2881         (IMethodData): Extended interface for ObsoleteAttribute support.
2882
2883 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2884
2885         * attribute.cs: Fix bug #55970
2886
2887 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2888
2889         Fix bug #52705
2890         * attribute.cs
2891         (GetObsoleteAttribute): New method. Creates the instance of
2892         ObsoleteAttribute.
2893         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2894         ObsoleteAttribute when member is obsolete.
2895         (AttributeTester.Report_ObsoleteMessage): Common method for
2896         Obsolete error/warning reporting.
2897
2898         * class.cs
2899         (TypeContainer.base_classs_type): New member for storing parent type.
2900
2901         * decl.cs
2902         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2903         for this MemberCore.
2904
2905 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2906
2907         * attribute.cs, const.cs: Fix bug #58590
2908
2909 2004-05-21  Martin Baulig  <martin@ximian.com>
2910
2911         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2912         out parameters if the end of the method is unreachable.  Fixes
2913         #58098. 
2914
2915 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2916
2917         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2918         Hari was right, why extra method.
2919
2920 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2921
2922         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2923
2924 2004-05-20  Martin Baulig  <martin@ximian.com>
2925
2926         Merged this back from gmcs to keep the differences to a minumum.
2927
2928         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
2929         instead of a Declspace.
2930         (Attribute.ResolveType): Likewise.
2931         (Attributes.Search): Likewise.
2932         (Attributes.Contains): Likewise.
2933         (Attributes.GetClsCompliantAttribute): Likewise.
2934
2935         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
2936         argument.
2937         (MethodData.ApplyAttributes): Take an EmitContext instead of a
2938         DeclSpace.
2939
2940 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2941
2942         Fix bug #58688 (MCS does not report error when the same attribute
2943         is assigned twice)
2944
2945         * attribute.cs (Attribute.Emit): Distinction between null and default.
2946
2947 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2948
2949         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2950         of a top-level attribute without an attribute target.
2951         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2952         Make non-static.
2953         (Attribute.Conditional_GetConditionName), 
2954         (Attribute.Obsolete_GetObsoleteMessage): Update.
2955         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2956         part of ScanForIndexerName.
2957         (Attribute.CanIgnoreInvalidAttribute): New function.
2958         (Attribute.ScanForIndexerName): Move to ...
2959         (Attributes.ScanForIndexerName): ... here.
2960         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2961         (Attributes.Search): New internal variant that can choose not to
2962         complain if types aren't resolved.  The original signature now
2963         complains.
2964         (Attributes.GetClsCompliantAttribute): Use internal variant, with
2965         complaints suppressed.
2966         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2967         only if it not useful.
2968         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2969         top-level for attributes that are shared between the assembly
2970         and a top-level class.
2971         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2972         * class.cs: Update to reflect changes.
2973         (DefineIndexers): Fuse loops.
2974         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2975         a couple more variants of attribute names.
2976
2977 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2978
2979         Fix bug #52585 (Implemented explicit attribute declaration)
2980
2981         * attribute.cs:
2982         (Attributable.ValidAttributeTargets): New abstract method. It gets
2983         list of valid attribute targets for explicit target declaration.
2984         (Attribute.Target): It holds target itself.
2985         (AttributeSection): Removed.
2986         (Attribute.CheckTargets): New method. It checks whether attribute
2987         target is valid for the current element.
2988
2989         * class.cs:
2990         (EventProperty): New class. For events that are declared like
2991         property (with add and remove accessors).
2992         (EventField): New class. For events that are declared like field.
2993         class.cs
2994
2995         * cs-parser.jay: Implemented explicit attribute target declaration.
2996
2997         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2998         Override ValidAttributeTargets.
2999
3000         * parameter.cs:
3001         (ReturnParameter): Class for applying custom attributes on 
3002         the return type.
3003         (ParameterAtribute): New class. Class for applying custom
3004         attributes on the parameter type.
3005
3006 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3007
3008         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3009         definitions. 
3010
3011         (Method): Allow UNSAFE here.
3012
3013         * modifiers.cs: Support unsafe reporting.
3014
3015 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3016
3017         * decl.cs: Fix bug #58478.
3018
3019 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3020
3021         * statement.cs: When checking for unreachable code on an EmptyStatement,
3022         set the location. Fixes bug #58488.
3023
3024 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3025
3026         * driver.cs: Add -pkg handling.
3027
3028         From Gonzalo: UseShelLExecute=false
3029
3030 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3031
3032         * attribute.cs:
3033         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3034         for attribute.
3035         (Attribute.IsClsCompliaceRequired): Moved to base for better
3036         accesibility.
3037         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3038         when attribute is AttributeUsageAttribute.
3039         (Attribute.GetValidTargets): Simplified.
3040         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3041         attribute for this type.
3042         (Attribute.ApplyAttributes): Method renamed to Emit and make
3043         non-static.
3044         (GlobalAttributeSection): New class for special handling of global
3045         attributes (assembly, module).
3046         (AttributeSection.Emit): New method.
3047
3048         * class.cs: Implemented Attributable abstract methods.
3049         (MethodCore.LabelParameters): Moved to Parameter class.
3050         (Accessor): Is back simple class.
3051         (PropertyMethod): Implemented Attributable abstract class.
3052         (DelegateMethod): Implemented Attributable abstract class.
3053         (Event): New constructor for disctintion between normal Event
3054         and Event with accessors.
3055
3056         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3057
3058         * codegen.cs, const.cs, decl.cs, delegate.cs:
3059         (CommonAssemblyModulClass): Implemented Attributable abstract class
3060         and simplified.
3061
3062         * enum.cs: Implement IAttributeSupport interface.
3063         (EnumMember): New class for emum members. Implemented Attributable
3064         abstract class
3065
3066         * parameter.cs:
3067         (ParameterBase): Is abstract.
3068         (ReturnParameter): New class for easier [return:] attribute handling.
3069
3070         * typemanager.cs: Removed builder_to_attr.
3071
3072 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3073
3074         Fix bug #57151.
3075         * attribute.cs (Attribute.GetPositionalValue): New function.
3076         * class.cs (TypeContainer.VerifyMembers): New function.
3077         (TypeContainer.Emit): Use it.
3078         (ClassOrStruct): New base class for Class and Struct.
3079         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3080         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3081         class.
3082         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3083         then each non-static field should have a FieldOffset attribute.
3084         Otherwise, none of the fields should have a FieldOffset attribute.
3085         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3086         and FieldOffset attributes.
3087         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3088         (TypeManager.field_offset_attribute_type): New core types.
3089         (TypeManager.InitCoreTypes): Initialize them.
3090
3091 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3092
3093         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3094         Return correct type.
3095         From bug #58270.
3096
3097 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3098
3099         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3100         be implicitly converted to ulong.
3101         
3102         * expression.cs: The logic for allowing operator &, | and ^ worked
3103         was wrong, it worked before because we did not report an error in
3104         an else branch.  Fixes 57895.
3105
3106         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3107         allow volatile fields to be reference types.
3108
3109 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3110
3111         * driver.cs: Add support for /debug-
3112
3113 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3114
3115         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3116         Add a 'complain' parameter to silence errors.
3117         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3118         silently overlooked type-resolutions.
3119         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3120         to reflect changes.
3121         (Attributes.Search): New function.
3122         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3123         (Attributes.GetAttributeFullName): Remove hack.
3124         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3125         Update to reflect changes.
3126         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3127         Use Attributes.Search instead of nested loops.
3128
3129 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3130
3131         * decl.cs:
3132         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3133         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3134         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3135
3136         * report.cs: (Report.Warning): Renamed to Warning_T because of
3137         parameter collision.
3138
3139 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3140
3141         * expression.cs (MemberAccess.ResolveMemberAccess):
3142         Exit with non-zero status after Report.Error.
3143         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3144         Likewise.
3145         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3146
3147 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3148
3149         * support.cs: Don't hang when the file is empty.
3150
3151 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3152
3153         * support.cs: In SeekableStreamReader, compute the preamble size of the
3154           underlying stream. Position changes should take into account that initial
3155           count of bytes.
3156
3157 2004-05-03  Todd Berman  <tberman@sevenl.net>
3158
3159         * driver.cs: remove unused GetSysVersion function.
3160
3161 2004-05-03  Todd Berman  <tberman@sevenl.net>
3162
3163         * driver.cs: Remove the hack from saturday, as well as the hack
3164         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3165         link_paths to get that bit proper.
3166
3167 2004-05-01  Todd Berman  <tberman@sevenl.net>
3168
3169         * driver.cs: Try a LoadFrom before a Load, this checks the current
3170         path. This is currently a bug in mono that is be fixed, however, this
3171         provides a workaround for now. This will be removed when the bug
3172         is fixed.
3173
3174 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3175
3176         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3177         incomplete key pairs (#57941).
3178
3179 2004-05-01  Todd Berman  <tberman@sevenl.net>
3180
3181         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3182         from the GAC
3183
3184 2004-04-30  Jackson Harper  <jackson@ximian.com>
3185
3186         * codegen.cs: Open keys readonly.
3187         
3188 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3189
3190         * typemanager.cs: don't report cyclic struct layout when a struct
3191         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3192         which has 2 Pango.Rectangle fields.
3193
3194 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3195
3196         * expression.cs: Handle IntPtr comparisons with IL code
3197         rather than a method call.
3198
3199 2004-04-29  Martin Baulig  <martin@ximian.com>
3200
3201         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3202         the list of PropertyInfo's in class hierarchy and find the
3203         accessor.  Fixes #56013.
3204
3205 2004-04-29  Martin Baulig  <martin@ximian.com>
3206
3207         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3208
3209 2004-04-29  Martin Baulig  <martin@ximian.com>
3210
3211         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3212
3213         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3214
3215 2004-04-29  Martin Baulig  <martin@ximian.com>
3216
3217         * class.cs (ConstructorInitializer.Resolve): Check whether the
3218         parent .ctor is accessible.  Fixes #52146.
3219
3220 2004-04-29  Martin Baulig  <martin@ximian.com>
3221
3222         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3223
3224         * statement.cs (Using.EmitLocalVariableDecls): Use
3225         TypeManager.idisposable_type, not typeof (IDisposable).
3226         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3227
3228 2004-04-29  Martin Baulig  <martin@ximian.com>
3229
3230         * class.cs (Event.Define): Don't emit the field and don't set
3231         RTSpecialName and SpecialName for events on interfaces.  Fixes
3232         #57703. 
3233
3234 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3235
3236         Refactor Attribute.ApplyAttributes.
3237         * attribute.cs (Attributable): New base class for objects that can
3238         have Attributes applied on them.
3239         (Attribute): Make AttributeUsage fields public.
3240         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3241         (Attribute.IsInternalCall): New property.
3242         (Attribute.UsageAttr): Convert to a public read-only property.
3243         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3244         (Attribute.ResolveType, Attribute.Resolve)
3245         (Attribute.ScanForIndexerName): Update to reflect changes.
3246         (Attribute.CheckAttributeTarget): Re-format.
3247         (Attribute.ApplyAttributes): Refactor, to various
3248         Attributable.ApplyAttributeBuilder methods.
3249         * decl.cs (MemberCore): Make Attributable.
3250         * class.cs (Accessor): Make Attributable.
3251         (MethodData.ApplyAttributes): Use proper attribute types, not
3252         attribute names.
3253         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3254         (TypeContainer.ApplyAttributeBuilder)
3255         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3256         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3257         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3258         (Operator.ApplyAttributeBuilder): New factored-out methods.
3259         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3260         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3261         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3262         * parameter.cs (ParameterBase): New Attributable base class
3263         that can also represent Return types.
3264         (Parameter): Update to the changes.
3265
3266 2004-04-29  Jackson Harper  <jackson@ximian.com>
3267
3268         * driver.cs: Prefer the corlib system version when looking for
3269         assemblies in the GAC. This is still a hack, but its a better hack
3270         now.
3271         
3272 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3273
3274         * decl.cs, enum.cs: Improved error 3005 reporting.
3275   
3276         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3277         (related_symbols): New private member for list of symbols
3278         related to reported error/warning.
3279         
3280         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3281
3282 2004-04-29  Martin Baulig  <martin@ximian.com>
3283
3284         * ecore.cs (Expression.Constantify): If we're an enum and
3285         TypeManager.TypeToCoreType() doesn't give us another type, use
3286         t.UnderlyingSystemType.  Fixes #56178.  
3287
3288 2004-04-29  Martin Baulig  <martin@ximian.com>
3289
3290         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3291         interfaces and for each interface, only add members directly
3292         declared in that interface.  Fixes #53255.
3293
3294 2004-04-28  Martin Baulig  <martin@ximian.com>
3295
3296         * expression.cs (ConditionalLogicalOperator): Use a temporary
3297         variable for `left' to avoid that we evaluate it more than once;
3298         bug #52588.
3299
3300 2004-04-28  Martin Baulig  <martin@ximian.com>
3301
3302         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3303         `void[]' (CS1547).
3304
3305 2004-04-28  Martin Baulig  <martin@ximian.com>
3306
3307         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3308         void (CS1547).
3309
3310         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3311         whether the type is not void (CS1547).
3312
3313 2004-04-28  Martin Baulig  <martin@ximian.com>
3314
3315         * expression.cs (Unary.DoResolveLValue): Override this and report
3316         CS0131 for anything but Operator.Indirection.
3317
3318 2004-04-28  Martin Baulig  <martin@ximian.com>
3319
3320         Committing a patch from Ben Maurer; see bug #50820.
3321
3322         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3323         check for classes.
3324
3325         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3326         classes.        
3327
3328 2004-04-28  Martin Baulig  <martin@ximian.com>
3329
3330         Committing a patch from Ben Maurer; see bug #50820.
3331
3332         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3333         check for classes.
3334
3335         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3336         classes.        
3337
3338 2004-04-28  Martin Baulig  <martin@ximian.com>
3339
3340         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3341         (Block.AddLabel): Call DoLookupLabel() to only search in the
3342         current block.
3343
3344 2004-04-28  Martin Baulig  <martin@ximian.com>
3345
3346         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3347         comparing StringConstants and NullLiterals in Equality and Inequality.
3348
3349 2004-04-28  Jackson Harper  <jackson@ximian.com>
3350
3351         * driver.cs: Attempt to load referenced assemblies from the
3352         GAC. This is the quick and dirty version of this method that
3353         doesnt take into account versions and just takes the first
3354         canidate found. Will be good enough for now as we will not have more
3355         then one version installed into the GAC until I update this method.
3356
3357 2004-04-28  Martin Baulig  <martin@ximian.com>
3358
3359         * typemanager.cs (TypeManager.CheckStructCycles): New public
3360         static method to check for cycles in the struct layout.
3361
3362         * rootcontext.cs (RootContext.PopulateTypes): Call
3363         TypeManager.CheckStructCycles() for each TypeContainer.
3364         [Note: We only need to visit each type once.]
3365
3366 2004-04-28  Martin Baulig  <martin@ximian.com>
3367
3368         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3369
3370         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3371         success and added `out object value'.  Use a `bool resolved' field
3372         to check whether we've already been called rather than
3373         `ConstantValue != null' since this breaks for NullLiterals.
3374
3375 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3376
3377         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3378         setting of this flag, since the 'set' method may be non-public.
3379
3380 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3381
3382         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3383         check on current_vector.Block.
3384
3385 2004-04-27  Martin Baulig  <martin@ximian.com>
3386
3387         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3388         a field initializer.  Fixes #56459.
3389
3390 2004-04-27  Martin Baulig  <martin@ximian.com>
3391
3392         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3393         we're not attempting to use an indexer.  Fixes #52154.
3394
3395 2004-04-27  Martin Baulig  <martin@ximian.com>
3396
3397         * statement.cs (Return): Don't create a return label if we don't
3398         need it; reverts my change from January 20th.  Thanks to Ben
3399         Maurer for this.
3400
3401 2004-04-27  Martin Baulig  <martin@ximian.com>
3402
3403         According to the spec, `goto' can only leave a nested scope, but
3404         never enter it.
3405
3406         * statement.cs (Block.LookupLabel): Only lookup in the current
3407         block, don't recurse into parent or child blocks.
3408         (Block.AddLabel): Check in parent and child blocks, report
3409         CS0140/CS0158 if we find a duplicate.
3410         (Block): Removed this indexer for label lookups.
3411         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3412         this already does the error reporting for us.
3413
3414         * flowanalysis.cs
3415         (FlowBranching.UsageVector.Block): New public variable; may be null.
3416         (FlowBranching.CreateSibling): Added `Block' argument.
3417         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3418         label for the target of a `goto' and check whether we're not
3419         leaving a `finally'.
3420
3421 2004-04-27  Martin Baulig  <martin@ximian.com>
3422
3423         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3424         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3425         just for returns).
3426
3427 2004-04-27  Martin Baulig  <martin@ximian.com>
3428
3429         * statement.cs (Block.AddLabel): Also check for implicit blocks
3430         and added a CS0158 check.
3431
3432 2004-04-27  Martin Baulig  <martin@ximian.com>
3433
3434         * flowanalysis.cs (FlowBranchingLoop): New class.
3435         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3436         UsageVector's instead of an ArrayList.
3437         (FlowBranching.Label): Likewise.
3438         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3439         (FlowBranching.AddBreakVector): New method.
3440
3441 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3442
3443         * attribute.cs: Small regression fix: only convert the type if we
3444         the type is different, fixes System.Drawing build.
3445
3446 2004-04-27  Martin Baulig  <martin@ximian.com>
3447
3448         * attribute.cs (Attribute.Resolve): If we have a constant value
3449         for a named field or property, implicity convert it to the correct
3450         type.
3451
3452 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3453
3454         * statement.cs (Block.Block): Implicit blocks share
3455         'child_variable_names' fields with parent blocks.
3456         (Block.AddChildVariableNames): Remove.
3457         (Block.AddVariable): Mark variable as "used by a child block" in
3458         every surrounding block.
3459         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3460         been used in a child block, complain about violation of "Invariant
3461         meaning in blocks" rule.
3462         * cs-parser.jay (declare_local_variables): Don't use
3463         AddChildVariableNames.
3464         (foreach_statement): Don't create an implicit block: 'foreach'
3465         introduces a scope.
3466
3467 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3468
3469         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3470         converting from 0L to ulong.  Fixes 57522.
3471
3472 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3473
3474         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3475         derived class hides via 'new' keyword field from base class (test-242.cs).
3476         TODO: Handle this in the more general way.
3477         
3478         * class.cs (CheckBase): Ditto.
3479
3480 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3481
3482         * decl.cs (caching_flags): New member for storing cached values
3483         as bit flags.
3484         (MemberCore.Flags): New enum where bit flags for caching_flags
3485         are defined.
3486         (MemberCore.cls_compliance): Moved to caching_flags.
3487         (DeclSpace.Created): Moved to caching_flags.
3488
3489         * class.cs: Use caching_flags instead of DeclSpace.Created
3490         
3491 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3492
3493         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3494         if we are only a derived class, not a nested class.
3495
3496         * typemanager.cs: Same as above, but do this at the MemberLookup
3497         level (used by field and methods, properties are handled in
3498         PropertyExpr).   Allow for the qualified access if we are a nested
3499         method. 
3500
3501 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3502
3503         * class.cs: Refactoring.
3504         (IMethodData): New inteface; Holds links to parent members
3505         to avoid member duplication (reduced memory allocation).
3506         (Method): Implemented IMethodData interface.
3507         (PropertyBase): New inner classes for get/set methods.
3508         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3509         (Event): New inner classes for add/remove methods.
3510         (Event.DelegateMethod): Implemented IMethodData interface.
3511
3512         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3513         EmitContext (related to class.cs refactoring).
3514
3515 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3516
3517         * delegate.cs (Delegate.VerifyApplicability): If the number of
3518         arguments are the same as the number of parameters, first try to
3519         verify applicability ignoring  any 'params' modifier on the last
3520         parameter.
3521         Fixes #56442.
3522
3523 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3524
3525         * class.cs (TypeContainer.AddIndexer): Use
3526         'ExplicitInterfaceName' to determine if interface name was
3527         explicitly specified.  'InterfaceType' is not initialized at this time.
3528         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3529         Indexers array is already in the required order.  Initialize
3530         'IndexerName' only if there are normal indexers.
3531         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3532         (TypeContainer.Emit): Emit DefaultMember attribute only if
3533         IndexerName is initialized.
3534         Fixes #56300.
3535
3536 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3537
3538         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3539         Fixes #57007
3540
3541 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3542
3543         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3544         attributes.
3545         Fix for #56456.
3546
3547         * attribute.cs (Attribute.Resolve): Check for duplicate named
3548         attributes.
3549         Fix for #56463.
3550
3551 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3552
3553         * iterators.cs (MarkYield): track whether we are in an exception,
3554         and generate code accordingly.  Use a temporary value to store the
3555         result for our state.
3556
3557         I had ignored a bit the interaction of try/catch with iterators
3558         since their behavior was not entirely obvious, but now it is
3559         possible to verify that our behavior is the same as MS .NET 2.0
3560
3561         Fixes 54814
3562
3563 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3564
3565         * iterators.cs: Avoid creating temporaries if there is no work to
3566         do. 
3567
3568         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3569         Enumerations, use TypeManager.EnumToUnderlying and call
3570         recursively. 
3571
3572         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3573         bug #57013
3574
3575         (This.Emit): Use EmitContext.EmitThis to emit our
3576         instance variable.
3577
3578         (This.EmitAssign): Ditto.
3579
3580         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3581         codepaths, we will move all the functionality into
3582         Mono.CSharp.This 
3583
3584         (FieldExpr.EmitAssign): Ditto.
3585
3586         This fixes several hidden bugs that I uncovered while doing a code
3587         review of this today.
3588
3589         * codegen.cs (EmitThis): reworked so the semantics are more clear
3590         and also support value types "this" instances.
3591
3592         * iterators.cs: Changed so that for iterators in value types, we
3593         do not pass the value type as a parameter.  
3594
3595         Initialization of the enumerator helpers is now done in the caller
3596         instead of passing the parameters to the constructors and having
3597         the constructor set the fields.
3598
3599         The fields have now `assembly' visibility instead of private.
3600
3601 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3602
3603         * expression.cs (Argument.Resolve): Check if fields passed as ref
3604         or out are contained in a MarshalByRefObject.
3605
3606         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3607         another compiler type.
3608
3609 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3610
3611         * class.cs (Indexer.Define): use the new name checking method.
3612         Also, return false on an error.
3613         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3614         (is_identifier_[start/part]_character): make static.
3615
3616 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3617
3618         * expression.cs (Binary.ResolveOperator): Do no append strings
3619         twice: since we can be invoked more than once (array evaluation)
3620         on the same concatenation, take care of this here.  Based on a fix
3621         from Ben (bug #56454)
3622
3623 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3624
3625         * codegen.cs: Fix another case where CS1548 must be reported (when 
3626         delay-sign isn't specified and no private is available #56564). Fix
3627         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3628         error when MCS is used on the MS runtime and we need to delay-sign 
3629         (which seems unsupported by AssemblyBuilder - see #56621).
3630
3631 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3632
3633         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3634         (TypeManager.ComputeNamespaces): Faster implementation for
3635         Microsoft runtime.
3636
3637         * compiler.csproj: Updated AssemblyName to mcs.
3638
3639 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3640
3641         * rootcontext.cs: Add new types to the boot resolution.
3642
3643         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3644         MulticastDelegate is not allowed.
3645
3646         * typemanager.cs: Add new types to lookup: System.TypedReference
3647         and ArgIterator.
3648
3649         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3650         check for TypedReference or ArgIterator, they are not allowed. 
3651
3652         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3653         makes us properly catch 1510 in some conditions (see bug 56016 for
3654         details). 
3655
3656 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3657
3658         * CryptoConvert.cs: update from corlib version
3659         with endian fixes.
3660
3661 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3662
3663         * class.cs (Indexer.Define): Check indexername declaration
3664
3665 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3666
3667         * attribute.cs (IsClsCompliant): Fixed problem with handling
3668         all three states (compliant, not-compliant, undetected).
3669
3670 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3671
3672         * attribute.cs (Attribute): Location is now public.
3673         (Resolve): Store resolved arguments (pos_values) in attribute class.
3674         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3675         (GetClsCompliantAttributeValue): New method that gets
3676         CLSCompliantAttribute value.
3677         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3678         if exists else null.
3679         (AttributeTester): New class for CLS-Compliant verification routines.
3680
3681         * class.cs (Emit): Add CLS-Compliant verification.
3682         (Method.GetSignatureForError): Implemented.
3683         (Constructor.GetSignatureForError): Implemented
3684         (Constructor.HasCompliantArgs): Returns if constructor has
3685         CLS-Compliant arguments.
3686         (Constructor.Emit): Override.
3687         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3688         is needed to test only parameters.
3689         (FieldBase.GetSignatureForError): Implemented.
3690         (TypeContainer): New member for storing base interfaces.
3691         (TypeContainer.FindMembers): Search in base interfaces too.
3692
3693         * codegen.cs (GetClsComplianceAttribute): New method that gets
3694         assembly or module CLSCompliantAttribute value.
3695         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3696         for assembly.
3697         (ModuleClass.Emit): Add error 3012 test.
3698
3699         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3700
3701         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3702         state for all decl types.
3703         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3704         if CLS-Compliant tests are required.
3705         (IsClsCompliaceRequired): New method. Analyze whether code
3706         must be CLS-Compliant.
3707         (IsExposedFromAssembly): New method. Returns true when MemberCore
3708         is exposed from assembly.
3709         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3710         value or gets cached value.
3711         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3712         is explicitly marked with CLSCompliantAttribute.
3713         (IsIdentifierClsCompliant): New abstract method. This method is
3714         used to testing error 3005.
3715         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3716         for identifier and parameters CLS-Compliant testing.
3717         (VerifyClsCompliance): New method. The main virtual method for
3718         CLS-Compliant verifications.
3719         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3720         null. I don't know why is null (too many public members !).
3721         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3722         and get value of first CLSCompliantAttribute that found.
3723
3724         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3725         (VerifyClsCompliance): Override and add extra tests.
3726
3727         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3728         clscheck- disable CLS-Compliant verification event if assembly is has
3729         CLSCompliantAttribute(true).
3730
3731         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3732         ApllyAttribute is now called in emit section as in the other cases.
3733         Possible future Emit integration.
3734         (IsIdentifierClsCompliant): New override.
3735         (VerifyClsCompliance): New override.
3736         (GetEnumeratorName): Returns full enum name.
3737
3738         * parameter.cs (GetSignatureForError): Implemented.
3739
3740         * report.cs (WarningData): New struct for Warning message information.
3741         (LocationOfPreviousError): New method.
3742         (Warning): New method. Reports warning based on the warning table.
3743         (Error_T): New method. Reports error based on the error table.
3744
3745         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3746         verifications are done here.
3747
3748         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3749
3750         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3751         CLSCompliantAttribute.
3752         (all_imported_types): New member holds all imported types from other
3753         assemblies.
3754         (LoadAllImportedTypes): New method fills static table with exported types
3755         from all referenced assemblies.
3756         (Modules): New property returns all assembly modules.
3757
3758 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3759
3760         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3761         throwing a parser error.
3762
3763         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3764         which removes the hardcoded get_/set_ prefixes for properties, as
3765         IL allows for the properties to be named something else.  
3766
3767         Bug #56013
3768
3769         * expression.cs: Do not override operand before we know if it is
3770         non-null.  Fix 56207
3771
3772 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3773
3774         * typemanager.cs: support for pinned variables.
3775
3776 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3777
3778         * decl.cs, typemanager.cs: Avoid using an arraylist
3779         as a buffer if there is only one result set.
3780
3781 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3782
3783         * expression.cs: Make sure you cant call a static method
3784         with an instance expression, bug #56174.
3785
3786 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3787
3788         * class.cs (IsDuplicateImplementation): Improve error reporting to
3789         flag 663 (method only differs in parameter modifier).
3790
3791         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3792         in preprocessor directives.
3793
3794         * location.cs (LookupFile): Allow for the empty path.
3795
3796         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3797         better approach for some of that patch, but its failing with the
3798         CharSet enumeration.  For now try/catch will do.
3799
3800         * typemanager.cs: Do not crash if a struct does not have fields.
3801         Fixes 56150.
3802
3803 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3804
3805         * expression.cs: cs0213, cant fix a fixed expression.
3806         fixes 50231.
3807
3808 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3809
3810         * cs-parser.jay: detect invalid embeded statements gracefully.
3811         bug #51113.
3812
3813 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3814
3815         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3816         As a regex:
3817         s/
3818         the invocation type may not be a subclass of the tye of the item/
3819         The type of the item must be a subclass of the invocation item.
3820         /g
3821
3822         Fixes bug #50820.
3823
3824 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3825
3826         * attribute.cs: Added methods to get a string and a bool from an
3827         attribute. Required to information from AssemblyKeyFileAttribute,
3828         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3829         * codegen.cs: Modified AssemblyName creation to include support for
3830         strongnames. Catch additional exceptions to report them as CS1548.
3831         * compiler.csproj: Updated include CryptoConvert.cs.
3832         * compiler.csproj.user: Removed file - user specific configuration.
3833         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3834         Mono.Security assembly. The original class is maintained and tested in
3835         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3836         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3837         like CSC 8.0 (C# v2) supports.
3838         * Makefile: Added CryptoConvert.cs to mcs sources.
3839         * rootcontext.cs: Added new options for strongnames.
3840
3841 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3842
3843         * driver.cs: For --expect-error, report error code `2'
3844         if the program compiled with no errors, error code `1' if
3845         it compiled with an error other than the one expected.
3846
3847 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3848
3849         * compiler.csproj: Updated for Visual Studio .NET 2003.
3850         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3851         * compiler.sln: Updated for Visual Studio .NET 2003.
3852
3853 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3854
3855         * expression.cs: Fix bug #47234. We basically need to apply the
3856         rule that we prefer the conversion of null to a reference type
3857         when faced with a conversion to 'object' (csc behaviour).
3858
3859 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3860
3861         * statement.cs: Shorter form for foreach, eliminates
3862         a local variable. r=Martin.
3863
3864 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3865
3866         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3867         checks if we can use brtrue/brfalse to test for 0.
3868         * expression.cs: use the above in the test for using brtrue/brfalse.
3869         cleanup code a bit.
3870
3871 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3872
3873         * expression.cs: Rewrite string concat stuff. Benefits:
3874
3875         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3876         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3877         rather than a concat chain.
3878
3879         * typemanager.cs: Add lookups for more concat overloads.
3880
3881 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3882
3883         * expression.cs: Emit shorter il code for array init.
3884
3885         newarr
3886         dup
3887         // set 1
3888
3889         // set 2
3890
3891         newarr
3892         stloc.x
3893
3894         ldloc.x
3895         // set 1
3896
3897         ldloc.x
3898         // set 2
3899
3900 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3901
3902         * statement.cs: Before, two switch blocks would be merged if the
3903         total size of the blocks (end_item - begin_item + 1) was less than
3904         two times the combined sizes of the blocks.
3905
3906         Now, it will only merge if after the merge at least half of the
3907         slots are filled.
3908
3909         fixes 55885.
3910
3911 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3912
3913         * class.cs : csc build fix for GetMethods(). See bug #52503.
3914
3915 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3916
3917         * expression.cs: Make sure fp comparisons work with NaN.
3918         This fixes bug #54303. Mig approved this patch a long
3919         time ago, but we were not able to test b/c the runtime
3920         had a related bug.
3921
3922 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3923
3924         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3925
3926 2004-03-19  Martin Baulig  <martin@ximian.com>
3927
3928         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3929         error here and not in our caller.
3930
3931 2004-03-19  Martin Baulig  <martin@ximian.com>
3932
3933         * interface.cs: Completely killed this file.
3934         (Interface): We're now a TypeContainer and live in class.cs.
3935
3936         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3937         argument; we're now also called for interfaces.
3938         (TypeContainer.DefineMembers): Allow this method being called
3939         multiple times.
3940         (TypeContainer.GetMethods): New public method; formerly known as
3941         Interface.GetMethod().  This is used by PendingImplementation.
3942         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3943         it's now private and non-static.
3944         (Interface): Moved this here; it's now implemented similar to
3945         Class and Struct.
3946         (Method, Property, Event, Indexer): Added `bool is_interface'
3947         argument to their .ctor's.
3948         (MemberBase.IsInterface): New public field.
3949
3950         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3951         instances instead of InterfaceMethod, InterfaceProperty, etc.
3952         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3953         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3954
3955 2004-03-19  Martin Baulig  <martin@ximian.com>
3956
3957         * class.cs (MethodCore.IsDuplicateImplementation): New private
3958         method which does the CS0111 checking.
3959         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3960         Use IsDuplicateImplementation().
3961
3962 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3963
3964         * decl.cs (FindMemberToOverride): New method to find the correct
3965         method or property to override in the base class.
3966         * class.cs
3967             - Make Method/Property use the above method to find the
3968               version in the base class.
3969             - Remove the InheritableMemberSignatureCompare as it is now
3970               dead code.
3971
3972         This patch makes large code bases much faster to compile, as it is
3973         O(n) rather than O(n^2) to do this validation.
3974
3975         Also, it fixes bug 52458 which is that nested classes are not
3976         taken into account when finding the base class member.
3977
3978         Reviewed/Approved by Martin.
3979
3980 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3981
3982         * interface.cs: In all interface classes removed redundant
3983         member initialization.
3984
3985 2004-03-16  Martin Baulig  <martin@ximian.com>
3986
3987         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3988
3989 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3990
3991         * decl.cs (DefineTypeAndParents): New helper method to define a
3992         type's containers before the type itself is defined;  This is a
3993         bug exposed by the recent changes to Windows.Forms when an
3994         implemented interface was defined inside a class that had not been
3995         built yet.   
3996
3997         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3998
3999         (Check): Loop correctly to report errors modifiers
4000         (UNSAFE was not in the loop, since it was the same as TOP).
4001
4002         * interface.cs: Every interface member now takes a ModFlags,
4003         instead of a "is_new" bool, which we set on the base MemberCore. 
4004
4005         Every place where we called "UnsafeOk" in the interface, now we
4006         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4007         the unsafe settings from the member declaration instead of the
4008         container interface. 
4009
4010         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4011
4012         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4013         `set_indexer_name' to the pending bits (one per type).
4014
4015         We fixed a bug today that was picking the wrong method to
4016         override, since for properties the existing InterfaceMethod code
4017         basically ignored the method name.  Now we make sure that the
4018         method name is one of the valid indexer names.
4019
4020 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4021  
4022         * support.cs (SeekableStreamReader): Keep track of stream byte
4023         positions and don't mix them with character offsets to the buffer.
4024
4025         Patch from Gustavo Giráldez
4026
4027 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4028
4029         * interface.cs (InterfaceSetGetBase): Removed double member
4030         initialization, base class does it as well.
4031
4032 2004-03-13  Martin Baulig  <martin@ximian.com>
4033
4034         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4035         when compiling corlib.
4036
4037 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4038
4039         * convert.cs (ExplicitConversion): We were reporting an error on
4040         certain conversions (object_type source to a value type, when the
4041         expression was `null') before we had a chance to pass it through
4042         the user defined conversions.
4043
4044         * driver.cs: Replace / and \ in resource specifications to dots.
4045         Fixes 50752
4046
4047         * class.cs: Add check for duplicate operators.  Fixes 52477
4048
4049 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4050
4051         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4052         that are in the middle of the statements, not only at the end.
4053         Fixes #54987
4054
4055         * class.cs (TypeContainer.AddField): No longer set the
4056         `HaveStaticConstructor' flag, now we call it
4057         `UserDefineStaticConstructor' to diferentiate the slightly
4058         semantic difference.
4059
4060         The situation is that we were not adding BeforeFieldInit (from
4061         Modifiers.TypeAttr) to classes that could have it.
4062         BeforeFieldInit should be set to classes that have no static
4063         constructor. 
4064
4065         See:
4066
4067         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4068
4069         And most importantly Zoltan's comment:
4070
4071         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4072
4073         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4074          before its static fields are used', i.e. initialization does not need
4075          to be triggered by the first access to the type. Setting this flag
4076          helps the JIT to compile better code, since it can run the static
4077          constructor at JIT time, and does not need to generate code to call it
4078          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4079          this flag for lots of classes like String. 
4080          
4081          csc sets this flag if the type does not have an explicit static 
4082          constructor. The reasoning seems to be that if there are only static
4083          initalizers for a type, and no static constructor, then the programmer
4084          does not care when this initialization happens, so beforefieldinit
4085          can be used.
4086          
4087          This bug prevents the AOT compiler from being usable, since it 
4088          generates so many calls to mono_runtime_class_init that the AOT code
4089          is much slower than the JITted code. The JITted code is faster, 
4090          because it does not generate these calls if the vtable is type is
4091          already initialized, which is true in the majority of cases. But the
4092          AOT compiler can't do this."
4093
4094 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4095
4096         * class.cs (MethodData.Emit): Refactor the code so symbolic
4097         information is generated for destructors;  For some reasons we
4098         were taking a code path that did not generate symbolic information
4099         before. 
4100
4101 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4102
4103         * class.cs: Create a Constructor.CheckBase method that
4104         takes care of all validation type code. The method
4105         contains some code that was moved from Define.
4106
4107         It also includes new code that checks for duplicate ctors.
4108         This fixes bug #55148.
4109
4110 2004-03-09  Joshua Tauberer <tauberer@for.net>
4111
4112         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4113         a { ... }-style array creation invokes EmitStaticInitializers
4114         which is not good for reference-type arrays.  String, decimal
4115         and now null constants (NullCast) are not counted toward
4116         static initializers.
4117
4118 2004-03-05  Martin Baulig  <martin@ximian.com>
4119
4120         * location.cs (SourceFile.HasLineDirective): New public field;
4121         specifies whether the file contains or is referenced by a "#line"
4122         directive.
4123         (Location.DefineSymbolDocuments): Ignore source files which
4124         either contain or are referenced by a "#line" directive.        
4125
4126 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4127
4128         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4129         direct access to our parent, so check the method inline there.
4130
4131 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4132
4133         * expression.cs (Invocation.EmitCall): Miguel's last commit
4134         caused a regression. If you had:
4135
4136             T t = null;
4137             t.Foo ();
4138
4139         In Foo the implict this would be null.
4140
4141 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4142
4143         * expression.cs (Invocation.EmitCall): If the method is not
4144         virtual, do not emit a CallVirt to it, use Call.
4145
4146         * typemanager.cs (GetFullNameSignature): Improve the method to
4147         cope with ".ctor" and replace it with the type name.
4148
4149         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4150         as an argument the ConstructorBuilder where it is being defined,
4151         to catch the recursive constructor invocations.
4152
4153 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4154
4155         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4156         routines to check if a type is an enumerable/enumerator allow
4157         classes that implement the IEnumerable or IEnumerator interfaces.
4158
4159         * class.cs (Property, Operator): Implement IIteratorContainer, and
4160         implement SetYields.
4161
4162         (Property.Define): Do the block swapping for get_methods in the
4163         context of iterators.   We need to check if Properties also
4164         include indexers or not.
4165
4166         (Operator): Assign the Block before invoking the
4167         OperatorMethod.Define, so we can trigger the Iterator code
4168         replacement. 
4169
4170         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4171         Property and Operator classes are not created when we parse the
4172         declarator but until we have the block completed, so we use a
4173         singleton SimpleIteratorContainer.Simple to flag whether the
4174         SetYields has been invoked.
4175
4176         We propagate this setting then to the Property or the Operator to
4177         allow the `yield' to function.
4178
4179 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4180
4181         * codegen.cs: Implemented attribute support for modules.
4182         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4183         Assembly/Module functionality.
4184
4185         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4186         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4187         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4188
4189 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4190
4191         * interface.cs (FindMembers): The operation is performed on all base
4192         interfaces and not only on the first. It is required for future CLS Compliance patch.
4193
4194 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4195
4196         * statement.cs, codegen.cs:
4197         This patch deals with patterns such as:
4198
4199         public class List : IEnumerable {
4200
4201                 public MyEnumerator GetEnumerator () {
4202                         return new MyEnumerator(this);
4203                 }
4204
4205                 IEnumerator IEnumerable.GetEnumerator () {
4206                         ...
4207                 }
4208                 
4209                 public struct MyEnumerator : IEnumerator {
4210                         ...
4211                 }
4212         }
4213
4214         Before, there were a few things we did wrong:
4215         1) we would emit callvirt on a struct, which is illegal
4216         2) we emited ldarg when we needed to emit ldarga
4217         3) we would mistakenly call the interface methods on an enumerator
4218         type that derived from IEnumerator and was in another assembly. For example:
4219
4220         public class MyEnumerator : IEnumerator
4221
4222         Would have the interface methods called, even if there were public impls of the
4223         method. In a struct, this lead to invalid IL code.
4224
4225 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4226
4227         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4228           renamed to Emit.
4229
4230         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4231
4232 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4233
4234         * cs-parser.jay: Fix small regression: we were not testing V2
4235         compiler features correctly.
4236
4237         * interface.cs: If the emit context is null, then create one
4238
4239 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4240
4241         * decl.cs (GetSignatureForError): New virtual method to get full name
4242           for error messages.
4243
4244         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4245           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4246
4247         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4248           Duplicated members and code in these classes has been removed.
4249           Better encapsulation in these classes.
4250
4251 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4252
4253         * assign.cs (Assign.DoResolve): When dealing with compound
4254         assignments, there is a new rule in ECMA C# 2.4 (might have been
4255         there before, but it is documented here) that states that in:
4256
4257         a op= b;
4258
4259         If b is of type int, and the `op' is a shift-operator, then the
4260         above is evaluated as:
4261
4262         a = (int) a op b 
4263
4264         * expression.cs (Binary.ResolveOperator): Instead of testing for
4265         int/uint/long/ulong, try to implicitly convert to any of those
4266         types and use that in pointer arithmetic.
4267
4268         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4269         method to print information for from the type, not from the
4270         null-method we were given.
4271
4272 2004-02-01  Duncan Mak  <duncan@ximian.com>
4273
4274         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4275         parsing for cmd, fixes bug #53694.
4276
4277 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4278
4279         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4280         in the member name duplication tests. Property and operator name duplication
4281         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4282
4283 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4284
4285         * interface.cs (PopulateMethod): Fixed crash when interface method
4286         returns not existing type (error test cs0246-3.cs).
4287
4288 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4289
4290         * cs-parser.jay (interface_accessors): Re-write actions to also
4291         store attributes attached to get and set methods. Fix spelling
4292         while at it.
4293
4294         (inteface_property_declaration): Modify accordingly.
4295
4296         (InterfaceAccessorInfo): New helper class to store information to pass
4297         around between rules that use interface_accessors.
4298
4299         * interface.cs (Emit): Apply attributes on the get and set
4300         accessors of properties and indexers too.
4301
4302         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4303         right MethodBuilder when applying attributes to the get and set accessors.
4304
4305 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4306
4307         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4308
4309 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4310
4311         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4312
4313 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4314
4315         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4316         changes that treat `yield' specially when present before `break'
4317         or `return' tokens.
4318
4319         * cs-tokenizer.cs: yield is no longer a keyword.
4320
4321 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4322
4323         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4324         setting for default constructors.
4325         For default constructors are almost every time set wrong Modifier. The
4326         generated IL code has been alright. But inside mcs this values was
4327         wrong and this was reason why several of my CLS Compliance tests
4328         failed.
4329
4330 2004-01-22  Martin Baulig  <martin@ximian.com>
4331
4332         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4333         not a QualifiedIdentifier.  This is what `type_name_expression'
4334         was previously doing.
4335         (type_name_expression): Removed; the code is now in
4336         `namespace_or_type_name'.
4337         (qualified_identifier): Removed, use `namespace_or_type_name'
4338         instead.
4339         (QualifiedIdentifier): Removed this class.      
4340
4341 2004-01-22  Martin Baulig  <martin@ximian.com>
4342
4343         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4344         not a string as alias name.
4345
4346 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4347
4348         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4349         #52730 bug, and instead compute correctly the need to use a
4350         temporary variable when requesting an address based on the
4351         static/instace modified of the field and the constructor.
4352  
4353 2004-01-21  Martin Baulig  <martin@ximian.com>
4354
4355         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4356         class and namespace before looking up aliases.  Fixes #52517.
4357
4358 2004-01-21  Martin Baulig  <martin@ximian.com>
4359
4360         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4361         assinged in a 'try'; fixes exception4.cs.
4362
4363 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4364         * class.cs : Implemented parameter-less constructor for TypeContainer
4365
4366         * decl.cs: Attributes are now stored here. New property OptAttributes
4367
4368         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4369
4370         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4371
4372 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4373
4374         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4375           (CSharpSignature): New method for indexer and property signature.
4376
4377 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4378
4379         * pending.cs (IsVirtualFilter): Faster implementation.
4380
4381 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4382
4383         * typemanager.cs: Avoid inclusion of same assembly more than once.
4384
4385 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4386
4387         * cs-parser.jay: Fixed problem where the last assembly attribute
4388           has been applied also to following declaration (class, struct, etc.)
4389           
4390 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4391
4392         * class.cs: Added error CS0538, CS0539 reporting.
4393         Fixed crash on Microsoft runtime when field type is void.
4394
4395         * cs-parser.jay: Added error CS0537 reporting.
4396
4397         * pending.cs: Added error CS0535 reporting.
4398         Improved error report for errors CS0536, CS0534.
4399
4400 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4401
4402         Merge a few bits from the Anonymous Method MCS tree.
4403
4404         * statement.cs (ToplevelBlock): New class for toplevel methods,
4405         will hold anonymous methods, lifted variables.
4406
4407         * cs-parser.jay: Create toplevel blocks for delegates and for
4408         regular blocks of code. 
4409
4410 2004-01-20  Martin Baulig  <martin@ximian.com>
4411
4412         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4413         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4414         and `NeedExplicitReturn'; added `IsLastStatement'.
4415         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4416         have a `ReturnLabel' or we're not unreachable.
4417
4418         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4419         child's reachability; don't just override ours with it.  Fixes
4420         #58058 (lluis's example).
4421         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4422         InFinally(), InLoop(), InSwitch() and
4423         BreakCrossesTryCatchBoundary() methods.
4424
4425         * statement.cs (Return): Do all error checking in Resolve().
4426         Unless we are the last statement in a top-level block, always
4427         create a return label and jump to it.
4428         (Break, Continue): Do all error checking in Resolve(); also make
4429         sure we aren't leaving a `finally'.
4430         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4431         statement in a top-level block.
4432         (Block.Flags): Added `IsDestructor'.
4433         (Block.IsDestructor): New public property.
4434
4435 2004-01-20  Martin Baulig  <martin@ximian.com>
4436
4437         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4438
4439 2004-01-20  Martin Baulig  <martin@ximian.com>
4440
4441         * statement.cs (Statement.ResolveUnreachable): New public method.
4442         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4443         (Block.Resolve): Resolve unreachable statements.
4444
4445 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4446
4447         * expression.cs: We need to fix the case where we do
4448         not have a temp variable here.
4449
4450         * assign.cs: Only expression compound assignments need
4451         temporary variables.
4452
4453 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4454
4455         * flowanalysis.cs: Reduce memory allocation in a few ways:
4456           - A block with no variables should not allocate a bit
4457             vector for itself.
4458           - A method with no out parameters does not need any tracking
4459             for assignment of the parameters, so we need not allocate
4460             any data for it.
4461           - The arrays:
4462                 public readonly Type[] VariableTypes;
4463                 public readonly string[] VariableNames;
4464             Are redundant. The data is already stored in the variable
4465             map, so we need not allocate another array for it.
4466           - We need to add alot of checks for if (params | locals) == null
4467             due to the first two changes.
4468
4469 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4470
4471         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4472         implement IMemoryLocation, we store a copy on a local variable and
4473         take the address of it.  Patch from Benjamin Jemlich
4474
4475         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4476         to use a special "type_name_expression" rule which reduces the
4477         number of "QualifiedIdentifier" classes created, and instead
4478         directly creates MemberAccess expressions.
4479
4480 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4481
4482         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4483         that fixes #52853.  Null literal assignment to ValueType
4484
4485         * class.cs (MethodData.Emit): Instead of checking the name of the
4486         method to determine if its a destructor, create a new derived
4487         class from Method called Destructor, and test for that.  
4488
4489         * cs-parser.jay: Create a Destructor object instead of a Method.  
4490
4491         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4492
4493         Fixes: 52933
4494
4495 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4496
4497         * expression.cs (Binary.ResolveOperator): Perform an implicit
4498         conversion from MethodGroups to their delegate types on the
4499         Addition operation.
4500
4501         * delegate.cs: Introduce a new class DelegateCreation that is the
4502         base class for `NewDelegate' and `ImplicitDelegateCreation',
4503         factor some code in here.
4504
4505         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4506         conversion from MethodGroups to compatible delegate types. 
4507
4508         * ecore.cs (Expression.Resolve): Do not flag error 654
4509         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4510         we allow conversions from MethodGroups to delegate types now.
4511
4512         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4513         assignments in v2 either.
4514
4515 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4516
4517         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4518         static read-only fields in ctors.
4519
4520         Applied patch from Benjamin Jemlich 
4521
4522         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4523
4524 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4525
4526         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4527         here to return true, as they can be used like this:
4528
4529                 (XXX) int.MEMBER ()
4530
4531         Fixed 49836 and all the other dups
4532
4533 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4534
4535         * driver.cs: Implement /win32res and /win32icon.
4536
4537 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4538
4539         * cs-parser.jay: Add a rule to improve error handling for the
4540         common mistake of placing modifiers after the type.
4541
4542 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4543
4544         * cs-parser.jay (interface_event_declaration): Catch
4545         initialization of events on interfaces, and report cs0068
4546
4547         * cs-parser.jay (interface_event_declaration): Catch
4548         initialization of events. 
4549
4550         * ecore.cs: Better report missing constructors.
4551
4552         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4553         the error reporting done in the wrong place.  Fix.
4554
4555         * expression.cs (Binary.ResolveOperator): Catch the 
4556         operator + (E x, E y) error earlier, and later allow for implicit
4557         conversions in operator +/- (E e, U x) from U to the underlying
4558         type of E.
4559
4560         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4561         52596, if the container class is abstract, the default constructor
4562         is protected otherwise its public (before, we were always public).
4563
4564         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4565         fixed statement.
4566
4567         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4568         Jemlich that fixes bug #52597, MCS was generating invalid code for
4569         idisposable structs.   Thanks to Ben for following up with this
4570         bug as well.
4571
4572 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4573
4574         * driver.cs: Allow assemblies without code to be generated, fixes
4575         52230.
4576
4577 2004-01-07  Nick Drochak <ndrochak@gol.com>
4578
4579         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4580
4581 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4582
4583         * cs-parser.jay: Add rules to improve error reporting if fields or
4584         methods are declared at the namespace level (error 116)
4585
4586         * Add rules to catch event add/remove
4587
4588 2004-01-04  David Sheldon <dave-mono@earth.li>
4589
4590   * expression.cs: Added matching ")" to error message for 
4591   CS0077
4592
4593 2004-01-03 Todd Berman <tberman@gentoo.org>
4594
4595         * ecore.cs, attribute.cs:
4596         Applying fix from #52429.
4597
4598 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4599
4600         * ecore.cs, expression.cs, statement.cs:
4601         Total rewrite of how we handle branching. We
4602         now handle complex boolean expressions with fewer
4603         jumps. As well if (x == 0) no longer emits a ceq.
4604
4605         if (x is Foo) is much faster now, because we generate
4606         better code.
4607
4608         Overall, we get a pretty big improvement on our benchmark
4609         tests. The code we generate is smaller and more readable.
4610
4611         I did a full two-stage bootstrap. The patch was reviewed
4612         by Martin and Miguel.
4613
4614 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4615
4616         * cs-parser.jay: Make primary_expression not take a QI.
4617         we dont need this because the member_access rule covers
4618         us here. So we replace the rule with just IDENTIFIER.
4619
4620         This has two good effects. First, we remove a s/r conflict.
4621         Second, we allocate many fewer QualifiedIdentifier objects.
4622
4623 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4624
4625         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4626         set the correct information via SRE. This prevents
4627         hanging on the MS runtime. Fixes #29374.
4628
4629 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4630
4631         * convert.cs: correctly handle conversions to value types
4632         from Enum and ValueType as unboxing conversions.
4633
4634         Fixes bug #52569. Patch by Benjamin Jemlich.
4635
4636 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4637
4638         * expression.cs (BetterConversion): Prefer int -> uint
4639         over int -> ulong (csc's behaviour). This fixed bug #52046.
4640
4641 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4642
4643         * decl.cs (MemberCache.FindMembers): now returns a
4644         MemberInfo [].
4645
4646         * typemanager.cs: In general, go with with ^^.
4647         (CopyNewMethods): take an IList.
4648         (RealMemberLookup): Only allocate an arraylist
4649         if we copy from two sets of methods.
4650
4651         This change basically does two things:
4652         1) Fewer array lists allocated due to CopyNewMethods.
4653         2) the explicit cast in MemberList costed ALOT.
4654
4655 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4656
4657         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4658         a hashtable to avoid needless string allocations when an identifier is
4659         used more than once (the common case).
4660
4661 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4662
4663         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4664         is broken, it will not return anything. So, we
4665         have to use the information we have in mcs to
4666         do the task.
4667
4668         * typemanager.cs: Add a cache for GetInterfaces,
4669         since this will now be used more often (due to ^^)
4670
4671         (GetExplicitInterfaces) New method that gets the
4672         declared, not effective, interfaces on a type
4673         builder (eg, if you have interface IFoo, interface
4674         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4675         { IBar }.
4676
4677         This patch makes MCS able to bootstrap itself on
4678         Windows again.
4679
4680 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4681
4682         * expression.cs: Remove the Nop's that Miguel put
4683         in by mistake.
4684
4685 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4686
4687         * report.cs, codegen.cs: Give the real stack trace to
4688         the error when an exception is thrown.
4689
4690 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4691
4692         * decl.cs: only allocate hashtables for ifaces if 
4693         it is an iface!
4694
4695 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4696
4697         * expression.cs: fix the error from cs0121-2.cs
4698         (a parent interface has two child interfaces that
4699         have a function with the same name and 0 params
4700         and the function is called through the parent).
4701
4702 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4703
4704         * class.cs, rootcontext.cs, typmanager.cs: do not
4705         leak pointers.
4706
4707 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4708
4709         * codegen.cs: remove stack for the ec flow branching.
4710         It is already a linked list, so no need.
4711
4712 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4713
4714         * Makefile: Allow custom profiler here.
4715
4716 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4717
4718         * typemanager.cs (LookupType):
4719           - Use a static char [], because split takes
4720             a param array for args, so it was allocating
4721             every time.
4722           - Do not store true in a hashtable, it boxes.
4723
4724 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4725
4726         * flowanalysis.cs: bytify common enums.
4727
4728 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4729
4730         * modifiers.cs: Add a new set of flags for the
4731         flags allowed on explicit interface impls.
4732         * cs-parser.jay: catch the use of modifiers in
4733         interfaces correctly.
4734         * class.cs: catch private void IFoo.Blah ().
4735
4736         All related to bug #50572.
4737
4738 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4739
4740         * decl.cs: Rewrite the consistant accessability checking.
4741         Accessability is not linear, it must be implemented in
4742         a tableish way. Fixes #49704.
4743
4744 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4745
4746         * expression.cs: Handle negation in a checked context.
4747         We must use subtraction from zero. Fixes #38674.
4748
4749 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4750
4751         * class.cs: Ignore static void main in DLLs.
4752         * rootcontext.cs: Handle the target type here,
4753         since we are have to access it from class.cs
4754         * driver.cs: account for the above.
4755
4756 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4757
4758         * report.cs: Give line numbers and files if available.
4759
4760 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4761
4762         * driver.cs: Implement /addmodule.
4763
4764         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4765         ModuleBuilders.
4766
4767 2003-12-20  Martin Baulig  <martin@ximian.com>
4768
4769         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4770         (FieldBase.IsAssigned): Removed this field.
4771         (FieldBase.SetAssigned): New public method.
4772         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4773
4774 2003-12-20  Martin Baulig  <martin@ximian.com>
4775
4776         * expression.cs (LocalVariableReference.DoResolve): Don't set
4777         `vi.Used' if we're called from DoResolveLValue().
4778
4779         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4780         returns the usage vector it just merged into the current one -
4781         pass this one to UsageWarning().
4782         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4783         of the `EmitContext', don't call this recursively on our children.
4784
4785 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4786
4787         * driver.cs: Implement /target:module.
4788
4789 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4790
4791         * support.cs (CharArrayHashtable): New helper class.
4792
4793         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4794         char arrays, not strings, so we can avoid creating a string in
4795         consume_identifier if the identifier is a keyword.
4796
4797 2003-12-16  Martin Baulig  <martin@ximian.com>
4798
4799         * statement.cs (LocalInfo.Assigned): Removed this property.
4800         (LocalInfo.Flags): Removed `Assigned'.
4801         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4802         and uses flow analysis.
4803         (Block.UsageWarning): Made this method private.
4804         (Block.Resolve): Call UsageWarning() if appropriate.
4805
4806         * expression.cs (LocalVariableReference.DoResolve): Always set
4807         LocalInfo.Used here.
4808
4809 2003-12-13  Martin Baulig  <martin@ximian.com>
4810
4811         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4812         any value here; we're now using flow analysis to figure out
4813         whether a statement/block returns a value.
4814
4815 2003-12-13  Martin Baulig  <martin@ximian.com>
4816
4817         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4818         working again.
4819         (FlowBranching.MergeFinally): Don't call
4820         `branching.CheckOutParameters()' here, this is called in
4821         MergeTopBlock().
4822         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4823         when adding the `finally' vector.       
4824
4825 2003-12-13  Martin Baulig  <martin@ximian.com>
4826
4827         * flowanalysis.cs
4828         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4829         actually work and also fix #48962.
4830
4831 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4832
4833         * decl.cs: Do not check System.Object for nested types,
4834         since we know it does not have any. Big bang for buck:
4835
4836         BEFORE:
4837            Run 1:   8.35 seconds
4838            Run 2:   8.32 seconds
4839            corlib:  17.99 seconds
4840         AFTER:
4841            Run 1:   8.17 seconds
4842            Run 2:   8.17 seconds
4843            corlib:  17.39 seconds
4844
4845 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4846
4847         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4848         time we are returning 0 members, so we save alot here.
4849
4850 2003-12-11  Martin Baulig  <martin@ximian.com>
4851
4852         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4853         `MergeChild()', also just take the `FlowBranching' as argument;
4854         call Merge() on it and return the result.
4855         (FlowBranching.Merge): We don't need to do anything if we just
4856         have one sibling.
4857
4858 2003-12-11  Martin Baulig  <martin@ximian.com>
4859
4860         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4861         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4862         Maurer for this idea.
4863
4864 2003-12-11  Martin Baulig  <martin@ximian.com>
4865
4866         * flowanalysis.cs (MergeResult): This class is now gone; we now
4867         use the `UsageVector' for this.  The reason for this is that if a
4868         branching just has one sibling, we don't need to "merge" them at
4869         all - that's the next step to do.
4870         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4871         `MergeResult'.
4872
4873 2003-12-11  Martin Baulig  <martin@ximian.com>
4874
4875         Reworked flow analyis and made it more precise and bug-free.  The
4876         most important change is that we're now using a special `Reachability'
4877         class instead of having "magic" meanings of `FlowReturns'.  I'll
4878         do some more cleanups and optimizations and also add some more
4879         documentation this week.
4880
4881         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4882         largely reworked this class.
4883         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4884         the new `Reachability' class instead of having "magic" values here.
4885         (FlowBranching): We're now using an instance of `Reachability'
4886         instead of having separate `Returns', `Breaks' etc. fields.
4887
4888         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4889         based on flow analysis; ignore the return value of block.Emit ().
4890
4891 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4892
4893         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4894         if they are private.
4895
4896 2003-12-09  Martin Baulig  <martin@ximian.com>
4897
4898         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4899         call them directly on the UsageVector.
4900
4901 2003-12-09  Martin Baulig  <martin@ximian.com>
4902
4903         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4904         Changed return type from `FlowReturns' to `Reachability'.
4905
4906 2003-12-09  Martin Baulig  <martin@ximian.com>
4907
4908         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4909         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4910         `Reachable' fields with a single `Reachability' one.
4911
4912 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4913
4914         * class.cs (FindMembers): Remove foreach's.
4915
4916         Bootstrap times:
4917
4918         BEFORE
4919                 Run 1:   8.74 seconds
4920                 Run 2:   8.71 seconds
4921
4922         AFTER
4923                 Run 1:   8.64 seconds
4924                 Run 2:   8.58 seconds
4925
4926
4927 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4928
4929         * cs-parser.jay:
4930         * gen-treedump.cs:
4931         * statement.cs:
4932         This patch does a few things:
4933                 1. EmptyStatement is now a singleton, so it is never reallocated.
4934                 2. All blah is EmptyStatement constructs have been changed to
4935                    blah == EmptyStatement.Value, which is much faster and valid
4936                    now that EmptyStatement is a singleton.
4937                 3. When resolving a block, rather than allocating a new array for
4938                    the non-empty statements, empty statements are replaced with
4939                    EmptyStatement.Value
4940                 4. Some recursive functions have been made non-recursive.
4941         Mainly the performance impact is from (3), however (1) and (2) are needed for
4942         this to work. (4) does not make a big difference in normal situations, however
4943         it makes the profile look saner.
4944
4945         Bootstrap times:
4946
4947         BEFORE
4948         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4949         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4950         Total memory allocated: 56397 KB
4951
4952         AFTER
4953         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4954         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4955         Total memory allocated: 55666 KB
4956
4957 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4958
4959         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4960         than the hashtable in a hashtable version
4961
4962         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4963         we always end up concating a string. This results in a huge perf
4964         loss, because many strings have to be tracked by the GC. In this
4965         patch, we first use a hashtable that works with two keys, so that
4966         the strings do not need to be concat'ed.
4967
4968         Bootstrap times:
4969         BEFORE
4970                 Run 1:   8.74 seconds
4971                 Run 2:   8.71 seconds
4972
4973         AFTER
4974                 Run 1:   8.65 seconds
4975                 Run 2:   8.56 seconds
4976
4977 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4978
4979         * Makefile: Add a new target `do-time' that does a quick and simple
4980         profile, leaving easy to parse output.
4981
4982 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4983
4984         * codegen.cs (Init): Create the dynamic assembly with 
4985         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4986
4987 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4988
4989         * support.cs: Make the PtrHashtable use only one
4990         instance of its comparer.
4991
4992 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4993
4994         * typemanager.cs: Fix lookup of GetNamespaces.
4995
4996 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4997
4998         * expression.cs: Removed redundant line.
4999
5000         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5001         ArrayLists, use for loops with bounds.  
5002
5003         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5004         arraylist.
5005
5006         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5007         arraylists, use for loop with bounds.
5008
5009         The above three changes give us a 0.071 second performance
5010         improvement out of 3.294 seconds down to 3.223.  On my machine
5011         the above changes reduced the memory usage by 1,387 KB during
5012         compiler bootstrap.
5013
5014         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5015         QualifiedIdentifiers.  Before we created a new string through
5016         concatenation, and mostly later on, the result would be
5017         manipulated by DecomposeQI through string manipulation.
5018
5019         This reduced the compiler memory usage for bootstrapping from
5020         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5021         compile times in 0.05 seconds.
5022
5023 2003-11-28  Dick Porter  <dick@ximian.com>
5024
5025         * support.cs: Do string compares with the Invariant culture.
5026
5027         * rootcontext.cs: 
5028         * gen-treedump.cs: 
5029         * expression.cs: 
5030         * driver.cs: 
5031         * decl.cs: 
5032         * codegen.cs: 
5033         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5034         the comparison is done with the Invariant culture.
5035
5036 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5037
5038         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5039         GetEnumerator method.
5040
5041         (ProbeCollectionType): Iterate starting at the most specific type
5042         upwards looking for a GetEnumerator
5043
5044         * expression.cs: Shift count can be up to 31 for int/uint and 63
5045         for long/ulong.
5046
5047 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5048
5049         * statement.cs (Block.LookupLabel): Also look for the label on the
5050         children blocks.  Use a hash table to keep track of visited
5051         nodes. 
5052
5053         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5054         we actually did transform the other operand, otherwise fall back
5055         to the common codepath that casts to long.
5056
5057         * cs-tokenizer.cs: Use the same code pattern as the int case.
5058         Maybe I should do the parsing myself, and avoid depending on the
5059         Parse routines to get this done.
5060
5061 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5062
5063         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5064         which fixes bug 51347.  This time test it.
5065
5066         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5067         attributes for example can not tell the difference between these.
5068         The difference was only a syntax feature of the language. 
5069
5070         * attribute.cs: Apply attributes to delegates.
5071
5072         * delegate.cs: Call the apply attributes method.
5073
5074 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5075
5076         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5077         comparing 0 vs Byte.MinValue, not the value
5078
5079         (ImplicitConversionRequired): When reporting a conversion error,
5080         use error 31 to print out the constant error instead of the
5081         simpler 29.
5082
5083         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5084         which fixes bug 51347.
5085
5086 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5087
5088         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5089         which fixes the -warnaserror command line option.
5090
5091 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5092
5093         * cfold.cs (DoNumericPromotions): During constant folding of
5094         additions on UIntConstant, special case intconstants with
5095         IntConstants like we do on the expression binary operator. 
5096
5097 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5098
5099         * convert.cs (ImplicitReferenceConversion): We were missing a case
5100         (System.Enum are not value types or class types, so we need to
5101         classify them separatedly).
5102
5103         * driver.cs: We do not support error 2007.
5104
5105 2003-11-12 Jackson Harper <jackson@ximian.com>
5106
5107         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5108         system directory. Also use the full file name so users can
5109         libraries names mscorlib-o-tron.dll in a non system dir.
5110
5111 2003-11-10  Martin Baulig  <martin@ximian.com>
5112
5113         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5114         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5115         calling `ResolveType()' on them, directly assign their `Type'.
5116
5117 2003-11-08  Martin Baulig  <martin@ximian.com>
5118
5119         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5120         return value and the `out parent' parameter.
5121         (TypeContainer.DefineType): Moved the CS0644 check into
5122         GetClassBases().  Don't pass the interface types to the
5123         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5124         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5125
5126         * ecore.cs (TypeExpr.IsAttribute): New property.
5127         (TypeExpr.GetInterfaces): New method.
5128
5129         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5130         TypeExpr instead of a Type.
5131         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5132         (Interface.DefineType): Don't pass the interface types to the
5133         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5134         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5135
5136         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5137         instead of a `Type[]'.
5138         (TypeManager.RegisterBuilder): Likewise.
5139         (TypeManager.AddUserInterface): Likewise.
5140         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5141         `Type[]' and also return a `TypeExpr[]'.
5142         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5143
5144 2003-11-08  Martin Baulig  <martin@ximian.com>
5145
5146         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5147         Expression.     
5148
5149 2003-11-08  Martin Baulig  <martin@ximian.com>
5150
5151         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5152         TypeManager.ResolveExpressionTypes().
5153
5154         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5155         instead of an Expression.
5156         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5157         (TypeExpression): New public class; formerly known as `TypeExpr'.
5158
5159         * expression.cs (ComposedCast): Derive from TypeExpr.
5160
5161         * typemanager.cs (TypeManager.system_*_expr): These are now
5162         TypExpr's instead of Expression's.
5163         (TypeManager.ResolveExpressionTypes): New public static function;
5164         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5165         of them.        
5166
5167 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5168
5169         * expression.cs (New.DoResolve): Do not dereference value that
5170         might be a null return.
5171
5172         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5173         sure that the constant value has the right type.  Fixes an
5174         unreported bug, similar to 50425.
5175
5176         * const.cs (Const.LookupConstantValue): Call
5177         ImplicitStandardConversionExists before doing a conversion to
5178         avoid havng the TypeManager.ChangeType do conversions.
5179
5180         Reduced the number of casts used
5181
5182         (Const.ChangeType): New routine to enable reuse of the constant
5183         type changing code from statement.
5184
5185         * typemanager.cs (ChangeType): Move common initialization to
5186         static global variables.
5187
5188         Fixes #50425.
5189
5190         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5191         every value type to go through, even if it was void.  Fix that. 
5192
5193         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5194         character of the define, and the is_identifier_part_character for
5195         the rest of the string.
5196
5197 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5198
5199         * expression.cs (UnaryMutator.EmitCode): When I updated
5200         LocalVariableReference.DoResolve, I overdid it, and dropped an
5201         optimization done on local variable references.
5202
5203 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5204
5205         * ecore.cs: Convert the return from Ldlen into an int.
5206
5207 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5208
5209         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5210         the accessibility, this is a special case for toplevel non-public
5211         classes (internal for instance).
5212
5213 2003-10-20  Nick Drochak <ndrochak@gol.com>
5214
5215         * ecore.cs: Fix typo and build.  Needed another right paren.
5216
5217 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5218
5219         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5220         `internal' case regular and protected, but not allowing protected
5221         to be evaluated later.  Bug 49840
5222
5223 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5224
5225         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5226         to kb.Nlast, and not the kb.nFirst to isolate the switch
5227         statement.
5228
5229         Extract the underlying type, so enumerations of long/ulong are
5230         treated like long/ulong.
5231
5232 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5233
5234         * expression.cs (New): Overload the meaning of RequestedType to
5235         track the possible creation of the NewDelegate type, since
5236         DoResolve is invoked more than once for new constructors on field
5237         initialization.
5238
5239         See bugs: #48800 and #37014
5240
5241         * cs-parser.jay (declare_local_constants): Take an arraylist
5242         instead of a single constant.
5243
5244         (local_constant_declaration): It should take a
5245         constant_declarators, not a constant_declarator.  Fixes 49487
5246
5247         * convert.cs: Fix error report.
5248
5249 2003-10-13 Jackson Harper <jackson@ximian.com>
5250
5251         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5252         bug #49611
5253
5254 2003-10-09  Martin Baulig  <martin@ximian.com>
5255
5256         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5257         to the .ctor.
5258         (MethodCore.DoDefineParameters): Removed the TypeContainer
5259         argument; use the DeclSpace which was passed to the .ctor instead.
5260         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5261         TypeContainer; we only need a DeclSpace here.
5262
5263 2003-10-09  Martin Baulig  <martin@ximian.com>
5264
5265         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5266         to the .ctor.
5267         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5268         EmitContext's .ctor.    
5269
5270 2003-10-09  Martin Baulig  <martin@ximian.com>
5271
5272         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5273         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5274         AsAccessible(), moved them as well.
5275
5276         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5277
5278 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5279
5280         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5281
5282 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5283
5284         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5285         generation for >=, as spotted by Paolo, bug 48679.  
5286         Patch from David Waite.
5287
5288         * cs-tokenizer.cs: Add handling for #pragma.
5289
5290         * cs-parser.jay: Allow for both yield and yield return in the
5291         syntax.  The anti-cobolization of C# fight will go on!
5292
5293         * class.cs (TypeBuilder.DefineType): Catch error condition here
5294         (Parent.DefineType erroring out and returning null).
5295
5296         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5297         coping with enumerations variables, we were mistakenly processing
5298         them as a regular value type instead of built-in types.  Fixes the
5299         bug #48063
5300
5301         * typemanager.cs (IsBuiltinOrEnum): New method.
5302
5303 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5304
5305         * cs-parser.jay: Upgrade: yield now needs the return clause.
5306
5307 2003-09-19  Martin Baulig  <martin@ximian.com>
5308
5309         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5310         `MemberCache parent' argument.  Normally, an interface doesn't
5311         have a parent type except System.Object, but we use this in gmcs
5312         for generic type parameters.
5313
5314 2003-09-18  Martin Baulig  <martin@ximian.com>
5315
5316         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5317         on `type.IsInterface'; don't check whether the type has a parent
5318         to determine whether it's an interface.
5319
5320 2003-09-15  Martin Baulig  <martin@ximian.com>
5321
5322         * class.cs (TypeContainer.DefineType): Added an error flag to
5323         avoid reporting duplicate CS0146's ("class definition is
5324         circular.").
5325
5326         * driver.cs (Driver.MainDriver): Abort if
5327         RootContext.ResolveTree() reported any errors.
5328
5329 2003-09-07  Martin Baulig  <martin@ximian.com>
5330
5331         * report.cs (Error, Warning): Added overloaded versions which take
5332         a `params object[] args' and call String.Format().
5333
5334 2003-09-07  Martin Baulig  <martin@ximian.com>
5335
5336         * decl.cs (DeclSpace..ctor): Don't call
5337         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5338         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5339         (DeclSpace.RecordDecl): New method.
5340
5341         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5342
5343 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5344
5345         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5346         value attributes to be applied to ParameterBuilders.
5347
5348         * class.cs (MethodCore.LabelParameters): Make static and more
5349         generic so that it can be used from other places - like interface
5350         methods, for instance.
5351
5352         * interface.cs (Interface.Emit): Call LabelParameters before
5353         emitting attributes on the InterfaceMethod.
5354
5355 2003-08-26  Martin Baulig  <martin@ximian.com>
5356
5357         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5358         resolving aliases; fixes #47927.
5359
5360 2003-08-26  Martin Baulig  <martin@ximian.com>
5361
5362         * statement.cs (Using.DoResolve): This is internally emitting a
5363         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5364         do not always return.  Fixes #47681.
5365
5366 2003-08-26  Martin Baulig  <martin@ximian.com>
5367
5368         * decl.cs (MemberCore): Moved WarningNotHiding(),
5369         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5370         into MemberBase.
5371         (AdditionResult): Make this nested in DeclSpace.
5372         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5373         argument; call NamespaceEntry.Define() unless we're nested in a
5374         class or struct.
5375
5376         * namespace.cs (Namespace.DefineName): New public function.  This
5377         is called from DeclSpace's .ctor to add 
5378         (Namespace.Lookup): Include DeclSpaces in the lookup.
5379
5380         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5381
5382         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5383
5384 2003-08-25  Martin Baulig  <martin@ximian.com>
5385
5386         * convert.cs (Convert.ExplicitReferenceConversion): When
5387         converting from an interface type to a class, unbox if the target
5388         type is a struct type.  Fixes #47822.
5389
5390 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5391
5392         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5393         #47854.
5394
5395 2003-08-22  Martin Baulig  <martin@ximian.com>
5396
5397         * class.cs (TypeManager.DefineType): When defining a nested type,
5398         call DefineType() on our parent; fixes #47801.
5399
5400 2003-08-22  Martin Baulig  <martin@ximian.com>
5401
5402         * class.cs (MethodData.Define): While checking if a method is an
5403         interface implementation, improve the test a bit more to fix #47654.
5404
5405 2003-08-22  Martin Baulig  <martin@ximian.com>
5406
5407         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5408         correctly; fixes #47722.
5409
5410 2003-08-22  Martin Baulig  <martin@ximian.com>
5411
5412         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5413         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5414
5415         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5416
5417 2003-08-22  Martin Baulig  <martin@ximian.com>
5418
5419         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5420         can only be assigned in static constructors.  Fixes #47161.
5421
5422 2003-08-22  Martin Baulig  <martin@ximian.com>
5423
5424         Rewrote and improved the flow analysis code.
5425
5426         * flowbranching.cs (FlowBranching): Make this class abstract.
5427         (FlowBranching.CreateBranching): New static function to create a
5428         new flow branching.
5429         (FlowBranchingBlock, FlowBranchingException): New classes.
5430         (FlowBranching.UsageVector.Type): New public readonly field.
5431         (FlowBranching.UsageVector.Breaks): Removed the setter.
5432         (FlowBranching.UsageVector.Returns): Removed the setter.
5433         (FlowBranching.UsageVector): Added Break(), Return(),
5434         NeverReachable() and Throw() methods to modify the reachability.
5435         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5436         done by FlowBranching.Merge().
5437         (FlowBranching.UsageVector.MergeChild): New method; merges the
5438         merge result into the current vector.
5439         (FlowBranching.Merge): New abstract method to merge a branching.
5440
5441 2003-08-12  Martin Baulig  <martin@ximian.com>
5442
5443         * expression.cs (Indirection.CacheTemporaries): Create the
5444         LocalTemporary with the pointer type, not its element type.
5445
5446 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5447
5448         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5449         token was a keyword or not.
5450
5451         Add `error' options where an IDENTIFIER was expected;  Provide
5452         CheckToken and CheckIdentifierToken convenience error reporting
5453         functions. 
5454
5455         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5456
5457         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5458         NameSpaceEntry NameSpaceEntry.
5459
5460         (LookupInterfaceOrClass): Avoid creating a full qualified name
5461         from namespace and name: avoid doing lookups when we know the
5462         namespace is non-existant.   Use new Tree.LookupByNamespace which
5463         looks up DeclSpaces based on their namespace, name pair.
5464
5465         * driver.cs: Provide a new `parser verbose' to display the
5466         exception thrown during parsing.  This is turned off by default
5467         now, so the output of a failure from mcs is more graceful.
5468
5469         * namespace.cs: Track all the namespaces defined in a hashtable
5470         for quick lookup.
5471
5472         (IsNamespace): New method
5473
5474 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5475
5476         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5477         we know that we need to concatenate (full typename can never be
5478         null). 
5479
5480         * class.cs: ditto.
5481
5482         * statement.cs: Use a bitfield;  Do not initialize to null things
5483         which are done by the constructor by default.
5484
5485         * cs-parser.jay: bug fix, parameter was 4, not 3.
5486
5487         * expression.cs: Just use the property;
5488
5489         * statement.cs: No need for GetVariableInfo method.
5490
5491 2003-08-08  Martin Baulig  <martin@ximian.com>
5492
5493         * flowanalysis.cs (FlowReturns): This is now nested in the
5494         `FlowBranching' class.
5495         (MyBitVector): Moved this here from statement.cs.
5496         (FlowBranching.SiblingType): New enum type.
5497         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5498
5499 2003-08-07  Martin Baulig  <martin@ximian.com>
5500
5501         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5502         `FlowBranching' class and called `BranchingType'.
5503
5504 2003-08-07  Martin Baulig  <martin@ximian.com>
5505
5506         * flowanalysis.cs: Moved all the control flow analysis code into
5507         its own file.
5508
5509 2003-08-07  Martin Baulig  <martin@ximian.com>
5510
5511         * assign.cs (Assign.DoResolve): `target' must either be an
5512         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5513         #37319.
5514
5515 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5516
5517         * expression.cs (BinaryMethod): This kind of expression is created by the
5518         Binary class if it determines that the operator has to be handled
5519         by a method.
5520
5521         (BinaryDelegate): This kind of expression is created if we are
5522         dealing with a + or - operator on delegates.
5523
5524         (Binary): remove method, argumetns, and DelegateOperator: when
5525         dealing with methods, 
5526
5527         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5528
5529         * statement.cs (Block): use bitfields for the three extra booleans
5530         we had in use.   Remove unused topblock parameter.
5531
5532         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5533
5534         * assign.cs: Drop extra unneeded tests.
5535
5536 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5537
5538         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5539
5540         * statement.cs (Foreach): Use VariableStorage instead of
5541         LocalBuilders.   
5542
5543         * codegen.cs (VariableStorage): New class used by clients that
5544         require a variable stored: locals or fields for variables that
5545         need to live across yield.
5546
5547         Maybe provide a convenience api for EmitThis+EmitLoad?
5548
5549         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5550         these bad boys.
5551
5552 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5553
5554         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5555         RemapParameterLValue): New methods that are used to turn a
5556         precomputed FieldInfo into an expression like this:
5557
5558                 instance.FieldInfo
5559
5560         The idea is to use this instead of making LocalVariableReference
5561         have more than one meaning.
5562
5563         * cs-parser.jay: Add error production to BASE.
5564
5565         * ecore.cs: Deal with TypeManager.GetField returning null, which
5566         is now a valid return value.
5567
5568         (FieldExprNoAddress): New expression for Fields whose address can
5569         not be taken.
5570
5571         * expression.cs (LocalVariableReference): During the resolve
5572         phases, create new expressions if we are in a remapping context.
5573         Remove code that dealt with remapping here.
5574
5575         (ParameterReference): same.
5576
5577         (ProxyInstance): New expression, like the `This' expression, but
5578         it is born fully resolved.  We know what we are doing, so remove
5579         the errors that are targeted to user-provided uses of `this'.
5580
5581         * statement.cs (Foreach): our variable is now stored as an
5582         Expression;  During resolution, follow the protocol, dont just
5583         assume it will return this.
5584
5585 2003-08-06  Martin Baulig  <martin@ximian.com>
5586
5587         * support.cs (SeekableStreamReader.cs): New public class.
5588
5589         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5590         SeekableStreamReader instead of the normal StreamReader.
5591
5592 2003-08-04  Martin Baulig  <martin@ximian.com>
5593
5594         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5595         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5596         deambiguate casts and delegate invocations.
5597         (parenthesized_expression): Use the new tokens to ensure this is
5598         not a cast of method invocation.
5599
5600         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5601         when reading a `)' and Deambiguate_CloseParens () was previously
5602         called.
5603
5604         * expression.cs (ParenthesizedExpression): New class.  This is
5605         just used for the CS0075 test.
5606         (Binary.DoResolve): Check for CS0075.   
5607
5608 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5609
5610         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5611         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5612         reference comparison.
5613
5614         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5615         examine the ReturnType for equality - this is necessary in the
5616         cases of implicit and explicit operators whose signature also
5617         includes the return type.
5618
5619 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5620
5621         * namespace.cs: Cache the result of the namespace computation,
5622         instead of computing it every time.
5623
5624 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5625
5626         * decl.cs: Use a global arraylist that we reuse over invocations
5627         to avoid excesive memory consumption.  Reduces memory usage on an
5628         mcs compile by one meg (45 average).
5629
5630         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5631         private, work around that.
5632
5633 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5634
5635         * literal.cs (IntLiteral): Define Zero and One static literals. 
5636
5637         * cs-parser.jay (integer_literal): use static literals to reduce
5638         memory usage for the most used literals (0, 1 and -1).  211kb
5639         reduced in memory usage.
5640
5641         Replace all calls to `new ArrayList' with `new
5642         ArrayList(4)' which is a good average number for most allocations,
5643         and also requires only 16 bytes of memory for its buffer by
5644         default. 
5645
5646         This reduced MCS memory usage in seven megabytes for the RSS after
5647         bootstrapping.
5648
5649 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5650
5651         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5652         handle params methods the correct way by forming only one
5653         applicable set with params and normal methods in them. Earlier we
5654         were looking at params methods only if we found no normal methods
5655         which was not the correct thing to do.
5656
5657         (Invocation.BetterFunction): Take separate arguments indicating
5658         when candidate and the best method are params methods in their
5659         expanded form.
5660
5661         This fixes bugs #43367 and #46199.
5662
5663         * attribute.cs: Documentation updates.
5664
5665         (CheckAttribute): Rename to CheckAttributeTarget.
5666         (GetValidPlaces): Rename to GetValidTargets.
5667
5668         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5669         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5670
5671         Fixes bug #44468.
5672
5673 2003-07-28  Martin Baulig  <martin@ximian.com>
5674
5675         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5676         name when looking up the base class of a nested class.  Fixes #46977.
5677
5678 2003-07-26  Martin Baulig  <martin@ximian.com>
5679
5680         * expression.cs (Indexers.Indexer): New nested struct; contains
5681         getter, setter and the indexer's type.
5682         (Indexers.Properties): This is now an ArrayList of
5683         Indexers.Indexer's.
5684         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5685         indexer doesn't have any getters.
5686
5687         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5688         for embedded property and indexer assignments.
5689
5690 2003-07-26  Martin Baulig  <martin@ximian.com>
5691
5692         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5693         preprocessor directive is not the first non-whitespace character
5694         on a line.
5695
5696 2003-07-26  Martin Baulig  <martin@ximian.com>
5697
5698         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5699         namespace parsing, follow the spec more closely.
5700
5701         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5702         NamespaceEntry.Lookup().
5703
5704 2003-07-25  Martin Baulig  <martin@ximian.com>
5705
5706         * MethodCore.cs (OverridesSomething): New public field; it's set
5707         from TypeContainer.DefineMembers if this method overrides
5708         something (which doesn't need to be a method).  Fix #39462.
5709
5710 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5711
5712         * typemanager.cs (GetMembers): Ensure that the list of members is
5713         reversed. This keeps things in sync.
5714
5715         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5716         find an AttributeUsage attribute.
5717
5718         * expression.cs (Invocation.OverloadResolve): Perform the check
5719         which disallows Invoke to be directly called on a Delegate.
5720
5721         (Error_InvokeOnDelegate): Report error cs1533.
5722
5723 2003-07-25  Martin Baulig  <martin@ximian.com>
5724
5725         * expression.cs (Indexers.GetIndexersForType): Only look in the
5726         interface hierarchy if the requested type is already an
5727         interface.  Fixes #46788 while keeping #46502 fixed.
5728
5729 2003-07-25  Martin Baulig  <martin@ximian.com>
5730
5731         * class.cs (TypeContainer.DefineMembers): Check whether all
5732         readonly fields have been assigned and report warning CS0649 if
5733         not.
5734
5735         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5736         a valuetype.
5737
5738 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5739
5740         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5741         returned from GetMethods to make things consistent with the
5742         assumptions MCS makes about ordering of methods.
5743
5744         This should comprehensively fix bug #45127 and it does :-)
5745
5746         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5747         ordering is actually reverse.
5748
5749         * Clean up some debug messages I left lying around.
5750
5751         * interface.cs (Populate*): Get rid of code which emits attributes
5752         since the stage in which we emit attributes is the 'Emit' stage,
5753         not the define stage.
5754
5755         (Emit): Move attribute emission for interface members here.
5756
5757 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5758
5759         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5760         closely: we eliminate methods in base types when we have an
5761         applicable method in a top-level type.
5762
5763         Please see section 14.5.5.1 for an exact description of what goes
5764         on. 
5765
5766         This fixes bug #45127 and a host of other related to corlib compilation.
5767
5768         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5769         array is the method corresponding to the top-level type (this is
5770         because of the changes made to icall.c) so we change this
5771         accordingly.
5772
5773         (MethodGroupExpr.Name): This too.
5774
5775         * typemanager.cs (GetElementType): New method which does the right
5776         thing when compiling corlib. 
5777
5778         * everywhere: Make use of the above in the relevant places.
5779
5780 2003-07-22  Martin Baulig  <martin@ximian.com>
5781
5782         * cs-parser.jay (invocation_expression): Moved
5783         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5784         `cast_expression', but create a InvocationOrCast which later
5785         resolves to either an Invocation or a Cast.
5786
5787         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5788         method; call this before EmitStatement() to make sure that this
5789         expression can be used as a statement.
5790
5791         * expression.cs (InvocationOrCast): New class; resolves to either
5792         an Invocation or a Cast.
5793
5794         * statement.cs (StatementExpression): Call ResolveStatement() on
5795         the ExpressionStatement before emitting it.
5796
5797 2003-07-21  Martin Baulig  <martin@ximian.com>
5798
5799         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5800         `ref' and `out' attributes match; fixes #46220.
5801         (MemberAccess.ResolveMemberAccess): You can't reference a type
5802         through an expression; fixes #33180.
5803         (Indexers.GetIndexersForType): Don't return the indexers from
5804         interfaces the class implements; fixes #46502.
5805
5806 2003-07-21  Martin Baulig  <martin@ximian.com>
5807
5808         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5809         CS0661 checks; fixes bug #30442.
5810
5811 2003-07-21  Martin Baulig  <martin@ximian.com>
5812
5813         * decl.cs (AdditionResult): Added `Error'.
5814
5815         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5816
5817         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5818         makes cs0031.cs actually work.
5819
5820 2003-07-20  Martin Baulig  <martin@ximian.com>
5821
5822         * namespace.cs: Fixed that bug which caused a crash when compiling
5823         the debugger's GUI.
5824
5825 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5826
5827         * typemanager.cs (LookupTypeReflection): Never expose types which
5828         are NotPublic, NestedPrivate, NestedAssembly, or
5829         NestedFamANDAssem.  We used to return these, and later do a check
5830         that would report a meaningful error, but the problem is that we
5831         would not get the real match, if there was a name override.
5832
5833 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5834
5835         * namespace.cs (Namespace, Name): Do not compute the namespace
5836         name dynamically, compute it in the constructor.  This reduced
5837         memory usage by 1697 KB.
5838
5839         * driver.cs: Use --pause to pause at the end.
5840
5841 2003-07-17  Peter Williams  <peter@newton.cx>
5842
5843         * Makefile: Change the name of the test target so that it doesn't
5844         conflict with the recursive test target.
5845
5846 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5847
5848         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5849         AddressOf): Do not use EmitThis, that was wrong, use the actual
5850         this pointer.
5851
5852 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5853
5854         * class.cs (MethodData.Define): While checking if a method is an
5855         interface implementation, improve the test: If we are not public
5856         (use new test here: use the computed MethodAttributes directly,
5857         instead of the parsed modifier flags) check if the `implementing'
5858         method comes from an interface or not.
5859
5860         * pending.cs (VerifyPendingMethods): Slightly better error
5861         message.
5862
5863         * makefile: add test target that does the mcs bootstrap.
5864
5865 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5866
5867         * interface.cs (Define): Do nothing here since there are no
5868         members to populate etc. Move the attribute emission out of here
5869         since this was just totally the wrong place to put it. Attribute
5870         application happens during the 'Emit' phase, not in the 'Define'
5871         phase.
5872
5873         (Emit): Add this method and move the attribute emission here
5874
5875         * rootcontext.cs (EmitCode): Call the Emit method on interface
5876         types too.
5877
5878 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5879
5880         * expression.cs (OverloadResolve): Report error only if Location
5881         is not 'Null' which means that there was a probe going on.
5882
5883 2003-07-14  Martin Baulig  <martin@ximian.com>
5884
5885         * expression.cs (ConditionalLogicalOperator): New public class to
5886         implement user defined conditional logical operators.
5887         This is section 14.11.2 in the spec and bug #40505.
5888
5889 2003-07-14  Martin Baulig  <martin@ximian.com>
5890
5891         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5892
5893 2003-07-14  Martin Baulig  <martin@ximian.com>
5894
5895         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5896
5897         * ecore.cs (IVariable.VerifyFixed): New interface method.
5898
5899         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5900         operator, check whether the variable is actually fixed.  Fixes bug
5901         #36055.  Set a variable definitely assigned when taking its
5902         address as required by the spec.
5903
5904         * statement.cs (LocalInfo.IsFixed): New field.
5905         (LocalInfo.MakePinned): Set `IsFixed' to true.
5906
5907 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5908
5909         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5910         for .ctors, ensure that we only ask for members declared in the
5911         attribute type (BindingFlags.DeclaredOnly).
5912
5913         Fixes bug #43632.
5914
5915         * expression.cs (Error_WrongNumArguments): Report error 1501
5916         correctly the way CSC does.
5917
5918 2003-07-13  Martin Baulig  <martin@ximian.com>
5919
5920         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5921         lookup on the fully qualified name, to make things like "X.X" work
5922         where "X.X" is a fully qualified type name, but we also have a
5923         namespace "X" in the using list.  Fixes #41975.
5924
5925 2003-07-13  Martin Baulig  <martin@ximian.com>
5926
5927         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5928         function. If we're a CompoundAssign, we need to create an embedded
5929         CompoundAssign, not an embedded Assign.
5930         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5931         Fixes #45854.
5932
5933 2003-07-13  Martin Baulig  <martin@ximian.com>
5934
5935         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5936         work to fix bug #46088.
5937
5938 2003-07-13  Ravi Pratap <ravi@ximian.com>
5939
5940         * class.cs (Operator.Emit): Do not emit attributes here - it is
5941         taken care of by the Method class that we delegate too. This takes
5942         care of bug #45876.
5943
5944 2003-07-10  Martin Baulig  <martin@ximian.com>
5945
5946         * expression.cs (TypeOfVoid): New class.
5947         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5948
5949 2003-07-10  Martin Baulig  <martin@ximian.com>
5950
5951         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5952         bug #35957.
5953
5954 2003-07-10  Martin Baulig  <martin@ximian.com>
5955
5956         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5957         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5958
5959         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5960
5961         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5962
5963 2003-07-10  Martin Baulig  <martin@ximian.com>
5964
5965         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5966         of decimal.  Fixes #42850.
5967
5968         NOTE: I also fixed the created byte blob, but this doesn't work on
5969         the MS runtime and csc never produces any byte blobs for decimal
5970         arrays.
5971
5972 2003-07-10  Martin Baulig  <martin@ximian.com>
5973
5974         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5975         structs; fixes #32068.
5976         (Block.AddChildVariableNames): Fixed #44302.
5977
5978 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5979
5980         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5981
5982 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5983
5984         * attribute.cs: And this test is onger needed.
5985
5986 2003-07-08  Martin Baulig  <martin@ximian.com>
5987
5988         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5989         inaccessible types.  Fixes #36313.
5990
5991         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5992
5993         * namespace.cs (NamespaceEntry): Create implicit entries for all
5994         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5995         implicit entries for N1.N2 and N1.
5996
5997 2003-07-08  Martin Baulig  <martin@ximian.com>
5998
5999         Rewrote the handling of namespaces to fix a lot of the issues
6000         wrt. `using' aliases etc.
6001
6002         * namespace.cs (Namespace): Splitted this class into a
6003         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6004
6005         * typemanager.cs (TypeManager.IsNamespace): Removed.
6006         (TypeManager.ComputeNamespaces): Only compute namespaces from
6007         loaded assemblies here, not the namespaces from the assembly we're
6008         currently compiling.
6009
6010 2003-07-08  Martin Baulig  <martin@ximian.com>
6011
6012         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6013
6014 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6015
6016         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6017         already fixed it.  
6018
6019         I thought about the memory savings here, but LookupTypeReflection
6020         is used under already very constrained scenarios.  Compiling
6021         corlib or mcs only exposes one hit, so it would not really reduce
6022         any memory consumption.
6023
6024 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6025
6026         * typemanager.cs: fixes bug #45889 by only adding public types from
6027         other assemblies to the list of known types.
6028
6029 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6030
6031         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6032         on the type we resolved.
6033
6034 2003-07-05  Martin Baulig  <martin@ximian.com>
6035
6036         * pending.cs (PendingImplementation.ParentImplements): Don't
6037         create the proxy if the parent is abstract.
6038
6039         * class.cs (TypeContainer.DefineIndexers): Process explicit
6040         interface implementations first.  Fixes #37714.
6041
6042 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6043
6044         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6045         defined recursively;  but since we modify the input parameters
6046         (left is set to `this' temporarily), we reset this value if the
6047         left_is_explicit is false, which gives the original semantics to
6048         the code.  
6049
6050         * literal.cs (NullPointer): new class used to represent a null
6051         literal in a pointer context.
6052
6053         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6054         type is a pointer, use a NullPointer object instead of a
6055         NullLiteral.   Closes 43687
6056
6057         (ExplicitConversion): Convert pointer values using
6058         the conv opcode to the proper type.
6059
6060         * ecore.cs (New): change ValueTypeVariable property into a method,
6061         that returns whether the valuetype is suitable for being used.
6062
6063         * expression.cs (Binary.DoNumericPromotions): Only return if we
6064         the int constant was a valid uint, and we can return both left and
6065         right as uints.  If not, we continue processing, to trigger the
6066         type conversion.  This fixes 39018.
6067
6068         * statement.cs (Block.EmitMeta): During constant resolution, set
6069         the CurrentBlock property on the emitcontext, so that we resolve
6070         constants propertly.
6071
6072 2003-07-02  Martin Baulig  <martin@ximian.com>
6073
6074         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6075         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6076
6077         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6078         than emitting it here.
6079
6080         * statement.cs: Fixed some more flow analysis bugs.
6081
6082 2003-07-02  Martin Baulig  <martin@ximian.com>
6083
6084         * class.cs (MethodData.Define): When implementing interface
6085         methods, set Final unless we're Virtual.
6086
6087         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6088         check work for interface methods.
6089
6090 2003-07-01  Martin Baulig  <martin@ximian.com>
6091
6092         * ecore.cs (EmitContext.This): Replaced this property with a
6093         GetThis() method which takes a Location argument.  This ensures
6094         that we get the correct error location for a CS0188.
6095
6096 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6097
6098         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6099         ImplicitStandardConversion.
6100
6101         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6102
6103 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6104
6105         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6106         optimization.
6107
6108 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6109
6110         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6111         constructors.
6112
6113         (MethodData.Define): Turn off initlocals for unsafe methods.
6114
6115 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6116
6117         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6118         complete;  Fixes #37521.
6119
6120         * delegate.cs: Use Modifiers.TypeAttr to compute the
6121         TypeAttributes, instead of rolling our own.  This makes the flags
6122         correct for the delegates.
6123
6124 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6125
6126         * class.cs (Constructor.Define): Set the private flag for static
6127         constructors as well.
6128
6129         * cs-parser.jay (statement_expression): Set the return value to
6130         null, to avoid a crash when we catch an error.
6131
6132 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6133
6134         * cs-parser.jay: Applied patch from Jackson that adds support for
6135         extern and unsafe modifiers to destructor declarations.
6136
6137         * expression.cs: Report error 21 if the user is trying to index a
6138         System.Array.
6139
6140         * driver.cs: Add an error message, suggested by the bug report.
6141
6142         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6143         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6144
6145 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6146
6147         * namespace.cs: Add some information to reduce FAQs.
6148
6149 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6150
6151         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6152         underlying enumeration types.  Fixes #43915.
6153
6154         * expression.cs: Treat ushort/short as legal values to be used in
6155         bitwise operations.
6156
6157 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6158
6159         * delegate.cs: transfer custom attributes for paramenters from
6160         the delegate declaration to Invoke and BeginInvoke.
6161
6162 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6163
6164         * attribute.cs: handle custom marshalers and emit marshal info
6165         for fields, too.
6166
6167 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6168
6169         * makefile.gnu: Added anonymous.cs to the compiler sources.
6170
6171 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6172
6173         * iterators.cs: Change the name of the proxy class to include two
6174         underscores.
6175
6176         * cs-parser.jay: Update grammar to include anonymous methods.
6177
6178         * anonymous.cs: new file.
6179
6180 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6181
6182         * class.cs (Field.Define): Add missing test for pointers and
6183         safety. 
6184
6185 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6186
6187         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6188         we use the stobj opcode.
6189
6190         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6191         since it wasn't the correct fix. 
6192
6193         It still is puzzling that we are required to use stobj for IntPtr
6194         which seems to be a ValueType.
6195
6196 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6197
6198         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6199         during regular simple name resolution.   Now, the trick is that
6200         instead of returning for processing the simplename, we do a
6201         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6202         contextual lookup type).   If a match is found, return that, if
6203         not, return for further composition.
6204
6205         This fixes long-standing 30485.
6206
6207         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6208         using the address to initialize an object, do an Stobj instead of
6209         using the regular Stelem.
6210
6211         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6212         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6213         Because if we are a BaseIndexerAccess that value will be true.
6214         Fixes 43643.
6215
6216         * statement.cs (GotoCase.Resolve): Return after reporting an
6217         error, do not attempt to continue. 
6218
6219         * expression.cs (PointerArithmetic.Emit): If our operand is a
6220         long, convert our constants to match the operand before
6221         multiplying.  Convert to I type before adding.   Fixes 43670.
6222
6223 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6224
6225         * enum.cs (ImplicitConversionExists) : Rename to
6226         ImplicitEnumConversionExists to remove ambiguity. 
6227
6228         * ecore.cs (NullCast): New type of cast expression class which
6229         basically is very similar to EmptyCast with the difference being
6230         it still is a constant since it is used only to cast a null to
6231         something else
6232         (eg. (string) null)
6233
6234         * convert.cs (ImplicitReferenceConversion): When casting a null
6235         literal, we return a NullCast.
6236
6237         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6238         should be around anymore.
6239
6240         The renaming (reported was slightly wrong). Corrections:
6241
6242         ConvertImplicitStandard -> ImplicitConversionStandard
6243         ConvertExplicitStandard -> ExplicitConversionStandard
6244
6245         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6246         before passing them in !
6247
6248         * convert.cs (ImplicitConversionStandard): When comparing for
6249         equal expr and target types, ensure that expr is not a
6250         NullLiteral.
6251
6252         In general, we must not be checking (expr_type ==
6253         target_type) in the top level conversion methods
6254         (ImplicitConversion, ExplicitConversion etc). This checking is
6255         done in the methods that they delegate to.
6256
6257 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6258
6259         * convert.cs: Move Error_CannotConvertType,
6260         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6261         ImplicitNumericConversion, ImplicitConversionExists,
6262         ImplicitUserConversionExists, StandardConversionExists,
6263         FindMostEncompassedType, FindMostSpecificSource,
6264         FindMostSpecificTarget, ImplicitUserConversion,
6265         ExplicitUserConversion, GetConversionOperators,
6266         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6267         TryImplicitIntConversion, Error_CannotConvertImplicit,
6268         ConvertImplicitRequired, ConvertNumericExplicit,
6269         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6270         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6271         its own file.
6272
6273         Perform the following renames:
6274
6275         StandardConversionExists -> ImplicitStandardConversionExists
6276         ConvertImplicit -> ImplicitConversion
6277         ConvertImplicitStandard -> ImplicitStandardConversion
6278         TryImplicitIntConversion -> ImplicitIntConversion
6279         ConvertImplicitRequired -> ImplicitConversionRequired
6280         ConvertNumericExplicit -> ExplicitNumericConversion
6281         ConvertReferenceExplicit -> ExplicitReferenceConversion
6282         ConvertExplicit -> ExplicitConversion
6283         ConvertExplicitStandard -> ExplicitStandardConversion
6284
6285 2003-05-19  Martin Baulig  <martin@ximian.com>
6286
6287         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6288         (TypeInfo): Added support for structs having structs as fields.
6289
6290         * ecore.cs (FieldExpr): Implement IVariable.
6291         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6292         VariableInfo for the field.
6293
6294 2003-05-18  Martin Baulig  <martin@ximian.com>
6295
6296         * expression.cs (This.DoResolve): Report a CS0027 if we're
6297         emitting a field initializer.
6298
6299 2003-05-18  Martin Baulig  <martin@ximian.com>
6300
6301         * expression.cs (This.ResolveBase): New public function.
6302         (This.DoResolve): Check for CS0188.
6303
6304         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6305         This.Resolve().
6306
6307         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6308         `instance_expression' to null if we don't have any non-static
6309         methods.
6310
6311 2003-05-18  Martin Baulig  <martin@ximian.com>
6312
6313         Reworked the way how local variables and parameters are handled by
6314         the flow analysis code.
6315
6316         * statement.cs (TypeInfo, VariableMap): New public classes.
6317         (VariableInfo): New public class.  This is now responsible for
6318         checking whether a variable has been assigned.  It is used for
6319         parameters and local variables.
6320         (Block.EmitMeta): Take the InternalParameters as argument; compute
6321         the layout of the flow vectors here.
6322         (Block.LocalMap, Block.ParameterMap): New public properties.
6323         (FlowBranching): The .ctor doesn't get the InternalParameters
6324         anymore since Block.EmitMeta() now computes the layout of the flow
6325         vector.
6326         (MyStructInfo): This class is now known as `StructInfo' and nested
6327         in `TypeInfo'; we don't access this directly anymore.
6328
6329         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6330         property and removed IsAssigned(), IsFieldAssigned(),
6331         SetAssigned() and SetFieldAssigned(); we now call them on the
6332         VariableInfo so we don't need to duplicate this code everywhere.
6333
6334         * expression.cs (ParameterReference): Added `Block block' argument
6335         to the .ctor.
6336         (LocalVariableReference, ParameterReference, This): The new
6337         VariableInfo class is now responsible for all the definite
6338         assignment stuff.
6339
6340         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6341         IsParameterAssigned, SetParameterAssigned): Removed.
6342
6343 2003-05-18  Martin Baulig  <martin@ximian.com>
6344
6345         * typemanager.cs (InitCoreTypes): Try calling
6346         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6347         the 3-args-version.  Corlib now also needs our `void_type'.
6348         (GetMethod): Added overloaded version which takes an optional
6349         `bool report_errors' to allow lookups of optional methods.
6350
6351 2003-05-12  Martin Baulig  <martin@ximian.com>
6352
6353         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6354         only used for locals and not for parameters.
6355
6356 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6357
6358         * support.cs (InternalParameters.ParameterType): Return the
6359         ExternalType of the parameter.
6360
6361         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6362         they were unused.
6363
6364 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6365
6366         * class.cs (MethodData.Define): Do not set the `newslot' on
6367         interface members, if they are also flagged as "override".
6368
6369         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6370         better code for ++i and i++.  This only works for static fields
6371         and local variables.
6372
6373         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6374         want to pull the DeclSpace out of the builder_to_declspace instead
6375         of the TypeBuilder (like in TypeContainer.FindMembers).
6376
6377         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6378         instead of LookupTypeContainer.  Fixes the crash on .NET for
6379         looking up interface members.
6380
6381         * const.cs: Create our own emit context during the Definition
6382         stage, so that constants are evaluated in the proper context, when
6383         a recursive definition happens.
6384
6385 2003-05-11  Martin Baulig  <martin@ximian.com>
6386
6387         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6388         new block for a switch section.
6389         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6390         the adding/lookup in the switch block.  Fixes #39828.
6391
6392 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6393
6394         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6395         functionality: I needed to convert the data after I had performed
6396         the add/sub operation into the operands type size.
6397
6398         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6399         pass the type for the box operation, otherwise the resulting
6400         object would have been of type object.
6401
6402         (BoxedCast): Add constructor to specify the type to box as.
6403
6404 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6405
6406         * iterators.cs: I was reusing the `count' variable inadvertently,
6407         take steps to not allow this to happen.
6408
6409 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6410
6411         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6412         by creating an array at the point where the params starts and
6413         putting all those arguments there, then adjusting the size of the
6414         array.
6415
6416 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6417
6418         * expression.cs (New.AddressOf): Implement interface
6419         IMemoryLocation.  This is used when the `new' operator is used in
6420         the context of an invocation to a method on a value type.
6421
6422         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6423         example. 
6424
6425         * namespace.cs: Also check the using aliases here.
6426
6427         * driver.cs: Move the test for using validity after the types have
6428         been entered, so we do a single pass that also includes the using
6429         aliases. 
6430
6431         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6432         in the regular case.   CreateSiblingForFinally is doing extra
6433         error checking.
6434
6435         * attribute.cs (GetAttributeArgumentExpression): Store the result
6436         on an out value, and use the return value to indicate failure
6437         instead of using null (which is a valid return for Constant.GetValue).
6438
6439         * statement.cs: Perform the analysis flow for the increment
6440         portion after the statement, because this will be the real flow of
6441         execution.  Fixes #42385
6442
6443         * codegen.cs (EmitContext.EmitArgument,
6444         EmitContext.EmitStoreArgument): New helper functions when the
6445         RemapToProxy flag is set.
6446
6447         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6448         function.
6449
6450         Add support for remapping parameters. 
6451
6452         * iterators.cs: Propagate parameter values;  Store parameter
6453         values in the proxy classes.
6454
6455 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6456
6457         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6458         need a proxy reference;  I do not know what I was thinking
6459
6460         * cs-parser.jay (constructor_initializer): catch another error,
6461         and display nice message.
6462
6463         (field_declaration): catch void field declaration
6464         to flag a better error. 
6465
6466         * class.cs (MemberBase.CheckBase): Report an error instead of a
6467         warning if a new protected member is declared in a struct. 
6468         (Field.Define): catch the error of readonly/volatile.
6469
6470         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6471
6472         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6473         volatile variable is taken
6474
6475 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6476
6477         * statement.cs (Fixed.Resolve): Report an error if we are not in
6478         an unsafe context.
6479
6480 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6481
6482         * typemanager.cs: reuse the code that handles type clashes for
6483         delegates and enumerations.
6484
6485         * class.cs (Report28): Always report.
6486
6487         * expression.cs (EncodeAsAttribute): Allow nulls here.
6488
6489 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6490
6491         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6492         the functionality for testing whether an expression is valid for
6493         an attribute here.  Also handle the case of arrays of elements
6494         being stored. 
6495
6496         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6497         encoding a linear array into an array of objects that are suitable
6498         to be passed to an CustomAttributeBuilder.
6499
6500         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6501
6502         * ecore.cs: (FieldExpr): Handle field remapping here.
6503
6504         * iteratators.cs: Pass the instance variable (if the method is an
6505         instance method) to the constructors, so we can access the field
6506         variables on the class.
6507
6508         TODO: Test this with structs.  I think the THIS variable on
6509         structs might have to be a pointer, and not a refenrece
6510
6511 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6512
6513         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6514         local variables to fields in a proxy class.
6515
6516         * iterators.cs (PopulateProxy): Rename our internal fields to
6517         <XXX>.  
6518         Create a <THIS> field if we are an instance method, so we can
6519         reference our parent container variables.
6520         (MapVariable): Called back from the EmitContext code to enter a
6521         new variable to field mapping into the proxy class (we just create
6522         a FieldBuilder).
6523
6524         * expression.cs
6525         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6526         for using the remapped locals to fields.
6527
6528         I placed the code here, because that gives the same semantics to
6529         local variables, and only changes the Emit code.
6530
6531         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6532         statements inside iterators.
6533         (VariableInfo): Add a FieldBuilder for the cases when we are
6534         remapping local variables to fields in a proxy class
6535
6536         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6537         current_block != null.
6538
6539         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6540         not cope with strings, as it has been moved to the
6541         TableSwitchEmit.  Fixed bug in switch generation.
6542
6543         * expression.cs (New.DoResolve): Provide more context for the user
6544         when reporting an error.
6545
6546         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6547         pointers. 
6548
6549         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6550         check the permissions for it.  Note than in a type-resolution
6551         context the check was already present in DeclSpace.ResolveType,
6552         but was missing from the MemberAccess.
6553
6554         (ArrayCreation.CheckIndices): warn if the user has
6555         more nested levels of expressions, but there are no more
6556         dimensions specified.  Avoids crash on bug 41906.
6557
6558 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6559
6560         * statement.cs (Block): replace Implicit bool, for a generic
6561         flags.   
6562         New flag: `Unchecked'.  This is used during the EmitMeta phase
6563         (which is out-of-line with the regular Resolve/Emit process for a
6564         statement, as this is done ahead of time, but still gets a chance
6565         to call constant resolve).
6566
6567         (Block.Flags): new enum for adding a new flag.
6568
6569         (Block.EmitMeta): track the state of unchecked.
6570
6571         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6572         to enable constant resolution to work there as well.
6573
6574 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6575
6576         * typemanager.cs (ienumerable_type): Also look up
6577         System.Collections.IEnumerable. 
6578
6579 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6580
6581         TODO: Test more than one conditional per method.
6582
6583         * class.cs (Indexer.Define): Report the location where the user is
6584         referencing the unsupported feature.
6585
6586         (MethodData): Overload the use of `conditionals' to
6587         minimize the creation of needless ArrayLists.   This saves roughly
6588         212kb on my machine.
6589
6590         (Method): Implement the new IIteratorContainer interface.
6591         (Method.SetYields): Implement the method by setting the ModFlags
6592         to contain METHOD_YIELDS.
6593
6594         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6595         which just got set to null.
6596
6597         * iterators.cs: New file.
6598
6599         (Yield, YieldBreak): New statements.
6600
6601         * statement.cs (Return.Resolve): Flag an error if we are used in
6602         an iterator method.
6603
6604         * codegen.cs (InIterator): New flag set if the code is being
6605         compiled in an iterator method.
6606
6607         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6608         internal modifier, and we just use it to avoid adding extra
6609         fields, as this is seldom used.  
6610
6611         * cs-parser.jay: Add yield_statement (yield and yield break).
6612
6613         * driver.cs: New flag -v2 to turn on version 2 features. 
6614
6615         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6616         hashtable when v2 is enabled.
6617
6618 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6619
6620         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6621         there is already a namespace defined with this name.
6622
6623         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6624         people upgraded their corlibs.
6625
6626         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6627         always use fully qualified types, no need to use the compiler
6628         front end.
6629
6630         (TypeManager.IsNamespace): Use binarysearch.
6631
6632         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6633         AddDelegate): I did not quite use the new IsValid API properly: I
6634         have to pass the short-name and the fullname.  I was passing only
6635         the basename instead of the fullname sometimes. 
6636
6637         (TypeContainer.DefineType): call NamespaceClash.
6638
6639         * interface.cs (Interface.DefineType): use NamespaceClash before
6640         defining the type.
6641
6642         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6643         defining the type.
6644
6645         * enum.cs: (Enum.DefineType): use NamespaceClash before
6646         defining the type.
6647
6648         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6649         speed increase.  First, use the negative_hits cache when we get a
6650         negative.  Second, add the type with its full original name
6651         instead of the new . and + encoded name (reflection uses + to
6652         separate type from a nested type).  Use LookupTypeReflection
6653         directly which bypasses the type->name hashtable (that we already
6654         know does not contain the type.
6655
6656         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6657         location/container type. 
6658
6659         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6660
6661 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6662
6663         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6664
6665         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6666         method is being referenced in the method group from a static
6667         context, and report error 120 if so.
6668
6669         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6670         Error118. 
6671
6672         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6673         is created, we create the A namespace).
6674
6675         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6676         Fixes #41591
6677
6678 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6679
6680         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6681         invocation to ModuleBuilder.GetType with the same values will
6682         return a new type instance, so we need to cache its return
6683         values. 
6684
6685         * expression.cs (Binary.ResolveOperator): Only allow the compare
6686         operators on enums if they are of the same type.
6687
6688         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6689         types of ValueType on their own case.  Before we were giving them
6690         the same treatment as objects.
6691
6692         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6693         fullname.  Short name is used to compare against container name.
6694         Fullname is used to check against defined namespace names.
6695
6696         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6697         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6698
6699         (Method.CheckBase): Call parent.
6700         (MemberBase.CheckBase): Check for protected members on sealed
6701         classes.
6702         (PropertyBase.CheckBase): Call parent.
6703         (Field.Define): Call parent.
6704
6705         * report.cs: Negative error codes are now mapped to 8000 - code,
6706         so that the display is render more nicely.
6707
6708         * typemanager.cs: Do not use try/catch, instead report a regular
6709         error. 
6710
6711         (GetPointerType, GetReferenceType): These methods provide
6712         mechanisms to obtain the T* and T& from a T.  We had the code
6713         previously scattered around the code base, and it also used
6714         TypeManager.LookupType that would go through plenty of caches.
6715         This one goes directly to the type source.
6716
6717         In some places we did the Type.GetType followed by
6718         ModuleBuilder.GetType, but not in others, so this unifies the
6719         processing as well.
6720
6721         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6722         statements now that we have namespace information.
6723
6724         * typemanager.cs (IsNamespace): New method, returns whether the
6725         string presented is a namespace or not.
6726
6727         (ComputeNamespaces): New public entry point, computes the list of
6728         available namespaces, using the GetNamespaces API call in Mono, or
6729         the slower version in MS.NET.   
6730
6731         Now before we start the semantic analysis phase, we have a
6732         complete list of namespaces including everything that the user has
6733         provided.
6734
6735         Deleted old code to cache namespaces in .nsc files.
6736
6737 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6738
6739         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6740         class/struct location definition Location for the implicit
6741         constructor location.
6742
6743         (Operator.Define): Use the location of the operator for the
6744         implicit Method definition.
6745
6746         (Constructor.Emit): use the constructor location for the implicit
6747         base initializer constructor.
6748
6749         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6750         and the Expression class now contains two new methods:
6751
6752         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6753         isolate type lookup from the rest of the resolution process.
6754
6755         Since we use Expressions to hold type definitions due to the way
6756         we parse the input we have historically overloaded Resolve to
6757         perform the Type lookups if a special flag is passed.  Now this is
6758         eliminated and two methods take their place. 
6759
6760         The differences in the two methods between xStep and xTerminal is
6761         that xStep is involved in our current lookup system that uses
6762         SimpleNames to compose a name, while xTerminal is used just to
6763         catch the case where the simplename lookup failed.
6764
6765 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6766
6767         * expression.cs (ResolveMemberAccess): Remove redundant code.
6768         TypeExpr expressions are always born fully resolved.
6769
6770         * interface.cs (PopulateMethod): Do not lookup the types twice.
6771         We were doing it once during SemanticAnalysis and once during
6772         PopulateMethod.
6773
6774         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6775         in local variable type definitions, were being returned as a
6776         SimpleName (we decomposed everything into a string), that is
6777         because primary_expression was being used instead of a type in the
6778         grammar (reduce/reduce conflicts).
6779
6780         The part that was wrong is that we converted the expression into a
6781         string (an oversimplification in one hand, compounded with primary
6782         expressions doing string concatenation).
6783
6784         So things like:
6785
6786         A.B.C [] x;
6787
6788         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6789         using clauses from working on this particular context.  And a type
6790         was being matched directly against "A.B.C[]".
6791
6792         We now use the correct approach, and allow for ComposedCast to be
6793         part of the unary expression.  So the "A.B.C []" become a composed
6794         cast of "A.B.C" (as a nested group of MemberAccess with a
6795         SimpleName at the end) plus the rank composition "[]". 
6796
6797         Also fixes 35567
6798
6799 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6800
6801         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6802         for the access level checking.
6803
6804         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6805         `TypeContainer container', because I kept getting confused when I
6806         was debugging this code.
6807
6808         * expression.cs (Indexers): Instead of tracking getters/setters,
6809         we now track them in parallel.  We create one arraylist less, but
6810         most importantly it is possible now for the LValue code to find a
6811         matching get for a set.
6812
6813         (IndexerAccess.DoResolveLValue): Update the code.
6814         GetIndexersForType has been modified already to extract all the
6815         indexers from a type.  The code assumed it did not.
6816
6817         Also make the code set the correct return type for the indexer.
6818         This was fixed a long time ago for properties, but was missing for
6819         indexers.  It used to be void_type.
6820
6821         (Binary.Emit): Test first for doubles instead of
6822         floats, as they are more common.
6823
6824         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6825         when dealing with floats and the <=, >= operators.  This fixes bug
6826         #39314 
6827
6828         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6829         to load the array value by emitting a load on the foreach variable
6830         type.  This was incorrect.  
6831
6832         We now emit the code to load an element using the the array
6833         variable type, and then we emit the conversion operator.
6834
6835         Fixed #40176
6836
6837 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6838
6839         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6840
6841 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6842
6843         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6844         test for protection before we test for signatures. 
6845
6846         (MethodSignature.ToString): implement.
6847
6848         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6849         to the case where we reduced into a LongConstant.
6850
6851         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6852         depend on whether the information is acurrate, because the
6853         Microsoft runtime will always claim that the array type is public,
6854         regardless of the real state.
6855
6856         If the type is a pointer, another problem happens: the type is
6857         reported as non-public in Microsoft.  
6858
6859         In both cases we have to call CheckAccessLevel recursively with
6860         the underlying type as the argument to be tested.
6861
6862 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6863
6864         * assign.cs (Assign.Emit): If we are dealing with a compound
6865         assignment expression, we should use the code path that stores the
6866         intermediate result in a temporary value.  This fixes #40903.
6867
6868         *expression.cs (Indirection.ToString): Provide ToString method for
6869         debugging. 
6870
6871 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6872
6873         * class.cs: Null out fields holding references to Block objects so
6874         they can be garbage collected.
6875
6876         * expression.cs (OverloadResolve): Remove unused local.
6877
6878 2003-04-07  Martin Baulig  <martin@ximian.com>
6879
6880         * codegen.cs (EmitContext.CurrentFile): New public field.
6881         (EmitContext.Mark): Use the CurrentFile to check whether the
6882         location is in the correct file.
6883         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6884
6885 2003-04-07  Martin Baulig  <martin@ximian.com>
6886
6887         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6888
6889         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6890         location.  [FIXME: The location argument which gets passed to this
6891         method is sometimes wrong!]
6892
6893 2003-04-07  Nick Drochak <ndrochak@gol.com>
6894
6895         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6896
6897 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6898
6899         * expression.cs (Indirection.EmitAssign): We were using the
6900         temporary, but returning immediately instead of continuing the
6901         EmitAssing flow.
6902
6903 2003-04-06  Martin Baulig  <martin@ximian.com>
6904
6905         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6906         if it's a nested child, but also deriving from the outer class.
6907         See test 190.cs.
6908
6909         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6910         nested child, but also deriving from the outer class.  See
6911         test-190.cs.
6912         (FilterWithClosure): We may access private members of the outer
6913         class if we're a nested child and deriving from the outer class.
6914         (RealMemberLookup): Only set `closure_private_ok' if the
6915         `original_bf' contained BindingFlags.NonPublic.
6916
6917 2003-04-05  Martin Baulig  <martin@ximian.com>
6918
6919         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
6920
6921 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6922
6923         * class.cs (Event.Define): Do not allow abstract events to have
6924         initializers. 
6925
6926 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6927
6928         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6929         block in event declarations.
6930
6931         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6932         value type, get its address.
6933
6934         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6935         leaving a class on the stack instead of a boolean value (int
6936         0/1).  Change the code so we compare against null, and then the
6937         result against zero.
6938
6939         * class.cs (TypeContainer.GetClassBases): We were checking for the
6940         parent class being sealed too late.
6941
6942         * expression.cs (Binary.Emit): For <= and >= when dealing with
6943         floating point values, use cgt.un and clt.un instead of cgt and
6944         clt alone.
6945
6946 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6947
6948         * statement.cs: Apply the same optimization as MS: skip the 
6949         GetEnumerator returning an IEnumerator, and use the one returning a 
6950         CharEnumerator instead. This allows us to avoid the try-finally block 
6951         and the boxing.
6952
6953 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6954
6955         * cs-parser.jay: Attributes cannot be applied to
6956                          namespaces. Fixes #40473
6957
6958 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6959
6960         * class.cs:
6961         (Add*): check if the name is valid using the full name for constants,
6962         fields, properties and events.
6963
6964 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6965
6966         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6967         char constants to be part of the enumeration.
6968
6969         * expression.cs (Conditional.DoResolve): Add support for operator
6970         true. Implements the missing functionality from 14.12
6971
6972         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6973         operator true/false as required by the spec.
6974
6975         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6976         implicit conversion to boolean.
6977
6978         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6979         also one where the type implements `operator true'. 
6980
6981         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6982         get an expression that will invoke operator true based on an
6983         expression.  
6984
6985         (GetConversionOperators): Removed the hack that called op_True
6986         here.  
6987
6988         (Expression.ResolveBoolean): Move this from Statement.
6989
6990 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6991
6992         * ecore.cs (FieldExpr): do not allow initialization of initonly
6993         fields on derived classes
6994
6995 2003-03-13  Martin Baulig  <martin@ximian.com>
6996
6997         * statement.cs (Block.Emit): Call ig.BeginScope() and
6998         ig.EndScope() when compiling with debugging info; call
6999         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7000
7001 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7002
7003         * expression.cs (Indexers): Do not construct immediately, allow
7004         for new members to be appended as we go.  Fixes 38143
7005
7006 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7007
7008         * expression.cs: save/restore context when resolving an unchecked
7009         expression.
7010
7011 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7012
7013         * cfold.cs: Catch division by zero in modulus operator during
7014         constant folding.
7015
7016 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7017
7018         * interface.cs (Interface.DefineMembers): Avoid defining members
7019         twice. 
7020
7021 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7022
7023         * driver.cs: handle the +/- options for -noconfig
7024
7025         * statement.cs (Unckeched.Resolve): Also track the state of
7026         unchecked in the Resolve phase.
7027
7028 2003-02-27  Martin Baulig  <martin@ximian.com>
7029
7030         * ecore.cs (Expression.MemberLookup): Don't create a
7031         MethodGroupExpr for something which is not a method.  Fixes #38291.
7032
7033 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7034
7035         * class.cs (MemberBase.CheckParameters): Also check that the type
7036         is unmanaged if it is a pointer.
7037
7038         * expression.cs (SizeOf.Resolve): Add location information.
7039
7040         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7041         a managed type is declared.
7042
7043         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7044         parameter modifiers as well.  Fixes bug 38606
7045
7046         * class.cs: Very sad.  Am backing out the speed up changes
7047         introduced by the ArrayList -> Array in the TypeContainer, as they
7048         were not actually that much faster, and introduced a bug (no error
7049         reports on duplicated methods).
7050
7051         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7052         source first, this will guarantee that we have a valid expression
7053         before calling in lower levels functions that will require a
7054         resolved object.  Then use this original_source in the
7055         target.ResolveLValue instead of the original source that was
7056         passed to us.
7057
7058         Another change.  Use target.Resolve instead of LValueResolve.
7059         Although we are resolving for LValues, we will let the Assign code
7060         take care of that (it will be called again from Resolve).  This
7061         basically allows code like this:
7062
7063         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7064         class Y { void A (X x) { x [0] += o; }
7065
7066         The problem was that the indexer was trying to resolve for
7067         set_Item (idx, object o) and never finding one.  The real set_Item
7068         was set_Item (idx, X).  By delaying the process we get the right
7069         semantics. 
7070
7071         Fixes bug 36505
7072
7073 2003-02-23  Martin Baulig  <martin@ximian.com>
7074
7075         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7076         while calling DoEmit ().
7077
7078         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7079         source files; if you use the #line directive inside a method, the
7080         compiler stops emitting line numbers for the debugger until it
7081         reaches the end of the method or another #line directive which
7082         restores the original file.
7083
7084 2003-02-23  Martin Baulig  <martin@ximian.com>
7085
7086         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7087
7088 2003-02-23  Martin Baulig  <martin@ximian.com>
7089
7090         * statement.cs (Block.AddChildVariableNames): We need to call this
7091         recursively, not just for our immediate children.
7092
7093 2003-02-23  Martin Baulig  <martin@ximian.com>
7094
7095         * class.cs (Event.Define): Always make the field private, like csc does.
7096
7097         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7098         actually work, fixes bug #37521.
7099
7100 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7101
7102         * delegate.cs: When creating the various temporary "Parameters"
7103         classes, make sure that we call the ComputeAndDefineParameterTypes
7104         on those new parameters (just like we do with the formal ones), to
7105         allow them to be resolved in the context of the DeclSpace.
7106
7107         This fixes the bug that Dick observed in Bugzilla #38530.
7108
7109 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7110
7111         * expression.cs (ResolveMemberAccess): When resolving a constant,
7112         do not attempt to pull a constant if the value was not able to
7113         generate a valid constant.
7114
7115         * const.cs (LookupConstantValue): Do not report more errors than required.
7116
7117 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7118
7119         * expression.cs: fixes bug #38328.
7120
7121 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7122
7123         * class.cs: Changed all the various members that can be part of a
7124         class from being an ArrayList to be an Array of the right type.
7125         During the DefineType type_list, interface_list, delegate_list and
7126         enum_list are turned into types, interfaces, delegates and enums
7127         arrays.  
7128
7129         And during the member population, indexer_list, event_list,
7130         constant_list, field_list, instance_constructor_list, method_list,
7131         operator_list and property_list are turned into their real arrays.
7132
7133         Although we could probably perform this operation earlier, for
7134         good error reporting we need to keep the lists and remove the
7135         lists for longer than required.
7136
7137         This optimization was triggered by Paolo profiling the compiler
7138         speed on the output of `gen-sample-program.pl' perl script. 
7139
7140         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7141         not crash in methods like MemberLookupFailed that use this field.  
7142
7143         This problem arises when the compiler fails to resolve a type
7144         during interface type definition for example.
7145
7146 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7147
7148         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7149         inherit from System.Object, so we have to stop at null, not only
7150         when reaching System.Object.
7151
7152 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7153
7154         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7155         DeclaredOnly because the parent indexer might have had a different
7156         name, but did not loop until the top of the hierarchy was reached.
7157
7158         The problem this one fixes is 35492: when a class implemented an
7159         indexer from an interface, we were getting the interface method
7160         (which was abstract) and we were flagging an error (can not invoke
7161         abstract method).
7162
7163         This also keeps bug 33089 functioning, and test-148 functioning.
7164
7165         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7166         out if a method is special is to see if it is declared in a
7167         property or event, or whether it is one of the predefined operator
7168         names.   This should fix correctly #36804.
7169
7170 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7171
7172         The goal here is to remove the dependency on EmptyCast.Peel ().
7173         Killing it completely.
7174
7175         The problem is that currently in a number of places where
7176         constants are expected, we have to "probe" for an EmptyCast, and
7177         Peel, which is not the correct thing to do, as this will be
7178         repetitive and will likely lead to errors. 
7179
7180         The idea is to remove any EmptyCasts that are used in casts that
7181         can be reduced to constants, so we only have to cope with
7182         constants. 
7183
7184         This bug hunt was triggered by Bug 37363 and the desire to remove
7185         the duplicate pattern where we were "peeling" emptycasts to check
7186         whether they were constants.  Now constants will always be
7187         constants.
7188
7189         * ecore.cs: Use an enumconstant here instead of wrapping with
7190         EmptyCast.  
7191
7192         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7193         throwing me off.  By handling this we can get rid of a few hacks.
7194
7195         * statement.cs (Switch): Removed Peel() code.
7196
7197 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7198
7199         * class.cs: Location information for error 508
7200
7201         * expression.cs (New.DoResolve): Add a guard against double
7202         resolution of an expression.  
7203
7204         The New DoResolve might be called twice when initializing field
7205         expressions (see EmitFieldInitializers, the call to
7206         GetInitializerExpression will perform a resolve on the expression,
7207         and later the assign will trigger another resolution
7208
7209         This leads to bugs (#37014)
7210
7211         * delegate.cs: The signature for EndInvoke should contain any ref
7212         or out parameters as well.  We were not doing this in the past. 
7213
7214         * class.cs (Field.Define): Do not overwrite the type definition
7215         inside the `volatile' group.  Turns out that volatile enumerations
7216         were changing the type here to perform a validity test, which
7217         broke conversions. 
7218
7219 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7220
7221         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7222         and structs, we do not want to load the instance variable
7223
7224         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7225         enum_type has to be handled like an object reference (implicit
7226         conversions exists from this to object), but the regular IsClass
7227         and IsValueType tests will never return true for this one.
7228
7229         Also we use TypeManager.IsValueType instead of type.IsValueType,
7230         just for consistency with the rest of the code (this is only
7231         needed if we ever use the construct exposed by test-180.cs inside
7232         corlib, which we dont today).
7233
7234 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7235
7236         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7237         just InternalCall.
7238
7239 2003-02-09  Martin Baulig  <martin@ximian.com>
7240
7241         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7242         (Namespace.DefineNamespaces): New static public method; this is
7243         called when we're compiling with debugging to add all namespaces
7244         to the symbol file.
7245
7246         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7247         pass it to the Namespace's .ctor.
7248
7249         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7250         and MethodBase arguments; pass the namespace ID to the symwriter;
7251         pass the MethodBase instead of the token to the symwriter.
7252         (SymbolWriter.DefineNamespace): New method to add a namespace to
7253         the symbol file.
7254
7255 2003-02-09  Martin Baulig  <martin@ximian.com>
7256
7257         * symbolwriter.cs: New file.  This is a wrapper around
7258         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7259         methods here in near future.
7260
7261 2003-02-09  Martin Baulig  <martin@ximian.com>
7262
7263         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7264         ILGenerator.MarkSequencePoint() which are actually used by the
7265         symbol writer.
7266
7267 2003-02-09  Martin Baulig  <martin@ximian.com>
7268
7269         * location.cs (SourceFile): New public sealed class.  This
7270         contains the name and an index which is used in the location's token.
7271         (Location): Reserve an appropriate number of bits in the token for
7272         the source file instead of walking over that list, this gives us a
7273         really huge performance improvement when compiling with debugging.
7274
7275         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7276         `SourceFile' argument instead of a string.
7277         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7278         but don't parse/tokenize here, we need to generate the list of all
7279         source files before we do that.
7280         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7281         the files.
7282
7283         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7284         instead of a string.
7285
7286         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7287         of a string.
7288
7289 2003-02-09  Martin Baulig  <martin@ximian.com>
7290
7291         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7292         filename on `#line default'.
7293
7294 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7295
7296         * statement.cs: don't clear the pinned var when the fixed statement
7297         returns from the method (fixes bug#37752).
7298
7299 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7300
7301         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7302         to IsValueType.
7303
7304 2003-02-07  Martin Baulig  <martin@ximian.com>
7305
7306         * driver.cs: Removed the `--debug-args' command line argument.
7307
7308         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7309         automatically by the AsssemblyBuilder.
7310         (CodeGen.InitializeSymbolWriter): We don't need to call any
7311         initialization function on the symbol writer anymore.  This method
7312         doesn't take any arguments.
7313
7314 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7315
7316         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7317         from referenced assemblies as well.
7318
7319 2003-02-02  Martin Baulig  <martin@ximian.com>
7320
7321         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7322
7323 2003-02-02  Martin Baulig  <martin@ximian.com>
7324
7325         * class.cs (Constructor.Emit): Open the symbol writer before
7326         emitting the constructor initializer.
7327         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7328         single-stepping through constructor initializers.
7329
7330 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7331
7332         * class.cs: Handle error 549: do not allow virtual methods in
7333         sealed classes. 
7334
7335 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7336
7337         * decl.cs: Check access levels when resolving types
7338
7339 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7340
7341         * statement.cs: Add parameters and locals set in catch blocks that might 
7342         return to set vector
7343
7344 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7345
7346         * class.cs (Operator): Set the SpecialName flags for operators.
7347
7348         * expression.cs (Invocation.DoResolve): Only block calls to
7349         accessors and operators on SpecialName methods.
7350
7351         (Cast.TryReduce): Handle conversions from char constants.
7352
7353
7354 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7355
7356         * statement.cs: small memory and time optimization in FlowBranching.
7357
7358 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7359
7360         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7361         problem that the last fix but in the other sid (Set).
7362
7363         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7364         access when there is no indexer in the hierarchy.
7365
7366 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7367
7368         * class.cs: Combine some if statements.
7369
7370 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7371
7372         * driver.cs: fixed bug #37187.
7373
7374 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7375
7376         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7377         any indexer, it's needed to build a list with all the indexers in the
7378         hierarchy (AllGetters), else we have problems. Fixes #35653.
7379
7380 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7381
7382         * class.cs (MethodData.Define): It is wrong for an interface
7383         implementation to be static in both cases: explicit and implicit.
7384         We were only handling this in one case.
7385
7386         Improve the if situation there to not have negations.
7387
7388         * class.cs (Field.Define): Turns out that we do not need to check
7389         the unsafe bit on field definition, only on usage.  Remove the test.
7390
7391 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7392
7393         * driver.cs: use assembly.Location instead of Codebase (the latest
7394         patch made mcs fail when using MS assemblies).
7395
7396 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7397
7398         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7399         get the path to *corlib.dll.
7400
7401 2003-01-21  Nick Drochak <ndrochak@gol.com>
7402
7403         * cs-tokenizer.cs:
7404         * pending.cs:
7405         * typemanager.cs: Remove compiler warnings
7406
7407 2003-01-20  Duncan Mak  <duncan@ximian.com>
7408
7409         * AssemblyInfo.cs: Bump the version number to 0.19.
7410
7411 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7412
7413         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7414
7415 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7416
7417         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7418
7419 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7420
7421         * cs-parser.jay: Small fix: we were not comparing the constructor
7422         name correctly.   Thanks to Zoltan for the initial pointer.
7423
7424 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7425
7426         * cs-tokenizer.cs: Set file name when specified with #line
7427
7428 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7429
7430         * cs-parser.jay: Only perform the constructor checks here if we
7431         are named like the class;  This will help provider a better
7432         error.  The constructor path is taken when a type definition is
7433         not found, but most likely the user forgot to add the type, so
7434         report that rather than the constructor error.
7435
7436 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7437
7438         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7439         allocations.
7440
7441 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7442
7443         * cs-parser.jay: Add cleanup call.
7444
7445 2003-01-13  Duncan Mak  <duncan@ximian.com>
7446
7447         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7448         consistent with other methods.
7449
7450 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7451
7452         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7453
7454 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7455
7456         * attribute.cs: only set GuidAttr to true when we have a
7457         GuidAttribute.
7458
7459 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7460
7461         * ecore.cs:
7462         * expression.cs:
7463         * typemanager.cs: fixes to allow mcs compile corlib with the new
7464         Type.IsSubclassOf fix.
7465
7466 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7467
7468         * expression.cs (LocalVariableReference.DoResolve): Classify a
7469         constant as a value, not as a variable.   Also, set the type for
7470         the variable.
7471
7472         * cs-parser.jay (fixed_statement): take a type instead of a
7473         pointer_type, so we can produce a better error message later.
7474
7475         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7476         as an error.  
7477
7478         (For.DoEmit): Make inifinite loops have a
7479         non-conditional branch back.
7480
7481         (Fixed.DoEmit): First populate the pinned variables, then emit the
7482         statement, then clear the variables.  Before I was emitting the
7483         code once for each fixed piece.
7484
7485
7486 2003-01-08  Martin Baulig  <martin@ximian.com>
7487
7488         * statement.cs (FlowBranching.MergeChild): A break in a
7489         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7490
7491 2003-01-08  Martin Baulig  <martin@ximian.com>
7492
7493         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7494         lives in the same number space than `param_map'.  Fixes #36154.
7495
7496 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7497
7498         * cs-parser.jay (constructor_declaration): Set the
7499         Constructor.ModFlags before probing for it.  This makes the
7500         compiler report 514, 515 and 132 (the code was there, but got
7501         broken). 
7502
7503         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7504         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7505         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7506
7507 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7508
7509         * enum.cs: create the enum static fields using the enum type.
7510
7511 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7512
7513         * class.cs: don't try to create the ParamBuilder for the return
7514         type if it's not needed (and handle it breaking for the ms runtime
7515         anyway).
7516
7517 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7518
7519         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7520
7521 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7522
7523         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7524         the command.   This showed up while compiling the JANET source
7525         code, which used \r as its only newline separator.
7526
7527 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7528
7529         * class.cs (Method.Define): If we are an operator (because it
7530         reuses our code), then set the SpecialName and HideBySig.  #36128
7531
7532 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7533
7534         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7535         exception, report error 120 `object reference required'.
7536
7537         * driver.cs: Add --pause option, used during to measure the size
7538         of the process as it goes with --timestamp.
7539
7540         * expression.cs (Invocation.DoResolve): Do not allow methods with
7541         SpecialName to be invoked.
7542
7543 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7544
7545         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7546         number before adding it.
7547
7548 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7549
7550         * ecore.cs (StandardImplicitConversion): When in an unsafe
7551         context, we allow conversion between void * to any other pointer
7552         type. This fixes bug #35973.
7553
7554 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7555
7556         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7557         is not thrown when extensionless outputs are used 
7558
7559 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7560
7561         * rootcontext.cs: fixed compilation of corlib.
7562
7563 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7564
7565         * attribute.cs (Attributes.Contains): Add new method.
7566
7567         * class.cs (MethodCore.LabelParameters): if the parameter is an
7568         `out' parameter, check that no attribute `[In]' has been passed.
7569
7570         * enum.cs: Handle the `value__' name in an enumeration.
7571
7572 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7573
7574         * decl.cs: Added special case to allow overrides on "protected
7575         internal" methods
7576
7577 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7578
7579         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7580         since it makes much more sense.
7581
7582         (Attributes.ctor): Don't require a Location parameter.
7583
7584         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7585
7586         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7587         since we already have that information per attribute.
7588
7589         * everywhere : make appropriate changes.
7590
7591         * class.cs (LabelParameters): Write the code which actually
7592         applies attributes to the return type. We can't do this on the MS
7593         .NET runtime so we flag a warning in the case an exception is
7594         thrown.
7595
7596 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7597
7598         * const.cs: Handle implicit null conversions here too.
7599
7600 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7601
7602         * class.cs (MethodCore.LabelParameters): Remove the extra
7603         Type [] parameter since it is completely unnecessary. Instead
7604         pass in the method's attributes so that we can extract
7605         the "return" attribute.
7606
7607 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7608
7609         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7610         of ignoring it and letting the compile continue.
7611
7612         * typemanager.cs (ChangeType): use an extra argument to return an
7613         error condition instead of throwing an exception.
7614
7615 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7616
7617         * expression.cs (Unary.TryReduce): mimic the code for the regular
7618         code path.  Perform an implicit cast in the cases where we can
7619         implicitly convert to one of the integral types, and then reduce
7620         based on that constant.   This fixes bug #35483.
7621
7622 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7623
7624         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7625
7626 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7627
7628         * namespace.cs: fixed bug #35489.
7629
7630 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7631
7632         * class.cs: Remove some dead code.
7633
7634         * cs-parser.jay: Estimate the number of methods needed
7635         (RootContext.MethodCount);
7636
7637         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7638         numbers instead of StringBuilders.
7639
7640         * support.cs (PtrHashtable): Add constructor with initial size;
7641         We can now reduce reallocations of the method table.
7642
7643 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7644
7645         * attribute.cs (ApplyAttributes): Keep track of the emitted
7646         attributes on a per-target basis. This fixes bug #35413.
7647
7648 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7649
7650         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7651         default to the Windows 1252 encoding.
7652
7653         (UnixParseOption): Support version, thanks to Alp for the missing
7654         pointer. 
7655
7656         * AssemblyInfo.cs: Add nice assembly information.
7657
7658         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7659         (bug 35169).
7660
7661         * cs-parser.jay: Allow a trailing comma before the close bracked
7662         in the attribute_section production.
7663
7664         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7665         address of the instance was being taken, I will take this out,
7666         because we take the address of the object immediately here.
7667
7668 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7669
7670         * typemanager.cs (AreMultipleAllowed): Take care of the most
7671         obvious case where attribute type is not in the current assembly -
7672         stupid me ;-)
7673
7674 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7675
7676         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7677         definitions, instead of doing that afterwards.  
7678
7679         Also we use a nice little hack, depending on the constructor, we
7680         know if we are a "composed" name or a simple name.  Hence, we
7681         avoid the IndexOf test, and we avoid 
7682
7683         * codegen.cs: Add code to assist in a bug reporter to track down
7684         the source of a compiler crash. 
7685
7686 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7687
7688         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7689         types have been emitted for a given element and flag an error
7690         if something which does not have AllowMultiple set is used more
7691         than once.
7692
7693         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7694         attribute types and their corresponding AllowMultiple properties
7695
7696         (AreMultipleAllowed): Check the property for a given type.
7697
7698         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7699         property in the case we have a TypeContainer.
7700
7701         (Attributes.AddAttribute): Detect duplicates and just skip on
7702         adding them. This trivial fix catches a pretty gross error in our
7703         attribute emission - global attributes were being emitted twice!
7704
7705         Bugzilla bug #33187 is now fixed.
7706
7707 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7708
7709         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7710         instead of pp_and).
7711
7712         * expression.cs (Binary.ResolveOperator): I can only use the
7713         Concat (string, string, string) and Concat (string, string,
7714         string, string) if the child is actually a concatenation of
7715         strings. 
7716
7717 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7718
7719         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7720         context where we need a 2-character lookahead.
7721
7722         * pending.cs (PendingImplementation): Rework so we can keep track
7723         of interface types all the time, and flag those which were
7724         implemented by parents as optional.
7725
7726 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7727
7728         * expression.cs (Binary.ResolveOperator): Use
7729         String.Concat(string,string,string) or
7730         String.Concat(string,string,string,string) when possible. 
7731
7732         * typemanager: More helper methods.
7733
7734
7735 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7736
7737         * pending.cs: remove the bogus return from GetMissingInterfaces()
7738         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7739
7740 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7741
7742         * namespace.cs: avoid duplicated 'using xxx' being added to
7743         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7744         when we get more than one 'using' statement for the same namespace.
7745         Report a CS0105 warning for it.
7746
7747 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7748
7749         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7750         of calling getChar/putback, uses internal knowledge of it.    
7751
7752         (xtoken): Reorder tokenizer so most common patterns are checked
7753         first.  This reduces the compilation time in another 5% (from 8.11s
7754         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7755
7756         The parsing time is 22% of the compilation in mcs, and from that
7757         64% is spent on the tokenization process.  
7758
7759         I tried using a binary search for keywords, but this is slower
7760         than the hashtable.  Another option would be to do a couple of
7761         things:
7762
7763                 * Not use a StringBuilder, instead use an array of chars,
7764                   with a set value.  Notice that this way we could catch
7765                   the 645 error without having to do it *afterwards*.
7766
7767                 * We could write a hand-parser to avoid the hashtable
7768                   compares altogether.
7769
7770         The identifier consumption process takes 37% of the tokenization
7771         time.  Another 15% is spent on is_number.  56% of the time spent
7772         on is_number is spent on Int64.Parse:
7773
7774                 * We could probably choose based on the string length to
7775                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7776                   computations. 
7777
7778         Another 3% is spend on wrapping `xtoken' in the `token' function.
7779
7780         Handle 0xa0 as whitespace (#34752)
7781
7782 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7783
7784         * typemanager.cs (IsCLRType): New routine to tell whether a type
7785         is one of the builtin types.  
7786
7787         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7788         typecode in more places instead of doing pointer comparissions.
7789         We could leverage some knowledge about the way the typecodes are
7790         laid out.
7791
7792         New code to cache namespaces in assemblies, it is currently not
7793         invoked, to be used soon.
7794
7795         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7796
7797         * expression.cs (Binary.ResolveOperator): specially handle
7798         strings, and do not perform user-defined operator overloading for
7799         built-in types.
7800
7801 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7802
7803         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7804         internalcall as it is a pretty simple operation;  Avoid whenever
7805         possible to call Char.IsLetter.
7806
7807         (consume_identifier): Cut by half the number of
7808         hashtable calls by merging the is_keyword and GetKeyword behavior.
7809
7810         Do not short-circuit, because if we do, we
7811         report errors (ie, #if false && true would produce an invalid
7812         directive error);
7813
7814
7815 2002-11-24  Martin Baulig  <martin@ximian.com>
7816
7817         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7818         check constant ranges and report a CS0221.  Fixes #33186.
7819
7820 2002-11-24  Martin Baulig  <martin@ximian.com>
7821
7822         * cs-parser.jay: Make this work for uninitialized variable
7823         declarations in the `for' initializer.  Fixes #32416.
7824
7825 2002-11-24  Martin Baulig  <martin@ximian.com>
7826
7827         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7828         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7829
7830 2002-11-24  Martin Baulig  <martin@ximian.com>
7831
7832         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7833         argument; if true, we also check for user-defined conversions.
7834         This is only needed if both arguments are of a user-defined type.
7835         Fixes #30443, added test-175.cs.
7836         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7837
7838         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7839
7840 2002-11-24  Martin Baulig  <martin@ximian.com>
7841
7842         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7843         function to get the store opcode.
7844         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7845         only emit the Ldelema if the store opcode is Stobj.  You must run
7846         both test-34 and test-167 to test this.  Fixes #34529.
7847
7848 2002-11-23  Martin Baulig  <martin@ximian.com>
7849
7850         * ecore.cs (Expression.MemberLookup): Added additional
7851         `qualifier_type' argument which is used when we're being called
7852         from MemberAccess.DoResolve() and null if we're called from a
7853         SimpleName lookup.
7854         (Expression.MemberLookupFailed): New method to report errors; this
7855         does the CS1540 check and reports the correct error message.
7856
7857         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7858         argument for the CS1540 check and redone the way how we're dealing
7859         with private members.  See the comment in the source code for details.
7860         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7861         `closure_start_type' to `closure_qualifier_type' and check whether
7862         it's not null.  It was not this filter being broken, it was just
7863         being called with the wrong arguments.
7864
7865         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7866         and pass it the correct `qualifier_type'; this also does the error
7867         handling for us.
7868
7869 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7870
7871         * expression.cs (Invocation.EmitParams): If the we are dealing
7872         with a non-built-in value type, load its address as well.
7873
7874         (ArrayCreation): Use a a pretty constant instead
7875         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7876         static initializers.  
7877
7878         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7879         because they are not really value types, just glorified integers. 
7880
7881         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7882
7883         * ecore.cs: Remove redundant code for enumerations, make them use
7884         the same code path as everything else, fixes the casting issue
7885         with enumerations in Windows.Forms.
7886
7887         * attribute.cs: Do only cast to string if it is a string, the
7888         validation happens later.
7889
7890         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7891         people upgrade their corlibs.
7892
7893         * ecore.cs: Oops, enumerations were not following the entire code path
7894
7895 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7896
7897         * typemanager.cs (FilterWithClosure): Commented out the test for
7898         1540 in typemanager.cs, as it has problems when accessing
7899         protected methods from a parent class (see test-174.cs). 
7900
7901         * attribute.cs (Attribute.ValidateGuid): new method.
7902         (Attribute.Resolve): Use above.
7903
7904 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7905
7906         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7907
7908         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7909         handling for enumerations, as we only needed the TypeContainer
7910         functionality to begin with (this is required for the fix below to
7911         work for enums that reference constants in a container class for
7912         example). 
7913
7914         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7915
7916         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7917         a valid TypeBuilder to perform lookups on.o
7918
7919         * class.cs (InheritableMemberSignatureCompare): Use true in the
7920         call to GetGetMethod and GetSetMethod, because we are comparing
7921         the signature, and we need to get the methods *even* if they are
7922         private. 
7923
7924         (PropertyBase.CheckBase): ditto.
7925
7926         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7927         GotoCase.Resolve): Use Peel on EmpytCasts.
7928
7929         * ecore.cs (EmptyCast): drop child, add Peel method.
7930
7931 2002-11-17  Martin Baulig  <martin@ximian.com>
7932
7933         * ecore.cs (EmptyCast.Child): New public property.
7934
7935         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7936         label resolved to an EmptyCast.  Fixes #34162.
7937         (GotoCase.Resolve): Likewise.
7938         (Block.EmitMeta): Likewise.
7939
7940 2002-11-17  Martin Baulig  <martin@ximian.com>
7941
7942         * expression.cs (Invocation.BetterConversion): Prefer int over
7943         uint; short over ushort; long over ulong for integer literals.
7944         Use ImplicitConversionExists instead of StandardConversionExists
7945         since we also need to check for user-defined implicit conversions.
7946         Fixes #34165.  Added test-173.cs.
7947
7948 2002-11-16  Martin Baulig  <martin@ximian.com>
7949
7950         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7951         with the `true' and `false' literals.  Fixes #33151.
7952
7953 2002-11-16  Martin Baulig  <martin@ximian.com>
7954
7955         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7956         October 22nd; don't do the cs1540 check for static members.
7957
7958         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7959         now using our own filter here and doing the cs1540 check again.
7960
7961 2002-11-16  Martin Baulig  <martin@ximian.com>
7962
7963         * support.cs (InternalParameters): Don't crash if we don't have
7964         any fixed parameters.  Fixes #33532.
7965
7966 2002-11-16  Martin Baulig  <martin@ximian.com>
7967
7968         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7969         when looking up static methods to make this work on Windows.
7970         Fixes #33773.
7971
7972 2002-11-16  Martin Baulig  <martin@ximian.com>
7973
7974         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7975         a setter rather than using PropertyInfo.CanWrite.
7976
7977 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7978
7979         * class.cs: Allow acces to block member by subclasses. Fixes build
7980         breaker.
7981
7982 2002-11-14  Martin Baulig  <martin@ximian.com>
7983
7984         * class.cs (Constructor.Emit): Added the extern/block check.
7985         Fixes bug #33678.
7986
7987 2002-11-14  Martin Baulig  <martin@ximian.com>
7988
7989         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7990         iteration while looking for indexers, this is needed because the
7991         indexer may have a different name in our base classes.  Fixed the
7992         error reporting (no indexers at all, not get accessor, no
7993         overloaded match).  Fixes bug #33089.
7994         (IndexerAccess.DoResolveLValue): Likewise.
7995
7996 2002-11-14  Martin Baulig  <martin@ximian.com>
7997
7998         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7999         indexers.  Fixes the first part of bug #33089.
8000         (MethodSignature.InheritableMemberSignatureCompare): Added support
8001         for properties.
8002
8003 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8004
8005         * attribute.cs (Attribute.Resolve): Catch the
8006         NullReferenceException and report it since it isn't supposed to
8007         happen. 
8008
8009 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8010
8011         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8012         LogicalOr and LogicalAnd that can benefit from recursively
8013         handling EmitBranchable.  The code now should be nice for Paolo.
8014
8015 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8016
8017         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8018         the Type lookups, as we perform quite a number of lookups on
8019         non-Types.  This can be removed once we can deterministically tell
8020         whether we have a type or a namespace in advance.
8021
8022         But this might require special hacks from our corlib.
8023
8024         * TODO: updated.
8025
8026         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8027         and double which avoids a conversion from an integer to a double.
8028
8029         * expression.cs: tiny optimization, avoid calling IsConstant,
8030         because it effectively performs the lookup twice.
8031
8032 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8033
8034         But a bogus return here to keep the semantics of the old code
8035         until the Mono runtime is fixed.
8036
8037         * pending.cs (GetMissingInterfaces): New method used to remove all
8038         the interfaces that are already implemented by our parent
8039         classes from the list of pending methods. 
8040
8041         * interface.cs: Add checks for calls after ResolveTypeExpr.
8042
8043 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8044
8045         * class.cs (Class.Emit): Report warning 67: event not used if the
8046         warning level is beyond 3.
8047
8048         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8049         being a NullLiteral.
8050
8051         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8052         specifiers. 
8053
8054         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8055         path that might fail if a type can not be resolved.
8056
8057         * expression.cs (Binary.Emit): Emit unsigned versions of the
8058         operators. 
8059
8060         * driver.cs: use error 5.
8061
8062 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8063
8064         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8065
8066 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8067
8068         * cs-parser.jay (switch_section): A beautiful patch from Martin
8069         Baulig that fixed 33094.
8070
8071 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8072
8073         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8074         Check whether the base is abstract and report an error if so.
8075
8076         * expression.cs (IndexerAccess.DoResolveLValue,
8077         IndexerAccess.DoResolve): ditto. 
8078
8079         (Invocation.DoResolve): ditto.
8080
8081         (Invocation.FullMethodDesc): Improve the report string.
8082
8083         * statement.cs (Block): Eliminate IsVariableDefined as it is
8084         basically just a wrapper for GetVariableInfo.
8085
8086         * ecore.cs (SimpleName): Use new 
8087
8088         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8089         type, as we return the actual parameter ref/unref state on a
8090         different call.
8091
8092 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8093
8094         * support.cs: Return proper flags REF/OUT fixing the previous
8095         commit.  
8096
8097         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8098         not used to mean `ref' but `ref or out' in ParameterReference
8099
8100         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8101         full type signature instead of calling TypeManger.CSharpName
8102         ourselves. 
8103
8104         * support.cs (InternalParameters.ParameterDesc): Do not compare
8105         directly to the modflags, because REF/OUT will actually be bitsets
8106         if set. 
8107
8108         * delegate.cs (VerifyMethod): Check also the modifiers.
8109
8110         * cs-tokenizer.cs: Fix bug where floating point values with an
8111         exponent where a sign was missing was ignored.
8112
8113         * driver.cs: Allow multiple assemblies to be specified in a single
8114         /r: argument
8115
8116 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8117
8118         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8119         because identifiers after a parenthesis would end up in this kind
8120         of production, and we needed to desamiguate it for having casts
8121         like:
8122
8123                 (UserDefinedType *) xxx
8124
8125 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8126
8127         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8128         we should set on the Bindingflags.NonPublic, but not turn on
8129         private_ok.  private_ok controls whether a Private member is
8130         returned (this is chekced on the filter routine), while the
8131         BindingFlags.NonPublic just controls whether private/protected
8132         will be allowed.   This fixes the problem part of the problem of
8133         private properties being allowed to be used in derived classes.
8134
8135         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8136         so we can call the children DoResolveLValue method (this will
8137         properly signal errors on lvalue assignments to base properties)
8138
8139         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8140         getter are null, and we have a property info, we know that this
8141         happened because the lookup failed, so we report an error 122 for
8142         protection level violation.
8143
8144         We also silently return if setter and getter are null in the
8145         resolve functions, this condition only happens if we have flagged
8146         the error before.  This is the other half of the problem. 
8147
8148         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8149         not have accessibility information, that is why we were returning
8150         true in the filter function in typemanager.cs.
8151
8152         To properly report 122 (property is inaccessible because of its
8153         protection level) correctly, we report this error in ResolveAccess
8154         by failing if both the setter and the getter are lacking (ie, the
8155         lookup failed). 
8156
8157         DoResolve and DoLResolve have been modified to check for both
8158         setter/getter being null and returning silently, the reason being
8159         that I did not want to put the knowledge about this error in upper
8160         layers, like:
8161
8162         int old = Report.Errors;
8163         x = new PropertyExpr (...);
8164         if (old != Report.Errors)
8165                 return null;
8166         else
8167                 return x;
8168
8169         So the property expr is returned, but it is invalid, so the error
8170         will be flagged during the resolve process. 
8171
8172         * class.cs: Remove InheritablePropertySignatureCompare from the
8173         class, as we no longer depend on the property signature to compute
8174         whether it is possible to implement a method or not.
8175
8176         The reason is that calling PropertyInfo.GetGetMethod will return
8177         null (in .NET, in Mono it works, and we should change this), in
8178         cases where the Get Method does not exist in that particular
8179         class.
8180
8181         So this code:
8182
8183         class X { public virtual int A { get { return 1; } } }
8184         class Y : X { }
8185         class Z : Y { public override int A { get { return 2; } } }
8186
8187         Would fail in Z because the parent (Y) would not have the property
8188         defined.  So we avoid this completely now (because the alternative
8189         fix was ugly and slow), and we now depend exclusively on the
8190         method names.
8191
8192         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8193         reference method, instead of using the property.
8194
8195         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8196         routines are gone now.
8197
8198         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8199         names, they were incorrectly named.
8200
8201         * cs-tokenizer.cs: Return are more gentle token on failure. 
8202
8203         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8204         had an out-of-sync index variable, which caused it to remove from
8205         the list of pending methods the wrong method sometimes.
8206
8207 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8208
8209         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8210         CanWrite, because those refer to this particular instance of the
8211         property, and do not take into account the fact that we can
8212         override single members of a property.
8213
8214         Constructor requires an EmitContext.  The resolution process does
8215         not happen here, but we need to compute the accessors before,
8216         because the resolution does not always happen for properties.
8217
8218         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8219         subclass, before we did not update this flag, but we did update
8220         bindingflags. 
8221
8222         (GetAccessors): Drop this routine, as it did not work in the
8223         presence of partially overwritten set/get methods. 
8224
8225         Notice that this broke the cs1540 detection, but that will require
8226         more thinking. 
8227
8228 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8229
8230         * class.cs:
8231         * codegen.cs:
8232         * driver.cs: issue a warning instead of an error if we don't support
8233         debugging for the platform. Also ignore a couple of errors that may
8234         arise when trying to write the symbols. Undo my previous patch.
8235
8236 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8237
8238         * driver.cs: ignore /debug switch except for Unix platforms.
8239
8240 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8241
8242         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8243
8244 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8245
8246         * driver.cs: Do not make mcs-debug conditional, so we do not break
8247         builds that use it.
8248
8249         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8250         review this patch.  But basically after all the children variables
8251         have been merged, the value of "Breaks" was not being set to
8252         new_breaks for Switch blocks.  I think that it should be set after
8253         it has executed.  Currently I set this to the value of new_breaks,
8254         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8255         conservative, but I do not understand this code very well.
8256
8257         I did not break anything in the build, so that is good ;-)
8258
8259         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8260
8261 2002-10-20  Mark Crichton  <crichton@gimp.org>
8262
8263         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8264
8265 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8266
8267         * cfold.cs: Fixed compile blocker.
8268
8269 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8270
8271         * driver.cs: I was chekcing the key, not the file.
8272
8273 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8274
8275         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8276         message that we were generating - we just need to silently return
8277         a null.
8278
8279 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8280
8281         * class.cs (Event.Define): Change my previous commit, as this
8282         breaks the debugger.  This is a temporary hack, as it seems like
8283         the compiler is generating events incorrectly to begin with.
8284
8285         * expression.cs (Binary.ResolveOperator): Added support for 
8286         "U operator - (E x, E y)"
8287
8288         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8289         y)".
8290
8291         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8292         init-only variables, but this path did not take into account that
8293         there might be also instance readonly variables.  Correct this
8294         problem. 
8295
8296         This fixes bug 32253
8297
8298         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8299         delegates as well.
8300
8301         * driver.cs: Change the extension for modules to `netmodule'
8302
8303         * cs-parser.jay: Improved slightly the location tracking for
8304         the debugger symbols.
8305
8306         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8307         modifiers that were specified instead of the hardcoded value
8308         (FamAndAssem).  This was basically ignoring the static modifier,
8309         and others.  Fixes 32429.
8310
8311         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8312         fixed a bug in the process (32476)
8313
8314         * expression.cs (ArrayAccess.EmitAssign): Patch from
8315         hwang_rob@yahoo.ca that fixes bug 31834.3
8316
8317 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8318
8319         * driver.cs: Make the module extension .netmodule.
8320
8321 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8322
8323         * driver.cs: Report an error if the resource file is not found
8324         instead of crashing.
8325
8326         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8327         false, like Emit does.
8328
8329 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8330
8331         * typemanager.cs: Remove unused private member.  Also reported mcs
8332         bug to report this as a warning like csc.
8333
8334 2002-10-15  Martin Baulig  <martin@gnome.org>
8335
8336         * statement.cs (Statement.Emit): Made this a virtual method; emits
8337         the line number info and calls DoEmit().
8338         (Statement.DoEmit): New protected abstract method, formerly knows
8339         as Statement.Emit().
8340
8341         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8342
8343 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8344
8345         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8346         have fixed a remaining problem: not every AddXXXX was adding a
8347         fully qualified name.  
8348
8349         Now everyone registers a fully qualified name in the DeclSpace as
8350         being defined instead of the partial name.  
8351
8352         Downsides: we are slower than we need to be due to the excess
8353         copies and the names being registered this way.  
8354
8355         The reason for this is that we currently depend (on the corlib
8356         bootstrap for instance) that types are fully qualified, because
8357         we dump all the types in the namespace, and we should really have
8358         types inserted into the proper namespace, so we can only store the
8359         basenames in the defined_names array.
8360
8361 2002-10-10  Martin Baulig  <martin@gnome.org>
8362
8363         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8364         from bug #31834, see the bug report for a testcase which is
8365         miscompiled.
8366
8367 2002-10-10  Martin Baulig  <martin@gnome.org>
8368
8369         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8370         flow analysis code for this.
8371
8372         * statement.cs (Do, While, For): Tell the flow analysis code about
8373         infinite loops.
8374         (FlowBranching.UsageVector): Added support for infinite loops.
8375         (Block.Resolve): Moved the dead code elimination here and use flow
8376         analysis to do it.
8377
8378 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8379
8380         * class.cs (Field.Define): Catch cycles on struct type
8381         definitions. 
8382
8383         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8384         fields if the fields are static.  We only need to check instance
8385         fields. 
8386
8387         * expression.cs (As.DoResolve): Test for reference type.
8388
8389         * statement.cs (Using.ResolveExpression): Use
8390         ConvertImplicitRequired, not ConvertImplicit which reports an
8391         error on failture
8392         (Using.ResolveLocalVariableDecls): ditto.
8393
8394         * expression.cs (Binary.ResolveOperator): Report errors in a few
8395         places where we had to.
8396
8397         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8398
8399 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8400
8401         * expression.cs: Use StoreFromPtr instead of extracting the type
8402         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8403
8404         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8405         an enumeration value to a System.Enum, but System.Enum is not a
8406         value type, but an class type, so we need to box.
8407
8408         (Expression.ConvertExplicit): One codepath could return
8409         errors but not flag them.  Fix this.  Fixes #31853
8410
8411         * parameter.cs (Resolve): Do not allow void as a parameter type.
8412
8413 2002-10-06  Martin Baulig  <martin@gnome.org>
8414
8415         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8416         if it's a class type and not a struct.  Fixes #31815.
8417
8418 2002-10-06  Martin Baulig  <martin@gnome.org>
8419
8420         * statement.cs: Reworked the flow analysis code a bit to make it
8421         usable for dead code elimination.
8422
8423 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8424
8425         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8426
8427 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8428
8429         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8430         to fix the test 165, will investigate deeper.
8431
8432 2002-10-04  Martin Baulig  <martin@gnome.org>
8433
8434         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8435         finally blocks actually work.
8436         (Try.Resolve): We don't need to create a sibling for `finally' if
8437         there is no finally block.
8438
8439 2002-10-04  Martin Baulig  <martin@gnome.org>
8440
8441         * class.cs (Constructor.Define): The default accessibility for a
8442         non-default constructor is private, not public.
8443
8444 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8445
8446         * class.cs (Constructor): Make AllowedModifiers public, add
8447         EXTERN.
8448
8449         * cs-parser.jay: Perform the modifiers test here, as the
8450         constructor for the Constructor class usually receives a zero
8451         because of the way we create it (first we create, later we
8452         customize, and we were never checking the modifiers).
8453
8454         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8455         is a version of LookupTypeReflection that includes the type-name
8456         cache.  This can be used as a fast path for functions that know
8457         the fully qualified name and are only calling into *.GetType() to
8458         obtain a composed type.
8459
8460         This is also used by TypeManager.LookupType during its type
8461         composition.
8462
8463         (LookupType): We now also track the real type name, as sometimes
8464         we can get a quey for the real type name from things like
8465         ComposedCast.  This fixes bug 31422.
8466
8467         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8468         complete type fullname, it does not have to go through the type
8469         resolution system to obtain the composed version of the type (for
8470         obtaining arrays or pointers).
8471
8472         (Conditional.Emit): Use the EmitBoolExpression to
8473         generate nicer code, as requested by Paolo.
8474
8475         (ArrayCreation.CheckIndices): Use the patch from
8476         hwang_rob@yahoo.ca to validate the array initializers. 
8477
8478 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8479
8480         * class.cs (ConstructorInitializer.Emit): simplify code by using
8481         Invocation.EmitCall, and at the same time, fix the bugs in calling
8482         parent constructors that took variable arguments. 
8483
8484         * ecore.cs (Expression.ConvertNumericExplicit,
8485         Expression.ImplicitNumericConversion): Remove the code that
8486         manually wrapped decimal (InternalTypeConstructor call is now gone
8487         as well).
8488
8489         * expression.cs (Cast.TryReduce): Also handle decimal types when
8490         trying to perform a constant fold on the type.
8491
8492         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8493
8494         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8495         that only turned off an error report, and did nothing else. 
8496
8497 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8498
8499         * driver.cs: Handle and ignore /fullpaths
8500
8501 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8502
8503         * expression.cs (Binary.ResolveOperator): Catch the case where
8504         DoNumericPromotions returns true, 
8505
8506         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8507
8508 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8509
8510         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8511         report error 70.
8512
8513 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8514
8515         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8516         conversion exists, but it is also required that the conversion be
8517         performed.  This manifested in "(Type64Enum) 2".  
8518
8519         * class.cs (TypeManager.AddMethod): The fix is not to change
8520         AddEnum, because that one was using a fully qualified name (every
8521         DeclSpace derivative does), but to change the AddMethod routine
8522         that was using an un-namespaced name.  This now correctly reports
8523         the duplicated name.
8524
8525         Revert patch until I can properly fix it.  The issue
8526         is that we have a shared Type space across all namespaces
8527         currently, which is wrong.
8528
8529         Options include making the Namespace a DeclSpace, and merge
8530         current_namespace/current_container in the parser.
8531
8532 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8533
8534         * cs-parser.jay: Improve error reporting when we get a different
8535         kind of expression in local_variable_type and
8536         local_variable_pointer_type. 
8537
8538         Propagate this to avoid missleading errors being reported.
8539
8540         * ecore.cs (ImplicitReferenceConversion): treat
8541         TypeManager.value_type as a target just like object_type.   As
8542         code like this:
8543
8544         ValueType v = 1;
8545
8546         Is valid, and needs to result in the int 1 being boxed before it
8547         is assigned to the value type v.
8548
8549         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8550         to validate the enumeration name.
8551
8552         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8553         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8554         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8555
8556         * ecore.cs (TryImplicitIntConversion): When doing an
8557         implicit-enumeration-conversion, check if the type is 64-bits and
8558         perform a conversion before passing to EnumConstant.
8559
8560 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8561
8562         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8563         report ambiguous type references.  Unlike the MS version, we
8564         report what the ambiguity is.   Innovation at work ;-)
8565
8566         (DeclSpace.FindType): Require a location argument to
8567         display when we display an ambiguous error.
8568
8569         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8570
8571         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8572
8573         * expression.cs (EmitDynamicInitializers): Apply patch from
8574         hwang_rob@yahoo.ca that fixes the order in which we emit our
8575         initializers. 
8576
8577 2002-09-21  Martin Baulig  <martin@gnome.org>
8578
8579         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8580         delegate takes no arguments.
8581
8582 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8583
8584         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8585         from integers.
8586
8587         * expression.cs: Extract the underlying type.
8588
8589         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8590
8591         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8592
8593 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8594
8595         * class.cs (TypeContainer.DefineType): We can not use the nice
8596         PackingSize with the size set to 1 DefineType method, because it
8597         will not allow us to define the interfaces that the struct
8598         implements.
8599
8600         This completes the fixing of bug 27287
8601
8602         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8603         means also structs.  This fixes part of the problem. 
8604         (Expresion.ImplicitReferenceConversionExists): ditto.
8605
8606         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8607         error if there were no errors reported during the type lookup
8608         process, to avoid duplicates or redundant errors.  Without this
8609         you would get an ambiguous errors plus a type not found.  We have
8610         beaten the user enough with the first error.  
8611
8612         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8613         reference. 
8614
8615         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8616         during the resolution process, stop the lookup, this avoids
8617         repeated error reports (same error twice).
8618
8619         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8620
8621         * typemanager.cs (LookupType): Redo the type lookup code to match
8622         the needs of System.Reflection.  
8623
8624         The issue is that System.Reflection requires references to nested
8625         types to begin with a "+" sign instead of a dot.  So toplevel
8626         types look like: "NameSpace.TopLevelClass", and nested ones look
8627         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8628         levels. 
8629
8630 2002-09-19  Martin Baulig  <martin@gnome.org>
8631
8632         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8633         says that a method always returns or always throws an exception,
8634         don't report the CS0161.
8635
8636         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8637         set `Returns = new_returns'.
8638
8639 2002-09-19  Martin Baulig  <martin@gnome.org>
8640
8641         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8642         to an enum constant, check for a CS0176.
8643
8644 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8645
8646         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8647         for operators that must be in pairs and report errors.
8648
8649         * ecore.cs (SimpleName.DoResolveType): During the initial type
8650         resolution process, when we define types recursively, we must
8651         check first for types in our current scope before we perform
8652         lookups in the enclosing scopes.
8653
8654         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8655
8656         (Invocation.VerifyArgumentsCompat): Call
8657         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8658         I thought we were supposed to always call this, but there are a
8659         few places in the code where we dont do it.
8660
8661 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8662
8663         * driver.cs: Add support in -linkres and -resource to specify the
8664         name of the identifier.
8665
8666 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8667
8668         * ecore.cs (StandardConversionExists): Sync with the conversion
8669         code: allow anything-* to void* conversions.
8670
8671         (FindMostSpecificSource): Use an Expression argument
8672         instead of a Type, because we might be handed over a Literal which
8673         gets a few more implicit conversions that plain types do not.  So
8674         this information was being lost.
8675
8676         Also, we drop the temporary type-holder expression when not
8677         required.
8678
8679 2002-09-17  Martin Baulig  <martin@gnome.org>
8680
8681         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8682         this is an explicit interface implementation.
8683
8684 2002-09-17  Martin Baulig  <martin@gnome.org>
8685
8686         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8687         different `IndexerName' attributes.
8688
8689         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8690         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8691         virtual CommonResolve().
8692
8693 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8694
8695         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8696         and convert that to the UnderlyingType.
8697
8698         * statement.cs (Foreach.Resolve): Indexers are just like variables
8699         or PropertyAccesses.
8700
8701         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8702         inside quoted strings, we were not doing this before.
8703
8704 2002-09-16  Martin Baulig  <martin@gnome.org>
8705
8706         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8707         resolve it.  This is needed for the definite assignment check of the
8708         instance expression, fixes bug #29846.
8709         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8710
8711 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8712
8713         * parameter.cs: Fix compile error.  Cannot reference static member
8714         from an instance object.  Is this an mcs bug?
8715
8716 2002-09-14  Martin Baulig  <martin@gnome.org>
8717
8718         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8719         multiple times.  Fixes bug #30295, added test-166.cs.
8720
8721 2002-09-14  Martin Baulig  <martin@gnome.org>
8722
8723         * statement.cs (Block.Emit): Don't emit unreachable code.
8724         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8725         `break' statements.
8726         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8727
8728 2002-09-14  Martin Baulig  <martin@gnome.org>
8729
8730         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8731         is set.
8732
8733 2002-09-14  Martin Baulig  <martin@gnome.org>
8734
8735         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8736         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8737         be false on the ms runtime.
8738
8739 2002-09-13  Martin Baulig  <martin@gnome.org>
8740
8741         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8742         the CS0038 error message.
8743
8744 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8745
8746         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8747         constant inside, return it.
8748
8749 2002-09-12  Martin Baulig  <martin@gnome.org>
8750
8751         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8752         implicit conversion can be done between enum types.
8753
8754         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8755         check whether an implicit conversion to the current enum's UnderlyingType
8756         exists and report an error if not.
8757
8758         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8759         without debugging support.
8760
8761         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8762         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8763
8764 2002-09-12  Martin Baulig  <martin@gnome.org>
8765
8766         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8767
8768         * ecore.cs (IMemberExpr.DeclaringType): New property.
8769         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8770         nonstatic member of an outer type (CS0038).
8771
8772 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8773
8774         * driver.cs: Activate the using-error detector at warning level
8775         4 (at least for MS-compatible APIs).
8776
8777         * namespace.cs (VerifyUsing): Small buglett fix.
8778
8779         * pending.cs (PendingImplementation): pass the container pointer. 
8780
8781         * interface.cs (GetMethods): Allow for recursive definition.  Long
8782         term, I would like to move every type to support recursive
8783         definitions, not the current ordering mechanism that we have right
8784         now.
8785
8786         The situation is this: Attributes are handled before interfaces,
8787         so we can apply attributes to interfaces.  But some attributes
8788         implement interfaces, we will now handle the simple cases
8789         (recursive definitions will just get an error).  
8790
8791         * parameter.cs: Only invalidate types at the end if we fail to
8792         lookup all types.  
8793
8794 2002-09-09  Martin Baulig  <martin@gnome.org>
8795
8796         * ecore.cs (PropertyExpr.Emit): Also check for
8797         TypeManager.system_int_array_get_length so this'll also work when
8798         compiling corlib.  Fixes #30003.
8799
8800 2002-09-09  Martin Baulig  <martin@gnome.org>
8801
8802         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8803         and throw an exception if we can't get the type's size.  Fixed #30040,
8804         added test-165.cs.
8805
8806 2002-09-09  Martin Baulig  <martin@gnome.org>
8807
8808         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8809
8810         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8811         context.  Fixes bug #30027.
8812
8813         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8814         virtual functions.  Fixes bug #30043, added test-164.cs.
8815
8816 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8817
8818         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8819
8820 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8821
8822         * driver.cs: Use an object to get the windows codepage since it's not a
8823         static property.
8824
8825 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8826
8827         * statement.cs (For.Emit): for infinite loops (test == null)
8828         return whether there is a break inside, not always "true".
8829
8830         * namespace.cs (UsingEntry): New struct to hold the name of the
8831         using definition, the location where it is defined, and whether it
8832         has been used in a successful type lookup.
8833
8834         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8835         strings.
8836
8837         * decl.cs: ditto.
8838
8839 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8840
8841         * attribute.cs : Fix incorrect code which relied on catching
8842         a NullReferenceException to detect a null being passed in
8843         where an object was expected.
8844
8845 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8846
8847         * statement.cs (Try): flag the catch variable as assigned
8848
8849         * expression.cs (Cast): Simplified by using ResolveType instead of
8850         manually resolving.
8851
8852         * statement.cs (Catch): Fix bug by using ResolveType.
8853
8854 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8855
8856         * expression.cs (BetterConversion): Special case for when we have
8857         a NullLiteral as the argument and we have to choose between string
8858         and object types - we choose string the way csc does.
8859
8860         * attribute.cs (Attribute.Resolve): Catch the
8861         NullReferenceException and report error #182 since the Mono
8862         runtime no more has the bug and having this exception raised means
8863         we tried to select a constructor which takes an object and is
8864         passed a null.
8865
8866 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8867
8868         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8869         message (1502, 1503) when we can't locate a method after overload
8870         resolution. This is much more informative and closes the bug
8871         Miguel reported.
8872
8873         * interface.cs (PopulateMethod): Return if there are no argument
8874         types. Fixes a NullReferenceException bug.
8875
8876         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8877         expressions too. Previously we were checking only in one place for
8878         positional arguments leaving out named arguments.
8879
8880         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8881         type to the enum type is not allowed. Remove code corresponding to
8882         that.
8883
8884         (ConvertNumericExplicit): Allow explicit conversions from
8885         the underlying type to enum type. This precisely follows the spec
8886         and closes a bug filed by Gonzalo.
8887
8888 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8889
8890         * compiler.csproj:
8891         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8892
8893 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8894
8895         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8896         it was important that we stored the right value after the
8897         reduction in `converted'.
8898
8899 2002-09-04  Martin Baulig  <martin@gnome.org>
8900
8901         * location.cs (Location.SymbolDocument): Use full pathnames for the
8902         source files.
8903
8904 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8905
8906         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8907         of the expression resolve mechanism, because that will catch the
8908         SimpleName error failures.
8909
8910         (Conditional): If we can not resolve the
8911         expression, return, do not crash.
8912
8913 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8914
8915         * cs-tokenizer.cs:
8916         (location): display token name instead of its number.
8917
8918 2002-08-28  Martin Baulig  <martin@gnome.org>
8919
8920         * expression.cs (Binary.ResolveOperator): Don't silently return
8921         but return an error if an operator cannot be applied between two
8922         enum types.
8923
8924 2002-08-28  Martin Baulig  <martin@gnome.org>
8925
8926         * class.cs (Constructor.Define): Set the permission attributes
8927         correctly instead of making all constructors public.
8928
8929 2002-08-28  Martin Baulig  <martin@gnome.org>
8930
8931         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8932         for private members before reporting a CS0103; if we find anything,
8933         it's a CS0122.
8934
8935 2002-08-28  Martin Baulig  <martin@gnome.org>
8936
8937         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8938         to check whether `closure_start_type == closure_invocation_type',
8939         we also need to check whether `m.DeclaringType == closure_invocation_type'
8940         before bypassing the permission checks.  We might be accessing
8941         protected/private members from the base class.
8942         (TypeManager.RealMemberLookup): Only set private_ok if private
8943         members were requested via BindingFlags.NonPublic.
8944
8945         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8946
8947         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8948         MethodGroupExpr.IsExplicitImpl if appropriate.
8949         (Invocation.DoResolve): Don't report the CS0120 for explicit
8950         interface implementations.
8951
8952 2002-08-27  Martin Baulig  <martin@gnome.org>
8953
8954         * expression.cs (Invocation.DoResolve): If this is a static
8955         method and we don't have an InstanceExpression, we must report
8956         a CS0120.
8957
8958 2002-08-25  Martin Baulig  <martin@gnome.org>
8959
8960         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8961         `==' between a valuetype and an object.
8962
8963 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8964
8965         * ecore.cs (TypeExpr): Provide a ToString method.
8966
8967 2002-08-24  Martin Baulig  <martin@gnome.org>
8968
8969         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8970         now called proggie.dbg and it's a binary file.
8971
8972 2002-08-23  Martin Baulig  <martin@gnome.org>
8973
8974         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8975
8976 2002-08-23  Martin Baulig  <martin@gnome.org>
8977
8978         * struct.cs (MyStructInfo.ctor): Make this work with empty
8979         structs; it's not allowed to use foreach() on null.
8980
8981 2002-08-23  Martin Baulig  <martin@gnome.org>
8982
8983         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8984         writer the full pathname of the generated assembly.
8985
8986 2002-08-23  Martin Baulig  <martin@gnome.org>
8987
8988         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8989         A `finally' block never returns or breaks; improved handling of
8990         unreachable code.
8991
8992 2002-08-23  Martin Baulig  <martin@gnome.org>
8993
8994         * statement.cs (Throw.Resolve): Allow `throw null'.
8995
8996 2002-08-23  Martin Baulig  <martin@gnome.org>
8997
8998         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8999         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9000         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9001         MemberLookup would return a wrong event if this is an explicit
9002         interface implementation and the class has an event with the same
9003         name.
9004
9005 2002-08-23  Martin Baulig  <martin@gnome.org>
9006
9007         * statement.cs (Block.AddChildVariableNames): New public method.
9008         (Block.AddChildVariableName): Likewise.
9009         (Block.IsVariableNameUsedInChildBlock): Likewise.
9010         (Block.AddVariable): Check whether a variable name has already
9011         been used in a child block.
9012
9013         * cs-parser.jay (declare_local_variables): Mark all variable names
9014         from the current block as being used in a child block in the
9015         implicit block.
9016
9017 2002-08-23  Martin Baulig  <martin@gnome.org>
9018
9019         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9020         find the symbol writer.
9021
9022         * driver.cs: csc also allows the arguments to /define being
9023         separated by commas, not only by semicolons.
9024
9025 2002-08-23  Martin Baulig  <martin@gnome.org>
9026
9027         * interface.cs (Interface.GetMembers): Added static check for events.
9028
9029 2002-08-15  Martin Baulig  <martin@gnome.org>
9030
9031         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9032         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9033
9034         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9035         why the MethodData.EmitDestructor() change was necessary.
9036
9037 2002-08-20  Martin Baulig  <martin@gnome.org>
9038
9039         * class.cs (TypeContainer.FindMembers): Added static check for events.
9040
9041         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9042
9043         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9044         use Type.GetEvents(), not Type.FindMembers().
9045
9046 2002-08-20  Martin Baulig  <martin@gnome.org>
9047
9048         * decl.cs (MemberCache): Added a special method cache which will
9049         be used for method-only searched.  This ensures that a method
9050         search will return a MethodInfo with the correct ReflectedType for
9051         inherited methods.      
9052
9053 2002-08-20  Martin Baulig  <martin@gnome.org>
9054
9055         * decl.cs (DeclSpace.FindMembers): Made this public.
9056
9057 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9058
9059         * delegate.cs: fixed build on windows.
9060         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9061
9062 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9063
9064         * ecore.cs (StandardConversionExists): Return a false
9065         if we are trying to convert the void type to anything else
9066         since that is not allowed.
9067
9068         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9069         we flag error 70 in the event an event is trying to be accessed
9070         directly from outside the declaring type.
9071
9072 2002-08-20  Martin Baulig  <martin@gnome.org>
9073
9074         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9075         MemberCache from typemanager.cs to decl.cs.
9076
9077 2002-08-19  Martin Baulig  <martin@gnome.org>
9078
9079         * class.cs (TypeContainer): Implement IMemberContainer.
9080         (TypeContainer.DefineMembers): Create the MemberCache.
9081         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9082         return public members if BindingFlags.Public was given, check
9083         whether members are static.
9084
9085 2002-08-16  Martin Baulig  <martin@gnome.org>
9086
9087         * decl.cs (DeclSpace.Define): Splitted this in Define and
9088         DefineMembers.  DefineMembers is called first and initializes the
9089         MemberCache.
9090
9091         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9092         DefineMembers() on all our DeclSpaces.
9093
9094         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9095         but call DefineMembers() on all nested interfaces.  We call their
9096         Define() in our new Define() function.
9097
9098         * interface.cs (Interface): Implement IMemberContainer.
9099         (Interface.Define): Moved all code except the attribute stuf to
9100         DefineMembers().
9101         (Interface.DefineMembers): Initialize the member cache.
9102
9103         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9104         need this anymore since we can use MemberCache.FindMembers directly.
9105
9106 2002-08-19  Martin Baulig  <martin@gnome.org>
9107
9108         * typemanager.cs (MemberCache): When creating the cache for an
9109         interface type, add all inherited members.
9110         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9111         to `out bool used_cache' and documented it.
9112         (TypeManager.MemberLookup): If we already used the cache in the first
9113         iteration, we don't need to do the interfaces check.
9114
9115 2002-08-19  Martin Baulig  <martin@gnome.org>
9116
9117         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9118         here from IMemberFinder and don't implement this interface anymore.
9119         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9120
9121         * typemanager.cs (IMemberFinder): This interface is now only used by
9122         classes which actually support the member cache.
9123         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9124         since we only put DeclSpaces into this Hashtable.
9125         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9126         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9127
9128 2002-08-16  Martin Baulig  <martin@gnome.org>
9129
9130         * typemanager.cs (ICachingMemberFinder): Removed.
9131         (IMemberFinder.MemberCache): New property.
9132         (TypeManager.FindMembers): Merged this with RealFindMembers().
9133         This function will never be called from TypeManager.MemberLookup()
9134         so we can't use the cache here, just the IMemberFinder.
9135         (TypeManager.MemberLookup_FindMembers): Check whether the
9136         IMemberFinder has a MemberCache and call the cache's FindMembers
9137         function.
9138         (MemberCache): Rewrote larger parts of this yet another time and
9139         cleaned it up a bit.
9140
9141 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9142
9143         * driver.cs (LoadArgs): Support quoting.
9144
9145         (Usage): Show the CSC-like command line arguments.
9146
9147         Improved a few error messages.
9148
9149 2002-08-15  Martin Baulig  <martin@gnome.org>
9150
9151         * typemanager.cs (IMemberContainer.Type): New property.
9152         (IMemberContainer.IsInterface): New property.
9153
9154         The following changes are conditional to BROKEN_RUNTIME, which is
9155         defined at the top of the file.
9156
9157         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9158         class'es members, but add all members from TypeHandle.ObjectType
9159         if we're an interface.
9160         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9161         is the current type.
9162         (MemberCache.CacheEntry.Container): Removed this field.
9163         (TypeHandle.GetMembers): Include inherited members.
9164
9165 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9166
9167         * typemanager.cs: fixed compilation and added a comment on a field that
9168         is never used.
9169
9170 2002-08-15  Martin Baulig  <martin@gnome.org>
9171
9172         * class.cs (ConstructorInitializer.Resolve): In the
9173         Expression.MemberLookup call, use the queried_type as
9174         invocation_type.
9175
9176         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9177         declared' attribute, it's always true.
9178         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9179         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9180         temporary wrapper for FindMembers which tells MemberLookup whether
9181         members from the base classes are included in the return value.
9182         This will go away soon.
9183         (TypeManager.MemberLookup): Use this temporary hack here; once the
9184         new MemberCache is completed, we don't need to do the DeclaredOnly
9185         looping here anymore since the MemberCache will take care of this.
9186         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9187         (MemberCache): When creating the MemberCache for a class, get
9188         members from the current class and all its base classes.
9189         (MemberCache.CacheEntry.Container): New field.  This is a
9190         temporary hack until the Mono runtime is fixed to distinguish
9191         between ReflectedType and DeclaringType.  It allows us to use MCS
9192         with both the MS runtime and the unfixed Mono runtime without
9193         problems and without accecting performance.
9194         (MemberCache.SearchMembers): The DeclaredOnly looping from
9195         TypeManager.MemberLookup is now done here.      
9196
9197 2002-08-14  Martin Baulig  <martin@gnome.org>
9198
9199         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9200         Type.GetFields on dynamic types but get the fields from the
9201         corresponding TypeContainer.
9202         (MyStructInfo.GetStructInfo): Added check for enum types.
9203
9204         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9205         (MemberList.SyncRoot): Implemented.
9206         (TypeManager.FilterWithClosure): No need to check permissions if
9207         closure_start_type == closure_invocation_type, don't crash if
9208         closure_invocation_type is null.
9209
9210 2002-08-13  Martin Baulig  <martin@gnome.org>
9211
9212         Rewrote TypeContainer.FindMembers to use a member cache.  This
9213         gives us a speed increase of about 35% for the self-hosting MCS
9214         build and of about 15-20% for the class libs (both on GNU/Linux).
9215
9216         * report.cs (Timer): New class to get enhanced profiling.  This
9217         whole class is "TIMER" conditional since it remarkably slows down
9218         compilation speed.
9219
9220         * class.cs (MemberList): New class.  This is an IList wrapper
9221         which we're now using instead of passing MemberInfo[]'s around to
9222         avoid copying this array unnecessarily.
9223         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9224         (ICachingMemberFinder, IMemberContainer): New interface.
9225         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9226         has already been checked, otherwise use it for the name comparision.
9227         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9228         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9229         if possible.  Returns a MemberList, not a MemberInfo [].
9230         (TypeHandle): New class, implements IMemberContainer.  We create
9231         one instance of this class per type, it contains a MemberCache
9232         which is used to do the member lookups.
9233         (MemberCache): New class.  Each instance of this class contains
9234         all members of a type and a name-based hash table.
9235         (MemberCache.FindMembers): This is our new member lookup
9236         function.  First, it looks up all members of the requested name in
9237         the hash table.  Then, it walks this list and sorts out all
9238         applicable members and returns them.
9239
9240 2002-08-13  Martin Baulig  <martin@gnome.org>
9241
9242         In addition to a nice code cleanup, this gives us a performance
9243         increase of about 1.4% on GNU/Linux - not much, but it's already
9244         half a second for the self-hosting MCS compilation.
9245
9246         * typemanager.cs (IMemberFinder): New interface.  It is used by
9247         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9248         Enum, Delegate or Interface.
9249         (TypeManager.finder_to_member_finder): New PtrHashtable.
9250         (TypeManager.finder_to_container): Removed.
9251         (TypeManager.finder_to_delegate): Removed.
9252         (TypeManager.finder_to_interface): Removed.
9253         (TypeManager.finder_to_enum): Removed.
9254
9255         * interface.cs (Interface): Implement IMemberFinder.
9256
9257         * delegate.cs (Delegate): Implement IMemberFinder.
9258
9259         * enum.cs (Enum): Implement IMemberFinder.
9260
9261         * class.cs (TypeContainer): Implement IMemberFinder.
9262
9263 2002-08-12  Martin Baulig  <martin@gnome.org>
9264
9265         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9266
9267 2002-08-12  Martin Baulig  <martin@gnome.org>
9268
9269         * ecore.cs (ITypeExpression): New interface for expressions which
9270         resolve to a type.
9271         (TypeExpression): Renamed to TypeLookupExpression.
9272         (Expression.DoResolve): If we're doing a types-only lookup, the
9273         expression must implement the ITypeExpression interface and we
9274         call DoResolveType() on it.
9275         (SimpleName): Implement the new ITypeExpression interface.
9276         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9277         hack, the situation that we're only looking up types can't happen
9278         anymore when this method is called.  Moved the type lookup code to
9279         DoResolveType() and call it.
9280         (SimpleName.DoResolveType): This ITypeExpression interface method
9281         is now doing the types-only lookup.
9282         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9283         (ResolveFlags): Added MaskExprClass.
9284
9285         * expression.cs (MemberAccess): Implement the ITypeExpression
9286         interface.
9287         (MemberAccess.DoResolve): Added support for a types-only lookup
9288         when we're called via ITypeExpression.DoResolveType().
9289         (ComposedCast): Implement the ITypeExpression interface.
9290
9291         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9292         Expression.Resolve() with ResolveFlags.Type instead.
9293
9294 2002-08-12  Martin Baulig  <martin@gnome.org>
9295
9296         * interface.cs (Interface.Define): Apply attributes.
9297
9298         * attribute.cs (Attribute.ApplyAttributes): Added support for
9299         interface attributes.
9300
9301 2002-08-11  Martin Baulig  <martin@gnome.org>
9302
9303         * statement.cs (Block.Emit): Only check the "this" variable if we
9304         do not always throw an exception.
9305
9306         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9307         whether the property has a set accessor.
9308
9309 2002-08-11  Martin Baulig  <martin@gnome.org>
9310
9311         Added control flow analysis support for structs.
9312
9313         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9314         with control flow analysis turned off.
9315         (IVariable): New interface.
9316         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9317         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9318         (FieldExpr.DoResolve): Resolve the instance expression with flow
9319         analysis turned off and do the definite assignment check after the
9320         resolving when we know what the expression will resolve to.
9321
9322         * expression.cs (LocalVariableReference, ParameterReference):
9323         Implement the new IVariable interface, only call the flow analysis
9324         code if ec.DoFlowAnalysis is true.
9325         (This): Added constructor which takes a Block argument.  Implement
9326         the new IVariable interface.
9327         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9328         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9329         This does the definite assignment checks for struct members.
9330
9331         * class.cs (Constructor.Emit): If this is a non-static `struct'
9332         constructor which doesn't have any initializer, call
9333         Block.AddThisVariable() to tell the flow analysis code that all
9334         struct elements must be initialized before control returns from
9335         the constructor.
9336
9337         * statement.cs (MyStructInfo): New public class.
9338         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9339         argument to this indexer.  If non-zero, check an individual struct
9340         member, not the whole struct.
9341         (FlowBranching.CheckOutParameters): Check struct members.
9342         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9343         overloaded versions of these methods which take an additional
9344         `int field_idx' argument to check struct members.
9345         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9346         overloaded versions of these methods which take an additional
9347         `string field_name' argument to check struct member.s
9348         (VariableInfo): Implement the IVariable interface.
9349         (VariableInfo.StructInfo): New public property.  Returns the
9350         MyStructInfo instance of the variable if it's a struct or null.
9351         (Block.AddThisVariable): New public method.  This is called from
9352         Constructor.Emit() for non-static `struct' constructor which do
9353         not have any initializer.  It creates a special variable for the
9354         "this" instance variable which will be checked by the flow
9355         analysis code to ensure that all of the struct's fields are
9356         initialized before control returns from the constructor.
9357         (UsageVector): Added support for struct members.  If a
9358         variable/parameter is a struct with N members, we reserve a slot
9359         in the usage vector for each member.  A struct is considered fully
9360         initialized if either the struct itself (slot 0) or all its
9361         members are initialized.
9362
9363 2002-08-08  Martin Baulig  <martin@gnome.org>
9364
9365         * driver.cs (Driver.MainDriver): Only report an error CS5001
9366         if there were no compilation errors.
9367
9368         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9369         `UnsafeContext' property to determine whether the parent is in
9370         unsafe context rather than checking the parent's ModFlags:
9371         classes nested in an unsafe class are unsafe as well.
9372
9373 2002-08-08  Martin Baulig  <martin@gnome.org>
9374
9375         * statement.cs (UsageVector.MergeChildren): Distinguish between
9376         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9377         we return.  Added test17() and test18() to test-154.cs.
9378
9379 2002-08-08  Martin Baulig  <martin@gnome.org>
9380
9381         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9382         Family access, make sure the invoking type isn't a subclass of the
9383         queried type (that'd be a CS1540).
9384
9385         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9386         this method which takes an additional `Type invocation_type'.
9387
9388         * expression.cs (BaseAccess.DoResolve): Use the base type as
9389         invocation and query type.
9390         (MemberAccess.DoResolve): If the lookup failed and we're about to
9391         report a CS0122, try a lookup with the ec.ContainerType - if this
9392         succeeds, we must report a CS1540.
9393
9394 2002-08-08  Martin Baulig  <martin@gnome.org>
9395
9396         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9397         (MethodGroupExpr): Implement the IMemberExpr interface.
9398
9399         * expression (MemberAccess.ResolveMemberAccess): No need to have
9400         any special code for MethodGroupExprs anymore, they're now
9401         IMemberExprs.   
9402
9403 2002-08-08  Martin Baulig  <martin@gnome.org>
9404
9405         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9406         Family, FamANDAssem and FamORAssem permissions.
9407         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9408
9409 2002-08-08  Martin Baulig  <martin@gnome.org>
9410
9411         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9412         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9413         or loop block.
9414
9415 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9416
9417         * driver.cs: implemented /resource option to embed managed resources.
9418
9419 2002-08-07  Martin Baulig  <martin@gnome.org>
9420
9421         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9422         (FieldBase.HasFieldInitializer): New public property.
9423         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9424         returns the field initializer and makes sure it is only resolved once.
9425         (TypeContainer.EmitFieldInitializers): Call
9426         FieldBase.GetInitializerExpression to get the initializer, this ensures
9427         that it isn't resolved multiple times.
9428
9429         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9430         the resolving process (SimpleName/MemberLookup) that we're currently
9431         emitting a field initializer (which must not access any instance members,
9432         this is an error CS0236).
9433
9434         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9435         argument, if the `IsFieldInitializer' flag is set, we must report and
9436         error CS0236 and not an error CS0120.   
9437
9438 2002-08-07  Martin Baulig  <martin@gnome.org>
9439
9440         * ecore.cs (IMemberExpr): New public interface.
9441         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9442         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9443         if the expression is an IMemberExpr.
9444
9445         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9446         to be null, implicitly default to `this' if we're non-static in
9447         this case.  Simplified the code a lot by using the new IMemberExpr
9448         interface.  Also fixed bug #28176 here.
9449
9450 2002-08-06  Martin Baulig  <martin@gnome.org>
9451
9452         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9453         ParameterReferences during semantic analysis so that we can do a
9454         type-only search when resolving Cast, TypeOf and SizeOf.
9455         (block): Pass the `current_local_parameters' to the Block's
9456         constructor.
9457
9458         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9459         argument to the constructor.
9460         (ConstructorInitializer.Resolve): Create a temporary implicit
9461         block with the parameters.
9462
9463         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9464         references here if we aren't doing a type-only search.
9465
9466         * statement.cs (Block): Added constructor which takes a
9467         `Parameters parameters' argument.
9468         (Block.Parameters): New public property.
9469
9470         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9471         to `Parameters' and made it public readonly.
9472
9473 2002-08-06  Martin Baulig  <martin@gnome.org>
9474
9475         * ecore.cs (Expression.Warning): Made this public as well.
9476
9477         * report.cs (Report.Debug): Print the contents of collections.
9478
9479 2002-08-06  Martin Baulig  <martin@gnome.org>
9480
9481         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9482         used to tell Resolve() which kinds of expressions it may return.
9483         (Expression.Resolve): Added overloaded version of this method which
9484         takes a `ResolveFlags flags' argument.  This can be used to tell
9485         Resolve() which kinds of expressions it may return.  Reports a
9486         CS0118 on error.
9487         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9488         ResolveFlags.SimpleName.
9489         (Expression.Error118): Added overloaded version of this method which
9490         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9491         which kinds of expressions are allowed.
9492
9493         * expression.cs (Argument.ResolveMethodGroup): New public method.
9494         Resolves an argument, but allows a MethodGroup to be returned.
9495         This is used when invoking a delegate.
9496
9497         * TODO: Updated a bit.
9498
9499 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9500
9501         Fixed compilation with csc.
9502
9503         * ecore.cs: Expression.Error made public. Is this correct? Should
9504         Warning be made public too?
9505
9506         * expression.cs: use ea.Location instead of ea.loc.
9507         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9508
9509 2002-08-06  Martin Baulig  <martin@gnome.org>
9510
9511         * ecore.cs (Expression.loc): Moved the location here instead of
9512         duplicating it in all derived classes.
9513         (Expression.Location): New public property.
9514         (Expression.Error, Expression.Warning): Made them non-static and
9515         removed the location argument.
9516         (Expression.Warning): Added overloaded version which takes an
9517         `int level' argument.
9518         (Expression.Error118): Make this non-static and removed the
9519         expression and location arguments.
9520         (TypeExpr): Added location argument to the constructor.
9521
9522         * expression.cs (StaticCallExpr): Added location argument to
9523         the constructor.
9524         (Indirection, PointerArithmetic): Likewise.
9525         (CheckedExpr, UnCheckedExpr): Likewise.
9526         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9527         (StringPtr): Likewise.
9528
9529
9530 2002-08-05  Martin Baulig  <martin@gnome.org>
9531
9532         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9533
9534         * assign.cs (Assign.DoResolve): Check whether the source
9535         expression is a value or variable.
9536
9537         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9538         while resolving the corresponding blocks.
9539
9540         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9541         an error, don't silently return null.
9542
9543         * statement.cs (Block.AddVariable): Do the error reporting here
9544         and distinguish between CS0128 and CS0136.
9545         (Block.DoResolve): Report all unused labels (warning CS0164).
9546         (LabeledStatement): Pass the location to the constructor.
9547         (LabeledStatement.HasBeenReferenced): New property.
9548         (LabeledStatement.Resolve): Set it to true here.
9549
9550         * statement.cs (Return.Emit): Return success even after reporting
9551         a type mismatch error (CS0126 or CS0127), this is what csc does and
9552         it avoids confusing the users with any consecutive errors.
9553
9554 2002-08-05  Martin Baulig  <martin@gnome.org>
9555
9556         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9557
9558         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9559
9560         * expression.cs (MemberAccess.DoResolve): Silently return if an
9561         error has already been reported.
9562
9563         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9564         error has already been reported.
9565
9566 2002-08-05  Martin Baulig  <martin@gnome.org>
9567
9568         * statement.cs (UsageVector): Only initialize the `parameters'
9569         vector if we actually have any "out" parameters.
9570
9571 2002-08-05  Martin Baulig  <martin@gnome.org>
9572
9573         * expression.cs (Binary.ResolveOperator): When combining delegates,
9574         they must have the same type.
9575
9576 2002-08-05  Martin Baulig  <martin@gnome.org>
9577
9578         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9579         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9580         work with the ms runtime and we also don't need it: if we're a
9581         PropertyBuilder and not in the `indexer_arguments' hash, then we
9582         are a property and not an indexer.
9583
9584         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9585         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9586         since the latter one doesn't work with the ms runtime.
9587
9588 2002-08-03  Martin Baulig  <martin@gnome.org>
9589
9590         Fixed bugs #27998 and #22735.
9591
9592         * class.cs (Method.IsOperator): New public field.
9593         (Method.CheckBase): Report CS0111 if there's already a method
9594         with the same parameters in the current class.  Report CS0508 when
9595         attempting to change the return type of an inherited method.
9596         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9597         and it's not marked abstract or extern.
9598         (PropertyBase): New abstract base class for Property and Indexer.
9599         (PropertyBase.CheckBase): Moved here from Property and made it work
9600         for indexers.
9601         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9602         the same so we can reuse it there.
9603         (Property, Indexer): Derive from PropertyBase.
9604         (MethodSignature.inheritable_property_signature_filter): New delegate
9605         to find properties and indexers.
9606
9607         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9608         argument and improved error reporting.
9609
9610         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9611         EmptyReadOnlyParameters and made it a property.
9612
9613         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9614         version of this method which takes a `PropertyInfo indexer'.
9615         (TypeManager.RegisterIndexer): New method.
9616
9617         * class.cs: Added myself as author of this file :-)
9618
9619 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9620
9621         * class.cs: fixed compilation on windoze.
9622
9623 2002-08-03  Martin Baulig  <martin@gnome.org>
9624
9625         * interface.cs (Interface.GetInterfaceBases): Check whether all
9626         base interfaces are at least as accessible than the current one.
9627
9628         * class.cs (TypeContainer.GetClassBases): Check whether base types
9629         are at least as accessible than the current type.
9630         (TypeContainer.AsAccessible): Implemented and made non-static.
9631         (MemberBase.CheckParameters): Report errors if the accessibility
9632         checks fail.
9633
9634         * delegate.cs (Delegate.Delegate): The default visibility is
9635         internal for top-level types and private for nested types.
9636         (Delegate.Define): Report errors if the accessibility checks fail.
9637
9638         * enum.cs (Enum.Enum): The default visibility is internal for
9639         top-level types and private for nested types.
9640         (Enum.DefineType): Compute the correct visibility.
9641
9642         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9643         function which takes a `bool is_toplevel' instead of a TypeContainer.
9644
9645         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9646         builtin type.
9647
9648 2002-08-02  Martin Baulig  <martin@gnome.org>
9649
9650         * expression.cs (LocalVariableReferenc): Added constructor which
9651         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9652         (LocalVariableReference.IsReadOnly): New property.
9653         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9654         variable is readonly, use our own readonly flag to do this; you can
9655         use the new constructor to get a writable reference to a read-only
9656         variable.
9657
9658         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9659         reference to the local variable.
9660
9661 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9662
9663         * rootcontext.cs (ResolveCore): Also include System.Exception
9664
9665         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9666         we reach an EmptyStatement.
9667
9668         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9669         is also fine.
9670
9671         * expression.cs (Binary.ResolveOperator): Check error result in
9672         two places.
9673
9674         use brtrue/brfalse directly and avoid compares to null.
9675
9676 2002-08-02  Martin Baulig  <martin@gnome.org>
9677
9678         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9679         Fixes bug #28407, added test-155.cs.
9680
9681 2002-08-01  Martin Baulig  <martin@gnome.org>
9682
9683         * class.cs (Event.EmitDefaultMethod): Make this work with static
9684         events.  Fixes #28311, added verify-3.cs.
9685
9686 2002-08-01  Martin Baulig  <martin@gnome.org>
9687
9688         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9689         `is_disposable' fields.
9690         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9691         `hm.is_disposable' if we're using the collection pattern.
9692         (Foreach.EmitCollectionForeach): Use the correct type for the
9693         enumerator's local variable, only emit the try/finally block if
9694         necessary (fixes #27713).
9695
9696 2002-08-01  Martin Baulig  <martin@gnome.org>
9697
9698         * ecore.cs (Expression.report118): Renamed to Error118 and made
9699         it public static.
9700
9701         * statement.cs (Throw.Resolve): Check whether the expression is of
9702         the correct type (CS0118) and whether the type derives from
9703         System.Exception (CS0155).
9704         (Catch.Resolve): New method.  Do the type lookup here and check
9705         whether it derives from System.Exception (CS0155).
9706         (Catch.CatchType, Catch.IsGeneral): New public properties.
9707
9708         * typemanager.cs (TypeManager.exception_type): Added.
9709
9710 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9711
9712         * driver.cs: Updated About function.
9713
9714 2002-07-31  Martin Baulig  <martin@gnome.org>
9715
9716         Implemented Control Flow Analysis.
9717
9718         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9719         (EmitContext.CurrentBranching): Added.
9720         (EmitContext.StartFlowBranching): Added.
9721         (EmitContext.EndFlowBranching): Added.
9722         (EmitContext.KillFlowBranching): Added.
9723         (EmitContext.IsVariableAssigned): Added.
9724         (EmitContext.SetVariableAssigned): Added.
9725         (EmitContext.IsParameterAssigned): Added.
9726         (EmitContext.SetParameterAssigned): Added.
9727         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9728         Added control flow analysis stuff here.
9729
9730         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9731         resolve the expression as lvalue.
9732         (LocalVariableReference.DoResolve): Check whether the variable has
9733         already been assigned.
9734         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9735         the parameter as assigned here.
9736         (ParameterReference.DoResolve): Check whether the parameter has already
9737         been assigned.
9738         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9739         expression as lvalue.
9740
9741         * statement.cs (FlowBranching): New class for the flow analysis code.
9742         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9743         (LabeledStatement.IsDefined): New public property.
9744         (LabeledStatement.AddUsageVector): New public method to tell flow
9745         analyis that the label may be reached via a forward jump.
9746         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9747         flow analysis.
9748         (VariableInfo.Number): New public field.  This is used by flow analysis
9749         to number all locals of a block.
9750         (Block.CountVariables): New public property.  This is the number of
9751         local variables in this block (including the locals from all parent
9752         blocks).
9753         (Block.EmitMeta): Number all the variables.
9754
9755         * statement.cs: Added flow analysis support to all classes.
9756
9757 2002-07-31  Martin Baulig  <martin@gnome.org>
9758
9759         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9760         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9761         then use this argument.
9762
9763         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9764
9765         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9766         use this to specify /define options.
9767
9768 2002-07-29  Martin Baulig  <martin@gnome.org>
9769
9770         * statement.cs (Fixed): Moved all code that does variable lookups
9771         and resolvings from Emit to Resolve.
9772
9773         * statement.cs (For): Moved all code that does variable lookups
9774         and resolvings from Emit to Resolve.
9775
9776         * statement.cs (Using): Moved all code that does variable lookups
9777         and resolvings from Emit to Resolve.
9778
9779 2002-07-29  Martin Baulig  <martin@gnome.org>
9780
9781         * attribute.cs (Attribute.Resolve): Explicitly catch a
9782         System.NullReferenceException when creating the
9783         CustromAttributeBuilder and report a different warning message.
9784
9785 2002-07-29  Martin Baulig  <martin@gnome.org>
9786
9787         * support.cs (ParameterData.ParameterName): Added method to
9788         get the name of a parameter.
9789
9790         * typemanager.cs (TypeManager.IsValueType): New public method.
9791
9792 2002-07-29  Martin Baulig  <martin@gnome.org>
9793
9794         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9795         is a flag which specifies that it's either ref or out.
9796         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9797         the out parameter to `out Parameter.Modifier mod', also set the
9798         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9799
9800         * support.cs (InternalParameters.ParameterModifier): Distinguish
9801         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9802         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9803
9804         * expression.cs (Argument.GetParameterModifier): Distinguish
9805         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9806         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9807
9808 2002-07-29  Martin Baulig  <martin@gnome.org>
9809
9810         * expression.cs (ParameterReference.ParameterReference): Added
9811         `Location loc' argument to the constructor.
9812
9813         * cs-parser.jay: Pass location to ParameterReference.
9814
9815 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9816
9817         * statement.cs (Try): Initialize the location.
9818
9819         * cs-parser.jay: pass location to Try.
9820
9821         * expression.cs (Unary.Reduce): Change the prototype to return
9822         whether a constant fold could be performed or not.  The result is
9823         returned in an out parameters.  In the case of Indirection and
9824         AddressOf, we want to perform the full tests.
9825
9826 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9827
9828         * statement.cs (Statement.Emit): Flag dead code.
9829
9830 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9831
9832         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9833
9834 2002-07-27  Martin Baulig  <martin@gnome.org>
9835
9836         * class.cs (MethodData.Define): Put back call to
9837         TypeManager.AddMethod(), accidentally commented this out.
9838
9839         * report.cs (Debug): New public method to print debugging information,
9840         this is `[Conditional ("DEBUG")]'.
9841
9842 2002-07-26  Martin Baulig  <martin@gnome.org>
9843
9844         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9845         (switch_statement): Push the current_block to the switch_stack and
9846         pop it again when we're done with the switch.
9847         (switch_section): The new block is a child of the current_block.
9848         Fixes bug #24007, added test-152.cs.
9849
9850 2002-07-27  Martin Baulig  <martin@gnome.org>
9851
9852         * expression.cs (Invocation.EmitArguments): When calling a varargs
9853         function with only its fixed arguments, we need to pass an empty
9854         array.
9855
9856 2002-07-27  Martin Baulig  <martin@gnome.org>
9857
9858         Mono 0.13 has been released.
9859
9860 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9861
9862         * driver.cs: Rename --resource to --linkres, because that is what
9863         we do currently, we dont support --resource yet.
9864
9865         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9866
9867 2002-07-25  Martin Baulig  <martin@gnome.org>
9868
9869         * class.cs (MethodData): New public class.  This is a `method builder'
9870         class for a method or one accessor of a Property/Indexer/Event.
9871         (MethodData.GetMethodFlags): Moved here from MemberBase.
9872         (MethodData.ApplyAttributes): Likewise.
9873         (MethodData.ApplyObsoleteAttribute): Likewise.
9874         (MethodData.ApplyConditionalAttribute): Likewise.
9875         (MethodData.ApplyDllImportAttribute): Likewise.
9876         (MethodData.CheckAbstractAndExternal): Likewise.
9877         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9878         (MethodData.Emit): Formerly known as Method.Emit().
9879         (MemberBase): Moved everything which was specific to a single
9880         accessor/method to MethodData.
9881         (Method): Create a new MethodData and call Define() and Emit() on it.
9882         (Property, Indexer, Event): Create a new MethodData objects for each
9883         accessor and call Define() and Emit() on them.
9884
9885 2002-07-25  Martin Baulig  <martin@gnome.org>
9886
9887         Made MethodCore derive from MemberBase to reuse the code from there.
9888         MemberBase now also checks for attributes.
9889
9890         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9891         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9892         as virtual.
9893         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9894         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9895         (MemberBase.ApplyAttributes): New virtual method; applies the
9896         attributes to a method or accessor.
9897         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9898         (MemberBase.ApplyConditionalAttribute): Likewise.
9899         (MemberBase.ApplyDllImportAttribute): Likewise.
9900         (MemberBase.CheckAbstractAndExternal): Likewise.
9901         (MethodCore.ParameterTypes): This is now a property instead of a
9902         method, it's initialized from DoDefineParameters().
9903         (MethodCore.ParameterInfo): Removed the set accessor.
9904         (MethodCore.DoDefineParameters): New protected virtual method to
9905         initialize ParameterTypes and ParameterInfo.
9906         (Method.GetReturnType): We can now simply return the MemberType.
9907         (Method.GetMethodFlags): Override the MemberBase version and add
9908         the conditional flags.
9909         (Method.CheckBase): Moved some code from Define() here, call
9910         DoDefineParameters() here.
9911         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9912         here to avoid some larger code duplication.
9913         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9914         ensure that abstract and external accessors don't declare a body.
9915
9916         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9917         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9918         lookup in the attribute's parent classes, so we need to abort as soon
9919         as we found the first match.
9920         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9921         the attribute has no arguments.
9922
9923         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9924         of a Method.
9925
9926 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9927
9928         * cs-parser.jay: reverted previous patch.
9929
9930 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9931
9932         * cs-parser.jay: fixed bug #22119.
9933
9934 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9935
9936         * attribute.cs: fixed compilation. The error was:
9937         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9938         be assigned to before control leaves the current method."
9939         [FIXME:  Filed as bug #28186: MCS must report this error.]
9940
9941 2002-07-25  Martin Baulig  <martin@gnome.org>
9942
9943         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9944         method to pull the condition name ouf of a Conditional attribute.
9945         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9946         the obsolete message and error flag out of an Obsolete attribute.
9947
9948         * class.cs (Method.GetMethodFlags): New public method to get the
9949         TypeManager.MethodFlags for this method.
9950         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9951         private methods.
9952         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9953         if we're overriding a virtual function, set the new private variable
9954         `parent_method'; call the new TypeManager.AddMethod().
9955
9956         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9957         the MethodBuilder and the Method in a PtrHashtable.
9958         (TypeManager.builder_to_method): Added for this purpose.
9959         (TypeManager.MethodFlags): Added IsObsoleteError.
9960         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9961         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9962         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9963         the message from the attribute.
9964
9965 2002-07-24  Martin Baulig  <martin@gnome.org>
9966
9967         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9968         preprocessor directives, ensure that the argument to #define/#undef is
9969         exactly one identifier and that it's actually an identifier.
9970
9971         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9972         did not work ....
9973
9974 2002-07-24  Martin Baulig  <martin@gnome.org>
9975
9976         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9977         initialize it to TypeManager.object_type in the constructor.
9978         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9979         of the `hm.get_current' method if we're using the collection pattern.
9980         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9981         for the explicit conversion to make it work when we're using the collection
9982         pattern and the `Current' property has a different return type than `object'.
9983         Fixes #27713.
9984
9985 2002-07-24  Martin Baulig  <martin@gnome.org>
9986
9987         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9988         does not match, but don't report any errors.  This method is called in
9989         order for all methods in a MethodGroupExpr until a matching method is
9990         found, so we don't want to bail out if the first method doesn't match.
9991         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9992         matches, report the 123.  Fixes #28070.
9993
9994 2002-07-24  Martin Baulig  <martin@gnome.org>
9995
9996         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9997         TypeManager.TypeToCoreType() to the top of the method so the
9998         following equality checks will work.  Fixes #28107.
9999
10000 2002-07-24  Martin Baulig  <martin@gnome.org>
10001
10002         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10003         operand is of type uint, and the other operand is of type sbyte,
10004         short or int, the operands are converted to type long." -
10005         Actually do what this comment already told us.  Fixes bug #28106,
10006         added test-150.cs.
10007
10008 2002-07-24  Martin Baulig  <martin@gnome.org>
10009
10010         * class.cs (MethodBase): New abstract class.  This is now a base
10011         class for Property, Indexer and Event to avoid some code duplication
10012         in their Define() and DefineMethods() methods.
10013         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10014         generic methods for Define() and DefineMethods().
10015         (FieldBase): Derive from MemberBase, not MemberCore.
10016         (Property): Derive from MemberBase, not MemberCore.
10017         (Property.DefineMethod): Moved all the code from this method to the
10018         new MethodBase.DefineAccessor(), just call it with appropriate
10019         argumetnts.
10020         (Property.Define): Call the new Property.DoDefine(), this does some
10021         sanity checks and we don't need to duplicate the code everywhere.
10022         (Event): Derive from MemberBase, not MemberCore.
10023         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10024         accessors, this will also make them work with interface events.
10025         (Indexer): Derive from MemberBase, not MemberCore.
10026         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10027         (Indexer.Define): Use the new MethodBase functions.
10028
10029         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10030         argument to the constructor.
10031         (Interface.FindMembers): Added support for interface events.
10032         (Interface.PopluateEvent): Implemented.
10033
10034         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10035
10036 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10037
10038         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10039         but this is required to check for a method name being the same as
10040         the containing class.  
10041
10042         Handle this now.
10043
10044 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10045
10046         * interface.cs: initialize variable.
10047
10048 2002-07-23  Martin Baulig  <martin@gnome.org>
10049
10050         Implemented the IndexerName attribute in interfaces.
10051
10052         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10053         name if this is an explicit interface implementation.
10054         (Indexer.InterfaceIndexerName): New public variable.  If we're
10055         implementing an interface indexer, this is the IndexerName in that
10056         interface.  Otherwise, it's the IndexerName.
10057         (Indexer.DefineMethod): If we're implementing interface indexer,
10058         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10059         and Pending.ImplementIndexer methods.
10060         (Indexer.Define): Also define the PropertyBuilder if we're
10061         implementing an interface indexer and this is neither an explicit
10062         interface implementation nor do the IndexerName match the one in
10063         the interface.
10064
10065         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10066         If a method is defined here, then we always need to create a proxy
10067         for it.  This is used when implementing interface indexers.
10068         (Pending.IsInterfaceIndexer): New public method.
10069         (Pending.ImplementIndexer): New public method.
10070         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10071         This is used when implementing interface indexers to define a proxy
10072         if necessary.
10073         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10074         define a proxy if necessary.
10075
10076         * interface.cs (Interface.IndexerName): New public variable.
10077         (Interface.PopulateIndexer): Set the IndexerName.
10078         (Interface.DefineIndexers): New private method.  Populate all the
10079         indexers and make sure their IndexerNames match.
10080
10081         * typemanager.cs (IndexerPropertyName): Added support for interface
10082         indexers.
10083
10084 2002-07-22  Martin Baulig  <martin@gnome.org>
10085
10086         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10087         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10088         ret if HasReturnLabel.
10089         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10090         variables.
10091
10092         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10093         and set the ec.LoopBeginTryCatchLevel.
10094         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10095         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10096         the current ec.TryCatchLevel, the branch goes out of an exception
10097         block.  In this case, we need to use Leave and not Br.
10098
10099 2002-07-22  Martin Baulig  <martin@gnome.org>
10100
10101         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10102         block unless the block does not always return or it is contained in
10103         another try { ... } catch { ... } block.  Fixes bug #26506.
10104         Added verify-1.cs to the test suite.
10105
10106 2002-07-22  Martin Baulig  <martin@gnome.org>
10107
10108         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10109         then we do not always return.  Fixes bug #24985.
10110
10111 2002-07-22  Martin Baulig  <martin@gnome.org>
10112
10113         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10114         lookup on a per-class level; ie. walk up the class hierarchy until we
10115         found at least one applicable method, then choose the best among them.
10116         Fixes bug #24463 and test-29.cs.
10117
10118 2002-07-22  Martin Baulig  <martin@gnome.org>
10119
10120         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10121         return types of the methods.  The return type is not part of the
10122         signature and we must not check it to make the `new' modifier work.
10123         Fixes bug #27999, also added test-147.cs.
10124         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10125
10126         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10127         on the method's return type.
10128
10129 2002-07-21  Martin Baulig  <martin@gnome.org>
10130
10131         * assign.cs: Make this work if the rightmost source is a constant and
10132         we need to do an implicit type conversion.  Also adding a few more tests
10133         to test-38.cs which should have caught this.
10134
10135         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10136         target in the makefile for this.  The makefile.gnu is primarily intended
10137         for end-users who don't want to debug the compiler.
10138
10139 2002-07-21  Martin Baulig  <martin@gnome.org>
10140
10141         * assign.cs: Improved the Assign class so it can now handle embedded
10142         assignments (X = Y = Z = something).  As a side-effect this'll now also
10143         consume less local variables.  test-38.cs now passes with MCS, added
10144         a few new test cases to that test.
10145
10146 2002-07-20  Martin Baulig  <martin@gnome.org>
10147
10148         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10149         instructions.  Fixes bug #27977, also added test-146.cs.
10150
10151 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10152
10153         * cs-tokenizer.cs: fixed getHex ().
10154
10155 2002-07-19  Martin Baulig  <martin@gnome.org>
10156
10157         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10158         not Type.GetType() to lookup the array type.  This is needed when
10159         we're constructing an array of a user-defined type.
10160         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10161         single-dimensional arrays, but also for single-dimensial arrays of
10162         type decimal.
10163
10164 2002-07-19  Martin Baulig  <martin@gnome.org>
10165
10166         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10167         this function is called, it's not allowed to share LocalBuilders
10168         among ILGenerators.
10169
10170 2002-07-19  Martin Baulig  <martin@gnome.org>
10171
10172         * expression.cs (Argument.Resolve): Report an error 118 when trying
10173         to pass a type as argument.
10174
10175 2002-07-18  Martin Baulig  <martin@gnome.org>
10176
10177         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10178         Conv_R_Un for the signed `long' type.
10179
10180 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10181
10182         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10183         `expr' for the temporary result, as that will fail if we do
10184         multiple resolves on the same expression.
10185
10186 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10187
10188         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10189         ec.TypeContainer for looking up aliases. 
10190
10191         * class.cs (TypeContainer): Remove LookupAlias from here.
10192
10193         * decl.cs (DeclSpace); Move here.
10194
10195 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10196
10197         * class.cs (FindMembers): Only call filter if the constructor
10198         bulider is not null.
10199
10200         Also handle delegates in `NestedTypes' now.  Now we will perform
10201         type lookups using the standard resolution process.  This also
10202         fixes a bug.
10203
10204         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10205         This uses Expressions (the limited kind that can be parsed by the
10206         tree) instead of strings.
10207
10208         * expression.cs (ComposedCast.ToString): Implement, used to flag
10209         errors since now we have to render expressions.
10210
10211         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10212         FormArrayType. 
10213
10214         * ecore.cs (SimpleName.ToString): ditto.
10215
10216         * cs-parser.jay: Instead of using strings to assemble types, use
10217         Expressions to assemble the type (using SimpleName, ComposedCast,
10218         MemberAccess).  This should fix the type lookups in declarations,
10219         because we were using a different code path for this.
10220
10221         * statement.cs (Block.Resolve): Continue processing statements
10222         even when there is an error.
10223
10224 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10225
10226         * class.cs (Event.Define): Also remove the `remove' method from
10227         the list of pending items.
10228
10229         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10230         generate more compact code. 
10231
10232 2002-07-17  Martin Baulig  <martin@gnome.org>
10233
10234         * const.cs (Const.LookupConstantValue): Add support for constant
10235         `unchecked' and `checked' expressions.
10236         Also adding test case test-140.cs for this.
10237
10238 2002-07-17  Martin Baulig  <martin@gnome.org>
10239
10240         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10241         check whether mi.ReturnType implements the IEnumerator interface; the
10242         `==' and the IsAssignableFrom() will fail in this situation.
10243
10244 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10245
10246         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10247         here too.
10248
10249 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10250
10251         * expression.cs: fixed bug #27811.
10252
10253 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10254
10255         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10256         Molaro: when we are a ref, the value already contains a pointer
10257         value, do not take the address of it.
10258
10259 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10260         * removed mb-parser.jay and mb-tokenizer.cs
10261
10262 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10263
10264         * expression.cs: check against the building corlib void type.
10265
10266 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10267
10268         * ecore.cs: fix for valuetype static readonly fields: when 
10269         initializing them, we need their address, not the address of a copy.
10270
10271 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10272
10273         * typemanager.cs: register also enum_type in corlib.
10274
10275 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10276
10277         * class.cs: allow calling this (but not base) initializers in structs.
10278
10279 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10280
10281         * ecore.cs: make sure we compare against the building base types
10282         in GetTypeSize ().
10283
10284 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10285
10286         * typemanager.cs: fix TypeToCoreType() to handle void and object
10287         (corlib gets no more typerefs after this change).
10288
10289 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10290
10291         * expression.cs (ArrayCreation.EmitArrayArguments): use
10292         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10293
10294         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10295         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10296         array indexes, the runtime actually forbids them.
10297
10298         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10299         for array arguments here.
10300
10301         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10302         instead of the default for ValueTypes.
10303
10304         (New.DoEmit): Use IsValueType instead of
10305         IsSubclassOf (value_type)
10306         (New.DoResolve): ditto.
10307         (Invocation.EmitCall): ditto.
10308
10309         * assign.cs (Assign): ditto.
10310
10311         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10312         Statements *are* currently doing part of their resolution during
10313         Emit.  
10314
10315         Expressions do always resolve during resolve, but statements are
10316         only required to propagate resolution to their children.
10317
10318 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10319
10320         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10321
10322         (LoadAssembly): Do not add the dll if it is already specified
10323
10324         (MainDriver): Add the System directory to the link path at the end,
10325         after all the other -L arguments. 
10326
10327         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10328         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10329         ldelem.u1) and using the opposite for sbytes.
10330
10331         This fixes Digger, and we can finally run it.
10332
10333         * driver.cs (UnixParseOption): Move the option parsing here.  
10334         (CSCParseOption): Implement CSC-like parsing of options.
10335
10336         We now support both modes of operation, the old Unix way, and the
10337         new CSC-like way.  This should help those who wanted to make cross
10338         platform makefiles.
10339
10340         The only thing broken is that /r:, /reference: and /lib: are not
10341         implemented, because I want to make those have the same semantics
10342         as the CSC compiler has, and kill once and for all the confussion
10343         around this.   Will be doing this tomorrow.
10344
10345         * statement.cs (Unsafe.Resolve): The state is checked during
10346         resolve, not emit, so we have to set the flags for IsUnsfe here.
10347
10348 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10349
10350         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10351         not catch the Error_ObjectRefRequired in SimpleName (as it is
10352         possible to have a class/instance variable name that later gets
10353         deambiguated), we have to check this here.      
10354
10355 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10356
10357         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10358         make static and put into Expression.
10359
10360         (Event.Define): Register the private field of the event with the 
10361         TypeManager so that GetFieldFromEvent can get at it.
10362
10363         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10364         keep track of the private field associated with an event which
10365         has no accessors.
10366
10367         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10368         private field.
10369
10370         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10371
10372 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10373
10374         * expression.cs (Binary.EmitBranchable): this routine emits the
10375         Binary expression in a branchable context.  This basically means:
10376         we need to branch somewhere, not just get the value on the stack.
10377
10378         This works together with Statement.EmitBoolExpression.
10379
10380         * statement.cs (Statement.EmitBoolExpression): Use
10381         EmitBranchable. 
10382
10383 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10384
10385         * statement.cs (For): Reduce the number of jumps in loops.
10386
10387         (For): Implement loop inversion for the For statement.
10388
10389         (Break): We can be breaking out of a Try/Catch controlled section
10390         (foreach might have an implicit try/catch clause), so we need to
10391         use Leave instead of Br.
10392
10393         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10394         now).  If the instace expression supports IMemoryLocation, we use
10395         the AddressOf method from the IMemoryLocation to extract the
10396         address instead of emitting the instance.
10397
10398         This showed up with `This', as we were emitting the instance
10399         always (Emit) instead of the Address of This.  Particularly
10400         interesting when This is a value type, as we dont want the Emit
10401         effect (which was to load the object).
10402
10403 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10404
10405         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10406
10407         * statement.cs (Checked): Set the CheckedState during the resolve
10408         process too, as the ConvCast operations track the checked state on
10409         the resolve process, and not emit.
10410
10411         * cs-parser.jay (namespace_member_declaration): Flag that we have
10412         found a declaration when we do.  This is used to flag error 1529
10413
10414         * driver.cs: Report ok when we display the help only.
10415
10416 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10417
10418         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10419
10420 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10421
10422         * cs-tokenizer.cs (define): We also have to track locally the
10423         defines.  AllDefines is just used for the Conditional Attribute,
10424         but we also need the local defines for the current source code. 
10425
10426 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10427
10428         * statement.cs (While, For, Do): These loops can exit through a
10429         Break statement, use this information to tell whether the
10430         statement is the last piece of code.
10431
10432         (Break): Flag that we break.
10433
10434         * codegen.cs (EmitContexts): New `Breaks' state variable.
10435
10436 2002-07-03  Martin Baulig  <martin@gnome.org>
10437
10438         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10439         modifiers in method declarations in structs.  Otherwise, you won't
10440         be able to override things like Object.Equals().
10441
10442 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10443
10444         * class.cs (Method, Property, Indexer): Do not allow the public
10445         modifier to be used in explicit interface implementations.
10446
10447         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10448         override modifiers in method declarations in structs
10449
10450 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10451
10452         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10453         integer or real overflow, report an error
10454
10455 2002-07-02  Martin Baulig  <martin@gnome.org>
10456
10457         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10458         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10459         to tell the runtime about our newly created System.Object and
10460         System.ValueType types.
10461
10462 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10463
10464         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10465         struct instead of Ldarg/Starg.
10466
10467 2002-07-02  Martin Baulig  <martin@gnome.org>
10468
10469         * expression.cs (Indirection.Indirection): Call
10470         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10471
10472 2002-07-02  Martin Baulig  <martin@gnome.org>
10473
10474         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10475         ValueType, call TypeManager.TypeToCoreType() on it.
10476         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10477         the OpCodes.Newarr argument.
10478
10479 2002-07-02  Martin Baulig  <martin@gnome.org>
10480
10481         * expression.cs (Invocation.EmitCall): When compiling corlib,
10482         replace all calls to the system's System.Array type to calls to
10483         the newly created one.
10484
10485         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10486         System.Array methods.
10487         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10488         from the system's System.Array type which must be replaced.
10489
10490 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10491
10492         * typemanager.cs: load unverifiable_code_ctor so we can build
10493         corlib using the correct type. Avoid using GetTypeCode() with
10494         TypeBuilders.
10495         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10496         TypeManager.object_type to allow building corlib.
10497
10498 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10499
10500         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10501
10502 2002-07-01  Martin Baulig  <martin@gnome.org>
10503
10504         * class.cs: Make the last change actually work, we need to check
10505         whether `ifaces != null' to avoid a crash.
10506
10507 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10508
10509         * class.cs: when we build structs without fields that implement
10510         interfaces, we need to add the interfaces separately, since there is
10511         no API to both set the size and add the interfaces at type creation
10512         time.
10513
10514 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10515
10516         * expression.cs: the dimension arguments to the array constructors
10517         need to be converted if they are a long.
10518
10519 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10520
10521         * class.cs: don't emit ldarg.0 if there is no parent constructor
10522         (fixes showstopper for corlib).
10523
10524 2002-06-29  Martin Baulig  <martin@gnome.org>
10525
10526         MCS now compiles corlib on GNU/Linux :-)
10527
10528         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10529         ie. check for MethodImplOptions.InternalCall.
10530
10531         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10532         and TypeManager.attribute_type are null, so we must explicitly check
10533         whether parent is not null to find out whether it's an attribute type.
10534         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10535         and SetBuilder, not only if the property is neither abstract nor external.
10536         This is necessary to set the MethodImplOptions on the accessor methods.
10537         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10538         SetBuilder, see Property.Emit().
10539
10540         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10541         populate "System.Object", "System.ValueType" and "System.Attribute" since
10542         they've already been populated from BootCorlib_PopulateCoreTypes().
10543
10544 2002-06-29  Martin Baulig  <martin@gnome.org>
10545
10546         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10547         is the NullLiteral, we also need to make sure that target_type is not
10548         an enum type.   
10549
10550 2002-06-29  Martin Baulig  <martin@gnome.org>
10551
10552         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10553         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10554         before calling BootstrapCorlib_ResolveDelegate ().
10555
10556 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10557
10558         * statement.cs: fixed build-breaker. All tests passed ok.
10559
10560 2002-06-27  Martin Baulig  <martin@gnome.org>
10561
10562         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10563         for System.Decimal when compiling corlib.
10564
10565 2002-06-27  Martin Baulig  <martin@gnome.org>
10566
10567         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10568         switch blocks which contain nothing but a default clause.
10569
10570 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10571
10572        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10573
10574 2002-06-27  Martin Baulig  <martin@gnome.org>
10575
10576         * ecore.cs (PropertyExpr.PropertyExpr): Call
10577         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10578
10579         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10580         is already a TypeBuilder.
10581
10582 2002-06-27  Martin Baulig  <martin@gnome.org>
10583
10584         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10585         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10586         the "from an array-type to System.Array" case.  This makes it work
10587         when compiling corlib.
10588
10589 2002-06-27  Martin Baulig  <martin@gnome.org>
10590
10591         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10592         non-static PropertyExpr, set its InstanceExpression.  This makes
10593         the `ICollection.Count' property work in System/Array.cs.
10594
10595 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10596
10597         * driver.cs: Made error handling more consistent.  Errors now
10598         tracked by Report class, so many methods which used to return int
10599         now return void.  Main() now prints success/failure and 
10600         errors/warnings message.
10601
10602         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10603         the magic number return values (123 and 124).  Now, if the
10604         expected error occurs, the compiler exits with success (exit value
10605         0).  If the compilation completes without seeing that particular
10606         error, the compiler exits with failure (exit value 1).  The
10607         makefile in mcs/errors has been changed to handle the new behaviour.
10608
10609         * report.cs: Made 'expected error' number a property and renamed
10610         it from 'Probe' to 'ExpectedError'.
10611
10612         * genericparser.cs: Removed error handling support, since it is
10613         now all done by Report class.
10614
10615         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10616         class, so parse() no longer returns an int.
10617
10618         * namespace.cs: Use Report.Error instead of GenericParser.error
10619
10620 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10621
10622         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10623         TypeContainer.AddOperator): At the front of the list put the
10624         explicit implementations, so they get resolved/defined first. 
10625
10626 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10627
10628         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10629         interface type is implemented by this TypeContainer.  Used during
10630         explicit interface implementation.
10631
10632         (Property.Define, Indexer.Define, Method.Define): Validate that
10633         the given interface in the explicit implementation is one of the
10634         base classes for the containing type.
10635
10636         Also if we are explicitly implementing an interface, but there is
10637         no match in the pending implementation table, report an error.
10638
10639         (Property.Define): Only define the property if we are
10640         not explicitly implementing a property from an interface.  Use the
10641         correct name also for those properties (the same CSC uses,
10642         although that is really not needed).
10643
10644         (Property.Emit): Do not emit attributes for explicitly implemented
10645         properties, as there is no TypeBuilder.
10646
10647         (Indexer.Emit): ditto.
10648
10649         Hiding then means that we do not really *implement* a pending
10650         implementation, which makes code fail.
10651
10652 2002-06-22  Martin Baulig  <martin@gnome.org>
10653
10654         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10655         the return value of Object.GetType().  [FIXME: we need to do this whenever
10656         we get a type back from the reflection library].
10657
10658 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10659
10660         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10661
10662 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10663
10664         * attribute.cs: Return null if we can not look up the type.
10665
10666         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10667         the interface types found.
10668
10669         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10670         interface types found.
10671
10672         * typemanager.cs (GetInterfaces): Make this routine returns alll
10673         the interfaces and work around the lame differences between
10674         System.Type and System.Reflection.Emit.TypeBuilder in the results
10675         result for GetInterfaces.
10676
10677         (ExpandInterfaces): Given an array of interface types, expand and
10678         eliminate repeated ocurrences of an interface.  This expands in
10679         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10680         be IA, IB, IC.
10681
10682 2002-06-21  Martin Baulig  <martin@gnome.org>
10683
10684         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10685         on System.Enum.
10686
10687 2002-06-21  Martin Baulig  <martin@gnome.org>
10688
10689         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10690         and called with one of the core types, return the corresponding typebuilder for
10691         that type.
10692
10693         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10694         element type.
10695
10696 2002-06-21  Martin Baulig  <martin@gnome.org>
10697
10698         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10699         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10700         (Expression.ConvertReferenceExplicit): Likewise.
10701
10702         * expression.cs (ElementAccess.DoResolve): Likewise.
10703         (ElementAccess.DoResolveLValue): Likewise.
10704
10705 2002-06-10  Martin Baulig  <martin@gnome.org>
10706
10707         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10708         add the "value" parameter to the parameter list.
10709
10710         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10711         to our caller.
10712
10713 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10714
10715         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10716         the argument to an int, uint, long or ulong, per the spec.  Also
10717         catch negative constants in array creation.
10718
10719 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10720
10721         * class.cs: do not allow the same interface to appear twice in
10722         the definition list.
10723
10724 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10725
10726         * ecore.cs: don't use ldlen with System.Array.
10727
10728 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10729
10730         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10731
10732 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10733
10734         * modifiers.cs: produce correct field attributes for protected
10735         internal. Easy fix so miguel can work on ther harder stuff:-)
10736
10737 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10738
10739         * pending.cs: New file.  Move the code from class.cs here.
10740         Support clearning the pending flag for all methods (when not doing
10741         explicit interface implementation).
10742
10743 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10744
10745         * rootcontext.cs: added a couple more types needed to bootstrap.
10746
10747 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10748
10749         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10750         constructor in the type, instead of any constructor in the type
10751         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10752         a bug in the Mono runtime when applying the params attribute). 
10753
10754 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10755         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10756
10757 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10758
10759         * expression.cs (Unary.ResolveOperator): Use TypeManager
10760         to resolve the type.
10761
10762 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10763
10764         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10765         attached.
10766
10767         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10768         with each member too.
10769
10770         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10771         field builders too - this takes care of the enum member case.
10772
10773 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10774
10775         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10776         address-of operator on both value types and pointers.
10777
10778 2002-06-10  Martin Baulig  <martin@gnome.org>
10779
10780         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10781         PropertyBuilder to the `property_builders' list.
10782
10783         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10784         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10785         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10786         find any indexers which are inherited from an interface.
10787
10788 2002-06-09  Martin Baulig  <martin@gnome.org>
10789
10790         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10791         the same type as the constant if necessary.  There's also a test-130.cs
10792         for this.
10793
10794         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10795
10796         * typemanager.cs (TypeManager.ChangeType): Previously known as
10797         Enum.ChangeEnumType().
10798
10799 2002-06-09  Martin Baulig  <martin@gnome.org>
10800
10801         * expression.cs (Cast.TryReduce): Added support for consts.
10802
10803 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10804
10805         * class.cs (Accessor): Hold attributes information so we can pass
10806         it along.
10807
10808         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10809         Modify to pass in attributes attached to the methods.
10810
10811         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10812
10813         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10814         to handle the Accessor kind :-)
10815
10816         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10817
10818 2002-06-08  Martin Baulig  <martin@gnome.org>
10819
10820         * expression.cs (Unary.TryReduceNegative): Added support for
10821         ULongConstants.
10822
10823 2002-06-08  Martin Baulig  <martin@gnome.org>
10824
10825         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10826         name can't be found in the `defined_names' - the caller will do a
10827         MemberLookup in this case and thus find methods in System.Enum
10828         such as Enum.IsDefined().
10829
10830 2002-06-08  Martin Baulig  <martin@gnome.org>
10831
10832         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10833         Convert.ChangeType() which works with TypeBuilder created types.
10834         (Enum.LookupEnumValue, Enum.Define): Use it here.
10835
10836         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10837         `TypeBuilder.BaseType != null' check.
10838         (TypeContainer.FindMembers): Only lookup parent members if we
10839         actually have a parent.
10840         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10841         (ConstructorInitializer.Resolve): Likewise.
10842
10843         * interface.cs (Interface.FindMembers): Added
10844         `TypeBuilder.BaseType != null' check.
10845
10846         * rootcontext.cs (RootContext.ResolveCore): Added
10847         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10848         classes_second_stage.
10849
10850         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10851         debug_type and trace_type when compiling with --nostdlib.       
10852
10853 2002-06-07  Martin Baulig  <martin@gnome.org>
10854
10855         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10856         (AddField): Set it to true when adding a non-static field.
10857         (DefineType): Use `have_nonstatic_fields' to find out whether we
10858         have non-static fields, not `Fields != null'.
10859
10860 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10861
10862         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10863         dereferencing a null on the static-field code path)
10864
10865 2002-05-30  Martin Baulig  <martin@gnome.org>
10866
10867         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10868         to take command line arguments.  Use reflection to call the new
10869         custom `Initialize' function on the symbol writer and pass it the
10870         command line arguments.
10871
10872         * driver.cs (--debug-args): New command line argument to pass command
10873         line arguments to the symbol writer.
10874
10875 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10876
10877         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10878         the target type for indexers and properties.  Thanks to Joe for
10879         catching this.
10880
10881 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10882
10883         * typemanager.cs (MethodFlags): returns the method flags
10884         (Obsolete/ShouldIgnore) that control warning emission and whether
10885         the invocation should be made, or ignored. 
10886
10887         * expression.cs (Invocation.Emit): Remove previous hack, we should
10888         not do this on matching a base type, we should do this based on an attribute
10889
10890         Only emit calls to System.Diagnostics.Debug and
10891         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10892         on the command line.
10893
10894         * rootcontext.cs: Global settings for tracing and debugging.
10895
10896         * cs-tokenizer.cs (define): New utility function to track
10897         defines.   Set the global settings for TRACE and DEBUG if found.
10898
10899 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10900
10901         * interface.cs (Populate*): Pass in the TypeContainer as well as
10902         the DeclSpace as parameters so that we can create EmitContexts and
10903         then use that to apply attributes etc.
10904
10905         (PopulateMethod, PopulateEvent, PopulateProperty)
10906         (PopulateIndexer): Apply attributes everywhere.
10907
10908         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10909         etc.
10910
10911         (ApplyAttributes): Update accordingly.
10912
10913         We now apply interface attributes for all members too.
10914
10915 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10916
10917         * class.cs (Indexer.Define); Correctly check if we are explicit
10918         implementation (instead of checking the Name for a ".", we
10919         directly look up if the InterfaceType was specified).
10920
10921         Delay the creation of the PropertyBuilder.
10922
10923         Only create the PropertyBuilder if we are not an explicit
10924         interface implementation.   This means that explicit interface
10925         implementation members do not participate in regular function
10926         lookups, and hence fixes another major ambiguity problem in
10927         overload resolution (that was the visible effect).
10928
10929         (DefineMethod): Return whether we are doing an interface
10930         implementation. 
10931
10932         * typemanager.cs: Temporary hack until we get attributes in
10933         interfaces (Ravi is working on that) and we get IndexerName
10934         support in interfaces.
10935
10936         * interface.cs: Register the indexers as properties.
10937
10938         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10939         warning, I have verified that this is a bug in the .NET runtime
10940         (JavaScript suffers of the same problem).
10941
10942         * typemanager.cs (MemberLookup): When looking up members for
10943         interfaces, the parent of an interface is the implicit
10944         System.Object (so we succeed in searches of Object methods in an
10945         interface method invocation.  Example:  IEnumerable x;  x.ToString
10946         ()) 
10947
10948 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10949
10950         * class.cs (Event): Events should also register if they do
10951         implement the methods that an interface requires.
10952
10953         * typemanager.cs (MemberLookup); use the new GetInterfaces
10954         method. 
10955
10956         (GetInterfaces): The code used to lookup interfaces for a type is
10957         used in more than one place, factor it here. 
10958
10959         * driver.cs: Track the errors at the bottom of the file, we kept
10960         on going.
10961
10962         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10963         instance if the method we are calling is static!
10964
10965 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10966
10967         * attribute.cs (ApplyAttributes): Make this function filter out
10968         the IndexerName attribute (as that attribute in reality is never
10969         applied) and return the string constant for the IndexerName
10970         attribute. 
10971
10972         * class.cs (TypeContainer.Emit): Validate that all the indexers
10973         have the same IndexerName attribute, and if so, set the
10974         DefaultName attribute on the class. 
10975
10976         * typemanager.cs: The return value might contain other stuff (not
10977         only methods).  For instance, consider a method with an "Item"
10978         property and an Item method.
10979
10980         * class.cs: If there is a problem with the parameter types,
10981         return. 
10982
10983 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10984
10985         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10986         looks at user defined conversion after making a call to 
10987         StandardConversionExists - we need this for overload resolution.
10988
10989         * expression.cs : Update accordingly the various method calls.
10990
10991         This fixes 2 bugs filed against implicit user defined conversions 
10992
10993 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10994
10995         * statement.cs: Track the result of the assignment.
10996
10997 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10998
10999         * expression.cs (MemberAccess): Improved error reporting for
11000         inaccessible members.
11001
11002 2002-05-22  Martin Baulig  <martin@gnome.org>
11003
11004         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11005         itself with debugging support.
11006
11007 2002-05-22  Martin Baulig  <martin@gnome.org>
11008
11009         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11010         Removed, this isn't needed anymore.
11011
11012 2002-05-20  Martin Baulig  <martin@gnome.org>
11013
11014         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11015         be underlying type for an enum.
11016
11017 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11018
11019         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11020         that splits out the loading of just the core types.
11021
11022         * rootcontext.cs (ResolveCore): Split the struct resolution in
11023         two, so we can load the enumeration underlying types before any
11024         enums are used.
11025
11026         * expression.cs (Is): Bandaid until we fix properly Switch (see
11027         bug #24985 for details).
11028
11029         * typemanager.cs (ImplementsInterface): The hashtable will contain
11030         a null if there are no interfaces implemented.
11031
11032 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11033
11034         * cs-parser.jay (indexer_declarator): It is fine to have array
11035         parameters
11036
11037 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11038
11039         * typemanager.cs: (RegisterBuilder): New function used to register
11040         TypeBuilders that implement interfaces.  Since
11041         TypeBuilder.GetInterfaces (as usual) does not work with lame
11042         Reflection.Emit. 
11043         (AddUserType): register interfaces.
11044
11045         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11046         dealing with TypeBuilder.  Also, arrays are showing up as
11047         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11048         methods can not be invoked on them!
11049
11050         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11051         (ImplicitReferenceConversionExists): Split out from
11052         StandardConversionExists. 
11053
11054         * expression.cs (As): We were only implementing one of the three
11055         cases for the as operator.  We now implement them all.
11056         (Is): Implement the various other cases for Is as well.
11057
11058         * typemanager.cs (CACHE): New define used to control if we want or
11059         not the FindMembers cache.  Seems to have a negative impact on
11060         performance currently
11061
11062         (MemberLookup): Nested types have full acess to
11063         enclosing type members
11064
11065         Remove code that coped with instance/static returns for events, we
11066         now catch this in RealFindMembers.
11067
11068         (RealFindMembers): only perform static lookup if the instance
11069         lookup did not return a type or an event.  
11070
11071 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11072
11073         * assign.cs (CompoundAssign): We pass more semantic information
11074         now to Compound Assignments than we did before: now we have all
11075         the information at hand, and now we resolve the target *before* we
11076         do the expression expansion, which allows the "CacheValue" method
11077         to have the effect we intended (before, a [x] += 1 would generate
11078         two differen ArrayAccess expressions from the ElementAccess,
11079         during the resolution process).
11080
11081         (CompoundAssign.DoResolve): Resolve target and original_source here.
11082
11083 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11084
11085         * expression.cs (ArrayAccess): dropped debugging information. 
11086
11087         * typemanager.cs: Small bug fix: I was always returning i_members,
11088         instead of one of i_members or s_members (depending on which had
11089         the content).
11090
11091         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11092         method is invoked before any code generation takes place, and it
11093         is a mechanism to inform that the expression will be invoked more
11094         than once, and that the method should use temporary values to
11095         avoid having side effects
11096
11097         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11098
11099         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11100         implementation.
11101
11102         * expression.cs (Indirection, ArrayAccess): Add support for
11103         CacheTemporaries in these two bad boys. 
11104
11105         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11106         ldobj or ldind_ref.  
11107         (StoreFromPtr): Handle stobj as well.
11108
11109         * expression.cs (UnaryMutator): Share more code.
11110
11111         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11112         down: I was not tracking the Filter function as well, which
11113         was affecting the results of the cache.
11114
11115 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11116
11117         * attribute.cs: Remove the hack to handle the CharSet property on
11118         StructLayouts. 
11119
11120 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11121
11122         * attribute.cs (DoResolve): More uglyness, we now only try to
11123         resolve the attribute partially, to extract the CharSet
11124         information (only if we are a StructLayout attribute).  Otherwise 
11125
11126         (GetExtraTypeInfo): Add some code to conditionally kill in the
11127         future this.   I am more and more convinced that the .NET
11128         framework has special code to handle the attribute setting on
11129         certain elements.
11130
11131         * expression.cs (IsParamsMethodApplicable): Revert my previous
11132         foreach change here, it was wrong.
11133
11134 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11135
11136         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11137         (pp_expr): do not abort on unknown input, just return.
11138         (eval): abort if there are pending chars.
11139
11140         * attribute.cs (Attribute.Resolve): Positional parameters are
11141         optional.  Deal with that case.
11142
11143         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11144         the Ansi/Unicode/Auto information for the type.
11145
11146         (TypeContainer.DefineType): instantiate the EmitContext here, as
11147         we will be using it during the type definition (to resolve
11148         attributes) and during the emit phase.
11149
11150         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11151         to pull type information out of the attributes
11152
11153         (Attribute.Resolve): track the constructor builder, and allow for
11154         multiple invocations (structs and classes will use this).
11155
11156         * ecore.cs (MemberLookupFinal): new version with all the
11157         parameters customizable.
11158
11159         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11160         constructors.  Return if the result value is null (as the error
11161         would have been flagged already by MemberLookupFinal)
11162
11163         Do not allow instances of abstract classes or interfaces to be
11164         created.
11165
11166         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11167         We have to compare the assembly property here when dealing with
11168         FamANDAssem and Assembly access modifiers, because we might be
11169         creating an assembly from *modules* (that means that we are not
11170         getting TypeBuilders for types defined in other modules that are
11171         part of this assembly).
11172
11173         (Method.Emit): If the method is marked abstract and has a body,
11174         emit an error. 
11175
11176         (TypeContainer.DefineMembers): If both the defined member and the
11177         parent name match are methods, then do not emit any warnings: let
11178         the Method.Define routine take care of flagging warnings.  But if
11179         there is a mismatch (method overrides something else, or method is
11180         overriwritten by something, then emit warning).
11181
11182         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11183         set to null, this means `do not check for the return type on the
11184         signature'. 
11185
11186         (Method.Define): set the return type for the method signature to
11187         null, so that we get methods with the same name and parameters and
11188         different return types.  This is used to flag warning 114 (you are
11189         hiding a method, and you probably want to use the new/override
11190         keywords instead).
11191
11192         * typemanager.cs (MemberLookup): Implemented proper access
11193         control, closing a long standing set of bug reports.  The problem
11194         was that the Framework only has two bits: Public and NonPublic,
11195         and NonPublic includes private and protected methods, but we need
11196         to enforce the FamANDAssem, FamOrAssem and Family. 
11197
11198 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11199
11200         * statement.cs (GotoCase): Return true: Ammounts to giving up
11201         knowledge on whether we return or not, and letting the other case
11202         be responsible for it.
11203
11204 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11205
11206         * driver.cs: Do not load directories for each file processed, only
11207         do it if there is a pattern.
11208
11209         * ecore.cs: Report readonly assigns here as well, as we might have
11210         been resolved only by MemberAccess.
11211
11212         (SimpleName.SimpleNameResolve): Also be useful for LValue
11213         resolution.   We need this to propagate assign to local readonly variables
11214
11215         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11216         do not want to reuse potential criteria memory.
11217
11218         * class.cs (MyEventBuilder): Set reflected_type;
11219
11220         * ecore.cs (Constantify): Added support for constifying bools.
11221
11222         (RootContext.LookupType): Added a cache for values looked up in
11223         the declaration space.
11224
11225         * typemanager.cs (FindMembers): Now is a front-end to
11226         RealFindMembers, and provides a two-level hashtable-based cache to
11227         the request.  
11228
11229         15% performance improvement: from 22.5 to 19.2 seconds.
11230
11231         * expression.cs (IsParamsMethodApplicable): use foreach.
11232         (Invocation.DoResolve): ditto.
11233         (New.DoResolve): ditto.
11234         (ArrayCreation.DoResolve): ditto.
11235
11236         * ecore.cs (FindMostEncompassingType): use foreach.
11237
11238         * delegate.cs (NewDelegate.DoResolve): Use foreach
11239
11240         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11241         (RemoveMethods): use foreach.
11242
11243         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11244         nested foreach statements instead of for, and also break out of
11245         the inner loop once a match is found.
11246
11247         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11248
11249 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11250
11251         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11252         we actually unwrap the expression to allow for extra information
11253         to be extracted. 
11254
11255         * expression.cs: Use Shr_Un on unsigned operations. 
11256
11257 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11258
11259         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11260         applicable operators was not being considered correctly. This closes
11261         the bug Miguel reported.
11262
11263 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11264
11265         * attribute.cs: check that the type derives from System.Attribute
11266         and report the correct error in that case (moved the duplicate code to
11267         its own method, too).
11268
11269 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11270
11271         * attribute.cs: lookup attribute type name as the spec says: first the
11272         bare attribute name and then name + "Attribute" (nant compiles with
11273         mcs after this fix).
11274
11275 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11276
11277         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11278         Because of the way we parse things, we should try to see if a
11279         UIntConstant can fit in an integer.
11280
11281 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11282
11283         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11284         when we are in an explicit context.
11285
11286         (ConvertReferenceExplicit): When converting from Iface type S to Class
11287         T make sure the rules are implemented as an OR.
11288
11289         * parameter.cs (ParameterType): Make it a property for now although the
11290         purpose really isn't anything immediate.
11291
11292         * expression.cs (Is*Applicable): Do better checking on the parameter type
11293         of a ref/out parameter. The ones from the system assemblies are already 
11294         marked with the correct type so we don't need to do any correction.
11295
11296         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11297         the object type is standard too so include that.
11298
11299 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11300
11301         * ecore.cs (StandardConversionExists): Augment with missing code:
11302         deal with IntConstant, LongConstants and Enumerations.
11303
11304         * assign.cs: Report the error, instead of failing silently
11305
11306         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11307         typecontainer that they are declared, because the
11308         typecontainer/namespace will have the list of using clauses that
11309         need to be applied.
11310
11311         Assembly Attributes were escaping the normal registration
11312         mechanism. 
11313
11314         (EmitCode): Apply attributes within an EmitContext that represents
11315         the container they were declared on.
11316
11317         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11318
11319 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11320
11321         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11322         Revamp completely - make much cleaner as we now operate only
11323         on a set of Types.
11324
11325         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11326         to implement the logic detailed in the spec more correctly.
11327
11328         (UserDefinedConversion): Update accordingly.
11329
11330 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11331
11332         * statement.cs: Return flow analysis information up.
11333
11334         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11335         and the default.
11336
11337         (token): Do not consume an extra character before calling
11338         decimal_digits.
11339
11340 2002-05-06  Piers Haken <piersh@friskit.com>
11341
11342         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11343
11344 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11345
11346         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11347         EmitContext during the instance constructor initializer
11348         resolution, to stop access to instance variables.
11349
11350         This is mandated by the spec, last paragraph of the `constructor
11351         initializers' section. 
11352
11353 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11354
11355         * cs-parser.jay, class.cs (Accessor): new class used to represent
11356         an accessor (get or set).  In the past we used `null' to represent
11357         a missing accessor.  But this is ambiguous because there was no
11358         way to tell in abstract indexers/properties if one of them was
11359         specified.
11360
11361         Now there is a way of addressing that.
11362
11363         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11364         instead of FindMembers.
11365
11366         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11367         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11368
11369         * attribute.cs: Treat indexers and properties as the same in terms
11370         of applying attributes
11371
11372         * ecore.cs (FindMostEncompassedType): Use statically initialized
11373         EmptyExpressions()s like we do elsewhere to avoid creating useless
11374         objects (and we take this out of the tight loop).
11375
11376         (GetConversionOperators): Move the code to extract the actual
11377         operators to a separate routine to clean things up.
11378
11379 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11380
11381         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11382         events are always registered FieldBuilders.
11383
11384         * class.cs (FieldBase): New class shared by Fields 
11385
11386         * delegate.cs: If we are a toplevel delegate, use our full name.
11387         If we are a nested delegate, then only use our tail name.
11388
11389 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11390
11391         * expression.cs (IsApplicable): Ensure that we add the "&" to
11392         ref/out types before comparing it with the type of the argument.
11393
11394         (IsParamsMethodApplicable): Ditto.
11395
11396         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11397         silly me ;-)
11398
11399         * delegate.cs : Handle the case when we have more than one applicable
11400         method. Flag an error only when we finish checking all.
11401
11402 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11403
11404         * expression.cs: Add support for boolean static initializers.
11405
11406 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11407
11408         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11409
11410         * parameter.cs (ComputeParameterTypes,
11411         ComputeAndDefineParameterTypes): Better error handling: now we
11412         clear the `types' cache if we fail during any of the type lookups.
11413         We also return the status code correctly to our caller
11414
11415         * delegate.cs: If we fail to define a delegate, abort the extra
11416         steps. 
11417
11418         * expression.cs (Binary.ResolveOperator): for
11419         operator==(object,object) and operator !=(object, object) we also
11420         have to verify that there is an implicit conversion from one to
11421         the other.
11422
11423         (ArrayAccess.DoResolve): Array Access can operate on
11424         non-variables. 
11425
11426 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11427
11428         * assign.cs (CompoundAssign): A new class used as a "flag" that
11429         the assignment actually is happening as part of a compound
11430         assignment operator.
11431
11432         During compound assignment, a few new rules exist to enable things
11433         like:
11434
11435         byte b |= 1 + 2
11436
11437         From the spec:
11438
11439         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11440         to the type of x) if y is implicitly convertible to the type of x,
11441         and the operator is a builtin operator and the return type of the
11442         operator is explicitly convertible to the type of x. 
11443
11444         * rootcontext.cs: Reset warning level to 2.  4 catches various
11445         "interesting" features in mcs, we must clean this up at some
11446         point, but currently am trying to kill other bugs ;-)
11447
11448         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11449         in container classes as well.  
11450
11451         * expression.cs (Binary.ResolveOperator): Handle string case
11452         before anything else (as operator overloading does emit an error
11453         before doing anything else).
11454
11455         This code could go away when we move to a table driven model, but
11456         i could not come up with a good plan last night.
11457
11458 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11459
11460         * typemanager.cs (CSharpName): reimplementation using regex.
11461         * class.cs: added null check for fields in Emit
11462         * rootcontext.cs: set warninglevel to 4
11463
11464 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11465
11466         * typemanager.cs (CSharpName): reimplemented with Lupus
11467         suggestion.
11468
11469 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11470
11471         * statement.cs (If): correclty implement Resolve, because we were
11472         not catching sem errors in there.  The same process is needed
11473         everywhere else. 
11474         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11475
11476
11477         (Statement.Warning_DeadCodeFound): Factorize code.
11478         (While): Report dead code here too.
11479
11480         (Statement): Added Resolve virtual method to allow
11481         for resolution split from the emit code.
11482
11483 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11484
11485         * statement.cs (EmitBoolExpression): No longer try to resolve the
11486         expression here.    
11487         (MakeBoolean): New utility function that resolve, implicitly
11488         converts to boolean and tags the expression. 
11489
11490
11491         (If, Do): Implement dead code elimination.
11492         (While): Implement loop inversion
11493
11494         (Do, While, For, If): Resolve the expression prior to calling our
11495         code generation.
11496
11497 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11498
11499         * class.cs:
11500           - added method Report28 (warning: program has more than one entry point)
11501           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11502           - modified method Method.Define, the part at the end of the method
11503
11504         * rootcontext.cs: added static public Location EntryPointLocation;
11505           
11506         * ../errors/cs0028.cs : Add test case for the above warning.              
11507
11508         * typemanager.cs:
11509           - modified method CSharpName to allow arrays of primitive type to
11510             be printed nicely (e.g. instead of System.Int32[][] it now prints
11511             int[][])
11512           - added method CSharpSignature: returns the signature of a method
11513             in string format to be used in reporting errors, warnings, etc.
11514
11515         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11516         with String.Empty.
11517
11518 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11519
11520         * delegate.cs (Define): Fix extremely silly bug where I was
11521         setting the type of the 'object' parameter of the BeginInvoke
11522         method to System.IAsyncResult instead of System.Object ;-)
11523
11524 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11525
11526         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11527         here. 
11528
11529         (Constructor.Emit): return if we fail to initialize the
11530         constructor.  Another door closed!  
11531
11532         * expression.cs (New.DoResolve): Improve error message (from -6 to
11533         1501).  Use DeclaredOnly lookup to find the exact constructor.
11534
11535         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11536         loop.  This is useful.
11537
11538         * cs-parser.jay: Adjust the default parameters so that destructors
11539         have the proper signature.
11540
11541 2002-04-26  Martin Baulig  <martin@gnome.org>
11542
11543         * driver.cs (LoadAssembly): If `assembly' contains any characters
11544         which are only valid in path names and not in assembly names
11545         (currently slash, backslash and point), use Assembly.LoadFrom ()
11546         instead of Assembly.Load () on the `assembly' (before iteration
11547         over the link_paths).
11548
11549 2002-04-26  Martin Baulig  <martin@gnome.org>
11550
11551         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11552
11553 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11554
11555         * class.cs (Property): use the new typemanager.MemberLookup
11556
11557         (TypeContainer.MemberLookup): Implement using the
11558         TypeManager.MemberLookup now. 
11559
11560         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11561         and return MemberInfos, so that these can be used without an
11562         EmitContext (what we had before).
11563
11564 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11565
11566         * expression.cs: Fix the case where the argument to params if the
11567         type of the params.  I omitted handling this before.   Fixed
11568
11569 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11570
11571         * driver.cs: Call BootCorlib_PopulateCoreType
11572
11573         * class.cs (Property.CheckBase): Check for properties only, not
11574         for all members. 
11575
11576         * interface.cs: Temporary hack: try/catch around the
11577         CustomAttributeBuilder, because I am getting an exception that I
11578         do not understand.
11579
11580         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11581         types whose definitions are required to be there (attributes are
11582         defined before standard types).
11583
11584         Compute definitions as we boot the various types, as they are used
11585         immediately (value_type class will need object_type, but if we do
11586         not initialize object_type, we will pass a null, which will let
11587         the runtime pick the System.Object from the existing corlib, which
11588         is not what we want).
11589
11590 2002-04-22  Patrik Torstensson <totte@labs2.com>
11591
11592         * cs-tokenizer.cs: fixed a number of trim() issues.
11593
11594 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11595
11596         * expression.cs (Argument.Type): Ensure that we return the correct
11597         type when we have out or ref parameters [in which case we 
11598         append a "&"].
11599
11600 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11601
11602         * class.cs (Property, Indexer): Allow extern modifier in there. 
11603
11604         * typemanager.cs (InitBaseTypes): Initializes object_type and
11605         value_type, since those will be used early on during the bootstrap
11606         process to compile corlib.
11607
11608         (InitCoreTypes): Move code from here to InitBaseTypes.
11609
11610 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11611
11612         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11613         single-dimension arrays as using the ldlen opcode.  
11614
11615         Daniel Lewis discovered this optimization.  
11616
11617         * typemanager.cs: Add signature for System.Array::get_Length
11618
11619 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11620
11621         * statement.cs: report the error when the foreach does not apply to an
11622         array nor a collection.
11623
11624 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11625
11626         * expression.cs: Add implicit conversions to the operator ~.
11627
11628         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11629
11630         * typemanager.cs: Locate the decimal constructor.
11631
11632 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11633
11634         * attribute.cs: use the new property of TypeOf.
11635         * expression.cs: added 'get' property around typearg.
11636
11637         These changes fix a build breaker reported by NickD. Is this the
11638         correct way to fix?  If not, please, revert my changes and make it
11639         work :-).
11640
11641 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11642
11643         * attribute.cs: Add support for typeof in attribute invocations.
11644         I am not sure that this is right though.
11645
11646 2002-04-14  Duncan Mak  <duncan@ximian.com>
11647
11648         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11649         Binary.Operator.Division case.
11650
11651 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11652
11653         * class.cs (DefineType): Ensure that we do a proper check on
11654         attribute types and also register it with the TypeManager.
11655
11656         (TypeContainer.Targets): The default for attribute types is
11657         AttributeTargets.All.
11658
11659         * attribute.cs (ApplyAttributes): Registering the attribute type
11660         is done elsewhere, not when we discover we have a Usage attribute.
11661
11662 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11663
11664         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11665         and get rid of is_delegate parameter.
11666
11667         * everywhere : update.
11668
11669 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11670
11671         * cs-parser.jay (compilation_unit): Revamp completely to use
11672         some new ideas that I got from Rhys' grammar to solve the problems
11673         with assembly level attributes.
11674
11675         (outer_declaration): New grammar production.
11676
11677         (attribute_sections): Add.
11678
11679         (opt_attributes): Base on attribute_sections
11680
11681         (namespace_declaration): Allow opt_attributes to tackle the case
11682         when we have assembly level attributes - we are clever in this
11683         regard now ;-)
11684
11685         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11686         attributes in the non-global context.
11687
11688         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11689         instead of SetGlobalAttributes.
11690
11691         * class.cs, rootcontext.cs : Ensure we define and generate 
11692         attribute types before anything else.
11693
11694         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11695         and flag the new error -20 for the case when the attribute type
11696         does not have valid targets specified. csc does not catch this.
11697
11698         * ../errors/errors.txt : update for error # -20
11699
11700 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11701
11702         * support.cs (InternalParameters.ParameterModifier): Do some null
11703         checking and return sane values.
11704
11705         * class.cs (Method.Define): If we are a PInvoke method, ensure
11706         that we are static and extern. Report error # 601
11707
11708         * ../errors/cs0601.cs : Add test case for the above error.
11709
11710 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11711
11712         * rootcontext.cs (attribute_types): We need to keep type of
11713         all attribute types separately and emit code for them first.
11714
11715         (RegisterAttribute) : Implement.
11716
11717         * class.cs (DefineType): Check if the current Type is a custom
11718         attribute type and register it accordingly.
11719
11720         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11721         adding the first attribute twice and rename to
11722
11723         (SetGlobalAttributes): this.
11724
11725         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11726         lookups.
11727
11728         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11729         if we are processing global arguments. Hmm, I am unsure of this.
11730
11731 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11732
11733         * expression.cs: added static array of strings to avoid calling
11734         Enum.ToString () for Operator in Binary. Significant recover of
11735         performance.
11736
11737 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11738
11739         * class.cs (FindMembers): Allow the Builders of the various
11740         members to be null.  If they are skip them.  This only happens
11741         during the PInvoke declaration.
11742
11743 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11744
11745         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11746         failure, so we do not keep going afterwards.
11747
11748         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11749         wanted to pass `false' as the `is_delegate' argument.  If this is
11750         the case, why not use delegate_type == null to mean `is_delegate =
11751         false' and anything else as is_delegate = true.
11752
11753 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11754
11755         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11756         code for the section, not the beginning of the tests.
11757
11758 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11759
11760         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11761
11762         * expression.cs (Binary): same.  Warn about errors where we have
11763         Enum/Enum in operator + as well.
11764
11765 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11766
11767         * statement.cs:
11768                 - added support for switch(bool)
11769                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11770                 - add TableSwitchEmit() to handle table-based switch statements
11771
11772 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11773
11774         * expression.cs (Invocation.OverloadResolve): Factor out code which
11775         does parameter compatibility checking with arguments so that we can 
11776         re-use the code even from Delegate.VerifyApplicability
11777
11778         (VerifyArgumentsCompat): Move above code here.
11779
11780         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11781         and instead make a call to the above method.
11782
11783 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11784
11785         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11786         We use it to keep track of classes which are attribute types.
11787
11788 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11789
11790         * delegate.cs (Delegate.Define): Correctly define the types in the
11791         presence of fixed and array parameters.
11792
11793         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11794         doing FindMembers.
11795
11796         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11797         include NonPublic after the first iteration.
11798
11799         * class.cs (Indexer.CheckBase): Only check if both parents are
11800         non-null. 
11801
11802         * cs-parser.jay (accessor_body): If empty, set to null.
11803
11804         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11805         same code path here to resolve constants names that we did have in
11806         MemberAccess.DoResolve.  There is too much code duplicated here.
11807
11808 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11809
11810         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11811
11812         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11813         to MakeUnionSet.
11814
11815         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11816         tokens, numbers and strings.
11817
11818         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11819         parenthesis.
11820
11821         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11822         asyncronous parameters and the regular parameters.  
11823
11824         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11825         specify the target directory.
11826
11827         * expression.cs: (This.DoResolve): Simplify
11828         (As.Emit): Optimize, do not generate IsInst if the expression is
11829         always of the given type.
11830
11831         (Is.DoResolve): Bug fix, we were reporting both always/never for
11832         the is expression.
11833
11834         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11835         creating too many unnecessary arrays.
11836
11837 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11838
11839         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11840         fields instead of rolling our own initializer.   Takes care of all
11841         implicit conversions, and drops unnecessary static checks/argument.
11842
11843 2002-03-31  Dick Porter  <dick@ximian.com>
11844
11845         * driver.cs: use the GetDirectories() return values properly, and
11846         use "/" as path separator.
11847
11848 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11849
11850         * expression.cs (Unary): Optimize - - expr into expr.
11851         (Binary): Optimize a + (-b) into a -b.
11852
11853         * codegen.cs (CodeGen): Made all methods static.
11854
11855 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11856
11857         * rootcontext.cs: 
11858
11859         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11860         TypeBuilder property.
11861
11862         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11863         instead. 
11864
11865         * tree.cs: Removed the various RecordXXXX, and replaced with a
11866         single RecordDecl.  Removed all the accessor methods, and just
11867         left a single access point Type 
11868
11869         * enum.cs: Rename DefineEnum to DefineType.
11870
11871         * decl.cs: New abstract method `DefineType' used to unify the
11872         Defines for Enumerations, Interfaces, TypeContainers and
11873         Delegates.
11874
11875         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11876         LookupBaseClasses method that used to live in class.cs and
11877         interface.cs here, and renamed to FindType.
11878
11879         * delegate.cs: Implement DefineType.  Take advantage of the
11880         refactored pattern for locating the parent builder without taking
11881         the parent_builder argument (which we know does not work if we are
11882         nested, and triggering a toplevel definition).
11883
11884 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11885
11886         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11887         accessibility of a member has changed during override and report
11888         an error if so.
11889
11890         * class.cs (Method.Define, Property.Define): Only complain on
11891         overrides if the method is private, any other accessibility is
11892         fine (and since we just checked the permission is the same, we are
11893         good to go).
11894
11895         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11896         and elif are processed always.  The other pre-processing
11897         directives are only processed if we are "taking" the path
11898
11899 2002-03-29  Martin Baulig  <martin@gnome.org>
11900
11901         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11902         current location is not Null.
11903
11904         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11905         a separate method so we can profile it.
11906
11907         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11908         `span.Seconds' are just seconds, but no minutes or hours.
11909         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11910
11911 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11912
11913         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11914         Remove the gratuitous set of Final:
11915
11916                                 // If an interface implementation, then we can set Final.
11917                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11918                                     implementing.DeclaringType.IsInterface)
11919                                         flags |= MethodAttributes.Final;
11920
11921         I do not know what I was smoking when I used that.
11922
11923
11924         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11925         step into fixing the name resolution issues for delegates and
11926         unifying the toplevel name resolution.
11927
11928 2002-03-28  Martin Baulig  <martin@gnome.org>
11929
11930         * class.cs (Method.Emit): If we have a symbol writer, call its
11931         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11932         tell it about the current method.
11933
11934         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11935         writer that we're going to emit the first byte of IL code for a new
11936         statement (a new source line).
11937         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11938         EmitContext.Mark() before emitting any code.
11939
11940         * location.cs (SymbolDocument): Return null when we're Null.
11941
11942         * statement.cs (Statement): Moved the `Location loc' variable here.
11943         (Statement.EmitBoolExpression): If we have a symbol writer, call
11944         ec.Mark() before emitting any code to tell it that we're at the
11945         beginning of a new statement.
11946         (StatementExpression): Added `Location' argument to the constructor.
11947         (Block): Added public readonly variable `StartLocation' and public
11948         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11949         (Block): Added constructor which takes a start and end location.
11950         (Block.SetEndLocation): New method. This sets the end location.
11951         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11952         local variables we create.
11953         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11954         each statement and do also mark the begin and end of the block.
11955
11956         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11957         tell it the current lexer.Location, use Location.Null for the end of the
11958         block.
11959         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11960         current block, set its end location using SetEndLocation().
11961         (statement_expression): StatementExpression constructor now takes the
11962         lexer.Location as additional argument.
11963         (for_statement, declare_local_variables): Likewise.
11964         (declare_local_variables): When creating a new implicit block, use the
11965         new Block constructor and pass it the lexer.Location.
11966
11967 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11968
11969         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11970         members also on the parent interfaces recursively.
11971
11972 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11973
11974         * report.cs: Use new formats, since Gonzalo finished the missing
11975         bits. 
11976
11977         * expression.cs (Binary.ResolveOperator): added missing operator|
11978         operator& and operator^ for bool/bool.
11979
11980         * cs-parser.jay: CheckDef now takes a Location argument that is
11981         used to report errors more precisly (instead of reporting the end
11982         of a definition, we try to track something which is a lot closer
11983         to the source of the problem).
11984
11985         * cs-tokenizer.cs: Track global token use, so we can properly flag
11986         the use of #define/#undef after the first token has been seen.
11987
11988         Also, rename the reportXXXX to Error_DescriptiveName
11989
11990         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11991         TypeContainer, so that Enum and Interface can use this too.
11992
11993         * class.cs (TypeContainer.LookupInterfaceOrClass,
11994         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11995         `builder' argument.  Typically this was used to pass the parent
11996         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11997         the definition).  
11998
11999         The problem is that a nested class could trigger the definition of
12000         a toplevel class, and the builder would be obviously wrong in that
12001         case. 
12002
12003         So we drop this argument, and we compute dynamically the
12004         TypeBuilder/ModuleBuilder (the correct information was available
12005         to us anyways from DeclSpace.Parent)
12006
12007         * interface.cs (Interface.DefineInterface): Drop builder
12008         parameter cleanup like class.cs
12009
12010         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12011         like class.cs
12012
12013         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12014         values. 
12015
12016         (Try.Emit): Propagate the returns value from the statement.
12017
12018         (Return.Emit): Even if we are leavning 
12019
12020         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12021
12022         * modifiers.cs: Fix the computation of MethodAttributes flags.
12023
12024 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12025
12026         * driver.cs: allow compilation of files that start with '/'.
12027         Add a default case when checking the argument of --target.
12028
12029 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12030
12031         * interface.cs: Implement the same search algorithm for types in
12032         the interface code.
12033
12034         * delegate.cs: Do not allow multiple definition.
12035
12036         * Recovered ChangeLog that got accidentally amputated
12037
12038         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12039
12040         * rootcontext.cs: Load manually enum to allow core classes to
12041         contain enumerations.
12042
12043         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12044         Update to new static methods in TypeManager.
12045
12046         * typemanager.cs (GetMethod, GetConstructor): Use our
12047         implementation of FindMembers to find the members, since during
12048         corlib compilation, the types are TypeBuilders and GetMethod and
12049         GetConstructor do not work.
12050
12051         Make all methods in TypeManager static.
12052
12053         (InitCodeHelpers): Split the functionality from
12054         the InitCodeTypes function.
12055
12056         * driver.cs: Call InitCodeHelpers after we have populated the
12057         types. 
12058
12059         * cs-parser.jay (delegate_declaration): we did not used to compute
12060         the delegate name correctly for void delegates.
12061
12062 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12063
12064         * rootcontext.cs (RootContext): Init the interface_resolve_order
12065         and type_container_resolve_order always.
12066
12067         (ResolveCore, BootstrapCorlib_ResolveClass,
12068         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12069         compiler when compiling with --nostdlib
12070
12071         * class.cs (TypeContainer.DefineType): Check that our parent is
12072         not null.  This test is most important when we are bootstraping
12073         the core types.
12074
12075         * codegen.cs: Split out the symbol writing code.
12076
12077 2002-03-25  Martin Baulig  <martin@gnome.org>
12078
12079         * driver.cs (-g): Made -g an alias for --debug.
12080
12081 2002-03-24  Martin Baulig  <martin@gnome.org>
12082
12083         * codegen.cs (SymbolWriter): New public variable. Returns the
12084         current symbol writer.
12085         (CodeGen): Added `bool want_debugging_support' argument to the
12086          constructor. If true, tell the ModuleBuild that we want debugging
12087         support and ask it for the ISymbolWriter.
12088         (Save): If we have a symbol writer, call it's Close() method after
12089         saving the assembly.
12090
12091         * driver.c (--debug): New command line argument to create a
12092         debugger information file.
12093
12094         * location.cs (SymbolDocument): New public property. Returns an
12095         ISymbolDocumentWriter object for the current source file or null
12096         if we don't have a symbol writer.
12097
12098 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12099
12100         * driver.cs (LoadAssembly): Correctly return when all the paths
12101         have been tried and not before.
12102
12103         * statement.cs (Switch.Emit): return the actual coverage for this
12104         statement (returns/not-returns)
12105
12106         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12107         switch of the statement if we are the last switch section.  That
12108         kills two problems: try/catch problems (we used to emit an empty
12109         nop at the end) and switch statements where all branches would
12110         return. 
12111
12112 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12113
12114         * driver.cs: Add default assemblies (the equivalent to the
12115         Microsoft CSC.RSP file)
12116
12117         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12118         also update tokens_seen and set it to false.
12119
12120         * driver.cs: Implement --recurse for Mike.
12121
12122         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12123         correctly splitting out the paths.
12124
12125 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12126
12127         * interface.cs (Interface.PopulateProperty): Instead of using
12128         `parent' as the declaration space for the set parameters, use
12129         `this' 
12130
12131         * support.cs (InternalParameters): InternalParameters constructor
12132         takes a DeclSpace instead of a TypeContainer.
12133
12134         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12135         types are being initialized, load the address of it before calling
12136         the function.  
12137
12138         (New): Provide a mechanism to disable the generation of local
12139         value type temporaries when the caller will be providing us with
12140         an address to store it.
12141
12142         (ArrayCreation.EmitDynamicInitializers): Use it.
12143
12144 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12145
12146         * expression.cs (Invocation.EmitArguments): Only probe for array
12147         property if there is more than one argument.  Sorry about that.
12148
12149         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12150         empty param arrays.
12151
12152         * class.cs (Method.LabelParameters): Fix incorrect code path that
12153         prevented the `ParamArrayAttribute' from being applied to the
12154         params attribute.
12155
12156 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12157
12158         * support.cs (ReflectionParameters): Correctly compute whether the
12159         last argument is a params array.  Fixes the problem with
12160         string.Split ('a')
12161
12162         * typemanager.cs: Make the assemblies array always be non-null
12163         (empty, but non-null)
12164
12165         * tree.cs (RecordDecl): New function that abstracts the recording
12166         of names.  This reports error 101, and provides a pointer to the
12167         previous declaration.  Fixes a crash in the compiler.
12168
12169         * cs-parser.jay (constructor_declaration): Update to new grammar,
12170         and provide a constructor_body that can be empty.
12171
12172 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12173
12174         * driver.cs: Add support for --resources.
12175
12176         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12177         Make all types for the various array helper methods be integer.
12178
12179         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12180         CheckState to ConvCast.
12181
12182         (ConvCast): Now it takes a `checked' state argument, to avoid
12183         depending on the emit context for the conversion, and just using
12184         the resolve time setting.
12185
12186         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12187         instead of Invocation.EmitArguments.  We do not emit the original
12188         arguments, instead we emit those which have been converted to
12189         unsigned int expressions.
12190
12191         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12192
12193         * codegen.cs: ditto.
12194
12195         * expression.cs (LocalVariableReference): Drop the use of the
12196         Store function that depended on the variable index.
12197
12198         * statement.cs (VariableInfo): Drop the `Idx' property from this
12199         class, as this is not taking into account the indexes for
12200         temporaries tat we generate during the execution, getting the
12201         indexes wrong.
12202
12203         * class.cs: First emit class initializers, then call the parent
12204         constructor. 
12205
12206         * expression.cs (Binary): Fix opcode emision.
12207         (UnaryMutator.EmitCode): Support checked code generation
12208
12209         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12210         matches for events for both the Static and Instance scans,
12211         pointing to the same element.   Fix that.
12212
12213 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12214
12215         * rootcontext.cs (ResolveTree): Always set the
12216         interface_resolve_order, because nested interfaces will be calling
12217         into us.
12218
12219         * class.cs (GetInterfaceOrClass): Track the same resolution
12220         process used by TypeManager.LookupType.  This fixes the nested
12221         type lookups in class declarations (separate path from
12222         LookupType). 
12223
12224         (TypeContainer.DefineType): Also define nested interfaces.
12225         (TypeContainer.RegisterOrder): New public function used to
12226         register the order in which child interfaces need to be closed.
12227
12228         Nested interfaces need to be closed after their parents have been
12229         created. 
12230
12231         * interface.cs (InterfaceAttr): Put all the logic for computing
12232         the interface attribute here. 
12233
12234         (DefineInterface): Register our interface order with the
12235         RootContext or with the TypeContainer depending on the case.
12236
12237 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12238
12239         * cs-parser.jay: rework foreach statement to work with the new
12240         changes to the policy on SimpleNames.
12241
12242         * report.cs: support Stacktrace on warnings as well.
12243
12244         * makefile: drop --unsafe and /unsafe from the compile.
12245
12246 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12247
12248         * ecore.cs (StandardConversionExists): Modify to take an Expression
12249         as the first parameter. Ensure we do null -> reference type conversion
12250         checking.
12251
12252         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12253         temporary Expression objects.
12254
12255 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12256
12257         * interface.cs: workaround bug in method overloading resolution
12258         (there is already a bugzilla bug for it).
12259
12260 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12261
12262         We could also solve this problem by having a separate path for
12263         performing type lookups, instead of DoResolve, we could have a
12264         ResolveType entry point, and only participating pieces of the
12265         production (simplename, deref, array) would implement this. 
12266
12267         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12268         signal SimpleName to only resolve type names and not attempt to
12269         resolve anything else.
12270
12271         * expression.cs (Cast): Set the flag.
12272
12273         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12274
12275         * class.cs: Only report 108 if there is no `new' modifier.
12276
12277         * cs-parser.jay: rework foreach statement to work with the new
12278         changes to the policy on SimpleNames.
12279
12280         * report.cs: support Stacktrace on warnings as well.
12281
12282         * makefile: drop --unsafe and /unsafe from the compile.
12283
12284 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12285
12286         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12287         lookups here, instead of doing that at parse time.  This means
12288         that our grammar will not introduce `LocalVariableReferences' as
12289         expressions at this point.  That solves the problem of code like
12290         this:
12291
12292         class X {
12293            static void Main ()
12294            { int X = 1;
12295             { X x = null }}}
12296
12297         This is only half the fix.  The full fix requires parameters to
12298         also be handled in this way.
12299
12300         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12301         makes the use more obvious of the DeclSpace.  The
12302         ec.TypeContainer.TypeBuilder is now only used to pull the
12303         TypeBuilder for it.
12304
12305         My theory is that I can get rid of the TypeBuilder completely from
12306         the EmitContext, and have typecasts where it is used (from
12307         DeclSpace to where it matters).  
12308
12309         The only pending problem is that the code that implements Aliases
12310         is on TypeContainer, and probably should go in DeclSpace.
12311
12312         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12313         lookups here, instead of doing that at parse time.  This means
12314         that our grammar will not introduce `LocalVariableReferences' as
12315         expressions at this point.  That solves the problem of code like
12316         this:
12317
12318         class X {
12319            static void Main ()
12320            { int X = 1;
12321             { X x = null }}}
12322
12323         This is only half the fix.  The full fix requires parameters to
12324         also be handled in this way.
12325
12326         * class.cs (Property.DefineMethod): When implementing an interface
12327         method, set newslot, when implementing an abstract method, do not
12328         set the flag (before we tried never setting it, or always setting
12329         it, which is the difference).
12330         (Indexer.DefineMethod): same.
12331         (Method.DefineMethod): same.
12332
12333         * ecore.cs: Only set the status used flag if we get back a Field.
12334
12335         * attribute.cs: Temporary hack, so Paolo can keep working.
12336
12337 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12338
12339         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12340         the unmanaged type in the case we have a MarshalAs attribute.
12341
12342         (Resolve): Handle the case when we are parsing the special MarshalAs
12343         attribute [we need to store the unmanaged type to use later]
12344
12345         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12346         MarshalAs Attribute.
12347
12348         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12349         on parameters and accordingly set the marshalling info.
12350
12351 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12352
12353         * class.cs: Optimizing slightly by removing redundant code after
12354         we switched to the `NoTypes' return value.
12355         (Property.DefineMethod): use NoTypes here too.
12356
12357         This fixes the bug I introduced in my last batch of changes.
12358
12359 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12360
12361         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12362
12363         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12364         Enums since those are types too. 
12365
12366         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12367
12368         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12369         thanks to a call during the lookup process.
12370
12371 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12372
12373         * statement.cs (Foreach): Lots of work to accomodate a particular
12374         kind of foreach statement that I had not kept in mind.  It is
12375         possible to have foreachs on classes that provide a GetEnumerator
12376         method that return objects that implement the "pattern" for using
12377         a foreach, there is no need to support GetEnumerator
12378         specifically. 
12379
12380         This is needed to compile nant.
12381
12382         * decl.cs: Only report 114 if the member is not `Finalize' and if
12383         the warning level is at least 2.
12384
12385         * class.cs: Moved the compare function from Method to
12386         MethodSignature. 
12387
12388         (MethodSignature.InheritableMemberSignatureCompare): Add new
12389         filter function that is used to extract inheritable methods from a
12390         class. 
12391
12392         (Method.Define): Use the new `inheritable_method_signature_filter'
12393         delegate
12394
12395         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12396         command. 
12397
12398 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12399
12400         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12401
12402         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12403
12404         * expression.cs: Pass location information to
12405         ConvertImplicitStandard. 
12406
12407         * class.cs: Added debugging code to track return values from
12408         interfaces. 
12409
12410 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12411
12412         * expression.cs (Is.DoResolve): If either side of the `is' is an
12413         interface, do not flag the warning.
12414
12415         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12416         for interfaces
12417
12418         * report.cs: Allow for --fatal to be used with --probe.
12419
12420         * typemanager.cs (NoTypes): Move the definition for the empty Type
12421         array here. 
12422
12423         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12424         properties. 
12425         (TypeContainer.DefineProxy): New function used to proxy to parent
12426         implementations when implementing interfaces.
12427         (TypeContainer.ParentImplements): used to lookup if our parent
12428         implements a public function that is required by an interface.
12429         (TypeContainer.VerifyPendingMethods): Hook this up.
12430
12431         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12432         `modules' and `assemblies' arraylists into arrays.  We only grow
12433         these are the very early start up of the program, so this improves
12434         the speedof LookupType (nicely measured).
12435
12436         * expression.cs (MakeByteBlob): Replaced unsafe code with
12437         BitConverter, as suggested by Paolo.
12438
12439         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12440         folding of string concatenation, but if either side is a string,
12441         and the other is not, then return null, and let the runtime use
12442         the concatenation on the string plus the object (using
12443         `Object.ToString'). 
12444
12445 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12446
12447         Constant Folding has been implemented now.
12448
12449         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12450         the error instead on types that are not supported in one's
12451         complement. 
12452
12453         * constant.cs (Constant and all children): New set of functions to
12454         perform implict and explicit conversions.
12455
12456         * ecore.cs (EnumConstant): Implement the new functions to perform
12457         conversion by proxying to the child expression.
12458
12459         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12460         own separate setting that can not be turned off from the command
12461         line using --unchecked or --checked and is only controlled using
12462         the checked/unchecked statements and expressions.  This setting is
12463         used by the constant folder to flag errors.
12464
12465         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12466         ConstantCheckState as well.   
12467
12468         During Resolve, they also have to flag the state, because the
12469         constant folder runs completely in the Resolve phase.
12470
12471         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12472         well.
12473
12474 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12475
12476         * cfold.cs: New file, this file contains the constant folder.
12477
12478         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12479         argument to track whether we are using the resulting address to
12480         load or store a value and provide better error messages. 
12481
12482         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12483         new AddressOf arguments.
12484
12485         * statement.cs (Foreach.EmitCollectionForeach): Update
12486
12487         * expression.cs (Argument.Emit): Call AddressOf with proper
12488         arguments to track usage.
12489
12490         (New.DoEmit): Call AddressOf with new arguments.
12491
12492         (Unary.Emit): Adjust AddressOf call.
12493
12494 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12495
12496         * cs-parser.jay (member_access): Change the case for pre-defined types
12497         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12498         this suggestion.
12499
12500         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12501         a method body.
12502
12503         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12504         essentially like methods and apply attributes like MethodImplOptions to them too.
12505
12506         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12507         not being null.
12508
12509         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12510         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12511         is the DeclSpace.
12512
12513         * Update code everywhere accordingly.
12514
12515         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12516
12517         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12518
12519 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12520
12521         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12522         try performing lookups against those instead of jumping straight into using
12523         the 'using' clauses.
12524
12525         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12526
12527         (LookupType): Perform lookups in implicit parents too.
12528
12529         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12530         sequence as RootContext.LookupType. 
12531
12532         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12533         the various cases of namespace lookups into this method.
12534
12535 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12536
12537         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12538         in positional arguments)
12539
12540         * class.cs (Operator): Update the AllowedModifiers to contain
12541         extern. 
12542
12543         * cs-parser.jay: Update operator declaration to allow for the
12544         operator body to be empty.
12545
12546         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12547         values. 
12548
12549 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12550
12551         * class.cs (Method.Emit): Label parameters.
12552
12553         * driver.cs: Return 1 or 0 as the program exit code.
12554
12555 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12556
12557         * expression.cs: Special case the `null' object when trying to
12558         auto-compute the type, as anything can be explicitly converted to
12559         that. 
12560
12561         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12562         spotting this Paolo.
12563
12564         (Expression.ImplicitNumericConversion): Perform comparissions of
12565         the type using the underlying type in the case of an enumeration
12566         rather than using the enumeration type for the compare.
12567
12568         Cope with the underlying == type case, which is not possible to
12569         catch before. 
12570
12571         (Expression.ConvertNumericExplicit): Perform comparissions of
12572         the type using the underlying type in the case of an enumeration
12573         rather than using the enumeration type for the compare.
12574
12575         * driver.cs: If the user does not supply an extension, assume .exe
12576
12577         * cs-parser.jay (if_statement): Rewrote so that we can track the
12578         location for the if statement.
12579
12580         * expression.cs (Binary.ConstantFold): Only concat strings when
12581         the operation is "+", not everything ;-)
12582
12583         * statement.cs (Statement.EmitBoolExpression): Take a location
12584         argument. 
12585         (If, While, Do): Track location.
12586
12587         * expression.cs (Binary.ResolveOperator): In the object + string
12588         case, I was missing a call to ConvertImplicit
12589
12590 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12591
12592         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12593         Location arguments. Ensure we use RootContext.LookupType to do our work
12594         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12595
12596         * interface.cs (PopulateMethod): Handle the type of the parameter being
12597         null gracefully.
12598
12599         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12600         have a params method with no fixed arguments and a call is made with no
12601         arguments.
12602
12603 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12604
12605         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12606         the verbatim-string-literal
12607
12608         * support.cs (InternalParameters.ParameterModifier): handle null
12609         fixed parameters.
12610         (InternalParameters.ParameterType): ditto.
12611
12612         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12613         duplicating the name of the variable parameter.
12614         (GetParameterByName): Fix bug where we were not looking up array
12615         paramters if they were the only present (thanks Paolo!).
12616         (GetParameterInfo): We only have an empty set of types if both
12617         fixed and array are set to null.
12618         (GetParameterInfo-idx): Handle FixedParameter == null
12619
12620         * cs-parser.jay: Handle the case where there is no catch
12621         statements (missing null test).
12622
12623 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12624
12625         * driver.cs (MainDriver): Be conservative on our command line
12626         handling.
12627
12628         Catch DirectoryNotFoundException when calling GetFiles.
12629
12630         (SplitPathAndPattern): Used to split the input specification into
12631         a path and a pattern that we can feed to Directory.GetFiles.
12632
12633 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12634
12635         * statement.cs (Fixed): Implement the last case of the Fixed
12636         statement (string handling).
12637
12638         * expression.cs (StringPtr): New class used to return a char * to
12639         a string;  Used by the Fixed statement.
12640
12641         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12642
12643         * expression.cs (Binary.ResolveOperator): Remove redundant
12644         MemberLookup pn parent type.
12645         Optimize union call, we do not need a union if the types are the same.
12646         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12647         type.
12648
12649         Specialize the use of MemberLookup everywhere, instead of using
12650         the default settings. 
12651
12652         (StackAlloc): Implement stackalloc keyword.
12653
12654         * cs-parser.jay: Add rule to parse stackalloc.
12655
12656         * driver.cs: Handle /h, /help, /?
12657
12658         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12659         before we supported unsafe code.
12660
12661         * makefile: add --unsafe to the self compilation of mcs.
12662
12663 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12664
12665         * expression.cs (PointerArithmetic): New class that is used to
12666         perform pointer arithmetic.
12667         (Binary.Resolve): Handle pointer arithmetic
12668         Handle pointer comparission.
12669         (ArrayPtr): Utility expression class that is used to take the
12670         address of an array.
12671
12672         (ElementAccess): Implement array access for pointers
12673
12674         * statement.cs (Fixed): Implement fixed statement for arrays, we
12675         are missing one more case before we are done.
12676
12677         * expression.cs (Indirection): Implement EmitAssign and set the
12678         ExprClass to Variable.  This allows pointer dereferences to be
12679         treated as variables, and to have values assigned to them.
12680
12681         * ecore.cs (Expression.StoreFromPtr): New utility function to
12682         store values dereferencing.
12683
12684 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12685
12686         * expression.cs (Binary.ResolveOperator): Ensure that we are
12687         not trying to operate on a void type - this fixes the reported
12688         bug.
12689
12690         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12691         the parent implementation is sealed.
12692
12693         * ../errors/cs0239.cs : Add.
12694
12695         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12696
12697         * typemanager.cs (unverifiable_code_type): Corresponds to 
12698         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12699         which have unsafe code in them.
12700
12701         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12702         unsafe context.
12703
12704 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12705
12706         * cs-tokenizer.cs: Add support for @"litreal strings"
12707
12708         Make tokenizer accept pre-processor directives
12709         on any column (remove the old C-like limitation). 
12710
12711         * rootcontext.cs (EmitCode): Emit any global attributes.
12712         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12713
12714         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12715
12716         * cs-parser.jay: Add support for global attributes.  
12717
12718 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12719
12720         * expression.cs (Indirection): New helper class.  Unary will
12721         create Indirection classes to be able to implement the
12722         IMemoryLocation interface on it.
12723
12724 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12725
12726         * cs-parser.jay (fixed_statement): reference the right statement.
12727
12728         * statement.cs (Fixed.Emit): Finish implementing the fixed
12729         statement for the &x case.
12730
12731 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12732
12733         * class.cs (Property.Define, Method.Define): Remove newslot when
12734         `implementing'.  
12735
12736         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12737         wrong.  NewSlot should only be used if the `new' keyword is present.
12738
12739         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12740         locating our system dir.  Sorry about this.
12741
12742 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12743
12744         * driver.cs (GetSystemDir): Compute correctly the location of our
12745         system assemblies.  I was using the compiler directory instead of
12746         the library directory.
12747
12748 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12749
12750         * expression.cs (BetterFunction): Put back in what Miguel commented out
12751         since it is the correct fix. The problem is elsewhere ;-)
12752
12753         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12754         parameters of the parms method are themselves compatible or not !
12755
12756         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12757         to check that a class implements an interface before saying that an implicit
12758         conversion was allowed. Use ImplementsInterface to do the checking.
12759
12760 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12761
12762         * class.cs (Method.Define): Track whether we are an explicit
12763         implementation or not.  And only call DefineMethodOverride if we
12764         are an explicit implementation.
12765
12766         (Property.DefineMethod): Ditto.
12767
12768 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12769
12770         * expression.cs (BetterFunction): Catch hideous bug which was
12771          preventing us from detecting ambiguous calls due to implicit casts i.e
12772         cs0121.
12773
12774 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12775
12776         * support.cs (Pair): Remove un-needed method.  I figured why I was
12777         getting the error in cs-parser.jay, the variable in a foreach loop
12778         is readonly, and the compiler does not really treat this as a variable.
12779
12780         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12781         instead of EQUALS in grammar.  
12782
12783         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12784
12785         * expression.cs (Unary.DoResolve): Check whether the argument is
12786         managed or not.
12787
12788 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12789
12790         * support.cs: Api for Pair to set a value.  Despite the fact that
12791         the variables are public the MS C# compiler refuses to compile
12792         code that accesses the field if the variable is part of a foreach
12793         statement. 
12794
12795         * statement.cs (Fixed): Begin implementation of the fixed
12796         statement.
12797
12798         (Block.AddVariable): Return the VariableInfo on success and null
12799         on failure instead of true/false. 
12800
12801         * cs-parser.jay (foreach): Catch errors on variables already
12802         defined (we were ignoring this value before) and properly unwind
12803         the block hierarchy
12804
12805         (fixed_statement): grammar for the fixed statement.
12806
12807 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12808
12809         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12810         pointer types to be incretemented.
12811
12812         (SizeOf): Implement.
12813
12814         * cs-parser.jay (pointer_member_access): Implement
12815         expr->IDENTIFIER production.
12816
12817         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12818         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12819         on safe contexts.
12820
12821         (Unary): Implement indirection.
12822
12823         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12824         use in non-unsafe context).
12825
12826         (SimpleName.DoResolve): Check for pointers in field access on safe
12827         contexts. 
12828
12829         (Expression.LoadFromPtr): Factor the load-indirect code in this
12830         function.  This was duplicated in UnboxCast and ParameterReference
12831
12832 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12833
12834         * expression.cs (ComposedCast): report an error if a pointer cast
12835         is used in a safe region.
12836
12837         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12838         pointer type casts in unsafe context.
12839
12840         * codegen.cs (EmitContext): Set up IsUnsafe.
12841
12842         * cs-parser.jay (non_expression_type): Add productions for pointer
12843         casts. 
12844
12845         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12846         code.  We should not use force into static mode if the method is
12847         not virtual.  Fixes bug in MIS
12848
12849         * statement.cs (Do.Emit, While.Emit, For.Emit,
12850         Statement.EmitBoolExpression): Add support to Do and While to
12851         propagate infinite loop as `I do return' semantics.
12852
12853         Improve the For case to also test for boolean constants.
12854
12855         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12856         to the list of attributes we can add.
12857
12858         Remove `EmitContext' argument.
12859
12860         * class.cs (Method.Define): Apply parameter attributes.
12861         (Constructor.Define): Apply parameter attributes.
12862         (MethodCore.LabelParameters): Move here the core of labeling
12863         parameters. 
12864
12865         * support.cs (ReflectionParameters.ParameterModifier,
12866         InternalParameters.ParameterModifier): Use IsByRef on the type and
12867         only return the OUT bit for these parameters instead of in/out/ref
12868         flags.
12869
12870         This is because I miss-understood things.  The ParameterInfo.IsIn
12871         and IsOut represent whether the parameter has the [In] and [Out]
12872         attributes set.  
12873
12874 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12875
12876         * ecore.cs (FieldExpr.Emit): Release temporaries.
12877
12878         * assign.cs (LocalTemporary.Release): new function.
12879
12880         * codegen.cs (EmitContext.GetTemporaryStorage,
12881         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12882         temporary storage.  Now we can "put back" localbuilders when we
12883         are done with them
12884
12885 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12886
12887         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12888         need to make a copy of the variable to generate verifiable code.
12889
12890 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12891
12892         * driver.cs: Compute dynamically the system directory.
12893
12894         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12895         Slower, but more generally useful.  Used by the abstract
12896         registering implementation. 
12897
12898         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12899         the rules for the special rule on Type/instances.  First check if
12900         we have the same name, and if so, try that special static path
12901         rather than the instance path.
12902
12903 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12904
12905         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12906         for, while and if.
12907
12908         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12909         Enum, ValueType, Delegate or Array for non-corlib compiles.
12910
12911         * cs-tokenizer.cs: Catch long identifiers (645)
12912
12913         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12914         piece of code.
12915
12916         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12917         fix, we were returning too early, so we were not registering
12918         pending methods from abstract classes.
12919
12920         Do not register pending methods if the class is abstract.
12921
12922         * expression.cs (Conditional.DoResolve): Report circular implicit
12923         conversions when we neecd to compute it for conditional
12924         expressions. 
12925
12926         (Is.DoResolve): If the expression is always of the provided type,
12927         flag warning 183.  If the expression can not ever be of the
12928         provided type flag warning 184.
12929
12930         * class.cs: Catch 169 as well.
12931
12932         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12933         read. 
12934
12935 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12936
12937         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12938
12939 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12940
12941         * interface.cs: (PopulateMethod): Check for pointers being defined
12942         only if the unsafe context is active.
12943         (PopulateProperty): ditto.
12944         (PopulateIndexer): ditto.
12945
12946         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12947         specified.  If pointers are present, make sure that they are
12948         present in an unsafe context.
12949         (Constructor, Constructor.Define): ditto.
12950         (Field, Field.Define): ditto.
12951         (Property, Property.Define): ditto.
12952         (Event, Event.Define): ditto.
12953
12954         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12955         hashtable if there are classes or structs defined.
12956
12957         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12958         code, as the constant resolution moved.
12959
12960         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12961         the metadata, so we can flag error 133. 
12962
12963         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12964         pointer is being declared in an unsafe context.
12965
12966 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12967
12968         * modifiers.cs (Modifiers.Check): Require a Location argument.
12969         Report error 227 for Unsafe use.
12970
12971         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12972
12973         * statement.cs (For.Emit): If the test is null, then report that
12974         we do `return', as we wont reach anything afterwards.
12975
12976         (Switch.SwitchGoverningType): Track the expression that matched
12977         the conversion.
12978
12979         * driver.cs: Allow negative numbers as an error code to flag.
12980
12981         * cs-parser.jay: Handle 1551.
12982
12983         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12984
12985 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12986
12987         * cs-parser.jay: Report 1518 (type declaration can only contain
12988         class, struct, interface, enum or delegate)
12989
12990         (switch_label): Report 1523 (keywords `case' or `default' must
12991         preced code)
12992
12993         (opt_switch_sections): Report 1522 (empty switch)
12994
12995         * driver.cs: Report 1515 (response file specified multiple times)
12996         Report 1516 (Source file specified multiple times).
12997
12998         * expression.cs (Argument.Resolve): Signal 1510
12999
13000         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13001         access not allowed in static code)
13002
13003 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13004
13005         * typemanager.cs (IsPointerType): Utility method which we are going
13006         to need a lot.
13007
13008         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13009         the object type, so we take care of that.
13010
13011         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13012
13013         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13014         added to non-params parameters :-)
13015
13016         * typemanager.cs (CSharpName): Include 'void' type too. 
13017
13018         (void_ptr_type): Include in the set of core types.
13019
13020         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13021         duplicating code.
13022
13023         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13024         an unsafe context.
13025
13026         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13027         completely forgotten about it.
13028
13029 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13030
13031         * cs-parser.jay (pointer_type): Add. This begins our implementation
13032         of parsing rules for unsafe code.
13033
13034         (unsafe_statement): Implement.
13035
13036         (embedded_statement): Modify to include the above.
13037
13038         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13039
13040         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13041         if the current context is an unsafe one.
13042
13043         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13044         are handled differently, we need separate rules for them.
13045
13046         (local_variable_declaration): Update to use local_variable_pointer_type
13047         to allow variable declarations of unmanaged pointer types.
13048
13049         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13050         in unsafe contexts.
13051
13052         * ../errors/cs0214.cs : Add.
13053
13054 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13055
13056         * makefile: remove 'response' file when cleaning.
13057
13058 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13059
13060         * cs-parser.jay: Report 1524.
13061
13062 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13063
13064         * typemanager.cs (RegisterMethod): drop checking if we have
13065         registered this from here
13066
13067 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13068
13069         * class.cs (Method.EmitDestructor): Implement calling our base
13070         destructor. 
13071
13072         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13073         value of InFinally.
13074
13075         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13076         this routine and will wrap the call in a try/catch block.  Deal
13077         with the case.
13078
13079 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13080
13081         * ecore.cs (Expression.MemberLookup): instead of taking a
13082         parameter `same_type' that was used to tell whether we could
13083         access private members we compute our containing type from the
13084         EmitContext.
13085
13086         (FieldExpr): Added partial support for volatile fields.  This does
13087         not work for volatile fields exposed from assemblies, as I can not
13088         figure out how to extract the modreq from it.
13089
13090         Updated all the source files to use this.
13091
13092         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13093         because it is referenced by MemberLookup very often. 
13094
13095 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13096
13097         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13098         TypeBuilder.GetCustomAttributes to retrieve what we need.
13099
13100         Get rid of redundant default_member_attr_type as this is the same as
13101         default_member_type which already exists.
13102
13103         * interface.cs, attribute.cs : Update accordingly.
13104
13105 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13106
13107         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13108         work for TYpeBuilders though.  Ravi, can you please fix this?
13109
13110         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13111
13112         * expression.cs (Argument.Emit): Handle the case of ref objects
13113         being passed to ref functions;  
13114
13115         (ParameterReference.EmitLoad): Loads the content of the pointer
13116         without dereferencing.
13117
13118 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13119
13120         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13121
13122 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13123
13124         * class.cs (Indexer.DefineMethod): Incorporate the interface
13125         type in the name of the method if we are doing explicit interface
13126         implementation.
13127
13128         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13129
13130         (BetterConversion): Fix extremely trivial bug where we were referring to
13131         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13132         again !
13133
13134         * ../errors/bug16.cs : Add although we have fixed it.
13135
13136 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13137
13138         * expression.cs (BaseIndexer): Begin implementation.
13139
13140         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13141
13142         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13143         production directly to remove a shift/reduce, and implement
13144         explicit interface implementation.
13145
13146         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13147         after a floating point suffix.
13148
13149         * expression.cs (DoNumericPromotions): Improved the conversion for
13150         uint/uint.  If we have a constant, we avoid doing a typecast to a
13151         larger type.
13152
13153         * class.cs (Indexer): Implement explicit interface implementation
13154         for indexers.
13155
13156 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13157
13158         * class.cs: make the default instance constructor public and hidebysig.
13159
13160 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13161
13162         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13163         so we can call it from elsewhere.
13164
13165         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13166         we emit it internally if the class has a defined indexer; otherwise the user
13167         emits it by decorating the class definition with the DefaultMemberAttribute.
13168
13169         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13170         attribute is not used on a type which defines an indexer.
13171
13172         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13173         character when we skip whitespace.
13174
13175         * ../errors/cs0646.cs : Add.
13176
13177 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13178
13179         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13180         again. 
13181
13182         * makefile: Add practical target `mcs3.exe' which builds the third
13183         generation compiler. 
13184
13185         * expression.cs (New): Fix structures constructor calling.
13186
13187         * class.cs (Property, Method, Indexer): Emit Final flag on the
13188         method if we are an interface implementation and we are not
13189         abstract. 
13190
13191         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13192         whether this property is referencing a `base' method.
13193
13194         * expression.cs (Invocation.EmitCall): take an extra argument:
13195         is_base, this is used to determine whether the `call' or
13196         `callvirt' opcode should be used.
13197
13198
13199         * delegate.cs: update EmitCall.
13200
13201         * class.cs (Method.Define): Set NewSlot for the cases where we are
13202         not implementing an interface method.
13203
13204         (Property.Define): ditto.
13205
13206 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13207
13208         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13209         'r'.  Allows mcs to parse itself fully.
13210
13211 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13212
13213         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13214         of the number of initializers that require the InitializeArray method.
13215
13216         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13217         update the above field where necessary.
13218
13219         (MakeByteBlob): Update accordingly.
13220
13221         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13222         greater than 2.
13223
13224         (EmitDynamicInitializers): Update in accordance with the new optimization.
13225
13226         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13227         same OpCode applies.
13228
13229         * cs-parser.jay : Fix some glaring errors I introduced.
13230
13231 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13232
13233         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13234         so that we can check for name clashes there too.
13235
13236         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13237         for interface indexers.
13238
13239         * interfaces.cs (Define): Emit the default member attribute.
13240
13241         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13242         variable was being referred to while setting the value ;-)
13243
13244 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13245
13246         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13247         byte-by-byte information when we know the data is zero.
13248
13249         Make the block always a multiple of 4, because
13250         DefineInitializedData has a bug.
13251
13252         * assign.cs: Fix, we should assign from the temporary, not from
13253         the source. 
13254
13255         * expression.cs (MakeByteBlob): Fix my incorrect code.
13256
13257 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13258
13259         * typemanager.cs (EnumToUnderlying): This function is used to get
13260         the underlying type from an enumeration, because it does not
13261         always work. 
13262
13263         * constant.cs: Use the I4_S form for values between -128 and 127.
13264
13265         * statement.cs (Block.LookupLabel): Looks up a label.
13266         (Block): Drop support for labeled blocks.
13267
13268         (LabeledStatement): New kind of statement that represents a label
13269         only.
13270
13271         (Goto): Finally implement this bad boy.
13272
13273         * cs-parser.jay: Update to reflect new mechanism to implement
13274         labels.
13275
13276 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13277
13278         * codegen.cs (EmitContext.This): a codegen property that keeps the
13279         a single instance of this instead of creating many different this
13280         instances. 
13281
13282         * delegate.cs (Delegate.DoResolve): Update to use the property;
13283
13284         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13285
13286         * expression.cs (BaseAccess.DoResolve): Ditto.
13287
13288 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13289
13290         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13291         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13292
13293         (InitCoreTypes): Update accordingly.
13294
13295         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13296         so we can quickly store the state.
13297
13298         (ApplyAttributes): Set the correct implementation flags
13299         for InternalCall methods.
13300
13301 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13302
13303         * expression.cs (EmitCall): if a method is not virtual, then do
13304         not use callvirt on it.
13305
13306         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13307         user defined stuff) requires the use of stobj, which takes an
13308         address on the stack instead of an array and an index.  So emit
13309         the Ldelema operation for it.
13310
13311         (EmitStoreOpcode): Use stobj for valuetypes.
13312
13313         (UnaryMutator.EmitCode): Use the right 1 value depending on
13314         whether we are dealing with int64/uint64, float or doubles.
13315
13316         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13317         constructors that I implemented last night.
13318
13319         (Constructor.IsDefault): Fix to work properly for static
13320         constructors.
13321
13322         * cs-parser.jay (CheckDef): report method signature errors.
13323         Update error number 103 to be 132.
13324
13325         * decl.cs: New AdditionResult enumeration value: MethodExists.
13326         Although we do this check for methods later on in the semantic
13327         analysis, catching repeated default constructors is so easy that
13328         we catch these here. 
13329
13330         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13331         promotions code.
13332
13333         (ParameterReference.EmitAssign, Emit): handle
13334         bools as bytes.
13335
13336         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13337         (ArrayAccess.EmitStoreOpcode): ditto.
13338
13339         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13340
13341         * expression.cs (MakeByteBlob): Complete all the missing types
13342         (uint, short, ushort, byte, sbyte)
13343
13344         * class.cs: Only init instance field initializers on instance
13345         constructors. 
13346
13347         Rename `constructors' to instance_constructors. 
13348
13349         (TypeContainer.AddConstructor): Only add constructors to the list
13350         if it is not static.
13351
13352         Make sure that we handle default_static_constructor independently
13353         everywhere where we handle instance_constructors
13354
13355 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13356
13357         * class.cs: Do not lookup or create a base initializer for a
13358         static constructor.
13359
13360         (ConstructorInitializer.Resolve): use the proper type to lookup
13361         for constructors.
13362
13363         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13364
13365         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13366         in DeclSpace. 
13367
13368         * decl.cs: CloseType is now an virtual method, the default
13369         implementation just closes this type.
13370
13371 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13372
13373         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13374         to PreserveSig by default. Also emit HideBySig on such methods.
13375
13376         Basically, set the defaults to standard values.
13377
13378         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13379         argument, if candidate is better, it can't be worse than the best !
13380
13381         (Invocation): Re-write bits to differentiate between methods being
13382         applicable in their expanded form and their normal form - for params
13383         methods of course.
13384
13385         Get rid of use_standard everywhere as only standard conversions are allowed
13386         in overload resolution. 
13387
13388         More spec conformance.
13389
13390 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13391
13392         * driver.cs: Add --timestamp, to see where the compiler spends
13393         most of its time.
13394
13395         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13396         `this' in static code.
13397
13398         (SimpleName.DoResolve): Implement in terms of a helper function
13399         that allows static-references to be passed upstream to
13400         MemberAccess.
13401
13402         (Expression.ResolveWithSimpleName): Resolve specially simple
13403         names when called by MemberAccess to implement the special
13404         semantics. 
13405
13406         (Expression.ImplicitReferenceConversion): Handle conversions from
13407         Null to reference types before others, as Null's type is
13408         System.Object. 
13409
13410         * expression.cs (Invocation.EmitCall): Handle the special case of
13411         calling methods declared on a reference type from a ValueType
13412         (Base classes System.Object and System.Enum)
13413
13414         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13415         the left hand side is a TypeExpr, not on every enumeration. 
13416
13417         (Binary.Resolve): If types are reference types, then do a cast to
13418         object on operators != and == of both arguments.
13419
13420         * typemanager.cs (FindMembers): Extract instance and static
13421         members if requested.
13422
13423         * interface.cs (PopulateProperty): Use void_type instead of null
13424         as the return type for the setter method.
13425
13426         (PopulateIndexer): ditto.
13427
13428 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13429
13430         * support.cs (ReflectionParameters): Fix minor bug where we
13431         were examining the wrong parameter for the ParamArray attribute.
13432
13433         Cope with requests for the type of the parameter at position
13434         greater than the params parameter's. We now return the element
13435         type of the params array as that makes more sense.
13436
13437         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13438         accordingly as we no longer have to extract the element type
13439         ourselves.
13440
13441         (Invocation.OverloadResolve): Update.
13442
13443 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13444
13445         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13446         against IEnumerator, test whether the return value is a descendant
13447         of the IEnumerator interface.
13448
13449         * class.cs (Indexer.Define): Use an auxiliary method to implement
13450         the other bits of the method definition.  Begin support for
13451         explicit interface implementation.
13452
13453         (Property.DefineMethod): Use TypeManager.void_type instead of null
13454         for an empty return value.
13455
13456 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13457
13458         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13459         dealing with a FieldExpr which is composed of a FieldBuilder, in
13460         the code path we did extract the constant, but we should have
13461         obtained the underlying value to be able to cast it (otherwise we
13462         end up in an infinite loop, this is what Ravi was running into).
13463
13464         (ArrayCreation.UpdateIndices): Arrays might be empty.
13465
13466         (MemberAccess.ResolveMemberAccess): Add support for section
13467         14.5.4.1 that deals with the special case of E.I when E is a type
13468         and something else, that I can be a reference to a static member.
13469
13470         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13471         handle a particular array type to create byte blobs, it is just
13472         something we dont generate byteblobs for.
13473
13474         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13475         arguments. 
13476
13477         * location.cs (Push): remove the key from the hashtable that we
13478         are about to add.   This happens for empty files.
13479
13480         * driver.cs: Dispose files after we have parsed them.
13481
13482         (tokenize): new function that only runs the tokenizer on its
13483         input, for speed testing.
13484
13485 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13486
13487         * class.cs (Event.Define): Define the private field only if there
13488         are no accessors defined.
13489
13490         * expression.cs (ResolveMemberAccess): If there is no associated
13491         field with the event, that means we have an event defined with its
13492         own accessors and we should flag error cs0070 since transforming
13493         ourselves into a field is not valid in that case.
13494
13495         * ecore.cs (SimpleName.DoResolve): Same as above.
13496
13497         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13498         and charset to sane values.
13499
13500 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13501
13502         * assign.cs (DoResolve): Perform check on events only if they 
13503         are being accessed outside the declaring type.
13504
13505         * cs-parser.jay (event_declarations): Update rules to correctly
13506         set the type of the implicit parameter etc.
13507
13508         (add_accessor, remove_accessor): Set current local parameters.
13509
13510         * expression.cs (Binary): For delegate addition and subtraction,
13511         cast the return value from the method into the appropriate delegate
13512         type.
13513
13514 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13515
13516         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13517         of these as the workaround is unnecessary.
13518
13519         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13520         delegate data - none of that is needed at all.
13521
13522         Re-write bits to extract the instance expression and the delegate method
13523         correctly.
13524
13525         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13526         on delegates too.
13527
13528         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13529         of attaching attributes instead of duplicating code everywhere.
13530
13531         * everywhere : Update code to do attribute emission using the above method.
13532
13533 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13534
13535         * expression.cs (IsParamsMethodApplicable): if there are not
13536         parameters, return immediately.
13537
13538         * ecore.cs: The 0 literal can be implicity converted to an enum
13539         type. 
13540
13541         (SimpleName.DoResolve): First lookup the type, then lookup the
13542         members. 
13543
13544         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13545         want to get its address.  If the InstanceExpression is not
13546         addressable, store the result in a temporary variable, then get
13547         the address of it.
13548
13549         * codegen.cs: Only display 219 errors on warning level or above. 
13550
13551         * expression.cs (ArrayAccess): Make it implement the
13552         IMemoryLocation interface.
13553
13554         (Binary.DoResolve): handle the operator == (object a, object b)
13555         and operator != (object a, object b) without incurring into a
13556         BoxedCast (because 5 != o should never be performed).
13557
13558         Handle binary enumerator operators.
13559
13560         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13561         value type, otherwise use Ldelem_ref.
13562
13563         Use precomputed names;
13564
13565         (AddressOf): Implement address of
13566
13567         * cs-parser.jay (labeled_statement): Fix recursive block
13568         addition by reworking the production.
13569
13570         * expression.cs (New.DoEmit): New has a special case:
13571                 
13572                  If we are dealing with a ValueType, we have a few
13573                  situations to deal with:
13574                 
13575                     * The target of New is a ValueType variable, that is
13576                       easy, we just pass this as the variable reference
13577                 
13578                     * The target of New is being passed as an argument,
13579                       to a boxing operation or a function that takes a
13580                       ValueType.
13581                 
13582                       In this case, we need to create a temporary variable
13583                       that is the argument of New.
13584
13585
13586 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13587
13588         * rootcontext.cs (LookupType): Check that current_type is not null before
13589         going about looking at nested types.
13590
13591         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13592         not implement the IAssignMethod interface any more.
13593
13594         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13595         where we tranform them into FieldExprs if they are being resolved from within
13596         the declaring type.
13597
13598         * ecore.cs (SimpleName.DoResolve): Do the same here.
13599
13600         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13601
13602         * ../errors/bug10.cs : Add.
13603
13604         * ../errors/cs0070.cs : Add.
13605
13606         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13607
13608         * assign.cs : Get rid of EventIsLocal everywhere.
13609
13610 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13611
13612         * ecore.cs (ConvertIntLiteral): finished the implementation.
13613
13614         * statement.cs (SwitchLabel): Convert the value we are using as a
13615         key before looking up the table.
13616
13617 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13618
13619         * codegen.cs (EmitTopBlock): Require a Location argument now.
13620
13621         * cs-parser.jay (constructor_declarator): We need to setup
13622         current_local_parameters before we parse the
13623         opt_constructor_initializer, to allow the variables to be bound
13624         to the constructor arguments.
13625
13626         * rootcontext.cs (LookupType): First lookup nested classes in our
13627         class and our parents before we go looking outside our class.
13628
13629         * expression.cs (ConstantFold): Extract/debox the values at the
13630         beginnning. 
13631
13632         * rootcontext.cs (EmitCode): Resolve the constants first before we
13633         resolve the types.  This is not really needed, but it helps debugging.
13634
13635         * statement.cs: report location.
13636
13637         * cs-parser.jay: pass location to throw statement.
13638
13639         * driver.cs: Small bug fix.
13640
13641         * report.cs: Updated format to be 4-zero filled digits.
13642
13643 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13644
13645         * expression.cs (CheckIndices): Fix minor bug where the wrong
13646         variable was being referred to ;-)
13647
13648         (DoEmit): Do not call EmitStaticInitializers when the 
13649         underlying type is System.Object.
13650
13651 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13652
13653         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13654         and do the usual workaround for SRE.
13655
13656         * class.cs (MyEventBuilder.EventType): New member to get at the type
13657         of the event, quickly.
13658
13659         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13660
13661         * assign.cs (Assign.DoResolve): Handle the case when the target
13662         is an EventExpr and perform the necessary checks.
13663
13664         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13665         interface.
13666
13667         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13668
13669         (EventExpr): Set the type in the constructor itself since we 
13670         are meant to be born fully resolved.
13671
13672         (EventExpr.Define): Revert code I wrote earlier.
13673                 
13674         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13675         instance expression is null. The instance expression is a This in that case
13676         or a null, depending on whether it is a static method or not.
13677
13678         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13679         refers to more than one method.
13680
13681         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13682         and accordingly flag errors.
13683
13684 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13685
13686         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13687
13688 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13689
13690         * location.cs (ToString): Provide useful rutine.
13691
13692 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13693
13694         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13695         objects, return the actual integral boxed.
13696
13697         * statement.cs (SwitchLabel): define an ILLabel for each
13698         SwitchLabel. 
13699
13700         (Switch.CheckSwitch): If the value is a Literal, extract
13701         the underlying literal.
13702
13703         Also in the unused hashtable we had, add the SwitchLabel so we can
13704         quickly look this value up.
13705
13706         * constant.cs: Implement a bunch of new constants.  Rewrite
13707         Literal based on this.  Made changes everywhere to adapt to this.
13708
13709         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13710         dereferencing array only once, and also copes with enumrations.
13711
13712         bytes are two bytes wide, not one.
13713
13714         (Cast): Perform constant conversions.
13715
13716         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13717         wrappers to the literals here.
13718
13719         * expression.cs (DoNumericPromotions): long literals can converted
13720         to ulong implicity (this is taken care of elsewhere, but I was
13721         missing this spot).
13722
13723         * ecore.cs (Expression.Literalize): Make the return type Literal,
13724         to improve type checking.
13725
13726         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13727
13728 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13729
13730         * literal.cs: Revert code from ravi that checked the bounds.  The
13731         bounds are sane by the definition of the type itself. 
13732
13733         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13734         need to actually look up in our parent hierarchy for interfaces
13735         implemented. 
13736
13737         * const.cs: Use the underlying type for enumerations
13738
13739         * delegate.cs: Compute the basename for the delegate creation,
13740         that should fix the delegate test case, and restore the correct
13741         Type Lookup semantics in rootcontext
13742
13743         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13744         referencing a nested type with the Reflection API is using the "+"
13745         sign. 
13746
13747         * cs-parser.jay: Do not require EOF token at the end.
13748
13749 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13750
13751         * rootcontext.cs (LookupType): Concatenate type names with
13752         a '.' instead of a '+' The test suite passes again.
13753
13754         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13755         field of the enumeration.
13756
13757         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13758         the case when the member is an EventExpr.
13759
13760         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13761         static has an associated instance expression.
13762
13763         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13764
13765         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13766
13767         * class.cs (Event.Define): Register event and perform appropriate checks
13768         for error #111.
13769
13770         We define the Add and Remove methods even if the use provides none because
13771         in that case, we provide default implementations ourselves.
13772
13773         Define a private field of the type of the event. This is done by the CSC compiler
13774         and we should be doing it too ;-)
13775
13776         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13777         More methods we use in code we generate.
13778
13779         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13780         is important.
13781
13782         (InitCoreTypes): Update accordingly for the above.
13783
13784         * class.cs (Event.Emit): Generate code for default accessors that we provide
13785
13786         (EmitDefaultMethod): Do the job in the above.
13787
13788         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13789         appropriate place.
13790
13791 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13792
13793         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13794         builders even if we were missing one.
13795
13796         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13797         pass the Basename as our class name instead of the Name.  The
13798         basename will be correctly composed for us.
13799
13800         * parameter.cs (Paramters): Now takes a Location argument.
13801
13802         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13803         make all the code call directly LookupType in RootContext and take
13804         this chance to pass the Location information everywhere.
13805
13806         * Everywhere: pass Location information.
13807
13808 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13809
13810         * class.cs (Constructor.Define): Updated way of detecting the
13811         length of the parameters.
13812
13813         (TypeContainer.DefineType): Use basename as the type name for
13814         nested types.
13815
13816         (TypeContainer.Define): Do not recursively define types here, as
13817         definition is taken care in order by the RootContext.
13818
13819         * tree.cs: Keep track of namespaces in a per-file basis.
13820
13821         * parameter.cs (Parameter.ComputeSignature): Update to use
13822         DeclSpace. 
13823
13824         (Parameters.GetSignature): ditto.
13825
13826         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13827         instead of a TypeContainer.
13828
13829         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13830         resolve names.  Because we need to be resolve in our context, not
13831         our parents.
13832
13833         * driver.cs: Implement response files.
13834
13835         * class.cs (TypeContainer.DefineType): If we are defined, do not
13836         redefine ourselves.
13837
13838         (Event.Emit): Emit the code for add/remove handlers.
13839         (Event.Define): Save the MethodBuilders for add/remove.
13840
13841         * typemanager.cs: Use pair here too.
13842
13843         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13844         DictionaryEntry requires the first argument to be non-null.  
13845
13846         (enum_declaration): Compute full name for registering the
13847         enumeration.
13848
13849         (delegate_declaration): Instead of using
13850         formal_parameter_list, use opt_formal_parameter_list as the list
13851         can be empty.
13852
13853         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13854         (EventParsing): New property that controls whether `add' and
13855         `remove' are returned as tokens or identifiers (for events);
13856
13857 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13858
13859         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13860         use MyEventBuilder only and let it wrap the real builder for us.
13861
13862         (MyEventBuilder): Revamp constructor etc.
13863
13864         Implement all operations that we perform on EventBuilder in precisely the same
13865         way here too.
13866
13867         (FindMembers): Update to use the EventBuilder member.
13868
13869         (Event.Emit): Update accordingly.
13870
13871 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13872
13873         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13874         by calling the appropriate methods.
13875
13876         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13877         useful.
13878
13879         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13880
13881 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13882
13883         * delegate.cs (Delegate.Populate): Check that the return type
13884         and various parameters types are indeed accessible.
13885
13886         * class.cs (Constructor.Define): Same here.
13887
13888         (Field.Define): Ditto.
13889
13890         (Event.Define): Ditto.
13891
13892         (Operator.Define): Check that the underlying Method defined itself
13893         correctly - so it's MethodBuilder should not be null.
13894
13895         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13896         expression happens to be null.
13897
13898         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13899         members but as of now we don't seem to be able to do anything really useful with it.
13900
13901         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13902         not the EventBuilder.
13903
13904 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13905
13906         * cs-tokenizer.cs: Add support for defines.
13907         Add support for #if, #elif, #else, #endif
13908
13909         (eval_var): evaluates a variable.
13910         (eval): stubbed for evaluating functions.
13911
13912         * cs-parser.jay: Pass the defines information
13913
13914         * driver.cs: Add --define command line option.
13915
13916         * decl.cs: Move MemberCore here.
13917
13918         Make it the base class for DeclSpace.  This allows us to catch and
13919         report 108 and 109 for everything now.
13920
13921         * class.cs (TypeContainer.Define): Extract all the members
13922         before populating and emit the warning 108 (new keyword required
13923         to override) instead of having each member implement this.
13924
13925         (MemberCore.Define): New abstract method, we will be using this in
13926         the warning reporting engine in Populate.
13927
13928         (Operator.Define): Adjust to new MemberCore protocol. 
13929
13930         * const.cs (Const): This does not derive from Expression, it is a
13931         temporary object we use to create fields, it is a MemberCore. 
13932
13933         * class.cs (Method.Define): Allow the entry point to be in a
13934         specific class.
13935
13936         * driver.cs: Rewrite the argument handler to clean it up a bit.
13937
13938         * rootcontext.cs: Made it just an auxiliary namespace feature by
13939         making everything static.
13940
13941         * driver.cs: Adapt code to use RootContext type name instead of
13942         instance variable.
13943
13944         * delegate.cs: Remove RootContext argument.
13945
13946         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13947         argument. 
13948
13949         * class.cs (Event.Define): The lookup can fail.
13950
13951         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13952
13953         * expression.cs: Resolve the this instance before invoking the code.
13954
13955 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13956
13957         * cs-parser.jay: Add a production in element_access that allows
13958         the thing to become a "type" reference.  This way we can parse
13959         things like "(string [])" as a type.
13960
13961         Note that this still does not handle the more complex rules of
13962         casts. 
13963
13964
13965         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13966
13967         * ecore.cs: (CopyNewMethods): new utility function used to
13968         assemble the list of methods from running FindMembers.
13969
13970         (MemberLookup): Rework FindMembers so that 
13971
13972 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13973
13974         * class.cs (TypeContainer): Remove Delegates who fail to be
13975         defined.
13976
13977         * delegate.cs (Populate): Verify that we dont get null return
13978         values.   TODO: Check for AsAccessible.
13979
13980         * cs-parser.jay: Use basename to emit error 574 (destructor should
13981         have the same name as container class), not the full name.
13982
13983         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13984         possible representation.  
13985
13986         Also implements integer type suffixes U and L.
13987
13988 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13989
13990         * expression.cs (ArrayCreation.DoResolve): We need to do the
13991         argument resolution *always*.
13992
13993         * decl.cs: Make this hold the namespace.  Hold the root context as
13994         well.
13995         (LookupType): Move here.
13996
13997         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13998
13999         * location.cs (Row, Name): Fixed the code, it was always returning
14000         references to the first file.
14001
14002         * interface.cs: Register properties defined through interfaces.
14003
14004         * driver.cs: Add support for globbing on the command line
14005
14006         * class.cs (Field): Make it derive from MemberCore as well.
14007         (Event): ditto.
14008
14009 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14010
14011         * class.cs (Event::Define): Check that the type of the event is a delegate
14012         type else flag error #66.
14013
14014         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14015         same.
14016
14017         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14018         values of EntryPoint, CharSet etc etc.
14019
14020         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14021
14022         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14023         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14024         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14025         which needs this to do its work.
14026
14027         * ../errors/cs0066.cs : Add.
14028
14029 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14030
14031         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14032         helper functions.
14033
14034         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14035         clears out the parameters field.
14036         (MemberSignatureCompare): Cleanup
14037
14038         (MemberCore): New base class used to share code between MethodCore
14039         and Property.
14040
14041         (RegisterRequiredImplementations) BindingFlags.Public requires
14042         either BindingFlags.Instace or Static.  Use instance here.
14043
14044         (Property): Refactored code to cope better with the full spec.
14045
14046         * parameter.cs (GetParameterInfo): Return an empty array instead
14047         of null on error.
14048
14049         * class.cs (Property): Abstract or extern properties have no bodies.
14050
14051         * parameter.cs (GetParameterInfo): return a zero-sized array.
14052
14053         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14054         method modifier validation to the typecontainer so we can reuse
14055         this on properties.
14056
14057         (MethodCore.ParameterTypes): return an empty sized array of types.
14058
14059         (Property.Define): Test property modifier validity.
14060
14061         Add tests for sealed/override too.
14062
14063         (Method.Emit): abstract or extern methods have no bodies.
14064
14065 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14066
14067         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14068         thing.
14069
14070         (Method::Define, ::Emit): Modify accordingly.
14071
14072         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14073
14074         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14075
14076         * makefile: Pass in /unsafe.
14077
14078 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14079
14080         * class.cs (MakeKey): Kill routine.
14081
14082         * class.cs (TypeContainer.Define): Correctly define explicit
14083         method implementations (they require the full interface name plus
14084         the method name).
14085
14086         * typemanager.cs: Deply the PtrHashtable here and stop using the
14087         lame keys.  Things work so much better.
14088
14089         This of course broke everyone who depended on `RegisterMethod' to
14090         do the `test for existance' test.  This has to be done elsewhere.
14091
14092         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14093         the object stupid Equals method (because, that like fails all over
14094         the place).  We still do not use it.
14095
14096         * class.cs (TypeContainer.SetRequiredInterface,
14097         TypeContainer.RequireMethods): Killed these two routines and moved
14098         all the functionality to RegisterRequiredImplementations.
14099
14100         (TypeContainer.RegisterRequiredImplementations): This routine now
14101         registers all the implementations required in an array for the
14102         interfaces and abstract methods.  We use an array of structures
14103         which can be computed ahead of time to reduce memory usage and we
14104         also assume that lookups are cheap as most classes will not
14105         implement too many interfaces.
14106
14107         We also avoid creating too many MethodSignatures.
14108
14109         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14110         clear the "pending" bit if we find that there are problems with
14111         the declaration.
14112
14113         (TypeContainer.VerifyPendingMethods): Update to report errors of
14114         methods that look like implementations but are not.
14115
14116         (TypeContainer.Define): Add support for explicit interface method
14117         implementation. 
14118
14119 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14120
14121         * typemanager.cs: Keep track of the parameters here instead of
14122         being a feature of the TypeContainer.
14123
14124         * class.cs: Drop the registration of parameters here, as
14125         InterfaceMethods are also interface declarations.
14126
14127         * delegate.cs: Register methods with the TypeManager not only with
14128         the TypeContainer.  This code was buggy.
14129
14130         * interface.cs: Full registation here.
14131
14132 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14133
14134         * expression.cs: Remove reducer for binary expressions, it can not
14135         be done this way.
14136
14137         * const.cs: Put here the code that used to go into constant.cs
14138
14139         * constant.cs: Put here the code for constants, this is a new base
14140         class for Literals.
14141
14142         * literal.cs: Make Literal derive from Constant.
14143
14144 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14145
14146         * statement.cs (Return.Emit): Report error 157 if the user
14147         attempts to return from a finally block.
14148
14149         (Return.Emit): Instead of emitting a return, jump to the end of
14150         the function.
14151
14152         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14153         LocalBuilder to store the result of the function.  ReturnLabel is
14154         the target where we jump.
14155
14156
14157 2001-12-09  Radek Doulik  <rodo@ximian.com>
14158
14159         * cs-parser.jay: remember alias in current namespace
14160
14161         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14162         namespaces
14163
14164         * class.cs (LookupAlias): lookup alias in my_namespace
14165
14166         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14167         aliases hashtable
14168         (LookupAlias): lookup alias in this and if needed in parent
14169         namespaces
14170
14171 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14172
14173         * support.cs: 
14174
14175         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14176         making things static.  I need this to avoid passing the
14177         TypeContainer when calling ParameterType.
14178
14179         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14180         that did string manipulation to compute the type and then call
14181         GetType.  Use Parameter.ParameterType instead.
14182
14183         * cs-tokenizer.cs: Consume the suffix for floating values.
14184
14185         * expression.cs (ParameterReference): figure out whether this is a
14186         reference parameter or not.  Kill an extra variable by computing
14187         the arg_idx during emission.
14188
14189         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14190         function that returns whether a parameter is an out/ref value or not.
14191
14192         (Parameter.ParameterType): The type of the parameter (base,
14193         without ref/out applied).
14194
14195         (Parameter.Resolve): Perform resolution here.
14196         (Parameter.ExternalType): The full type (with ref/out applied).
14197
14198         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14199         support for expressions on the using statement.
14200
14201 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14202
14203         * statement.cs (Using.EmitLocalVariableDecls): Split the
14204         localvariable handling of the using statement.
14205
14206         (Block.EmitMeta): Keep track of variable count across blocks.  We
14207         were reusing slots on separate branches of blocks.
14208
14209         (Try.Emit): Emit the general code block, we were not emitting it. 
14210
14211         Check the type of the declaration to be an IDisposable or
14212         something that can be implicity converted to it. 
14213
14214         Emit conversions if required.
14215
14216         * ecore.cs (EmptyExpression): New utility class.
14217         (Expression.ImplicitConversionExists): New utility function.
14218
14219 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14220
14221         * statement.cs (Using): Implement.
14222
14223         * expression.cs (LocalVariableReference): Support read only variables.
14224
14225         * statement.cs: Remove the explicit emit for the Leave opcode.
14226         (VariableInfo): Add a readonly field.
14227
14228 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14229
14230         * ecore.cs (ConvCast): new class used to encapsulate the various
14231         explicit integer conversions that works in both checked and
14232         unchecked contexts.
14233
14234         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14235         properly generate the overflow opcodes.
14236
14237 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14238
14239         * statement.cs: The correct type for the EmptyExpression is the
14240         element_type, not the variable type.  Ravi pointed this out.
14241
14242 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14243
14244         * class.cs (Method::Define): Handle PInvoke methods specially
14245         by using DefinePInvokeMethod instead of the usual one.
14246
14247         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14248         above to do the task of extracting information and defining the method.
14249
14250 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14251
14252         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14253         of the condition for string type.
14254
14255         (Emit): Move that here. 
14256
14257         (ArrayCreation::CheckIndices): Keep string literals in their expression
14258         form.
14259
14260         (EmitDynamicInitializers): Handle strings appropriately.
14261
14262 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14263
14264         * codegen.cs (EmitContext): Replace multiple variables with a
14265         single pointer to the current Switch statement.
14266
14267         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14268         EmitContext.
14269
14270 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14271
14272         * statement.cs 
14273
14274         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14275         default'.
14276
14277         (Foreach.Emit): Foreach on arrays was not setting
14278         up the loop variables (for break/continue).
14279
14280         (GotoCase): Semi-implented.
14281
14282 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14283
14284         * attribute.cs (CheckAttribute): Handle system attributes by using
14285         Attribute.GetAttributes to examine information we need.
14286
14287         (GetValidPlaces): Same here.
14288
14289         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14290
14291         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14292
14293         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14294
14295         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14296
14297         (Method::Emit): Handle the case when we are a PInvoke method.
14298
14299 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14300
14301         * expression.cs: Use ResolveWithSimpleName on compound names.
14302
14303 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14304
14305         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14306         before trying to reduce it.
14307
14308         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14309
14310         * constant.cs (LookupConstantValue): Implement.
14311
14312         (EmitConstant): Use the above in emitting the constant.
14313
14314         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14315         that are user-defined by doing a LookupConstantValue on them.
14316
14317         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14318         too, like above.
14319
14320 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14321
14322         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14323
14324         (BaseAccess.DoResolve): Implement.
14325
14326         (MemberAccess.DoResolve): Split this routine into a
14327         ResolveMemberAccess routine that can be used independently
14328
14329 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14330
14331         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14332         As that share bits of the implementation.  Is returns a boolean,
14333         while As returns the Type that is being probed.
14334
14335 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14336
14337         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14338         instead of a Literal - much easier.
14339
14340         (EnumInTransit): Remove - utterly useless :-)
14341
14342         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14343
14344         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14345
14346         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14347         chain when we have no associated expression.
14348
14349 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14350
14351         * constant.cs (Define): Use Location while reporting the errror.
14352
14353         Also emit a warning when 'new' is used and there is no inherited
14354         member to hide.
14355
14356         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14357         populated.
14358
14359         (LookupEnumValue): Implement to lookup an enum member's value and define it
14360         if necessary.
14361
14362         (Populate): Re-write accordingly to use the above routine.
14363
14364 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14365
14366         * expression.cs (This): Fix prototype for DoResolveLValue to
14367         override the base class DoResolveLValue.
14368
14369         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14370         declarations) 
14371
14372         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14373         (we need to load the address of the field here).  This fixes
14374         test-22. 
14375
14376         (FieldExpr.DoResolveLValue): Call the DoResolve
14377         function to initialize the Instance expression.
14378
14379         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14380         correctly the GetEnumerator operation on a value type.
14381
14382         * cs-parser.jay: Add more simple parsing error catches.
14383
14384         * statement.cs (Switch): Add support for string switches.
14385         Handle null specially.
14386
14387         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14388
14389 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14390
14391         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14392
14393         (declare_local_constant): New helper function.
14394
14395         * statement.cs (AddConstant): Keep a separate record of constants
14396
14397         (IsConstant): Implement to determine if a variable is a constant.
14398
14399         (GetConstantExpression): Implement.
14400
14401         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14402
14403         * statement.cs (IsVariableDefined): Re-write.
14404
14405 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14406
14407         * class.cs (TypeContainer::FindMembers): Look for constants
14408         in the case when we are looking for MemberTypes.Field
14409
14410         * expression.cs (MemberAccess::DoResolve): Check that in the
14411         case we are a FieldExpr and a Literal, we are not being accessed
14412         by an instance reference.
14413
14414         * cs-parser.jay (local_constant_declaration): Implement.
14415
14416         (declaration_statement): Implement for constant declarations.
14417
14418 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14419
14420         * statement.cs (Switch): Catch double defaults.
14421
14422         (Switch): More work on the switch() statement
14423         implementation.  It works for integral values now, need to finish
14424         string support.
14425
14426
14427 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14428
14429         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14430         integer literals into other integer literals.  To be used by
14431         switch. 
14432
14433 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14434
14435         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14436         some memory.
14437
14438         (EmitDynamicInitializers): Cope with the above since we extract data
14439         directly from ArrayData now.
14440
14441         (ExpectInitializers): Keep track of whether initializers are mandatory
14442         or not.
14443
14444         (Bounds): Make it a hashtable to prevent the same dimension being 
14445         recorded for every element in that dimension.
14446
14447         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14448         from being found.
14449
14450         Also fix bug which was causing the indices to be emitted in the reverse
14451         order.
14452
14453 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14454
14455         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14456         unfinished.  They do not work, because the underlying code is
14457         sloppy.
14458
14459 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14460
14461         * cs-parser.jay: Remove bogus fixme.
14462
14463         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14464         on Switch statement.
14465
14466 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14467
14468         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14469         the same. 
14470
14471         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14472         parameter. Apparently, any expression is allowed. 
14473
14474         (ValidateInitializers): Update accordingly.
14475
14476         (CheckIndices): Fix some tricky bugs thanks to recursion.
14477
14478         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14479         I was being completely brain-dead.
14480
14481         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14482         and re-write acordingly.
14483
14484         (DelegateInvocation): Re-write accordingly.
14485
14486         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14487
14488         (MakeByteBlob): Handle types more correctly.
14489
14490         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14491         initialization from expressions but it is incomplete because I am a complete
14492         Dodo :-|
14493
14494 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14495
14496         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14497         on If.  Basically, we have to return `true' (ie, we do return to
14498         our caller) only if both branches of the if return.
14499
14500         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14501         short-circuit operators, handle them as short circuit operators. 
14502
14503         (Cast.DoResolve): Resolve type.
14504         (Cast.Cast): Take an expression as the target type.
14505
14506         * cs-parser.jay (cast_expression): Remove old hack that only
14507         allowed a limited set of types to be handled.  Now we take a
14508         unary_expression and we resolve to a type during semantic
14509         analysis.
14510
14511         Use the grammar productions from Rhys to handle casts (this is
14512         not complete like Rhys syntax yet, we fail to handle that corner
14513         case that C# has regarding (-x), but we will get there.
14514
14515 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14516
14517         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14518         field which is an array type.
14519
14520         * cs-parser.jay (declare_local_variables): Support array initialization too.
14521
14522         * typemanager.cs (MakeKey): Implement.
14523
14524         (everywhere): Use the above appropriately.
14525
14526         * cs-parser.jay (for_statement): Update for array initialization while
14527         declaring variables.
14528
14529         * ecore.cs : The error message was correct, it's the variable's names that
14530         were misleading ;-) Make the code more readable.
14531
14532         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14533         the correct type etc.
14534
14535         (ConvertExplicit): Handle Enum types by examining the underlying type.
14536
14537 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14538
14539         * parameter.cs (GetCallingConvention): Always return
14540         CallingConventions.Standard for now.
14541
14542 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14543
14544         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14545         and `r' after calling DoNumericPromotions.
14546
14547         * ecore.cs: Fix error message (the types were in the wrong order).
14548
14549         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14550         BindingFlags.Instance as well 
14551
14552         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14553         implicit int literal conversion in an empty cast so that we
14554         propagate the right type upstream.
14555
14556         (UnboxCast): new class used to unbox value types.
14557         (Expression.ConvertExplicit): Add explicit type conversions done
14558         by unboxing.
14559
14560         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14561         the target type before applying the implicit LongLiterals to ULong
14562         literal cast.
14563
14564 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14565
14566         * cs-parser.jay (for_statement): Reworked the way For works: now
14567         we declare manually any variables that are introduced in
14568         for_initializer to solve the problem of having out-of-band code
14569         emition (that is what got for broken).
14570
14571         (declaration_statement): Perform the actual variable declaration
14572         that used to be done in local_variable_declaration here.
14573
14574         (local_variable_declaration): Do not declare anything, just pass
14575         the information on a DictionaryEntry
14576
14577 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14578
14579         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14580         re-write of the logic to now make it recursive.
14581
14582         (UpdateIndices): Re-write accordingly.
14583
14584         Store element data in a separate ArrayData list in the above methods.
14585
14586         (MakeByteBlob): Implement to dump the array data into a byte array.
14587
14588 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14589
14590         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14591         into CheckIndices.
14592
14593         * constant.cs (Define): Implement.
14594
14595         (EmitConstant): Re-write fully.
14596
14597         Pass in location info.
14598
14599         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14600         respectively.
14601
14602         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14603         DictionaryEntry since we need location info too.
14604
14605         (constant_declaration): Update accordingly.
14606
14607         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14608         code into another method : UpdateIndices.
14609
14610 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14611
14612         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14613         some type checking etc.
14614
14615 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14616
14617         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14618         bits to provide dimension info if the user skips doing that.
14619
14620         Update second constructor to store the rank correctly.
14621
14622 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14623
14624         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14625         and try to implement.
14626
14627         * ../errors/cs0150.cs : Add.
14628
14629         * ../errors/cs0178.cs : Add.
14630
14631 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14632
14633         * statement.cs: Implement foreach on multi-dimensional arrays. 
14634
14635         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14636         name of the params argument.
14637
14638         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14639         initializing the array.
14640
14641         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14642         we can use this elsewhere.
14643
14644         * statement.cs: Finish implementation of foreach for single
14645         dimension arrays.
14646
14647         * cs-parser.jay: Use an out-of-band stack to pass information
14648         around, I wonder why I need this.
14649
14650         foreach_block: Make the new foreach_block the current_block.
14651
14652         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14653         function used to return a static Parameters structure.  Used for
14654         empty parameters, as those are created very frequently.
14655
14656         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14657
14658 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14659
14660         * interface.cs : Default modifier is private, not public. The
14661         make verify test passes again.
14662
14663 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14664
14665         * support.cs (ReflectionParameters): Fix logic to determine
14666         whether the last parameter is a params one. Test 9 passes again.
14667
14668         * delegate.cs (Populate): Register the builders we define with
14669         RegisterParameterForBuilder. Test 19 passes again.
14670
14671         * cs-parser.jay (property_declaration): Reference $6 instead
14672         of $$ to get at the location.
14673
14674         (indexer_declaration): Similar stuff.
14675
14676         (attribute): Ditto.
14677
14678         * class.cs (Property): Register parameters for the Get and Set methods
14679         if they exist. Test 23 passes again.
14680
14681         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14682         call to EmitArguments as we are sure there aren't any params arguments. 
14683         Test 32 passes again.
14684
14685         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14686         IndexOutOfRangeException. 
14687
14688         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14689         Test 33 now passes again.
14690
14691 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14692
14693         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14694         broke a bunch of things.  Will have to come up with a better way
14695         of tracking locations.
14696
14697         * statement.cs: Implemented foreach for single dimension arrays.
14698
14699 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14700
14701         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14702         an error.  This removes the lookup from the critical path.
14703
14704         * cs-parser.jay: Removed use of temporary_loc, which is completely
14705         broken. 
14706
14707 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14708
14709         * support.cs (ReflectionParameters.ParameterModifier): Report
14710         whether the argument is a PARAMS argument or not.
14711
14712         * class.cs: Set the attribute `ParamArrayAttribute' on the
14713         parameter argument.
14714
14715         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14716         and cons_param_array_attribute (ConstructorInfo for
14717         ParamArrayAttribute)., 
14718
14719         * codegen.cs: Emit the return using the `Return' statement, that
14720         way we can report the error correctly for missing return values. 
14721
14722         * class.cs (Method.Emit): Clean up.
14723
14724         * expression.cs (Argument.Resolve): Take another argument: the
14725         location where this argument is used.  Notice that this is not
14726         part of the "Argument" class as to reduce the size of the
14727         structure (we know the approximate location anyways).
14728
14729         Test if the argument is a variable-reference, if not, then
14730         complain with a 206.
14731
14732         (Argument.Emit): Emit addresses of variables.
14733
14734         (Argument.FullDesc): Simplify.
14735
14736         (Invocation.DoResolve): Update for Argument.Resolve.
14737
14738         (ElementAccess.DoResolve): ditto.
14739
14740         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14741         method should be virtual, as this method is always virtual.
14742
14743         (NewDelegate.DoResolve): Update for Argument.Resolve.
14744
14745         * class.cs (ConstructorInitializer.DoResolve): ditto.
14746
14747         * attribute.cs (Attribute.Resolve): ditto.
14748
14749 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14750
14751         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14752
14753         * expression.cs (ParameterReference): Drop IStackStorage and implement
14754         IAssignMethod instead. 
14755
14756         (LocalVariableReference): ditto.
14757
14758         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14759         IAssignMethod instead. 
14760
14761 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14762
14763         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14764         enumerations that are used in heavily used structures derive from
14765         byte in a laughable and pathetic attempt to reduce memory usage.
14766         This is the kind of pre-optimzations that you should not do at
14767         home without adult supervision.
14768
14769         * expression.cs (UnaryMutator): New class, used to handle ++ and
14770         -- separatedly from the other unary operators.  Cleans up the
14771         code, and kills the ExpressionStatement dependency in Unary.
14772
14773         (Unary): Removed `method' and `Arguments' from this class, making
14774         it smaller, and moving it all to SimpleCall, so I can reuse this
14775         code in other locations and avoid creating a lot of transient data
14776         strucutres when not required.
14777
14778         * cs-parser.jay: Adjust for new changes.
14779
14780 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14781
14782         * enum.cs (Enum.Populate): If there is a failure during
14783         definition, return
14784
14785         * cs-parser.jay (opt_enum_base): we used to catch type errors
14786         here, but this is really incorrect.  The type error should be
14787         catched during semantic analysis.
14788
14789 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14790
14791         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14792         current_local_parameters as expected since I, in my stupidity, had forgotten
14793         to do this :-)
14794
14795         * attribute.cs (GetValidPlaces): Fix stupid bug.
14796
14797         * class.cs (Method::Emit): Perform check on applicability of attributes.
14798
14799         (Constructor::Emit): Ditto.
14800
14801         (Field::Emit): Ditto.
14802
14803         (Field.Location): Store location information.
14804
14805         (Property, Event, Indexer, Operator): Ditto.
14806
14807         * cs-parser.jay (field_declaration): Pass in location for each field.
14808
14809         * ../errors/cs0592.cs : Add.
14810
14811 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14812
14813         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14814
14815         (InitCoreTypes): Update accordingly.
14816
14817         (RegisterAttrType, LookupAttr): Implement.
14818
14819         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14820         info about the same.
14821
14822         (Resolve): Update to populate the above as necessary.
14823
14824         (Error592): Helper.
14825
14826         (GetValidPlaces): Helper to the above.
14827
14828         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14829
14830         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14831
14832 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14833
14834         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14835
14836         * ../errors/cs0617.cs : Add.
14837
14838 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14839
14840         * enum.cs (Emit): Rename to Populate to be more consistent with what
14841         we expect it to do and when exactly it is called.
14842
14843         * class.cs, rootcontext.cs : Update accordingly.
14844
14845         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14846         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14847
14848         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14849
14850         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14851         of a fieldinfo using the above, when dealing with a FieldBuilder.
14852
14853 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14854
14855         * ../errors/cs0031.cs : Add.
14856
14857         * ../errors/cs1008.cs : Add.
14858
14859         * ../errrors/cs0543.cs : Add.
14860
14861         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14862         enum type.
14863
14864         (FindMembers): Implement.
14865
14866         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14867         enums and delegates too.
14868
14869         (enum_types): Rename to builder_to_enum.
14870
14871         (delegate_types): Rename to builder_to_delegate.
14872
14873         * delegate.cs (FindMembers): Implement.
14874
14875 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14876
14877         * typemanager.cs (IsEnumType): Implement.
14878
14879         * enum.cs (Emit): Re-write parts to account for the underlying type
14880         better and perform checking etc.
14881
14882         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14883         of the underlying type.
14884
14885         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14886         value
14887
14888         * enum.cs (error31): Helper to report error #31.
14889
14890         * cs-parser.jay (enum_declaration): Store location of each member too.
14891
14892         * enum.cs (member_to_location): New hashtable. 
14893
14894         (AddEnumMember): Update location hashtable.
14895
14896         (Emit): Use the location of each member while reporting errors.
14897
14898 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14899
14900         * cs-parser.jay: A for_initializer if is a
14901         local_variable_declaration really ammount to have an implicit
14902         block with the variable declaration and no initializer for for.
14903
14904         * statement.cs (For.Emit): Cope with null initializers.
14905
14906         This fixes the infinite loop on for initializers.
14907
14908 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14909
14910         * enum.cs: More cleanup.
14911
14912         * ecore.cs: Remove dead code.
14913
14914         * class.cs (Property.Emit): More simplification.
14915         (Event.Emit): ditto.
14916
14917         Reworked to have less levels of indentation.
14918
14919 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14920
14921         * class.cs (Property): Emit attributes.
14922
14923         (Field): Ditto.
14924
14925         (Event): Ditto.
14926
14927         (Indexer): Ditto.
14928
14929         (Operator): Ditto.
14930
14931         * enum.cs (Emit): Ditto.
14932
14933         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14934         Enums too.
14935
14936         * class.cs (Field, Event, etc.): Move attribute generation into the
14937         Emit method everywhere.
14938
14939         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14940         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14941         as we had no way of defining nested enums !
14942
14943         * rootcontext.cs : Adjust code accordingly.
14944
14945         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14946
14947 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14948
14949         * expression.cs (EvalConstantExpression): Move into ecore.cs
14950
14951         * enum.cs (Enum): Rename some members and make them public and readonly
14952         according to our convention.
14953
14954         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14955         nothing else.
14956
14957         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14958
14959         (Enum::Emit): Write a simple version for now which doesn't try to compute
14960         expressions. I shall modify this to be more robust in just a while.
14961
14962         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14963
14964         (TypeContainer::CloseType): Create the Enum types too.
14965
14966         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14967
14968         * expression.cs (EvalConstantExpression): Get rid of completely.
14969
14970         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14971         user-defined values and other cases.
14972
14973         (IsValidEnumLiteral): Helper function.
14974
14975         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14976         out there in the case we had a literal FieldExpr.
14977
14978         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14979
14980         (Literalize): Revamp a bit to take two arguments.
14981
14982         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14983
14984 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14985
14986         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14987
14988         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14989
14990         (Resolve): Use the above to ensure we have proper initializers.
14991
14992 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14993
14994         * expression.cs (Expression::EvalConstantExpression): New method to 
14995         evaluate constant expressions.
14996
14997         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14998
14999 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15000
15001         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15002         in an array.
15003
15004         (Binary.ResolveOperator): Handle operator != (object a, object b)
15005         and operator == (object a, object b);
15006
15007         (Binary.DoNumericPromotions): Indicate whether the numeric
15008         promotion was possible.
15009
15010         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15011         Implement.  
15012
15013         Made the ArrayAccess implement interface IAssignMethod instead of
15014         IStackStore as the order in which arguments are passed reflects
15015         this.
15016
15017         * assign.cs: Instead of using expr.ExprClass to select the way of
15018         assinging, probe for the IStackStore/IAssignMethod interfaces.
15019
15020         * typemanager.cs: Load InitializeArray definition.
15021
15022         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15023         static data that can be used to initialize arrays. 
15024
15025 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15026
15027         * expression.cs: Handle operator== and operator!= for booleans.
15028
15029         (Conditioal.Reduce): Implement reducer for the ?: operator.
15030
15031         (Conditional.Resolve): Implement dead code elimination.
15032
15033         (Binary.Resolve): Catch string literals and return a new
15034         concatenated string.
15035
15036         (Unary.Reduce): Implement reduction of unary expressions.
15037
15038         * ecore.cs: Split out the expression core handling here.
15039
15040         (Expression.Reduce): New method used to perform constant folding
15041         and CSE.  This is needed to support constant-expressions. 
15042
15043         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15044         targets, and optimize for !x.
15045
15046 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15047
15048         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15049         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15050         set custom atttributes.
15051
15052         * literal.cs (Literal::GetValue): New abstract method to return the actual
15053         value of the literal, cast as an object.
15054
15055         (*Literal): Implement GetValue method.
15056
15057         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15058         expressions to the arraylist but objects of type Argument.
15059
15060         * class.cs (TypeContainer::Emit): Emit our attributes too.
15061
15062         (Method::Emit, Constructor::Emit): Ditto.
15063
15064         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15065         to be ignoring earlier.
15066
15067 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15068
15069         * attribute.cs (AttributeSection::Define): Implement to do the business
15070         of constructing a CustomAttributeBuilder.
15071
15072         (Attribute): New trivial class. Increases readability of code.  
15073
15074         * cs-parser.jay : Update accordingly.
15075
15076         (positional_argument_list, named_argument_list, named_argument): New rules
15077
15078         (attribute_arguments): Use the above so that we are more correct.
15079
15080 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15081
15082         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15083         to perform all checks for a method with a params parameter.
15084
15085         (Invocation::OverloadResolve): Update to use the above method and therefore
15086         cope correctly with params method invocations.
15087
15088         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15089         params too.
15090
15091         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15092         constructors in our parent too because we can't afford to miss out on 
15093         protected ones ;-)
15094
15095         * attribute.cs (AttributeSection): New name for the class Attribute
15096
15097         Other trivial changes to improve readability.
15098
15099         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15100         use the new class names.
15101
15102 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15103
15104         * class.cs (Method::Define): Complete definition for params types too
15105
15106         (Indexer::Define): Ditto.
15107
15108         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15109         Cope everywhere with a request for info about the array parameter.
15110
15111 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15112
15113         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15114
15115         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15116         local_variable_type to extract the string corresponding to the type.
15117
15118         (local_variable_type): Fixup the action to use the new helper method.
15119
15120         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15121         go.
15122
15123         * expression.cs : Clean out code which uses the above.
15124
15125 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15126
15127         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15128         and bale out if necessary by returning a false.
15129
15130         (RegisterProperty): Ditto.
15131
15132         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15133         and print out appropriate error messages.
15134
15135         * interface.cs (everywhere): Ditto.
15136
15137         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15138         location to constructor.
15139
15140         * class.cs (Property, Event, Indexer): Update accordingly.
15141
15142         * ../errors/cs111.cs : Added.
15143
15144         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15145         of a method, as laid down by the spec.
15146
15147         (Invocation::OverloadResolve): Use the above method.
15148
15149 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15150
15151         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15152         now take a TypeContainer and a Parameters object.
15153
15154         (ParameterData): Modify return type of ParameterModifier method to be 
15155         Parameter.Modifier and not a string.
15156
15157         (ReflectionParameters, InternalParameters): Update accordingly.
15158
15159         * expression.cs (Argument::GetParameterModifier): Same here.
15160
15161         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15162         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15163         symbol in it at all so maybe this is only for now.
15164
15165 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15166
15167         * support.cs (InternalParameters): Constructor now takes an extra argument 
15168         which is the actual Parameters class.
15169
15170         (ParameterDesc): Update to provide info on ref/out modifiers.
15171
15172         * class.cs (everywhere): Update call to InternalParameters to pass in
15173         the second argument too.
15174
15175         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15176         to return the modifier info [ref/out etc]
15177
15178         (InternalParameters, ReflectionParameters): Implement the above.
15179
15180         * expression.cs (Argument::ParameterModifier): Similar function to return
15181         info about the argument's modifiers.
15182
15183         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15184         too.
15185
15186         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15187         a new SetFormalParameters object which we pass to InternalParameters.
15188
15189 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15190
15191         * expression.cs (NewArray): Merge into the ArrayCreation class.
15192
15193 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15194
15195         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15196         NewUserdefinedArray into one as there wasn't much of a use in having
15197         two separate ones.
15198
15199         * expression.cs (Argument): Change field's name to ArgType from Type.
15200
15201         (Type): New readonly property which returns the proper type, taking into 
15202         account ref/out modifiers.
15203
15204         (everywhere): Adjust code accordingly for the above.
15205
15206         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15207         whether we are emitting for a ref or out parameter.
15208
15209         * expression.cs (Argument::Emit): Use the above field to set the state.
15210
15211         (LocalVariableReference::Emit): Update to honour the flag and emit the
15212         right stuff.
15213
15214         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15215
15216         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15217
15218         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15219
15220         (ReflectionParameters, InternalParameters): Implement the above method.
15221
15222         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15223         reporting errors.
15224
15225         (Invocation::FullMethodDesc): Ditto. 
15226
15227 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15228
15229         * cs-parser.jay: Add extra production for the second form of array
15230         creation. 
15231
15232         * expression.cs (ArrayCreation): Update to reflect the above
15233         change. 
15234
15235         * Small changes to prepare for Array initialization.
15236
15237 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15238
15239         * typemanager.cs (ImplementsInterface): interface might be null;
15240         Deal with this problem;
15241
15242         Also, we do store negative hits on the cache (null values), so use
15243         this instead of calling t.GetInterfaces on the type everytime.
15244
15245 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15246
15247         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15248
15249         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15250         split functionality out into different classes.
15251
15252         (New::FormArrayType): Move into NewBuiltinArray.
15253
15254         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15255         quite useless.
15256
15257         (NewBuiltinArray): New class to handle creation of built-in arrays.
15258
15259         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15260         account creation of one-dimensional arrays.
15261
15262         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15263
15264         (NewUserdefinedArray::DoResolve): Implement.
15265
15266         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15267
15268         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15269         we maintain inside the TypeManager. This is necessary to perform lookups on the
15270         module builder.
15271
15272         (LookupType): Update to perform GetType on the module builders too.     
15273
15274         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15275
15276         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15277
15278 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15279
15280         * expression.cs (New::DoResolve): Implement guts of array creation.
15281
15282         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15283
15284 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15285
15286         * expression.cs: Fix bug I introduced lsat night that broke
15287         Delegates. 
15288
15289         (Expression.Resolve): Report a 246 error (can not resolve name)
15290         if we find a SimpleName in the stream.
15291
15292         (Expression.ResolveLValue): Ditto.
15293
15294         (Expression.ResolveWithSimpleName): This function is a variant of
15295         ResolveName, this one allows SimpleNames to be returned without a
15296         warning.  The only consumer of SimpleNames is MemberAccess
15297
15298 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15299
15300         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15301         might arrive here.  I have my doubts that this is correct.
15302
15303         * statement.cs (Lock): Implement lock statement.
15304
15305         * cs-parser.jay: Small fixes to support `lock' and `using'
15306
15307         * cs-tokenizer.cs: Remove extra space
15308
15309         * driver.cs: New flag --checked, allows to turn on integer math
15310         checking. 
15311
15312         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15313         Threading.Monitor.Exit 
15314
15315 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15316
15317         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15318         Expression Class to be IndexerAccess.
15319
15320         Notice that Indexer::DoResolve sets the eclass to Value.
15321
15322 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15323
15324         * class.cs (TypeContainer::Emit): Emit code for indexers.
15325
15326         * assign.cs (IAssignMethod): New interface implemented by Indexers
15327         and Properties for handling assignment.
15328
15329         (Assign::Emit): Simplify and reuse code. 
15330
15331         * expression.cs (IndexerAccess, PropertyExpr): Implement
15332         IAssignMethod, clean up old code. 
15333
15334 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15335
15336         * typemanager.cs (ImplementsInterface): New method to determine if a type
15337         implements a given interface. Provides a nice cache too.
15338
15339         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15340         method.
15341
15342         (ConvertReferenceExplicit): Ditto.
15343
15344         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15345         various methods, with correct names etc.
15346
15347         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15348         Operator.UnaryNegation.
15349
15350         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15351         we have a unary plus or minus operator.
15352
15353         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15354         UnaryMinus.
15355
15356         * everywhere : update accordingly.
15357
15358         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15359         respectively.
15360
15361         * class.cs (Method::Define): For the case where we are implementing a method
15362         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15363         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15364
15365 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15366
15367         * interface.cs (FindMembers): Implement to work around S.R.E
15368         lameness.
15369
15370         * typemanager.cs (IsInterfaceType): Implement.
15371
15372         (FindMembers): Update to handle interface types too.
15373
15374         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15375         use IsAssignableFrom as that is not correct - it doesn't work.
15376
15377         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15378         and accordingly override EmitStatement.
15379
15380         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15381         using the correct logic :-)
15382
15383 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15384
15385         * ../errors/cs-11.cs : Add to demonstrate error -11 
15386
15387 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15388
15389         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15390         then pass this as a hint to ResolveLValue.
15391
15392         * expression.cs (FieldExpr): Add Location information
15393
15394         (FieldExpr::LValueResolve): Report assignment to readonly
15395         variable. 
15396
15397         (Expression::ExprClassFromMemberInfo): Pass location information.
15398
15399         (Expression::ResolveLValue): Add new method that resolves an
15400         LValue. 
15401
15402         (Expression::DoResolveLValue): Default invocation calls
15403         DoResolve. 
15404
15405         (Indexers): New class used to keep track of indexers in a given
15406         Type. 
15407
15408         (IStackStore): Renamed from LValue, as it did not really describe
15409         what this did.  Also ResolveLValue is gone from this interface and
15410         now is part of Expression.
15411
15412         (ElementAccess): Depending on the element access type
15413
15414         * typemanager.cs: Add `indexer_name_type' as a Core type
15415         (System.Runtime.CompilerServices.IndexerNameAttribute)
15416
15417         * statement.cs (Goto): Take a location.
15418
15419 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15420
15421         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15422         if two delegates are compatible.
15423
15424         (NewDelegate::DoResolve): Update to take care of the case when
15425         we instantiate a delegate from another delegate.
15426
15427         * typemanager.cs (FindMembers): Don't even try to look up members
15428         of Delegate types for now.
15429
15430 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15431
15432         * delegate.cs (NewDelegate): New class to take care of delegate
15433         instantiation.
15434
15435         * expression.cs (New): Split the delegate related code out into 
15436         the NewDelegate class.
15437
15438         * delegate.cs (DelegateInvocation): New class to handle delegate 
15439         invocation.
15440
15441         * expression.cs (Invocation): Split out delegate related code into
15442         the DelegateInvocation class.
15443
15444 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15445
15446         * expression.cs (New::DoResolve): Implement delegate creation fully
15447         and according to the spec.
15448
15449         (New::DoEmit): Update to handle delegates differently.
15450
15451         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15452         because of which we were printing out arguments in reverse order !
15453
15454         * delegate.cs (VerifyMethod): Implement to check if the given method
15455         matches the delegate.
15456
15457         (FullDelegateDesc): Implement.
15458
15459         (VerifyApplicability): Implement.
15460
15461         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15462         delegate invocations too.
15463
15464         (Invocation::Emit): Ditto.
15465
15466         * ../errors/cs1593.cs : Added.
15467
15468         * ../errors/cs1594.cs : Added.
15469
15470         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15471
15472 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15473
15474         * typemanager.cs (intptr_type): Core type for System.IntPtr
15475
15476         (InitCoreTypes): Update for the same.
15477
15478         (iasyncresult_type, asynccallback_type): Ditto.
15479
15480         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15481         correct.
15482
15483         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15484         too.
15485
15486         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15487         the builders for the 4 members of a delegate type :-)
15488
15489         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15490         type.
15491
15492         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15493
15494         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15495
15496 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15497
15498         * statement.cs (Break::Emit): Implement.   
15499         (Continue::Emit): Implement.
15500
15501         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15502         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15503         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15504         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15505         end loop
15506
15507         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15508         properties that track the label for the current loop (begin of the
15509         loop and end of the loop).
15510
15511 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15512
15513         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15514         use of emitting anything at all.
15515
15516         * class.cs, rootcontext.cs : Get rid of calls to the same.
15517
15518         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15519
15520         (Populate): Define the constructor correctly and set the implementation
15521         attributes.
15522
15523         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15524         have been defined.
15525
15526         (AddDelegateType): Implement.
15527
15528         (IsDelegateType): Implement helper method.
15529
15530         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15531
15532         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15533         and accordingly handle it.
15534
15535         * delegate.cs (Populate): Take TypeContainer argument.
15536         Implement bits to define the Invoke method. However, I still haven't figured out
15537         how to take care of the native int bit :-(
15538
15539         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15540         Qualify the name of the delegate, not its return type !
15541
15542         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15543         conversion.
15544
15545         (StandardConversionExists): Checking for array types turns out to be recursive.
15546
15547         (ConvertReferenceExplicit): Implement array conversion.
15548
15549         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15550
15551 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15552
15553         * cs-parser.jay (delegate_declaration): Store the fully qualified
15554         name as it is a type declaration.
15555
15556         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15557         readonly.
15558
15559         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15560         as TypeContainer::DefineType.
15561
15562         (Populate): Method in which all the definition of the various methods (Invoke)
15563         etc is done.
15564
15565         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15566         see.
15567
15568         (CloseDelegate): Finally creates the delegate.
15569
15570         * class.cs (TypeContainer::DefineType): Update to define delegates.
15571         (Populate, Emit and CloseType): Do the same thing here too.
15572
15573         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15574         delegates in all these operations.
15575
15576 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15577
15578         * expression.cs: LocalTemporary: a new expression used to
15579         reference a temporary that has been created.
15580
15581         * assign.cs: Handle PropertyAccess back here, so that we can
15582         provide the proper semantic access to properties.
15583
15584         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15585         a few more explicit conversions. 
15586
15587         * modifiers.cs: `NEW' modifier maps to HideBySig.
15588
15589         * expression.cs (PropertyExpr): Make this into an
15590         ExpressionStatement, and support the EmitStatement code path. 
15591
15592         Perform get/set error checking, clean up the interface.
15593
15594         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15595         them into toplevel access objects.
15596
15597 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15598
15599         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15600         SRE.
15601
15602         * typemanager.cs: Keep track here of our PropertyBuilders again to
15603         work around lameness in SRE.
15604
15605 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15606
15607         * expression.cs (LValue::LValueResolve): New method in the
15608         interface, used to perform a second resolution pass for LValues. 
15609
15610         (This::DoResolve): Catch the use of this in static methods.
15611
15612         (This::LValueResolve): Implement.
15613
15614         (This::Store): Remove warning, assigning to `this' in structures
15615         is 
15616
15617         (Invocation::Emit): Deal with invocation of
15618         methods on value types.  We need to pass the address to structure
15619         methods rather than the object itself.  (The equivalent code to
15620         emit "this" for structures leaves the entire structure on the
15621         stack instead of a pointer to it). 
15622
15623         (ParameterReference::DoResolve): Compute the real index for the
15624         argument based on whether the method takes or not a `this' pointer
15625         (ie, the method is static).
15626
15627         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15628         value types returned from functions when we need to invoke a
15629         method on the sturcture.
15630
15631
15632 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15633
15634         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15635         defining the type in the Modulebuilder or Typebuilder. This is to take
15636         care of nested types which need to be defined on the TypeBuilder using
15637         DefineNestedMethod.
15638
15639         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15640         methods in RootContext, only ported to be part of TypeContainer.
15641
15642         (TypeContainer::GetInterfaceOrClass): Ditto.
15643
15644         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15645
15646         * interface.cs (Interface::DefineInterface): New method. Does exactly
15647         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15648         too.
15649
15650         (Interface::GetInterfaces): Move from RootContext here and port.
15651
15652         (Interface::GetInterfaceByName): Same here.
15653
15654         * rootcontext.cs (ResolveTree): Re-write.
15655
15656         (PopulateTypes): Re-write.
15657
15658         * class.cs (TypeContainer::Populate): Populate nested types too.
15659         (TypeContainer::Emit): Emit nested members too.
15660
15661         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15662         instead just use the name argument passed in as it is already fully
15663         qualified.
15664
15665         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15666         to TypeContainer mapping to see if a type is user-defined.
15667
15668         * class.cs (TypeContainer::CloseType): Implement. 
15669
15670         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15671         the default constructor.
15672
15673         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15674         twice.
15675
15676         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15677
15678         * interface.cs (CloseType): Create the type here.
15679
15680         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15681         the hierarchy.
15682
15683         Remove all the methods which are now in TypeContainer.
15684
15685 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15686
15687         * delegate.cs (Define): Re-write bits to define the delegate
15688         correctly.
15689
15690 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15691
15692         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15693
15694         * expression.cs (ImplicitReferenceConversion): handle null as well
15695         as a source to convert to any reference type.
15696
15697         * statement.cs (Return): Perform any implicit conversions to
15698         expected return type.  
15699
15700         Validate use of return statement.  
15701
15702         * codegen.cs (EmitContext): Pass the expected return type here.
15703
15704         * class.cs (Method, Constructor, Property): Pass expected return
15705         type to EmitContext.
15706
15707 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15708
15709         * expression.cs: Make DoResolve take an EmitContext instead of a
15710         TypeContainer.
15711
15712         Replaced `l' and `location' for `loc', for consistency.
15713
15714         (Error, Warning): Remove unneeded Tc argument.
15715
15716         * assign.cs, literal.cs, constant.cs: Update to new calling
15717         convention. 
15718
15719         * codegen.cs: EmitContext now contains a flag indicating whether
15720         code is being generated in a static method or not.
15721
15722         * cs-parser.jay: DecomposeQI, new function that replaces the old
15723         QualifiedIdentifier.  Now we always decompose the assembled
15724         strings from qualified_identifier productions into a group of
15725         memberaccesses.
15726
15727 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15728
15729         * rootcontext.cs: Deal with field-less struct types correctly now
15730         by passing the size option to Define Type.
15731
15732         * class.cs: Removed hack that created one static field. 
15733
15734 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15735
15736         * statement.cs: Moved most of the code generation here. 
15737
15738 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15739
15740         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15741         seem very right.
15742
15743         (ElementAccess): Remove useless bits for now - keep checks as the spec
15744         says.
15745
15746 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15747
15748         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15749         and start performing checks according to the spec.
15750
15751 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15752
15753         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15754         rank_specifiers instead.
15755
15756         (rank_specifiers): Change the order in which the rank specifiers are stored
15757
15758         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15759
15760         * expression.cs (ElementAccess): Implement the LValue interface too.
15761
15762 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15763
15764         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15765         except that user defined conversions are not included.
15766
15767         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15768         perform the conversion of the return type, if necessary.
15769
15770         (New::DoResolve): Check whether we are creating an array or an object
15771         and accordingly do the needful.
15772
15773         (New::Emit): Same here.
15774
15775         (New::DoResolve): Implement guts of array creation.
15776
15777         (New::FormLookupType): Helper function.
15778
15779 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15780
15781         * codegen.cs: Removed most of the code generation here, and move the
15782         corresponding code generation bits to the statement classes. 
15783
15784         Added support for try/catch/finalize and throw.
15785
15786         * cs-parser.jay: Added support for try/catch/finalize.
15787
15788         * class.cs: Catch static methods having the flags override,
15789         virtual or abstract.
15790
15791         * expression.cs (UserCast): This user cast was not really doing
15792         what it was supposed to do.  Which is to be born in fully resolved
15793         state.  Parts of the resolution were being performed at Emit time! 
15794
15795         Fixed this code.
15796
15797 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15798
15799         * expression.cs: Implicity convert the result from UserCast.
15800
15801 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15802
15803         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15804         prevented it from working correctly. 
15805
15806         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15807         merely ConvertImplicit.
15808
15809 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15810
15811         * typemanager.cs: Make the LookupTypeContainer function static,
15812         and not per-instance.  
15813
15814         * class.cs: Make static FindMembers (the one that takes a Type
15815         argument). 
15816
15817         * codegen.cs: Add EmitForeach here.
15818
15819         * cs-parser.jay: Make foreach a toplevel object instead of the
15820         inline expansion, as we need to perform semantic analysis on it. 
15821
15822 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15823
15824         * expression.cs (Expression::ImplicitUserConversion): Rename to
15825         UserDefinedConversion.
15826
15827         (Expression::UserDefinedConversion): Take an extra argument specifying 
15828         whether we look for explicit user conversions too.
15829
15830         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15831
15832         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15833
15834         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15835         with the appropriate arguments.
15836
15837         * cs-parser.jay (cast_expression): Record location too.
15838
15839         * expression.cs (Cast): Record location info.
15840
15841         (Expression::ConvertExplicit): Take location argument.
15842
15843         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15844         to determine if we are doing explicit conversions.
15845
15846         (UserCast::Emit): Update accordingly.
15847
15848         (Expression::ConvertExplicit): Report an error if everything fails.
15849
15850         * ../errors/cs0030.cs : Add.
15851
15852 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15853
15854         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15855         virtual and newslot bits. 
15856
15857         * class.cs (TypeContainer::RegisterRequiredImplementations):
15858         Record methods we need.
15859
15860         (TypeContainer::MakeKey): Helper function to make keys for
15861         MethodBases, since the Methodbase key is useless.
15862
15863         (TypeContainer::Populate): Call RegisterRequiredImplementations
15864         before defining the methods.   
15865
15866         Create a mapping for method_builders_to_methods ahead of time
15867         instead of inside a tight loop.
15868
15869         (::RequireMethods):  Accept an object as the data to set into the
15870         hashtable so we can report interface vs abstract method mismatch.
15871
15872 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15873
15874         * report.cs: Make all of it static.
15875
15876         * rootcontext.cs: Drop object_type and value_type computations, as
15877         we have those in the TypeManager anyways.
15878
15879         Drop report instance variable too, now it is a global.
15880
15881         * driver.cs: Use try/catch on command line handling.
15882
15883         Add --probe option to debug the error reporting system with a test
15884         suite. 
15885
15886         * report.cs: Add support for exiting program when a probe
15887         condition is reached.
15888
15889 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15890
15891         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15892         we do a forcible conversion regardless of type, to check if 
15893         ForceConversion returns a null.
15894
15895         (Binary::error19): Use location to report error.
15896
15897         (Unary::error23): Use location here too.
15898
15899         * ../errors/cs0019.cs : Check in.
15900
15901         * ../errors/cs0023.cs : Check in.
15902
15903         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15904         case of a non-null MethodInfo object with a length of 0 !
15905
15906         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15907         an applicable member - according to the spec :-)
15908         Also fix logic to find members in base types.
15909
15910         (Unary::ResolveOperator): Same here.
15911
15912         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15913         as I was getting thoroughly confused between this and error19 :-)
15914
15915         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15916         (::FindMostEncompassedType): Implement.
15917         (::FindMostEncompassingType): Implement.
15918         (::StandardConversionExists): Implement.
15919
15920         (UserImplicitCast): Re-vamp. We now need info about most specific
15921         source and target types so that we can do the necessary conversions.
15922
15923         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15924         mathematical union with no duplicates.
15925
15926 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15927
15928         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15929         in order from base classes to child classes, so that we can in
15930         child classes look up in our parent for method names and
15931         attributes (required for handling abstract, virtual, new, override
15932         constructs: we need to instrospect our base class, and if we dont
15933         populate the classes in order, the introspection might be
15934         incorrect.  For example, a method could query its parent before
15935         the parent has any methods and would determine that the parent has
15936         no abstract methods (while it could have had them)).
15937
15938         (RootContext::CreateType): Record the order in which we define the
15939         classes.
15940
15941 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15942
15943         * class.cs (TypeContainer::Populate): Also method definitions can
15944         fail now, keep track of this.
15945
15946         (TypeContainer::FindMembers): Implement support for
15947         DeclaredOnly/noDeclaredOnly flag.
15948
15949         (Constructor::Emit) Return the ConstructorBuilder.
15950
15951         (Method::Emit) Return the MethodBuilder. 
15952         Check for abstract or virtual methods to be public.
15953
15954         * rootcontext.cs (RootContext::CreateType): Register all the
15955         abstract methods required for the class to be complete and the
15956         interface methods that must be implemented. 
15957
15958         * cs-parser.jay: Report error 501 (method requires body if it is
15959         not marked abstract or extern).
15960
15961         * expression.cs (TypeOf::Emit): Implement.
15962
15963         * typemanager.cs: runtime_handle_type, new global type.
15964
15965         * class.cs (Property::Emit): Generate code for properties.
15966
15967 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15968
15969         * expression.cs (Unary::ResolveOperator): Find operators on base type
15970         too - we now conform exactly to the spec.
15971
15972         (Binary::ResolveOperator): Same here.
15973
15974         * class.cs (Operator::Define): Fix minor quirk in the tests.
15975
15976         * ../errors/cs0215.cs : Added.
15977
15978         * ../errors/cs0556.cs : Added.
15979
15980         * ../errors/cs0555.cs : Added.
15981
15982 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15983
15984         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15985         single integer which is really efficient
15986
15987 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15988
15989         *  expression.cs (Expression::ImplicitUserConversion): Use location
15990         even in the case when we are examining True operators.
15991  
15992         * class.cs (Operator::Define): Perform extensive checks to conform
15993         with the rules for operator overloading in the spec.
15994
15995         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15996         some of the other conversions mentioned in the spec.
15997
15998         * typemanager.cs (array_type): New static member for the System.Array built-in
15999         type.
16000
16001         (cloneable_interface): For System.ICloneable interface.
16002
16003         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16004         we start resolving the tree and populating types.
16005
16006         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16007  
16008 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16009
16010         * expression.cs (Expression::ExprClassFromMemberInfo,
16011         Expression::Literalize): Create literal expressions from
16012         FieldInfos which are literals.
16013
16014         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16015         type casts, because they were wrong.  The test suite in tests
16016         caught these ones.
16017
16018         (ImplicitNumericConversion): ushort to ulong requires a widening
16019         cast. 
16020
16021         Int32 constant to long requires widening cast as well.
16022
16023         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16024         for integers because the type on the stack is not i4.
16025
16026 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16027
16028         * expression.cs (report118): require location argument. 
16029
16030         * parameter.cs: Do not dereference potential null value.
16031
16032         * class.cs: Catch methods that lack the `new' keyword when
16033         overriding a name.  Report warnings when `new' is used without
16034         anything being there to override.
16035
16036         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16037
16038         * class.cs: Only add constructor to hashtable if it is non-null
16039         (as now constructors can fail on define).
16040
16041         (TypeManager, Class, Struct): Take location arguments.
16042
16043         Catch field instance initialization in structs as errors.
16044
16045         accepting_filter: a new filter for FindMembers that is static so
16046         that we dont create an instance per invocation.
16047
16048         (Constructor::Define): Catch errors where a struct constructor is
16049         parameterless 
16050
16051         * cs-parser.jay: Pass location information for various new
16052         constructs. 
16053
16054         * delegate.cs (Delegate): take a location argument.
16055
16056         * driver.cs: Do not call EmitCode if there were problesm in the
16057         Definition of the types, as many Builders wont be there. 
16058
16059         * decl.cs (Decl::Decl): Require a location argument.
16060
16061         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16062         into integers, and find the most appropiate integer for it.
16063
16064         * literal.cs: Implement ULongLiteral.
16065
16066         * rootcontext.cs: Provide better information about the location of
16067         failure when CreateType fails.
16068
16069 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16070
16071         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16072         as well.
16073
16074         * expression.cs (Binary::CheckShiftArguments): Add missing type
16075         computation.
16076         (Binary::ResolveOperator): Add type to the logical and and logical
16077         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16078         before.
16079
16080         (Binary::DoNumericPromotions): In the case where either argument
16081         is ulong (and most signed types combined with ulong cause an
16082         error) perform implicit integer constant conversions as well.
16083
16084 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16085
16086         * expression.cs (UserImplicitCast): Method should always be
16087         non-null. 
16088         (Invocation::BetterConversion): Simplified test for IntLiteral.
16089
16090         (Expression::ImplicitNumericConversion): Split this routine out.
16091         Put the code that performs implicit constant integer conversions
16092         here. 
16093
16094         (Expression::Resolve): Become a wrapper around DoResolve so we can
16095         check eclass and type being set after resolve.
16096
16097         (Invocation::Badness): Remove this dead function
16098
16099         (Binary::ResolveOperator): Do not compute the expensive argumnets
16100         unless we have a union for it.
16101
16102         (Probe::Emit): Is needs to do an isinst and then
16103         compare against null.
16104
16105         (::CanConvert): Added Location argument.  If the Location argument
16106         is null (Location.Null), then we do not report errors.  This is
16107         used by the `probe' mechanism of the Explicit conversion.  We do
16108         not want to generate an error for something that the user
16109         explicitly requested to be casted.  But the pipeline for an
16110         explicit cast first tests for potential implicit casts.
16111
16112         So for now, if the Location is null, it means `Probe only' to
16113         avoid adding another argument.   Might have to revise this
16114         strategy later.
16115
16116         (ClassCast): New class used to type cast objects into arbitrary
16117         classes (used in Explicit Reference Conversions).
16118
16119         Implement `as' as well.
16120
16121         Reverted all the patches from Ravi below: they were broken:
16122
16123                 * The use of `level' as a mechanism to stop recursive
16124                   invocations is wrong.  That was there just to catch the
16125                   bug with a strack trace but not as a way of addressing
16126                   the problem.
16127
16128                   To fix the problem we have to *understand* what is going
16129                   on and the interactions and come up with a plan, not
16130                   just get things going.
16131
16132                 * The use of the type conversion cache that I proposed
16133                   last night had an open topic: How does this work across
16134                   protection domains.  A user defined conversion might not
16135                   be public in the location where we are applying the
16136                   conversion, a different conversion might be selected
16137                   (ie, private A->B (better) but public B->A (worse),
16138                   inside A, A->B applies, but outside it, B->A will
16139                   apply).
16140
16141                 * On top of that (ie, even if the above is solved),
16142                   conversions in a cache need to be abstract.  Ie, `To
16143                   convert from an Int to a Short use an OpcodeCast', not
16144                   `To convert from an Int to a Short use the OpcodeCast on
16145                   the variable 5' (which is what this patch was doing).
16146
16147 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16148
16149         * expression.cs (Invocation::ConversionExists): Re-write to use
16150         the conversion cache
16151
16152         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16153         cache all conversions done, not just user-defined ones.
16154
16155         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16156         to determine if a conversion exists instead of acutually trying to 
16157         perform the conversion. It's faster too.
16158
16159         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16160         and only then attempt the implicit conversion.
16161
16162 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16163
16164         * expression.cs (ConvertImplicit): Use a cache for conversions
16165         already found. Check level of recursion and bail out if necessary.
16166
16167 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16168
16169         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16170         Export standard methods that we expect for string operations.
16171
16172         * statement.cs (Block::UsageWarning): Track usage of variables and
16173         report the errors for not used variables.
16174
16175         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16176         operator. 
16177
16178 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16179
16180         * codegen.cs: remove unnneded code 
16181
16182         * expression.cs: Removed BuiltinTypeAccess class
16183
16184         Fix the order in which implicit conversions are
16185         done.  
16186
16187         The previous fixed dropped support for boxed conversions (adding a
16188         test to the test suite now)
16189
16190         (UserImplicitCast::CanConvert): Remove test for source being null,
16191         that code is broken.  We should not feed a null to begin with, if
16192         we do, then we should track the bug where the problem originates
16193         and not try to cover it up here.
16194
16195         Return a resolved expression of type UserImplicitCast on success
16196         rather than true/false.  Ravi: this is what I was talking about,
16197         the pattern is to use a static method as a "constructor" for
16198         objects. 
16199
16200         Also, do not create arguments until the very last minute,
16201         otherwise we always create the arguments even for lookups that
16202         will never be performed. 
16203
16204         (UserImplicitCast::Resolve): Eliminate, objects of type
16205         UserImplicitCast are born in a fully resolved state. 
16206
16207         * typemanager.cs (InitCoreTypes): Init also value_type
16208         (System.ValueType). 
16209
16210         * expression.cs (Cast::Resolve): First resolve the child expression.
16211
16212         (LValue): Add new method AddressOf to be used by
16213         the `&' operator.  
16214
16215         Change the argument of Store to take an EmitContext instead of an
16216         ILGenerator, because things like FieldExpr need to be able to call
16217         their children expression to generate the instance code. 
16218
16219         (Expression::Error, Expression::Warning): Sugar functions for
16220         reporting errors.
16221
16222         (Expression::MemberLookup): Accept a TypeContainer instead of a
16223         Report as the first argument.
16224
16225         (Expression::ResolvePrimary): Killed.  I still want to improve
16226         this as currently the code is just not right.
16227
16228         (Expression::ResolveMemberAccess): Simplify, but it is still
16229         wrong. 
16230
16231         (Unary::Resolve): Catch errors in AddressOf operators.
16232
16233         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16234         index to a byte for the short-version, or the compiler will choose
16235         the wrong Emit call, which generates the wrong data.
16236
16237         (ParameterReference::Emit, ::Store): same.
16238
16239         (FieldExpr::AddressOf): Implement.
16240
16241         * typemanager.cs: TypeManager: made public variable instead of
16242         property.
16243
16244         * driver.cs: document --fatal.
16245
16246         * report.cs (ErrorMessage, WarningMessage): new names for the old
16247         Error and Warning classes.
16248
16249         * cs-parser.jay (member_access): Turn built-in access to types
16250         into a normal simplename
16251
16252 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16253
16254         * expression.cs (Invocation::BetterConversion): Fix to cope
16255         with q being null, since this was introducing a bug.
16256
16257         * expression.cs (ConvertImplicit): Do built-in conversions first.
16258
16259 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16260
16261         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16262
16263 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16264
16265         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16266         I had introduced long ago (what's new ?).
16267
16268         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16269         the work of all the checking. 
16270         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16271         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16272
16273         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16274         that is the right way. 
16275
16276         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16277         overloading resolution. Use everywhere instead of cutting and pasting code.
16278
16279         (Binary::ResolveOperator): Use MakeUnionSet.
16280
16281         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16282         we have to convert to bool types. Not complete yet.
16283
16284 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16285
16286         * typemanager.cs (TypeManager::CSharpName): support ushort.
16287
16288         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16289         to provide an expression that performsn an implicit constant int
16290         conversion (section 6.1.6).
16291         (Expression::ConvertImplicitRequired): Reworked to include
16292         implicit constant expression conversions.
16293
16294         (Expression::ConvertNumericExplicit): Finished.
16295
16296         (Invocation::Emit): If InstanceExpression is null, then it means
16297         that we perform a call on this.
16298
16299 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16300
16301         * expression.cs (Unary::Emit): Remove some dead code.
16302         (Probe): Implement Resolve and Emit for `is'.
16303         (Expression::ConvertImplicitRequired): Attempt to do constant
16304         expression conversions here.  Maybe should be moved to
16305         ConvertImplicit, but I am not sure.
16306         (Expression::ImplicitLongConstantConversionPossible,
16307         Expression::ImplicitIntConstantConversionPossible): New functions
16308         that tell whether is it possible to apply an implicit constant
16309         expression conversion.
16310
16311         (ConvertNumericExplicit): Started work on explicit numeric
16312         conversions.
16313
16314         * cs-parser.jay: Update operator constants.
16315
16316         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16317         (Parameters::GetSignature): Hook up VerifyArgs here.
16318         (Parameters::VerifyArgs): Verifies that no two arguments have the
16319         same name. 
16320
16321         * class.cs (Operator): Update the operator names to reflect the
16322         ones that the spec expects (as we are just stringizing the
16323         operator names).
16324
16325         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16326         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16327         previous usage did only work for our methods.
16328         (Expression::ConvertImplicit): Handle decimal implicit numeric
16329         conversions as well.
16330         (Expression::InternalTypeConstructor): Used to invoke constructors
16331         on internal types for default promotions.
16332
16333         (Unary::Emit): Implement special handling for the pre/post
16334         increment/decrement for overloaded operators, as they need to have
16335         the same semantics as the other operators.
16336
16337         (Binary::ResolveOperator): ditto.
16338         (Invocation::ConversionExists): ditto.
16339         (UserImplicitCast::Resolve): ditto.
16340
16341 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16342
16343         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16344         operator, return after emitting body. Regression tests pass again !
16345
16346         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16347         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16348         (Invocation::OverloadResolve): Ditto.
16349         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16350
16351         * everywhere : update calls to the above methods accordingly.
16352
16353 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16354
16355         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16356
16357         * expression.cs (ExpressionStatement): New base class used for
16358         expressions that can appear in statements, so that we can provide
16359         an alternate path to generate expression that do not leave a value
16360         on the stack.
16361
16362         (Expression::Emit, and all the derivatives): We no longer return
16363         whether a value is left on the stack or not.  Every expression
16364         after being emitted leaves a single value on the stack.
16365
16366         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16367         facilties of ExpressionStatement if possible.
16368
16369         * cs-parser.jay: Update statement_expression.
16370
16371 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16372
16373         * driver.cs: Change the wording of message
16374
16375 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16376
16377         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16378         the type of the expression to the return type of the method if
16379         we have an overloaded operator match ! The regression tests pass again !
16380         (Unary::ResolveOperator): Ditto.
16381
16382         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16383         to find "op_Implicit", not "implicit" ;-)
16384         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16385         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16386
16387         * everywhere : Correct calls to the above accordingly.
16388
16389         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16390         (ConvertImplicit): Do user-defined conversion if it exists.
16391
16392 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16393
16394         * assign.cs: track location.
16395         (Resolve): Use implicit conversions on assignment.
16396
16397         * literal.cs: Oops.  Not good, Emit of short access values should
16398         pass (Bytes) or the wrong argument will be selected.
16399
16400         * expression.cs (Unary::Emit): Emit code for -expr.
16401
16402         (Unary::ResolveOperator): Handle `Substract' for non-constants
16403         (substract from zero from the non-constants).
16404         Deal with Doubles as well. 
16405
16406         (Expression::ConvertImplicitRequired): New routine that reports an
16407         error if no implicit conversion exists. 
16408
16409         (Invocation::OverloadResolve): Store the converted implicit
16410         expressions if we make them
16411
16412 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16413
16414         * class.cs (ConstructorInitializer): Take a Location argument.
16415         (ConstructorBaseInitializer): Same here.
16416         (ConstructorThisInitializer): Same here.
16417
16418         * cs-parser.jay : Update all calls accordingly.
16419
16420         * expression.cs (Unary, Binary, New): Take location argument.
16421         Update accordingly everywhere.
16422
16423         * cs-parser.jay : Update all calls to the above to take a location
16424         argument.
16425
16426         * class.cs : Ditto.
16427
16428 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16429
16430         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16431         (Invocation::BetterConversion): Same here
16432         (Invocation::ConversionExists): Ditto.
16433
16434         (Invocation::ConversionExists): Implement.
16435
16436 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16437
16438         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16439         Also take an additional TypeContainer argument.
16440
16441         * All over : Pass in TypeContainer as argument to OverloadResolve.
16442
16443         * typemanager.cs (CSharpName): Update to check for the string type and return
16444         that too.
16445
16446         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16447         a given method.
16448
16449 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16450
16451         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16452         (Invocation::BetterFunction): Implement.
16453         (Invocation::BetterConversion): Implement.
16454         (Invocation::ConversionExists): Skeleton, no implementation yet.
16455
16456         Okay, things work fine !
16457
16458 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16459
16460         * typemanager.cs: declare and load enum_type, delegate_type and
16461         void_type. 
16462
16463         * expression.cs (Expression::Emit): Now emit returns a value that
16464         tells whether a value is left on the stack or not.  This strategy
16465         might be reveted tomorrow with a mechanism that would address
16466         multiple assignments.
16467         (Expression::report118): Utility routine to report mismatches on
16468         the ExprClass.
16469
16470         (Unary::Report23): Report impossible type/operator combination
16471         utility function.
16472
16473         (Unary::IsIncrementableNumber): Whether the type can be
16474         incremented or decremented with add.
16475         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16476         complemented. 
16477         (Unary::ResolveOperator): Implement ++, !, ~,
16478
16479         (Invocation::Emit): Deal with new Emit convetion.
16480
16481         * All Expression derivatives: Updated their Emit method to return
16482         whether they leave values on the stack or not.
16483
16484         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16485         stack for expressions that are statements. 
16486
16487 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16488
16489         * expression.cs (LValue): New interface.  Must be implemented by
16490         LValue objects.
16491         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16492         LValue interface.
16493
16494         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16495         interface for generating code, simplifies the code.
16496
16497 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16498
16499         * expression.cs (everywhere): Comment out return statements in ::Resolve
16500         methods to avoid the warnings.
16501
16502 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16503
16504         * driver.cs (parse): Report error 2001 if we can not open the
16505         source file.
16506
16507         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16508         not resolve it.
16509
16510         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16511         object. 
16512
16513         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16514         otherwise nested blocks end up with the same index.
16515
16516         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16517
16518         * expression.cs:  Instead of having FIXMEs in the Resolve
16519         functions, throw exceptions so it is obvious that we are facing a
16520         bug. 
16521
16522         * cs-parser.jay (invocation_expression): Pass Location information.
16523
16524         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16525         Use a basename for those routines because .NET does not like paths
16526         on them. 
16527
16528         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16529         already defined.
16530
16531 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16532
16533         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16534         are loading the correct data types (throws an exception if not).
16535         (TypeManager::InitCoreTypes): Use CoreLookupType
16536
16537         * expression.cs (Unary::ResolveOperator): return the child
16538         expression for expressions which are just +expr.
16539         (Unary::ResolveOperator): Return negative literals for -LITERAL
16540         expressions (otherwise they are Unary {Literal}).
16541         (Invocation::Badness): Take into account `Implicit constant
16542         expression conversions'.
16543
16544         * literal.cs (LongLiteral): Implement long literal class.
16545         (IntLiteral): export the `Value' of the intliteral. 
16546
16547 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16548
16549         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16550
16551         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16552         instead of 'Operator'
16553
16554         * expression.cs (Binary::ResolveOperator): Update accordingly.
16555         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16556         and 'Minus'
16557
16558         * cs-parser.jay (unary_expression): Update to use the new names.
16559
16560         * gen-treedump.cs (GetUnary): Same here.
16561
16562         * expression.cs (Unary::Resolve): Implement.
16563         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16564         operators are found instead of making noise ;-)
16565         (Unary::ResolveOperator): New method to do precisely the same thing which
16566         Binary::ResolveOperator does for Binary expressions.
16567         (Unary.method, .Arguments): Add.
16568         (Unary::OperName): Implement.   
16569         (Unary::ForceConversion): Copy and Paste !
16570
16571         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16572         a unary operator.
16573
16574         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16575         for the inbuilt operators. Only overloading works for now ;-)
16576
16577 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16578
16579         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16580         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16581
16582         * expression.cs (This::Emit): Implement. 
16583         (This::Resolve): Implement.
16584         (TypeOf:Resolve): Implement.
16585         (Expression::ResolveSimpleName): Add an implicit this to instance
16586         field references. 
16587         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16588         Bind instance variable to Field expressions.
16589         (FieldExpr::Instance): New field used to track the expression that
16590         represents the object instance.
16591         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16592         binding 
16593         (FieldExpr::Emit): Implement.
16594
16595         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16596         the last instruction contains a return opcode to avoid generating
16597         the last `ret' instruction (this generates correct code, and it is
16598         nice to pass the peverify output).
16599
16600         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16601         initializer for static and instance variables.
16602         (Constructor::Emit): Allow initializer to be null in the case of
16603         static constructors.  Only emit initializer for instance
16604         constructors. 
16605
16606         (TypeContainer::FindMembers): Return a null array if there are no
16607         matches.
16608
16609         Also fix the code for the MemberTypes.Method branch, as it was not
16610         scanning that for operators (or tried to access null variables before).
16611
16612         * assign.cs (Assign::Emit): Handle instance and static fields. 
16613
16614         * TODO: Updated.
16615
16616         * driver.cs: Stop compilation if there are parse errors.
16617
16618         * cs-parser.jay (constructor_declaration): Provide default base
16619         initializer for non-static constructors.
16620         (constructor_declarator): Do not provide a default base
16621         initializers if none was specified.
16622         Catch the fact that constructors should not have parameters.
16623
16624         * class.cs: Do not emit parent class initializers for static
16625         constructors, that should be flagged as an error.
16626
16627 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16628
16629         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16630         Move back code into TypeContainer::Populate.
16631
16632 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16633
16634         * class.cs (TypeContainer::AddConstructor): Fix the check to
16635         compare against Name, not Basename. 
16636         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16637
16638         * cs-parser.jay : Update accordingly.
16639
16640         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16641         for methods, don't forget to look into the operators too.
16642         (RegisterMethodBuilder): Helper method to take care of this for
16643         methods, constructors and operators.
16644         (Operator::Define): Completely revamp.
16645         (Operator.OperatorMethod, MethodName): New fields.
16646         (TypeContainer::Populate): Move the registering of builders into
16647         RegisterMethodBuilder.
16648         (Operator::Emit): Re-write.
16649
16650         * expression.cs (Binary::Emit): Comment out code path to emit method
16651         invocation stuff for the case when we have a user defined operator. I am
16652         just not able to get it right !
16653
16654 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16655
16656         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16657         argument. 
16658
16659         (Expression::MemberLookup): Provide a version that allows to
16660         specify the MemberTypes and BindingFlags. 
16661
16662         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16663         so it was not fetching variable information from outer blocks.
16664
16665         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16666         Beforefieldinit as it was buggy.
16667
16668         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16669         that Ravi put here.  
16670
16671         * class.cs (Constructor::Emit): Only emit if block is not null.
16672         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16673         deal with this by semantically definining it as if the user had
16674         done it.
16675
16676         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16677         constructors as we now "emit" them at a higher level.
16678
16679         (TypeContainer::DefineDefaultConstructor): Used to define the
16680         default constructors if none was provided.
16681
16682         (ConstructorInitializer): Add methods Resolve and Emit. 
16683
16684         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16685
16686 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16687
16688         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16689         the default constructor builder with our hashtable for methodbuilders
16690         to methodcores.
16691
16692         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16693         and argument_count is 0 in which case we have a match.
16694         (Binary::ResolveOperator): More null checking and miscellaneous coding
16695         style cleanup.
16696
16697 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16698
16699         * rootcontext.cs (IsNameSpace): Compare against null.
16700
16701         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16702
16703         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16704         and Unary::Operator.
16705
16706         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16707         accordingly.
16708
16709         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16710         we have overloaded operators.
16711         (Binary::ResolveOperator): Implement the part which does the operator overload
16712         resolution.
16713
16714         * class.cs (Operator::Emit): Implement.
16715         (TypeContainer::Emit): Emit the operators we have too.
16716
16717         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16718         the case when we have a user-defined operator.
16719
16720 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16721
16722         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16723
16724 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16725
16726         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16727         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16728         (Constructor::Emit): Implement.
16729         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16730         if we have no work to do. 
16731         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16732         Emit method.
16733
16734         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16735         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16736
16737         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16738         of parent.parent.
16739
16740 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16741
16742         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16743         in the source.
16744         (Tree::RecordNamespace): Method to do what the name says ;-)
16745         (Tree::Namespaces): Property to get at the namespaces hashtable.
16746
16747         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16748         keep track.
16749
16750         * rootcontext.cs (IsNamespace): Fixed it :-)
16751
16752 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16753
16754         * class.cs (TypeContainer::FindMembers): Add support for
16755         constructors. 
16756         (MethodCore): New class that encapsulates both the shared aspects
16757         of a Constructor and a Method.  
16758         (Method, Constructor): Factored pieces into MethodCore.
16759
16760         * driver.cs: Added --fatal which makes errors throw exceptions.
16761         Load System assembly as well as part of the standard library.
16762
16763         * report.cs: Allow throwing exceptions on errors for debugging.
16764
16765         * modifiers.cs: Do not use `parent', instead use the real type
16766         container to evaluate permission settings.
16767
16768         * class.cs: Put Ravi's patch back in.  He is right, and we will
16769         have to cope with the
16770
16771 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16772
16773         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16774         FamORAssem, not FamANDAssem.
16775
16776 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16777
16778         * driver.cs: Added --parse option that only parses its input files
16779         and terminates.
16780
16781         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16782         incorrect.  IsTopLevel is not used to tell whether an object is
16783         root_types or not (that can be achieved by testing this ==
16784         root_types).  But to see if this is a top-level *class* (not
16785         necessarly our "toplevel" container). 
16786
16787 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16788
16789         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16790         parent instead of a direct call to GetType.
16791
16792 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16793
16794         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16795         Modifiers.TypeAttr. This should just be a call to that method.
16796
16797         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16798         object so that we can determine if we are top-level or not.
16799
16800         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16801         TypeContainer too.
16802
16803         * enum.cs (Enum::Define): Ditto.
16804
16805         * modifiers.cs (FieldAttr): Re-write.
16806
16807         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16808         (TypeContainer::HaveStaticConstructor): New property to provide access
16809         to precisely that info.
16810
16811         * modifiers.cs (MethodAttr): Re-write.
16812         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16813
16814         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16815         of top-level types as claimed.
16816
16817 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16818
16819         * expression.cs (MemberLookup): Fruitless attempt to lookup
16820         constructors.  Maybe I need to emit default constructors?  That
16821         might be it (currently .NET emits this for me automatically).
16822         (Invocation::OverloadResolve): Cope with Arguments == null.
16823         (Invocation::EmitArguments): new function, shared by the new
16824         constructor and us.
16825         (Invocation::Emit): Handle static and instance methods.  Emit
16826         proper call instruction for virtual or non-virtual invocations.
16827         (New::Emit): Implement.
16828         (New::Resolve): Implement.
16829         (MemberAccess:Resolve): Implement.
16830         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16831         to track instances.
16832         (FieldExpr::Resolve): Set type.
16833
16834         * support.cs: Handle empty arguments.
16835                 
16836         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16837         SimpleLookup): Auxiliary routines to help parse a qualifier
16838         identifier.  
16839
16840         Update qualifier_identifier rule.
16841
16842         * codegen.cs: Removed debugging messages.
16843
16844         * class.cs: Make this a global thing, this acts just as a "key" to
16845         objects that we might have around.
16846
16847         (Populate): Only initialize method_builders_to_methods once.
16848
16849         * expression.cs (PropertyExpr): Initialize type from the
16850         PropertyType. 
16851
16852         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16853         Resolve pattern.  Attempt to implicitly convert value to boolean.
16854         Emit code.
16855
16856         * expression.cs: Set the type for the int32/int32 argument case.
16857         (Binary::ResolveOperator): Set the return type to boolean for
16858         comparission operators
16859
16860         * typemanager.cs: Remove debugging print code.
16861
16862         (Invocation::Resolve): resolve type.
16863
16864         * class.cs: Allocate a MemberInfo of the correct size, as the code
16865         elsewhere depends on the test to reflect the correct contents.
16866
16867         (Method::) Keep track of parameters, due to System.Reflection holes
16868
16869         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16870         mapping here.
16871
16872         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16873         of the exact size and return that.
16874
16875         (Class::LookupMethodByBuilder): New function that maps
16876         MethodBuilders to its methods.  Required to locate the information
16877         on methods because System.Reflection bit us again.
16878
16879         * support.cs: New file, contains an interface ParameterData and
16880         two implementations: ReflectionParameters and InternalParameters
16881         used to access Parameter information.  We will need to grow this
16882         as required.
16883
16884         * expression.cs (Invocation::GetParameterData): implement a cache
16885         and a wrapper around the ParameterData creation for methods. 
16886         (Invocation::OverloadResolve): Use new code.
16887
16888 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16889
16890         * class.cs (TypeContainer::EmitField): Remove and move into 
16891         (Field::Define): here and modify accordingly.
16892         (Field.FieldBuilder): New member.
16893         (TypeContainer::Populate): Update accordingly.
16894         (TypeContainer::FindMembers): Implement.
16895
16896 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16897
16898         * statement.cs: (VariableInfo::VariableType): New field to be
16899         initialized with the full type once it is resolved. 
16900
16901 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16902
16903         * parameter.cs (GetParameterInfo): Use a type cache to compute
16904         things only once, and to reuse this information
16905
16906         * expression.cs (LocalVariableReference::Emit): Implement.
16907         (OpcodeCast::Emit): fix.
16908
16909         (ParameterReference::Resolve): Implement.
16910         (ParameterReference::Emit): Implement.
16911
16912         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16913         that are expressions need to stay as Expressions.
16914
16915         * typemanager.cs (CSharpName): Returns the C# name of a type if
16916         possible. 
16917
16918         * expression.cs (Expression::ConvertImplicit): New function that
16919         implements implicit type conversions.
16920
16921         (Expression::ImplicitReferenceConversion): Implements implicit
16922         reference conversions.
16923
16924         (EmptyCast): New type for transparent casts.
16925
16926         (OpcodeCast): New type for casts of types that are performed with
16927         a sequence of bytecodes.
16928
16929         (BoxedCast): New type used for casting value types into reference
16930         types.  Emits a box opcode.
16931
16932         (Binary::DoNumericPromotions): Implements numeric promotions of
16933         and computation of the Binary::Type.
16934
16935         (Binary::EmitBranchable): Optimization.
16936
16937         (Binary::Emit): Implement code emission for expressions.
16938
16939         * typemanager.cs (TypeManager): Added two new core types: sbyte
16940         and byte.
16941
16942 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16943
16944         * class.cs (TypeContainer::FindMembers): Method which does exactly
16945         what Type.FindMembers does, only we don't have to use reflection. No
16946         implementation yet.
16947
16948         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16949         typecontainer objects as we need to get at them.
16950         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16951
16952         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16953         typecontainer object.
16954
16955         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16956         of just a Report object.
16957
16958 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16959
16960         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16961         "remove_"
16962         (TypeContainer::Populate): Now define the delegates of the type too.
16963         (TypeContainer.Delegates): Property to access the list of delegates defined
16964         in the type.
16965
16966         * delegates.cs (Delegate::Define): Implement partially.
16967
16968         * modifiers.cs (TypeAttr): Handle more flags.
16969
16970 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16971
16972         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16973         and not <=
16974         (Operator::Define): Re-write logic to get types by using the LookupType method
16975         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16976         (Indexer::Define): Ditto.
16977         (Event::Define): Ditto.
16978         (Property::Define): Ditto.
16979
16980 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16981
16982         * class.cs (TypeContainer::Populate): Now define operators too. 
16983         (TypeContainer.Operators): New property to access the list of operators
16984         in a type.
16985         (Operator.OperatorMethodBuilder): New member to hold the method builder
16986         for the operator we are defining.
16987         (Operator::Define): Implement.
16988
16989 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16990
16991         * class.cs (Event::Define): Make the prefixes of the accessor methods
16992         addOn_ and removeOn_ 
16993
16994         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16995         of the location being passed in too. Ideally, this should go later since all
16996         error reporting should be done through the Report object.
16997
16998         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16999         (Populate): Iterate thru the indexers we have and define them too.
17000         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17001         for the get and set accessors.
17002         (Indexer::Define): Implement.
17003
17004 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17005
17006         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17007         my previous implementation, did not work.
17008
17009         * typemanager.cs: Add a couple of missing types (the longs).
17010
17011         * literal.cs: Use TypeManager.bool_type instead of getting it.
17012
17013         * expression.cs (EventExpr): New kind of expressions.
17014         (Expressio::ExprClassFromMemberInfo): finish
17015
17016 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17017
17018         * assign.cs: Emit stores to static fields differently.
17019
17020 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17021
17022         * Merge in changes and adjust code to tackle conflicts. Backed out my
17023         code in Assign::Resolve ;-) 
17024
17025 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17026
17027         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17028         instead Report.Error and also pass in the location.
17029         (CSharpParser::Lexer): New readonly property to return the reference
17030         to the Tokenizer object.
17031         (declare_local_variables): Use Report.Error with location instead of plain 
17032         old error.
17033         (CheckDef): Ditto.
17034
17035         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17036         (Operator.CheckBinaryOperator): Ditto.
17037
17038         * cs-parser.jay (operator_declarator): Update accordingly.
17039
17040         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17041         (CheckBinaryOperator): Same here.
17042
17043         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17044         on the name without any prefixes of namespace names etc. This is because we
17045         already might have something already fully qualified like 
17046         'System.Console.WriteLine'
17047
17048         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17049
17050 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17051
17052         * cs-tokenizer.cs (location): Return a string which also contains
17053         the file name.
17054
17055         * expression.cs (ElementAccess): New class for expressions of the
17056         type 'element access.'
17057         (BaseAccess): New class for expressions of the type 'base access.'
17058         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17059         respectively.
17060
17061         * cs-parser.jay (element_access): Implement action.
17062         (base_access): Implement actions.
17063         (checked_expression, unchecked_expression): Implement.
17064
17065         * cs-parser.jay (local_variable_type): Correct and implement.
17066         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17067
17068         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17069
17070         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17071         name and the specifiers.
17072
17073         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17074
17075         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17076         making them all public ;-)
17077
17078         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17079         class anyways.
17080
17081 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17082
17083         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17084         PropertyExprs.
17085         (FieldExpr, PropertyExprs): New resolved expressions.
17086         (SimpleName::MemberStaticCheck): Perform static checks for access
17087         to non-static fields on static methods. Maybe this should be
17088         generalized for MemberAccesses. 
17089         (SimpleName::ResolveSimpleName): More work on simple name
17090         resolution. 
17091
17092         * cs-parser.jay (primary_expression/qualified_identifier): track
17093         the parameter index.
17094
17095         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17096         (EmitContext::EmitBoolExpression): Chain to expression generation
17097         instead of temporary hack.
17098         (::EmitStatementExpression): Put generic expression code generation.
17099
17100         * assign.cs (Assign::Emit): Implement variable assignments to
17101         local variables, parameters and fields.
17102
17103 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17104
17105         * statement.cs (Block::GetVariableInfo): New method, returns the
17106         VariableInfo for a variable name in a block.
17107         (Block::GetVariableType): Implement in terms of GetVariableInfo
17108
17109         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17110         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17111
17112 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17113
17114         * cs-parser.jay (operator_declaration): Continue on my quest : update
17115         to take attributes argument.
17116         (event_declaration): Ditto.
17117         (enum_declaration): Ditto.
17118         (indexer_declaration): Ditto.
17119
17120         * class.cs (Operator::Operator): Update constructor accordingly.
17121         (Event::Event): Ditto.
17122
17123         * delegate.cs (Delegate::Delegate): Same here.
17124
17125         * enum.cs (Enum::Enum): Same here.
17126
17127 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17128
17129         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17130
17131         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17132
17133         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17134         being passed around as an arraylist.
17135         (Attributes::AddAttribute): Method to add attribute sections.
17136
17137         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17138         (struct_declaration): Update accordingly.
17139         (constant_declaration): Update.
17140         (field_declaration): Update.
17141         (method_header): Update.
17142         (fixed_parameter): Update.
17143         (parameter_array): Ditto.
17144         (property_declaration): Ditto.
17145         (destructor_declaration): Ditto.
17146
17147         * class.cs (Struct::Struct): Update constructors accordingly.
17148         (Class::Class): Ditto.
17149         (Field::Field): Ditto.
17150         (Method::Method): Ditto.
17151         (Property::Property): Ditto.
17152         (TypeContainer::OptAttribute): update property's return type.
17153
17154         * interface.cs (Interface.opt_attributes): New member.
17155         (Interface::Interface): Update to take the extra Attributes argument.
17156
17157         * parameter.cs (Parameter::Parameter): Ditto.
17158
17159         * constant.cs (Constant::Constant): Ditto.
17160
17161         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17162         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17163         the attributes as a parameter.
17164         (InterfaceProperty): Update constructor call.
17165         (InterfaceEvent): Ditto.
17166         (InterfaceMethod): Ditto.
17167         (InterfaceIndexer): Ditto.
17168
17169         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17170         pass the attributes too.
17171         (interface_event_declaration): Ditto.
17172         (interface_property_declaration): Ditto.
17173         (interface_method_declaration): Ditto.
17174         (interface_declaration): Ditto.
17175
17176 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17177
17178         * class.cs (Method::Define): Track the "static Main" definition to
17179         create an entry point. 
17180
17181         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17182         EntryPoint if we find it. 
17183
17184         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17185         (EmitContext::ig): Make this variable public.
17186
17187         * driver.cs: Make the default output file be the first file name
17188         with the .exe extension.  
17189
17190         Detect empty compilations
17191
17192         Handle various kinds of output targets.  Handle --target and
17193         rename -t to --dumper.
17194
17195         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17196         methods inherited from Expression return now an Expression.  This
17197         will is used during the tree rewriting as we resolve them during
17198         semantic analysis.
17199
17200         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17201         the spec.  Missing entirely is the information about
17202         accessability of elements of it.
17203
17204         (Expression::ExprClassFromMemberInfo): New constructor for
17205         Expressions that creates a fully initialized Expression based on
17206         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17207         a Type.
17208
17209         (Invocation::Resolve): Begin implementing resolution of invocations.
17210
17211         * literal.cs (StringLiteral):  Implement Emit.
17212
17213 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17214
17215         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17216         member.
17217
17218 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17219
17220         * cs-parser.jay (attribute_arguments): Implement actions.
17221         (attribute): Fix bug in production. Implement action.
17222         (attribute_list): Implement.
17223         (attribute_target): Implement.
17224         (attribute_target_specifier, opt_target_specifier): Implement
17225         (CheckAttributeTarget): New method to check if the attribute target
17226         is valid.
17227         (attribute_section): Implement.
17228         (opt_attributes): Implement.
17229
17230         * attribute.cs : New file to handle attributes.
17231         (Attribute): Class to hold attribute info.
17232
17233         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17234         (attribute_section): Modify production to use 2 different rules to 
17235         achieve the same thing. 1 s/r conflict down !
17236         Clean out commented, useless, non-reducing dimension_separator rules.
17237
17238         * class.cs (TypeContainer.attributes): New member to hold list
17239         of attributes for a type.
17240         (Struct::Struct): Modify to take one more argument, the attribute list.
17241         (Class::Class): Ditto.
17242         (Field::Field): Ditto.
17243         (Method::Method): Ditto.
17244         (Property::Property): Ditto.
17245
17246         * cs-parser.jay (struct_declaration): Update constructor call to
17247         pass in the attributes too.
17248         (class_declaration): Ditto.
17249         (constant_declaration): Ditto.
17250         (field_declaration): Ditto.
17251         (method_header): Ditto.
17252         (fixed_parameter): Ditto.
17253         (parameter_array): Ditto.
17254         (property_declaration): Ditto.
17255
17256         * constant.cs (Constant::Constant): Update constructor similarly.
17257         Use System.Collections.
17258
17259         * parameter.cs (Parameter::Parameter): Update as above.
17260
17261 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17262
17263         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17264         (TypeContainer.delegates): New member to hold list of delegates.
17265
17266         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17267         this time as I seem to be on crack ;-)
17268
17269 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17270
17271         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17272         tell whether an identifier represents a namespace.
17273
17274         * expression.cs (NamespaceExpr): A namespace expression, used only
17275         temporarly during expression resolution.
17276         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17277         utility functions to resolve names on expressions.
17278
17279 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17280
17281         * codegen.cs: Add hook for StatementExpressions. 
17282
17283         * class.cs: Fix inverted test for static flag in methods.
17284
17285 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17286
17287         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17288         to make it coincide with MS' number.
17289         (Operator::CheckBinaryOperator): Ditto.
17290
17291         * ../errors/errors.txt : Remove error numbers added earlier.
17292
17293         * ../errors/cs1019.cs : Test case for error # 1019
17294
17295         * ../errros/cs1020.cs : Test case for error # 1020
17296
17297         * cs-parser.jay : Clean out commented cruft.
17298         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17299         used anywhere - non-reducing rule.
17300         (namespace_declarations): Non-reducing rule - comment out.
17301
17302         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17303         with TypeContainer::AddEnum.
17304
17305         * delegate.cs : New file for delegate handling classes.
17306         (Delegate): Class for declaring delegates.
17307
17308         * makefile : Update.
17309
17310         * cs-parser.jay (delegate_declaration): Implement.
17311
17312 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17313
17314         * class.cs (Event::Define): Implement.
17315         (Event.EventBuilder): New member.
17316
17317         * class.cs (TypeContainer::Populate): Update to define all enums and events
17318         we have.
17319         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17320         readonly fields for all these cases ?
17321
17322 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17323
17324         * class.cs (Property): Revamp to use the convention of making fields readonly.
17325         Accordingly modify code elsewhere.
17326
17327         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17328         the Define method of the Property class.
17329
17330         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17331         trivial bug.
17332         (TypeContainer::Populate): Update to define all the properties we have. Also
17333         define all enumerations.
17334
17335         * enum.cs (Define): Implement.
17336
17337 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17338
17339         * cs-parser.jay (overloadable_operator): The semantic value is an
17340         enum of the Operator class.
17341         (operator_declarator): Implement actions.
17342         (operator_declaration): Implement.
17343
17344         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17345         validity of definitions.
17346         (Operator::CheckBinaryOperator): Static method to check for binary operators
17347         (TypeContainer::AddOperator): New method to add an operator to a type.
17348
17349         * cs-parser.jay (indexer_declaration): Added line to actually call the
17350         AddIndexer method so it gets added ;-)
17351
17352         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17353         already taken care of by the MS compiler ?  
17354
17355 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17356
17357         * class.cs (Operator): New class for operator declarations.
17358         (Operator::OpType): Enum for the various operators.
17359
17360 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17361
17362         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17363         ostensibly handle this in semantic analysis.
17364
17365         * cs-parser.jay (general_catch_clause): Comment out
17366         (specific_catch_clauses, specific_catch_clause): Ditto.
17367         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17368         (catch_args, opt_catch_args): New productions.
17369         (catch_clause): Rewrite to use the new productions above
17370         (catch_clauses): Modify accordingly.
17371         (opt_catch_clauses): New production to use in try_statement
17372         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17373         and re-write the code in the actions to extract the specific and
17374         general catch clauses by being a little smart ;-)
17375
17376         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17377         Hooray, try and catch statements parse fine !
17378
17379 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17380
17381         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17382         string from the hashtable of variables.
17383
17384         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17385         I end up making that mistake ;-)
17386         (catch_clauses): Fixed gross error which made Key and Value of the 
17387         DictionaryEntry the same : $1 !!
17388
17389 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17390
17391         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17392
17393         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17394         when the add and remove accessors are specified. 
17395
17396 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17397
17398         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17399         information about indexer_declarator.
17400         (indexer_declarator): Implement actions.
17401         (parsing_indexer): New local boolean used to keep track of whether
17402         we are parsing indexers or properties. This is necessary because 
17403         implicit_parameters come into picture even for the get accessor in the 
17404         case of an indexer.
17405         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17406
17407         * class.cs (Indexer): New class for indexer declarations.
17408         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17409         (TypeContainer::indexers): New member to hold list of indexers for the
17410         type.
17411
17412 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17413
17414         * cs-parser.jay (add_accessor_declaration): Implement action.
17415         (remove_accessor_declaration): Implement action.
17416         (event_accessors_declaration): Implement
17417         (variable_declarators): swap statements for first rule - trivial.
17418
17419         * class.cs (Event): New class to hold information about event
17420         declarations.
17421         (TypeContainer::AddEvent): New method to add an event to a type
17422         (TypeContainer::events): New member to hold list of events.
17423
17424         * cs-parser.jay (event_declaration): Implement actions.
17425
17426 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17427
17428         * cs-parser.jay (dim_separators): Implement. Make it a string
17429         concatenating all the commas together, just as they appear.
17430         (opt_dim_separators): Modify accordingly
17431         (rank_specifiers): Update accordingly. Basically do the same
17432         thing - instead, collect the brackets here.
17433         (opt_rank_sepcifiers): Modify accordingly.
17434         (array_type): Modify to actually return the complete type string
17435         instead of ignoring the rank_specifiers.
17436         (expression_list): Implement to collect the expressions
17437         (variable_initializer): Implement. We make it a list of expressions
17438         essentially so that we can handle the array_initializer case neatly too.
17439         (variable_initializer_list): Implement.
17440         (array_initializer): Make it a list of variable_initializers
17441         (opt_array_initializer): Modify accordingly.
17442
17443         * expression.cs (New::NType): Add enumeration to help us
17444         keep track of whether we have an object/delegate creation
17445         or an array creation.
17446         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17447         members to hold data about array creation.
17448         (New:New): Modify to update NewType
17449         (New:New): New Overloaded contructor for the array creation
17450         case.
17451
17452         * cs-parser.jay (array_creation_expression): Implement to call
17453         the overloaded New constructor.
17454
17455 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17456
17457         * class.cs (TypeContainer::Constructors): Return member
17458         constructors instead of returning null.
17459
17460 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17461
17462         * typemanager.cs (InitCoreTypes): Initialize the various core
17463         types after we have populated the type manager with the user
17464         defined types (this distinction will be important later while
17465         compiling corlib.dll)
17466
17467         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17468         on Expression Classification.  Now all expressions have a method
17469         `Resolve' and a method `Emit'.
17470
17471         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17472         generation from working.     Also add some temporary debugging
17473         code. 
17474
17475 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17476
17477         * codegen.cs: Lots of code generation pieces.  This is only the
17478         beginning, will continue tomorrow with more touches of polish.  We
17479         handle the fundamentals of if, while, do, for, return.  Others are
17480         trickier and I need to start working on invocations soon.
17481
17482         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17483         s.InitStatement. 
17484
17485         * codegen.cs (EmitContext): New struct, used during code
17486         emission to keep a context.   Most of the code generation will be
17487         here. 
17488
17489         * cs-parser.jay: Add embedded blocks to the list of statements of
17490         this block.  So code generation proceeds in a top down fashion.
17491
17492 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17493
17494         * statement.cs: Add support for multiple child blocks.
17495
17496 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17497
17498         * codegen.cs (EmitCode): New function, will emit the code for a
17499         Block of code given a TypeContainer and its ILGenerator. 
17500
17501         * statement.cs (Block): Standard public readonly optimization.
17502         (Block::Block constructors): Link children. 
17503         (Block::Child): Child Linker.
17504         (Block::EmitVariables): Emits IL variable declarations.
17505
17506         * class.cs: Drop support for MethodGroups here, delay until
17507         Semantic Analysis.
17508         (Method::): Applied the same simplification that I did before, and
17509         move from Properties to public readonly fields.
17510         (Method::ParameterTypes): Returns the parameter types for the
17511         function, and implements a cache that will be useful later when I
17512         do error checking and the semantic analysis on the methods is
17513         performed.
17514         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17515         and made a method, optional argument tells whether this is a class
17516         or a structure to apply the `has-this' bit.
17517         (Method::GetCallingConvention): Implement, returns the calling
17518         convention. 
17519         (Method::Define): Defines the type, a second pass is performed
17520         later to populate the methods.
17521
17522         (Constructor::ParameterTypes): implement a cache similar to the
17523         one on Method::ParameterTypes, useful later when we do semantic
17524         analysis. 
17525
17526         (TypeContainer::EmitMethod):  New method.  Emits methods.
17527
17528         * expression.cs: Removed MethodGroup class from here.
17529
17530         * parameter.cs (Parameters::GetCallingConvention): new method.
17531
17532 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17533
17534         * class.cs (TypeContainer::Populate): Drop RootContext from the
17535         argument. 
17536
17537         (Constructor::CallingConvention): Returns the calling convention.
17538         (Constructor::ParameterTypes): Returns the constructor parameter
17539         types. 
17540
17541         (TypeContainer::AddConstructor): Keep track of default constructor
17542         and the default static constructor.
17543
17544         (Constructor::) Another class that starts using `public readonly'
17545         instead of properties. 
17546
17547         (Constructor::IsDefault): Whether this is a default constructor. 
17548
17549         (Field::) use readonly public fields instead of properties also.
17550
17551         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17552         track of static constructors;  If none is used, turn on
17553         BeforeFieldInit in the TypeAttributes. 
17554
17555         * cs-parser.jay (opt_argument_list): now the return can be null
17556         for the cases where there are no arguments. 
17557
17558         (constructor_declarator): If there is no implicit `base' or
17559         `this', then invoke the default parent constructor. 
17560
17561         * modifiers.cs (MethodAttr): New static function maps a set of
17562         modifiers flags into a MethodAttributes enum
17563         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17564         MethodAttr, TypeAttr to represent the various mappings where the
17565         modifiers are used.
17566         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17567
17568 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17569
17570         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17571         method arguments.
17572
17573         * interface.cs (PopulateIndexer): Implemented the code generator
17574         for interface indexers.
17575
17576 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17577
17578         * interface.cs (InterfaceMemberBase): Now we track the new status
17579         here.  
17580
17581         (PopulateProperty): Implement property population.  Woohoo!  Got
17582         Methods and Properties going today. 
17583
17584         Removed all the properties for interfaces, and replaced them with
17585         `public readonly' fields. 
17586
17587 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17588
17589         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17590         initialize their hashtables/arraylists only when they are needed
17591         instead of doing this always.
17592
17593         * parameter.cs: Handle refs and out parameters.
17594
17595         * cs-parser.jay: Use an ArrayList to construct the arguments
17596         instead of the ParameterCollection, and then cast that to a
17597         Parameter[] array.
17598
17599         * parameter.cs: Drop the use of ParameterCollection and use
17600         instead arrays of Parameters.
17601
17602         (GetParameterInfo): Use the Type, not the Name when resolving
17603         types. 
17604
17605 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17606
17607         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17608         and instead use public readonly fields.
17609
17610         * class.cs: Put back walking code for type containers.
17611
17612 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17613
17614         * class.cs (MakeConstant): Code to define constants.
17615
17616         * rootcontext.cs (LookupType): New function.  Used to locate types 
17617
17618
17619 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17620
17621         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17622         this System.Reflection code is.  Kudos to Microsoft
17623
17624         * typemanager.cs: Implement a type cache and avoid loading all
17625         types at boot time.  Wrap in LookupType the internals.  This made
17626         the compiler so much faster.  Wow.  I rule!
17627
17628         * driver.cs: Make sure we always load mscorlib first (for
17629         debugging purposes, nothing really important).
17630
17631         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17632         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17633
17634         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17635         on namespaces that have been imported using the `using' keyword.
17636
17637         * class.cs (TypeContainer::TypeAttr): Virtualize.
17638         (Class::TypeAttr): Return attributes suitable for this bad boy.
17639         (Struct::TypeAttr): ditto.
17640         Handle nested classes.
17641         (TypeContainer::) Remove all the type visiting code, it is now
17642         replaced with the rootcontext.cs code
17643
17644         * rootcontext.cs (GetClassBases): Added support for structs. 
17645
17646 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17647
17648         * interface.cs, statement.cs, class.cs, parameter.cs,
17649         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17650         Drop use of TypeRefs, and use strings instead.
17651
17652 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17653
17654         * rootcontext.cs: 
17655
17656         * class.cs (Struct::Struct): set the SEALED flags after
17657         checking the modifiers.
17658         (TypeContainer::TypeAttr): new property, returns the
17659         TypeAttributes for a class.  
17660
17661         * cs-parser.jay (type_list): Oops, list production was creating a
17662         new list of base types.
17663
17664         * rootcontext.cs (StdLib): New property.
17665         (GetInterfaceTypeByName): returns an interface by type name, and
17666         encapsulates error handling here.
17667         (GetInterfaces): simplified.
17668         (ResolveTree): Encapsulated all the tree resolution here.
17669         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17670         types. 
17671
17672         * driver.cs: Add support for --nostdlib, to avoid loading the
17673         default assemblies.
17674         (Main): Do not put tree resolution here. 
17675
17676         * rootcontext.cs: Beginning of the class resolution.
17677
17678 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17679
17680         * rootcontext.cs: Provide better error reporting. 
17681
17682         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17683
17684         * rootcontext.cs (CreateInterface): Handle the case where there
17685         are no parent interfaces.
17686
17687         (CloseTypes): Routine to flush types at the end.
17688         (CreateInterface): Track types.
17689         (GetInterfaces): Returns an array of Types from the list of
17690         defined interfaces.
17691
17692         * typemanager.c (AddUserType): Mechanism to track user types (puts
17693         the type on the global type hash, and allows us to close it at the
17694         end). 
17695
17696 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17697
17698         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17699         RecordInterface instead.
17700
17701         * cs-parser.jay: Updated to reflect changes above.
17702
17703         * decl.cs (Definition): Keep track of the TypeBuilder type that
17704         represents this type here.  Not sure we will use it in the long
17705         run, but wont hurt for now.
17706
17707         * driver.cs: Smaller changes to accomodate the new code.
17708
17709         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17710         when done. 
17711
17712         * rootcontext.cs (CreateInterface):  New method, used to create
17713         the System.TypeBuilder type for interfaces.
17714         (ResolveInterfaces): new entry point to resolve the interface
17715         hierarchy. 
17716         (CodeGen): Property, used to keep track of the code generator.
17717
17718 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17719
17720         * cs-parser.jay: Add a second production for delegate_declaration
17721         with `VOID'.
17722
17723         (enum_body): Put an opt_comma here instead of putting it on
17724         enum_body or enum_member_declarations so we can handle trailing
17725         commas on enumeration members.  Gets rid of a shift/reduce.
17726
17727         (type_list): Need a COMMA in the middle.
17728
17729         (indexer_declaration): Tell tokenizer to recognize get/set
17730
17731         * Remove old targets.
17732
17733         * Re-add the parser target.
17734
17735 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17736
17737         * cs-parser.jay: Add precendence rules for a number of operators
17738         ot reduce the number of shift/reduce conflicts in the grammar.
17739
17740 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17741
17742         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17743         and put it here.
17744
17745         Get rid of old crufty code.
17746
17747         * rootcontext.cs: Use this to keep track of the parsed
17748         representation and the defined types available to the program. 
17749
17750         * gen-treedump.cs: adjust for new convention.
17751
17752         * type.cs: Split out the type manager, and the assembly builder
17753         from here. 
17754
17755         * typemanager.cs: the type manager will live here now.
17756
17757         * cil-codegen.cs: And the code generator here. 
17758
17759 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17760
17761         * makefile: Fixed up for easy making.
17762
17763 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17764
17765         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17766         the 
17767
17768         (unary_expression): Expand pre_increment_expression and
17769         post_decrement_expression to reduce a shift/reduce.
17770
17771 2001-07-11  Simon Cozens
17772
17773         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17774
17775         Improve allow_keyword_as_indent name.
17776
17777 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17778
17779         * Adjustments for Beta2. 
17780
17781 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17782
17783         * decl.cs: Added `Define' abstract method.
17784         (InTransit): new property, used to catch recursive definitions. 
17785
17786         * interface.cs: Implement `Define'. 
17787
17788         * modifiers.cs: Map Modifiers.constants to
17789         System.Reflection.TypeAttribute flags.
17790
17791         * class.cs: Keep track of types and user-defined types.
17792         (BuilderInit): New method for creating an assembly
17793         (ResolveType): New function to launch the resolution process, only
17794         used by interfaces for now.
17795
17796         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17797         that are inserted into the name space. 
17798
17799 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17800
17801         * ARGH.  I have screwed up my tree so many times due to the use of
17802         rsync rather than using CVS.  Going to fix this at once. 
17803
17804         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17805         load types.
17806
17807 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17808
17809         * Experiment successful: Use System.Type rather that our own
17810         version of Type.  
17811
17812 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17813
17814         * cs-parser.jay: Removed nsAliases from here.
17815
17816         Use new namespaces, handle `using XXX;' 
17817
17818         * namespace.cs: Reimplemented namespace handling, use a recursive
17819         definition of the class.  Now we can keep track of using clauses
17820         and catch invalid using clauses.
17821
17822 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17823
17824         * gen-treedump.cs: Adapted for all the renaming.
17825
17826         * expression.cs (Expression): this class now has a Type property
17827         which returns an expression Type.
17828
17829         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17830         `Type', as this has a different meaning now in the base
17831
17832 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17833
17834         * interface.cs, class.cs: Removed from all the sources the
17835         references to signature computation, as we can not do method
17836         signature computation during the parsing time, as we are not
17837         trying to solve at that point distinguishing:
17838
17839         class X {
17840                 void a (Blah x) {}
17841                 void a (NS.Blah x) {}
17842         }
17843
17844         Which depending on the context might be valid or not, as we do not
17845         know if Blah is the same thing as NS.Blah at that point.
17846
17847         * Redid everything so the code uses TypeRefs now instead of
17848         Types.  TypeRefs are just temporary type placeholders, that need
17849         to be resolved.  They initially have a pointer to a string and the
17850         current scope in which they are used.  This is used later by the
17851         compiler to resolve the reference to an actual Type. 
17852
17853         * DeclSpace is no longer a CIR.Type, and neither are
17854         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17855         are all DeclSpaces, but no Types. 
17856
17857         * type.cs (TypeRefManager): This implements the TypeRef manager,
17858         which keeps track of all the types that need to be resolved after
17859         the parsing has finished. 
17860
17861 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17862
17863         * ARGH.  We are going to have to store `foreach' as a class rather
17864         than resolving it, as we need to verify error 1579 after name
17865         resolution.   *OR* we could keep a flag that says `This request to
17866         IEnumerator comes from a foreach statement' which we can then use
17867         to generate the error.
17868
17869 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17870
17871         * class.cs (TypeContainer.AddMethod): we now add methods to the
17872         MethodGroup instead of the method hashtable.  
17873
17874         * expression.cs: Add MethodGroup abstraction, which gets us one
17875         step closer to the specification in the way we handle method
17876         declarations.  
17877
17878         * cs-parser.jay (primary_expression): qualified_identifier now
17879         tried to match up an identifier to a local variable reference or
17880         to a parameter reference.
17881
17882         current_local_parameters is now a parser global variable that
17883         points to the current parameters for the block, used during name
17884         lookup.
17885
17886         (property_declaration): Now creates an implicit `value' argument to
17887         the set accessor.
17888
17889 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17890
17891         * parameter.cs: Do not use `param' arguments as part of the
17892         signature, per the spec.
17893
17894 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17895
17896         * decl.cs: Base class for classes, structs and interfaces.  This
17897         is the "Declaration Space" 
17898
17899         * cs-parser.jay: Use CheckDef for checking declaration errors
17900         instead of having one on each function.
17901
17902         * class.cs: Factor out some code for handling error handling in
17903         accordance to the "Declarations" section in the "Basic Concepts"
17904         chapter in the ECMA C# spec.
17905
17906         * interface.cs: Make all interface member classes derive from
17907         InterfaceMemberBase.
17908
17909 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17910
17911         * Many things: all interfaces are parsed and generated in
17912         gen-treedump.  Support for member variables, constructors,
17913         destructors, properties, constants is there.
17914
17915         Beginning of the IL backend, but very little done, just there for
17916         testing purposes. 
17917
17918 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17919
17920         * cs-parser.jay: Fix labeled statement.
17921
17922         * cs-tokenizer.cs (escape): Escape " and ' always.
17923         ref_line, ref_name: keep track of the line/filename as instructed
17924         by #line by the compiler.
17925         Parse #line.
17926
17927 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17928
17929         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17930         to match the values in System.CodeDOM.
17931
17932         Divid renamed to Divide.
17933
17934         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17935         statements. 
17936         (Statements.set): remove.
17937
17938         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17939         statements. 
17940
17941         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17942         falseStatements always have valid values. 
17943
17944         * cs-parser.jay: Use System.CodeDOM now.
17945