* codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
[mono.git] / mcs / mcs / ChangeLog
1 2004-12-17  Raja R Harinath  <rharinath@novell.com>
2
3         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
4         Ensure that we only have GlobalAttributes.
5         * attribute.cs (Attribute.Emit): Make non-virtual.
6         (GlobalAttribute.Emit): Remove.
7         (Attribute.Resolve): Make virtual.
8         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
9         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
10         the argument. Don't create one.
11         (Attribute.GetObsoleteAttribute): Likewise.
12         (Attribute.GetClsCompliantAttributeValue): Likewise.
13         * class.cs, decl.cs: Update to changes.
14
15 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
16
17         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
18         
19         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
20         
21         * statement.cs (Foreach.Resolve): Add error 186 report.
22
23 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
24
25         * expression.cs (Conditional.DoResolve): Add warning 429.
26         
27         * statement.cs (If.Resolve): Add warning 665.
28
29 2004-12-16  Raja R Harinath  <rharinath@novell.com>
30
31         New invariant: RootContext.Tree.Types.NamespaceEntry == null
32         except when in the parser, and in GlobalAttribute.
33         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
34         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
35         RootContext.Tree.Types.NamespaceEntry once work is done.
36         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
37         and resets RootContext.Tree.Types.NamespaceEntry.
38
39 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
40
41         * cs-parser.jay: Don't create a block for every variable.
42
43 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
44
45         * location.cs: Provide extra information.
46
47         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
48         variables from the captured environment, it is the ldarg_0.
49
50 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
51
52         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
53         find a conclusion.
54         
55         * class.cs: Changed warning level for 169 to avoid developer
56         displeasure from warning flooding. It will be changed back when they
57         fix most of current BCL warnings.
58         
59         * RootContext.cs: Pushed default WarningLevel to 3.
60         
61         * statement.cs: Removed unused variable.
62
63 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
64
65         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
66         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
67         Add error 502 report.
68         (StaticClass.DefineType): Add error 441 report.
69         (Class.AllowedModifiersProp): New virtual property as temporary
70         extension to AllowedModifiers.
71         (Class.DefineType): Add error 418 report. Moved ModFlags check here
72         to share implementation with StaticClass and don't call virtual
73         methods from ctor.
74         
75         * driver.cs (MainDriver): Add error 1558 test.
76
77         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
78         report. Moved error 36 test here.
79
80         * statement.cs (Throw.Resolve): Add error 724 report.
81
82         * typemanager.cs: Add out_attribute_type core type.
83         
84 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
85
86         * class.cs (TypeContainer.VerifyClsCompliance): Add error
87         3018 report.
88         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
89
90         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
91         3017 report.
92         
93         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
94
95         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
96         Add error 3023 report.
97         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
98
99         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
100         implementation.
101
102 2004-12-12  John Luke  <john.luke@gmail.com>
103
104         * driver.cs (AddArgs): take -- into account when
105         adding arguments, fixes bug 65710 
106
107 2004-12-12  Martin Baulig  <martin@ximian.com>
108
109         * expression.cs (Unary.TryReduceNegative): Added support for
110         SByteConstant and ByteConstant.
111         (Unary.Reduce): Check error values from TryReduceNegative().
112
113 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
114
115         * attributes.cs (Attribute.Resolve): Avoid multiple error report
116         and report exception as error 182.
117
118 2004-12-10  Raja R Harinath  <rharinath@novell.com>
119
120         * driver.cs (Main): Fix message when there are warnings.
121
122 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
123
124         * delegate.cs: Fixed my fix from yesterday, sorry about that.
125
126 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
127
128         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
129         Reduced number of warnings.
130         
131         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
132
133 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
134
135         * driver.cs: Removed message.
136
137         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
138
139 2004-12-08    <vargaz@freemail.hu>
140
141         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
142
143 2004-12-08  Martin Baulig  <martin@ximian.com>
144
145         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
146         instead of a CS3002 for properties and indexer.
147
148 2004-12-08  Martin Baulig  <martin@ximian.com>
149
150         * decl.cs (MemberName.ToString): Make this work again.
151
152 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
153
154         * attribute.cs (Resolve): Add error 591 detection.
155
156         * class.cs (FieldMember.Define): Add error 1547 detection.
157         (Indexer.Define): Add error 620 detection.
158         (Operator.Define): Add error 590 detection.
159
160         * ecore.cs: Missing argument for error 79.
161
162         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
163         detection.
164
165 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
166
167         Fix #70106
168         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
169         only.
170
171 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
172
173         * cs-parser.jay : handle doc comments on implicit/explicit operators.
174           Some operator comments were suppressed.
175         * doc.cs : Implicit/explicit operator name in doc comments are like
176           "op_Explicit(type)~returnType", so added suffix handling.
177
178 2004-12-07  Martin Baulig  <martin@ximian.com>
179
180         * decl.cs
181         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
182         (MemberCore.GetClsCompliantAttributeValue): Likewise.
183         (DeclSpace.ec): New protected field; store the EmitContext here.
184         (DeclSpace.EmitContext): New public property; moved here from
185         `TypeContainer'.
186         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
187         EmitContext.
188
189         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
190         (Enum.Emit): Don't create a new EmitContext.
191
192         * delegate.cs (Delegate.DefineType): Always create the
193         EmitContext.
194
195         * iterators.cs (Iterators.DefineIterator): Create a new
196         EmitContext and store it in `ec'.
197
198 2004-08-24  Martin Baulig  <martin@ximian.com>
199
200         * typemanager.cs
201         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
202         this for accessibility checks.
203         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
204         IsNestedFamilyAccessible.
205         (TypeManager.IsSubclassOf): New method, do what the name actually
206         says.   
207
208 2004-12-06  Raja R Harinath  <rharinath@novell.com>
209
210         Fix crash on cs0657-17.cs.
211         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
212         Use RootContext.Tree.Types, not 'new RootTypes ()'.
213         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
214         the case where the NamespaceEntry gets overwritten.
215
216 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
217
218         Fixed #69195, #56821
219         * ecore.cs (ResolveBoolean): Tiny refactoring.
220
221         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
222         of right expression resolving when left is false constant and
223         operator is LogicalAnd OR true constant and operator is LogicalOr.
224
225         * statement.cs (ResolveUnreachable): Always reports warning.
226
227 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
228
229         * class.cs: Distinguish between 1721 and 1722 (just a little help
230         for the programmer).
231
232 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
233
234         * delegate.cs: Only allow this on new versions of the language. 
235
236 2004-12-02  Duncan Mak  <duncan@ximian.com>
237
238         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
239         Expression class.
240         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
241         here as a static method. Take an additional bool out parameter
242         `must_do_cs1540_check' for signaling to InstanceResolve.
243         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
244         member field from PropertyExpr class and made it an argument of
245         the method instead.
246         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
247         check for MarshalByRefObject, and report CS0122 instead of CS1540.
248         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
249         and `remove_accessor' as well as InstanceResolve: report CS0122
250         where applicable.
251
252         Fixes #70129.
253
254 2004-12-03  Raja R Harinath  <rharinath@novell.com>
255
256         Fix test-327.cs, test-328.cs, and put in early infrastructure
257         for eventually fixing #52697.
258         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
259         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
260         from other methods.
261         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
262         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
263         (VerifyUsing, error246): Update.
264         * rootcontext.cs (RootContext.NamespaceLookup): Just use
265         'NamespaceEntry.LookupNamespaceOrType'.
266
267 2004-12-03  Martin Baulig  <martin@ximian.com>
268
269         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
270         method as our child, call AnonymousMethod.Compatible() on it.
271
272 2004-12-03  Raja R Harinath  <rharinath@novell.com>
273
274         Disable XML documentation support in 'basic' profile.
275         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
276         Redirect XmlElement to System.Object.
277         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
278         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
279         * mcs.exe.sources: Add doc-bootstrap.cs.
280         * doc-bootstrap.cs: New file.  Contains empty stub implementation
281         of doc.cs.
282
283 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
284
285         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
286           comments are allowed.
287
288 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
289
290         * delegate.cs: Add checks for subtypes in paramaters and return values
291         in VerifyMethod () to add support for Covariance/Contravariance
292         in delegates.
293         
294 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
295
296         * report.cs: Remove extra closing parenthesis.
297
298         * convert.cs (Error_CannotImplicitConversion): If the name of the
299         types are the same, provide some extra information.
300
301         * class.cs (FieldBase): Use an unused bit field from the field to
302         encode the `has_offset' property from the FieldMember.  This saves
303         a couple of Ks on bootstrap compilation.
304
305         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
306         method as our child, return the AnonymousMethod resolved
307         expression.
308
309         * expression.cs (New.DoResolve): Allow return values from
310         NewDelegate to also include AnonymousMethods.
311
312         Fixes #70150.
313
314 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
315
316         Fix bug #70102
317         * attribute.cs (Resolve): Improved implementation of params
318         attribute arguments.
319
320         * support.cs (ParameterData): Add HasParams to be faster.
321
322 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
323
324         all things are for /doc support:
325
326         * doc.cs: new file that supports XML documentation generation.
327         * mcs.exe.sources: added doc.cs.
328         * driver.cs:
329           Handle /doc command line option.
330           Report error 2006 instead of 5 for missing file name for /doc.
331           Generate XML documentation when required, after type resolution.
332         * cs-tokenizer.cs:
333           Added support for picking up documentation (/// and /** ... */),
334           including a new XmlCommentState enumeration.
335         * cs-parser.jay:
336           Added lines to fill Documentation element for field, constant,
337           property, indexer, method, constructor, destructor, operator, event
338           and class, struct, interface, delegate, enum.
339           Added lines to warn incorrect comment.
340         * rootcontext.cs :
341           Added Documentation field (passed only when /doc was specified).
342         * decl.cs:
343           Added DocComment, DocCommentHeader, GenerateDocComment() and
344           OnGenerateDocComment() and some supporting private members for
345           /doc feature to MemberCore.
346         * class.cs:
347           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
348         * delegate.cs:
349           Added overriden DocCommentHeader.
350         * enum.cs:
351           Added overriden DocCommentHeader and GenerateDocComment().
352
353 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
354
355         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
356         unwrapping the enumeration values, chain to
357         DoConstantNumericPromotions again, so we can promote things to the
358         fundamental types (takes care of enums that are bytes, sbytes).
359
360         Fixes bug #62054.
361
362 2004-12-01  Raja R Harinath  <rharinath@novell.com>
363
364         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
365         Fix long-standing bug in type-lookup.  Use FindType instead of
366         LookupType when ec.ResolvingTypeTree.
367         (Attribute.ResolveType, Attribute.Resolve)
368         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
369         Update to changes.
370         (Attributes.Search): Remove internal version.  Update.
371         (Attributes.SearchMulti): Update.
372         (Attributes.GetClsCompliantAttribute): Remove.
373         (Attributes.GetIndexerNameAttribute): Remove.
374         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
375         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
376         * class.cs (Indexer.Define): Likewise.
377
378 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
379
380         Fix bug #68790
381         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
382         MarshallByReference members access.
383
384         * expression.cs: Use CheckMarshallByRefAccess;
385         Better error CS0197 message.
386
387         * report.cs: Print whole related error message.
388
389 2004-11-30  Raja R Harinath  <rharinath@novell.com>
390
391         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
392         the current directory to help debugging.
393
394 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
395
396         * class (GetClassBases): Better error 60 report.
397         (EventProperty): Disabled warning 67 detection.
398
399 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
400
401         Fix bug #60324
402         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
403
404         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
405         precise values.
406
407 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
408
409         Fix bug #49488
410         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
411
412         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
413
414 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
415
416         * attribute.cs (Attribute.Resolve): Refine error reporting and
417         report a cs0117 if the identifier does not exist, to distinguish
418         from 0617 which is a miss-use of the actual identifier.
419
420         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
421         between cs0070 and cs0079.
422
423         * class.cs (MemberBase.DoDefine): When reporting a wrong
424         accessibility level, we use MethodCore to compare instead of
425         Method (this was a regression in some refactoring effort).
426
427         So now we correctly report cs0056 again.
428
429         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
430         testing the target_type (which was known to be object_type) and
431         not the source type (which is anonymous_method).
432
433         Fixed reporting of error cs1660.
434
435         * expression.cs (UserCast.Source): Expose the underlying cast.
436
437         * statement.cs (Switch.SwitchGoverningType): Sort the list of
438         allowed types to find a match to int32 first (most common).
439
440         In addition, it ignores any ImplicitUserConversions that did an
441         internal implicit conversion (as the switch statement allows only
442         one integral conversion to exist).
443
444         * class.cs (PartialContainer.Create): rename `name' to
445         `member_name' for clarity.  Then replace the string calls with a
446         call to MemberName.GetPartialName, as now using
447         MemberName.ToString is an error (this is due to the side effects
448         it had, that were fixed in the past).
449
450         This will restore the error reporting on a number of partial class
451         errors that were missusing this (and getting an exception as a
452         results, which is now just a plain textual warning, because
453         yyparse debug output would crash otherwise).
454
455 2004-11-26  Raja R Harinath  <rharinath@novell.com>
456
457         * Makefile (PROGRAM_INSTALL_DIR): Remove.
458
459 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
460
461         * rootcontext.cs (LookupType): Make sure to cache lookups that
462         don't give us a negative result. This saves about 5% of corlib
463         compilation time.
464
465 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
466
467         * report.cs (AbstractMessage.Print): messages are sent to stderr
468
469         * class.cs (TypeContainer.GetClassBases): It is an error to have a
470         non-interface in the list of interfaces (at this point, either
471         parent was properly set, or a base class is being listed in the
472         interfaces section).
473
474         This flags error 1722, and resolves the crash from bug 69259.
475
476 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
477
478         * statement.cs (Using.EmitExpressionFinally): make this work right
479         for valuetypes. Fixes 69926.
480
481 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
482
483         * const.cs (Const.ChangeType): Cope with the "0 literal can be
484         converted to an enum" here, before we try to change the underlying
485         type.  This code exists, but it is a different code path than the
486         one used while encoding constants.
487
488         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
489         old bug: when converting from the null literal to a pointer,
490         return an EmptyCast, not the NullLiteral.
491
492         This fixes #69921, the recent null_type changes probably made this
493         bug more prominent.
494
495         (ImplicitReferenceConversionExists): In addition, resynchronized
496         the code here, so it matches the same code in
497         ImplicitReferenceConversionExists for the `from any class-type S
498         to any interface-type T'.
499         
500
501 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
502
503         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
504
505 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
506
507         * cs-parser.jay: Use verbosity accordingly. 
508
509 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
510
511         * expression.cs (Unary.ResolveOperator): Do not report warning;
512         AddressOf reads from variable.
513         
514         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
515
516 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
517
518         Fix bug #69462
519
520         * attribute.cs (Attributable): Removed CheckTargets.
521         (Attributes.Emit): Explicit attribute targets are tested here.
522
523         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
524         not enabled for interfaces.
525
526         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
527         (GetAssemblyName): Ouch next bug there.
528
529 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
530
531         * expression.cs: Error 275 added.
532         
533 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
534
535         Fix bug #69177 (Implemented decimal constant support)
536
537         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
538         (BinaryFold): Add DecimalConstant.
539
540         * const.cs (Define): Decimal constant 
541         (is not constant.
542         (ChangeType): Add decimal type handling.
543         (LookupConstantValue): Don't set value for decimal type but
544         emit DecimalConstantAttribute. Needed for constant optimization.
545
546         * constant.cs (ToDecimal): New method.
547         (ConvertToDecimal): New method.
548         (IntConstant): Implemented ConvertToDecimal.
549         (DecimalConstant.Emit): Emit optimized version for decimals in
550         int range.
551
552         * expression.cs (ResolveOperator): Changed order of constant
553         reduction to work correctly with native types which have
554         overloaded operators.
555         (ResolveMemberAccess): Extract constant value from attribute
556         for decimal type.
557
558         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
559
560         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
561         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
562         (ChangeType): Decimal is special.
563         (TypeToCoreType): Add decimal type.
564
565 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
566
567         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
568         decimal types.
569
570 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
571
572         * class.cs (EventField.ApplyAttributeBuilder): Fix error
573         test cs1667-5.cs.
574
575 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
576
577         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
578
579         * pending.cs (PendingImplementation): Grab only interfaces.
580
581 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
582
583         * statement.cs (ForeachHelperMethods): Add location member and
584         error 202 detection.
585
586 2004-11-19  Raja R Harinath  <rharinath@novell.com>
587
588         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
589         automatically handled by executable.make.
590         (PROGRAM): Make profile-specific.
591
592 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
593
594         * expression.cs (DoResolveBase): Fixed wrong warning for out
595         variables.
596
597 2004-11-18  Martin Baulig  <martin@ximian.com>
598
599         Merged latest changes into gmcs.  Please keep this comment in
600         here, it makes it easier for me to see what changed in MCS since
601         the last time I merged.
602
603 2004-11-17  Raja R Harinath  <rharinath@novell.com>
604
605         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
606         (TypeHandle.GetMemberCache): New.
607         (TypeHandle.TypeHandle): Update.
608         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
609         (TypeManager.LookupParentInterfacesCache):
610         Rename from LookupInterfaceCache.  Optimize slightly.
611         (TypeManager.MemberLookup_FindMembers): Update.
612         * decl.cs (MemberCache.MemberCache): Set Container to null in the
613         multi-type variant.
614         (AddCacheContents): Rename from AddHashtable.
615         * class.cs (TypeContainer.parent_container): Remove.
616         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
617         (TypeContainer.DoDefineMembers): Don't initialize it.
618         Update to name changes.
619         
620 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
621
622         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
623         that factors the code to check access modifiers on override.  
624
625         (PropertyBase): Use the code here.
626
627         Patch from Lluis S'anchez, fixes bug #69361.
628
629 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
630
631         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
632         routine that is used to report the use of a captured variable
633         whose address has been taken.
634
635         There are two checks: one when variables are being captured and
636         the other check is when the address of a variable is taken. 
637         
638         (because an anonymous methods might be resolved before *or* after
639         the address has been taken) and 
640
641         * expression.cs (Conditional.DoResolve): Remove the special
642         casing that Martin added to trueExpr and falseExpr being both
643         NullLiteral.  We get the right behavior now just by introducing
644         the null_type into the compiler. 
645
646         * convert.cs (ExplicitConversion): Change the code to use
647         null_type instead of testing `expr is NullLiteral'.
648         (ImplicitConversionStandard): use null_type too.
649         (ImplicitReferenceConversionExists): use null_type too.
650         (ImplicitReferenceConversion): use null_type too.
651
652         * literal.cs: The type of `NullLiteral' is now null_type instead
653         of object_type. 
654         (Resolve): Set the type here.
655
656         * typemanager.cs: Introduce null_type.
657
658 2004-11-17  Martin Baulig  <martin@ximian.com>
659
660         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
661         direction, like FindMembers() does.  Fixes #69546, testcase is in
662         test-315.cs.    
663
664 2004-11-16  Martin Baulig  <martin@ximian.com>
665
666         This is based on a patch from Marek Safar, see bug #69082.
667         Fixes bugs #63705 and #67130.
668
669         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
670         method; create a MemberCache for an interface type and cache the
671         result.
672
673         * decl.cs (IMemberContainer.ParentContainer): Removed.
674         (IMemberContainer.ParentCache): New property.
675         (MemberCache.SetupCacheForInterface): Removed.
676         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
677         to create a cache for an interface's "parent".
678
679         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
680         interfaces too.
681
682 2004-11-16  Martin Baulig  <martin@ximian.com>
683
684         Merged back from gmcs; these changes already went into gmcs a
685         couple of weeks ago.
686
687         * typemanager.cs
688         (TypeManager.AddUserType): Removed the `ifaces' argument.
689         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
690         `TypeExpr []'.
691         (TypeManager.AddUserInterface): Removed.
692         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
693         `TypeExpr []'.
694         (TypeManager.GetInterfaces): Likewise.
695         (TypeManager.GetExplicitInterfaces): Likewise.
696
697         * ecore.cs (TypeExpr.GetInterfaces): Removed.
698
699         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
700         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
701
702 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
703
704         * statement.cs: Avoid adding bools to a hashtable.
705
706 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
707
708         * expression.cs (Invocation.OverloadResolve): Flag error if we are
709         calling an unsafe method from a safe location.
710
711 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
712
713         Fix #69167
714         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
715
716 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
717
718         * namespace.cs (VerifyUsing): use GetPartialName instead of
719         ToString. 
720
721 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
722
723         * statement.cs (Return.Resolve): Fix regression in typo: if
724         `in_exc', we have to request a NeedReturnLabel, this was a typo
725         introduced in the anonymous method check-in.  Fixes #69131.
726
727         * Indexers were using the ShortName when defining themselves,
728         causing a regression in the compiler bootstrap when applying the
729         patch from 2004-11-02 (first part), now they use their full name
730         and the bug is gone.
731
732 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
733
734         * driver.cs: Strip the path from the names of embedded resources. Fixes
735         #68519.
736
737 2004-11-04  Raja R Harinath  <rharinath@novell.com>
738
739         Fix error message regression: cs0104-2.cs.
740         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
741         (AliasEntry.Resolve): Update.
742         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
743         'silent' flag.
744         (RootContext.LookupType): Update.
745
746 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
747
748         * cs-parser.jay: Add support for handling accessor modifiers
749         * class: Add support port accessor modifiers and error checking,
750         define PropertyMethod.Define as virtual (not abstract anymore)
751         * ecore.cs: Add checking for proeprties access with access modifiers
752         * iterators.cs: Modify Accessor constructor call based in the modified
753         constructor
754 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
755
756         * expression.cs (StringConcat): Handle being called twice,
757         as when we have a concat in a field init with more than two
758         ctors in the class
759
760 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
761
762         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
763         special case explicit implementations, we should always produce
764         the .property or .event declaration.
765         
766         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
767         since it will not return correct data if people use this
768         unresolved in the presence of using statements (see test-313).
769
770         * class.cs (MethodData.Define): If we are an explicit interface
771         implementation, set the method name to the full name of the
772         interface plus the name of the method.  
773
774         Notice that using the method.MethodName.GetFullName() does not
775         work, as it will only contain the name as declared on the source
776         file (it can be a shorthand in the presence of using statements)
777         and not the fully qualifed type name, for example:
778
779         using System;
780
781         class D : ICloneable {
782                 object ICloneable.Clone ()  {
783                 }
784         }
785
786         Would produce a method called `ICloneable.Clone' instead of
787         `System.ICloneable.Clone'.
788
789         * namespace.cs (Alias.Resolve): Use GetPartialName.
790         
791 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
792
793         * cs-parser.jay: Add error 1055 report.
794
795 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
796
797         * assign.cs (Assign.DoResolve): Only do the transform of
798         assignment into a New if the types are compatible, if not, fall
799         through and let the implicit code deal with the errors and with
800         the necessary conversions. 
801
802 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
803
804         * cs-parser.jay: Add error 1031 report.
805
806         * cs-tokenizer.cs: Add location for error 1038.
807
808 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
809
810         * cs-parser.jay: Add error 1016 report.
811
812 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
813
814         * cs-parser.jay: Add errors 1575,1611 report.
815
816 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
817
818         * cs-parser.jay: Add error 1001 report.
819
820 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
821
822         Fix #68850
823         * attribute.cs (GetMarshal): Add method argument for
824         caller identification.
825
826         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
827         agument for GetMarshal and RuntimeMissingSupport.
828
829 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
830
831         * attribute.cs (ExtractSecurityPermissionSet): Removed
832         TypeManager.code_access_permission_type.
833
834         * typemanager.cs: Removed TypeManager.code_access_permission_type.
835
836 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
837
838         * expression.cs (LocalVariableReference.DoResolveLValue): Check
839         for obsolete use of a variable here.   Fixes regression on errors
840         cs0619-25 and cs0619-26.
841
842 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
843
844         Fix #62358, implemented security attribute encoding.
845
846         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
847         Tests permitted SecurityAction for assembly or other types.
848         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
849         data from SecurityPermissionAttribute to PermisionSet class.
850
851         * class.cs (ApplyAttributeBuilder): Added special handling
852         for System.Security.Permissions.SecurityAttribute based types.
853
854         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
855         special handling for System.Security.Permissions.SecurityAttribute
856         based types.
857
858         * enum.cs (ApplyAttributeBuilder): Added special handling
859         for System.Security.Permissions.SecurityAttribute based types.
860
861         * parameter.cs (ApplyAttributeBuilder): Added special handling
862         for System.Security.Permissions.SecurityAttribute based types.
863
864         * rootcontext.cs: Next 2 core types.
865
866         * typemanager.cs (TypeManager.security_permission_attr_type):
867         Built in type for the SecurityPermission Attribute.
868         (code_access_permission_type): Build in type.
869
870 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
871
872         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
873         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
874         all of this information into
875         EmitContext.EmitCapturedVariableInstance.
876         
877         * codegen.cs (EmitCapturedVariableInstance): move here the
878         funcionality of emitting an ldarg.0 in the presence of a
879         remapping.   This centralizes the instance emit code.
880
881         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
882         then emit a load of this: it means that we have reached the
883         topmost ScopeInfo: the one that contains the pointer to the
884         instance of the class hosting the anonymous method.
885
886         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
887         captures to the topmost CaptureContext.
888
889 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
890
891         * expression.cs (LocalVariableReference): Move the knowledge about
892         the iterators into codegen's EmitCapturedVariableInstance.
893
894 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
895
896         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
897         all code paths return a value from an anonymous method (it is the
898         same as the 161 error, but for anonymous methods).
899
900 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
901
902         The introduction of anonymous methods in the compiler changed
903         various ways of doing things in the compiler.  The most
904         significant one is the hard split between the resolution phase
905         and the emission phases of the compiler.
906
907         For instance, routines that referenced local variables no
908         longer can safely create temporary variables during the
909         resolution phase: they must do so from the emission phase,
910         since the variable might have been "captured", hence access to
911         it can not be done with the local-variable operations from the runtime.
912         
913         * statement.cs 
914
915         (Block.Flags): New flag `IsTopLevel' to indicate that this block
916         is a toplevel block.
917
918         (ToplevelBlock): A new kind of Block, these are the blocks that
919         are created by the parser for all toplevel method bodies.  These
920         include methods, accessors and anonymous methods.
921
922         These contain some extra information not found in regular blocks:
923         A pointer to an optional CaptureContext (for tracking captured
924         local variables and parameters).  A pointer to the parent
925         ToplevelBlock.
926         
927         (Return.Resolve): Catch missmatches when returning a value from an
928         anonymous method (error 1662).
929         Invoke NeedReturnLabel from the Resolve phase instead of the emit
930         phase.
931
932         (Break.Resolve): ditto.
933
934         (SwitchLabel): instead of defining the labels during the
935         resolution phase, we now turned the public ILLabel and ILLabelCode
936         labels into methods called GetILLabelCode() and GetILLabel() that
937         only define the label during the Emit phase.
938
939         (GotoCase): Track the SwitchLabel instead of the computed label
940         (its contained therein).  Emit the code by using
941         SwitchLabel.GetILLabelCode ().
942
943         (LocalInfo.Flags.Captured): A new flag has been introduce to track
944         whether the Local has been captured or not.
945
946         (LocalInfo.IsCaptured): New property, used to tell whether the
947         local has been captured.
948         
949         * anonymous.cs: Vastly updated to contain the anonymous method
950         support.
951
952         The main classes here are: CaptureContext which tracks any
953         captured information for a toplevel block and ScopeInfo used to
954         track the activation frames for various local variables.   
955
956         Each toplevel block has an optional capture context associated
957         with it.  When a method contains an anonymous method both the
958         toplevel method and the anonymous method will create a capture
959         context.   When variables or parameters are captured, they are
960         recorded on the CaptureContext that owns them, for example:
961
962         void Demo () {
963              int a;
964              MyDelegate d = delegate {
965                  a = 1;
966              }
967         }
968
969         Here `a' will be recorded as captured on the toplevel
970         CapturedContext, the inner captured context will not have anything
971         (it will only have data if local variables or parameters from it
972         are captured in a nested anonymous method.
973
974         The ScopeInfo is used to track the activation frames for local
975         variables, for example:
976
977         for (int i = 0; i < 10; i++)
978                 for (int j = 0; j < 10; j++){
979                    MyDelegate d = delegate {
980                         call (i, j);
981                    }
982                 }
983
984         At runtime this captures a single captured variable `i', but it
985         captures 10 different versions of the variable `j'.  The variable
986         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
987         recorded on a child.  
988
989         The toplevel ScopeInfo will also track information like the `this'
990         pointer if instance variables were referenced (this is necessary
991         as the anonymous method lives inside a nested class in the host
992         type of the method). 
993
994         (AnonymousMethod): Expanded to track the Toplevel, implement
995         `AnonymousMethod.Compatible' to tell whether an anonymous method
996         can be converted to a target delegate type. 
997
998         The routine now also produces the anonymous method content
999
1000         (AnonymousDelegate): A helper class that derives from
1001         DelegateCreation, this is used to generate the code necessary to
1002         produce the delegate for the anonymous method that was created. 
1003
1004         * assign.cs: API adjustments for new changes in
1005         Convert.ImplicitStandardConversionExists.
1006
1007         * class.cs: Adjustments to cope with the fact that now toplevel
1008         blocks are of type `ToplevelBlock'. 
1009
1010         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1011         insteda of standard blocks.
1012
1013         Flag errors if params arguments are passed to anonymous methods.
1014
1015         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1016         `CurrentAnonymousMethod' which points to the current Anonymous
1017         Method.  The variable points to the AnonymousMethod class that
1018         holds the code being compiled.  It is set in the new EmitContext
1019         created for the anonymous method.
1020
1021         (EmitContext.Phase): Introduce a variable and an enumeration to
1022         assist in enforcing some rules about when and where we are allowed
1023         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1024         only one that enfonces this right now).
1025
1026         (EmitContext.HaveCaptureInfo): new helper method that returns
1027         whether we have a CapturedContext initialized.
1028
1029         (EmitContext.CaptureVariable): New method used to register that a
1030         LocalInfo must be flagged for capturing. 
1031
1032         (EmitContext.CapturedParameter): New method used to register that a
1033         parameters must be flagged for capturing. 
1034         
1035         (EmitContext.CapturedField): New method used to register that a
1036         field must be flagged for capturing. 
1037
1038         (EmitContext.HaveCapturedVariables,
1039         EmitContext.HaveCapturedFields): Return whether there are captured
1040         variables or fields. 
1041
1042         (EmitContext.EmitMethodHostInstance): This is used to emit the
1043         instance for the anonymous method.  The instance might be null
1044         (static methods), this (for anonymous methods that capture nothing
1045         and happen to live side-by-side with the current method body) or a
1046         more complicated expression if the method has a CaptureContext.
1047
1048         (EmitContext.EmitTopBlock): Routine that drives the emission of
1049         code: it will first resolve the top block, then emit any metadata
1050         and then emit the code.  The split is done so that we can extract
1051         any anonymous methods and flag any captured variables/parameters.
1052         
1053         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1054         during this phase, the ILGenerator should not be used as labels
1055         and local variables declared here might not be accessible to any
1056         code that is part of an anonymous method.  
1057
1058         Exceptions to this include the temporary variables that are
1059         created by some statements internally for holding temporary
1060         variables. 
1061         
1062         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1063         metadata for a cb
1064
1065         (EmitContext.TemporaryReturn): This method is typically called
1066         from the Emit phase, and its the only place where we allow the
1067         ReturnLabel to be defined other than the EmitMeta.  The reason is
1068         that otherwise we would have to duplicate a lot of logic in the
1069         Resolve phases of various methods that today is on the Emit
1070         phase. 
1071
1072         (EmitContext.NeedReturnLabel): This no longer creates the label,
1073         as the ILGenerator is not valid during the resolve phase.
1074
1075         (EmitContext.EmitThis): Extended the knowledge in this class to
1076         work in anonymous methods in addition to iterators. 
1077
1078         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1079         code is necessary on the stack to access the instance to a local
1080         variable (the variable will be accessed as a field).
1081
1082         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1083         EmitContext.EmitAddressOfParameter): Routines to support
1084         parameters (not completed at this point). 
1085         
1086         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1087         will also remove the parameters.
1088
1089         * convert.cs (Convert): Define a `ConstantEC' which points to a
1090         null.  This is just to prefity some code that uses
1091         ImplicitStandardConversion code and do not have an EmitContext
1092         handy.
1093
1094         The idea is to flag explicitly that at that point in time, it is
1095         known that the conversion will not trigger the delegate checking
1096         code in implicit conversions (which requires a valid
1097         EmitContext). 
1098
1099         Everywhere: pass new EmitContext parameter since
1100         ImplicitStandardConversionExists now requires it to check for
1101         anonymous method conversions. 
1102
1103         (Convert.ImplicitStandardConversionExists): If the type of an
1104         expression is the anonymous_method_type, and the type is a
1105         delegate, we invoke the AnonymousMethod.Compatible method to check
1106         whether an implicit conversion is possible. 
1107
1108         (Convert.ImplicitConversionStandard): Only do implicit method
1109         group conversions if the language level is not ISO_1.
1110
1111         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1112         MethodInfo for the Invoke method.  used by Delegate and
1113         AnonymousDelegate.
1114
1115         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1116         method conversions if the target type is a delegate.
1117
1118         Removed extra debugging nops.
1119
1120         (LocalVariableReference): Turn the `local_info' into a public
1121         field. 
1122
1123         Add `prepared' field, the same hack used for FieldExprs to cope
1124         with composed assignments, as Local variables do not necessarily
1125         operate purely on the stack as they used to: they can be captured
1126         fields. 
1127
1128         Add `temp' for a temporary result, like fields.
1129
1130         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1131
1132         It now copes with Local variables that are captured and emits the
1133         proper instance variable to load it from a field in the captured
1134         case. 
1135
1136         (ParameterReference.DoResolveBase): During the resolve phase,
1137         capture parameters if we are in an anonymous method.
1138
1139         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1140         anonymous method, use the EmitContext helper routines to emit the
1141         parameter reference.
1142
1143         * iterators.cs: Set RemapToProxy to true/false during the
1144         EmitDispose class.
1145
1146         * parameters.cs (GetParameterByName): New helper method. 
1147
1148         * typemanager.cs (anonymous_method_type) a new type that
1149         represents an anonyous method.  This is always an internal type,
1150         used as a fencepost to test against the anonymous-methodness of an
1151         expression. 
1152         
1153 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1154
1155         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1156         561 report.
1157         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1158
1159 2004-10-18  Martin Baulig  <martin@ximian.com>
1160
1161         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1162         `Type' directly, but call ResolveType() on it.
1163         (Catch.Resolve): Likewise.
1164         (Foreach.Resolve): Likewise.
1165
1166 2004-10-18  Martin Baulig  <martin@ximian.com>
1167
1168         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1169         `Type' directly, but call ResolveType() on it.
1170         (Probe.DoResolve): Likewise.
1171         (ArrayCreation.LookupType): Likewise.
1172         (TypeOf.DoResolve): Likewise.
1173         (SizeOf.DoResolve): Likewise.
1174
1175 2004-10-18  Martin Baulig  <martin@ximian.com>
1176
1177         * expression.cs (Invocation.BetterFunction): Put back
1178         TypeManager.TypeToCoreType().
1179
1180 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1181
1182         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1183         the ResolveType.
1184
1185 2004-10-18  Martin Baulig  <martin@ximian.com>
1186
1187         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1188         `Type' directly, but call ResolveType() on it.
1189
1190 2004-10-18  Martin Baulig  <martin@ximian.com>
1191
1192         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1193         `Type' directly, but call ResolveType() on it.
1194         (MemberBase.DoDefine): Likewise.
1195
1196         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1197         `Type' directly, but call ResolveType() on it.
1198         (ComposedCast.DoResolveAsTypeStep): Likewise.
1199
1200         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1201         `Type' directly, but call ResolveType() on it.
1202
1203 2004-10-17  John Luke  <john.luke@gmail.com>
1204
1205         * class.cs (Operator.GetSignatureForError): use CSharpName
1206
1207         * parameter.cs (Parameter.GetSignatureForError): Returns
1208         correct name even if was not defined.
1209
1210 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1211
1212         Fix #65816.
1213         * class.cs (TypeContainer.EmitContext): New property.
1214         (DefineNestedTypes): Create an emitcontext for each part.
1215         (MethodCore.DoDefineParameters): Use container's emitcontext.
1216         Pass type array to InternalParameters.
1217         (MemberBase.DoDefine): Use container's emitcontext.
1218         (FieldMember.Define): Likewise.
1219         (Event.Define): Likewise.
1220         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1221         Pass type array to InternalParameters.
1222         (SetIndexerMethod.GetParameterInfo): Likewise.
1223         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1224         * delegate.cs (Define): Pass emitcontext to
1225         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1226         array to InternalParameters.
1227         * expression.cs (ParameterReference.DoResolveBase): Pass
1228         emitcontext to GetParameterInfo.
1229         (ComposedCast.DoResolveAsTypeStep): Remove check on
1230         ec.ResolvingTypeTree.
1231         * parameter.cs (Parameter.Resolve): Change argument to
1232         EmitContext.  Use ResolveAsTypeTerminal.
1233         (Parameter.GetSignature): Change argument to EmitContext.
1234         (Parameters.ComputeSignature): Likewise.
1235         (Parameters.ComputeParameterTypes): Likewise.
1236         (Parameters.GetParameterInfo): Likewise.
1237         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1238         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1239         * support.cs (InternalParameters..ctor): Remove variant that takes
1240         a DeclSpace.
1241         * typemanager.cs (system_intptr_expr): New.
1242         (InitExpressionTypes): Initialize it.
1243
1244 2004-10-12  Chris Toshok  <toshok@ximian.com>
1245
1246         * cs-parser.jay: fix location for try_statement and catch_clause.
1247
1248 2004-10-11  Martin Baulig  <martin@ximian.com>
1249
1250         * report.cs: Don't make --fatal abort on warnings, we have
1251         -warnaserror for that.
1252
1253 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1254
1255         More DeclSpace.ResolveType avoidance.
1256         * decl.cs (MemberCore.InUnsafe): New property.
1257         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1258         with newly created EmitContext.
1259         (FieldMember.Define): Likewise.
1260         * delegate.cs (Delegate.Define): Likewise.
1261         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1262         only if normal name-lookup fails.
1263         (TypeExpr.DoResolve): Enable error-checking.
1264         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1265         (SizeOf.DoResolve): Likewise.
1266         (ComposedCast.DoResolveAsTypeStep): Likewise.
1267         (StackAlloc.DoResolve): Likewise.
1268         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1269         (Block.Unsafe): New property.
1270         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1271         (Unsafe): Set 'unsafe' flag of contained block.
1272         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1273         (Fixed.Resolve): Likewise.
1274         (Catch.Resolve): Likewise.
1275         (Using.ResolveLocalVariableDecls): Likewise.
1276         (Foreach.Resolve): Likewise.
1277
1278 2004-10-05  John Luke <john.luke@gmail.com>
1279
1280         * cs-parser.jay: add location to error CS0175
1281
1282 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1283
1284         * ecore.cs (Expression.Constantity): Add support for turning null
1285         into a constant.
1286
1287         * const.cs (Const.Define): Allow constants to be reference types
1288         as long as the value is Null.
1289
1290 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1291
1292         * namespace.cs (NamespaceEntry.Using): No matter which warning
1293         level is set, check if this namespace name has already been added.
1294
1295 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1296
1297         * expression.cs: reftype [!=]= null should always use br[true,false].
1298         # 67410
1299
1300 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1301
1302         Fix #67108
1303         * attribute.cs: Enum conversion moved to 
1304         GetAttributeArgumentExpression to be applied to the all
1305         expressions.
1306
1307 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1308
1309         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1310         * class.c (TypeContainer.DefineType): Flag error if
1311         base types aren't accessible due to access permissions.
1312         * decl.cs (DeclSpace.ResolveType): Move logic to
1313         Expression.ResolveAsTypeTerminal.
1314         (DeclSpace.ResolveTypeExpr): Thin layer over
1315         Expression.ResolveAsTypeTerminal.
1316         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1317         Refactor code into NestedAccess.  Use it.
1318         (DeclSpace.NestedAccess): New.
1319         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1320         argument to silence errors.  Check access permissions.
1321         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1322         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1323         (Cast.DoResolve): Likewise.
1324         (New.DoResolve): Likewise.
1325         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1326         (TypeOf.DoResolve): Likewise.
1327
1328         * expression.cs (Invocation.BetterConversion): Return the Type of
1329         the better conversion.  Implement section 14.4.2.3 more faithfully.
1330         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1331         section 14.4.2.2 explicit.
1332         (Invocation.OverloadResolve): Update.
1333         (Invocation): Remove is_base field.
1334         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1335         (Invocation.Emit): Likewise.
1336
1337 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1338
1339         * README: Update to changes.
1340
1341 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1342
1343         * cs-parser.jay: Reverted 642 warning fix.
1344
1345 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1346
1347         Fix bug #66615
1348         * decl.cs (FindMemberWithSameName): Indexer can have more than
1349         1 argument.
1350
1351 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1352
1353         * expression.cs (LocalVariableReference.DoResolveLValue):
1354         Do not report warning 219 for out values.
1355         (EmptyExpression.Null): New member to avoid extra allocations.
1356
1357 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1358
1359         * cs-parser.jay: Fix wrong warning 642 report.
1360
1361         * cs-tokenizer.cs (CheckNextToken): New helper;
1362         Inspect next character if is same as expected.
1363
1364 2004-09-23  Martin Baulig  <martin@ximian.com>
1365
1366         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1367         (Convert.ImplicitReferenceConversionExists): Likewise.
1368
1369 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1370
1371         * class.cs (Operator.Define): Add error 448 and 559 report.
1372
1373 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1374
1375         * class.cs (MemberBase.IsTypePermitted): New protected
1376         method for checking error CS0610.
1377
1378 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1379
1380         * class.cs (TypeContainer.HasExplicitLayout): New property
1381         Returns whether container has StructLayout attribute set Explicit.
1382         (FieldMember): New abstract class for consts and fields.
1383         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1384         (Field): Reuse FieldMember.
1385
1386         * const.cs (Const): Reuse FieldMember.
1387
1388         * rootcontext.cs: EmitConstants call moved to class.
1389
1390 2004-09-22  Martin Baulig  <martin@ximian.com>
1391
1392         Thanks to Peter Sestoft for this bug report.
1393
1394         * expression.cs (Conditional): If both the `trueExpr' and the
1395         `falseExpr' is a NullLiteral, return a NullLiteral.
1396
1397 2004-09-22  Martin Baulig  <martin@ximian.com>
1398
1399         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1400         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1401         for the "get_Current" call.
1402
1403 2004-09-22  Martin Baulig  <martin@ximian.com>
1404
1405         Marek and me just fixed one of our oldest bugs: #28562 :-)
1406
1407         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1408
1409         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1410         we're an EnumConstant, just return that.
1411         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1412         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1413         to get the value which'll actually be written into the attribute.
1414         However, we have to use GetValue() to access the attribute's value
1415         in the compiler.        
1416
1417 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1418
1419         * constant.cs (Constant.IsNegative): New abstract property
1420         IsNegative.
1421
1422         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1423         (StackAlloc.DoResolve): Reused IsNegative.
1424
1425 2004-09-21  Martin Baulig  <martin@ximian.com>
1426
1427         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1428         if we're used in an iterator, we may be called from different
1429         methods.
1430
1431         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1432         we actually have an exception block.
1433
1434 2004-09-20  John Luke <jluke@cfl.rr.com>
1435
1436         * class.cs, cs-parser.jay: Improve the error report for 1520:
1437         report the actual line where the error happens, not where the
1438         class was declared.
1439
1440         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1441         Pass location information that was available elsewhere.
1442
1443 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1444
1445         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1446         runtime to delay sign assemblies.
1447
1448 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1449
1450         * cs-parser.jay: Do not report the stack trace, this is barely
1451         used nowadays.
1452
1453 2004-08-22  John Luke  <john.luke@gmail.com>
1454  
1455         * driver.cs : check that a resource id is not already used
1456         before adding it, report CS1508 if it is, bug #63637
1457
1458 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1459
1460         * ecore.cs: Removed dead code.
1461
1462 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1463
1464         * class.cs: Do not report warning CS0067 on the interfaces.
1465
1466 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1467
1468         * cs-parser.jay: Add error 504 report.
1469
1470 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1471
1472         * rootcontext.cs: WarningLevel is 4 by default now.
1473
1474         * statement.cs (Fixed.Resolve): Do not null
1475         VariableInfo.
1476
1477 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1478
1479         Fixed bug #55780
1480         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1481         deep search when property is not virtual.
1482         (PropertyExpr.ResolveAccessors): Make one call for both
1483         accessors.
1484
1485 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1486
1487         Fixed bug #65766
1488         * statement.cs: Error 152 report constains also location.
1489
1490 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1491
1492         Fixed bug #65766
1493         * const.cs: Explicitly set constant as static.
1494
1495 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1496
1497         Fixed bug #64226
1498         * cs-parser.jay: Add error 1017 report.
1499
1500 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1501
1502         Fixed bug #59980, #64224
1503         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1504
1505         * typemanager.cs (IsSpecialMethod): Simplified
1506
1507 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1508
1509         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1510         condition with better params.
1511
1512 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1513
1514         Fixed bug #65238
1515         * attribute.cs (Resolve): Property has to have both
1516         accessors.
1517
1518 2004-09-14  Martin Baulig  <martin@ximian.com>
1519
1520         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1521
1522 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1523
1524         Fixed bug #61902
1525         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1526         called and is obsolete then this member suppress message
1527         when call is inside next [Obsolete] method or type.
1528
1529         * expression.cs: Use TestObsoleteMethodUsage member.
1530
1531 2004-09-14  Martin Baulig  <martin@ximian.com>
1532
1533         * cs-parser.jay: Sync a bit with the GMCS version.
1534
1535 2004-09-14  Martin Baulig  <martin@ximian.com>
1536
1537         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1538         (CSharpParser.yacc_verbose_flag): New public field.
1539
1540         * genericparser.cs: Removed.
1541
1542 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1543
1544         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1545
1546 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1547
1548         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1549
1550 2004-09-10  Martin Baulig  <martin@ximian.com>
1551
1552         Backported my MemberName changes from GMCS into MCS.
1553
1554         - we are now using a special `MemberName' class instead of using
1555         strings; in GMCS, the `MemberName' also contains the type
1556         arguments.
1557
1558         - changed the grammar rules a bit:
1559           * the old `member_name' is now a `namespace_or_type_name':
1560             The rule is that we use `namespace_or_type_name' everywhere
1561             where we expect either a "member name" (GetEnumerator) or a
1562             "member name" with an explicit interface name
1563             (IEnumerable.GetEnumerator).
1564             In GMCS, the explicit interface name may include type arguments
1565             (IEnumerable<T>.GetEnumerator).
1566           * we use `member_name' instead of just `IDENTIFIER' for
1567             "member names":
1568             The rule is that we use `member_name' wherever a member may
1569             have type parameters in GMCS.       
1570
1571         * decl.cs (MemberName): New public class.
1572         (MemberCore.MemberName): New public readonly field.
1573         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1574         (DeclSpace): Likewise.
1575
1576         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1577         * enum.cs (Enum.ctor): Likewise.
1578
1579         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1580         MemberName.     
1581         (AliasEntry.ctor): Take a MemberName, not an Expression.
1582         (AliasEntry.UsingAlias): Likewise.
1583
1584         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1585         (IMethodData.MemberName): Changed type from string to MemberName.
1586         (MemberBase.ExplicitInterfaceName): Likewise.
1587         (AbstractPropertyEventMethod.SetupName): Make this private.
1588         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1589         argument; compute the member name here.
1590         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1591         on the `member.MemberName' and the `prefix'.
1592
1593         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1594         not `type_name'.
1595         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1596         thus, we get a `MemberName' instead of a `string'.  These
1597         declarations may have type parameters in GMCS.
1598         (interface_method_declaration, delegate_declaration): Likewise.
1599         (class_declaration, interface_declaration): Likewise.
1600         (method_header): Use `namespace_or_type_name' instead of
1601         `member_name'.  We may be an explicit interface implementation.
1602         (property_declaration, event_declaration): Likewise.
1603         (member_name): This is now just an `IDENTIFIER', not a
1604         `namespace_or_type_name'.
1605         (type_name, interface_type): Removed.
1606         (namespace_or_type_name): Return a MemberName, not an Expression.
1607         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1608         call GetTypeExpression() on the MemberName to get an expression.
1609         (IndexerDeclaration.interface_type): Changed type from string to
1610         MemberName.
1611         (MakeName): Operate on MemberName's instead of string's.
1612
1613 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1614
1615         Fix bug #55770.
1616         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1617         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1618         lookup to avoid symbols introduced by 'using'.
1619         * rootcontext.cs (NamespaceLookup): Update.
1620
1621 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1622
1623         * class.cs (TypeContainer.DoDefineMembers): Do not call
1624         DefineDefaultConstructor for static classes.
1625
1626 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1627
1628         * attribute.cs (Attribute.Resolve): Add error 653 report.
1629
1630         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1631         report.
1632         (Method.ApplyAttributeBuilder): Add error 685 report.
1633         (Operator.Define): Add error 564 report.
1634
1635         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1636
1637         * expression.cs (Invocation.DoResolve): Add error
1638         245 and 250 report.
1639
1640         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1641         error 674 report.
1642
1643 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1644
1645         * class.cs (ConstructorInitializer.Resolve):
1646         Wrong error number (515->516).
1647
1648 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1649
1650         * class.cs (Indexer.Define): Add error 631 report.
1651
1652 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1653
1654         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1655
1656 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1657
1658         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1659
1660 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1661
1662         * cs-parser.jay: Added error CS0241 report.
1663
1664 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1665
1666         * cs-parser.jay (fixed_statement): Introduce a scope for the
1667         declaration in the 'fixed' statement.
1668
1669 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1670
1671         * cs-parser.jay: Added CS0230 error report.
1672
1673 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1674
1675         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1676
1677 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1678
1679         * expression.cs (Argument.Resolve): Added error CS0192 and
1680         CS0199 report.
1681
1682 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1683
1684         C# 2.0 #pragma warning feature
1685
1686         * cs-tokenizer.cs (PreProcessPragma): New method; 
1687         Handles #pragma directive.
1688
1689         * report.cs (WarningRegions): New class; Support
1690         class for #pragma warning directive. It tests whether
1691         warning is enabled for a given line.
1692
1693 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1694
1695         * const.cs: Add more descriptive error report, tahnks to
1696         Sebastien. 
1697
1698 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1699
1700         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1701
1702 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1703
1704         * expression.cs: Apply patch from Ben: Remove dead code from
1705         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1706         as that code just threw an exception anwyays.
1707
1708         * const.cs: Remove the call to the turnintoconstant, for details
1709         see bug: #63144
1710         
1711         * literal.cs: The type of the null-literal is the null type;  So
1712         we use a placeholder type (literal.cs:System.Null, defined here)
1713         for it.
1714
1715         * expression.cs (Conditional.DoResolve): Remove some old code that
1716         is no longer needed, conversions have been fixed.
1717
1718         (ArrayCreationExpression.DoResolve): Return false if we fail to
1719         resolve the inner expression.
1720
1721 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1722
1723         Fix test-290.cs.
1724         * cs-parser.jay (delegate_declaration): Record a delegate
1725         declaration as a type declaration.
1726         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1727
1728 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1729
1730         * parameter.cs: Do not crash if the type can not be resolved. 
1731
1732         * expression.cs: Report errors with unsafe pointers, fixes #64896
1733
1734 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1735
1736         * expression.cs: Pointer arith always needs to do a conv.i
1737         if the operand is a long. fix 65320
1738
1739 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1740
1741         Fixed cs0619-37.cs, cs0619-38.cs
1742
1743         * enum.cs (GetObsoleteAttribute): Removed.
1744
1745         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1746         on Enum member is double staged. The first is tested member
1747         and then enum.
1748
1749 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1750
1751         Fixed #56986, #63631, #65231
1752
1753         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1754         adds member to name container.
1755         (TypeContainer.AddToTypeContainer): New method, adds type to
1756         name container.
1757         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1758         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1759         AddOperator): Simplified by reusing AddToMemberContainer.
1760         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1761         instead of field.
1762         (Method.CheckForDuplications): Fixed implementation to test all
1763         possibilities.
1764         (MemberBase): Detection whether member is explicit interface
1765         implementation is now in constructor.
1766         (MemberBase.UpdateMemberName): Handles IndexerName.
1767         (Accessor): Changed to keep also location information.
1768         (AbstractPropertyEventMethod): Is derived from MemberCore.
1769         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1770         will be emited or not.
1771         (PropertyBase.AreAccessorsDuplicateImplementation):
1772         Tests whether accessors are not in collision with some method.
1773         (Operator): Is derived from MethodCore to simplify common
1774         operations.
1775
1776         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1777         must be performed.
1778         (DeclSpace.AddToContainer): Adds the member to defined_names
1779         table. It tests for duplications and enclosing name conflicts.
1780
1781         * enum.cs (EnumMember): Clean up to reuse the base structures
1782
1783 2004-09-03  Martin Baulig  <martin@ximian.com>
1784
1785         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1786         into TypeContainer, to make partial classes work again.
1787
1788 2004-09-03  Martin Baulig  <martin@ximian.com>
1789
1790         * rootcontext.cs (RootContext.V2): Removed.
1791
1792 2004-03-23  Martin Baulig  <martin@ximian.com>
1793
1794         * expression.cs (Invocation.OverloadResolve): Added `bool
1795         may_fail' argument and use it instead of the Location.IsNull() hack.
1796
1797 2004-09-03  Martin Baulig  <martin@ximian.com>
1798
1799         Merged latest changes into gmcs.  Please keep this comment in
1800         here, it makes it easier for me to see what changed in MCS since
1801         the last time I merged.
1802
1803 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1804
1805         Fix #61128.
1806         * expression.cs (BetterConversion): Don't allow either conversion 
1807         to be null.  Remove redundant implicit conversion test when 'q ==
1808         null' -- when this function is invoked, we already know that the
1809         implicit conversion exists.
1810         (BetterFunction): Assume that 'best' is non-null.  Remove
1811         redundant reimplementation of IsApplicable when 'best' is null.
1812         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1813         number of arguments.
1814         (IsAncestralType): Extract from OverloadResolve.
1815         (OverloadResolve): Make robust to the MethodGroupExpr being
1816         unsorted.  Implement all the logic of Section 14.5.5.1, and
1817         support overloading of methods from multiple applicable types.
1818         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1819
1820         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1821         (RealError, Warning): Append type of report to related symbol.
1822
1823 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1824
1825         * enum.cs: Fixed CLS-Compliance checks for enum members.
1826         Error tests cs3008-8.cs, cs3014-8.cs
1827
1828 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1829
1830         Fixed bug #62342, #63102
1831         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1832         like ImplementMethod.
1833
1834 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1835
1836         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1837         Fixed bug #65170.
1838
1839 2004-09-02  Martin Baulig  <martin@ximian.com>
1840
1841         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1842         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1843         on the MethodBase.
1844
1845 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1846
1847         C# 2.0 Static classes implemented
1848
1849         * class.cs (TypeContainer): instance_constructors,
1850         initialized_fields, initialized_static_fields,
1851         default_constructor, base_inteface_types are protected to be
1852         accessible from StaticClass.
1853         (TypeContainer.DefineDefaultConstructor): New virtual method
1854         for custom default constructor generating
1855         (StaticClass): New class to handle "Static classes" feature.
1856
1857         * cs-parser.jay: Handle static keyword on class like instance
1858         of StaticClass.
1859
1860         * driver.cs: Added "/langversion" command line switch with two
1861         options (iso-1, default).
1862
1863 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1864
1865         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1866
1867 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1868
1869         * delegate.cs: Style.
1870
1871 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1872
1873         * delegate.cs: Add seperate instance expr field for miguel.
1874
1875 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1876
1877         * PointerArithmetic (Resolve): make sure we are not doing
1878         pointer arith on void*. Also, make sure we are resolved
1879         by not setting eclass until resolve.
1880
1881         All callers: Make sure that PointerArithmetic gets resolved.
1882
1883 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1884
1885         * ArrayCreation (LookupType): If the type does not resolve 
1886         to an array, give an error.
1887
1888 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1889
1890         * statement.cs (Try.Resolve): Fixed bug #64222
1891
1892 2004-08-27  Martin Baulig  <martin@ximian.com>
1893
1894         * class.cs
1895         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1896         crash here.     
1897
1898 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1899
1900         * ecore.cs (Constantify): Get underlying type via
1901         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1902         Windows in special cases.
1903
1904 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1905
1906         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1907         for obtaining also private methods.
1908         (GetRemoveMethod): Used GetRemoveMethod (true)
1909         for obtaining also private methods.
1910
1911 2004-08-24  Martin Baulig  <martin@ximian.com>
1912
1913         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1914         MethodAttributes.HideBySig for operators.
1915
1916 2004-08-23  Martin Baulig  <martin@ximian.com>
1917
1918         Back to the old error reporting system :-)
1919
1920         * report.cs (Message): Removed.
1921         (Report.MessageData, ErrorData, WarningData): Removed.
1922         (Report.Error, Warning): Back to the old system.
1923
1924 2004-08-23  Martin Baulig  <martin@ximian.com>
1925
1926         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1927
1928         * class.cs (TypeContainer.ParentContainer): New public virtual
1929         method; replaces the explicit interface implementation.
1930         (ClassPart.ParentContainer): Override.
1931
1932 2004-08-23  Martin Baulig  <martin@ximian.com>
1933
1934         * statement.cs (Switch): Added support for constant switches; see
1935         #59428 or test-285.cs.
1936
1937 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1938
1939         Fixed bug #62740.
1940         * statement.cs (GetEnumeratorFilter): Removed useless
1941         logic because C# specs is strict. GetEnumerator must be
1942         public.
1943
1944 2004-08-22  Martin Baulig  <martin@ximian.com>
1945
1946         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1947         a switch and may break, reset the barrier.  Fixes #59867.
1948
1949 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1950
1951         CLS-Compliance speed up (~5% for corlib)
1952
1953         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1954         New method. Tests container for CLS-Compliant names
1955
1956         * class.cs (TypeContainer.VerifyClsName): New method.
1957         Checks whether container name is CLS Compliant.
1958         (Constructor): Implements IMethodData.
1959
1960         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1961         low-case table for CLS Compliance test.
1962         (MemberCache.VerifyClsParameterConflict): New method.
1963         Checks method parameters for CS3006 error.
1964
1965         * enum.cs (EnumMember): Is derived from MemberCore.
1966         (Enum.VerifyClsName): Optimized for better performance.
1967
1968 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1969
1970         * report.cs: Renamed Error_T to Error and changed all
1971         references.
1972
1973 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1974
1975         * class.cs (TypeContainer.IndexerArrayList): New inner class
1976         container for indexers.
1977         (TypeContainer.DefaultIndexerName): New constant for default
1978         indexer name. Replaced all "Item" with this constant.
1979         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1980
1981         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1982         DefaultMemberAttribute constructor.
1983
1984 2004-08-05  Martin Baulig  <martin@ximian.com>
1985
1986         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1987         Fix bug #59429.
1988
1989 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1990
1991         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1992         multi platforms problem.
1993
1994         * compiler.csproj: Included shared files.
1995
1996 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1997
1998         Fix bug 60333, 55971 in the more general way
1999         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2000         Added arg_type argument for constant conversion.
2001         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2002
2003 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2004
2005         Fix bug #59760
2006         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2007         OperatorArrayList, MethodCoreArrayList for typecontainer
2008         containers. Changed class member types to these new types.
2009         (MethodArrayList.DefineMembers): Added test for CS0659.
2010
2011 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2012
2013         * cfold.cs: Synchronize the folding with the code in expression.cs
2014         Binary.DoNumericPromotions for uint operands.
2015
2016         * attribute.cs: Revert patch from Raja, it introduced a regression
2017         while building Blam-1.2.1 (hard to isolate a test case).
2018
2019 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2020
2021         Fix for #55382
2022         * class.cs:
2023         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2024         name collision.
2025         (MethodCore.parent_method): New member. The method we're overriding
2026         if this is an override method.
2027         (MethodCore.CheckBase): Moved from Method class and made common.
2028         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2029         private.
2030         (MethodCore.CheckForDuplications): New abstract method. For custom
2031         member duplication search in a container
2032         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2033         method and its return type.
2034         (Event.conflict_symbol): New member. Symbol with same name in the
2035         parent class.
2036
2037         * decl.cs:
2038         (MemberCache.FindMemberWithSameName): New method. The method
2039         is looking for conflict with inherited symbols.
2040
2041 2004-08-04  Martin Baulig  <martin@ximian.com>
2042
2043         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2044
2045         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2046
2047 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2048
2049         * report.cs (Message): New enum for better error, warning reference in
2050         the code.
2051         (MessageData): New inner abstract class. It generally handles printing of
2052         error and warning messages.
2053         Removed unused Error, Warning, Message methods.
2054
2055 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2056
2057         Fix for cs0592-8.cs test
2058         * attribute.cs
2059         (Attributable.ValidAttributeTargets): Made public.
2060         (Attribute.ExplicitTarget): New member for explicit target value.
2061         (Attribute.CheckTargets): Now we translate explicit attribute
2062         target to Target here.
2063
2064 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2065
2066         * ecore.cs (MethodGroupExpr): new IsBase property.
2067
2068         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2069
2070         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2071         rather than an instance expr.
2072
2073         (DelegateCreation.Emit): Use the method group rather than
2074         the instance expression. Also, if you have base.Foo as the
2075         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2076
2077         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2078
2079         (NewDelegate.DoResolve): Only check for the existance of Invoke
2080         if the method is going to be needed. Use MethodGroupExpr.
2081
2082         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2083
2084         * expression.cs: For pointer arith., make sure to use
2085         the size of the type, not the size of the pointer to
2086         the type.
2087
2088 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2089
2090         Fix for #60722
2091         * class.cs (Class): Added error CS0502 test.
2092
2093 2004-08-03  John Luke  <jluke@cfl.rr.com>
2094             Raja R Harinath  <rharinath@novell.com>
2095
2096         Fix for #60997.
2097         * attribute.cs (Attribute.complained_before): New flag.
2098         (Attribute.ResolveType, Attribute.Resolve),
2099         (Attribute.DefinePInvokeMethod): Set it.
2100         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2101         
2102 2004-08-03  Martin Baulig  <martin@ximian.com>
2103
2104         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2105         use a user-defined operator; we still need to do numeric
2106         promotions in case one argument is a builtin type and the other
2107         one has an implicit conversion to that type.  Fixes #62322.
2108
2109 2004-08-02  Martin Baulig  <martin@ximian.com>
2110
2111         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2112         (LocalInfo.IsThis): New public property.
2113         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2114
2115 2004-08-01  Martin Baulig  <martin@ximian.com>
2116
2117         * class.cs (TypeContainer.GetClassBases): Don't set the default
2118         here since we may get called from GetPartialBases().
2119         (TypeContainer.DefineType): If GetClassBases() didn't return a
2120         parent, use the default one.
2121
2122 2004-07-30  Duncan Mak  <duncan@ximian.com>
2123
2124         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2125
2126 2004-07-30  Martin Baulig  <martin@ximian.com>
2127
2128         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2129
2130         * class.cs (SourceMethod): New public class, derive from the
2131         symbol writer's ISourceMethod.
2132         (Method): Use the new symbol writer API.
2133
2134         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2135         as argument and use the new symbol writer.
2136
2137         * location.cs
2138         (SourceFile): Implement the symbol writer's ISourceFile.
2139         (Location.SymbolDocument): Removed.
2140         (Location.SourceFile): New public property.
2141
2142         * symbolwriter.cs: Use the new symbol writer API.
2143
2144 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2145
2146         * Makefile (install-local): Remove.  Functionality moved to
2147         executable.make.
2148
2149 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2150
2151         * Makefile: Install mcs.exe.config file together with mcs.exe.
2152         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2153         correct runtime version.
2154         
2155 2004-07-25  Martin Baulig  <martin@ximian.com>
2156
2157         * class.cs
2158         (TypeContainer.RegisterOrder): Removed, this was unused.
2159         (TypeContainer, interface_order): Removed.
2160         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2161         TypeContainer as argument since we can also be called with a
2162         `PartialContainer' for a partial class/struct/interface.
2163         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2164         of checking whether we're an `Interface' - we could be a
2165         `PartialContainer'.
2166         (PartialContainer.Register): Override; call
2167         AddClass()/AddStruct()/AddInterface() on our parent.
2168
2169         * cs-parser.jay (interface_member_declaration): Add things to the
2170         `current_container', not the `current_class'.
2171
2172         * rootcontext.cs (RegisterOrder): The overloaded version which
2173         takes an `Interface' was unused, removed.
2174
2175         * typemanager.cs (TypeManager.LookupInterface): Return a
2176         `TypeContainer', not an `Interface'.
2177         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2178         contain a `PartialContainer' for an interface, so check it's
2179         `Kind' to figure out what it is.
2180
2181 2004-07-25  Martin Baulig  <martin@ximian.com>
2182
2183         * class.cs (Class.DefaultTypeAttributes): New public constant.
2184         (Struct.DefaultTypeAttributes): Likewise.
2185         (Interface.DefaultTypeAttributes): Likewise.
2186         (PartialContainer.TypeAttr): Override this and add the
2187         DefaultTypeAttributes.
2188
2189 2004-07-25  Martin Baulig  <martin@ximian.com>
2190
2191         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2192         we can just use the `Parent' field instead.
2193
2194 2004-07-25  Martin Baulig  <martin@ximian.com>
2195
2196         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2197
2198 2004-07-25  Martin Baulig  <martin@ximian.com>
2199
2200         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2201         our parts before defining any methods.
2202         (TypeContainer.VerifyImplements): Make this virtual.
2203         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2204         on our PartialContainer.
2205
2206 2004-07-25  Martin Baulig  <martin@ximian.com>
2207
2208         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2209
2210         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2211         argument, we can just use the `Parent' field instead.
2212
2213         * class.cs
2214         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2215         (MemberBase.DoDefine): Likewise.
2216
2217 2004-07-24  Martin Baulig  <martin@ximian.com>
2218
2219         * decl.cs (MemberCore.Parent): New public field.
2220         (DeclSpace.Parent): Moved to MemberCore.
2221
2222         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2223         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2224         parent's .ctor.
2225         (FieldBase, Field, Operator): Likewise.
2226         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2227         (EventField, Event): Likewise.
2228
2229 2004-07-23  Martin Baulig  <martin@ximian.com>
2230
2231         * class.cs (PartialContainer): New public class.
2232         (ClassPart): New public class.
2233         (TypeContainer): Added support for partial classes.
2234         (TypeContainer.GetClassBases): Splitted some of the functionality
2235         out into GetNormalBases() and GetPartialBases().
2236
2237         * cs-tokenizer.cs (Token.PARTIAL): New token.
2238         (Tokenizer.consume_identifier): Added some hacks to recognize
2239         `partial', but only if it's immediately followed by `class',
2240         `struct' or `interface'.
2241
2242         * cs-parser.jay: Added support for partial clases.
2243
2244 2004-07-23  Martin Baulig  <martin@ximian.com>
2245
2246         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2247         a `DeclSpace' and also made it readonly.
2248         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2249         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2250         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2251
2252         * cs-parser.jay: Pass the `current_class', not the
2253         `current_container' (at the moment, this is still the same thing)
2254         to a new Method, Property, Event, Indexer or Constructor.
2255
2256 2004-07-23  Martin Baulig  <martin@ximian.com>
2257
2258         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2259         and removed the `current_interface' one.
2260         (struct_declaration, class_declaration, interface_declaration):
2261         Set `current_class' to the newly created class/struct/interface;
2262         set their `Bases' and call Register() before parsing their body.
2263
2264 2004-07-23  Martin Baulig  <martin@ximian.com>
2265
2266         * class.cs (Kind): New public enum.
2267         (TypeContainer): Made this class abstract.
2268         (TypeContainer.Kind): New public readonly field.
2269         (TypeContainer.CheckDef): New public method; moved here from
2270         cs-parser.jay.
2271         (TypeContainer.Register): New public abstract method.
2272         (TypeContainer.GetPendingImplementations): New public abstract
2273         method.
2274         (TypeContainer.GetClassBases): Removed the `is_class' and
2275         `is_iface' parameters.
2276         (TypeContainer.DefineNestedTypes): Formerly known as
2277         DoDefineType().
2278         (ClassOrStruct): Made this class abstract.
2279
2280         * tree.cs (RootTypes): New public type. 
2281
2282 2004-07-20  Martin Baulig  <martin@ximian.com>
2283
2284         * tree.cs (Tree.RecordNamespace): Removed.
2285         (Tree.Namespaces): Removed.
2286
2287         * rootcontext.cs (RootContext.IsNamespace): Removed.
2288
2289         * cs-parser.jay (namespace_declaration): Just create a new
2290         NamespaceEntry here.
2291
2292 2004-07-20  Martin Baulig  <martin@ximian.com>
2293
2294         * statement.cs (ExceptionStatement): New abstract class.  This is
2295         now used as a base class for everyone who's using `finally'.
2296         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2297         our local variables before using them.
2298
2299         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2300         virtual method.  This is used by Yield.Resolve() to "steal" an
2301         outer block's `finally' clauses.
2302         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2303         argument.
2304
2305         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2306         version which takes an ExceptionStatement.  This version must be
2307         used to create exception branchings.
2308
2309         * iterator.cs
2310         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2311         (Iterator.EmitMoveNext): Added exception support; protect the
2312         block with a `fault' clause, properly handle 'finally' clauses.
2313         (Iterator.EmitDispose): Run all the `finally' clauses here.
2314
2315 2004-07-20  Martin Baulig  <martin@ximian.com>
2316
2317         * iterator.cs: This is the first of a set of changes in the
2318         iterator code.  Match the spec more closely: if we're an
2319         IEnumerable, then GetEnumerator() must be called.  The first time
2320         GetEnumerator() is called, it returns the current instance; all
2321         subsequent invocations (if any) must create a copy.
2322
2323 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2324
2325         * expression.cs: Resolve the constant expression before returning
2326         it. 
2327
2328 2004-07-19  Martin Baulig  <martin@ximian.com>
2329
2330         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2331         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2332         the return type of the new EmitContext.
2333
2334 2004-07-18  Martin Baulig  <martin@ximian.com>
2335
2336         * class.cs (Property.Define): Fix iterators.
2337
2338         * iterators.cs (Iterator.Define): Moved the
2339         `container.AddInterator (this)' call here from the .ctor; only do
2340         it if we resolved successfully.
2341
2342 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2343
2344         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2345         `true' for preprocessing directives that we parse.  The return
2346         value indicates whether we should return to regular tokenizing or
2347         not, not whether it was parsed successfully.
2348
2349         In the past if we were in: #if false ... #line #endif, we would
2350         resume parsing after `#line'.  See bug 61604.
2351
2352         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2353         building: IsEnumType should return true only for enums, not for
2354         enums or System.Enum itself.  This fixes #61593.
2355
2356         Likely what happened is that corlib was wrong: mcs depended on
2357         this bug in some places.  The bug got fixed, we had to add the
2358         hack, which caused bug 61593.
2359
2360         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2361         that was a workaround for the older conditions.
2362
2363 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2364
2365         * assign.cs: IAssignMethod has a new interface, as documented
2366         inline. All assignment code now uses this new api.
2367
2368         * ecore.cs, expression.cs: All classes which implement
2369         IAssignMethod now use the new interface.
2370
2371         * expression.cs (Invocation): add a hack to EmitCall so that
2372         IndexerAccess can be the target of a compound assignment without
2373         evaluating its arguments twice.
2374
2375         * statement.cs: Handle changes in Invocation api.
2376
2377 2004-07-16  Martin Baulig  <martin@ximian.com>
2378
2379         * iterators.cs: Rewrote this.  We're now using one single Proxy
2380         class for both the IEnumerable and the IEnumerator interface and
2381         `Iterator' derives from Class so we can use the high-level API.
2382
2383         * class.cs (TypeContainer.AddIterator): New method.
2384         (TypeContainer.DoDefineType): New protected virtual method, which
2385         is called from DefineType().
2386         (TypeContainer.DoDefineMembers): Call DefineType() and
2387         DefineMembers() on all our iterators.
2388         (TypeContainer.Emit): Call Emit() on all our iterators.
2389         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2390
2391         * codegen.cs (EmitContext.CurrentIterator): New public field.
2392
2393 2004-07-15  Martin Baulig  <martin@ximian.com>
2394
2395         * typemanager.cs
2396         (TypeManager.not_supported_exception_type): New type.   
2397
2398 2004-07-14  Martin Baulig  <martin@ximian.com>
2399
2400         * iterators.cs: Use real error numbers.
2401
2402 2004-07-14  Martin Baulig  <martin@ximian.com>
2403
2404         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2405         requires this to be a System.Collection.IEnumerable and not a
2406         class implementing that interface.
2407         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2408
2409 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2410
2411         * class.cs: Fixed previous fix, it broke some error tests.
2412
2413 2004-07-12  Martin Baulig  <martin@ximian.com>
2414
2415         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2416         Fixes #61293.
2417
2418 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2419
2420         * assign.cs (LocalTemporary): Add new argument: is_address,If
2421         `is_address' is true, then the value that we store is the address
2422         to the real value, and not the value itself.
2423         
2424         * ecore.cs (PropertyExpr): use the new local temporary
2425         stuff to allow us to handle X.Y += z (where X is a struct)
2426
2427 2004-07-08  Martin Baulig  <martin@ximian.com>
2428
2429         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2430         not always return, just like we're doing in Using.Resolve().
2431
2432 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2433
2434         * cs-parser.jay (fixed_statement): flag this as Pinned.
2435
2436 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2437
2438         * typemanager.cs (TypeManager): Removed MakePinned method, this
2439         mechanism is replaced with the .NET 2.x compatible mechanism of
2440         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2441
2442         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2443         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2444         `IsFixed' property which has a different meaning.
2445
2446 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2447
2448         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2449         visible from inside a nested class, not just the names of the
2450         immediately enclosing class.
2451         Fix for bug #60730.
2452
2453 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2454
2455         * expression.cs (BetterConversion): Remove buggy special-case
2456         handling of "implicit constant expression conversions".  At this
2457         point, we already know that the conversion is possible -- we're
2458         only checking to see which is better.
2459
2460 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2461
2462         * cs-parser.jay: Added error CS0210 test.
2463
2464 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2465
2466         * cs-parser.jay: Added error CS0134 test.
2467
2468 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2469
2470         Fix bug #52507
2471         * cs-parser.jay: Added error CS0145 test.
2472
2473 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2474
2475         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2476
2477 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2478         
2479         * expression.cs (StackAlloc.Resolve): The argument may not
2480         be a constant; deal with this case.
2481         
2482 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2483
2484         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2485         GetIndexerAttributeValue.
2486         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2487
2488         * class.cs (Indexer.Define): Added error tests for CS0415,
2489         CS0609.
2490
2491 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2492
2493         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2494         property code.
2495
2496 2004-06-23  Martin Baulig  <martin@ximian.com>
2497
2498         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2499         neither return nor throw, reset the barrier as well.  Fixes #60457.
2500
2501 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2502
2503         * class.cs : EventAttributes is now set to None by default.
2504           This fixes bug #60459.
2505
2506 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2507
2508         Fix bug #60219
2509         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2510         Don't throw exception but return null (it's sufficient now).
2511
2512 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2513
2514         * typemanager.cs (GetArgumentTypes): Faster implementation.
2515
2516 2004-06-18  Martin Baulig  <martin@ximian.com>
2517
2518         * attribute.cs (Attribute.Resolve): Check whether we're an
2519         EmptyCast which a Constant child.  Fixes #60333.
2520
2521 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2522
2523         * statement.cs (EmitCollectionForeach): Account for the fact that
2524         not all valuetypes are in areas which we can take the address of.
2525         For these variables, we store to a temporary variable. Also, make
2526         sure that we dont emit a `callvirt' on a valuetype method.
2527
2528 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2529
2530         * expression.cs (StackAlloc.DoReSolve): Added test for
2531         negative parameter (CS0247).
2532
2533 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2534
2535         Fix bug #59792
2536         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2537
2538 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2539
2540         Fix bug #59781
2541         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2542         ulong.
2543
2544 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2545
2546         Fix bug #58254 & cs1555.cs, cs1556.cs
2547         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2548
2549 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2550
2551         * cs-parser.jay: Added error CS1669 test for indexers.
2552
2553 2004-06-11  Martin Baulig  <martin@ximian.com>
2554
2555         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2556         call this twice: for params and varargs methods.
2557
2558 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2559
2560         * class.cs:
2561         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2562
2563 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2564
2565         * attribute.cs (Attribute.GetValidTargets): Made public.
2566
2567         * class.cs: 
2568         (AbstractPropertyEventMethod): New class for better code sharing.
2569         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2570         CS1667 report.
2571         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2572
2573 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2574
2575         Fix bug #59477.
2576         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2577         that the call to Resolve is part of a MemberAccess.
2578         (Expression.Resolve): Use it for SimpleName resolution.
2579         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2580         Add 'intermediate' boolean argument.
2581         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2582         error message when the SimpleName can be resolved ambiguously
2583         between an expression and a type.
2584         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2585         public.
2586         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2587         call on the left-side.
2588
2589 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2590
2591         * class.cs:
2592         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2593
2594 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2595
2596         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2597
2598 2004-06-11  Martin Baulig  <martin@ximian.com>
2599
2600         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2601         varargs methods if applicable.
2602
2603 2004-06-11  Martin Baulig  <martin@ximian.com>
2604
2605         * expression.cs (Invocation.EmitCall): Don't use
2606         `method.CallingConvention == CallingConventions.VarArgs' since the
2607         method could also have `CallingConventions.HasThis'.
2608
2609 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2610
2611         * class.cs (Event.GetSignatureForError): Implemented.
2612         Fixed crash in error test cs3010.cs
2613
2614 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2615
2616         * cs-tokenizer.cs: Change the way we track __arglist to be
2617         consistent with the other keywords.
2618
2619 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2620
2621         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2622         tomorrow.
2623
2624 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2625
2626         * codegen.cs: Check that all referenced assemblies have a strongname
2627         before strongnaming the compiled assembly. If not report error CS1577.
2628         Fix bug #56563. Patch by Jackson Harper.
2629         * typemanager.cs: Added a method to return all referenced assemblies.
2630         Fix bug #56563. Patch by Jackson Harper.
2631
2632 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2633
2634         * class.cs:
2635         (Method.ApplyAttributeBuilder): Moved and added conditional
2636         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2637
2638         * delegate.cs:
2639         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2640
2641 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2642
2643         Fixed #59640
2644         * class.cs: (EventField.attribute_targets): Changed default target.
2645
2646 2004-06-08  Martin Baulig  <martin@ximian.com>
2647
2648         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2649
2650 2004-06-08  Martin Baulig  <martin@ximian.com>
2651
2652         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2653
2654 2004-06-07  Martin Baulig  <martin@ximian.com>
2655
2656         Added support for varargs methods.
2657
2658         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2659         keyword.
2660
2661         * cs-parser.jay: Added support for `__arglist'.
2662
2663         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2664
2665         * expression.cs (Argument.AType): Added `ArgList'.
2666         (Invocation): Added support for varargs methods.
2667         (ArglistAccess): New public class.
2668         (Arglist): New public class.
2669
2670         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2671
2672         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2673         a method's top-level block if the method has varargs.
2674
2675         * support.cs (ReflectionParameters, InternalParameters): Added
2676         support for varargs methods.    
2677
2678 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2679
2680         * class.cs: Provide location in indexer error report.
2681
2682         * driver.cs: Use standard names.
2683
2684         * namespace.cs: Catch the use of using after a namespace has been
2685         declared also on using aliases.
2686
2687 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2688
2689         Bug #50820.
2690         * typemanager.cs (closure_private_ok, closure_invocation_type)
2691         (closure_qualifier_type, closure_invocation_assembly)
2692         (FilterWithClosure): Move to ...
2693         (Closure): New internal nested class.
2694         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2695         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2696         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2697         (MemberLookup, MemberLookupFailed): Use it.
2698         * expression.cs (New.DoResolve): Treat the lookup for the
2699         constructor as being qualified by the 'new'ed type.
2700         (Indexers.GetIndexersForTypeOrInterface): Update.
2701
2702 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2703
2704         * attribute.cs
2705         (GetConditionalAttributeValue): New method. Returns
2706         condition of ConditionalAttribute.
2707         (SearchMulti): New method.  Returns all attributes of type 't'.
2708         Use it when attribute is AllowMultiple = true.
2709         (IsConditionalMethodExcluded): New method.
2710
2711         * class.cs
2712         (Method.IsExcluded): Implemented. Returns true if method has conditional
2713         attribute and the conditions is not defined (method is excluded).
2714         (IMethodData): Extended interface for ConditionalAttribute support.
2715         (PropertyMethod.IsExcluded): Implemented.
2716
2717         * decl.cs
2718         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2719
2720         * expression.cs
2721         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2722         on the method.
2723
2724 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2725
2726         * expression.cs (ArrayCreationExpression): Make this just an
2727         `expression'. It can't be a statement, so the code here was
2728         dead.
2729
2730 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2731
2732         Fixed #59072
2733         * typemanager.cs (GetFullNameSignature): New method for
2734         MethodBase types.
2735
2736 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2737
2738         Fixed #56452
2739         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2740         Use this method when MethodBuilder is null.
2741         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2742         Added test for error CS0626 (MONO reports error for this situation).
2743         (IMethodData.GetSignatureForError): Extended interface.
2744
2745 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2746
2747         * attribute.cs
2748         (AttributeTester.GetObsoleteAttribute): Returns instance of
2749         ObsoleteAttribute when type is obsolete.
2750
2751         * class.cs
2752         (TypeContainer.VerifyObsoleteAttribute): Override.
2753         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2754         (MethodCode.VerifyObsoleteAttribute): Override.
2755         (MemberBase.VerifyObsoleteAttribute): Override.
2756
2757         * decl.cs
2758         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2759         and report proper error.
2760
2761         *delegate.cs
2762         Delegate.VerifyObsoleteAttribute): Override.
2763
2764         * ecore.cs
2765         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2766         and report proper error.
2767         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2768
2769         * enum.cs
2770         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2771         and enum member.
2772
2773         * expression.cs
2774         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2775         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2776         Added test for ObsoleteAttribute.
2777
2778         * statement.cs
2779         (Catch): Derived from Statement.
2780
2781 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2782  
2783         Fixed bug #59071 & cs0160.cs
2784  
2785         * statement.cs (Try.Resolve): Check here whether order of catch
2786         clauses matches their dependencies.
2787
2788 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2789
2790         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2791         caused a regression: #59343.  Referencing nested classes from an
2792         assembly stopped working.
2793
2794 2004-05-31  Martin Baulig  <martin@ximian.com>
2795
2796         MCS is now frozen for beta 2.
2797
2798 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2799
2800         * convert.cs: add a trivial cache for overload operator resolution.
2801
2802 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2803
2804         * decl.cs: If possible, use lookuptypedirect here. We can only do
2805         this if there is no `.' after the namespace. Avoids using
2806         LookupType, which does lots of slow processing.
2807         (FindNestedType) New method, does what it says :-).
2808         * namespace.cs: use LookupTypeDirect.
2809         * rootcontext.cs: use membercache, if possible.
2810         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2811
2812 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2813
2814         * expression.cs:
2815         According to the spec, 
2816
2817         In a member access of the form E.I, if E is a single identifier,
2818         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2819         field, property, localvariable, or parameter with the same type as
2820         the meaning of E as a type-name (§3.8), then both possible
2821         meanings of E are permitted.
2822
2823         We did not check that E as a simple-name had the same type as E as
2824         a type name.
2825
2826         This trivial check gives us 5-7% on bootstrap time.
2827
2828 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2829
2830         * expression.cs (Invocation.OverloadResolve): Avoid the
2831         use of hashtables and boxing here by allocating on demand.
2832
2833 2004-05-30  Martin Baulig  <martin@ximian.com>
2834
2835         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2836         we're doing a silent lookup.  Don't try to lookup nested types in
2837         TypeManager.object_type (thanks to Ben Maurer).
2838
2839 2004-05-30  Martin Baulig  <martin@ximian.com>
2840
2841         Committing a patch from Ben Maurer.
2842
2843         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2844
2845 2004-05-29  Martin Baulig  <martin@ximian.com>
2846
2847         * class.cs (IMethodData.ShouldIgnore): New method.
2848
2849         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2850         `Location' argument, we don't need it anywhere.  Use
2851         `IMethodData.ShouldIgnore ()' instead of
2852         `MethodData.GetMethodFlags ()'.
2853         (TypeManager.AddMethod): Removed.
2854         (TypeManager.AddMethod2): Renamed to AddMethod.
2855
2856 2004-05-29  Martin Baulig  <martin@ximian.com>
2857
2858         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2859
2860         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2861         converting from a class type S to an interface type and we already
2862         have an object on the stack, don't box it again.  Fixes #52578.
2863
2864 2004-05-29  Martin Baulig  <martin@ximian.com>
2865
2866         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2867         Added support for `params' parameters.  Fixes #59267.
2868
2869 2004-05-29  Martin Baulig  <martin@ximian.com>
2870
2871         * literal.cs (NullPointer): Provide a private .ctor which sets
2872         `type' to TypeManager.object_type.  Fixes #59048.
2873
2874 2004-05-29  Martin Baulig  <martin@ximian.com>
2875
2876         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2877         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2878
2879         * ecore.cs (EventExpr.instance_expr): Make the field private.
2880
2881 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2882
2883         Fixed bug #50080 & cs0214-2.cs
2884         * expression.cs (Cast.DoResolve): Check unsafe context here.
2885         
2886         * statement.cs (Resolve.DoResolve): Likewise.
2887
2888 2004-05-26  Martin Baulig  <martin@ximian.com>
2889
2890         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2891
2892         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2893         (RootContext.LookupType): Pass down the `silent' flag.
2894
2895 2004-05-25  Martin Baulig  <martin@ximian.com>
2896
2897         * expression.cs
2898         (MethodGroupExpr.IdenticalTypeName): New public property.
2899         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2900         expression actually refers to a type.
2901
2902 2004-05-25  Martin Baulig  <martin@ximian.com>
2903
2904         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2905         for #56176 and made it actually work.
2906
2907 2004-05-25  Martin Baulig  <martin@ximian.com>
2908
2909         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2910         (FieldExpr, PropertyExpr): Override and implement
2911         CacheTemporaries.  Fixes #52279.
2912
2913 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2914
2915         * location.cs: In the new compiler listing a file twice is a
2916         warning, not an error.
2917
2918 2004-05-24  Martin Baulig  <martin@ximian.com>
2919
2920         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2921         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2922
2923 2004-05-24  Martin Baulig  <martin@ximian.com>
2924
2925         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2926         walking the `using' list.  Fixes #53921.
2927
2928 2004-05-24  Martin Baulig  <martin@ximian.com>
2929
2930         * const.cs (Const.LookupConstantValue): Added support for
2931         EmptyCast's; fixes #55251.
2932
2933 2004-05-24  Martin Baulig  <martin@ximian.com>
2934
2935         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2936         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2937         which does the CS0135 check.  The reason is that we first need to
2938         check whether the variable actually exists.
2939
2940 2004-05-24  Martin Baulig  <martin@ximian.com>
2941
2942         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2943         than RootContext.LookupType() to find the explicit interface
2944         type.  Fixes #58584.
2945
2946 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2947
2948         * Makefile: Simplify.  Use executable.make.
2949         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2950
2951 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2952
2953         * decl.cs:
2954         * enum.cs:
2955         Use the invariant culture when doing String.Compare for CLS case
2956         sensitivity.
2957         
2958 2004-05-23  Martin Baulig  <martin@ximian.com>
2959
2960         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2961         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2962
2963         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2964         
2965 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2966
2967         * class.cs (MemberBase.Define): Reuse MemberType member for 
2968         resolved type. Other methods can use it too.
2969
2970 2004-05-23  Martin Baulig  <martin@ximian.com>
2971
2972         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2973         the variable also exists in the current block (otherwise, we need
2974         to report a CS0103).  Fixes #58670.
2975
2976 2004-05-23  Martin Baulig  <martin@ximian.com>
2977
2978         * flowanalysis.cs (Reachability.Reachable): Compute this
2979         on-the-fly rather than storing it as a field.
2980
2981 2004-05-23  Martin Baulig  <martin@ximian.com>
2982
2983         * flowanalysis.cs (Reachability.And): Manually compute the
2984         resulting `barrier' from the reachability.      
2985        
2986 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2987
2988         Fix bug #57835
2989         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2990         instance of ObsoleteAttribute when symbol is obsolete.
2991
2992         * class.cs
2993         (IMethodData): Extended interface for ObsoleteAttribute support.
2994
2995 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2996
2997         * attribute.cs: Fix bug #55970
2998
2999 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3000
3001         Fix bug #52705
3002         * attribute.cs
3003         (GetObsoleteAttribute): New method. Creates the instance of
3004         ObsoleteAttribute.
3005         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3006         ObsoleteAttribute when member is obsolete.
3007         (AttributeTester.Report_ObsoleteMessage): Common method for
3008         Obsolete error/warning reporting.
3009
3010         * class.cs
3011         (TypeContainer.base_classs_type): New member for storing parent type.
3012
3013         * decl.cs
3014         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3015         for this MemberCore.
3016
3017 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3018
3019         * attribute.cs, const.cs: Fix bug #58590
3020
3021 2004-05-21  Martin Baulig  <martin@ximian.com>
3022
3023         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3024         out parameters if the end of the method is unreachable.  Fixes
3025         #58098. 
3026
3027 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3028
3029         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3030         Hari was right, why extra method.
3031
3032 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3033
3034         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3035
3036 2004-05-20  Martin Baulig  <martin@ximian.com>
3037
3038         Merged this back from gmcs to keep the differences to a minumum.
3039
3040         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
3041         instead of a Declspace.
3042         (Attribute.ResolveType): Likewise.
3043         (Attributes.Search): Likewise.
3044         (Attributes.Contains): Likewise.
3045         (Attributes.GetClsCompliantAttribute): Likewise.
3046
3047         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
3048         argument.
3049         (MethodData.ApplyAttributes): Take an EmitContext instead of a
3050         DeclSpace.
3051
3052 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3053
3054         Fix bug #58688 (MCS does not report error when the same attribute
3055         is assigned twice)
3056
3057         * attribute.cs (Attribute.Emit): Distinction between null and default.
3058
3059 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3060
3061         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3062         of a top-level attribute without an attribute target.
3063         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3064         Make non-static.
3065         (Attribute.Conditional_GetConditionName), 
3066         (Attribute.Obsolete_GetObsoleteMessage): Update.
3067         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3068         part of ScanForIndexerName.
3069         (Attribute.CanIgnoreInvalidAttribute): New function.
3070         (Attribute.ScanForIndexerName): Move to ...
3071         (Attributes.ScanForIndexerName): ... here.
3072         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3073         (Attributes.Search): New internal variant that can choose not to
3074         complain if types aren't resolved.  The original signature now
3075         complains.
3076         (Attributes.GetClsCompliantAttribute): Use internal variant, with
3077         complaints suppressed.
3078         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3079         only if it not useful.
3080         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3081         top-level for attributes that are shared between the assembly
3082         and a top-level class.
3083         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3084         * class.cs: Update to reflect changes.
3085         (DefineIndexers): Fuse loops.
3086         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3087         a couple more variants of attribute names.
3088
3089 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3090
3091         Fix bug #52585 (Implemented explicit attribute declaration)
3092
3093         * attribute.cs:
3094         (Attributable.ValidAttributeTargets): New abstract method. It gets
3095         list of valid attribute targets for explicit target declaration.
3096         (Attribute.Target): It holds target itself.
3097         (AttributeSection): Removed.
3098         (Attribute.CheckTargets): New method. It checks whether attribute
3099         target is valid for the current element.
3100
3101         * class.cs:
3102         (EventProperty): New class. For events that are declared like
3103         property (with add and remove accessors).
3104         (EventField): New class. For events that are declared like field.
3105         class.cs
3106
3107         * cs-parser.jay: Implemented explicit attribute target declaration.
3108
3109         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3110         Override ValidAttributeTargets.
3111
3112         * parameter.cs:
3113         (ReturnParameter): Class for applying custom attributes on 
3114         the return type.
3115         (ParameterAtribute): New class. Class for applying custom
3116         attributes on the parameter type.
3117
3118 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3119
3120         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3121         definitions. 
3122
3123         (Method): Allow UNSAFE here.
3124
3125         * modifiers.cs: Support unsafe reporting.
3126
3127 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3128
3129         * decl.cs: Fix bug #58478.
3130
3131 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3132
3133         * statement.cs: When checking for unreachable code on an EmptyStatement,
3134         set the location. Fixes bug #58488.
3135
3136 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3137
3138         * driver.cs: Add -pkg handling.
3139
3140         From Gonzalo: UseShelLExecute=false
3141
3142 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3143
3144         * attribute.cs:
3145         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3146         for attribute.
3147         (Attribute.IsClsCompliaceRequired): Moved to base for better
3148         accesibility.
3149         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3150         when attribute is AttributeUsageAttribute.
3151         (Attribute.GetValidTargets): Simplified.
3152         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3153         attribute for this type.
3154         (Attribute.ApplyAttributes): Method renamed to Emit and make
3155         non-static.
3156         (GlobalAttributeSection): New class for special handling of global
3157         attributes (assembly, module).
3158         (AttributeSection.Emit): New method.
3159
3160         * class.cs: Implemented Attributable abstract methods.
3161         (MethodCore.LabelParameters): Moved to Parameter class.
3162         (Accessor): Is back simple class.
3163         (PropertyMethod): Implemented Attributable abstract class.
3164         (DelegateMethod): Implemented Attributable abstract class.
3165         (Event): New constructor for disctintion between normal Event
3166         and Event with accessors.
3167
3168         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3169
3170         * codegen.cs, const.cs, decl.cs, delegate.cs:
3171         (CommonAssemblyModulClass): Implemented Attributable abstract class
3172         and simplified.
3173
3174         * enum.cs: Implement IAttributeSupport interface.
3175         (EnumMember): New class for emum members. Implemented Attributable
3176         abstract class
3177
3178         * parameter.cs:
3179         (ParameterBase): Is abstract.
3180         (ReturnParameter): New class for easier [return:] attribute handling.
3181
3182         * typemanager.cs: Removed builder_to_attr.
3183
3184 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3185
3186         Fix bug #57151.
3187         * attribute.cs (Attribute.GetPositionalValue): New function.
3188         * class.cs (TypeContainer.VerifyMembers): New function.
3189         (TypeContainer.Emit): Use it.
3190         (ClassOrStruct): New base class for Class and Struct.
3191         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3192         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3193         class.
3194         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3195         then each non-static field should have a FieldOffset attribute.
3196         Otherwise, none of the fields should have a FieldOffset attribute.
3197         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3198         and FieldOffset attributes.
3199         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3200         (TypeManager.field_offset_attribute_type): New core types.
3201         (TypeManager.InitCoreTypes): Initialize them.
3202
3203 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3204
3205         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3206         Return correct type.
3207         From bug #58270.
3208
3209 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3210
3211         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3212         be implicitly converted to ulong.
3213         
3214         * expression.cs: The logic for allowing operator &, | and ^ worked
3215         was wrong, it worked before because we did not report an error in
3216         an else branch.  Fixes 57895.
3217
3218         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3219         allow volatile fields to be reference types.
3220
3221 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3222
3223         * driver.cs: Add support for /debug-
3224
3225 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3226
3227         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3228         Add a 'complain' parameter to silence errors.
3229         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3230         silently overlooked type-resolutions.
3231         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3232         to reflect changes.
3233         (Attributes.Search): New function.
3234         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3235         (Attributes.GetAttributeFullName): Remove hack.
3236         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3237         Update to reflect changes.
3238         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3239         Use Attributes.Search instead of nested loops.
3240
3241 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3242
3243         * decl.cs:
3244         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3245         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3246         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3247
3248         * report.cs: (Report.Warning): Renamed to Warning_T because of
3249         parameter collision.
3250
3251 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3252
3253         * expression.cs (MemberAccess.ResolveMemberAccess):
3254         Exit with non-zero status after Report.Error.
3255         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3256         Likewise.
3257         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3258
3259 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3260
3261         * support.cs: Don't hang when the file is empty.
3262
3263 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3264
3265         * support.cs: In SeekableStreamReader, compute the preamble size of the
3266           underlying stream. Position changes should take into account that initial
3267           count of bytes.
3268
3269 2004-05-03  Todd Berman  <tberman@sevenl.net>
3270
3271         * driver.cs: remove unused GetSysVersion function.
3272
3273 2004-05-03  Todd Berman  <tberman@sevenl.net>
3274
3275         * driver.cs: Remove the hack from saturday, as well as the hack
3276         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3277         link_paths to get that bit proper.
3278
3279 2004-05-01  Todd Berman  <tberman@sevenl.net>
3280
3281         * driver.cs: Try a LoadFrom before a Load, this checks the current
3282         path. This is currently a bug in mono that is be fixed, however, this
3283         provides a workaround for now. This will be removed when the bug
3284         is fixed.
3285
3286 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3287
3288         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3289         incomplete key pairs (#57941).
3290
3291 2004-05-01  Todd Berman  <tberman@sevenl.net>
3292
3293         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3294         from the GAC
3295
3296 2004-04-30  Jackson Harper  <jackson@ximian.com>
3297
3298         * codegen.cs: Open keys readonly.
3299         
3300 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3301
3302         * typemanager.cs: don't report cyclic struct layout when a struct
3303         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3304         which has 2 Pango.Rectangle fields.
3305
3306 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3307
3308         * expression.cs: Handle IntPtr comparisons with IL code
3309         rather than a method call.
3310
3311 2004-04-29  Martin Baulig  <martin@ximian.com>
3312
3313         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3314         the list of PropertyInfo's in class hierarchy and find the
3315         accessor.  Fixes #56013.
3316
3317 2004-04-29  Martin Baulig  <martin@ximian.com>
3318
3319         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3320
3321 2004-04-29  Martin Baulig  <martin@ximian.com>
3322
3323         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3324
3325         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3326
3327 2004-04-29  Martin Baulig  <martin@ximian.com>
3328
3329         * class.cs (ConstructorInitializer.Resolve): Check whether the
3330         parent .ctor is accessible.  Fixes #52146.
3331
3332 2004-04-29  Martin Baulig  <martin@ximian.com>
3333
3334         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3335
3336         * statement.cs (Using.EmitLocalVariableDecls): Use
3337         TypeManager.idisposable_type, not typeof (IDisposable).
3338         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3339
3340 2004-04-29  Martin Baulig  <martin@ximian.com>
3341
3342         * class.cs (Event.Define): Don't emit the field and don't set
3343         RTSpecialName and SpecialName for events on interfaces.  Fixes
3344         #57703. 
3345
3346 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3347
3348         Refactor Attribute.ApplyAttributes.
3349         * attribute.cs (Attributable): New base class for objects that can
3350         have Attributes applied on them.
3351         (Attribute): Make AttributeUsage fields public.
3352         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3353         (Attribute.IsInternalCall): New property.
3354         (Attribute.UsageAttr): Convert to a public read-only property.
3355         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3356         (Attribute.ResolveType, Attribute.Resolve)
3357         (Attribute.ScanForIndexerName): Update to reflect changes.
3358         (Attribute.CheckAttributeTarget): Re-format.
3359         (Attribute.ApplyAttributes): Refactor, to various
3360         Attributable.ApplyAttributeBuilder methods.
3361         * decl.cs (MemberCore): Make Attributable.
3362         * class.cs (Accessor): Make Attributable.
3363         (MethodData.ApplyAttributes): Use proper attribute types, not
3364         attribute names.
3365         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3366         (TypeContainer.ApplyAttributeBuilder)
3367         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3368         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3369         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3370         (Operator.ApplyAttributeBuilder): New factored-out methods.
3371         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3372         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3373         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3374         * parameter.cs (ParameterBase): New Attributable base class
3375         that can also represent Return types.
3376         (Parameter): Update to the changes.
3377
3378 2004-04-29  Jackson Harper  <jackson@ximian.com>
3379
3380         * driver.cs: Prefer the corlib system version when looking for
3381         assemblies in the GAC. This is still a hack, but its a better hack
3382         now.
3383         
3384 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3385
3386         * decl.cs, enum.cs: Improved error 3005 reporting.
3387   
3388         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3389         (related_symbols): New private member for list of symbols
3390         related to reported error/warning.
3391         
3392         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3393
3394 2004-04-29  Martin Baulig  <martin@ximian.com>
3395
3396         * ecore.cs (Expression.Constantify): If we're an enum and
3397         TypeManager.TypeToCoreType() doesn't give us another type, use
3398         t.UnderlyingSystemType.  Fixes #56178.  
3399
3400 2004-04-29  Martin Baulig  <martin@ximian.com>
3401
3402         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3403         interfaces and for each interface, only add members directly
3404         declared in that interface.  Fixes #53255.
3405
3406 2004-04-28  Martin Baulig  <martin@ximian.com>
3407
3408         * expression.cs (ConditionalLogicalOperator): Use a temporary
3409         variable for `left' to avoid that we evaluate it more than once;
3410         bug #52588.
3411
3412 2004-04-28  Martin Baulig  <martin@ximian.com>
3413
3414         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3415         `void[]' (CS1547).
3416
3417 2004-04-28  Martin Baulig  <martin@ximian.com>
3418
3419         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3420         void (CS1547).
3421
3422         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3423         whether the type is not void (CS1547).
3424
3425 2004-04-28  Martin Baulig  <martin@ximian.com>
3426
3427         * expression.cs (Unary.DoResolveLValue): Override this and report
3428         CS0131 for anything but Operator.Indirection.
3429
3430 2004-04-28  Martin Baulig  <martin@ximian.com>
3431
3432         Committing a patch from Ben Maurer; see bug #50820.
3433
3434         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3435         check for classes.
3436
3437         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3438         classes.        
3439
3440 2004-04-28  Martin Baulig  <martin@ximian.com>
3441
3442         Committing a patch from Ben Maurer; see bug #50820.
3443
3444         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3445         check for classes.
3446
3447         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3448         classes.        
3449
3450 2004-04-28  Martin Baulig  <martin@ximian.com>
3451
3452         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3453         (Block.AddLabel): Call DoLookupLabel() to only search in the
3454         current block.
3455
3456 2004-04-28  Martin Baulig  <martin@ximian.com>
3457
3458         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3459         comparing StringConstants and NullLiterals in Equality and Inequality.
3460
3461 2004-04-28  Jackson Harper  <jackson@ximian.com>
3462
3463         * driver.cs: Attempt to load referenced assemblies from the
3464         GAC. This is the quick and dirty version of this method that
3465         doesnt take into account versions and just takes the first
3466         canidate found. Will be good enough for now as we will not have more
3467         then one version installed into the GAC until I update this method.
3468
3469 2004-04-28  Martin Baulig  <martin@ximian.com>
3470
3471         * typemanager.cs (TypeManager.CheckStructCycles): New public
3472         static method to check for cycles in the struct layout.
3473
3474         * rootcontext.cs (RootContext.PopulateTypes): Call
3475         TypeManager.CheckStructCycles() for each TypeContainer.
3476         [Note: We only need to visit each type once.]
3477
3478 2004-04-28  Martin Baulig  <martin@ximian.com>
3479
3480         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3481
3482         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3483         success and added `out object value'.  Use a `bool resolved' field
3484         to check whether we've already been called rather than
3485         `ConstantValue != null' since this breaks for NullLiterals.
3486
3487 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3488
3489         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3490         setting of this flag, since the 'set' method may be non-public.
3491
3492 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3493
3494         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3495         check on current_vector.Block.
3496
3497 2004-04-27  Martin Baulig  <martin@ximian.com>
3498
3499         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3500         a field initializer.  Fixes #56459.
3501
3502 2004-04-27  Martin Baulig  <martin@ximian.com>
3503
3504         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3505         we're not attempting to use an indexer.  Fixes #52154.
3506
3507 2004-04-27  Martin Baulig  <martin@ximian.com>
3508
3509         * statement.cs (Return): Don't create a return label if we don't
3510         need it; reverts my change from January 20th.  Thanks to Ben
3511         Maurer for this.
3512
3513 2004-04-27  Martin Baulig  <martin@ximian.com>
3514
3515         According to the spec, `goto' can only leave a nested scope, but
3516         never enter it.
3517
3518         * statement.cs (Block.LookupLabel): Only lookup in the current
3519         block, don't recurse into parent or child blocks.
3520         (Block.AddLabel): Check in parent and child blocks, report
3521         CS0140/CS0158 if we find a duplicate.
3522         (Block): Removed this indexer for label lookups.
3523         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3524         this already does the error reporting for us.
3525
3526         * flowanalysis.cs
3527         (FlowBranching.UsageVector.Block): New public variable; may be null.
3528         (FlowBranching.CreateSibling): Added `Block' argument.
3529         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3530         label for the target of a `goto' and check whether we're not
3531         leaving a `finally'.
3532
3533 2004-04-27  Martin Baulig  <martin@ximian.com>
3534
3535         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3536         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3537         just for returns).
3538
3539 2004-04-27  Martin Baulig  <martin@ximian.com>
3540
3541         * statement.cs (Block.AddLabel): Also check for implicit blocks
3542         and added a CS0158 check.
3543
3544 2004-04-27  Martin Baulig  <martin@ximian.com>
3545
3546         * flowanalysis.cs (FlowBranchingLoop): New class.
3547         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3548         UsageVector's instead of an ArrayList.
3549         (FlowBranching.Label): Likewise.
3550         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3551         (FlowBranching.AddBreakVector): New method.
3552
3553 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3554
3555         * attribute.cs: Small regression fix: only convert the type if we
3556         the type is different, fixes System.Drawing build.
3557
3558 2004-04-27  Martin Baulig  <martin@ximian.com>
3559
3560         * attribute.cs (Attribute.Resolve): If we have a constant value
3561         for a named field or property, implicity convert it to the correct
3562         type.
3563
3564 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3565
3566         * statement.cs (Block.Block): Implicit blocks share
3567         'child_variable_names' fields with parent blocks.
3568         (Block.AddChildVariableNames): Remove.
3569         (Block.AddVariable): Mark variable as "used by a child block" in
3570         every surrounding block.
3571         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3572         been used in a child block, complain about violation of "Invariant
3573         meaning in blocks" rule.
3574         * cs-parser.jay (declare_local_variables): Don't use
3575         AddChildVariableNames.
3576         (foreach_statement): Don't create an implicit block: 'foreach'
3577         introduces a scope.
3578
3579 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3580
3581         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3582         converting from 0L to ulong.  Fixes 57522.
3583
3584 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3585
3586         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3587         derived class hides via 'new' keyword field from base class (test-242.cs).
3588         TODO: Handle this in the more general way.
3589         
3590         * class.cs (CheckBase): Ditto.
3591
3592 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3593
3594         * decl.cs (caching_flags): New member for storing cached values
3595         as bit flags.
3596         (MemberCore.Flags): New enum where bit flags for caching_flags
3597         are defined.
3598         (MemberCore.cls_compliance): Moved to caching_flags.
3599         (DeclSpace.Created): Moved to caching_flags.
3600
3601         * class.cs: Use caching_flags instead of DeclSpace.Created
3602         
3603 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3604
3605         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3606         if we are only a derived class, not a nested class.
3607
3608         * typemanager.cs: Same as above, but do this at the MemberLookup
3609         level (used by field and methods, properties are handled in
3610         PropertyExpr).   Allow for the qualified access if we are a nested
3611         method. 
3612
3613 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3614
3615         * class.cs: Refactoring.
3616         (IMethodData): New inteface; Holds links to parent members
3617         to avoid member duplication (reduced memory allocation).
3618         (Method): Implemented IMethodData interface.
3619         (PropertyBase): New inner classes for get/set methods.
3620         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3621         (Event): New inner classes for add/remove methods.
3622         (Event.DelegateMethod): Implemented IMethodData interface.
3623
3624         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3625         EmitContext (related to class.cs refactoring).
3626
3627 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3628
3629         * delegate.cs (Delegate.VerifyApplicability): If the number of
3630         arguments are the same as the number of parameters, first try to
3631         verify applicability ignoring  any 'params' modifier on the last
3632         parameter.
3633         Fixes #56442.
3634
3635 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3636
3637         * class.cs (TypeContainer.AddIndexer): Use
3638         'ExplicitInterfaceName' to determine if interface name was
3639         explicitly specified.  'InterfaceType' is not initialized at this time.
3640         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3641         Indexers array is already in the required order.  Initialize
3642         'IndexerName' only if there are normal indexers.
3643         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3644         (TypeContainer.Emit): Emit DefaultMember attribute only if
3645         IndexerName is initialized.
3646         Fixes #56300.
3647
3648 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3649
3650         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3651         Fixes #57007
3652
3653 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3654
3655         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3656         attributes.
3657         Fix for #56456.
3658
3659         * attribute.cs (Attribute.Resolve): Check for duplicate named
3660         attributes.
3661         Fix for #56463.
3662
3663 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3664
3665         * iterators.cs (MarkYield): track whether we are in an exception,
3666         and generate code accordingly.  Use a temporary value to store the
3667         result for our state.
3668
3669         I had ignored a bit the interaction of try/catch with iterators
3670         since their behavior was not entirely obvious, but now it is
3671         possible to verify that our behavior is the same as MS .NET 2.0
3672
3673         Fixes 54814
3674
3675 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3676
3677         * iterators.cs: Avoid creating temporaries if there is no work to
3678         do. 
3679
3680         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3681         Enumerations, use TypeManager.EnumToUnderlying and call
3682         recursively. 
3683
3684         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3685         bug #57013
3686
3687         (This.Emit): Use EmitContext.EmitThis to emit our
3688         instance variable.
3689
3690         (This.EmitAssign): Ditto.
3691
3692         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3693         codepaths, we will move all the functionality into
3694         Mono.CSharp.This 
3695
3696         (FieldExpr.EmitAssign): Ditto.
3697
3698         This fixes several hidden bugs that I uncovered while doing a code
3699         review of this today.
3700
3701         * codegen.cs (EmitThis): reworked so the semantics are more clear
3702         and also support value types "this" instances.
3703
3704         * iterators.cs: Changed so that for iterators in value types, we
3705         do not pass the value type as a parameter.  
3706
3707         Initialization of the enumerator helpers is now done in the caller
3708         instead of passing the parameters to the constructors and having
3709         the constructor set the fields.
3710
3711         The fields have now `assembly' visibility instead of private.
3712
3713 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3714
3715         * expression.cs (Argument.Resolve): Check if fields passed as ref
3716         or out are contained in a MarshalByRefObject.
3717
3718         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3719         another compiler type.
3720
3721 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3722
3723         * class.cs (Indexer.Define): use the new name checking method.
3724         Also, return false on an error.
3725         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3726         (is_identifier_[start/part]_character): make static.
3727
3728 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3729
3730         * expression.cs (Binary.ResolveOperator): Do no append strings
3731         twice: since we can be invoked more than once (array evaluation)
3732         on the same concatenation, take care of this here.  Based on a fix
3733         from Ben (bug #56454)
3734
3735 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3736
3737         * codegen.cs: Fix another case where CS1548 must be reported (when 
3738         delay-sign isn't specified and no private is available #56564). Fix
3739         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3740         error when MCS is used on the MS runtime and we need to delay-sign 
3741         (which seems unsupported by AssemblyBuilder - see #56621).
3742
3743 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3744
3745         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3746         (TypeManager.ComputeNamespaces): Faster implementation for
3747         Microsoft runtime.
3748
3749         * compiler.csproj: Updated AssemblyName to mcs.
3750
3751 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3752
3753         * rootcontext.cs: Add new types to the boot resolution.
3754
3755         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3756         MulticastDelegate is not allowed.
3757
3758         * typemanager.cs: Add new types to lookup: System.TypedReference
3759         and ArgIterator.
3760
3761         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3762         check for TypedReference or ArgIterator, they are not allowed. 
3763
3764         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3765         makes us properly catch 1510 in some conditions (see bug 56016 for
3766         details). 
3767
3768 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3769
3770         * CryptoConvert.cs: update from corlib version
3771         with endian fixes.
3772
3773 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3774
3775         * class.cs (Indexer.Define): Check indexername declaration
3776
3777 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3778
3779         * attribute.cs (IsClsCompliant): Fixed problem with handling
3780         all three states (compliant, not-compliant, undetected).
3781
3782 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3783
3784         * attribute.cs (Attribute): Location is now public.
3785         (Resolve): Store resolved arguments (pos_values) in attribute class.
3786         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3787         (GetClsCompliantAttributeValue): New method that gets
3788         CLSCompliantAttribute value.
3789         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3790         if exists else null.
3791         (AttributeTester): New class for CLS-Compliant verification routines.
3792
3793         * class.cs (Emit): Add CLS-Compliant verification.
3794         (Method.GetSignatureForError): Implemented.
3795         (Constructor.GetSignatureForError): Implemented
3796         (Constructor.HasCompliantArgs): Returns if constructor has
3797         CLS-Compliant arguments.
3798         (Constructor.Emit): Override.
3799         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3800         is needed to test only parameters.
3801         (FieldBase.GetSignatureForError): Implemented.
3802         (TypeContainer): New member for storing base interfaces.
3803         (TypeContainer.FindMembers): Search in base interfaces too.
3804
3805         * codegen.cs (GetClsComplianceAttribute): New method that gets
3806         assembly or module CLSCompliantAttribute value.
3807         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3808         for assembly.
3809         (ModuleClass.Emit): Add error 3012 test.
3810
3811         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3812
3813         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3814         state for all decl types.
3815         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3816         if CLS-Compliant tests are required.
3817         (IsClsCompliaceRequired): New method. Analyze whether code
3818         must be CLS-Compliant.
3819         (IsExposedFromAssembly): New method. Returns true when MemberCore
3820         is exposed from assembly.
3821         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3822         value or gets cached value.
3823         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3824         is explicitly marked with CLSCompliantAttribute.
3825         (IsIdentifierClsCompliant): New abstract method. This method is
3826         used to testing error 3005.
3827         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3828         for identifier and parameters CLS-Compliant testing.
3829         (VerifyClsCompliance): New method. The main virtual method for
3830         CLS-Compliant verifications.
3831         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3832         null. I don't know why is null (too many public members !).
3833         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3834         and get value of first CLSCompliantAttribute that found.
3835
3836         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3837         (VerifyClsCompliance): Override and add extra tests.
3838
3839         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3840         clscheck- disable CLS-Compliant verification event if assembly is has
3841         CLSCompliantAttribute(true).
3842
3843         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3844         ApllyAttribute is now called in emit section as in the other cases.
3845         Possible future Emit integration.
3846         (IsIdentifierClsCompliant): New override.
3847         (VerifyClsCompliance): New override.
3848         (GetEnumeratorName): Returns full enum name.
3849
3850         * parameter.cs (GetSignatureForError): Implemented.
3851
3852         * report.cs (WarningData): New struct for Warning message information.
3853         (LocationOfPreviousError): New method.
3854         (Warning): New method. Reports warning based on the warning table.
3855         (Error_T): New method. Reports error based on the error table.
3856
3857         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3858         verifications are done here.
3859
3860         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3861
3862         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3863         CLSCompliantAttribute.
3864         (all_imported_types): New member holds all imported types from other
3865         assemblies.
3866         (LoadAllImportedTypes): New method fills static table with exported types
3867         from all referenced assemblies.
3868         (Modules): New property returns all assembly modules.
3869
3870 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3871
3872         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3873         throwing a parser error.
3874
3875         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3876         which removes the hardcoded get_/set_ prefixes for properties, as
3877         IL allows for the properties to be named something else.  
3878
3879         Bug #56013
3880
3881         * expression.cs: Do not override operand before we know if it is
3882         non-null.  Fix 56207
3883
3884 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3885
3886         * typemanager.cs: support for pinned variables.
3887
3888 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3889
3890         * decl.cs, typemanager.cs: Avoid using an arraylist
3891         as a buffer if there is only one result set.
3892
3893 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3894
3895         * expression.cs: Make sure you cant call a static method
3896         with an instance expression, bug #56174.
3897
3898 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3899
3900         * class.cs (IsDuplicateImplementation): Improve error reporting to
3901         flag 663 (method only differs in parameter modifier).
3902
3903         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3904         in preprocessor directives.
3905
3906         * location.cs (LookupFile): Allow for the empty path.
3907
3908         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3909         better approach for some of that patch, but its failing with the
3910         CharSet enumeration.  For now try/catch will do.
3911
3912         * typemanager.cs: Do not crash if a struct does not have fields.
3913         Fixes 56150.
3914
3915 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3916
3917         * expression.cs: cs0213, cant fix a fixed expression.
3918         fixes 50231.
3919
3920 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3921
3922         * cs-parser.jay: detect invalid embeded statements gracefully.
3923         bug #51113.
3924
3925 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3926
3927         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3928         As a regex:
3929         s/
3930         the invocation type may not be a subclass of the tye of the item/
3931         The type of the item must be a subclass of the invocation item.
3932         /g
3933
3934         Fixes bug #50820.
3935
3936 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3937
3938         * attribute.cs: Added methods to get a string and a bool from an
3939         attribute. Required to information from AssemblyKeyFileAttribute,
3940         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3941         * codegen.cs: Modified AssemblyName creation to include support for
3942         strongnames. Catch additional exceptions to report them as CS1548.
3943         * compiler.csproj: Updated include CryptoConvert.cs.
3944         * compiler.csproj.user: Removed file - user specific configuration.
3945         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3946         Mono.Security assembly. The original class is maintained and tested in
3947         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3948         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3949         like CSC 8.0 (C# v2) supports.
3950         * Makefile: Added CryptoConvert.cs to mcs sources.
3951         * rootcontext.cs: Added new options for strongnames.
3952
3953 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3954
3955         * driver.cs: For --expect-error, report error code `2'
3956         if the program compiled with no errors, error code `1' if
3957         it compiled with an error other than the one expected.
3958
3959 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3960
3961         * compiler.csproj: Updated for Visual Studio .NET 2003.
3962         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3963         * compiler.sln: Updated for Visual Studio .NET 2003.
3964
3965 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3966
3967         * expression.cs: Fix bug #47234. We basically need to apply the
3968         rule that we prefer the conversion of null to a reference type
3969         when faced with a conversion to 'object' (csc behaviour).
3970
3971 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3972
3973         * statement.cs: Shorter form for foreach, eliminates
3974         a local variable. r=Martin.
3975
3976 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3977
3978         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3979         checks if we can use brtrue/brfalse to test for 0.
3980         * expression.cs: use the above in the test for using brtrue/brfalse.
3981         cleanup code a bit.
3982
3983 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3984
3985         * expression.cs: Rewrite string concat stuff. Benefits:
3986
3987         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3988         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3989         rather than a concat chain.
3990
3991         * typemanager.cs: Add lookups for more concat overloads.
3992
3993 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3994
3995         * expression.cs: Emit shorter il code for array init.
3996
3997         newarr
3998         dup
3999         // set 1
4000
4001         // set 2
4002
4003         newarr
4004         stloc.x
4005
4006         ldloc.x
4007         // set 1
4008
4009         ldloc.x
4010         // set 2
4011
4012 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4013
4014         * statement.cs: Before, two switch blocks would be merged if the
4015         total size of the blocks (end_item - begin_item + 1) was less than
4016         two times the combined sizes of the blocks.
4017
4018         Now, it will only merge if after the merge at least half of the
4019         slots are filled.
4020
4021         fixes 55885.
4022
4023 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4024
4025         * class.cs : csc build fix for GetMethods(). See bug #52503.
4026
4027 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4028
4029         * expression.cs: Make sure fp comparisons work with NaN.
4030         This fixes bug #54303. Mig approved this patch a long
4031         time ago, but we were not able to test b/c the runtime
4032         had a related bug.
4033
4034 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4035
4036         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4037
4038 2004-03-19  Martin Baulig  <martin@ximian.com>
4039
4040         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4041         error here and not in our caller.
4042
4043 2004-03-19  Martin Baulig  <martin@ximian.com>
4044
4045         * interface.cs: Completely killed this file.
4046         (Interface): We're now a TypeContainer and live in class.cs.
4047
4048         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4049         argument; we're now also called for interfaces.
4050         (TypeContainer.DefineMembers): Allow this method being called
4051         multiple times.
4052         (TypeContainer.GetMethods): New public method; formerly known as
4053         Interface.GetMethod().  This is used by PendingImplementation.
4054         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4055         it's now private and non-static.
4056         (Interface): Moved this here; it's now implemented similar to
4057         Class and Struct.
4058         (Method, Property, Event, Indexer): Added `bool is_interface'
4059         argument to their .ctor's.
4060         (MemberBase.IsInterface): New public field.
4061
4062         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4063         instances instead of InterfaceMethod, InterfaceProperty, etc.
4064         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4065         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4066
4067 2004-03-19  Martin Baulig  <martin@ximian.com>
4068
4069         * class.cs (MethodCore.IsDuplicateImplementation): New private
4070         method which does the CS0111 checking.
4071         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4072         Use IsDuplicateImplementation().
4073
4074 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4075
4076         * decl.cs (FindMemberToOverride): New method to find the correct
4077         method or property to override in the base class.
4078         * class.cs
4079             - Make Method/Property use the above method to find the
4080               version in the base class.
4081             - Remove the InheritableMemberSignatureCompare as it is now
4082               dead code.
4083
4084         This patch makes large code bases much faster to compile, as it is
4085         O(n) rather than O(n^2) to do this validation.
4086
4087         Also, it fixes bug 52458 which is that nested classes are not
4088         taken into account when finding the base class member.
4089
4090         Reviewed/Approved by Martin.
4091
4092 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4093
4094         * interface.cs: In all interface classes removed redundant
4095         member initialization.
4096
4097 2004-03-16  Martin Baulig  <martin@ximian.com>
4098
4099         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4100
4101 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4102
4103         * decl.cs (DefineTypeAndParents): New helper method to define a
4104         type's containers before the type itself is defined;  This is a
4105         bug exposed by the recent changes to Windows.Forms when an
4106         implemented interface was defined inside a class that had not been
4107         built yet.   
4108
4109         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4110
4111         (Check): Loop correctly to report errors modifiers
4112         (UNSAFE was not in the loop, since it was the same as TOP).
4113
4114         * interface.cs: Every interface member now takes a ModFlags,
4115         instead of a "is_new" bool, which we set on the base MemberCore. 
4116
4117         Every place where we called "UnsafeOk" in the interface, now we
4118         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4119         the unsafe settings from the member declaration instead of the
4120         container interface. 
4121
4122         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4123
4124         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4125         `set_indexer_name' to the pending bits (one per type).
4126
4127         We fixed a bug today that was picking the wrong method to
4128         override, since for properties the existing InterfaceMethod code
4129         basically ignored the method name.  Now we make sure that the
4130         method name is one of the valid indexer names.
4131
4132 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4133  
4134         * support.cs (SeekableStreamReader): Keep track of stream byte
4135         positions and don't mix them with character offsets to the buffer.
4136
4137         Patch from Gustavo Giráldez
4138
4139 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4140
4141         * interface.cs (InterfaceSetGetBase): Removed double member
4142         initialization, base class does it as well.
4143
4144 2004-03-13  Martin Baulig  <martin@ximian.com>
4145
4146         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4147         when compiling corlib.
4148
4149 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4150
4151         * convert.cs (ExplicitConversion): We were reporting an error on
4152         certain conversions (object_type source to a value type, when the
4153         expression was `null') before we had a chance to pass it through
4154         the user defined conversions.
4155
4156         * driver.cs: Replace / and \ in resource specifications to dots.
4157         Fixes 50752
4158
4159         * class.cs: Add check for duplicate operators.  Fixes 52477
4160
4161 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4162
4163         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4164         that are in the middle of the statements, not only at the end.
4165         Fixes #54987
4166
4167         * class.cs (TypeContainer.AddField): No longer set the
4168         `HaveStaticConstructor' flag, now we call it
4169         `UserDefineStaticConstructor' to diferentiate the slightly
4170         semantic difference.
4171
4172         The situation is that we were not adding BeforeFieldInit (from
4173         Modifiers.TypeAttr) to classes that could have it.
4174         BeforeFieldInit should be set to classes that have no static
4175         constructor. 
4176
4177         See:
4178
4179         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4180
4181         And most importantly Zoltan's comment:
4182
4183         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4184
4185         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4186          before its static fields are used', i.e. initialization does not need
4187          to be triggered by the first access to the type. Setting this flag
4188          helps the JIT to compile better code, since it can run the static
4189          constructor at JIT time, and does not need to generate code to call it
4190          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4191          this flag for lots of classes like String. 
4192          
4193          csc sets this flag if the type does not have an explicit static 
4194          constructor. The reasoning seems to be that if there are only static
4195          initalizers for a type, and no static constructor, then the programmer
4196          does not care when this initialization happens, so beforefieldinit
4197          can be used.
4198          
4199          This bug prevents the AOT compiler from being usable, since it 
4200          generates so many calls to mono_runtime_class_init that the AOT code
4201          is much slower than the JITted code. The JITted code is faster, 
4202          because it does not generate these calls if the vtable is type is
4203          already initialized, which is true in the majority of cases. But the
4204          AOT compiler can't do this."
4205
4206 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4207
4208         * class.cs (MethodData.Emit): Refactor the code so symbolic
4209         information is generated for destructors;  For some reasons we
4210         were taking a code path that did not generate symbolic information
4211         before. 
4212
4213 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4214
4215         * class.cs: Create a Constructor.CheckBase method that
4216         takes care of all validation type code. The method
4217         contains some code that was moved from Define.
4218
4219         It also includes new code that checks for duplicate ctors.
4220         This fixes bug #55148.
4221
4222 2004-03-09  Joshua Tauberer <tauberer@for.net>
4223
4224         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4225         a { ... }-style array creation invokes EmitStaticInitializers
4226         which is not good for reference-type arrays.  String, decimal
4227         and now null constants (NullCast) are not counted toward
4228         static initializers.
4229
4230 2004-03-05  Martin Baulig  <martin@ximian.com>
4231
4232         * location.cs (SourceFile.HasLineDirective): New public field;
4233         specifies whether the file contains or is referenced by a "#line"
4234         directive.
4235         (Location.DefineSymbolDocuments): Ignore source files which
4236         either contain or are referenced by a "#line" directive.        
4237
4238 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4239
4240         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4241         direct access to our parent, so check the method inline there.
4242
4243 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4244
4245         * expression.cs (Invocation.EmitCall): Miguel's last commit
4246         caused a regression. If you had:
4247
4248             T t = null;
4249             t.Foo ();
4250
4251         In Foo the implict this would be null.
4252
4253 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4254
4255         * expression.cs (Invocation.EmitCall): If the method is not
4256         virtual, do not emit a CallVirt to it, use Call.
4257
4258         * typemanager.cs (GetFullNameSignature): Improve the method to
4259         cope with ".ctor" and replace it with the type name.
4260
4261         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4262         as an argument the ConstructorBuilder where it is being defined,
4263         to catch the recursive constructor invocations.
4264
4265 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4266
4267         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4268         routines to check if a type is an enumerable/enumerator allow
4269         classes that implement the IEnumerable or IEnumerator interfaces.
4270
4271         * class.cs (Property, Operator): Implement IIteratorContainer, and
4272         implement SetYields.
4273
4274         (Property.Define): Do the block swapping for get_methods in the
4275         context of iterators.   We need to check if Properties also
4276         include indexers or not.
4277
4278         (Operator): Assign the Block before invoking the
4279         OperatorMethod.Define, so we can trigger the Iterator code
4280         replacement. 
4281
4282         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4283         Property and Operator classes are not created when we parse the
4284         declarator but until we have the block completed, so we use a
4285         singleton SimpleIteratorContainer.Simple to flag whether the
4286         SetYields has been invoked.
4287
4288         We propagate this setting then to the Property or the Operator to
4289         allow the `yield' to function.
4290
4291 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4292
4293         * codegen.cs: Implemented attribute support for modules.
4294         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4295         Assembly/Module functionality.
4296
4297         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4298         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4299         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4300
4301 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4302
4303         * interface.cs (FindMembers): The operation is performed on all base
4304         interfaces and not only on the first. It is required for future CLS Compliance patch.
4305
4306 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4307
4308         * statement.cs, codegen.cs:
4309         This patch deals with patterns such as:
4310
4311         public class List : IEnumerable {
4312
4313                 public MyEnumerator GetEnumerator () {
4314                         return new MyEnumerator(this);
4315                 }
4316
4317                 IEnumerator IEnumerable.GetEnumerator () {
4318                         ...
4319                 }
4320                 
4321                 public struct MyEnumerator : IEnumerator {
4322                         ...
4323                 }
4324         }
4325
4326         Before, there were a few things we did wrong:
4327         1) we would emit callvirt on a struct, which is illegal
4328         2) we emited ldarg when we needed to emit ldarga
4329         3) we would mistakenly call the interface methods on an enumerator
4330         type that derived from IEnumerator and was in another assembly. For example:
4331
4332         public class MyEnumerator : IEnumerator
4333
4334         Would have the interface methods called, even if there were public impls of the
4335         method. In a struct, this lead to invalid IL code.
4336
4337 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4338
4339         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4340           renamed to Emit.
4341
4342         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4343
4344 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4345
4346         * cs-parser.jay: Fix small regression: we were not testing V2
4347         compiler features correctly.
4348
4349         * interface.cs: If the emit context is null, then create one
4350
4351 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4352
4353         * decl.cs (GetSignatureForError): New virtual method to get full name
4354           for error messages.
4355
4356         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4357           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4358
4359         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4360           Duplicated members and code in these classes has been removed.
4361           Better encapsulation in these classes.
4362
4363 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4364
4365         * assign.cs (Assign.DoResolve): When dealing with compound
4366         assignments, there is a new rule in ECMA C# 2.4 (might have been
4367         there before, but it is documented here) that states that in:
4368
4369         a op= b;
4370
4371         If b is of type int, and the `op' is a shift-operator, then the
4372         above is evaluated as:
4373
4374         a = (int) a op b 
4375
4376         * expression.cs (Binary.ResolveOperator): Instead of testing for
4377         int/uint/long/ulong, try to implicitly convert to any of those
4378         types and use that in pointer arithmetic.
4379
4380         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4381         method to print information for from the type, not from the
4382         null-method we were given.
4383
4384 2004-02-01  Duncan Mak  <duncan@ximian.com>
4385
4386         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4387         parsing for cmd, fixes bug #53694.
4388
4389 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4390
4391         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4392         in the member name duplication tests. Property and operator name duplication
4393         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4394
4395 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4396
4397         * interface.cs (PopulateMethod): Fixed crash when interface method
4398         returns not existing type (error test cs0246-3.cs).
4399
4400 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4401
4402         * cs-parser.jay (interface_accessors): Re-write actions to also
4403         store attributes attached to get and set methods. Fix spelling
4404         while at it.
4405
4406         (inteface_property_declaration): Modify accordingly.
4407
4408         (InterfaceAccessorInfo): New helper class to store information to pass
4409         around between rules that use interface_accessors.
4410
4411         * interface.cs (Emit): Apply attributes on the get and set
4412         accessors of properties and indexers too.
4413
4414         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4415         right MethodBuilder when applying attributes to the get and set accessors.
4416
4417 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4418
4419         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4420
4421 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4422
4423         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4424
4425 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4426
4427         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4428         changes that treat `yield' specially when present before `break'
4429         or `return' tokens.
4430
4431         * cs-tokenizer.cs: yield is no longer a keyword.
4432
4433 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4434
4435         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4436         setting for default constructors.
4437         For default constructors are almost every time set wrong Modifier. The
4438         generated IL code has been alright. But inside mcs this values was
4439         wrong and this was reason why several of my CLS Compliance tests
4440         failed.
4441
4442 2004-01-22  Martin Baulig  <martin@ximian.com>
4443
4444         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4445         not a QualifiedIdentifier.  This is what `type_name_expression'
4446         was previously doing.
4447         (type_name_expression): Removed; the code is now in
4448         `namespace_or_type_name'.
4449         (qualified_identifier): Removed, use `namespace_or_type_name'
4450         instead.
4451         (QualifiedIdentifier): Removed this class.      
4452
4453 2004-01-22  Martin Baulig  <martin@ximian.com>
4454
4455         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4456         not a string as alias name.
4457
4458 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4459
4460         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4461         #52730 bug, and instead compute correctly the need to use a
4462         temporary variable when requesting an address based on the
4463         static/instace modified of the field and the constructor.
4464  
4465 2004-01-21  Martin Baulig  <martin@ximian.com>
4466
4467         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4468         class and namespace before looking up aliases.  Fixes #52517.
4469
4470 2004-01-21  Martin Baulig  <martin@ximian.com>
4471
4472         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4473         assinged in a 'try'; fixes exception4.cs.
4474
4475 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4476         * class.cs : Implemented parameter-less constructor for TypeContainer
4477
4478         * decl.cs: Attributes are now stored here. New property OptAttributes
4479
4480         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4481
4482         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4483
4484 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4485
4486         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4487           (CSharpSignature): New method for indexer and property signature.
4488
4489 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4490
4491         * pending.cs (IsVirtualFilter): Faster implementation.
4492
4493 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4494
4495         * typemanager.cs: Avoid inclusion of same assembly more than once.
4496
4497 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4498
4499         * cs-parser.jay: Fixed problem where the last assembly attribute
4500           has been applied also to following declaration (class, struct, etc.)
4501           
4502 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4503
4504         * class.cs: Added error CS0538, CS0539 reporting.
4505         Fixed crash on Microsoft runtime when field type is void.
4506
4507         * cs-parser.jay: Added error CS0537 reporting.
4508
4509         * pending.cs: Added error CS0535 reporting.
4510         Improved error report for errors CS0536, CS0534.
4511
4512 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4513
4514         Merge a few bits from the Anonymous Method MCS tree.
4515
4516         * statement.cs (ToplevelBlock): New class for toplevel methods,
4517         will hold anonymous methods, lifted variables.
4518
4519         * cs-parser.jay: Create toplevel blocks for delegates and for
4520         regular blocks of code. 
4521
4522 2004-01-20  Martin Baulig  <martin@ximian.com>
4523
4524         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4525         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4526         and `NeedExplicitReturn'; added `IsLastStatement'.
4527         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4528         have a `ReturnLabel' or we're not unreachable.
4529
4530         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4531         child's reachability; don't just override ours with it.  Fixes
4532         #58058 (lluis's example).
4533         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4534         InFinally(), InLoop(), InSwitch() and
4535         BreakCrossesTryCatchBoundary() methods.
4536
4537         * statement.cs (Return): Do all error checking in Resolve().
4538         Unless we are the last statement in a top-level block, always
4539         create a return label and jump to it.
4540         (Break, Continue): Do all error checking in Resolve(); also make
4541         sure we aren't leaving a `finally'.
4542         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4543         statement in a top-level block.
4544         (Block.Flags): Added `IsDestructor'.
4545         (Block.IsDestructor): New public property.
4546
4547 2004-01-20  Martin Baulig  <martin@ximian.com>
4548
4549         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4550
4551 2004-01-20  Martin Baulig  <martin@ximian.com>
4552
4553         * statement.cs (Statement.ResolveUnreachable): New public method.
4554         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4555         (Block.Resolve): Resolve unreachable statements.
4556
4557 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4558
4559         * expression.cs: We need to fix the case where we do
4560         not have a temp variable here.
4561
4562         * assign.cs: Only expression compound assignments need
4563         temporary variables.
4564
4565 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4566
4567         * flowanalysis.cs: Reduce memory allocation in a few ways:
4568           - A block with no variables should not allocate a bit
4569             vector for itself.
4570           - A method with no out parameters does not need any tracking
4571             for assignment of the parameters, so we need not allocate
4572             any data for it.
4573           - The arrays:
4574                 public readonly Type[] VariableTypes;
4575                 public readonly string[] VariableNames;
4576             Are redundant. The data is already stored in the variable
4577             map, so we need not allocate another array for it.
4578           - We need to add alot of checks for if (params | locals) == null
4579             due to the first two changes.
4580
4581 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4582
4583         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4584         implement IMemoryLocation, we store a copy on a local variable and
4585         take the address of it.  Patch from Benjamin Jemlich
4586
4587         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4588         to use a special "type_name_expression" rule which reduces the
4589         number of "QualifiedIdentifier" classes created, and instead
4590         directly creates MemberAccess expressions.
4591
4592 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4593
4594         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4595         that fixes #52853.  Null literal assignment to ValueType
4596
4597         * class.cs (MethodData.Emit): Instead of checking the name of the
4598         method to determine if its a destructor, create a new derived
4599         class from Method called Destructor, and test for that.  
4600
4601         * cs-parser.jay: Create a Destructor object instead of a Method.  
4602
4603         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4604
4605         Fixes: 52933
4606
4607 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4608
4609         * expression.cs (Binary.ResolveOperator): Perform an implicit
4610         conversion from MethodGroups to their delegate types on the
4611         Addition operation.
4612
4613         * delegate.cs: Introduce a new class DelegateCreation that is the
4614         base class for `NewDelegate' and `ImplicitDelegateCreation',
4615         factor some code in here.
4616
4617         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4618         conversion from MethodGroups to compatible delegate types. 
4619
4620         * ecore.cs (Expression.Resolve): Do not flag error 654
4621         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4622         we allow conversions from MethodGroups to delegate types now.
4623
4624         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4625         assignments in v2 either.
4626
4627 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4628
4629         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4630         static read-only fields in ctors.
4631
4632         Applied patch from Benjamin Jemlich 
4633
4634         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4635
4636 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4637
4638         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4639         here to return true, as they can be used like this:
4640
4641                 (XXX) int.MEMBER ()
4642
4643         Fixed 49836 and all the other dups
4644
4645 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4646
4647         * driver.cs: Implement /win32res and /win32icon.
4648
4649 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4650
4651         * cs-parser.jay: Add a rule to improve error handling for the
4652         common mistake of placing modifiers after the type.
4653
4654 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4655
4656         * cs-parser.jay (interface_event_declaration): Catch
4657         initialization of events on interfaces, and report cs0068
4658
4659         * cs-parser.jay (interface_event_declaration): Catch
4660         initialization of events. 
4661
4662         * ecore.cs: Better report missing constructors.
4663
4664         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4665         the error reporting done in the wrong place.  Fix.
4666
4667         * expression.cs (Binary.ResolveOperator): Catch the 
4668         operator + (E x, E y) error earlier, and later allow for implicit
4669         conversions in operator +/- (E e, U x) from U to the underlying
4670         type of E.
4671
4672         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4673         52596, if the container class is abstract, the default constructor
4674         is protected otherwise its public (before, we were always public).
4675
4676         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4677         fixed statement.
4678
4679         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4680         Jemlich that fixes bug #52597, MCS was generating invalid code for
4681         idisposable structs.   Thanks to Ben for following up with this
4682         bug as well.
4683
4684 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4685
4686         * driver.cs: Allow assemblies without code to be generated, fixes
4687         52230.
4688
4689 2004-01-07  Nick Drochak <ndrochak@gol.com>
4690
4691         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4692
4693 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4694
4695         * cs-parser.jay: Add rules to improve error reporting if fields or
4696         methods are declared at the namespace level (error 116)
4697
4698         * Add rules to catch event add/remove
4699
4700 2004-01-04  David Sheldon <dave-mono@earth.li>
4701
4702   * expression.cs: Added matching ")" to error message for 
4703   CS0077
4704
4705 2004-01-03 Todd Berman <tberman@gentoo.org>
4706
4707         * ecore.cs, attribute.cs:
4708         Applying fix from #52429.
4709
4710 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4711
4712         * ecore.cs, expression.cs, statement.cs:
4713         Total rewrite of how we handle branching. We
4714         now handle complex boolean expressions with fewer
4715         jumps. As well if (x == 0) no longer emits a ceq.
4716
4717         if (x is Foo) is much faster now, because we generate
4718         better code.
4719
4720         Overall, we get a pretty big improvement on our benchmark
4721         tests. The code we generate is smaller and more readable.
4722
4723         I did a full two-stage bootstrap. The patch was reviewed
4724         by Martin and Miguel.
4725
4726 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4727
4728         * cs-parser.jay: Make primary_expression not take a QI.
4729         we dont need this because the member_access rule covers
4730         us here. So we replace the rule with just IDENTIFIER.
4731
4732         This has two good effects. First, we remove a s/r conflict.
4733         Second, we allocate many fewer QualifiedIdentifier objects.
4734
4735 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4736
4737         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4738         set the correct information via SRE. This prevents
4739         hanging on the MS runtime. Fixes #29374.
4740
4741 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4742
4743         * convert.cs: correctly handle conversions to value types
4744         from Enum and ValueType as unboxing conversions.
4745
4746         Fixes bug #52569. Patch by Benjamin Jemlich.
4747
4748 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4749
4750         * expression.cs (BetterConversion): Prefer int -> uint
4751         over int -> ulong (csc's behaviour). This fixed bug #52046.
4752
4753 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4754
4755         * decl.cs (MemberCache.FindMembers): now returns a
4756         MemberInfo [].
4757
4758         * typemanager.cs: In general, go with with ^^.
4759         (CopyNewMethods): take an IList.
4760         (RealMemberLookup): Only allocate an arraylist
4761         if we copy from two sets of methods.
4762
4763         This change basically does two things:
4764         1) Fewer array lists allocated due to CopyNewMethods.
4765         2) the explicit cast in MemberList costed ALOT.
4766
4767 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4768
4769         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4770         a hashtable to avoid needless string allocations when an identifier is
4771         used more than once (the common case).
4772
4773 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4774
4775         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4776         is broken, it will not return anything. So, we
4777         have to use the information we have in mcs to
4778         do the task.
4779
4780         * typemanager.cs: Add a cache for GetInterfaces,
4781         since this will now be used more often (due to ^^)
4782
4783         (GetExplicitInterfaces) New method that gets the
4784         declared, not effective, interfaces on a type
4785         builder (eg, if you have interface IFoo, interface
4786         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4787         { IBar }.
4788
4789         This patch makes MCS able to bootstrap itself on
4790         Windows again.
4791
4792 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4793
4794         * expression.cs: Remove the Nop's that Miguel put
4795         in by mistake.
4796
4797 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4798
4799         * report.cs, codegen.cs: Give the real stack trace to
4800         the error when an exception is thrown.
4801
4802 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4803
4804         * decl.cs: only allocate hashtables for ifaces if 
4805         it is an iface!
4806
4807 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4808
4809         * expression.cs: fix the error from cs0121-2.cs
4810         (a parent interface has two child interfaces that
4811         have a function with the same name and 0 params
4812         and the function is called through the parent).
4813
4814 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4815
4816         * class.cs, rootcontext.cs, typmanager.cs: do not
4817         leak pointers.
4818
4819 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4820
4821         * codegen.cs: remove stack for the ec flow branching.
4822         It is already a linked list, so no need.
4823
4824 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4825
4826         * Makefile: Allow custom profiler here.
4827
4828 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4829
4830         * typemanager.cs (LookupType):
4831           - Use a static char [], because split takes
4832             a param array for args, so it was allocating
4833             every time.
4834           - Do not store true in a hashtable, it boxes.
4835
4836 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4837
4838         * flowanalysis.cs: bytify common enums.
4839
4840 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4841
4842         * modifiers.cs: Add a new set of flags for the
4843         flags allowed on explicit interface impls.
4844         * cs-parser.jay: catch the use of modifiers in
4845         interfaces correctly.
4846         * class.cs: catch private void IFoo.Blah ().
4847
4848         All related to bug #50572.
4849
4850 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4851
4852         * decl.cs: Rewrite the consistant accessability checking.
4853         Accessability is not linear, it must be implemented in
4854         a tableish way. Fixes #49704.
4855
4856 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4857
4858         * expression.cs: Handle negation in a checked context.
4859         We must use subtraction from zero. Fixes #38674.
4860
4861 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4862
4863         * class.cs: Ignore static void main in DLLs.
4864         * rootcontext.cs: Handle the target type here,
4865         since we are have to access it from class.cs
4866         * driver.cs: account for the above.
4867
4868 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4869
4870         * report.cs: Give line numbers and files if available.
4871
4872 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4873
4874         * driver.cs: Implement /addmodule.
4875
4876         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4877         ModuleBuilders.
4878
4879 2003-12-20  Martin Baulig  <martin@ximian.com>
4880
4881         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4882         (FieldBase.IsAssigned): Removed this field.
4883         (FieldBase.SetAssigned): New public method.
4884         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4885
4886 2003-12-20  Martin Baulig  <martin@ximian.com>
4887
4888         * expression.cs (LocalVariableReference.DoResolve): Don't set
4889         `vi.Used' if we're called from DoResolveLValue().
4890
4891         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4892         returns the usage vector it just merged into the current one -
4893         pass this one to UsageWarning().
4894         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4895         of the `EmitContext', don't call this recursively on our children.
4896
4897 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4898
4899         * driver.cs: Implement /target:module.
4900
4901 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4902
4903         * support.cs (CharArrayHashtable): New helper class.
4904
4905         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4906         char arrays, not strings, so we can avoid creating a string in
4907         consume_identifier if the identifier is a keyword.
4908
4909 2003-12-16  Martin Baulig  <martin@ximian.com>
4910
4911         * statement.cs (LocalInfo.Assigned): Removed this property.
4912         (LocalInfo.Flags): Removed `Assigned'.
4913         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4914         and uses flow analysis.
4915         (Block.UsageWarning): Made this method private.
4916         (Block.Resolve): Call UsageWarning() if appropriate.
4917
4918         * expression.cs (LocalVariableReference.DoResolve): Always set
4919         LocalInfo.Used here.
4920
4921 2003-12-13  Martin Baulig  <martin@ximian.com>
4922
4923         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4924         any value here; we're now using flow analysis to figure out
4925         whether a statement/block returns a value.
4926
4927 2003-12-13  Martin Baulig  <martin@ximian.com>
4928
4929         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4930         working again.
4931         (FlowBranching.MergeFinally): Don't call
4932         `branching.CheckOutParameters()' here, this is called in
4933         MergeTopBlock().
4934         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4935         when adding the `finally' vector.       
4936
4937 2003-12-13  Martin Baulig  <martin@ximian.com>
4938
4939         * flowanalysis.cs
4940         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4941         actually work and also fix #48962.
4942
4943 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4944
4945         * decl.cs: Do not check System.Object for nested types,
4946         since we know it does not have any. Big bang for buck:
4947
4948         BEFORE:
4949            Run 1:   8.35 seconds
4950            Run 2:   8.32 seconds
4951            corlib:  17.99 seconds
4952         AFTER:
4953            Run 1:   8.17 seconds
4954            Run 2:   8.17 seconds
4955            corlib:  17.39 seconds
4956
4957 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4958
4959         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4960         time we are returning 0 members, so we save alot here.
4961
4962 2003-12-11  Martin Baulig  <martin@ximian.com>
4963
4964         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4965         `MergeChild()', also just take the `FlowBranching' as argument;
4966         call Merge() on it and return the result.
4967         (FlowBranching.Merge): We don't need to do anything if we just
4968         have one sibling.
4969
4970 2003-12-11  Martin Baulig  <martin@ximian.com>
4971
4972         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4973         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4974         Maurer for this idea.
4975
4976 2003-12-11  Martin Baulig  <martin@ximian.com>
4977
4978         * flowanalysis.cs (MergeResult): This class is now gone; we now
4979         use the `UsageVector' for this.  The reason for this is that if a
4980         branching just has one sibling, we don't need to "merge" them at
4981         all - that's the next step to do.
4982         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4983         `MergeResult'.
4984
4985 2003-12-11  Martin Baulig  <martin@ximian.com>
4986
4987         Reworked flow analyis and made it more precise and bug-free.  The
4988         most important change is that we're now using a special `Reachability'
4989         class instead of having "magic" meanings of `FlowReturns'.  I'll
4990         do some more cleanups and optimizations and also add some more
4991         documentation this week.
4992
4993         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4994         largely reworked this class.
4995         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4996         the new `Reachability' class instead of having "magic" values here.
4997         (FlowBranching): We're now using an instance of `Reachability'
4998         instead of having separate `Returns', `Breaks' etc. fields.
4999
5000         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5001         based on flow analysis; ignore the return value of block.Emit ().
5002
5003 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5004
5005         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5006         if they are private.
5007
5008 2003-12-09  Martin Baulig  <martin@ximian.com>
5009
5010         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5011         call them directly on the UsageVector.
5012
5013 2003-12-09  Martin Baulig  <martin@ximian.com>
5014
5015         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5016         Changed return type from `FlowReturns' to `Reachability'.
5017
5018 2003-12-09  Martin Baulig  <martin@ximian.com>
5019
5020         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5021         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5022         `Reachable' fields with a single `Reachability' one.
5023
5024 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5025
5026         * class.cs (FindMembers): Remove foreach's.
5027
5028         Bootstrap times:
5029
5030         BEFORE
5031                 Run 1:   8.74 seconds
5032                 Run 2:   8.71 seconds
5033
5034         AFTER
5035                 Run 1:   8.64 seconds
5036                 Run 2:   8.58 seconds
5037
5038
5039 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5040
5041         * cs-parser.jay:
5042         * gen-treedump.cs:
5043         * statement.cs:
5044         This patch does a few things:
5045                 1. EmptyStatement is now a singleton, so it is never reallocated.
5046                 2. All blah is EmptyStatement constructs have been changed to
5047                    blah == EmptyStatement.Value, which is much faster and valid
5048                    now that EmptyStatement is a singleton.
5049                 3. When resolving a block, rather than allocating a new array for
5050                    the non-empty statements, empty statements are replaced with
5051                    EmptyStatement.Value
5052                 4. Some recursive functions have been made non-recursive.
5053         Mainly the performance impact is from (3), however (1) and (2) are needed for
5054         this to work. (4) does not make a big difference in normal situations, however
5055         it makes the profile look saner.
5056
5057         Bootstrap times:
5058
5059         BEFORE
5060         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5061         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5062         Total memory allocated: 56397 KB
5063
5064         AFTER
5065         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5066         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5067         Total memory allocated: 55666 KB
5068
5069 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5070
5071         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5072         than the hashtable in a hashtable version
5073
5074         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5075         we always end up concating a string. This results in a huge perf
5076         loss, because many strings have to be tracked by the GC. In this
5077         patch, we first use a hashtable that works with two keys, so that
5078         the strings do not need to be concat'ed.
5079
5080         Bootstrap times:
5081         BEFORE
5082                 Run 1:   8.74 seconds
5083                 Run 2:   8.71 seconds
5084
5085         AFTER
5086                 Run 1:   8.65 seconds
5087                 Run 2:   8.56 seconds
5088
5089 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5090
5091         * Makefile: Add a new target `do-time' that does a quick and simple
5092         profile, leaving easy to parse output.
5093
5094 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5095
5096         * codegen.cs (Init): Create the dynamic assembly with 
5097         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5098
5099 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5100
5101         * support.cs: Make the PtrHashtable use only one
5102         instance of its comparer.
5103
5104 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5105
5106         * typemanager.cs: Fix lookup of GetNamespaces.
5107
5108 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5109
5110         * expression.cs: Removed redundant line.
5111
5112         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5113         ArrayLists, use for loops with bounds.  
5114
5115         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5116         arraylist.
5117
5118         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5119         arraylists, use for loop with bounds.
5120
5121         The above three changes give us a 0.071 second performance
5122         improvement out of 3.294 seconds down to 3.223.  On my machine
5123         the above changes reduced the memory usage by 1,387 KB during
5124         compiler bootstrap.
5125
5126         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5127         QualifiedIdentifiers.  Before we created a new string through
5128         concatenation, and mostly later on, the result would be
5129         manipulated by DecomposeQI through string manipulation.
5130
5131         This reduced the compiler memory usage for bootstrapping from
5132         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5133         compile times in 0.05 seconds.
5134
5135 2003-11-28  Dick Porter  <dick@ximian.com>
5136
5137         * support.cs: Do string compares with the Invariant culture.
5138
5139         * rootcontext.cs: 
5140         * gen-treedump.cs: 
5141         * expression.cs: 
5142         * driver.cs: 
5143         * decl.cs: 
5144         * codegen.cs: 
5145         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5146         the comparison is done with the Invariant culture.
5147
5148 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5149
5150         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5151         GetEnumerator method.
5152
5153         (ProbeCollectionType): Iterate starting at the most specific type
5154         upwards looking for a GetEnumerator
5155
5156         * expression.cs: Shift count can be up to 31 for int/uint and 63
5157         for long/ulong.
5158
5159 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5160
5161         * statement.cs (Block.LookupLabel): Also look for the label on the
5162         children blocks.  Use a hash table to keep track of visited
5163         nodes. 
5164
5165         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5166         we actually did transform the other operand, otherwise fall back
5167         to the common codepath that casts to long.
5168
5169         * cs-tokenizer.cs: Use the same code pattern as the int case.
5170         Maybe I should do the parsing myself, and avoid depending on the
5171         Parse routines to get this done.
5172
5173 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5174
5175         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5176         which fixes bug 51347.  This time test it.
5177
5178         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5179         attributes for example can not tell the difference between these.
5180         The difference was only a syntax feature of the language. 
5181
5182         * attribute.cs: Apply attributes to delegates.
5183
5184         * delegate.cs: Call the apply attributes method.
5185
5186 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5187
5188         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5189         comparing 0 vs Byte.MinValue, not the value
5190
5191         (ImplicitConversionRequired): When reporting a conversion error,
5192         use error 31 to print out the constant error instead of the
5193         simpler 29.
5194
5195         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5196         which fixes bug 51347.
5197
5198 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5199
5200         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5201         which fixes the -warnaserror command line option.
5202
5203 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5204
5205         * cfold.cs (DoNumericPromotions): During constant folding of
5206         additions on UIntConstant, special case intconstants with
5207         IntConstants like we do on the expression binary operator. 
5208
5209 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5210
5211         * convert.cs (ImplicitReferenceConversion): We were missing a case
5212         (System.Enum are not value types or class types, so we need to
5213         classify them separatedly).
5214
5215         * driver.cs: We do not support error 2007.
5216
5217 2003-11-12 Jackson Harper <jackson@ximian.com>
5218
5219         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5220         system directory. Also use the full file name so users can
5221         libraries names mscorlib-o-tron.dll in a non system dir.
5222
5223 2003-11-10  Martin Baulig  <martin@ximian.com>
5224
5225         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5226         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5227         calling `ResolveType()' on them, directly assign their `Type'.
5228
5229 2003-11-08  Martin Baulig  <martin@ximian.com>
5230
5231         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5232         return value and the `out parent' parameter.
5233         (TypeContainer.DefineType): Moved the CS0644 check into
5234         GetClassBases().  Don't pass the interface types to the
5235         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5236         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5237
5238         * ecore.cs (TypeExpr.IsAttribute): New property.
5239         (TypeExpr.GetInterfaces): New method.
5240
5241         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5242         TypeExpr instead of a Type.
5243         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5244         (Interface.DefineType): Don't pass the interface types to the
5245         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5246         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5247
5248         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5249         instead of a `Type[]'.
5250         (TypeManager.RegisterBuilder): Likewise.
5251         (TypeManager.AddUserInterface): Likewise.
5252         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5253         `Type[]' and also return a `TypeExpr[]'.
5254         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5255
5256 2003-11-08  Martin Baulig  <martin@ximian.com>
5257
5258         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5259         Expression.     
5260
5261 2003-11-08  Martin Baulig  <martin@ximian.com>
5262
5263         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5264         TypeManager.ResolveExpressionTypes().
5265
5266         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5267         instead of an Expression.
5268         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5269         (TypeExpression): New public class; formerly known as `TypeExpr'.
5270
5271         * expression.cs (ComposedCast): Derive from TypeExpr.
5272
5273         * typemanager.cs (TypeManager.system_*_expr): These are now
5274         TypExpr's instead of Expression's.
5275         (TypeManager.ResolveExpressionTypes): New public static function;
5276         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5277         of them.        
5278
5279 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5280
5281         * expression.cs (New.DoResolve): Do not dereference value that
5282         might be a null return.
5283
5284         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5285         sure that the constant value has the right type.  Fixes an
5286         unreported bug, similar to 50425.
5287
5288         * const.cs (Const.LookupConstantValue): Call
5289         ImplicitStandardConversionExists before doing a conversion to
5290         avoid havng the TypeManager.ChangeType do conversions.
5291
5292         Reduced the number of casts used
5293
5294         (Const.ChangeType): New routine to enable reuse of the constant
5295         type changing code from statement.
5296
5297         * typemanager.cs (ChangeType): Move common initialization to
5298         static global variables.
5299
5300         Fixes #50425.
5301
5302         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5303         every value type to go through, even if it was void.  Fix that. 
5304
5305         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5306         character of the define, and the is_identifier_part_character for
5307         the rest of the string.
5308
5309 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5310
5311         * expression.cs (UnaryMutator.EmitCode): When I updated
5312         LocalVariableReference.DoResolve, I overdid it, and dropped an
5313         optimization done on local variable references.
5314
5315 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5316
5317         * ecore.cs: Convert the return from Ldlen into an int.
5318
5319 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5320
5321         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5322         the accessibility, this is a special case for toplevel non-public
5323         classes (internal for instance).
5324
5325 2003-10-20  Nick Drochak <ndrochak@gol.com>
5326
5327         * ecore.cs: Fix typo and build.  Needed another right paren.
5328
5329 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5330
5331         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5332         `internal' case regular and protected, but not allowing protected
5333         to be evaluated later.  Bug 49840
5334
5335 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5336
5337         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5338         to kb.Nlast, and not the kb.nFirst to isolate the switch
5339         statement.
5340
5341         Extract the underlying type, so enumerations of long/ulong are
5342         treated like long/ulong.
5343
5344 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5345
5346         * expression.cs (New): Overload the meaning of RequestedType to
5347         track the possible creation of the NewDelegate type, since
5348         DoResolve is invoked more than once for new constructors on field
5349         initialization.
5350
5351         See bugs: #48800 and #37014
5352
5353         * cs-parser.jay (declare_local_constants): Take an arraylist
5354         instead of a single constant.
5355
5356         (local_constant_declaration): It should take a
5357         constant_declarators, not a constant_declarator.  Fixes 49487
5358
5359         * convert.cs: Fix error report.
5360
5361 2003-10-13 Jackson Harper <jackson@ximian.com>
5362
5363         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5364         bug #49611
5365
5366 2003-10-09  Martin Baulig  <martin@ximian.com>
5367
5368         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5369         to the .ctor.
5370         (MethodCore.DoDefineParameters): Removed the TypeContainer
5371         argument; use the DeclSpace which was passed to the .ctor instead.
5372         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5373         TypeContainer; we only need a DeclSpace here.
5374
5375 2003-10-09  Martin Baulig  <martin@ximian.com>
5376
5377         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5378         to the .ctor.
5379         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5380         EmitContext's .ctor.    
5381
5382 2003-10-09  Martin Baulig  <martin@ximian.com>
5383
5384         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5385         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5386         AsAccessible(), moved them as well.
5387
5388         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5389
5390 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5391
5392         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5393
5394 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5395
5396         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5397         generation for >=, as spotted by Paolo, bug 48679.  
5398         Patch from David Waite.
5399
5400         * cs-tokenizer.cs: Add handling for #pragma.
5401
5402         * cs-parser.jay: Allow for both yield and yield return in the
5403         syntax.  The anti-cobolization of C# fight will go on!
5404
5405         * class.cs (TypeBuilder.DefineType): Catch error condition here
5406         (Parent.DefineType erroring out and returning null).
5407
5408         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5409         coping with enumerations variables, we were mistakenly processing
5410         them as a regular value type instead of built-in types.  Fixes the
5411         bug #48063
5412
5413         * typemanager.cs (IsBuiltinOrEnum): New method.
5414
5415 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5416
5417         * cs-parser.jay: Upgrade: yield now needs the return clause.
5418
5419 2003-09-19  Martin Baulig  <martin@ximian.com>
5420
5421         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5422         `MemberCache parent' argument.  Normally, an interface doesn't
5423         have a parent type except System.Object, but we use this in gmcs
5424         for generic type parameters.
5425
5426 2003-09-18  Martin Baulig  <martin@ximian.com>
5427
5428         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5429         on `type.IsInterface'; don't check whether the type has a parent
5430         to determine whether it's an interface.
5431
5432 2003-09-15  Martin Baulig  <martin@ximian.com>
5433
5434         * class.cs (TypeContainer.DefineType): Added an error flag to
5435         avoid reporting duplicate CS0146's ("class definition is
5436         circular.").
5437
5438         * driver.cs (Driver.MainDriver): Abort if
5439         RootContext.ResolveTree() reported any errors.
5440
5441 2003-09-07  Martin Baulig  <martin@ximian.com>
5442
5443         * report.cs (Error, Warning): Added overloaded versions which take
5444         a `params object[] args' and call String.Format().
5445
5446 2003-09-07  Martin Baulig  <martin@ximian.com>
5447
5448         * decl.cs (DeclSpace..ctor): Don't call
5449         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5450         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5451         (DeclSpace.RecordDecl): New method.
5452
5453         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5454
5455 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5456
5457         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5458         value attributes to be applied to ParameterBuilders.
5459
5460         * class.cs (MethodCore.LabelParameters): Make static and more
5461         generic so that it can be used from other places - like interface
5462         methods, for instance.
5463
5464         * interface.cs (Interface.Emit): Call LabelParameters before
5465         emitting attributes on the InterfaceMethod.
5466
5467 2003-08-26  Martin Baulig  <martin@ximian.com>
5468
5469         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5470         resolving aliases; fixes #47927.
5471
5472 2003-08-26  Martin Baulig  <martin@ximian.com>
5473
5474         * statement.cs (Using.DoResolve): This is internally emitting a
5475         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5476         do not always return.  Fixes #47681.
5477
5478 2003-08-26  Martin Baulig  <martin@ximian.com>
5479
5480         * decl.cs (MemberCore): Moved WarningNotHiding(),
5481         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5482         into MemberBase.
5483         (AdditionResult): Make this nested in DeclSpace.
5484         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5485         argument; call NamespaceEntry.Define() unless we're nested in a
5486         class or struct.
5487
5488         * namespace.cs (Namespace.DefineName): New public function.  This
5489         is called from DeclSpace's .ctor to add 
5490         (Namespace.Lookup): Include DeclSpaces in the lookup.
5491
5492         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5493
5494         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5495
5496 2003-08-25  Martin Baulig  <martin@ximian.com>
5497
5498         * convert.cs (Convert.ExplicitReferenceConversion): When
5499         converting from an interface type to a class, unbox if the target
5500         type is a struct type.  Fixes #47822.
5501
5502 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5503
5504         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5505         #47854.
5506
5507 2003-08-22  Martin Baulig  <martin@ximian.com>
5508
5509         * class.cs (TypeManager.DefineType): When defining a nested type,
5510         call DefineType() on our parent; fixes #47801.
5511
5512 2003-08-22  Martin Baulig  <martin@ximian.com>
5513
5514         * class.cs (MethodData.Define): While checking if a method is an
5515         interface implementation, improve the test a bit more to fix #47654.
5516
5517 2003-08-22  Martin Baulig  <martin@ximian.com>
5518
5519         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5520         correctly; fixes #47722.
5521
5522 2003-08-22  Martin Baulig  <martin@ximian.com>
5523
5524         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5525         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5526
5527         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5528
5529 2003-08-22  Martin Baulig  <martin@ximian.com>
5530
5531         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5532         can only be assigned in static constructors.  Fixes #47161.
5533
5534 2003-08-22  Martin Baulig  <martin@ximian.com>
5535
5536         Rewrote and improved the flow analysis code.
5537
5538         * flowbranching.cs (FlowBranching): Make this class abstract.
5539         (FlowBranching.CreateBranching): New static function to create a
5540         new flow branching.
5541         (FlowBranchingBlock, FlowBranchingException): New classes.
5542         (FlowBranching.UsageVector.Type): New public readonly field.
5543         (FlowBranching.UsageVector.Breaks): Removed the setter.
5544         (FlowBranching.UsageVector.Returns): Removed the setter.
5545         (FlowBranching.UsageVector): Added Break(), Return(),
5546         NeverReachable() and Throw() methods to modify the reachability.
5547         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5548         done by FlowBranching.Merge().
5549         (FlowBranching.UsageVector.MergeChild): New method; merges the
5550         merge result into the current vector.
5551         (FlowBranching.Merge): New abstract method to merge a branching.
5552
5553 2003-08-12  Martin Baulig  <martin@ximian.com>
5554
5555         * expression.cs (Indirection.CacheTemporaries): Create the
5556         LocalTemporary with the pointer type, not its element type.
5557
5558 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5559
5560         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5561         token was a keyword or not.
5562
5563         Add `error' options where an IDENTIFIER was expected;  Provide
5564         CheckToken and CheckIdentifierToken convenience error reporting
5565         functions. 
5566
5567         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5568
5569         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5570         NameSpaceEntry NameSpaceEntry.
5571
5572         (LookupInterfaceOrClass): Avoid creating a full qualified name
5573         from namespace and name: avoid doing lookups when we know the
5574         namespace is non-existant.   Use new Tree.LookupByNamespace which
5575         looks up DeclSpaces based on their namespace, name pair.
5576
5577         * driver.cs: Provide a new `parser verbose' to display the
5578         exception thrown during parsing.  This is turned off by default
5579         now, so the output of a failure from mcs is more graceful.
5580
5581         * namespace.cs: Track all the namespaces defined in a hashtable
5582         for quick lookup.
5583
5584         (IsNamespace): New method
5585
5586 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5587
5588         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5589         we know that we need to concatenate (full typename can never be
5590         null). 
5591
5592         * class.cs: ditto.
5593
5594         * statement.cs: Use a bitfield;  Do not initialize to null things
5595         which are done by the constructor by default.
5596
5597         * cs-parser.jay: bug fix, parameter was 4, not 3.
5598
5599         * expression.cs: Just use the property;
5600
5601         * statement.cs: No need for GetVariableInfo method.
5602
5603 2003-08-08  Martin Baulig  <martin@ximian.com>
5604
5605         * flowanalysis.cs (FlowReturns): This is now nested in the
5606         `FlowBranching' class.
5607         (MyBitVector): Moved this here from statement.cs.
5608         (FlowBranching.SiblingType): New enum type.
5609         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5610
5611 2003-08-07  Martin Baulig  <martin@ximian.com>
5612
5613         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5614         `FlowBranching' class and called `BranchingType'.
5615
5616 2003-08-07  Martin Baulig  <martin@ximian.com>
5617
5618         * flowanalysis.cs: Moved all the control flow analysis code into
5619         its own file.
5620
5621 2003-08-07  Martin Baulig  <martin@ximian.com>
5622
5623         * assign.cs (Assign.DoResolve): `target' must either be an
5624         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5625         #37319.
5626
5627 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5628
5629         * expression.cs (BinaryMethod): This kind of expression is created by the
5630         Binary class if it determines that the operator has to be handled
5631         by a method.
5632
5633         (BinaryDelegate): This kind of expression is created if we are
5634         dealing with a + or - operator on delegates.
5635
5636         (Binary): remove method, argumetns, and DelegateOperator: when
5637         dealing with methods, 
5638
5639         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5640
5641         * statement.cs (Block): use bitfields for the three extra booleans
5642         we had in use.   Remove unused topblock parameter.
5643
5644         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5645
5646         * assign.cs: Drop extra unneeded tests.
5647
5648 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5649
5650         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5651
5652         * statement.cs (Foreach): Use VariableStorage instead of
5653         LocalBuilders.   
5654
5655         * codegen.cs (VariableStorage): New class used by clients that
5656         require a variable stored: locals or fields for variables that
5657         need to live across yield.
5658
5659         Maybe provide a convenience api for EmitThis+EmitLoad?
5660
5661         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5662         these bad boys.
5663
5664 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5665
5666         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5667         RemapParameterLValue): New methods that are used to turn a
5668         precomputed FieldInfo into an expression like this:
5669
5670                 instance.FieldInfo
5671
5672         The idea is to use this instead of making LocalVariableReference
5673         have more than one meaning.
5674
5675         * cs-parser.jay: Add error production to BASE.
5676
5677         * ecore.cs: Deal with TypeManager.GetField returning null, which
5678         is now a valid return value.
5679
5680         (FieldExprNoAddress): New expression for Fields whose address can
5681         not be taken.
5682
5683         * expression.cs (LocalVariableReference): During the resolve
5684         phases, create new expressions if we are in a remapping context.
5685         Remove code that dealt with remapping here.
5686
5687         (ParameterReference): same.
5688
5689         (ProxyInstance): New expression, like the `This' expression, but
5690         it is born fully resolved.  We know what we are doing, so remove
5691         the errors that are targeted to user-provided uses of `this'.
5692
5693         * statement.cs (Foreach): our variable is now stored as an
5694         Expression;  During resolution, follow the protocol, dont just
5695         assume it will return this.
5696
5697 2003-08-06  Martin Baulig  <martin@ximian.com>
5698
5699         * support.cs (SeekableStreamReader.cs): New public class.
5700
5701         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5702         SeekableStreamReader instead of the normal StreamReader.
5703
5704 2003-08-04  Martin Baulig  <martin@ximian.com>
5705
5706         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5707         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5708         deambiguate casts and delegate invocations.
5709         (parenthesized_expression): Use the new tokens to ensure this is
5710         not a cast of method invocation.
5711
5712         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5713         when reading a `)' and Deambiguate_CloseParens () was previously
5714         called.
5715
5716         * expression.cs (ParenthesizedExpression): New class.  This is
5717         just used for the CS0075 test.
5718         (Binary.DoResolve): Check for CS0075.   
5719
5720 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5721
5722         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5723         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5724         reference comparison.
5725
5726         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5727         examine the ReturnType for equality - this is necessary in the
5728         cases of implicit and explicit operators whose signature also
5729         includes the return type.
5730
5731 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5732
5733         * namespace.cs: Cache the result of the namespace computation,
5734         instead of computing it every time.
5735
5736 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5737
5738         * decl.cs: Use a global arraylist that we reuse over invocations
5739         to avoid excesive memory consumption.  Reduces memory usage on an
5740         mcs compile by one meg (45 average).
5741
5742         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5743         private, work around that.
5744
5745 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5746
5747         * literal.cs (IntLiteral): Define Zero and One static literals. 
5748
5749         * cs-parser.jay (integer_literal): use static literals to reduce
5750         memory usage for the most used literals (0, 1 and -1).  211kb
5751         reduced in memory usage.
5752
5753         Replace all calls to `new ArrayList' with `new
5754         ArrayList(4)' which is a good average number for most allocations,
5755         and also requires only 16 bytes of memory for its buffer by
5756         default. 
5757
5758         This reduced MCS memory usage in seven megabytes for the RSS after
5759         bootstrapping.
5760
5761 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5762
5763         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5764         handle params methods the correct way by forming only one
5765         applicable set with params and normal methods in them. Earlier we
5766         were looking at params methods only if we found no normal methods
5767         which was not the correct thing to do.
5768
5769         (Invocation.BetterFunction): Take separate arguments indicating
5770         when candidate and the best method are params methods in their
5771         expanded form.
5772
5773         This fixes bugs #43367 and #46199.
5774
5775         * attribute.cs: Documentation updates.
5776
5777         (CheckAttribute): Rename to CheckAttributeTarget.
5778         (GetValidPlaces): Rename to GetValidTargets.
5779
5780         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5781         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5782
5783         Fixes bug #44468.
5784
5785 2003-07-28  Martin Baulig  <martin@ximian.com>
5786
5787         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5788         name when looking up the base class of a nested class.  Fixes #46977.
5789
5790 2003-07-26  Martin Baulig  <martin@ximian.com>
5791
5792         * expression.cs (Indexers.Indexer): New nested struct; contains
5793         getter, setter and the indexer's type.
5794         (Indexers.Properties): This is now an ArrayList of
5795         Indexers.Indexer's.
5796         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5797         indexer doesn't have any getters.
5798
5799         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5800         for embedded property and indexer assignments.
5801
5802 2003-07-26  Martin Baulig  <martin@ximian.com>
5803
5804         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5805         preprocessor directive is not the first non-whitespace character
5806         on a line.
5807
5808 2003-07-26  Martin Baulig  <martin@ximian.com>
5809
5810         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5811         namespace parsing, follow the spec more closely.
5812
5813         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5814         NamespaceEntry.Lookup().
5815
5816 2003-07-25  Martin Baulig  <martin@ximian.com>
5817
5818         * MethodCore.cs (OverridesSomething): New public field; it's set
5819         from TypeContainer.DefineMembers if this method overrides
5820         something (which doesn't need to be a method).  Fix #39462.
5821
5822 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5823
5824         * typemanager.cs (GetMembers): Ensure that the list of members is
5825         reversed. This keeps things in sync.
5826
5827         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5828         find an AttributeUsage attribute.
5829
5830         * expression.cs (Invocation.OverloadResolve): Perform the check
5831         which disallows Invoke to be directly called on a Delegate.
5832
5833         (Error_InvokeOnDelegate): Report error cs1533.
5834
5835 2003-07-25  Martin Baulig  <martin@ximian.com>
5836
5837         * expression.cs (Indexers.GetIndexersForType): Only look in the
5838         interface hierarchy if the requested type is already an
5839         interface.  Fixes #46788 while keeping #46502 fixed.
5840
5841 2003-07-25  Martin Baulig  <martin@ximian.com>
5842
5843         * class.cs (TypeContainer.DefineMembers): Check whether all
5844         readonly fields have been assigned and report warning CS0649 if
5845         not.
5846
5847         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5848         a valuetype.
5849
5850 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5851
5852         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5853         returned from GetMethods to make things consistent with the
5854         assumptions MCS makes about ordering of methods.
5855
5856         This should comprehensively fix bug #45127 and it does :-)
5857
5858         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5859         ordering is actually reverse.
5860
5861         * Clean up some debug messages I left lying around.
5862
5863         * interface.cs (Populate*): Get rid of code which emits attributes
5864         since the stage in which we emit attributes is the 'Emit' stage,
5865         not the define stage.
5866
5867         (Emit): Move attribute emission for interface members here.
5868
5869 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5870
5871         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5872         closely: we eliminate methods in base types when we have an
5873         applicable method in a top-level type.
5874
5875         Please see section 14.5.5.1 for an exact description of what goes
5876         on. 
5877
5878         This fixes bug #45127 and a host of other related to corlib compilation.
5879
5880         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5881         array is the method corresponding to the top-level type (this is
5882         because of the changes made to icall.c) so we change this
5883         accordingly.
5884
5885         (MethodGroupExpr.Name): This too.
5886
5887         * typemanager.cs (GetElementType): New method which does the right
5888         thing when compiling corlib. 
5889
5890         * everywhere: Make use of the above in the relevant places.
5891
5892 2003-07-22  Martin Baulig  <martin@ximian.com>
5893
5894         * cs-parser.jay (invocation_expression): Moved
5895         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5896         `cast_expression', but create a InvocationOrCast which later
5897         resolves to either an Invocation or a Cast.
5898
5899         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5900         method; call this before EmitStatement() to make sure that this
5901         expression can be used as a statement.
5902
5903         * expression.cs (InvocationOrCast): New class; resolves to either
5904         an Invocation or a Cast.
5905
5906         * statement.cs (StatementExpression): Call ResolveStatement() on
5907         the ExpressionStatement before emitting it.
5908
5909 2003-07-21  Martin Baulig  <martin@ximian.com>
5910
5911         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5912         `ref' and `out' attributes match; fixes #46220.
5913         (MemberAccess.ResolveMemberAccess): You can't reference a type
5914         through an expression; fixes #33180.
5915         (Indexers.GetIndexersForType): Don't return the indexers from
5916         interfaces the class implements; fixes #46502.
5917
5918 2003-07-21  Martin Baulig  <martin@ximian.com>
5919
5920         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5921         CS0661 checks; fixes bug #30442.
5922
5923 2003-07-21  Martin Baulig  <martin@ximian.com>
5924
5925         * decl.cs (AdditionResult): Added `Error'.
5926
5927         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5928
5929         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5930         makes cs0031.cs actually work.
5931
5932 2003-07-20  Martin Baulig  <martin@ximian.com>
5933
5934         * namespace.cs: Fixed that bug which caused a crash when compiling
5935         the debugger's GUI.
5936
5937 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5938
5939         * typemanager.cs (LookupTypeReflection): Never expose types which
5940         are NotPublic, NestedPrivate, NestedAssembly, or
5941         NestedFamANDAssem.  We used to return these, and later do a check
5942         that would report a meaningful error, but the problem is that we
5943         would not get the real match, if there was a name override.
5944
5945 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5946
5947         * namespace.cs (Namespace, Name): Do not compute the namespace
5948         name dynamically, compute it in the constructor.  This reduced
5949         memory usage by 1697 KB.
5950
5951         * driver.cs: Use --pause to pause at the end.
5952
5953 2003-07-17  Peter Williams  <peter@newton.cx>
5954
5955         * Makefile: Change the name of the test target so that it doesn't
5956         conflict with the recursive test target.
5957
5958 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5959
5960         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5961         AddressOf): Do not use EmitThis, that was wrong, use the actual
5962         this pointer.
5963
5964 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5965
5966         * class.cs (MethodData.Define): While checking if a method is an
5967         interface implementation, improve the test: If we are not public
5968         (use new test here: use the computed MethodAttributes directly,
5969         instead of the parsed modifier flags) check if the `implementing'
5970         method comes from an interface or not.
5971
5972         * pending.cs (VerifyPendingMethods): Slightly better error
5973         message.
5974
5975         * makefile: add test target that does the mcs bootstrap.
5976
5977 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5978
5979         * interface.cs (Define): Do nothing here since there are no
5980         members to populate etc. Move the attribute emission out of here
5981         since this was just totally the wrong place to put it. Attribute
5982         application happens during the 'Emit' phase, not in the 'Define'
5983         phase.
5984
5985         (Emit): Add this method and move the attribute emission here
5986
5987         * rootcontext.cs (EmitCode): Call the Emit method on interface
5988         types too.
5989
5990 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5991
5992         * expression.cs (OverloadResolve): Report error only if Location
5993         is not 'Null' which means that there was a probe going on.
5994
5995 2003-07-14  Martin Baulig  <martin@ximian.com>
5996
5997         * expression.cs (ConditionalLogicalOperator): New public class to
5998         implement user defined conditional logical operators.
5999         This is section 14.11.2 in the spec and bug #40505.
6000
6001 2003-07-14  Martin Baulig  <martin@ximian.com>
6002
6003         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6004
6005 2003-07-14  Martin Baulig  <martin@ximian.com>
6006
6007         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6008
6009         * ecore.cs (IVariable.VerifyFixed): New interface method.
6010
6011         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6012         operator, check whether the variable is actually fixed.  Fixes bug
6013         #36055.  Set a variable definitely assigned when taking its
6014         address as required by the spec.
6015
6016         * statement.cs (LocalInfo.IsFixed): New field.
6017         (LocalInfo.MakePinned): Set `IsFixed' to true.
6018
6019 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6020
6021         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6022         for .ctors, ensure that we only ask for members declared in the
6023         attribute type (BindingFlags.DeclaredOnly).
6024
6025         Fixes bug #43632.
6026
6027         * expression.cs (Error_WrongNumArguments): Report error 1501
6028         correctly the way CSC does.
6029
6030 2003-07-13  Martin Baulig  <martin@ximian.com>
6031
6032         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6033         lookup on the fully qualified name, to make things like "X.X" work
6034         where "X.X" is a fully qualified type name, but we also have a
6035         namespace "X" in the using list.  Fixes #41975.
6036
6037 2003-07-13  Martin Baulig  <martin@ximian.com>
6038
6039         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6040         function. If we're a CompoundAssign, we need to create an embedded
6041         CompoundAssign, not an embedded Assign.
6042         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6043         Fixes #45854.
6044
6045 2003-07-13  Martin Baulig  <martin@ximian.com>
6046
6047         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6048         work to fix bug #46088.
6049
6050 2003-07-13  Ravi Pratap <ravi@ximian.com>
6051
6052         * class.cs (Operator.Emit): Do not emit attributes here - it is
6053         taken care of by the Method class that we delegate too. This takes
6054         care of bug #45876.
6055
6056 2003-07-10  Martin Baulig  <martin@ximian.com>
6057
6058         * expression.cs (TypeOfVoid): New class.
6059         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6060
6061 2003-07-10  Martin Baulig  <martin@ximian.com>
6062
6063         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6064         bug #35957.
6065
6066 2003-07-10  Martin Baulig  <martin@ximian.com>
6067
6068         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6069         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6070
6071         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6072
6073         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6074
6075 2003-07-10  Martin Baulig  <martin@ximian.com>
6076
6077         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6078         of decimal.  Fixes #42850.
6079
6080         NOTE: I also fixed the created byte blob, but this doesn't work on
6081         the MS runtime and csc never produces any byte blobs for decimal
6082         arrays.
6083
6084 2003-07-10  Martin Baulig  <martin@ximian.com>
6085
6086         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6087         structs; fixes #32068.
6088         (Block.AddChildVariableNames): Fixed #44302.
6089
6090 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6091
6092         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6093
6094 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6095
6096         * attribute.cs: And this test is onger needed.
6097
6098 2003-07-08  Martin Baulig  <martin@ximian.com>
6099
6100         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6101         inaccessible types.  Fixes #36313.
6102
6103         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6104
6105         * namespace.cs (NamespaceEntry): Create implicit entries for all
6106         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6107         implicit entries for N1.N2 and N1.
6108
6109 2003-07-08  Martin Baulig  <martin@ximian.com>
6110
6111         Rewrote the handling of namespaces to fix a lot of the issues
6112         wrt. `using' aliases etc.
6113
6114         * namespace.cs (Namespace): Splitted this class into a
6115         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6116
6117         * typemanager.cs (TypeManager.IsNamespace): Removed.
6118         (TypeManager.ComputeNamespaces): Only compute namespaces from
6119         loaded assemblies here, not the namespaces from the assembly we're
6120         currently compiling.
6121
6122 2003-07-08  Martin Baulig  <martin@ximian.com>
6123
6124         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6125
6126 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6127
6128         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6129         already fixed it.  
6130
6131         I thought about the memory savings here, but LookupTypeReflection
6132         is used under already very constrained scenarios.  Compiling
6133         corlib or mcs only exposes one hit, so it would not really reduce
6134         any memory consumption.
6135
6136 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6137
6138         * typemanager.cs: fixes bug #45889 by only adding public types from
6139         other assemblies to the list of known types.
6140
6141 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6142
6143         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6144         on the type we resolved.
6145
6146 2003-07-05  Martin Baulig  <martin@ximian.com>
6147
6148         * pending.cs (PendingImplementation.ParentImplements): Don't
6149         create the proxy if the parent is abstract.
6150
6151         * class.cs (TypeContainer.DefineIndexers): Process explicit
6152         interface implementations first.  Fixes #37714.
6153
6154 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6155
6156         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6157         defined recursively;  but since we modify the input parameters
6158         (left is set to `this' temporarily), we reset this value if the
6159         left_is_explicit is false, which gives the original semantics to
6160         the code.  
6161
6162         * literal.cs (NullPointer): new class used to represent a null
6163         literal in a pointer context.
6164
6165         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6166         type is a pointer, use a NullPointer object instead of a
6167         NullLiteral.   Closes 43687
6168
6169         (ExplicitConversion): Convert pointer values using
6170         the conv opcode to the proper type.
6171
6172         * ecore.cs (New): change ValueTypeVariable property into a method,
6173         that returns whether the valuetype is suitable for being used.
6174
6175         * expression.cs (Binary.DoNumericPromotions): Only return if we
6176         the int constant was a valid uint, and we can return both left and
6177         right as uints.  If not, we continue processing, to trigger the
6178         type conversion.  This fixes 39018.
6179
6180         * statement.cs (Block.EmitMeta): During constant resolution, set
6181         the CurrentBlock property on the emitcontext, so that we resolve
6182         constants propertly.
6183
6184 2003-07-02  Martin Baulig  <martin@ximian.com>
6185
6186         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6187         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6188
6189         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6190         than emitting it here.
6191
6192         * statement.cs: Fixed some more flow analysis bugs.
6193
6194 2003-07-02  Martin Baulig  <martin@ximian.com>
6195
6196         * class.cs (MethodData.Define): When implementing interface
6197         methods, set Final unless we're Virtual.
6198
6199         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6200         check work for interface methods.
6201
6202 2003-07-01  Martin Baulig  <martin@ximian.com>
6203
6204         * ecore.cs (EmitContext.This): Replaced this property with a
6205         GetThis() method which takes a Location argument.  This ensures
6206         that we get the correct error location for a CS0188.
6207
6208 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6209
6210         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6211         ImplicitStandardConversion.
6212
6213         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6214
6215 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6216
6217         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6218         optimization.
6219
6220 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6221
6222         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6223         constructors.
6224
6225         (MethodData.Define): Turn off initlocals for unsafe methods.
6226
6227 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6228
6229         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6230         complete;  Fixes #37521.
6231
6232         * delegate.cs: Use Modifiers.TypeAttr to compute the
6233         TypeAttributes, instead of rolling our own.  This makes the flags
6234         correct for the delegates.
6235
6236 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6237
6238         * class.cs (Constructor.Define): Set the private flag for static
6239         constructors as well.
6240
6241         * cs-parser.jay (statement_expression): Set the return value to
6242         null, to avoid a crash when we catch an error.
6243
6244 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6245
6246         * cs-parser.jay: Applied patch from Jackson that adds support for
6247         extern and unsafe modifiers to destructor declarations.
6248
6249         * expression.cs: Report error 21 if the user is trying to index a
6250         System.Array.
6251
6252         * driver.cs: Add an error message, suggested by the bug report.
6253
6254         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6255         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6256
6257 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6258
6259         * namespace.cs: Add some information to reduce FAQs.
6260
6261 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6262
6263         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6264         underlying enumeration types.  Fixes #43915.
6265
6266         * expression.cs: Treat ushort/short as legal values to be used in
6267         bitwise operations.
6268
6269 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6270
6271         * delegate.cs: transfer custom attributes for paramenters from
6272         the delegate declaration to Invoke and BeginInvoke.
6273
6274 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6275
6276         * attribute.cs: handle custom marshalers and emit marshal info
6277         for fields, too.
6278
6279 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6280
6281         * makefile.gnu: Added anonymous.cs to the compiler sources.
6282
6283 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6284
6285         * iterators.cs: Change the name of the proxy class to include two
6286         underscores.
6287
6288         * cs-parser.jay: Update grammar to include anonymous methods.
6289
6290         * anonymous.cs: new file.
6291
6292 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6293
6294         * class.cs (Field.Define): Add missing test for pointers and
6295         safety. 
6296
6297 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6298
6299         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6300         we use the stobj opcode.
6301
6302         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6303         since it wasn't the correct fix. 
6304
6305         It still is puzzling that we are required to use stobj for IntPtr
6306         which seems to be a ValueType.
6307
6308 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6309
6310         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6311         during regular simple name resolution.   Now, the trick is that
6312         instead of returning for processing the simplename, we do a
6313         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6314         contextual lookup type).   If a match is found, return that, if
6315         not, return for further composition.
6316
6317         This fixes long-standing 30485.
6318
6319         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6320         using the address to initialize an object, do an Stobj instead of
6321         using the regular Stelem.
6322
6323         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6324         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6325         Because if we are a BaseIndexerAccess that value will be true.
6326         Fixes 43643.
6327
6328         * statement.cs (GotoCase.Resolve): Return after reporting an
6329         error, do not attempt to continue. 
6330
6331         * expression.cs (PointerArithmetic.Emit): If our operand is a
6332         long, convert our constants to match the operand before
6333         multiplying.  Convert to I type before adding.   Fixes 43670.
6334
6335 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6336
6337         * enum.cs (ImplicitConversionExists) : Rename to
6338         ImplicitEnumConversionExists to remove ambiguity. 
6339
6340         * ecore.cs (NullCast): New type of cast expression class which
6341         basically is very similar to EmptyCast with the difference being
6342         it still is a constant since it is used only to cast a null to
6343         something else
6344         (eg. (string) null)
6345
6346         * convert.cs (ImplicitReferenceConversion): When casting a null
6347         literal, we return a NullCast.
6348
6349         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6350         should be around anymore.
6351
6352         The renaming (reported was slightly wrong). Corrections:
6353
6354         ConvertImplicitStandard -> ImplicitConversionStandard
6355         ConvertExplicitStandard -> ExplicitConversionStandard
6356
6357         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6358         before passing them in !
6359
6360         * convert.cs (ImplicitConversionStandard): When comparing for
6361         equal expr and target types, ensure that expr is not a
6362         NullLiteral.
6363
6364         In general, we must not be checking (expr_type ==
6365         target_type) in the top level conversion methods
6366         (ImplicitConversion, ExplicitConversion etc). This checking is
6367         done in the methods that they delegate to.
6368
6369 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6370
6371         * convert.cs: Move Error_CannotConvertType,
6372         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6373         ImplicitNumericConversion, ImplicitConversionExists,
6374         ImplicitUserConversionExists, StandardConversionExists,
6375         FindMostEncompassedType, FindMostSpecificSource,
6376         FindMostSpecificTarget, ImplicitUserConversion,
6377         ExplicitUserConversion, GetConversionOperators,
6378         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6379         TryImplicitIntConversion, Error_CannotConvertImplicit,
6380         ConvertImplicitRequired, ConvertNumericExplicit,
6381         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6382         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6383         its own file.
6384
6385         Perform the following renames:
6386
6387         StandardConversionExists -> ImplicitStandardConversionExists
6388         ConvertImplicit -> ImplicitConversion
6389         ConvertImplicitStandard -> ImplicitStandardConversion
6390         TryImplicitIntConversion -> ImplicitIntConversion
6391         ConvertImplicitRequired -> ImplicitConversionRequired
6392         ConvertNumericExplicit -> ExplicitNumericConversion
6393         ConvertReferenceExplicit -> ExplicitReferenceConversion
6394         ConvertExplicit -> ExplicitConversion
6395         ConvertExplicitStandard -> ExplicitStandardConversion
6396
6397 2003-05-19  Martin Baulig  <martin@ximian.com>
6398
6399         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6400         (TypeInfo): Added support for structs having structs as fields.
6401
6402         * ecore.cs (FieldExpr): Implement IVariable.
6403         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6404         VariableInfo for the field.
6405
6406 2003-05-18  Martin Baulig  <martin@ximian.com>
6407
6408         * expression.cs (This.DoResolve): Report a CS0027 if we're
6409         emitting a field initializer.
6410
6411 2003-05-18  Martin Baulig  <martin@ximian.com>
6412
6413         * expression.cs (This.ResolveBase): New public function.
6414         (This.DoResolve): Check for CS0188.
6415
6416         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6417         This.Resolve().
6418
6419         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6420         `instance_expression' to null if we don't have any non-static
6421         methods.
6422
6423 2003-05-18  Martin Baulig  <martin@ximian.com>
6424
6425         Reworked the way how local variables and parameters are handled by
6426         the flow analysis code.
6427
6428         * statement.cs (TypeInfo, VariableMap): New public classes.
6429         (VariableInfo): New public class.  This is now responsible for
6430         checking whether a variable has been assigned.  It is used for
6431         parameters and local variables.
6432         (Block.EmitMeta): Take the InternalParameters as argument; compute
6433         the layout of the flow vectors here.
6434         (Block.LocalMap, Block.ParameterMap): New public properties.
6435         (FlowBranching): The .ctor doesn't get the InternalParameters
6436         anymore since Block.EmitMeta() now computes the layout of the flow
6437         vector.
6438         (MyStructInfo): This class is now known as `StructInfo' and nested
6439         in `TypeInfo'; we don't access this directly anymore.
6440
6441         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6442         property and removed IsAssigned(), IsFieldAssigned(),
6443         SetAssigned() and SetFieldAssigned(); we now call them on the
6444         VariableInfo so we don't need to duplicate this code everywhere.
6445
6446         * expression.cs (ParameterReference): Added `Block block' argument
6447         to the .ctor.
6448         (LocalVariableReference, ParameterReference, This): The new
6449         VariableInfo class is now responsible for all the definite
6450         assignment stuff.
6451
6452         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6453         IsParameterAssigned, SetParameterAssigned): Removed.
6454
6455 2003-05-18  Martin Baulig  <martin@ximian.com>
6456
6457         * typemanager.cs (InitCoreTypes): Try calling
6458         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6459         the 3-args-version.  Corlib now also needs our `void_type'.
6460         (GetMethod): Added overloaded version which takes an optional
6461         `bool report_errors' to allow lookups of optional methods.
6462
6463 2003-05-12  Martin Baulig  <martin@ximian.com>
6464
6465         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6466         only used for locals and not for parameters.
6467
6468 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6469
6470         * support.cs (InternalParameters.ParameterType): Return the
6471         ExternalType of the parameter.
6472
6473         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6474         they were unused.
6475
6476 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6477
6478         * class.cs (MethodData.Define): Do not set the `newslot' on
6479         interface members, if they are also flagged as "override".
6480
6481         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6482         better code for ++i and i++.  This only works for static fields
6483         and local variables.
6484
6485         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6486         want to pull the DeclSpace out of the builder_to_declspace instead
6487         of the TypeBuilder (like in TypeContainer.FindMembers).
6488
6489         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6490         instead of LookupTypeContainer.  Fixes the crash on .NET for
6491         looking up interface members.
6492
6493         * const.cs: Create our own emit context during the Definition
6494         stage, so that constants are evaluated in the proper context, when
6495         a recursive definition happens.
6496
6497 2003-05-11  Martin Baulig  <martin@ximian.com>
6498
6499         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6500         new block for a switch section.
6501         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6502         the adding/lookup in the switch block.  Fixes #39828.
6503
6504 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6505
6506         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6507         functionality: I needed to convert the data after I had performed
6508         the add/sub operation into the operands type size.
6509
6510         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6511         pass the type for the box operation, otherwise the resulting
6512         object would have been of type object.
6513
6514         (BoxedCast): Add constructor to specify the type to box as.
6515
6516 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6517
6518         * iterators.cs: I was reusing the `count' variable inadvertently,
6519         take steps to not allow this to happen.
6520
6521 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6522
6523         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6524         by creating an array at the point where the params starts and
6525         putting all those arguments there, then adjusting the size of the
6526         array.
6527
6528 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6529
6530         * expression.cs (New.AddressOf): Implement interface
6531         IMemoryLocation.  This is used when the `new' operator is used in
6532         the context of an invocation to a method on a value type.
6533
6534         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6535         example. 
6536
6537         * namespace.cs: Also check the using aliases here.
6538
6539         * driver.cs: Move the test for using validity after the types have
6540         been entered, so we do a single pass that also includes the using
6541         aliases. 
6542
6543         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6544         in the regular case.   CreateSiblingForFinally is doing extra
6545         error checking.
6546
6547         * attribute.cs (GetAttributeArgumentExpression): Store the result
6548         on an out value, and use the return value to indicate failure
6549         instead of using null (which is a valid return for Constant.GetValue).
6550
6551         * statement.cs: Perform the analysis flow for the increment
6552         portion after the statement, because this will be the real flow of
6553         execution.  Fixes #42385
6554
6555         * codegen.cs (EmitContext.EmitArgument,
6556         EmitContext.EmitStoreArgument): New helper functions when the
6557         RemapToProxy flag is set.
6558
6559         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6560         function.
6561
6562         Add support for remapping parameters. 
6563
6564         * iterators.cs: Propagate parameter values;  Store parameter
6565         values in the proxy classes.
6566
6567 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6568
6569         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6570         need a proxy reference;  I do not know what I was thinking
6571
6572         * cs-parser.jay (constructor_initializer): catch another error,
6573         and display nice message.
6574
6575         (field_declaration): catch void field declaration
6576         to flag a better error. 
6577
6578         * class.cs (MemberBase.CheckBase): Report an error instead of a
6579         warning if a new protected member is declared in a struct. 
6580         (Field.Define): catch the error of readonly/volatile.
6581
6582         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6583
6584         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6585         volatile variable is taken
6586
6587 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6588
6589         * statement.cs (Fixed.Resolve): Report an error if we are not in
6590         an unsafe context.
6591
6592 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6593
6594         * typemanager.cs: reuse the code that handles type clashes for
6595         delegates and enumerations.
6596
6597         * class.cs (Report28): Always report.
6598
6599         * expression.cs (EncodeAsAttribute): Allow nulls here.
6600
6601 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6602
6603         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6604         the functionality for testing whether an expression is valid for
6605         an attribute here.  Also handle the case of arrays of elements
6606         being stored. 
6607
6608         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6609         encoding a linear array into an array of objects that are suitable
6610         to be passed to an CustomAttributeBuilder.
6611
6612         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6613
6614         * ecore.cs: (FieldExpr): Handle field remapping here.
6615
6616         * iteratators.cs: Pass the instance variable (if the method is an
6617         instance method) to the constructors, so we can access the field
6618         variables on the class.
6619
6620         TODO: Test this with structs.  I think the THIS variable on
6621         structs might have to be a pointer, and not a refenrece
6622
6623 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6624
6625         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6626         local variables to fields in a proxy class.
6627
6628         * iterators.cs (PopulateProxy): Rename our internal fields to
6629         <XXX>.  
6630         Create a <THIS> field if we are an instance method, so we can
6631         reference our parent container variables.
6632         (MapVariable): Called back from the EmitContext code to enter a
6633         new variable to field mapping into the proxy class (we just create
6634         a FieldBuilder).
6635
6636         * expression.cs
6637         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6638         for using the remapped locals to fields.
6639
6640         I placed the code here, because that gives the same semantics to
6641         local variables, and only changes the Emit code.
6642
6643         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6644         statements inside iterators.
6645         (VariableInfo): Add a FieldBuilder for the cases when we are
6646         remapping local variables to fields in a proxy class
6647
6648         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6649         current_block != null.
6650
6651         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6652         not cope with strings, as it has been moved to the
6653         TableSwitchEmit.  Fixed bug in switch generation.
6654
6655         * expression.cs (New.DoResolve): Provide more context for the user
6656         when reporting an error.
6657
6658         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6659         pointers. 
6660
6661         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6662         check the permissions for it.  Note than in a type-resolution
6663         context the check was already present in DeclSpace.ResolveType,
6664         but was missing from the MemberAccess.
6665
6666         (ArrayCreation.CheckIndices): warn if the user has
6667         more nested levels of expressions, but there are no more
6668         dimensions specified.  Avoids crash on bug 41906.
6669
6670 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6671
6672         * statement.cs (Block): replace Implicit bool, for a generic
6673         flags.   
6674         New flag: `Unchecked'.  This is used during the EmitMeta phase
6675         (which is out-of-line with the regular Resolve/Emit process for a
6676         statement, as this is done ahead of time, but still gets a chance
6677         to call constant resolve).
6678
6679         (Block.Flags): new enum for adding a new flag.
6680
6681         (Block.EmitMeta): track the state of unchecked.
6682
6683         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6684         to enable constant resolution to work there as well.
6685
6686 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6687
6688         * typemanager.cs (ienumerable_type): Also look up
6689         System.Collections.IEnumerable. 
6690
6691 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6692
6693         TODO: Test more than one conditional per method.
6694
6695         * class.cs (Indexer.Define): Report the location where the user is
6696         referencing the unsupported feature.
6697
6698         (MethodData): Overload the use of `conditionals' to
6699         minimize the creation of needless ArrayLists.   This saves roughly
6700         212kb on my machine.
6701
6702         (Method): Implement the new IIteratorContainer interface.
6703         (Method.SetYields): Implement the method by setting the ModFlags
6704         to contain METHOD_YIELDS.
6705
6706         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6707         which just got set to null.
6708
6709         * iterators.cs: New file.
6710
6711         (Yield, YieldBreak): New statements.
6712
6713         * statement.cs (Return.Resolve): Flag an error if we are used in
6714         an iterator method.
6715
6716         * codegen.cs (InIterator): New flag set if the code is being
6717         compiled in an iterator method.
6718
6719         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6720         internal modifier, and we just use it to avoid adding extra
6721         fields, as this is seldom used.  
6722
6723         * cs-parser.jay: Add yield_statement (yield and yield break).
6724
6725         * driver.cs: New flag -v2 to turn on version 2 features. 
6726
6727         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6728         hashtable when v2 is enabled.
6729
6730 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6731
6732         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6733         there is already a namespace defined with this name.
6734
6735         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6736         people upgraded their corlibs.
6737
6738         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6739         always use fully qualified types, no need to use the compiler
6740         front end.
6741
6742         (TypeManager.IsNamespace): Use binarysearch.
6743
6744         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6745         AddDelegate): I did not quite use the new IsValid API properly: I
6746         have to pass the short-name and the fullname.  I was passing only
6747         the basename instead of the fullname sometimes. 
6748
6749         (TypeContainer.DefineType): call NamespaceClash.
6750
6751         * interface.cs (Interface.DefineType): use NamespaceClash before
6752         defining the type.
6753
6754         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6755         defining the type.
6756
6757         * enum.cs: (Enum.DefineType): use NamespaceClash before
6758         defining the type.
6759
6760         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6761         speed increase.  First, use the negative_hits cache when we get a
6762         negative.  Second, add the type with its full original name
6763         instead of the new . and + encoded name (reflection uses + to
6764         separate type from a nested type).  Use LookupTypeReflection
6765         directly which bypasses the type->name hashtable (that we already
6766         know does not contain the type.
6767
6768         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6769         location/container type. 
6770
6771         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6772
6773 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6774
6775         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6776
6777         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6778         method is being referenced in the method group from a static
6779         context, and report error 120 if so.
6780
6781         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6782         Error118. 
6783
6784         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6785         is created, we create the A namespace).
6786
6787         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6788         Fixes #41591
6789
6790 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6791
6792         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6793         invocation to ModuleBuilder.GetType with the same values will
6794         return a new type instance, so we need to cache its return
6795         values. 
6796
6797         * expression.cs (Binary.ResolveOperator): Only allow the compare
6798         operators on enums if they are of the same type.
6799
6800         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6801         types of ValueType on their own case.  Before we were giving them
6802         the same treatment as objects.
6803
6804         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6805         fullname.  Short name is used to compare against container name.
6806         Fullname is used to check against defined namespace names.
6807
6808         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6809         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6810
6811         (Method.CheckBase): Call parent.
6812         (MemberBase.CheckBase): Check for protected members on sealed
6813         classes.
6814         (PropertyBase.CheckBase): Call parent.
6815         (Field.Define): Call parent.
6816
6817         * report.cs: Negative error codes are now mapped to 8000 - code,
6818         so that the display is render more nicely.
6819
6820         * typemanager.cs: Do not use try/catch, instead report a regular
6821         error. 
6822
6823         (GetPointerType, GetReferenceType): These methods provide
6824         mechanisms to obtain the T* and T& from a T.  We had the code
6825         previously scattered around the code base, and it also used
6826         TypeManager.LookupType that would go through plenty of caches.
6827         This one goes directly to the type source.
6828
6829         In some places we did the Type.GetType followed by
6830         ModuleBuilder.GetType, but not in others, so this unifies the
6831         processing as well.
6832
6833         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6834         statements now that we have namespace information.
6835
6836         * typemanager.cs (IsNamespace): New method, returns whether the
6837         string presented is a namespace or not.
6838
6839         (ComputeNamespaces): New public entry point, computes the list of
6840         available namespaces, using the GetNamespaces API call in Mono, or
6841         the slower version in MS.NET.   
6842
6843         Now before we start the semantic analysis phase, we have a
6844         complete list of namespaces including everything that the user has
6845         provided.
6846
6847         Deleted old code to cache namespaces in .nsc files.
6848
6849 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6850
6851         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6852         class/struct location definition Location for the implicit
6853         constructor location.
6854
6855         (Operator.Define): Use the location of the operator for the
6856         implicit Method definition.
6857
6858         (Constructor.Emit): use the constructor location for the implicit
6859         base initializer constructor.
6860
6861         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6862         and the Expression class now contains two new methods:
6863
6864         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6865         isolate type lookup from the rest of the resolution process.
6866
6867         Since we use Expressions to hold type definitions due to the way
6868         we parse the input we have historically overloaded Resolve to
6869         perform the Type lookups if a special flag is passed.  Now this is
6870         eliminated and two methods take their place. 
6871
6872         The differences in the two methods between xStep and xTerminal is
6873         that xStep is involved in our current lookup system that uses
6874         SimpleNames to compose a name, while xTerminal is used just to
6875         catch the case where the simplename lookup failed.
6876
6877 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6878
6879         * expression.cs (ResolveMemberAccess): Remove redundant code.
6880         TypeExpr expressions are always born fully resolved.
6881
6882         * interface.cs (PopulateMethod): Do not lookup the types twice.
6883         We were doing it once during SemanticAnalysis and once during
6884         PopulateMethod.
6885
6886         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6887         in local variable type definitions, were being returned as a
6888         SimpleName (we decomposed everything into a string), that is
6889         because primary_expression was being used instead of a type in the
6890         grammar (reduce/reduce conflicts).
6891
6892         The part that was wrong is that we converted the expression into a
6893         string (an oversimplification in one hand, compounded with primary
6894         expressions doing string concatenation).
6895
6896         So things like:
6897
6898         A.B.C [] x;
6899
6900         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6901         using clauses from working on this particular context.  And a type
6902         was being matched directly against "A.B.C[]".
6903
6904         We now use the correct approach, and allow for ComposedCast to be
6905         part of the unary expression.  So the "A.B.C []" become a composed
6906         cast of "A.B.C" (as a nested group of MemberAccess with a
6907         SimpleName at the end) plus the rank composition "[]". 
6908
6909         Also fixes 35567
6910
6911 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6912
6913         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6914         for the access level checking.
6915
6916         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6917         `TypeContainer container', because I kept getting confused when I
6918         was debugging this code.
6919
6920         * expression.cs (Indexers): Instead of tracking getters/setters,
6921         we now track them in parallel.  We create one arraylist less, but
6922         most importantly it is possible now for the LValue code to find a
6923         matching get for a set.
6924
6925         (IndexerAccess.DoResolveLValue): Update the code.
6926         GetIndexersForType has been modified already to extract all the
6927         indexers from a type.  The code assumed it did not.
6928
6929         Also make the code set the correct return type for the indexer.
6930         This was fixed a long time ago for properties, but was missing for
6931         indexers.  It used to be void_type.
6932
6933         (Binary.Emit): Test first for doubles instead of
6934         floats, as they are more common.
6935
6936         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6937         when dealing with floats and the <=, >= operators.  This fixes bug
6938         #39314 
6939
6940         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6941         to load the array value by emitting a load on the foreach variable
6942         type.  This was incorrect.  
6943
6944         We now emit the code to load an element using the the array
6945         variable type, and then we emit the conversion operator.
6946
6947         Fixed #40176
6948
6949 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6950
6951         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6952
6953 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6954
6955         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6956         test for protection before we test for signatures. 
6957
6958         (MethodSignature.ToString): implement.
6959
6960         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6961         to the case where we reduced into a LongConstant.
6962
6963         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6964         depend on whether the information is acurrate, because the
6965         Microsoft runtime will always claim that the array type is public,
6966         regardless of the real state.
6967
6968         If the type is a pointer, another problem happens: the type is
6969         reported as non-public in Microsoft.  
6970
6971         In both cases we have to call CheckAccessLevel recursively with
6972         the underlying type as the argument to be tested.
6973
6974 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6975
6976         * assign.cs (Assign.Emit): If we are dealing with a compound
6977         assignment expression, we should use the code path that stores the
6978         intermediate result in a temporary value.  This fixes #40903.
6979
6980         *expression.cs (Indirection.ToString): Provide ToString method for
6981         debugging. 
6982
6983 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6984
6985         * class.cs: Null out fields holding references to Block objects so
6986         they can be garbage collected.
6987
6988         * expression.cs (OverloadResolve): Remove unused local.
6989
6990 2003-04-07  Martin Baulig  <martin@ximian.com>
6991
6992         * codegen.cs (EmitContext.CurrentFile): New public field.
6993         (EmitContext.Mark): Use the CurrentFile to check whether the
6994         location is in the correct file.
6995         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6996
6997 2003-04-07  Martin Baulig  <martin@ximian.com>
6998
6999         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7000
7001         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7002         location.  [FIXME: The location argument which gets passed to this
7003         method is sometimes wrong!]
7004
7005 2003-04-07  Nick Drochak <ndrochak@gol.com>
7006
7007         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7008
7009 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7010
7011         * expression.cs (Indirection.EmitAssign): We were using the
7012         temporary, but returning immediately instead of continuing the
7013         EmitAssing flow.
7014
7015 2003-04-06  Martin Baulig  <martin@ximian.com>
7016
7017         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7018         if it's a nested child, but also deriving from the outer class.
7019         See test 190.cs.
7020
7021         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7022         nested child, but also deriving from the outer class.  See
7023         test-190.cs.
7024         (FilterWithClosure): We may access private members of the outer
7025         class if we're a nested child and deriving from the outer class.
7026         (RealMemberLookup): Only set `closure_private_ok' if the
7027         `original_bf' contained BindingFlags.NonPublic.
7028
7029 2003-04-05  Martin Baulig  <martin@ximian.com>
7030
7031         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
7032
7033 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7034
7035         * class.cs (Event.Define): Do not allow abstract events to have
7036         initializers. 
7037
7038 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7039
7040         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7041         block in event declarations.
7042
7043         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7044         value type, get its address.
7045
7046         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7047         leaving a class on the stack instead of a boolean value (int
7048         0/1).  Change the code so we compare against null, and then the
7049         result against zero.
7050
7051         * class.cs (TypeContainer.GetClassBases): We were checking for the
7052         parent class being sealed too late.
7053
7054         * expression.cs (Binary.Emit): For <= and >= when dealing with
7055         floating point values, use cgt.un and clt.un instead of cgt and
7056         clt alone.
7057
7058 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7059
7060         * statement.cs: Apply the same optimization as MS: skip the 
7061         GetEnumerator returning an IEnumerator, and use the one returning a 
7062         CharEnumerator instead. This allows us to avoid the try-finally block 
7063         and the boxing.
7064
7065 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7066
7067         * cs-parser.jay: Attributes cannot be applied to
7068                          namespaces. Fixes #40473
7069
7070 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7071
7072         * class.cs:
7073         (Add*): check if the name is valid using the full name for constants,
7074         fields, properties and events.
7075
7076 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7077
7078         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7079         char constants to be part of the enumeration.
7080
7081         * expression.cs (Conditional.DoResolve): Add support for operator
7082         true. Implements the missing functionality from 14.12
7083
7084         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7085         operator true/false as required by the spec.
7086
7087         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7088         implicit conversion to boolean.
7089
7090         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7091         also one where the type implements `operator true'. 
7092
7093         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7094         get an expression that will invoke operator true based on an
7095         expression.  
7096
7097         (GetConversionOperators): Removed the hack that called op_True
7098         here.  
7099
7100         (Expression.ResolveBoolean): Move this from Statement.
7101
7102 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7103
7104         * ecore.cs (FieldExpr): do not allow initialization of initonly
7105         fields on derived classes
7106
7107 2003-03-13  Martin Baulig  <martin@ximian.com>
7108
7109         * statement.cs (Block.Emit): Call ig.BeginScope() and
7110         ig.EndScope() when compiling with debugging info; call
7111         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7112
7113 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7114
7115         * expression.cs (Indexers): Do not construct immediately, allow
7116         for new members to be appended as we go.  Fixes 38143
7117
7118 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7119
7120         * expression.cs: save/restore context when resolving an unchecked
7121         expression.
7122
7123 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7124
7125         * cfold.cs: Catch division by zero in modulus operator during
7126         constant folding.
7127
7128 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7129
7130         * interface.cs (Interface.DefineMembers): Avoid defining members
7131         twice. 
7132
7133 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7134
7135         * driver.cs: handle the +/- options for -noconfig
7136
7137         * statement.cs (Unckeched.Resolve): Also track the state of
7138         unchecked in the Resolve phase.
7139
7140 2003-02-27  Martin Baulig  <martin@ximian.com>
7141
7142         * ecore.cs (Expression.MemberLookup): Don't create a
7143         MethodGroupExpr for something which is not a method.  Fixes #38291.
7144
7145 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7146
7147         * class.cs (MemberBase.CheckParameters): Also check that the type
7148         is unmanaged if it is a pointer.
7149
7150         * expression.cs (SizeOf.Resolve): Add location information.
7151
7152         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7153         a managed type is declared.
7154
7155         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7156         parameter modifiers as well.  Fixes bug 38606
7157
7158         * class.cs: Very sad.  Am backing out the speed up changes
7159         introduced by the ArrayList -> Array in the TypeContainer, as they
7160         were not actually that much faster, and introduced a bug (no error
7161         reports on duplicated methods).
7162
7163         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7164         source first, this will guarantee that we have a valid expression
7165         before calling in lower levels functions that will require a
7166         resolved object.  Then use this original_source in the
7167         target.ResolveLValue instead of the original source that was
7168         passed to us.
7169
7170         Another change.  Use target.Resolve instead of LValueResolve.
7171         Although we are resolving for LValues, we will let the Assign code
7172         take care of that (it will be called again from Resolve).  This
7173         basically allows code like this:
7174
7175         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7176         class Y { void A (X x) { x [0] += o; }
7177
7178         The problem was that the indexer was trying to resolve for
7179         set_Item (idx, object o) and never finding one.  The real set_Item
7180         was set_Item (idx, X).  By delaying the process we get the right
7181         semantics. 
7182
7183         Fixes bug 36505
7184
7185 2003-02-23  Martin Baulig  <martin@ximian.com>
7186
7187         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7188         while calling DoEmit ().
7189
7190         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7191         source files; if you use the #line directive inside a method, the
7192         compiler stops emitting line numbers for the debugger until it
7193         reaches the end of the method or another #line directive which
7194         restores the original file.
7195
7196 2003-02-23  Martin Baulig  <martin@ximian.com>
7197
7198         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7199
7200 2003-02-23  Martin Baulig  <martin@ximian.com>
7201
7202         * statement.cs (Block.AddChildVariableNames): We need to call this
7203         recursively, not just for our immediate children.
7204
7205 2003-02-23  Martin Baulig  <martin@ximian.com>
7206
7207         * class.cs (Event.Define): Always make the field private, like csc does.
7208
7209         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7210         actually work, fixes bug #37521.
7211
7212 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7213
7214         * delegate.cs: When creating the various temporary "Parameters"
7215         classes, make sure that we call the ComputeAndDefineParameterTypes
7216         on those new parameters (just like we do with the formal ones), to
7217         allow them to be resolved in the context of the DeclSpace.
7218
7219         This fixes the bug that Dick observed in Bugzilla #38530.
7220
7221 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7222
7223         * expression.cs (ResolveMemberAccess): When resolving a constant,
7224         do not attempt to pull a constant if the value was not able to
7225         generate a valid constant.
7226
7227         * const.cs (LookupConstantValue): Do not report more errors than required.
7228
7229 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7230
7231         * expression.cs: fixes bug #38328.
7232
7233 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7234
7235         * class.cs: Changed all the various members that can be part of a
7236         class from being an ArrayList to be an Array of the right type.
7237         During the DefineType type_list, interface_list, delegate_list and
7238         enum_list are turned into types, interfaces, delegates and enums
7239         arrays.  
7240
7241         And during the member population, indexer_list, event_list,
7242         constant_list, field_list, instance_constructor_list, method_list,
7243         operator_list and property_list are turned into their real arrays.
7244
7245         Although we could probably perform this operation earlier, for
7246         good error reporting we need to keep the lists and remove the
7247         lists for longer than required.
7248
7249         This optimization was triggered by Paolo profiling the compiler
7250         speed on the output of `gen-sample-program.pl' perl script. 
7251
7252         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7253         not crash in methods like MemberLookupFailed that use this field.  
7254
7255         This problem arises when the compiler fails to resolve a type
7256         during interface type definition for example.
7257
7258 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7259
7260         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7261         inherit from System.Object, so we have to stop at null, not only
7262         when reaching System.Object.
7263
7264 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7265
7266         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7267         DeclaredOnly because the parent indexer might have had a different
7268         name, but did not loop until the top of the hierarchy was reached.
7269
7270         The problem this one fixes is 35492: when a class implemented an
7271         indexer from an interface, we were getting the interface method
7272         (which was abstract) and we were flagging an error (can not invoke
7273         abstract method).
7274
7275         This also keeps bug 33089 functioning, and test-148 functioning.
7276
7277         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7278         out if a method is special is to see if it is declared in a
7279         property or event, or whether it is one of the predefined operator
7280         names.   This should fix correctly #36804.
7281
7282 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7283
7284         The goal here is to remove the dependency on EmptyCast.Peel ().
7285         Killing it completely.
7286
7287         The problem is that currently in a number of places where
7288         constants are expected, we have to "probe" for an EmptyCast, and
7289         Peel, which is not the correct thing to do, as this will be
7290         repetitive and will likely lead to errors. 
7291
7292         The idea is to remove any EmptyCasts that are used in casts that
7293         can be reduced to constants, so we only have to cope with
7294         constants. 
7295
7296         This bug hunt was triggered by Bug 37363 and the desire to remove
7297         the duplicate pattern where we were "peeling" emptycasts to check
7298         whether they were constants.  Now constants will always be
7299         constants.
7300
7301         * ecore.cs: Use an enumconstant here instead of wrapping with
7302         EmptyCast.  
7303
7304         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7305         throwing me off.  By handling this we can get rid of a few hacks.
7306
7307         * statement.cs (Switch): Removed Peel() code.
7308
7309 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7310
7311         * class.cs: Location information for error 508
7312
7313         * expression.cs (New.DoResolve): Add a guard against double
7314         resolution of an expression.  
7315
7316         The New DoResolve might be called twice when initializing field
7317         expressions (see EmitFieldInitializers, the call to
7318         GetInitializerExpression will perform a resolve on the expression,
7319         and later the assign will trigger another resolution
7320
7321         This leads to bugs (#37014)
7322
7323         * delegate.cs: The signature for EndInvoke should contain any ref
7324         or out parameters as well.  We were not doing this in the past. 
7325
7326         * class.cs (Field.Define): Do not overwrite the type definition
7327         inside the `volatile' group.  Turns out that volatile enumerations
7328         were changing the type here to perform a validity test, which
7329         broke conversions. 
7330
7331 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7332
7333         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7334         and structs, we do not want to load the instance variable
7335
7336         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7337         enum_type has to be handled like an object reference (implicit
7338         conversions exists from this to object), but the regular IsClass
7339         and IsValueType tests will never return true for this one.
7340
7341         Also we use TypeManager.IsValueType instead of type.IsValueType,
7342         just for consistency with the rest of the code (this is only
7343         needed if we ever use the construct exposed by test-180.cs inside
7344         corlib, which we dont today).
7345
7346 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7347
7348         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7349         just InternalCall.
7350
7351 2003-02-09  Martin Baulig  <martin@ximian.com>
7352
7353         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7354         (Namespace.DefineNamespaces): New static public method; this is
7355         called when we're compiling with debugging to add all namespaces
7356         to the symbol file.
7357
7358         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7359         pass it to the Namespace's .ctor.
7360
7361         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7362         and MethodBase arguments; pass the namespace ID to the symwriter;
7363         pass the MethodBase instead of the token to the symwriter.
7364         (SymbolWriter.DefineNamespace): New method to add a namespace to
7365         the symbol file.
7366
7367 2003-02-09  Martin Baulig  <martin@ximian.com>
7368
7369         * symbolwriter.cs: New file.  This is a wrapper around
7370         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7371         methods here in near future.
7372
7373 2003-02-09  Martin Baulig  <martin@ximian.com>
7374
7375         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7376         ILGenerator.MarkSequencePoint() which are actually used by the
7377         symbol writer.
7378
7379 2003-02-09  Martin Baulig  <martin@ximian.com>
7380
7381         * location.cs (SourceFile): New public sealed class.  This
7382         contains the name and an index which is used in the location's token.
7383         (Location): Reserve an appropriate number of bits in the token for
7384         the source file instead of walking over that list, this gives us a
7385         really huge performance improvement when compiling with debugging.
7386
7387         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7388         `SourceFile' argument instead of a string.
7389         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7390         but don't parse/tokenize here, we need to generate the list of all
7391         source files before we do that.
7392         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7393         the files.
7394
7395         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7396         instead of a string.
7397
7398         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7399         of a string.
7400
7401 2003-02-09  Martin Baulig  <martin@ximian.com>
7402
7403         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7404         filename on `#line default'.
7405
7406 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7407
7408         * statement.cs: don't clear the pinned var when the fixed statement
7409         returns from the method (fixes bug#37752).
7410
7411 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7412
7413         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7414         to IsValueType.
7415
7416 2003-02-07  Martin Baulig  <martin@ximian.com>
7417
7418         * driver.cs: Removed the `--debug-args' command line argument.
7419
7420         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7421         automatically by the AsssemblyBuilder.
7422         (CodeGen.InitializeSymbolWriter): We don't need to call any
7423         initialization function on the symbol writer anymore.  This method
7424         doesn't take any arguments.
7425
7426 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7427
7428         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7429         from referenced assemblies as well.
7430
7431 2003-02-02  Martin Baulig  <martin@ximian.com>
7432
7433         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7434
7435 2003-02-02  Martin Baulig  <martin@ximian.com>
7436
7437         * class.cs (Constructor.Emit): Open the symbol writer before
7438         emitting the constructor initializer.
7439         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7440         single-stepping through constructor initializers.
7441
7442 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7443
7444         * class.cs: Handle error 549: do not allow virtual methods in
7445         sealed classes. 
7446
7447 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7448
7449         * decl.cs: Check access levels when resolving types
7450
7451 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7452
7453         * statement.cs: Add parameters and locals set in catch blocks that might 
7454         return to set vector
7455
7456 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7457
7458         * class.cs (Operator): Set the SpecialName flags for operators.
7459
7460         * expression.cs (Invocation.DoResolve): Only block calls to
7461         accessors and operators on SpecialName methods.
7462
7463         (Cast.TryReduce): Handle conversions from char constants.
7464
7465
7466 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7467
7468         * statement.cs: small memory and time optimization in FlowBranching.
7469
7470 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7471
7472         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7473         problem that the last fix but in the other sid (Set).
7474
7475         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7476         access when there is no indexer in the hierarchy.
7477
7478 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7479
7480         * class.cs: Combine some if statements.
7481
7482 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7483
7484         * driver.cs: fixed bug #37187.
7485
7486 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7487
7488         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7489         any indexer, it's needed to build a list with all the indexers in the
7490         hierarchy (AllGetters), else we have problems. Fixes #35653.
7491
7492 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7493
7494         * class.cs (MethodData.Define): It is wrong for an interface
7495         implementation to be static in both cases: explicit and implicit.
7496         We were only handling this in one case.
7497
7498         Improve the if situation there to not have negations.
7499
7500         * class.cs (Field.Define): Turns out that we do not need to check
7501         the unsafe bit on field definition, only on usage.  Remove the test.
7502
7503 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7504
7505         * driver.cs: use assembly.Location instead of Codebase (the latest
7506         patch made mcs fail when using MS assemblies).
7507
7508 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7509
7510         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7511         get the path to *corlib.dll.
7512
7513 2003-01-21  Nick Drochak <ndrochak@gol.com>
7514
7515         * cs-tokenizer.cs:
7516         * pending.cs:
7517         * typemanager.cs: Remove compiler warnings
7518
7519 2003-01-20  Duncan Mak  <duncan@ximian.com>
7520
7521         * AssemblyInfo.cs: Bump the version number to 0.19.
7522
7523 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7524
7525         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7526
7527 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7528
7529         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7530
7531 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7532
7533         * cs-parser.jay: Small fix: we were not comparing the constructor
7534         name correctly.   Thanks to Zoltan for the initial pointer.
7535
7536 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7537
7538         * cs-tokenizer.cs: Set file name when specified with #line
7539
7540 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7541
7542         * cs-parser.jay: Only perform the constructor checks here if we
7543         are named like the class;  This will help provider a better
7544         error.  The constructor path is taken when a type definition is
7545         not found, but most likely the user forgot to add the type, so
7546         report that rather than the constructor error.
7547
7548 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7549
7550         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7551         allocations.
7552
7553 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7554
7555         * cs-parser.jay: Add cleanup call.
7556
7557 2003-01-13  Duncan Mak  <duncan@ximian.com>
7558
7559         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7560         consistent with other methods.
7561
7562 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7563
7564         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7565
7566 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7567
7568         * attribute.cs: only set GuidAttr to true when we have a
7569         GuidAttribute.
7570
7571 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7572
7573         * ecore.cs:
7574         * expression.cs:
7575         * typemanager.cs: fixes to allow mcs compile corlib with the new
7576         Type.IsSubclassOf fix.
7577
7578 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7579
7580         * expression.cs (LocalVariableReference.DoResolve): Classify a
7581         constant as a value, not as a variable.   Also, set the type for
7582         the variable.
7583
7584         * cs-parser.jay (fixed_statement): take a type instead of a
7585         pointer_type, so we can produce a better error message later.
7586
7587         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7588         as an error.  
7589
7590         (For.DoEmit): Make inifinite loops have a
7591         non-conditional branch back.
7592
7593         (Fixed.DoEmit): First populate the pinned variables, then emit the
7594         statement, then clear the variables.  Before I was emitting the
7595         code once for each fixed piece.
7596
7597
7598 2003-01-08  Martin Baulig  <martin@ximian.com>
7599
7600         * statement.cs (FlowBranching.MergeChild): A break in a
7601         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7602
7603 2003-01-08  Martin Baulig  <martin@ximian.com>
7604
7605         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7606         lives in the same number space than `param_map'.  Fixes #36154.
7607
7608 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7609
7610         * cs-parser.jay (constructor_declaration): Set the
7611         Constructor.ModFlags before probing for it.  This makes the
7612         compiler report 514, 515 and 132 (the code was there, but got
7613         broken). 
7614
7615         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7616         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7617         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7618
7619 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7620
7621         * enum.cs: create the enum static fields using the enum type.
7622
7623 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7624
7625         * class.cs: don't try to create the ParamBuilder for the return
7626         type if it's not needed (and handle it breaking for the ms runtime
7627         anyway).
7628
7629 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7630
7631         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7632
7633 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7634
7635         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7636         the command.   This showed up while compiling the JANET source
7637         code, which used \r as its only newline separator.
7638
7639 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7640
7641         * class.cs (Method.Define): If we are an operator (because it
7642         reuses our code), then set the SpecialName and HideBySig.  #36128
7643
7644 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7645
7646         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7647         exception, report error 120 `object reference required'.
7648
7649         * driver.cs: Add --pause option, used during to measure the size
7650         of the process as it goes with --timestamp.
7651
7652         * expression.cs (Invocation.DoResolve): Do not allow methods with
7653         SpecialName to be invoked.
7654
7655 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7656
7657         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7658         number before adding it.
7659
7660 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7661
7662         * ecore.cs (StandardImplicitConversion): When in an unsafe
7663         context, we allow conversion between void * to any other pointer
7664         type. This fixes bug #35973.
7665
7666 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7667
7668         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7669         is not thrown when extensionless outputs are used 
7670
7671 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7672
7673         * rootcontext.cs: fixed compilation of corlib.
7674
7675 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7676
7677         * attribute.cs (Attributes.Contains): Add new method.
7678
7679         * class.cs (MethodCore.LabelParameters): if the parameter is an
7680         `out' parameter, check that no attribute `[In]' has been passed.
7681
7682         * enum.cs: Handle the `value__' name in an enumeration.
7683
7684 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7685
7686         * decl.cs: Added special case to allow overrides on "protected
7687         internal" methods
7688
7689 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7690
7691         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7692         since it makes much more sense.
7693
7694         (Attributes.ctor): Don't require a Location parameter.
7695
7696         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7697
7698         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7699         since we already have that information per attribute.
7700
7701         * everywhere : make appropriate changes.
7702
7703         * class.cs (LabelParameters): Write the code which actually
7704         applies attributes to the return type. We can't do this on the MS
7705         .NET runtime so we flag a warning in the case an exception is
7706         thrown.
7707
7708 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7709
7710         * const.cs: Handle implicit null conversions here too.
7711
7712 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7713
7714         * class.cs (MethodCore.LabelParameters): Remove the extra
7715         Type [] parameter since it is completely unnecessary. Instead
7716         pass in the method's attributes so that we can extract
7717         the "return" attribute.
7718
7719 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7720
7721         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7722         of ignoring it and letting the compile continue.
7723
7724         * typemanager.cs (ChangeType): use an extra argument to return an
7725         error condition instead of throwing an exception.
7726
7727 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7728
7729         * expression.cs (Unary.TryReduce): mimic the code for the regular
7730         code path.  Perform an implicit cast in the cases where we can
7731         implicitly convert to one of the integral types, and then reduce
7732         based on that constant.   This fixes bug #35483.
7733
7734 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7735
7736         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7737
7738 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7739
7740         * namespace.cs: fixed bug #35489.
7741
7742 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7743
7744         * class.cs: Remove some dead code.
7745
7746         * cs-parser.jay: Estimate the number of methods needed
7747         (RootContext.MethodCount);
7748
7749         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7750         numbers instead of StringBuilders.
7751
7752         * support.cs (PtrHashtable): Add constructor with initial size;
7753         We can now reduce reallocations of the method table.
7754
7755 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7756
7757         * attribute.cs (ApplyAttributes): Keep track of the emitted
7758         attributes on a per-target basis. This fixes bug #35413.
7759
7760 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7761
7762         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7763         default to the Windows 1252 encoding.
7764
7765         (UnixParseOption): Support version, thanks to Alp for the missing
7766         pointer. 
7767
7768         * AssemblyInfo.cs: Add nice assembly information.
7769
7770         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7771         (bug 35169).
7772
7773         * cs-parser.jay: Allow a trailing comma before the close bracked
7774         in the attribute_section production.
7775
7776         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7777         address of the instance was being taken, I will take this out,
7778         because we take the address of the object immediately here.
7779
7780 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7781
7782         * typemanager.cs (AreMultipleAllowed): Take care of the most
7783         obvious case where attribute type is not in the current assembly -
7784         stupid me ;-)
7785
7786 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7787
7788         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7789         definitions, instead of doing that afterwards.  
7790
7791         Also we use a nice little hack, depending on the constructor, we
7792         know if we are a "composed" name or a simple name.  Hence, we
7793         avoid the IndexOf test, and we avoid 
7794
7795         * codegen.cs: Add code to assist in a bug reporter to track down
7796         the source of a compiler crash. 
7797
7798 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7799
7800         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7801         types have been emitted for a given element and flag an error
7802         if something which does not have AllowMultiple set is used more
7803         than once.
7804
7805         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7806         attribute types and their corresponding AllowMultiple properties
7807
7808         (AreMultipleAllowed): Check the property for a given type.
7809
7810         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7811         property in the case we have a TypeContainer.
7812
7813         (Attributes.AddAttribute): Detect duplicates and just skip on
7814         adding them. This trivial fix catches a pretty gross error in our
7815         attribute emission - global attributes were being emitted twice!
7816
7817         Bugzilla bug #33187 is now fixed.
7818
7819 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7820
7821         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7822         instead of pp_and).
7823
7824         * expression.cs (Binary.ResolveOperator): I can only use the
7825         Concat (string, string, string) and Concat (string, string,
7826         string, string) if the child is actually a concatenation of
7827         strings. 
7828
7829 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7830
7831         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7832         context where we need a 2-character lookahead.
7833
7834         * pending.cs (PendingImplementation): Rework so we can keep track
7835         of interface types all the time, and flag those which were
7836         implemented by parents as optional.
7837
7838 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7839
7840         * expression.cs (Binary.ResolveOperator): Use
7841         String.Concat(string,string,string) or
7842         String.Concat(string,string,string,string) when possible. 
7843
7844         * typemanager: More helper methods.
7845
7846
7847 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7848
7849         * pending.cs: remove the bogus return from GetMissingInterfaces()
7850         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7851
7852 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7853
7854         * namespace.cs: avoid duplicated 'using xxx' being added to
7855         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7856         when we get more than one 'using' statement for the same namespace.
7857         Report a CS0105 warning for it.
7858
7859 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7860
7861         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7862         of calling getChar/putback, uses internal knowledge of it.    
7863
7864         (xtoken): Reorder tokenizer so most common patterns are checked
7865         first.  This reduces the compilation time in another 5% (from 8.11s
7866         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7867
7868         The parsing time is 22% of the compilation in mcs, and from that
7869         64% is spent on the tokenization process.  
7870
7871         I tried using a binary search for keywords, but this is slower
7872         than the hashtable.  Another option would be to do a couple of
7873         things:
7874
7875                 * Not use a StringBuilder, instead use an array of chars,
7876                   with a set value.  Notice that this way we could catch
7877                   the 645 error without having to do it *afterwards*.
7878
7879                 * We could write a hand-parser to avoid the hashtable
7880                   compares altogether.
7881
7882         The identifier consumption process takes 37% of the tokenization
7883         time.  Another 15% is spent on is_number.  56% of the time spent
7884         on is_number is spent on Int64.Parse:
7885
7886                 * We could probably choose based on the string length to
7887                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7888                   computations. 
7889
7890         Another 3% is spend on wrapping `xtoken' in the `token' function.
7891
7892         Handle 0xa0 as whitespace (#34752)
7893
7894 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7895
7896         * typemanager.cs (IsCLRType): New routine to tell whether a type
7897         is one of the builtin types.  
7898
7899         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7900         typecode in more places instead of doing pointer comparissions.
7901         We could leverage some knowledge about the way the typecodes are
7902         laid out.
7903
7904         New code to cache namespaces in assemblies, it is currently not
7905         invoked, to be used soon.
7906
7907         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7908
7909         * expression.cs (Binary.ResolveOperator): specially handle
7910         strings, and do not perform user-defined operator overloading for
7911         built-in types.
7912
7913 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7914
7915         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7916         internalcall as it is a pretty simple operation;  Avoid whenever
7917         possible to call Char.IsLetter.
7918
7919         (consume_identifier): Cut by half the number of
7920         hashtable calls by merging the is_keyword and GetKeyword behavior.
7921
7922         Do not short-circuit, because if we do, we
7923         report errors (ie, #if false && true would produce an invalid
7924         directive error);
7925
7926
7927 2002-11-24  Martin Baulig  <martin@ximian.com>
7928
7929         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7930         check constant ranges and report a CS0221.  Fixes #33186.
7931
7932 2002-11-24  Martin Baulig  <martin@ximian.com>
7933
7934         * cs-parser.jay: Make this work for uninitialized variable
7935         declarations in the `for' initializer.  Fixes #32416.
7936
7937 2002-11-24  Martin Baulig  <martin@ximian.com>
7938
7939         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7940         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7941
7942 2002-11-24  Martin Baulig  <martin@ximian.com>
7943
7944         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7945         argument; if true, we also check for user-defined conversions.
7946         This is only needed if both arguments are of a user-defined type.
7947         Fixes #30443, added test-175.cs.
7948         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7949
7950         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7951
7952 2002-11-24  Martin Baulig  <martin@ximian.com>
7953
7954         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7955         function to get the store opcode.
7956         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7957         only emit the Ldelema if the store opcode is Stobj.  You must run
7958         both test-34 and test-167 to test this.  Fixes #34529.
7959
7960 2002-11-23  Martin Baulig  <martin@ximian.com>
7961
7962         * ecore.cs (Expression.MemberLookup): Added additional
7963         `qualifier_type' argument which is used when we're being called
7964         from MemberAccess.DoResolve() and null if we're called from a
7965         SimpleName lookup.
7966         (Expression.MemberLookupFailed): New method to report errors; this
7967         does the CS1540 check and reports the correct error message.
7968
7969         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7970         argument for the CS1540 check and redone the way how we're dealing
7971         with private members.  See the comment in the source code for details.
7972         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7973         `closure_start_type' to `closure_qualifier_type' and check whether
7974         it's not null.  It was not this filter being broken, it was just
7975         being called with the wrong arguments.
7976
7977         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7978         and pass it the correct `qualifier_type'; this also does the error
7979         handling for us.
7980
7981 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7982
7983         * expression.cs (Invocation.EmitParams): If the we are dealing
7984         with a non-built-in value type, load its address as well.
7985
7986         (ArrayCreation): Use a a pretty constant instead
7987         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7988         static initializers.  
7989
7990         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7991         because they are not really value types, just glorified integers. 
7992
7993         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7994
7995         * ecore.cs: Remove redundant code for enumerations, make them use
7996         the same code path as everything else, fixes the casting issue
7997         with enumerations in Windows.Forms.
7998
7999         * attribute.cs: Do only cast to string if it is a string, the
8000         validation happens later.
8001
8002         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8003         people upgrade their corlibs.
8004
8005         * ecore.cs: Oops, enumerations were not following the entire code path
8006
8007 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8008
8009         * typemanager.cs (FilterWithClosure): Commented out the test for
8010         1540 in typemanager.cs, as it has problems when accessing
8011         protected methods from a parent class (see test-174.cs). 
8012
8013         * attribute.cs (Attribute.ValidateGuid): new method.
8014         (Attribute.Resolve): Use above.
8015
8016 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8017
8018         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8019
8020         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8021         handling for enumerations, as we only needed the TypeContainer
8022         functionality to begin with (this is required for the fix below to
8023         work for enums that reference constants in a container class for
8024         example). 
8025
8026         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8027
8028         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8029         a valid TypeBuilder to perform lookups on.o
8030
8031         * class.cs (InheritableMemberSignatureCompare): Use true in the
8032         call to GetGetMethod and GetSetMethod, because we are comparing
8033         the signature, and we need to get the methods *even* if they are
8034         private. 
8035
8036         (PropertyBase.CheckBase): ditto.
8037
8038         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8039         GotoCase.Resolve): Use Peel on EmpytCasts.
8040
8041         * ecore.cs (EmptyCast): drop child, add Peel method.
8042
8043 2002-11-17  Martin Baulig  <martin@ximian.com>
8044
8045         * ecore.cs (EmptyCast.Child): New public property.
8046
8047         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8048         label resolved to an EmptyCast.  Fixes #34162.
8049         (GotoCase.Resolve): Likewise.
8050         (Block.EmitMeta): Likewise.
8051
8052 2002-11-17  Martin Baulig  <martin@ximian.com>
8053
8054         * expression.cs (Invocation.BetterConversion): Prefer int over
8055         uint; short over ushort; long over ulong for integer literals.
8056         Use ImplicitConversionExists instead of StandardConversionExists
8057         since we also need to check for user-defined implicit conversions.
8058         Fixes #34165.  Added test-173.cs.
8059
8060 2002-11-16  Martin Baulig  <martin@ximian.com>
8061
8062         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8063         with the `true' and `false' literals.  Fixes #33151.
8064
8065 2002-11-16  Martin Baulig  <martin@ximian.com>
8066
8067         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8068         October 22nd; don't do the cs1540 check for static members.
8069
8070         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8071         now using our own filter here and doing the cs1540 check again.
8072
8073 2002-11-16  Martin Baulig  <martin@ximian.com>
8074
8075         * support.cs (InternalParameters): Don't crash if we don't have
8076         any fixed parameters.  Fixes #33532.
8077
8078 2002-11-16  Martin Baulig  <martin@ximian.com>
8079
8080         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8081         when looking up static methods to make this work on Windows.
8082         Fixes #33773.
8083
8084 2002-11-16  Martin Baulig  <martin@ximian.com>
8085
8086         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8087         a setter rather than using PropertyInfo.CanWrite.
8088
8089 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8090
8091         * class.cs: Allow acces to block member by subclasses. Fixes build
8092         breaker.
8093
8094 2002-11-14  Martin Baulig  <martin@ximian.com>
8095
8096         * class.cs (Constructor.Emit): Added the extern/block check.
8097         Fixes bug #33678.
8098
8099 2002-11-14  Martin Baulig  <martin@ximian.com>
8100
8101         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8102         iteration while looking for indexers, this is needed because the
8103         indexer may have a different name in our base classes.  Fixed the
8104         error reporting (no indexers at all, not get accessor, no
8105         overloaded match).  Fixes bug #33089.
8106         (IndexerAccess.DoResolveLValue): Likewise.
8107
8108 2002-11-14  Martin Baulig  <martin@ximian.com>
8109
8110         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8111         indexers.  Fixes the first part of bug #33089.
8112         (MethodSignature.InheritableMemberSignatureCompare): Added support
8113         for properties.
8114
8115 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8116
8117         * attribute.cs (Attribute.Resolve): Catch the
8118         NullReferenceException and report it since it isn't supposed to
8119         happen. 
8120
8121 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8122
8123         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8124         LogicalOr and LogicalAnd that can benefit from recursively
8125         handling EmitBranchable.  The code now should be nice for Paolo.
8126
8127 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8128
8129         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8130         the Type lookups, as we perform quite a number of lookups on
8131         non-Types.  This can be removed once we can deterministically tell
8132         whether we have a type or a namespace in advance.
8133
8134         But this might require special hacks from our corlib.
8135
8136         * TODO: updated.
8137
8138         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8139         and double which avoids a conversion from an integer to a double.
8140
8141         * expression.cs: tiny optimization, avoid calling IsConstant,
8142         because it effectively performs the lookup twice.
8143
8144 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8145
8146         But a bogus return here to keep the semantics of the old code
8147         until the Mono runtime is fixed.
8148
8149         * pending.cs (GetMissingInterfaces): New method used to remove all
8150         the interfaces that are already implemented by our parent
8151         classes from the list of pending methods. 
8152
8153         * interface.cs: Add checks for calls after ResolveTypeExpr.
8154
8155 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8156
8157         * class.cs (Class.Emit): Report warning 67: event not used if the
8158         warning level is beyond 3.
8159
8160         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8161         being a NullLiteral.
8162
8163         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8164         specifiers. 
8165
8166         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8167         path that might fail if a type can not be resolved.
8168
8169         * expression.cs (Binary.Emit): Emit unsigned versions of the
8170         operators. 
8171
8172         * driver.cs: use error 5.
8173
8174 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8175
8176         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8177
8178 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8179
8180         * cs-parser.jay (switch_section): A beautiful patch from Martin
8181         Baulig that fixed 33094.
8182
8183 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8184
8185         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8186         Check whether the base is abstract and report an error if so.
8187
8188         * expression.cs (IndexerAccess.DoResolveLValue,
8189         IndexerAccess.DoResolve): ditto. 
8190
8191         (Invocation.DoResolve): ditto.
8192
8193         (Invocation.FullMethodDesc): Improve the report string.
8194
8195         * statement.cs (Block): Eliminate IsVariableDefined as it is
8196         basically just a wrapper for GetVariableInfo.
8197
8198         * ecore.cs (SimpleName): Use new 
8199
8200         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8201         type, as we return the actual parameter ref/unref state on a
8202         different call.
8203
8204 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8205
8206         * support.cs: Return proper flags REF/OUT fixing the previous
8207         commit.  
8208
8209         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8210         not used to mean `ref' but `ref or out' in ParameterReference
8211
8212         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8213         full type signature instead of calling TypeManger.CSharpName
8214         ourselves. 
8215
8216         * support.cs (InternalParameters.ParameterDesc): Do not compare
8217         directly to the modflags, because REF/OUT will actually be bitsets
8218         if set. 
8219
8220         * delegate.cs (VerifyMethod): Check also the modifiers.
8221
8222         * cs-tokenizer.cs: Fix bug where floating point values with an
8223         exponent where a sign was missing was ignored.
8224
8225         * driver.cs: Allow multiple assemblies to be specified in a single
8226         /r: argument
8227
8228 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8229
8230         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8231         because identifiers after a parenthesis would end up in this kind
8232         of production, and we needed to desamiguate it for having casts
8233         like:
8234
8235                 (UserDefinedType *) xxx
8236
8237 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8238
8239         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8240         we should set on the Bindingflags.NonPublic, but not turn on
8241         private_ok.  private_ok controls whether a Private member is
8242         returned (this is chekced on the filter routine), while the
8243         BindingFlags.NonPublic just controls whether private/protected
8244         will be allowed.   This fixes the problem part of the problem of
8245         private properties being allowed to be used in derived classes.
8246
8247         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8248         so we can call the children DoResolveLValue method (this will
8249         properly signal errors on lvalue assignments to base properties)
8250
8251         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8252         getter are null, and we have a property info, we know that this
8253         happened because the lookup failed, so we report an error 122 for
8254         protection level violation.
8255
8256         We also silently return if setter and getter are null in the
8257         resolve functions, this condition only happens if we have flagged
8258         the error before.  This is the other half of the problem. 
8259
8260         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8261         not have accessibility information, that is why we were returning
8262         true in the filter function in typemanager.cs.
8263
8264         To properly report 122 (property is inaccessible because of its
8265         protection level) correctly, we report this error in ResolveAccess
8266         by failing if both the setter and the getter are lacking (ie, the
8267         lookup failed). 
8268
8269         DoResolve and DoLResolve have been modified to check for both
8270         setter/getter being null and returning silently, the reason being
8271         that I did not want to put the knowledge about this error in upper
8272         layers, like:
8273
8274         int old = Report.Errors;
8275         x = new PropertyExpr (...);
8276         if (old != Report.Errors)
8277                 return null;
8278         else
8279                 return x;
8280
8281         So the property expr is returned, but it is invalid, so the error
8282         will be flagged during the resolve process. 
8283
8284         * class.cs: Remove InheritablePropertySignatureCompare from the
8285         class, as we no longer depend on the property signature to compute
8286         whether it is possible to implement a method or not.
8287
8288         The reason is that calling PropertyInfo.GetGetMethod will return
8289         null (in .NET, in Mono it works, and we should change this), in
8290         cases where the Get Method does not exist in that particular
8291         class.
8292
8293         So this code:
8294
8295         class X { public virtual int A { get { return 1; } } }
8296         class Y : X { }
8297         class Z : Y { public override int A { get { return 2; } } }
8298
8299         Would fail in Z because the parent (Y) would not have the property
8300         defined.  So we avoid this completely now (because the alternative
8301         fix was ugly and slow), and we now depend exclusively on the
8302         method names.
8303
8304         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8305         reference method, instead of using the property.
8306
8307         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8308         routines are gone now.
8309
8310         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8311         names, they were incorrectly named.
8312
8313         * cs-tokenizer.cs: Return are more gentle token on failure. 
8314
8315         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8316         had an out-of-sync index variable, which caused it to remove from
8317         the list of pending methods the wrong method sometimes.
8318
8319 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8320
8321         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8322         CanWrite, because those refer to this particular instance of the
8323         property, and do not take into account the fact that we can
8324         override single members of a property.
8325
8326         Constructor requires an EmitContext.  The resolution process does
8327         not happen here, but we need to compute the accessors before,
8328         because the resolution does not always happen for properties.
8329
8330         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8331         subclass, before we did not update this flag, but we did update
8332         bindingflags. 
8333
8334         (GetAccessors): Drop this routine, as it did not work in the
8335         presence of partially overwritten set/get methods. 
8336
8337         Notice that this broke the cs1540 detection, but that will require
8338         more thinking. 
8339
8340 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8341
8342         * class.cs:
8343         * codegen.cs:
8344         * driver.cs: issue a warning instead of an error if we don't support
8345         debugging for the platform. Also ignore a couple of errors that may
8346         arise when trying to write the symbols. Undo my previous patch.
8347
8348 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8349
8350         * driver.cs: ignore /debug switch except for Unix platforms.
8351
8352 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8353
8354         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8355
8356 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8357
8358         * driver.cs: Do not make mcs-debug conditional, so we do not break
8359         builds that use it.
8360
8361         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8362         review this patch.  But basically after all the children variables
8363         have been merged, the value of "Breaks" was not being set to
8364         new_breaks for Switch blocks.  I think that it should be set after
8365         it has executed.  Currently I set this to the value of new_breaks,
8366         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8367         conservative, but I do not understand this code very well.
8368
8369         I did not break anything in the build, so that is good ;-)
8370
8371         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8372
8373 2002-10-20  Mark Crichton  <crichton@gimp.org>
8374
8375         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8376
8377 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8378
8379         * cfold.cs: Fixed compile blocker.
8380
8381 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8382
8383         * driver.cs: I was chekcing the key, not the file.
8384
8385 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8386
8387         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8388         message that we were generating - we just need to silently return
8389         a null.
8390
8391 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8392
8393         * class.cs (Event.Define): Change my previous commit, as this
8394         breaks the debugger.  This is a temporary hack, as it seems like
8395         the compiler is generating events incorrectly to begin with.
8396
8397         * expression.cs (Binary.ResolveOperator): Added support for 
8398         "U operator - (E x, E y)"
8399
8400         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8401         y)".
8402
8403         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8404         init-only variables, but this path did not take into account that
8405         there might be also instance readonly variables.  Correct this
8406         problem. 
8407
8408         This fixes bug 32253
8409
8410         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8411         delegates as well.
8412
8413         * driver.cs: Change the extension for modules to `netmodule'
8414
8415         * cs-parser.jay: Improved slightly the location tracking for
8416         the debugger symbols.
8417
8418         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8419         modifiers that were specified instead of the hardcoded value
8420         (FamAndAssem).  This was basically ignoring the static modifier,
8421         and others.  Fixes 32429.
8422
8423         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8424         fixed a bug in the process (32476)
8425
8426         * expression.cs (ArrayAccess.EmitAssign): Patch from
8427         hwang_rob@yahoo.ca that fixes bug 31834.3
8428
8429 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8430
8431         * driver.cs: Make the module extension .netmodule.
8432
8433 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8434
8435         * driver.cs: Report an error if the resource file is not found
8436         instead of crashing.
8437
8438         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8439         false, like Emit does.
8440
8441 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8442
8443         * typemanager.cs: Remove unused private member.  Also reported mcs
8444         bug to report this as a warning like csc.
8445
8446 2002-10-15  Martin Baulig  <martin@gnome.org>
8447
8448         * statement.cs (Statement.Emit): Made this a virtual method; emits
8449         the line number info and calls DoEmit().
8450         (Statement.DoEmit): New protected abstract method, formerly knows
8451         as Statement.Emit().
8452
8453         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8454
8455 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8456
8457         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8458         have fixed a remaining problem: not every AddXXXX was adding a
8459         fully qualified name.  
8460
8461         Now everyone registers a fully qualified name in the DeclSpace as
8462         being defined instead of the partial name.  
8463
8464         Downsides: we are slower than we need to be due to the excess
8465         copies and the names being registered this way.  
8466
8467         The reason for this is that we currently depend (on the corlib
8468         bootstrap for instance) that types are fully qualified, because
8469         we dump all the types in the namespace, and we should really have
8470         types inserted into the proper namespace, so we can only store the
8471         basenames in the defined_names array.
8472
8473 2002-10-10  Martin Baulig  <martin@gnome.org>
8474
8475         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8476         from bug #31834, see the bug report for a testcase which is
8477         miscompiled.
8478
8479 2002-10-10  Martin Baulig  <martin@gnome.org>
8480
8481         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8482         flow analysis code for this.
8483
8484         * statement.cs (Do, While, For): Tell the flow analysis code about
8485         infinite loops.
8486         (FlowBranching.UsageVector): Added support for infinite loops.
8487         (Block.Resolve): Moved the dead code elimination here and use flow
8488         analysis to do it.
8489
8490 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8491
8492         * class.cs (Field.Define): Catch cycles on struct type
8493         definitions. 
8494
8495         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8496         fields if the fields are static.  We only need to check instance
8497         fields. 
8498
8499         * expression.cs (As.DoResolve): Test for reference type.
8500
8501         * statement.cs (Using.ResolveExpression): Use
8502         ConvertImplicitRequired, not ConvertImplicit which reports an
8503         error on failture
8504         (Using.ResolveLocalVariableDecls): ditto.
8505
8506         * expression.cs (Binary.ResolveOperator): Report errors in a few
8507         places where we had to.
8508
8509         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8510
8511 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8512
8513         * expression.cs: Use StoreFromPtr instead of extracting the type
8514         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8515
8516         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8517         an enumeration value to a System.Enum, but System.Enum is not a
8518         value type, but an class type, so we need to box.
8519
8520         (Expression.ConvertExplicit): One codepath could return
8521         errors but not flag them.  Fix this.  Fixes #31853
8522
8523         * parameter.cs (Resolve): Do not allow void as a parameter type.
8524
8525 2002-10-06  Martin Baulig  <martin@gnome.org>
8526
8527         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8528         if it's a class type and not a struct.  Fixes #31815.
8529
8530 2002-10-06  Martin Baulig  <martin@gnome.org>
8531
8532         * statement.cs: Reworked the flow analysis code a bit to make it
8533         usable for dead code elimination.
8534
8535 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8536
8537         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8538
8539 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8540
8541         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8542         to fix the test 165, will investigate deeper.
8543
8544 2002-10-04  Martin Baulig  <martin@gnome.org>
8545
8546         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8547         finally blocks actually work.
8548         (Try.Resolve): We don't need to create a sibling for `finally' if
8549         there is no finally block.
8550
8551 2002-10-04  Martin Baulig  <martin@gnome.org>
8552
8553         * class.cs (Constructor.Define): The default accessibility for a
8554         non-default constructor is private, not public.
8555
8556 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8557
8558         * class.cs (Constructor): Make AllowedModifiers public, add
8559         EXTERN.
8560
8561         * cs-parser.jay: Perform the modifiers test here, as the
8562         constructor for the Constructor class usually receives a zero
8563         because of the way we create it (first we create, later we
8564         customize, and we were never checking the modifiers).
8565
8566         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8567         is a version of LookupTypeReflection that includes the type-name
8568         cache.  This can be used as a fast path for functions that know
8569         the fully qualified name and are only calling into *.GetType() to
8570         obtain a composed type.
8571
8572         This is also used by TypeManager.LookupType during its type
8573         composition.
8574
8575         (LookupType): We now also track the real type name, as sometimes
8576         we can get a quey for the real type name from things like
8577         ComposedCast.  This fixes bug 31422.
8578
8579         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8580         complete type fullname, it does not have to go through the type
8581         resolution system to obtain the composed version of the type (for
8582         obtaining arrays or pointers).
8583
8584         (Conditional.Emit): Use the EmitBoolExpression to
8585         generate nicer code, as requested by Paolo.
8586
8587         (ArrayCreation.CheckIndices): Use the patch from
8588         hwang_rob@yahoo.ca to validate the array initializers. 
8589
8590 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8591
8592         * class.cs (ConstructorInitializer.Emit): simplify code by using
8593         Invocation.EmitCall, and at the same time, fix the bugs in calling
8594         parent constructors that took variable arguments. 
8595
8596         * ecore.cs (Expression.ConvertNumericExplicit,
8597         Expression.ImplicitNumericConversion): Remove the code that
8598         manually wrapped decimal (InternalTypeConstructor call is now gone
8599         as well).
8600
8601         * expression.cs (Cast.TryReduce): Also handle decimal types when
8602         trying to perform a constant fold on the type.
8603
8604         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8605
8606         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8607         that only turned off an error report, and did nothing else. 
8608
8609 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8610
8611         * driver.cs: Handle and ignore /fullpaths
8612
8613 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8614
8615         * expression.cs (Binary.ResolveOperator): Catch the case where
8616         DoNumericPromotions returns true, 
8617
8618         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8619
8620 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8621
8622         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8623         report error 70.
8624
8625 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8626
8627         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8628         conversion exists, but it is also required that the conversion be
8629         performed.  This manifested in "(Type64Enum) 2".  
8630
8631         * class.cs (TypeManager.AddMethod): The fix is not to change
8632         AddEnum, because that one was using a fully qualified name (every
8633         DeclSpace derivative does), but to change the AddMethod routine
8634         that was using an un-namespaced name.  This now correctly reports
8635         the duplicated name.
8636
8637         Revert patch until I can properly fix it.  The issue
8638         is that we have a shared Type space across all namespaces
8639         currently, which is wrong.
8640
8641         Options include making the Namespace a DeclSpace, and merge
8642         current_namespace/current_container in the parser.
8643
8644 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8645
8646         * cs-parser.jay: Improve error reporting when we get a different
8647         kind of expression in local_variable_type and
8648         local_variable_pointer_type. 
8649
8650         Propagate this to avoid missleading errors being reported.
8651
8652         * ecore.cs (ImplicitReferenceConversion): treat
8653         TypeManager.value_type as a target just like object_type.   As
8654         code like this:
8655
8656         ValueType v = 1;
8657
8658         Is valid, and needs to result in the int 1 being boxed before it
8659         is assigned to the value type v.
8660
8661         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8662         to validate the enumeration name.
8663
8664         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8665         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8666         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8667
8668         * ecore.cs (TryImplicitIntConversion): When doing an
8669         implicit-enumeration-conversion, check if the type is 64-bits and
8670         perform a conversion before passing to EnumConstant.
8671
8672 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8673
8674         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8675         report ambiguous type references.  Unlike the MS version, we
8676         report what the ambiguity is.   Innovation at work ;-)
8677
8678         (DeclSpace.FindType): Require a location argument to
8679         display when we display an ambiguous error.
8680
8681         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8682
8683         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8684
8685         * expression.cs (EmitDynamicInitializers): Apply patch from
8686         hwang_rob@yahoo.ca that fixes the order in which we emit our
8687         initializers. 
8688
8689 2002-09-21  Martin Baulig  <martin@gnome.org>
8690
8691         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8692         delegate takes no arguments.
8693
8694 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8695
8696         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8697         from integers.
8698
8699         * expression.cs: Extract the underlying type.
8700
8701         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8702
8703         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8704
8705 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8706
8707         * class.cs (TypeContainer.DefineType): We can not use the nice
8708         PackingSize with the size set to 1 DefineType method, because it
8709         will not allow us to define the interfaces that the struct
8710         implements.
8711
8712         This completes the fixing of bug 27287
8713
8714         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8715         means also structs.  This fixes part of the problem. 
8716         (Expresion.ImplicitReferenceConversionExists): ditto.
8717
8718         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8719         error if there were no errors reported during the type lookup
8720         process, to avoid duplicates or redundant errors.  Without this
8721         you would get an ambiguous errors plus a type not found.  We have
8722         beaten the user enough with the first error.  
8723
8724         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8725         reference. 
8726
8727         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8728         during the resolution process, stop the lookup, this avoids
8729         repeated error reports (same error twice).
8730
8731         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8732
8733         * typemanager.cs (LookupType): Redo the type lookup code to match
8734         the needs of System.Reflection.  
8735
8736         The issue is that System.Reflection requires references to nested
8737         types to begin with a "+" sign instead of a dot.  So toplevel
8738         types look like: "NameSpace.TopLevelClass", and nested ones look
8739         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8740         levels. 
8741
8742 2002-09-19  Martin Baulig  <martin@gnome.org>
8743
8744         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8745         says that a method always returns or always throws an exception,
8746         don't report the CS0161.
8747
8748         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8749         set `Returns = new_returns'.
8750
8751 2002-09-19  Martin Baulig  <martin@gnome.org>
8752
8753         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8754         to an enum constant, check for a CS0176.
8755
8756 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8757
8758         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8759         for operators that must be in pairs and report errors.
8760
8761         * ecore.cs (SimpleName.DoResolveType): During the initial type
8762         resolution process, when we define types recursively, we must
8763         check first for types in our current scope before we perform
8764         lookups in the enclosing scopes.
8765
8766         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8767
8768         (Invocation.VerifyArgumentsCompat): Call
8769         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8770         I thought we were supposed to always call this, but there are a
8771         few places in the code where we dont do it.
8772
8773 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8774
8775         * driver.cs: Add support in -linkres and -resource to specify the
8776         name of the identifier.
8777
8778 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8779
8780         * ecore.cs (StandardConversionExists): Sync with the conversion
8781         code: allow anything-* to void* conversions.
8782
8783         (FindMostSpecificSource): Use an Expression argument
8784         instead of a Type, because we might be handed over a Literal which
8785         gets a few more implicit conversions that plain types do not.  So
8786         this information was being lost.
8787
8788         Also, we drop the temporary type-holder expression when not
8789         required.
8790
8791 2002-09-17  Martin Baulig  <martin@gnome.org>
8792
8793         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8794         this is an explicit interface implementation.
8795
8796 2002-09-17  Martin Baulig  <martin@gnome.org>
8797
8798         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8799         different `IndexerName' attributes.
8800
8801         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8802         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8803         virtual CommonResolve().
8804
8805 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8806
8807         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8808         and convert that to the UnderlyingType.
8809
8810         * statement.cs (Foreach.Resolve): Indexers are just like variables
8811         or PropertyAccesses.
8812
8813         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8814         inside quoted strings, we were not doing this before.
8815
8816 2002-09-16  Martin Baulig  <martin@gnome.org>
8817
8818         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8819         resolve it.  This is needed for the definite assignment check of the
8820         instance expression, fixes bug #29846.
8821         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8822
8823 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8824
8825         * parameter.cs: Fix compile error.  Cannot reference static member
8826         from an instance object.  Is this an mcs bug?
8827
8828 2002-09-14  Martin Baulig  <martin@gnome.org>
8829
8830         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8831         multiple times.  Fixes bug #30295, added test-166.cs.
8832
8833 2002-09-14  Martin Baulig  <martin@gnome.org>
8834
8835         * statement.cs (Block.Emit): Don't emit unreachable code.
8836         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8837         `break' statements.
8838         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8839
8840 2002-09-14  Martin Baulig  <martin@gnome.org>
8841
8842         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8843         is set.
8844
8845 2002-09-14  Martin Baulig  <martin@gnome.org>
8846
8847         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8848         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8849         be false on the ms runtime.
8850
8851 2002-09-13  Martin Baulig  <martin@gnome.org>
8852
8853         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8854         the CS0038 error message.
8855
8856 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8857
8858         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8859         constant inside, return it.
8860
8861 2002-09-12  Martin Baulig  <martin@gnome.org>
8862
8863         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8864         implicit conversion can be done between enum types.
8865
8866         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8867         check whether an implicit conversion to the current enum's UnderlyingType
8868         exists and report an error if not.
8869
8870         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8871         without debugging support.
8872
8873         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8874         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8875
8876 2002-09-12  Martin Baulig  <martin@gnome.org>
8877
8878         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8879
8880         * ecore.cs (IMemberExpr.DeclaringType): New property.
8881         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8882         nonstatic member of an outer type (CS0038).
8883
8884 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8885
8886         * driver.cs: Activate the using-error detector at warning level
8887         4 (at least for MS-compatible APIs).
8888
8889         * namespace.cs (VerifyUsing): Small buglett fix.
8890
8891         * pending.cs (PendingImplementation): pass the container pointer. 
8892
8893         * interface.cs (GetMethods): Allow for recursive definition.  Long
8894         term, I would like to move every type to support recursive
8895         definitions, not the current ordering mechanism that we have right
8896         now.
8897
8898         The situation is this: Attributes are handled before interfaces,
8899         so we can apply attributes to interfaces.  But some attributes
8900         implement interfaces, we will now handle the simple cases
8901         (recursive definitions will just get an error).  
8902
8903         * parameter.cs: Only invalidate types at the end if we fail to
8904         lookup all types.  
8905
8906 2002-09-09  Martin Baulig  <martin@gnome.org>
8907
8908         * ecore.cs (PropertyExpr.Emit): Also check for
8909         TypeManager.system_int_array_get_length so this'll also work when
8910         compiling corlib.  Fixes #30003.
8911
8912 2002-09-09  Martin Baulig  <martin@gnome.org>
8913
8914         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8915         and throw an exception if we can't get the type's size.  Fixed #30040,
8916         added test-165.cs.
8917
8918 2002-09-09  Martin Baulig  <martin@gnome.org>
8919
8920         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8921
8922         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8923         context.  Fixes bug #30027.
8924
8925         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8926         virtual functions.  Fixes bug #30043, added test-164.cs.
8927
8928 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8929
8930         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8931
8932 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8933
8934         * driver.cs: Use an object to get the windows codepage since it's not a
8935         static property.
8936
8937 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8938
8939         * statement.cs (For.Emit): for infinite loops (test == null)
8940         return whether there is a break inside, not always "true".
8941
8942         * namespace.cs (UsingEntry): New struct to hold the name of the
8943         using definition, the location where it is defined, and whether it
8944         has been used in a successful type lookup.
8945
8946         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8947         strings.
8948
8949         * decl.cs: ditto.
8950
8951 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8952
8953         * attribute.cs : Fix incorrect code which relied on catching
8954         a NullReferenceException to detect a null being passed in
8955         where an object was expected.
8956
8957 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8958
8959         * statement.cs (Try): flag the catch variable as assigned
8960
8961         * expression.cs (Cast): Simplified by using ResolveType instead of
8962         manually resolving.
8963
8964         * statement.cs (Catch): Fix bug by using ResolveType.
8965
8966 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8967
8968         * expression.cs (BetterConversion): Special case for when we have
8969         a NullLiteral as the argument and we have to choose between string
8970         and object types - we choose string the way csc does.
8971
8972         * attribute.cs (Attribute.Resolve): Catch the
8973         NullReferenceException and report error #182 since the Mono
8974         runtime no more has the bug and having this exception raised means
8975         we tried to select a constructor which takes an object and is
8976         passed a null.
8977
8978 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8979
8980         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8981         message (1502, 1503) when we can't locate a method after overload
8982         resolution. This is much more informative and closes the bug
8983         Miguel reported.
8984
8985         * interface.cs (PopulateMethod): Return if there are no argument
8986         types. Fixes a NullReferenceException bug.
8987
8988         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8989         expressions too. Previously we were checking only in one place for
8990         positional arguments leaving out named arguments.
8991
8992         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8993         type to the enum type is not allowed. Remove code corresponding to
8994         that.
8995
8996         (ConvertNumericExplicit): Allow explicit conversions from
8997         the underlying type to enum type. This precisely follows the spec
8998         and closes a bug filed by Gonzalo.
8999
9000 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9001
9002         * compiler.csproj:
9003         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9004
9005 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9006
9007         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9008         it was important that we stored the right value after the
9009         reduction in `converted'.
9010
9011 2002-09-04  Martin Baulig  <martin@gnome.org>
9012
9013         * location.cs (Location.SymbolDocument): Use full pathnames for the
9014         source files.
9015
9016 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9017
9018         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9019         of the expression resolve mechanism, because that will catch the
9020         SimpleName error failures.
9021
9022         (Conditional): If we can not resolve the
9023         expression, return, do not crash.
9024
9025 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9026
9027         * cs-tokenizer.cs:
9028         (location): display token name instead of its number.
9029
9030 2002-08-28  Martin Baulig  <martin@gnome.org>
9031
9032         * expression.cs (Binary.ResolveOperator): Don't silently return
9033         but return an error if an operator cannot be applied between two
9034         enum types.
9035
9036 2002-08-28  Martin Baulig  <martin@gnome.org>
9037
9038         * class.cs (Constructor.Define): Set the permission attributes
9039         correctly instead of making all constructors public.
9040
9041 2002-08-28  Martin Baulig  <martin@gnome.org>
9042
9043         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9044         for private members before reporting a CS0103; if we find anything,
9045         it's a CS0122.
9046
9047 2002-08-28  Martin Baulig  <martin@gnome.org>
9048
9049         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9050         to check whether `closure_start_type == closure_invocation_type',
9051         we also need to check whether `m.DeclaringType == closure_invocation_type'
9052         before bypassing the permission checks.  We might be accessing
9053         protected/private members from the base class.
9054         (TypeManager.RealMemberLookup): Only set private_ok if private
9055         members were requested via BindingFlags.NonPublic.
9056
9057         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9058
9059         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9060         MethodGroupExpr.IsExplicitImpl if appropriate.
9061         (Invocation.DoResolve): Don't report the CS0120 for explicit
9062         interface implementations.
9063
9064 2002-08-27  Martin Baulig  <martin@gnome.org>
9065
9066         * expression.cs (Invocation.DoResolve): If this is a static
9067         method and we don't have an InstanceExpression, we must report
9068         a CS0120.
9069
9070 2002-08-25  Martin Baulig  <martin@gnome.org>
9071
9072         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9073         `==' between a valuetype and an object.
9074
9075 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9076
9077         * ecore.cs (TypeExpr): Provide a ToString method.
9078
9079 2002-08-24  Martin Baulig  <martin@gnome.org>
9080
9081         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9082         now called proggie.dbg and it's a binary file.
9083
9084 2002-08-23  Martin Baulig  <martin@gnome.org>
9085
9086         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9087
9088 2002-08-23  Martin Baulig  <martin@gnome.org>
9089
9090         * struct.cs (MyStructInfo.ctor): Make this work with empty
9091         structs; it's not allowed to use foreach() on null.
9092
9093 2002-08-23  Martin Baulig  <martin@gnome.org>
9094
9095         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9096         writer the full pathname of the generated assembly.
9097
9098 2002-08-23  Martin Baulig  <martin@gnome.org>
9099
9100         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9101         A `finally' block never returns or breaks; improved handling of
9102         unreachable code.
9103
9104 2002-08-23  Martin Baulig  <martin@gnome.org>
9105
9106         * statement.cs (Throw.Resolve): Allow `throw null'.
9107
9108 2002-08-23  Martin Baulig  <martin@gnome.org>
9109
9110         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9111         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9112         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9113         MemberLookup would return a wrong event if this is an explicit
9114         interface implementation and the class has an event with the same
9115         name.
9116
9117 2002-08-23  Martin Baulig  <martin@gnome.org>
9118
9119         * statement.cs (Block.AddChildVariableNames): New public method.
9120         (Block.AddChildVariableName): Likewise.
9121         (Block.IsVariableNameUsedInChildBlock): Likewise.
9122         (Block.AddVariable): Check whether a variable name has already
9123         been used in a child block.
9124
9125         * cs-parser.jay (declare_local_variables): Mark all variable names
9126         from the current block as being used in a child block in the
9127         implicit block.
9128
9129 2002-08-23  Martin Baulig  <martin@gnome.org>
9130
9131         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9132         find the symbol writer.
9133
9134         * driver.cs: csc also allows the arguments to /define being
9135         separated by commas, not only by semicolons.
9136
9137 2002-08-23  Martin Baulig  <martin@gnome.org>
9138
9139         * interface.cs (Interface.GetMembers): Added static check for events.
9140
9141 2002-08-15  Martin Baulig  <martin@gnome.org>
9142
9143         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9144         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9145
9146         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9147         why the MethodData.EmitDestructor() change was necessary.
9148
9149 2002-08-20  Martin Baulig  <martin@gnome.org>
9150
9151         * class.cs (TypeContainer.FindMembers): Added static check for events.
9152
9153         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9154
9155         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9156         use Type.GetEvents(), not Type.FindMembers().
9157
9158 2002-08-20  Martin Baulig  <martin@gnome.org>
9159
9160         * decl.cs (MemberCache): Added a special method cache which will
9161         be used for method-only searched.  This ensures that a method
9162         search will return a MethodInfo with the correct ReflectedType for
9163         inherited methods.      
9164
9165 2002-08-20  Martin Baulig  <martin@gnome.org>
9166
9167         * decl.cs (DeclSpace.FindMembers): Made this public.
9168
9169 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9170
9171         * delegate.cs: fixed build on windows.
9172         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9173
9174 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9175
9176         * ecore.cs (StandardConversionExists): Return a false
9177         if we are trying to convert the void type to anything else
9178         since that is not allowed.
9179
9180         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9181         we flag error 70 in the event an event is trying to be accessed
9182         directly from outside the declaring type.
9183
9184 2002-08-20  Martin Baulig  <martin@gnome.org>
9185
9186         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9187         MemberCache from typemanager.cs to decl.cs.
9188
9189 2002-08-19  Martin Baulig  <martin@gnome.org>
9190
9191         * class.cs (TypeContainer): Implement IMemberContainer.
9192         (TypeContainer.DefineMembers): Create the MemberCache.
9193         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9194         return public members if BindingFlags.Public was given, check
9195         whether members are static.
9196
9197 2002-08-16  Martin Baulig  <martin@gnome.org>
9198
9199         * decl.cs (DeclSpace.Define): Splitted this in Define and
9200         DefineMembers.  DefineMembers is called first and initializes the
9201         MemberCache.
9202
9203         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9204         DefineMembers() on all our DeclSpaces.
9205
9206         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9207         but call DefineMembers() on all nested interfaces.  We call their
9208         Define() in our new Define() function.
9209
9210         * interface.cs (Interface): Implement IMemberContainer.
9211         (Interface.Define): Moved all code except the attribute stuf to
9212         DefineMembers().
9213         (Interface.DefineMembers): Initialize the member cache.
9214
9215         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9216         need this anymore since we can use MemberCache.FindMembers directly.
9217
9218 2002-08-19  Martin Baulig  <martin@gnome.org>
9219
9220         * typemanager.cs (MemberCache): When creating the cache for an
9221         interface type, add all inherited members.
9222         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9223         to `out bool used_cache' and documented it.
9224         (TypeManager.MemberLookup): If we already used the cache in the first
9225         iteration, we don't need to do the interfaces check.
9226
9227 2002-08-19  Martin Baulig  <martin@gnome.org>
9228
9229         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9230         here from IMemberFinder and don't implement this interface anymore.
9231         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9232
9233         * typemanager.cs (IMemberFinder): This interface is now only used by
9234         classes which actually support the member cache.
9235         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9236         since we only put DeclSpaces into this Hashtable.
9237         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9238         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9239
9240 2002-08-16  Martin Baulig  <martin@gnome.org>
9241
9242         * typemanager.cs (ICachingMemberFinder): Removed.
9243         (IMemberFinder.MemberCache): New property.
9244         (TypeManager.FindMembers): Merged this with RealFindMembers().
9245         This function will never be called from TypeManager.MemberLookup()
9246         so we can't use the cache here, just the IMemberFinder.
9247         (TypeManager.MemberLookup_FindMembers): Check whether the
9248         IMemberFinder has a MemberCache and call the cache's FindMembers
9249         function.
9250         (MemberCache): Rewrote larger parts of this yet another time and
9251         cleaned it up a bit.
9252
9253 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9254
9255         * driver.cs (LoadArgs): Support quoting.
9256
9257         (Usage): Show the CSC-like command line arguments.
9258
9259         Improved a few error messages.
9260
9261 2002-08-15  Martin Baulig  <martin@gnome.org>
9262
9263         * typemanager.cs (IMemberContainer.Type): New property.
9264         (IMemberContainer.IsInterface): New property.
9265
9266         The following changes are conditional to BROKEN_RUNTIME, which is
9267         defined at the top of the file.
9268
9269         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9270         class'es members, but add all members from TypeHandle.ObjectType
9271         if we're an interface.
9272         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9273         is the current type.
9274         (MemberCache.CacheEntry.Container): Removed this field.
9275         (TypeHandle.GetMembers): Include inherited members.
9276
9277 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9278
9279         * typemanager.cs: fixed compilation and added a comment on a field that
9280         is never used.
9281
9282 2002-08-15  Martin Baulig  <martin@gnome.org>
9283
9284         * class.cs (ConstructorInitializer.Resolve): In the
9285         Expression.MemberLookup call, use the queried_type as
9286         invocation_type.
9287
9288         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9289         declared' attribute, it's always true.
9290         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9291         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9292         temporary wrapper for FindMembers which tells MemberLookup whether
9293         members from the base classes are included in the return value.
9294         This will go away soon.
9295         (TypeManager.MemberLookup): Use this temporary hack here; once the
9296         new MemberCache is completed, we don't need to do the DeclaredOnly
9297         looping here anymore since the MemberCache will take care of this.
9298         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9299         (MemberCache): When creating the MemberCache for a class, get
9300         members from the current class and all its base classes.
9301         (MemberCache.CacheEntry.Container): New field.  This is a
9302         temporary hack until the Mono runtime is fixed to distinguish
9303         between ReflectedType and DeclaringType.  It allows us to use MCS
9304         with both the MS runtime and the unfixed Mono runtime without
9305         problems and without accecting performance.
9306         (MemberCache.SearchMembers): The DeclaredOnly looping from
9307         TypeManager.MemberLookup is now done here.      
9308
9309 2002-08-14  Martin Baulig  <martin@gnome.org>
9310
9311         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9312         Type.GetFields on dynamic types but get the fields from the
9313         corresponding TypeContainer.
9314         (MyStructInfo.GetStructInfo): Added check for enum types.
9315
9316         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9317         (MemberList.SyncRoot): Implemented.
9318         (TypeManager.FilterWithClosure): No need to check permissions if
9319         closure_start_type == closure_invocation_type, don't crash if
9320         closure_invocation_type is null.
9321
9322 2002-08-13  Martin Baulig  <martin@gnome.org>
9323
9324         Rewrote TypeContainer.FindMembers to use a member cache.  This
9325         gives us a speed increase of about 35% for the self-hosting MCS
9326         build and of about 15-20% for the class libs (both on GNU/Linux).
9327
9328         * report.cs (Timer): New class to get enhanced profiling.  This
9329         whole class is "TIMER" conditional since it remarkably slows down
9330         compilation speed.
9331
9332         * class.cs (MemberList): New class.  This is an IList wrapper
9333         which we're now using instead of passing MemberInfo[]'s around to
9334         avoid copying this array unnecessarily.
9335         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9336         (ICachingMemberFinder, IMemberContainer): New interface.
9337         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9338         has already been checked, otherwise use it for the name comparision.
9339         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9340         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9341         if possible.  Returns a MemberList, not a MemberInfo [].
9342         (TypeHandle): New class, implements IMemberContainer.  We create
9343         one instance of this class per type, it contains a MemberCache
9344         which is used to do the member lookups.
9345         (MemberCache): New class.  Each instance of this class contains
9346         all members of a type and a name-based hash table.
9347         (MemberCache.FindMembers): This is our new member lookup
9348         function.  First, it looks up all members of the requested name in
9349         the hash table.  Then, it walks this list and sorts out all
9350         applicable members and returns them.
9351
9352 2002-08-13  Martin Baulig  <martin@gnome.org>
9353
9354         In addition to a nice code cleanup, this gives us a performance
9355         increase of about 1.4% on GNU/Linux - not much, but it's already
9356         half a second for the self-hosting MCS compilation.
9357
9358         * typemanager.cs (IMemberFinder): New interface.  It is used by
9359         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9360         Enum, Delegate or Interface.
9361         (TypeManager.finder_to_member_finder): New PtrHashtable.
9362         (TypeManager.finder_to_container): Removed.
9363         (TypeManager.finder_to_delegate): Removed.
9364         (TypeManager.finder_to_interface): Removed.
9365         (TypeManager.finder_to_enum): Removed.
9366
9367         * interface.cs (Interface): Implement IMemberFinder.
9368
9369         * delegate.cs (Delegate): Implement IMemberFinder.
9370
9371         * enum.cs (Enum): Implement IMemberFinder.
9372
9373         * class.cs (TypeContainer): Implement IMemberFinder.
9374
9375 2002-08-12  Martin Baulig  <martin@gnome.org>
9376
9377         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9378
9379 2002-08-12  Martin Baulig  <martin@gnome.org>
9380
9381         * ecore.cs (ITypeExpression): New interface for expressions which
9382         resolve to a type.
9383         (TypeExpression): Renamed to TypeLookupExpression.
9384         (Expression.DoResolve): If we're doing a types-only lookup, the
9385         expression must implement the ITypeExpression interface and we
9386         call DoResolveType() on it.
9387         (SimpleName): Implement the new ITypeExpression interface.
9388         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9389         hack, the situation that we're only looking up types can't happen
9390         anymore when this method is called.  Moved the type lookup code to
9391         DoResolveType() and call it.
9392         (SimpleName.DoResolveType): This ITypeExpression interface method
9393         is now doing the types-only lookup.
9394         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9395         (ResolveFlags): Added MaskExprClass.
9396
9397         * expression.cs (MemberAccess): Implement the ITypeExpression
9398         interface.
9399         (MemberAccess.DoResolve): Added support for a types-only lookup
9400         when we're called via ITypeExpression.DoResolveType().
9401         (ComposedCast): Implement the ITypeExpression interface.
9402
9403         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9404         Expression.Resolve() with ResolveFlags.Type instead.
9405
9406 2002-08-12  Martin Baulig  <martin@gnome.org>
9407
9408         * interface.cs (Interface.Define): Apply attributes.
9409
9410         * attribute.cs (Attribute.ApplyAttributes): Added support for
9411         interface attributes.
9412
9413 2002-08-11  Martin Baulig  <martin@gnome.org>
9414
9415         * statement.cs (Block.Emit): Only check the "this" variable if we
9416         do not always throw an exception.
9417
9418         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9419         whether the property has a set accessor.
9420
9421 2002-08-11  Martin Baulig  <martin@gnome.org>
9422
9423         Added control flow analysis support for structs.
9424
9425         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9426         with control flow analysis turned off.
9427         (IVariable): New interface.
9428         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9429         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9430         (FieldExpr.DoResolve): Resolve the instance expression with flow
9431         analysis turned off and do the definite assignment check after the
9432         resolving when we know what the expression will resolve to.
9433
9434         * expression.cs (LocalVariableReference, ParameterReference):
9435         Implement the new IVariable interface, only call the flow analysis
9436         code if ec.DoFlowAnalysis is true.
9437         (This): Added constructor which takes a Block argument.  Implement
9438         the new IVariable interface.
9439         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9440         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9441         This does the definite assignment checks for struct members.
9442
9443         * class.cs (Constructor.Emit): If this is a non-static `struct'
9444         constructor which doesn't have any initializer, call
9445         Block.AddThisVariable() to tell the flow analysis code that all
9446         struct elements must be initialized before control returns from
9447         the constructor.
9448
9449         * statement.cs (MyStructInfo): New public class.
9450         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9451         argument to this indexer.  If non-zero, check an individual struct
9452         member, not the whole struct.
9453         (FlowBranching.CheckOutParameters): Check struct members.
9454         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9455         overloaded versions of these methods which take an additional
9456         `int field_idx' argument to check struct members.
9457         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9458         overloaded versions of these methods which take an additional
9459         `string field_name' argument to check struct member.s
9460         (VariableInfo): Implement the IVariable interface.
9461         (VariableInfo.StructInfo): New public property.  Returns the
9462         MyStructInfo instance of the variable if it's a struct or null.
9463         (Block.AddThisVariable): New public method.  This is called from
9464         Constructor.Emit() for non-static `struct' constructor which do
9465         not have any initializer.  It creates a special variable for the
9466         "this" instance variable which will be checked by the flow
9467         analysis code to ensure that all of the struct's fields are
9468         initialized before control returns from the constructor.
9469         (UsageVector): Added support for struct members.  If a
9470         variable/parameter is a struct with N members, we reserve a slot
9471         in the usage vector for each member.  A struct is considered fully
9472         initialized if either the struct itself (slot 0) or all its
9473         members are initialized.
9474
9475 2002-08-08  Martin Baulig  <martin@gnome.org>
9476
9477         * driver.cs (Driver.MainDriver): Only report an error CS5001
9478         if there were no compilation errors.
9479
9480         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9481         `UnsafeContext' property to determine whether the parent is in
9482         unsafe context rather than checking the parent's ModFlags:
9483         classes nested in an unsafe class are unsafe as well.
9484
9485 2002-08-08  Martin Baulig  <martin@gnome.org>
9486
9487         * statement.cs (UsageVector.MergeChildren): Distinguish between
9488         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9489         we return.  Added test17() and test18() to test-154.cs.
9490
9491 2002-08-08  Martin Baulig  <martin@gnome.org>
9492
9493         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9494         Family access, make sure the invoking type isn't a subclass of the
9495         queried type (that'd be a CS1540).
9496
9497         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9498         this method which takes an additional `Type invocation_type'.
9499
9500         * expression.cs (BaseAccess.DoResolve): Use the base type as
9501         invocation and query type.
9502         (MemberAccess.DoResolve): If the lookup failed and we're about to
9503         report a CS0122, try a lookup with the ec.ContainerType - if this
9504         succeeds, we must report a CS1540.
9505
9506 2002-08-08  Martin Baulig  <martin@gnome.org>
9507
9508         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9509         (MethodGroupExpr): Implement the IMemberExpr interface.
9510
9511         * expression (MemberAccess.ResolveMemberAccess): No need to have
9512         any special code for MethodGroupExprs anymore, they're now
9513         IMemberExprs.   
9514
9515 2002-08-08  Martin Baulig  <martin@gnome.org>
9516
9517         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9518         Family, FamANDAssem and FamORAssem permissions.
9519         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9520
9521 2002-08-08  Martin Baulig  <martin@gnome.org>
9522
9523         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9524         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9525         or loop block.
9526
9527 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9528
9529         * driver.cs: implemented /resource option to embed managed resources.
9530
9531 2002-08-07  Martin Baulig  <martin@gnome.org>
9532
9533         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9534         (FieldBase.HasFieldInitializer): New public property.
9535         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9536         returns the field initializer and makes sure it is only resolved once.
9537         (TypeContainer.EmitFieldInitializers): Call
9538         FieldBase.GetInitializerExpression to get the initializer, this ensures
9539         that it isn't resolved multiple times.
9540
9541         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9542         the resolving process (SimpleName/MemberLookup) that we're currently
9543         emitting a field initializer (which must not access any instance members,
9544         this is an error CS0236).
9545
9546         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9547         argument, if the `IsFieldInitializer' flag is set, we must report and
9548         error CS0236 and not an error CS0120.   
9549
9550 2002-08-07  Martin Baulig  <martin@gnome.org>
9551
9552         * ecore.cs (IMemberExpr): New public interface.
9553         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9554         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9555         if the expression is an IMemberExpr.
9556
9557         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9558         to be null, implicitly default to `this' if we're non-static in
9559         this case.  Simplified the code a lot by using the new IMemberExpr
9560         interface.  Also fixed bug #28176 here.
9561
9562 2002-08-06  Martin Baulig  <martin@gnome.org>
9563
9564         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9565         ParameterReferences during semantic analysis so that we can do a
9566         type-only search when resolving Cast, TypeOf and SizeOf.
9567         (block): Pass the `current_local_parameters' to the Block's
9568         constructor.
9569
9570         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9571         argument to the constructor.
9572         (ConstructorInitializer.Resolve): Create a temporary implicit
9573         block with the parameters.
9574
9575         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9576         references here if we aren't doing a type-only search.
9577
9578         * statement.cs (Block): Added constructor which takes a
9579         `Parameters parameters' argument.
9580         (Block.Parameters): New public property.
9581
9582         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9583         to `Parameters' and made it public readonly.
9584
9585 2002-08-06  Martin Baulig  <martin@gnome.org>
9586
9587         * ecore.cs (Expression.Warning): Made this public as well.
9588
9589         * report.cs (Report.Debug): Print the contents of collections.
9590
9591 2002-08-06  Martin Baulig  <martin@gnome.org>
9592
9593         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9594         used to tell Resolve() which kinds of expressions it may return.
9595         (Expression.Resolve): Added overloaded version of this method which
9596         takes a `ResolveFlags flags' argument.  This can be used to tell
9597         Resolve() which kinds of expressions it may return.  Reports a
9598         CS0118 on error.
9599         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9600         ResolveFlags.SimpleName.
9601         (Expression.Error118): Added overloaded version of this method which
9602         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9603         which kinds of expressions are allowed.
9604
9605         * expression.cs (Argument.ResolveMethodGroup): New public method.
9606         Resolves an argument, but allows a MethodGroup to be returned.
9607         This is used when invoking a delegate.
9608
9609         * TODO: Updated a bit.
9610
9611 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9612
9613         Fixed compilation with csc.
9614
9615         * ecore.cs: Expression.Error made public. Is this correct? Should
9616         Warning be made public too?
9617
9618         * expression.cs: use ea.Location instead of ea.loc.
9619         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9620
9621 2002-08-06  Martin Baulig  <martin@gnome.org>
9622
9623         * ecore.cs (Expression.loc): Moved the location here instead of
9624         duplicating it in all derived classes.
9625         (Expression.Location): New public property.
9626         (Expression.Error, Expression.Warning): Made them non-static and
9627         removed the location argument.
9628         (Expression.Warning): Added overloaded version which takes an
9629         `int level' argument.
9630         (Expression.Error118): Make this non-static and removed the
9631         expression and location arguments.
9632         (TypeExpr): Added location argument to the constructor.
9633
9634         * expression.cs (StaticCallExpr): Added location argument to
9635         the constructor.
9636         (Indirection, PointerArithmetic): Likewise.
9637         (CheckedExpr, UnCheckedExpr): Likewise.
9638         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9639         (StringPtr): Likewise.
9640
9641
9642 2002-08-05  Martin Baulig  <martin@gnome.org>
9643
9644         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9645
9646         * assign.cs (Assign.DoResolve): Check whether the source
9647         expression is a value or variable.
9648
9649         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9650         while resolving the corresponding blocks.
9651
9652         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9653         an error, don't silently return null.
9654
9655         * statement.cs (Block.AddVariable): Do the error reporting here
9656         and distinguish between CS0128 and CS0136.
9657         (Block.DoResolve): Report all unused labels (warning CS0164).
9658         (LabeledStatement): Pass the location to the constructor.
9659         (LabeledStatement.HasBeenReferenced): New property.
9660         (LabeledStatement.Resolve): Set it to true here.
9661
9662         * statement.cs (Return.Emit): Return success even after reporting
9663         a type mismatch error (CS0126 or CS0127), this is what csc does and
9664         it avoids confusing the users with any consecutive errors.
9665
9666 2002-08-05  Martin Baulig  <martin@gnome.org>
9667
9668         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9669
9670         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9671
9672         * expression.cs (MemberAccess.DoResolve): Silently return if an
9673         error has already been reported.
9674
9675         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9676         error has already been reported.
9677
9678 2002-08-05  Martin Baulig  <martin@gnome.org>
9679
9680         * statement.cs (UsageVector): Only initialize the `parameters'
9681         vector if we actually have any "out" parameters.
9682
9683 2002-08-05  Martin Baulig  <martin@gnome.org>
9684
9685         * expression.cs (Binary.ResolveOperator): When combining delegates,
9686         they must have the same type.
9687
9688 2002-08-05  Martin Baulig  <martin@gnome.org>
9689
9690         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9691         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9692         work with the ms runtime and we also don't need it: if we're a
9693         PropertyBuilder and not in the `indexer_arguments' hash, then we
9694         are a property and not an indexer.
9695
9696         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9697         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9698         since the latter one doesn't work with the ms runtime.
9699
9700 2002-08-03  Martin Baulig  <martin@gnome.org>
9701
9702         Fixed bugs #27998 and #22735.
9703
9704         * class.cs (Method.IsOperator): New public field.
9705         (Method.CheckBase): Report CS0111 if there's already a method
9706         with the same parameters in the current class.  Report CS0508 when
9707         attempting to change the return type of an inherited method.
9708         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9709         and it's not marked abstract or extern.
9710         (PropertyBase): New abstract base class for Property and Indexer.
9711         (PropertyBase.CheckBase): Moved here from Property and made it work
9712         for indexers.
9713         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9714         the same so we can reuse it there.
9715         (Property, Indexer): Derive from PropertyBase.
9716         (MethodSignature.inheritable_property_signature_filter): New delegate
9717         to find properties and indexers.
9718
9719         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9720         argument and improved error reporting.
9721
9722         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9723         EmptyReadOnlyParameters and made it a property.
9724
9725         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9726         version of this method which takes a `PropertyInfo indexer'.
9727         (TypeManager.RegisterIndexer): New method.
9728
9729         * class.cs: Added myself as author of this file :-)
9730
9731 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9732
9733         * class.cs: fixed compilation on windoze.
9734
9735 2002-08-03  Martin Baulig  <martin@gnome.org>
9736
9737         * interface.cs (Interface.GetInterfaceBases): Check whether all
9738         base interfaces are at least as accessible than the current one.
9739
9740         * class.cs (TypeContainer.GetClassBases): Check whether base types
9741         are at least as accessible than the current type.
9742         (TypeContainer.AsAccessible): Implemented and made non-static.
9743         (MemberBase.CheckParameters): Report errors if the accessibility
9744         checks fail.
9745
9746         * delegate.cs (Delegate.Delegate): The default visibility is
9747         internal for top-level types and private for nested types.
9748         (Delegate.Define): Report errors if the accessibility checks fail.
9749
9750         * enum.cs (Enum.Enum): The default visibility is internal for
9751         top-level types and private for nested types.
9752         (Enum.DefineType): Compute the correct visibility.
9753
9754         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9755         function which takes a `bool is_toplevel' instead of a TypeContainer.
9756
9757         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9758         builtin type.
9759
9760 2002-08-02  Martin Baulig  <martin@gnome.org>
9761
9762         * expression.cs (LocalVariableReferenc): Added constructor which
9763         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9764         (LocalVariableReference.IsReadOnly): New property.
9765         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9766         variable is readonly, use our own readonly flag to do this; you can
9767         use the new constructor to get a writable reference to a read-only
9768         variable.
9769
9770         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9771         reference to the local variable.
9772
9773 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9774
9775         * rootcontext.cs (ResolveCore): Also include System.Exception
9776
9777         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9778         we reach an EmptyStatement.
9779
9780         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9781         is also fine.
9782
9783         * expression.cs (Binary.ResolveOperator): Check error result in
9784         two places.
9785
9786         use brtrue/brfalse directly and avoid compares to null.
9787
9788 2002-08-02  Martin Baulig  <martin@gnome.org>
9789
9790         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9791         Fixes bug #28407, added test-155.cs.
9792
9793 2002-08-01  Martin Baulig  <martin@gnome.org>
9794
9795         * class.cs (Event.EmitDefaultMethod): Make this work with static
9796         events.  Fixes #28311, added verify-3.cs.
9797
9798 2002-08-01  Martin Baulig  <martin@gnome.org>
9799
9800         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9801         `is_disposable' fields.
9802         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9803         `hm.is_disposable' if we're using the collection pattern.
9804         (Foreach.EmitCollectionForeach): Use the correct type for the
9805         enumerator's local variable, only emit the try/finally block if
9806         necessary (fixes #27713).
9807
9808 2002-08-01  Martin Baulig  <martin@gnome.org>
9809
9810         * ecore.cs (Expression.report118): Renamed to Error118 and made
9811         it public static.
9812
9813         * statement.cs (Throw.Resolve): Check whether the expression is of
9814         the correct type (CS0118) and whether the type derives from
9815         System.Exception (CS0155).
9816         (Catch.Resolve): New method.  Do the type lookup here and check
9817         whether it derives from System.Exception (CS0155).
9818         (Catch.CatchType, Catch.IsGeneral): New public properties.
9819
9820         * typemanager.cs (TypeManager.exception_type): Added.
9821
9822 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9823
9824         * driver.cs: Updated About function.
9825
9826 2002-07-31  Martin Baulig  <martin@gnome.org>
9827
9828         Implemented Control Flow Analysis.
9829
9830         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9831         (EmitContext.CurrentBranching): Added.
9832         (EmitContext.StartFlowBranching): Added.
9833         (EmitContext.EndFlowBranching): Added.
9834         (EmitContext.KillFlowBranching): Added.
9835         (EmitContext.IsVariableAssigned): Added.
9836         (EmitContext.SetVariableAssigned): Added.
9837         (EmitContext.IsParameterAssigned): Added.
9838         (EmitContext.SetParameterAssigned): Added.
9839         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9840         Added control flow analysis stuff here.
9841
9842         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9843         resolve the expression as lvalue.
9844         (LocalVariableReference.DoResolve): Check whether the variable has
9845         already been assigned.
9846         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9847         the parameter as assigned here.
9848         (ParameterReference.DoResolve): Check whether the parameter has already
9849         been assigned.
9850         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9851         expression as lvalue.
9852
9853         * statement.cs (FlowBranching): New class for the flow analysis code.
9854         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9855         (LabeledStatement.IsDefined): New public property.
9856         (LabeledStatement.AddUsageVector): New public method to tell flow
9857         analyis that the label may be reached via a forward jump.
9858         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9859         flow analysis.
9860         (VariableInfo.Number): New public field.  This is used by flow analysis
9861         to number all locals of a block.
9862         (Block.CountVariables): New public property.  This is the number of
9863         local variables in this block (including the locals from all parent
9864         blocks).
9865         (Block.EmitMeta): Number all the variables.
9866
9867         * statement.cs: Added flow analysis support to all classes.
9868
9869 2002-07-31  Martin Baulig  <martin@gnome.org>
9870
9871         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9872         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9873         then use this argument.
9874
9875         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9876
9877         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9878         use this to specify /define options.
9879
9880 2002-07-29  Martin Baulig  <martin@gnome.org>
9881
9882         * statement.cs (Fixed): Moved all code that does variable lookups
9883         and resolvings from Emit to Resolve.
9884
9885         * statement.cs (For): Moved all code that does variable lookups
9886         and resolvings from Emit to Resolve.
9887
9888         * statement.cs (Using): Moved all code that does variable lookups
9889         and resolvings from Emit to Resolve.
9890
9891 2002-07-29  Martin Baulig  <martin@gnome.org>
9892
9893         * attribute.cs (Attribute.Resolve): Explicitly catch a
9894         System.NullReferenceException when creating the
9895         CustromAttributeBuilder and report a different warning message.
9896
9897 2002-07-29  Martin Baulig  <martin@gnome.org>
9898
9899         * support.cs (ParameterData.ParameterName): Added method to
9900         get the name of a parameter.
9901
9902         * typemanager.cs (TypeManager.IsValueType): New public method.
9903
9904 2002-07-29  Martin Baulig  <martin@gnome.org>
9905
9906         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9907         is a flag which specifies that it's either ref or out.
9908         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9909         the out parameter to `out Parameter.Modifier mod', also set the
9910         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9911
9912         * support.cs (InternalParameters.ParameterModifier): Distinguish
9913         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9914         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9915
9916         * expression.cs (Argument.GetParameterModifier): Distinguish
9917         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9918         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9919
9920 2002-07-29  Martin Baulig  <martin@gnome.org>
9921
9922         * expression.cs (ParameterReference.ParameterReference): Added
9923         `Location loc' argument to the constructor.
9924
9925         * cs-parser.jay: Pass location to ParameterReference.
9926
9927 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9928
9929         * statement.cs (Try): Initialize the location.
9930
9931         * cs-parser.jay: pass location to Try.
9932
9933         * expression.cs (Unary.Reduce): Change the prototype to return
9934         whether a constant fold could be performed or not.  The result is
9935         returned in an out parameters.  In the case of Indirection and
9936         AddressOf, we want to perform the full tests.
9937
9938 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9939
9940         * statement.cs (Statement.Emit): Flag dead code.
9941
9942 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9943
9944         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9945
9946 2002-07-27  Martin Baulig  <martin@gnome.org>
9947
9948         * class.cs (MethodData.Define): Put back call to
9949         TypeManager.AddMethod(), accidentally commented this out.
9950
9951         * report.cs (Debug): New public method to print debugging information,
9952         this is `[Conditional ("DEBUG")]'.
9953
9954 2002-07-26  Martin Baulig  <martin@gnome.org>
9955
9956         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9957         (switch_statement): Push the current_block to the switch_stack and
9958         pop it again when we're done with the switch.
9959         (switch_section): The new block is a child of the current_block.
9960         Fixes bug #24007, added test-152.cs.
9961
9962 2002-07-27  Martin Baulig  <martin@gnome.org>
9963
9964         * expression.cs (Invocation.EmitArguments): When calling a varargs
9965         function with only its fixed arguments, we need to pass an empty
9966         array.
9967
9968 2002-07-27  Martin Baulig  <martin@gnome.org>
9969
9970         Mono 0.13 has been released.
9971
9972 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9973
9974         * driver.cs: Rename --resource to --linkres, because that is what
9975         we do currently, we dont support --resource yet.
9976
9977         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9978
9979 2002-07-25  Martin Baulig  <martin@gnome.org>
9980
9981         * class.cs (MethodData): New public class.  This is a `method builder'
9982         class for a method or one accessor of a Property/Indexer/Event.
9983         (MethodData.GetMethodFlags): Moved here from MemberBase.
9984         (MethodData.ApplyAttributes): Likewise.
9985         (MethodData.ApplyObsoleteAttribute): Likewise.
9986         (MethodData.ApplyConditionalAttribute): Likewise.
9987         (MethodData.ApplyDllImportAttribute): Likewise.
9988         (MethodData.CheckAbstractAndExternal): Likewise.
9989         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9990         (MethodData.Emit): Formerly known as Method.Emit().
9991         (MemberBase): Moved everything which was specific to a single
9992         accessor/method to MethodData.
9993         (Method): Create a new MethodData and call Define() and Emit() on it.
9994         (Property, Indexer, Event): Create a new MethodData objects for each
9995         accessor and call Define() and Emit() on them.
9996
9997 2002-07-25  Martin Baulig  <martin@gnome.org>
9998
9999         Made MethodCore derive from MemberBase to reuse the code from there.
10000         MemberBase now also checks for attributes.
10001
10002         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10003         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10004         as virtual.
10005         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10006         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10007         (MemberBase.ApplyAttributes): New virtual method; applies the
10008         attributes to a method or accessor.
10009         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10010         (MemberBase.ApplyConditionalAttribute): Likewise.
10011         (MemberBase.ApplyDllImportAttribute): Likewise.
10012         (MemberBase.CheckAbstractAndExternal): Likewise.
10013         (MethodCore.ParameterTypes): This is now a property instead of a
10014         method, it's initialized from DoDefineParameters().
10015         (MethodCore.ParameterInfo): Removed the set accessor.
10016         (MethodCore.DoDefineParameters): New protected virtual method to
10017         initialize ParameterTypes and ParameterInfo.
10018         (Method.GetReturnType): We can now simply return the MemberType.
10019         (Method.GetMethodFlags): Override the MemberBase version and add
10020         the conditional flags.
10021         (Method.CheckBase): Moved some code from Define() here, call
10022         DoDefineParameters() here.
10023         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10024         here to avoid some larger code duplication.
10025         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10026         ensure that abstract and external accessors don't declare a body.
10027
10028         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10029         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10030         lookup in the attribute's parent classes, so we need to abort as soon
10031         as we found the first match.
10032         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10033         the attribute has no arguments.
10034
10035         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10036         of a Method.
10037
10038 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10039
10040         * cs-parser.jay: reverted previous patch.
10041
10042 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10043
10044         * cs-parser.jay: fixed bug #22119.
10045
10046 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10047
10048         * attribute.cs: fixed compilation. The error was:
10049         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10050         be assigned to before control leaves the current method."
10051         [FIXME:  Filed as bug #28186: MCS must report this error.]
10052
10053 2002-07-25  Martin Baulig  <martin@gnome.org>
10054
10055         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10056         method to pull the condition name ouf of a Conditional attribute.
10057         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10058         the obsolete message and error flag out of an Obsolete attribute.
10059
10060         * class.cs (Method.GetMethodFlags): New public method to get the
10061         TypeManager.MethodFlags for this method.
10062         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10063         private methods.
10064         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10065         if we're overriding a virtual function, set the new private variable
10066         `parent_method'; call the new TypeManager.AddMethod().
10067
10068         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10069         the MethodBuilder and the Method in a PtrHashtable.
10070         (TypeManager.builder_to_method): Added for this purpose.
10071         (TypeManager.MethodFlags): Added IsObsoleteError.
10072         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10073         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10074         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10075         the message from the attribute.
10076
10077 2002-07-24  Martin Baulig  <martin@gnome.org>
10078
10079         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10080         preprocessor directives, ensure that the argument to #define/#undef is
10081         exactly one identifier and that it's actually an identifier.
10082
10083         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10084         did not work ....
10085
10086 2002-07-24  Martin Baulig  <martin@gnome.org>
10087
10088         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10089         initialize it to TypeManager.object_type in the constructor.
10090         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10091         of the `hm.get_current' method if we're using the collection pattern.
10092         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10093         for the explicit conversion to make it work when we're using the collection
10094         pattern and the `Current' property has a different return type than `object'.
10095         Fixes #27713.
10096
10097 2002-07-24  Martin Baulig  <martin@gnome.org>
10098
10099         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10100         does not match, but don't report any errors.  This method is called in
10101         order for all methods in a MethodGroupExpr until a matching method is
10102         found, so we don't want to bail out if the first method doesn't match.
10103         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10104         matches, report the 123.  Fixes #28070.
10105
10106 2002-07-24  Martin Baulig  <martin@gnome.org>
10107
10108         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10109         TypeManager.TypeToCoreType() to the top of the method so the
10110         following equality checks will work.  Fixes #28107.
10111
10112 2002-07-24  Martin Baulig  <martin@gnome.org>
10113
10114         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10115         operand is of type uint, and the other operand is of type sbyte,
10116         short or int, the operands are converted to type long." -
10117         Actually do what this comment already told us.  Fixes bug #28106,
10118         added test-150.cs.
10119
10120 2002-07-24  Martin Baulig  <martin@gnome.org>
10121
10122         * class.cs (MethodBase): New abstract class.  This is now a base
10123         class for Property, Indexer and Event to avoid some code duplication
10124         in their Define() and DefineMethods() methods.
10125         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10126         generic methods for Define() and DefineMethods().
10127         (FieldBase): Derive from MemberBase, not MemberCore.
10128         (Property): Derive from MemberBase, not MemberCore.
10129         (Property.DefineMethod): Moved all the code from this method to the
10130         new MethodBase.DefineAccessor(), just call it with appropriate
10131         argumetnts.
10132         (Property.Define): Call the new Property.DoDefine(), this does some
10133         sanity checks and we don't need to duplicate the code everywhere.
10134         (Event): Derive from MemberBase, not MemberCore.
10135         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10136         accessors, this will also make them work with interface events.
10137         (Indexer): Derive from MemberBase, not MemberCore.
10138         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10139         (Indexer.Define): Use the new MethodBase functions.
10140
10141         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10142         argument to the constructor.
10143         (Interface.FindMembers): Added support for interface events.
10144         (Interface.PopluateEvent): Implemented.
10145
10146         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10147
10148 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10149
10150         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10151         but this is required to check for a method name being the same as
10152         the containing class.  
10153
10154         Handle this now.
10155
10156 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10157
10158         * interface.cs: initialize variable.
10159
10160 2002-07-23  Martin Baulig  <martin@gnome.org>
10161
10162         Implemented the IndexerName attribute in interfaces.
10163
10164         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10165         name if this is an explicit interface implementation.
10166         (Indexer.InterfaceIndexerName): New public variable.  If we're
10167         implementing an interface indexer, this is the IndexerName in that
10168         interface.  Otherwise, it's the IndexerName.
10169         (Indexer.DefineMethod): If we're implementing interface indexer,
10170         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10171         and Pending.ImplementIndexer methods.
10172         (Indexer.Define): Also define the PropertyBuilder if we're
10173         implementing an interface indexer and this is neither an explicit
10174         interface implementation nor do the IndexerName match the one in
10175         the interface.
10176
10177         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10178         If a method is defined here, then we always need to create a proxy
10179         for it.  This is used when implementing interface indexers.
10180         (Pending.IsInterfaceIndexer): New public method.
10181         (Pending.ImplementIndexer): New public method.
10182         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10183         This is used when implementing interface indexers to define a proxy
10184         if necessary.
10185         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10186         define a proxy if necessary.
10187
10188         * interface.cs (Interface.IndexerName): New public variable.
10189         (Interface.PopulateIndexer): Set the IndexerName.
10190         (Interface.DefineIndexers): New private method.  Populate all the
10191         indexers and make sure their IndexerNames match.
10192
10193         * typemanager.cs (IndexerPropertyName): Added support for interface
10194         indexers.
10195
10196 2002-07-22  Martin Baulig  <martin@gnome.org>
10197
10198         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10199         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10200         ret if HasReturnLabel.
10201         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10202         variables.
10203
10204         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10205         and set the ec.LoopBeginTryCatchLevel.
10206         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10207         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10208         the current ec.TryCatchLevel, the branch goes out of an exception
10209         block.  In this case, we need to use Leave and not Br.
10210
10211 2002-07-22  Martin Baulig  <martin@gnome.org>
10212
10213         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10214         block unless the block does not always return or it is contained in
10215         another try { ... } catch { ... } block.  Fixes bug #26506.
10216         Added verify-1.cs to the test suite.
10217
10218 2002-07-22  Martin Baulig  <martin@gnome.org>
10219
10220         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10221         then we do not always return.  Fixes bug #24985.
10222
10223 2002-07-22  Martin Baulig  <martin@gnome.org>
10224
10225         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10226         lookup on a per-class level; ie. walk up the class hierarchy until we
10227         found at least one applicable method, then choose the best among them.
10228         Fixes bug #24463 and test-29.cs.
10229
10230 2002-07-22  Martin Baulig  <martin@gnome.org>
10231
10232         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10233         return types of the methods.  The return type is not part of the
10234         signature and we must not check it to make the `new' modifier work.
10235         Fixes bug #27999, also added test-147.cs.
10236         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10237
10238         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10239         on the method's return type.
10240
10241 2002-07-21  Martin Baulig  <martin@gnome.org>
10242
10243         * assign.cs: Make this work if the rightmost source is a constant and
10244         we need to do an implicit type conversion.  Also adding a few more tests
10245         to test-38.cs which should have caught this.
10246
10247         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10248         target in the makefile for this.  The makefile.gnu is primarily intended
10249         for end-users who don't want to debug the compiler.
10250
10251 2002-07-21  Martin Baulig  <martin@gnome.org>
10252
10253         * assign.cs: Improved the Assign class so it can now handle embedded
10254         assignments (X = Y = Z = something).  As a side-effect this'll now also
10255         consume less local variables.  test-38.cs now passes with MCS, added
10256         a few new test cases to that test.
10257
10258 2002-07-20  Martin Baulig  <martin@gnome.org>
10259
10260         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10261         instructions.  Fixes bug #27977, also added test-146.cs.
10262
10263 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10264
10265         * cs-tokenizer.cs: fixed getHex ().
10266
10267 2002-07-19  Martin Baulig  <martin@gnome.org>
10268
10269         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10270         not Type.GetType() to lookup the array type.  This is needed when
10271         we're constructing an array of a user-defined type.
10272         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10273         single-dimensional arrays, but also for single-dimensial arrays of
10274         type decimal.
10275
10276 2002-07-19  Martin Baulig  <martin@gnome.org>
10277
10278         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10279         this function is called, it's not allowed to share LocalBuilders
10280         among ILGenerators.
10281
10282 2002-07-19  Martin Baulig  <martin@gnome.org>
10283
10284         * expression.cs (Argument.Resolve): Report an error 118 when trying
10285         to pass a type as argument.
10286
10287 2002-07-18  Martin Baulig  <martin@gnome.org>
10288
10289         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10290         Conv_R_Un for the signed `long' type.
10291
10292 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10293
10294         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10295         `expr' for the temporary result, as that will fail if we do
10296         multiple resolves on the same expression.
10297
10298 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10299
10300         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10301         ec.TypeContainer for looking up aliases. 
10302
10303         * class.cs (TypeContainer): Remove LookupAlias from here.
10304
10305         * decl.cs (DeclSpace); Move here.
10306
10307 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10308
10309         * class.cs (FindMembers): Only call filter if the constructor
10310         bulider is not null.
10311
10312         Also handle delegates in `NestedTypes' now.  Now we will perform
10313         type lookups using the standard resolution process.  This also
10314         fixes a bug.
10315
10316         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10317         This uses Expressions (the limited kind that can be parsed by the
10318         tree) instead of strings.
10319
10320         * expression.cs (ComposedCast.ToString): Implement, used to flag
10321         errors since now we have to render expressions.
10322
10323         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10324         FormArrayType. 
10325
10326         * ecore.cs (SimpleName.ToString): ditto.
10327
10328         * cs-parser.jay: Instead of using strings to assemble types, use
10329         Expressions to assemble the type (using SimpleName, ComposedCast,
10330         MemberAccess).  This should fix the type lookups in declarations,
10331         because we were using a different code path for this.
10332
10333         * statement.cs (Block.Resolve): Continue processing statements
10334         even when there is an error.
10335
10336 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10337
10338         * class.cs (Event.Define): Also remove the `remove' method from
10339         the list of pending items.
10340
10341         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10342         generate more compact code. 
10343
10344 2002-07-17  Martin Baulig  <martin@gnome.org>
10345
10346         * const.cs (Const.LookupConstantValue): Add support for constant
10347         `unchecked' and `checked' expressions.
10348         Also adding test case test-140.cs for this.
10349
10350 2002-07-17  Martin Baulig  <martin@gnome.org>
10351
10352         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10353         check whether mi.ReturnType implements the IEnumerator interface; the
10354         `==' and the IsAssignableFrom() will fail in this situation.
10355
10356 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10357
10358         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10359         here too.
10360
10361 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10362
10363         * expression.cs: fixed bug #27811.
10364
10365 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10366
10367         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10368         Molaro: when we are a ref, the value already contains a pointer
10369         value, do not take the address of it.
10370
10371 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10372         * removed mb-parser.jay and mb-tokenizer.cs
10373
10374 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10375
10376         * expression.cs: check against the building corlib void type.
10377
10378 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10379
10380         * ecore.cs: fix for valuetype static readonly fields: when 
10381         initializing them, we need their address, not the address of a copy.
10382
10383 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10384
10385         * typemanager.cs: register also enum_type in corlib.
10386
10387 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10388
10389         * class.cs: allow calling this (but not base) initializers in structs.
10390
10391 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10392
10393         * ecore.cs: make sure we compare against the building base types
10394         in GetTypeSize ().
10395
10396 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10397
10398         * typemanager.cs: fix TypeToCoreType() to handle void and object
10399         (corlib gets no more typerefs after this change).
10400
10401 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10402
10403         * expression.cs (ArrayCreation.EmitArrayArguments): use
10404         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10405
10406         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10407         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10408         array indexes, the runtime actually forbids them.
10409
10410         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10411         for array arguments here.
10412
10413         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10414         instead of the default for ValueTypes.
10415
10416         (New.DoEmit): Use IsValueType instead of
10417         IsSubclassOf (value_type)
10418         (New.DoResolve): ditto.
10419         (Invocation.EmitCall): ditto.
10420
10421         * assign.cs (Assign): ditto.
10422
10423         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10424         Statements *are* currently doing part of their resolution during
10425         Emit.  
10426
10427         Expressions do always resolve during resolve, but statements are
10428         only required to propagate resolution to their children.
10429
10430 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10431
10432         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10433
10434         (LoadAssembly): Do not add the dll if it is already specified
10435
10436         (MainDriver): Add the System directory to the link path at the end,
10437         after all the other -L arguments. 
10438
10439         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10440         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10441         ldelem.u1) and using the opposite for sbytes.
10442
10443         This fixes Digger, and we can finally run it.
10444
10445         * driver.cs (UnixParseOption): Move the option parsing here.  
10446         (CSCParseOption): Implement CSC-like parsing of options.
10447
10448         We now support both modes of operation, the old Unix way, and the
10449         new CSC-like way.  This should help those who wanted to make cross
10450         platform makefiles.
10451
10452         The only thing broken is that /r:, /reference: and /lib: are not
10453         implemented, because I want to make those have the same semantics
10454         as the CSC compiler has, and kill once and for all the confussion
10455         around this.   Will be doing this tomorrow.
10456
10457         * statement.cs (Unsafe.Resolve): The state is checked during
10458         resolve, not emit, so we have to set the flags for IsUnsfe here.
10459
10460 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10461
10462         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10463         not catch the Error_ObjectRefRequired in SimpleName (as it is
10464         possible to have a class/instance variable name that later gets
10465         deambiguated), we have to check this here.      
10466
10467 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10468
10469         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10470         make static and put into Expression.
10471
10472         (Event.Define): Register the private field of the event with the 
10473         TypeManager so that GetFieldFromEvent can get at it.
10474
10475         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10476         keep track of the private field associated with an event which
10477         has no accessors.
10478
10479         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10480         private field.
10481
10482         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10483
10484 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10485
10486         * expression.cs (Binary.EmitBranchable): this routine emits the
10487         Binary expression in a branchable context.  This basically means:
10488         we need to branch somewhere, not just get the value on the stack.
10489
10490         This works together with Statement.EmitBoolExpression.
10491
10492         * statement.cs (Statement.EmitBoolExpression): Use
10493         EmitBranchable. 
10494
10495 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10496
10497         * statement.cs (For): Reduce the number of jumps in loops.
10498
10499         (For): Implement loop inversion for the For statement.
10500
10501         (Break): We can be breaking out of a Try/Catch controlled section
10502         (foreach might have an implicit try/catch clause), so we need to
10503         use Leave instead of Br.
10504
10505         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10506         now).  If the instace expression supports IMemoryLocation, we use
10507         the AddressOf method from the IMemoryLocation to extract the
10508         address instead of emitting the instance.
10509
10510         This showed up with `This', as we were emitting the instance
10511         always (Emit) instead of the Address of This.  Particularly
10512         interesting when This is a value type, as we dont want the Emit
10513         effect (which was to load the object).
10514
10515 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10516
10517         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10518
10519         * statement.cs (Checked): Set the CheckedState during the resolve
10520         process too, as the ConvCast operations track the checked state on
10521         the resolve process, and not emit.
10522
10523         * cs-parser.jay (namespace_member_declaration): Flag that we have
10524         found a declaration when we do.  This is used to flag error 1529
10525
10526         * driver.cs: Report ok when we display the help only.
10527
10528 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10529
10530         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10531
10532 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10533
10534         * cs-tokenizer.cs (define): We also have to track locally the
10535         defines.  AllDefines is just used for the Conditional Attribute,
10536         but we also need the local defines for the current source code. 
10537
10538 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10539
10540         * statement.cs (While, For, Do): These loops can exit through a
10541         Break statement, use this information to tell whether the
10542         statement is the last piece of code.
10543
10544         (Break): Flag that we break.
10545
10546         * codegen.cs (EmitContexts): New `Breaks' state variable.
10547
10548 2002-07-03  Martin Baulig  <martin@gnome.org>
10549
10550         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10551         modifiers in method declarations in structs.  Otherwise, you won't
10552         be able to override things like Object.Equals().
10553
10554 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10555
10556         * class.cs (Method, Property, Indexer): Do not allow the public
10557         modifier to be used in explicit interface implementations.
10558
10559         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10560         override modifiers in method declarations in structs
10561
10562 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10563
10564         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10565         integer or real overflow, report an error
10566
10567 2002-07-02  Martin Baulig  <martin@gnome.org>
10568
10569         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10570         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10571         to tell the runtime about our newly created System.Object and
10572         System.ValueType types.
10573
10574 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10575
10576         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10577         struct instead of Ldarg/Starg.
10578
10579 2002-07-02  Martin Baulig  <martin@gnome.org>
10580
10581         * expression.cs (Indirection.Indirection): Call
10582         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10583
10584 2002-07-02  Martin Baulig  <martin@gnome.org>
10585
10586         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10587         ValueType, call TypeManager.TypeToCoreType() on it.
10588         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10589         the OpCodes.Newarr argument.
10590
10591 2002-07-02  Martin Baulig  <martin@gnome.org>
10592
10593         * expression.cs (Invocation.EmitCall): When compiling corlib,
10594         replace all calls to the system's System.Array type to calls to
10595         the newly created one.
10596
10597         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10598         System.Array methods.
10599         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10600         from the system's System.Array type which must be replaced.
10601
10602 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10603
10604         * typemanager.cs: load unverifiable_code_ctor so we can build
10605         corlib using the correct type. Avoid using GetTypeCode() with
10606         TypeBuilders.
10607         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10608         TypeManager.object_type to allow building corlib.
10609
10610 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10611
10612         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10613
10614 2002-07-01  Martin Baulig  <martin@gnome.org>
10615
10616         * class.cs: Make the last change actually work, we need to check
10617         whether `ifaces != null' to avoid a crash.
10618
10619 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10620
10621         * class.cs: when we build structs without fields that implement
10622         interfaces, we need to add the interfaces separately, since there is
10623         no API to both set the size and add the interfaces at type creation
10624         time.
10625
10626 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10627
10628         * expression.cs: the dimension arguments to the array constructors
10629         need to be converted if they are a long.
10630
10631 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10632
10633         * class.cs: don't emit ldarg.0 if there is no parent constructor
10634         (fixes showstopper for corlib).
10635
10636 2002-06-29  Martin Baulig  <martin@gnome.org>
10637
10638         MCS now compiles corlib on GNU/Linux :-)
10639
10640         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10641         ie. check for MethodImplOptions.InternalCall.
10642
10643         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10644         and TypeManager.attribute_type are null, so we must explicitly check
10645         whether parent is not null to find out whether it's an attribute type.
10646         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10647         and SetBuilder, not only if the property is neither abstract nor external.
10648         This is necessary to set the MethodImplOptions on the accessor methods.
10649         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10650         SetBuilder, see Property.Emit().
10651
10652         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10653         populate "System.Object", "System.ValueType" and "System.Attribute" since
10654         they've already been populated from BootCorlib_PopulateCoreTypes().
10655
10656 2002-06-29  Martin Baulig  <martin@gnome.org>
10657
10658         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10659         is the NullLiteral, we also need to make sure that target_type is not
10660         an enum type.   
10661
10662 2002-06-29  Martin Baulig  <martin@gnome.org>
10663
10664         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10665         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10666         before calling BootstrapCorlib_ResolveDelegate ().
10667
10668 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10669
10670         * statement.cs: fixed build-breaker. All tests passed ok.
10671
10672 2002-06-27  Martin Baulig  <martin@gnome.org>
10673
10674         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10675         for System.Decimal when compiling corlib.
10676
10677 2002-06-27  Martin Baulig  <martin@gnome.org>
10678
10679         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10680         switch blocks which contain nothing but a default clause.
10681
10682 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10683
10684        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10685
10686 2002-06-27  Martin Baulig  <martin@gnome.org>
10687
10688         * ecore.cs (PropertyExpr.PropertyExpr): Call
10689         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10690
10691         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10692         is already a TypeBuilder.
10693
10694 2002-06-27  Martin Baulig  <martin@gnome.org>
10695
10696         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10697         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10698         the "from an array-type to System.Array" case.  This makes it work
10699         when compiling corlib.
10700
10701 2002-06-27  Martin Baulig  <martin@gnome.org>
10702
10703         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10704         non-static PropertyExpr, set its InstanceExpression.  This makes
10705         the `ICollection.Count' property work in System/Array.cs.
10706
10707 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10708
10709         * driver.cs: Made error handling more consistent.  Errors now
10710         tracked by Report class, so many methods which used to return int
10711         now return void.  Main() now prints success/failure and 
10712         errors/warnings message.
10713
10714         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10715         the magic number return values (123 and 124).  Now, if the
10716         expected error occurs, the compiler exits with success (exit value
10717         0).  If the compilation completes without seeing that particular
10718         error, the compiler exits with failure (exit value 1).  The
10719         makefile in mcs/errors has been changed to handle the new behaviour.
10720
10721         * report.cs: Made 'expected error' number a property and renamed
10722         it from 'Probe' to 'ExpectedError'.
10723
10724         * genericparser.cs: Removed error handling support, since it is
10725         now all done by Report class.
10726
10727         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10728         class, so parse() no longer returns an int.
10729
10730         * namespace.cs: Use Report.Error instead of GenericParser.error
10731
10732 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10733
10734         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10735         TypeContainer.AddOperator): At the front of the list put the
10736         explicit implementations, so they get resolved/defined first. 
10737
10738 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10739
10740         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10741         interface type is implemented by this TypeContainer.  Used during
10742         explicit interface implementation.
10743
10744         (Property.Define, Indexer.Define, Method.Define): Validate that
10745         the given interface in the explicit implementation is one of the
10746         base classes for the containing type.
10747
10748         Also if we are explicitly implementing an interface, but there is
10749         no match in the pending implementation table, report an error.
10750
10751         (Property.Define): Only define the property if we are
10752         not explicitly implementing a property from an interface.  Use the
10753         correct name also for those properties (the same CSC uses,
10754         although that is really not needed).
10755
10756         (Property.Emit): Do not emit attributes for explicitly implemented
10757         properties, as there is no TypeBuilder.
10758
10759         (Indexer.Emit): ditto.
10760
10761         Hiding then means that we do not really *implement* a pending
10762         implementation, which makes code fail.
10763
10764 2002-06-22  Martin Baulig  <martin@gnome.org>
10765
10766         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10767         the return value of Object.GetType().  [FIXME: we need to do this whenever
10768         we get a type back from the reflection library].
10769
10770 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10771
10772         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10773
10774 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10775
10776         * attribute.cs: Return null if we can not look up the type.
10777
10778         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10779         the interface types found.
10780
10781         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10782         interface types found.
10783
10784         * typemanager.cs (GetInterfaces): Make this routine returns alll
10785         the interfaces and work around the lame differences between
10786         System.Type and System.Reflection.Emit.TypeBuilder in the results
10787         result for GetInterfaces.
10788
10789         (ExpandInterfaces): Given an array of interface types, expand and
10790         eliminate repeated ocurrences of an interface.  This expands in
10791         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10792         be IA, IB, IC.
10793
10794 2002-06-21  Martin Baulig  <martin@gnome.org>
10795
10796         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10797         on System.Enum.
10798
10799 2002-06-21  Martin Baulig  <martin@gnome.org>
10800
10801         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10802         and called with one of the core types, return the corresponding typebuilder for
10803         that type.
10804
10805         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10806         element type.
10807
10808 2002-06-21  Martin Baulig  <martin@gnome.org>
10809
10810         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10811         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10812         (Expression.ConvertReferenceExplicit): Likewise.
10813
10814         * expression.cs (ElementAccess.DoResolve): Likewise.
10815         (ElementAccess.DoResolveLValue): Likewise.
10816
10817 2002-06-10  Martin Baulig  <martin@gnome.org>
10818
10819         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10820         add the "value" parameter to the parameter list.
10821
10822         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10823         to our caller.
10824
10825 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10826
10827         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10828         the argument to an int, uint, long or ulong, per the spec.  Also
10829         catch negative constants in array creation.
10830
10831 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10832
10833         * class.cs: do not allow the same interface to appear twice in
10834         the definition list.
10835
10836 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10837
10838         * ecore.cs: don't use ldlen with System.Array.
10839
10840 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10841
10842         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10843
10844 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10845
10846         * modifiers.cs: produce correct field attributes for protected
10847         internal. Easy fix so miguel can work on ther harder stuff:-)
10848
10849 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10850
10851         * pending.cs: New file.  Move the code from class.cs here.
10852         Support clearning the pending flag for all methods (when not doing
10853         explicit interface implementation).
10854
10855 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10856
10857         * rootcontext.cs: added a couple more types needed to bootstrap.
10858
10859 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10860
10861         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10862         constructor in the type, instead of any constructor in the type
10863         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10864         a bug in the Mono runtime when applying the params attribute). 
10865
10866 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10867         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10868
10869 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10870
10871         * expression.cs (Unary.ResolveOperator): Use TypeManager
10872         to resolve the type.
10873
10874 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10875
10876         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10877         attached.
10878
10879         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10880         with each member too.
10881
10882         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10883         field builders too - this takes care of the enum member case.
10884
10885 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10886
10887         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10888         address-of operator on both value types and pointers.
10889
10890 2002-06-10  Martin Baulig  <martin@gnome.org>
10891
10892         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10893         PropertyBuilder to the `property_builders' list.
10894
10895         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10896         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10897         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10898         find any indexers which are inherited from an interface.
10899
10900 2002-06-09  Martin Baulig  <martin@gnome.org>
10901
10902         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10903         the same type as the constant if necessary.  There's also a test-130.cs
10904         for this.
10905
10906         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10907
10908         * typemanager.cs (TypeManager.ChangeType): Previously known as
10909         Enum.ChangeEnumType().
10910
10911 2002-06-09  Martin Baulig  <martin@gnome.org>
10912
10913         * expression.cs (Cast.TryReduce): Added support for consts.
10914
10915 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10916
10917         * class.cs (Accessor): Hold attributes information so we can pass
10918         it along.
10919
10920         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10921         Modify to pass in attributes attached to the methods.
10922
10923         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10924
10925         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10926         to handle the Accessor kind :-)
10927
10928         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10929
10930 2002-06-08  Martin Baulig  <martin@gnome.org>
10931
10932         * expression.cs (Unary.TryReduceNegative): Added support for
10933         ULongConstants.
10934
10935 2002-06-08  Martin Baulig  <martin@gnome.org>
10936
10937         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10938         name can't be found in the `defined_names' - the caller will do a
10939         MemberLookup in this case and thus find methods in System.Enum
10940         such as Enum.IsDefined().
10941
10942 2002-06-08  Martin Baulig  <martin@gnome.org>
10943
10944         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10945         Convert.ChangeType() which works with TypeBuilder created types.
10946         (Enum.LookupEnumValue, Enum.Define): Use it here.
10947
10948         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10949         `TypeBuilder.BaseType != null' check.
10950         (TypeContainer.FindMembers): Only lookup parent members if we
10951         actually have a parent.
10952         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10953         (ConstructorInitializer.Resolve): Likewise.
10954
10955         * interface.cs (Interface.FindMembers): Added
10956         `TypeBuilder.BaseType != null' check.
10957
10958         * rootcontext.cs (RootContext.ResolveCore): Added
10959         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10960         classes_second_stage.
10961
10962         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10963         debug_type and trace_type when compiling with --nostdlib.       
10964
10965 2002-06-07  Martin Baulig  <martin@gnome.org>
10966
10967         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10968         (AddField): Set it to true when adding a non-static field.
10969         (DefineType): Use `have_nonstatic_fields' to find out whether we
10970         have non-static fields, not `Fields != null'.
10971
10972 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10973
10974         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10975         dereferencing a null on the static-field code path)
10976
10977 2002-05-30  Martin Baulig  <martin@gnome.org>
10978
10979         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10980         to take command line arguments.  Use reflection to call the new
10981         custom `Initialize' function on the symbol writer and pass it the
10982         command line arguments.
10983
10984         * driver.cs (--debug-args): New command line argument to pass command
10985         line arguments to the symbol writer.
10986
10987 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10988
10989         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10990         the target type for indexers and properties.  Thanks to Joe for
10991         catching this.
10992
10993 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10994
10995         * typemanager.cs (MethodFlags): returns the method flags
10996         (Obsolete/ShouldIgnore) that control warning emission and whether
10997         the invocation should be made, or ignored. 
10998
10999         * expression.cs (Invocation.Emit): Remove previous hack, we should
11000         not do this on matching a base type, we should do this based on an attribute
11001
11002         Only emit calls to System.Diagnostics.Debug and
11003         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11004         on the command line.
11005
11006         * rootcontext.cs: Global settings for tracing and debugging.
11007
11008         * cs-tokenizer.cs (define): New utility function to track
11009         defines.   Set the global settings for TRACE and DEBUG if found.
11010
11011 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11012
11013         * interface.cs (Populate*): Pass in the TypeContainer as well as
11014         the DeclSpace as parameters so that we can create EmitContexts and
11015         then use that to apply attributes etc.
11016
11017         (PopulateMethod, PopulateEvent, PopulateProperty)
11018         (PopulateIndexer): Apply attributes everywhere.
11019
11020         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11021         etc.
11022
11023         (ApplyAttributes): Update accordingly.
11024
11025         We now apply interface attributes for all members too.
11026
11027 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11028
11029         * class.cs (Indexer.Define); Correctly check if we are explicit
11030         implementation (instead of checking the Name for a ".", we
11031         directly look up if the InterfaceType was specified).
11032
11033         Delay the creation of the PropertyBuilder.
11034
11035         Only create the PropertyBuilder if we are not an explicit
11036         interface implementation.   This means that explicit interface
11037         implementation members do not participate in regular function
11038         lookups, and hence fixes another major ambiguity problem in
11039         overload resolution (that was the visible effect).
11040
11041         (DefineMethod): Return whether we are doing an interface
11042         implementation. 
11043
11044         * typemanager.cs: Temporary hack until we get attributes in
11045         interfaces (Ravi is working on that) and we get IndexerName
11046         support in interfaces.
11047
11048         * interface.cs: Register the indexers as properties.
11049
11050         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11051         warning, I have verified that this is a bug in the .NET runtime
11052         (JavaScript suffers of the same problem).
11053
11054         * typemanager.cs (MemberLookup): When looking up members for
11055         interfaces, the parent of an interface is the implicit
11056         System.Object (so we succeed in searches of Object methods in an
11057         interface method invocation.  Example:  IEnumerable x;  x.ToString
11058         ()) 
11059
11060 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11061
11062         * class.cs (Event): Events should also register if they do
11063         implement the methods that an interface requires.
11064
11065         * typemanager.cs (MemberLookup); use the new GetInterfaces
11066         method. 
11067
11068         (GetInterfaces): The code used to lookup interfaces for a type is
11069         used in more than one place, factor it here. 
11070
11071         * driver.cs: Track the errors at the bottom of the file, we kept
11072         on going.
11073
11074         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11075         instance if the method we are calling is static!
11076
11077 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11078
11079         * attribute.cs (ApplyAttributes): Make this function filter out
11080         the IndexerName attribute (as that attribute in reality is never
11081         applied) and return the string constant for the IndexerName
11082         attribute. 
11083
11084         * class.cs (TypeContainer.Emit): Validate that all the indexers
11085         have the same IndexerName attribute, and if so, set the
11086         DefaultName attribute on the class. 
11087
11088         * typemanager.cs: The return value might contain other stuff (not
11089         only methods).  For instance, consider a method with an "Item"
11090         property and an Item method.
11091
11092         * class.cs: If there is a problem with the parameter types,
11093         return. 
11094
11095 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11096
11097         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11098         looks at user defined conversion after making a call to 
11099         StandardConversionExists - we need this for overload resolution.
11100
11101         * expression.cs : Update accordingly the various method calls.
11102
11103         This fixes 2 bugs filed against implicit user defined conversions 
11104
11105 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11106
11107         * statement.cs: Track the result of the assignment.
11108
11109 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11110
11111         * expression.cs (MemberAccess): Improved error reporting for
11112         inaccessible members.
11113
11114 2002-05-22  Martin Baulig  <martin@gnome.org>
11115
11116         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11117         itself with debugging support.
11118
11119 2002-05-22  Martin Baulig  <martin@gnome.org>
11120
11121         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11122         Removed, this isn't needed anymore.
11123
11124 2002-05-20  Martin Baulig  <martin@gnome.org>
11125
11126         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11127         be underlying type for an enum.
11128
11129 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11130
11131         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11132         that splits out the loading of just the core types.
11133
11134         * rootcontext.cs (ResolveCore): Split the struct resolution in
11135         two, so we can load the enumeration underlying types before any
11136         enums are used.
11137
11138         * expression.cs (Is): Bandaid until we fix properly Switch (see
11139         bug #24985 for details).
11140
11141         * typemanager.cs (ImplementsInterface): The hashtable will contain
11142         a null if there are no interfaces implemented.
11143
11144 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11145
11146         * cs-parser.jay (indexer_declarator): It is fine to have array
11147         parameters
11148
11149 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11150
11151         * typemanager.cs: (RegisterBuilder): New function used to register
11152         TypeBuilders that implement interfaces.  Since
11153         TypeBuilder.GetInterfaces (as usual) does not work with lame
11154         Reflection.Emit. 
11155         (AddUserType): register interfaces.
11156
11157         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11158         dealing with TypeBuilder.  Also, arrays are showing up as
11159         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11160         methods can not be invoked on them!
11161
11162         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11163         (ImplicitReferenceConversionExists): Split out from
11164         StandardConversionExists. 
11165
11166         * expression.cs (As): We were only implementing one of the three
11167         cases for the as operator.  We now implement them all.
11168         (Is): Implement the various other cases for Is as well.
11169
11170         * typemanager.cs (CACHE): New define used to control if we want or
11171         not the FindMembers cache.  Seems to have a negative impact on
11172         performance currently
11173
11174         (MemberLookup): Nested types have full acess to
11175         enclosing type members
11176
11177         Remove code that coped with instance/static returns for events, we
11178         now catch this in RealFindMembers.
11179
11180         (RealFindMembers): only perform static lookup if the instance
11181         lookup did not return a type or an event.  
11182
11183 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11184
11185         * assign.cs (CompoundAssign): We pass more semantic information
11186         now to Compound Assignments than we did before: now we have all
11187         the information at hand, and now we resolve the target *before* we
11188         do the expression expansion, which allows the "CacheValue" method
11189         to have the effect we intended (before, a [x] += 1 would generate
11190         two differen ArrayAccess expressions from the ElementAccess,
11191         during the resolution process).
11192
11193         (CompoundAssign.DoResolve): Resolve target and original_source here.
11194
11195 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11196
11197         * expression.cs (ArrayAccess): dropped debugging information. 
11198
11199         * typemanager.cs: Small bug fix: I was always returning i_members,
11200         instead of one of i_members or s_members (depending on which had
11201         the content).
11202
11203         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11204         method is invoked before any code generation takes place, and it
11205         is a mechanism to inform that the expression will be invoked more
11206         than once, and that the method should use temporary values to
11207         avoid having side effects
11208
11209         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11210
11211         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11212         implementation.
11213
11214         * expression.cs (Indirection, ArrayAccess): Add support for
11215         CacheTemporaries in these two bad boys. 
11216
11217         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11218         ldobj or ldind_ref.  
11219         (StoreFromPtr): Handle stobj as well.
11220
11221         * expression.cs (UnaryMutator): Share more code.
11222
11223         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11224         down: I was not tracking the Filter function as well, which
11225         was affecting the results of the cache.
11226
11227 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11228
11229         * attribute.cs: Remove the hack to handle the CharSet property on
11230         StructLayouts. 
11231
11232 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11233
11234         * attribute.cs (DoResolve): More uglyness, we now only try to
11235         resolve the attribute partially, to extract the CharSet
11236         information (only if we are a StructLayout attribute).  Otherwise 
11237
11238         (GetExtraTypeInfo): Add some code to conditionally kill in the
11239         future this.   I am more and more convinced that the .NET
11240         framework has special code to handle the attribute setting on
11241         certain elements.
11242
11243         * expression.cs (IsParamsMethodApplicable): Revert my previous
11244         foreach change here, it was wrong.
11245
11246 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11247
11248         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11249         (pp_expr): do not abort on unknown input, just return.
11250         (eval): abort if there are pending chars.
11251
11252         * attribute.cs (Attribute.Resolve): Positional parameters are
11253         optional.  Deal with that case.
11254
11255         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11256         the Ansi/Unicode/Auto information for the type.
11257
11258         (TypeContainer.DefineType): instantiate the EmitContext here, as
11259         we will be using it during the type definition (to resolve
11260         attributes) and during the emit phase.
11261
11262         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11263         to pull type information out of the attributes
11264
11265         (Attribute.Resolve): track the constructor builder, and allow for
11266         multiple invocations (structs and classes will use this).
11267
11268         * ecore.cs (MemberLookupFinal): new version with all the
11269         parameters customizable.
11270
11271         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11272         constructors.  Return if the result value is null (as the error
11273         would have been flagged already by MemberLookupFinal)
11274
11275         Do not allow instances of abstract classes or interfaces to be
11276         created.
11277
11278         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11279         We have to compare the assembly property here when dealing with
11280         FamANDAssem and Assembly access modifiers, because we might be
11281         creating an assembly from *modules* (that means that we are not
11282         getting TypeBuilders for types defined in other modules that are
11283         part of this assembly).
11284
11285         (Method.Emit): If the method is marked abstract and has a body,
11286         emit an error. 
11287
11288         (TypeContainer.DefineMembers): If both the defined member and the
11289         parent name match are methods, then do not emit any warnings: let
11290         the Method.Define routine take care of flagging warnings.  But if
11291         there is a mismatch (method overrides something else, or method is
11292         overriwritten by something, then emit warning).
11293
11294         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11295         set to null, this means `do not check for the return type on the
11296         signature'. 
11297
11298         (Method.Define): set the return type for the method signature to
11299         null, so that we get methods with the same name and parameters and
11300         different return types.  This is used to flag warning 114 (you are
11301         hiding a method, and you probably want to use the new/override
11302         keywords instead).
11303
11304         * typemanager.cs (MemberLookup): Implemented proper access
11305         control, closing a long standing set of bug reports.  The problem
11306         was that the Framework only has two bits: Public and NonPublic,
11307         and NonPublic includes private and protected methods, but we need
11308         to enforce the FamANDAssem, FamOrAssem and Family. 
11309
11310 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11311
11312         * statement.cs (GotoCase): Return true: Ammounts to giving up
11313         knowledge on whether we return or not, and letting the other case
11314         be responsible for it.
11315
11316 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11317
11318         * driver.cs: Do not load directories for each file processed, only
11319         do it if there is a pattern.
11320
11321         * ecore.cs: Report readonly assigns here as well, as we might have
11322         been resolved only by MemberAccess.
11323
11324         (SimpleName.SimpleNameResolve): Also be useful for LValue
11325         resolution.   We need this to propagate assign to local readonly variables
11326
11327         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11328         do not want to reuse potential criteria memory.
11329
11330         * class.cs (MyEventBuilder): Set reflected_type;
11331
11332         * ecore.cs (Constantify): Added support for constifying bools.
11333
11334         (RootContext.LookupType): Added a cache for values looked up in
11335         the declaration space.
11336
11337         * typemanager.cs (FindMembers): Now is a front-end to
11338         RealFindMembers, and provides a two-level hashtable-based cache to
11339         the request.  
11340
11341         15% performance improvement: from 22.5 to 19.2 seconds.
11342
11343         * expression.cs (IsParamsMethodApplicable): use foreach.
11344         (Invocation.DoResolve): ditto.
11345         (New.DoResolve): ditto.
11346         (ArrayCreation.DoResolve): ditto.
11347
11348         * ecore.cs (FindMostEncompassingType): use foreach.
11349
11350         * delegate.cs (NewDelegate.DoResolve): Use foreach
11351
11352         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11353         (RemoveMethods): use foreach.
11354
11355         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11356         nested foreach statements instead of for, and also break out of
11357         the inner loop once a match is found.
11358
11359         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11360
11361 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11362
11363         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11364         we actually unwrap the expression to allow for extra information
11365         to be extracted. 
11366
11367         * expression.cs: Use Shr_Un on unsigned operations. 
11368
11369 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11370
11371         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11372         applicable operators was not being considered correctly. This closes
11373         the bug Miguel reported.
11374
11375 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11376
11377         * attribute.cs: check that the type derives from System.Attribute
11378         and report the correct error in that case (moved the duplicate code to
11379         its own method, too).
11380
11381 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11382
11383         * attribute.cs: lookup attribute type name as the spec says: first the
11384         bare attribute name and then name + "Attribute" (nant compiles with
11385         mcs after this fix).
11386
11387 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11388
11389         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11390         Because of the way we parse things, we should try to see if a
11391         UIntConstant can fit in an integer.
11392
11393 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11394
11395         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11396         when we are in an explicit context.
11397
11398         (ConvertReferenceExplicit): When converting from Iface type S to Class
11399         T make sure the rules are implemented as an OR.
11400
11401         * parameter.cs (ParameterType): Make it a property for now although the
11402         purpose really isn't anything immediate.
11403
11404         * expression.cs (Is*Applicable): Do better checking on the parameter type
11405         of a ref/out parameter. The ones from the system assemblies are already 
11406         marked with the correct type so we don't need to do any correction.
11407
11408         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11409         the object type is standard too so include that.
11410
11411 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11412
11413         * ecore.cs (StandardConversionExists): Augment with missing code:
11414         deal with IntConstant, LongConstants and Enumerations.
11415
11416         * assign.cs: Report the error, instead of failing silently
11417
11418         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11419         typecontainer that they are declared, because the
11420         typecontainer/namespace will have the list of using clauses that
11421         need to be applied.
11422
11423         Assembly Attributes were escaping the normal registration
11424         mechanism. 
11425
11426         (EmitCode): Apply attributes within an EmitContext that represents
11427         the container they were declared on.
11428
11429         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11430
11431 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11432
11433         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11434         Revamp completely - make much cleaner as we now operate only
11435         on a set of Types.
11436
11437         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11438         to implement the logic detailed in the spec more correctly.
11439
11440         (UserDefinedConversion): Update accordingly.
11441
11442 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11443
11444         * statement.cs: Return flow analysis information up.
11445
11446         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11447         and the default.
11448
11449         (token): Do not consume an extra character before calling
11450         decimal_digits.
11451
11452 2002-05-06  Piers Haken <piersh@friskit.com>
11453
11454         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11455
11456 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11457
11458         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11459         EmitContext during the instance constructor initializer
11460         resolution, to stop access to instance variables.
11461
11462         This is mandated by the spec, last paragraph of the `constructor
11463         initializers' section. 
11464
11465 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11466
11467         * cs-parser.jay, class.cs (Accessor): new class used to represent
11468         an accessor (get or set).  In the past we used `null' to represent
11469         a missing accessor.  But this is ambiguous because there was no
11470         way to tell in abstract indexers/properties if one of them was
11471         specified.
11472
11473         Now there is a way of addressing that.
11474
11475         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11476         instead of FindMembers.
11477
11478         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11479         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11480
11481         * attribute.cs: Treat indexers and properties as the same in terms
11482         of applying attributes
11483
11484         * ecore.cs (FindMostEncompassedType): Use statically initialized
11485         EmptyExpressions()s like we do elsewhere to avoid creating useless
11486         objects (and we take this out of the tight loop).
11487
11488         (GetConversionOperators): Move the code to extract the actual
11489         operators to a separate routine to clean things up.
11490
11491 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11492
11493         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11494         events are always registered FieldBuilders.
11495
11496         * class.cs (FieldBase): New class shared by Fields 
11497
11498         * delegate.cs: If we are a toplevel delegate, use our full name.
11499         If we are a nested delegate, then only use our tail name.
11500
11501 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11502
11503         * expression.cs (IsApplicable): Ensure that we add the "&" to
11504         ref/out types before comparing it with the type of the argument.
11505
11506         (IsParamsMethodApplicable): Ditto.
11507
11508         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11509         silly me ;-)
11510
11511         * delegate.cs : Handle the case when we have more than one applicable
11512         method. Flag an error only when we finish checking all.
11513
11514 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11515
11516         * expression.cs: Add support for boolean static initializers.
11517
11518 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11519
11520         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11521
11522         * parameter.cs (ComputeParameterTypes,
11523         ComputeAndDefineParameterTypes): Better error handling: now we
11524         clear the `types' cache if we fail during any of the type lookups.
11525         We also return the status code correctly to our caller
11526
11527         * delegate.cs: If we fail to define a delegate, abort the extra
11528         steps. 
11529
11530         * expression.cs (Binary.ResolveOperator): for
11531         operator==(object,object) and operator !=(object, object) we also
11532         have to verify that there is an implicit conversion from one to
11533         the other.
11534
11535         (ArrayAccess.DoResolve): Array Access can operate on
11536         non-variables. 
11537
11538 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11539
11540         * assign.cs (CompoundAssign): A new class used as a "flag" that
11541         the assignment actually is happening as part of a compound
11542         assignment operator.
11543
11544         During compound assignment, a few new rules exist to enable things
11545         like:
11546
11547         byte b |= 1 + 2
11548
11549         From the spec:
11550
11551         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11552         to the type of x) if y is implicitly convertible to the type of x,
11553         and the operator is a builtin operator and the return type of the
11554         operator is explicitly convertible to the type of x. 
11555
11556         * rootcontext.cs: Reset warning level to 2.  4 catches various
11557         "interesting" features in mcs, we must clean this up at some
11558         point, but currently am trying to kill other bugs ;-)
11559
11560         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11561         in container classes as well.  
11562
11563         * expression.cs (Binary.ResolveOperator): Handle string case
11564         before anything else (as operator overloading does emit an error
11565         before doing anything else).
11566
11567         This code could go away when we move to a table driven model, but
11568         i could not come up with a good plan last night.
11569
11570 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11571
11572         * typemanager.cs (CSharpName): reimplementation using regex.
11573         * class.cs: added null check for fields in Emit
11574         * rootcontext.cs: set warninglevel to 4
11575
11576 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11577
11578         * typemanager.cs (CSharpName): reimplemented with Lupus
11579         suggestion.
11580
11581 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11582
11583         * statement.cs (If): correclty implement Resolve, because we were
11584         not catching sem errors in there.  The same process is needed
11585         everywhere else. 
11586         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11587
11588
11589         (Statement.Warning_DeadCodeFound): Factorize code.
11590         (While): Report dead code here too.
11591
11592         (Statement): Added Resolve virtual method to allow
11593         for resolution split from the emit code.
11594
11595 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11596
11597         * statement.cs (EmitBoolExpression): No longer try to resolve the
11598         expression here.    
11599         (MakeBoolean): New utility function that resolve, implicitly
11600         converts to boolean and tags the expression. 
11601
11602
11603         (If, Do): Implement dead code elimination.
11604         (While): Implement loop inversion
11605
11606         (Do, While, For, If): Resolve the expression prior to calling our
11607         code generation.
11608
11609 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11610
11611         * class.cs:
11612           - added method Report28 (warning: program has more than one entry point)
11613           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11614           - modified method Method.Define, the part at the end of the method
11615
11616         * rootcontext.cs: added static public Location EntryPointLocation;
11617           
11618         * ../errors/cs0028.cs : Add test case for the above warning.              
11619
11620         * typemanager.cs:
11621           - modified method CSharpName to allow arrays of primitive type to
11622             be printed nicely (e.g. instead of System.Int32[][] it now prints
11623             int[][])
11624           - added method CSharpSignature: returns the signature of a method
11625             in string format to be used in reporting errors, warnings, etc.
11626
11627         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11628         with String.Empty.
11629
11630 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11631
11632         * delegate.cs (Define): Fix extremely silly bug where I was
11633         setting the type of the 'object' parameter of the BeginInvoke
11634         method to System.IAsyncResult instead of System.Object ;-)
11635
11636 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11637
11638         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11639         here. 
11640
11641         (Constructor.Emit): return if we fail to initialize the
11642         constructor.  Another door closed!  
11643
11644         * expression.cs (New.DoResolve): Improve error message (from -6 to
11645         1501).  Use DeclaredOnly lookup to find the exact constructor.
11646
11647         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11648         loop.  This is useful.
11649
11650         * cs-parser.jay: Adjust the default parameters so that destructors
11651         have the proper signature.
11652
11653 2002-04-26  Martin Baulig  <martin@gnome.org>
11654
11655         * driver.cs (LoadAssembly): If `assembly' contains any characters
11656         which are only valid in path names and not in assembly names
11657         (currently slash, backslash and point), use Assembly.LoadFrom ()
11658         instead of Assembly.Load () on the `assembly' (before iteration
11659         over the link_paths).
11660
11661 2002-04-26  Martin Baulig  <martin@gnome.org>
11662
11663         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11664
11665 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11666
11667         * class.cs (Property): use the new typemanager.MemberLookup
11668
11669         (TypeContainer.MemberLookup): Implement using the
11670         TypeManager.MemberLookup now. 
11671
11672         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11673         and return MemberInfos, so that these can be used without an
11674         EmitContext (what we had before).
11675
11676 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11677
11678         * expression.cs: Fix the case where the argument to params if the
11679         type of the params.  I omitted handling this before.   Fixed
11680
11681 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11682
11683         * driver.cs: Call BootCorlib_PopulateCoreType
11684
11685         * class.cs (Property.CheckBase): Check for properties only, not
11686         for all members. 
11687
11688         * interface.cs: Temporary hack: try/catch around the
11689         CustomAttributeBuilder, because I am getting an exception that I
11690         do not understand.
11691
11692         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11693         types whose definitions are required to be there (attributes are
11694         defined before standard types).
11695
11696         Compute definitions as we boot the various types, as they are used
11697         immediately (value_type class will need object_type, but if we do
11698         not initialize object_type, we will pass a null, which will let
11699         the runtime pick the System.Object from the existing corlib, which
11700         is not what we want).
11701
11702 2002-04-22  Patrik Torstensson <totte@labs2.com>
11703
11704         * cs-tokenizer.cs: fixed a number of trim() issues.
11705
11706 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11707
11708         * expression.cs (Argument.Type): Ensure that we return the correct
11709         type when we have out or ref parameters [in which case we 
11710         append a "&"].
11711
11712 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11713
11714         * class.cs (Property, Indexer): Allow extern modifier in there. 
11715
11716         * typemanager.cs (InitBaseTypes): Initializes object_type and
11717         value_type, since those will be used early on during the bootstrap
11718         process to compile corlib.
11719
11720         (InitCoreTypes): Move code from here to InitBaseTypes.
11721
11722 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11723
11724         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11725         single-dimension arrays as using the ldlen opcode.  
11726
11727         Daniel Lewis discovered this optimization.  
11728
11729         * typemanager.cs: Add signature for System.Array::get_Length
11730
11731 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11732
11733         * statement.cs: report the error when the foreach does not apply to an
11734         array nor a collection.
11735
11736 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11737
11738         * expression.cs: Add implicit conversions to the operator ~.
11739
11740         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11741
11742         * typemanager.cs: Locate the decimal constructor.
11743
11744 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11745
11746         * attribute.cs: use the new property of TypeOf.
11747         * expression.cs: added 'get' property around typearg.
11748
11749         These changes fix a build breaker reported by NickD. Is this the
11750         correct way to fix?  If not, please, revert my changes and make it
11751         work :-).
11752
11753 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11754
11755         * attribute.cs: Add support for typeof in attribute invocations.
11756         I am not sure that this is right though.
11757
11758 2002-04-14  Duncan Mak  <duncan@ximian.com>
11759
11760         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11761         Binary.Operator.Division case.
11762
11763 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11764
11765         * class.cs (DefineType): Ensure that we do a proper check on
11766         attribute types and also register it with the TypeManager.
11767
11768         (TypeContainer.Targets): The default for attribute types is
11769         AttributeTargets.All.
11770
11771         * attribute.cs (ApplyAttributes): Registering the attribute type
11772         is done elsewhere, not when we discover we have a Usage attribute.
11773
11774 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11775
11776         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11777         and get rid of is_delegate parameter.
11778
11779         * everywhere : update.
11780
11781 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11782
11783         * cs-parser.jay (compilation_unit): Revamp completely to use
11784         some new ideas that I got from Rhys' grammar to solve the problems
11785         with assembly level attributes.
11786
11787         (outer_declaration): New grammar production.
11788
11789         (attribute_sections): Add.
11790
11791         (opt_attributes): Base on attribute_sections
11792
11793         (namespace_declaration): Allow opt_attributes to tackle the case
11794         when we have assembly level attributes - we are clever in this
11795         regard now ;-)
11796
11797         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11798         attributes in the non-global context.
11799
11800         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11801         instead of SetGlobalAttributes.
11802
11803         * class.cs, rootcontext.cs : Ensure we define and generate 
11804         attribute types before anything else.
11805
11806         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11807         and flag the new error -20 for the case when the attribute type
11808         does not have valid targets specified. csc does not catch this.
11809
11810         * ../errors/errors.txt : update for error # -20
11811
11812 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11813
11814         * support.cs (InternalParameters.ParameterModifier): Do some null
11815         checking and return sane values.
11816
11817         * class.cs (Method.Define): If we are a PInvoke method, ensure
11818         that we are static and extern. Report error # 601
11819
11820         * ../errors/cs0601.cs : Add test case for the above error.
11821
11822 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11823
11824         * rootcontext.cs (attribute_types): We need to keep type of
11825         all attribute types separately and emit code for them first.
11826
11827         (RegisterAttribute) : Implement.
11828
11829         * class.cs (DefineType): Check if the current Type is a custom
11830         attribute type and register it accordingly.
11831
11832         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11833         adding the first attribute twice and rename to
11834
11835         (SetGlobalAttributes): this.
11836
11837         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11838         lookups.
11839
11840         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11841         if we are processing global arguments. Hmm, I am unsure of this.
11842
11843 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11844
11845         * expression.cs: added static array of strings to avoid calling
11846         Enum.ToString () for Operator in Binary. Significant recover of
11847         performance.
11848
11849 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11850
11851         * class.cs (FindMembers): Allow the Builders of the various
11852         members to be null.  If they are skip them.  This only happens
11853         during the PInvoke declaration.
11854
11855 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11856
11857         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11858         failure, so we do not keep going afterwards.
11859
11860         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11861         wanted to pass `false' as the `is_delegate' argument.  If this is
11862         the case, why not use delegate_type == null to mean `is_delegate =
11863         false' and anything else as is_delegate = true.
11864
11865 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11866
11867         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11868         code for the section, not the beginning of the tests.
11869
11870 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11871
11872         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11873
11874         * expression.cs (Binary): same.  Warn about errors where we have
11875         Enum/Enum in operator + as well.
11876
11877 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11878
11879         * statement.cs:
11880                 - added support for switch(bool)
11881                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11882                 - add TableSwitchEmit() to handle table-based switch statements
11883
11884 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11885
11886         * expression.cs (Invocation.OverloadResolve): Factor out code which
11887         does parameter compatibility checking with arguments so that we can 
11888         re-use the code even from Delegate.VerifyApplicability
11889
11890         (VerifyArgumentsCompat): Move above code here.
11891
11892         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11893         and instead make a call to the above method.
11894
11895 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11896
11897         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11898         We use it to keep track of classes which are attribute types.
11899
11900 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11901
11902         * delegate.cs (Delegate.Define): Correctly define the types in the
11903         presence of fixed and array parameters.
11904
11905         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11906         doing FindMembers.
11907
11908         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11909         include NonPublic after the first iteration.
11910
11911         * class.cs (Indexer.CheckBase): Only check if both parents are
11912         non-null. 
11913
11914         * cs-parser.jay (accessor_body): If empty, set to null.
11915
11916         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11917         same code path here to resolve constants names that we did have in
11918         MemberAccess.DoResolve.  There is too much code duplicated here.
11919
11920 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11921
11922         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11923
11924         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11925         to MakeUnionSet.
11926
11927         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11928         tokens, numbers and strings.
11929
11930         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11931         parenthesis.
11932
11933         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11934         asyncronous parameters and the regular parameters.  
11935
11936         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11937         specify the target directory.
11938
11939         * expression.cs: (This.DoResolve): Simplify
11940         (As.Emit): Optimize, do not generate IsInst if the expression is
11941         always of the given type.
11942
11943         (Is.DoResolve): Bug fix, we were reporting both always/never for
11944         the is expression.
11945
11946         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11947         creating too many unnecessary arrays.
11948
11949 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11950
11951         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11952         fields instead of rolling our own initializer.   Takes care of all
11953         implicit conversions, and drops unnecessary static checks/argument.
11954
11955 2002-03-31  Dick Porter  <dick@ximian.com>
11956
11957         * driver.cs: use the GetDirectories() return values properly, and
11958         use "/" as path separator.
11959
11960 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11961
11962         * expression.cs (Unary): Optimize - - expr into expr.
11963         (Binary): Optimize a + (-b) into a -b.
11964
11965         * codegen.cs (CodeGen): Made all methods static.
11966
11967 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11968
11969         * rootcontext.cs: 
11970
11971         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11972         TypeBuilder property.
11973
11974         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11975         instead. 
11976
11977         * tree.cs: Removed the various RecordXXXX, and replaced with a
11978         single RecordDecl.  Removed all the accessor methods, and just
11979         left a single access point Type 
11980
11981         * enum.cs: Rename DefineEnum to DefineType.
11982
11983         * decl.cs: New abstract method `DefineType' used to unify the
11984         Defines for Enumerations, Interfaces, TypeContainers and
11985         Delegates.
11986
11987         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11988         LookupBaseClasses method that used to live in class.cs and
11989         interface.cs here, and renamed to FindType.
11990
11991         * delegate.cs: Implement DefineType.  Take advantage of the
11992         refactored pattern for locating the parent builder without taking
11993         the parent_builder argument (which we know does not work if we are
11994         nested, and triggering a toplevel definition).
11995
11996 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11997
11998         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11999         accessibility of a member has changed during override and report
12000         an error if so.
12001
12002         * class.cs (Method.Define, Property.Define): Only complain on
12003         overrides if the method is private, any other accessibility is
12004         fine (and since we just checked the permission is the same, we are
12005         good to go).
12006
12007         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12008         and elif are processed always.  The other pre-processing
12009         directives are only processed if we are "taking" the path
12010
12011 2002-03-29  Martin Baulig  <martin@gnome.org>
12012
12013         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12014         current location is not Null.
12015
12016         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12017         a separate method so we can profile it.
12018
12019         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12020         `span.Seconds' are just seconds, but no minutes or hours.
12021         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12022
12023 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12024
12025         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12026         Remove the gratuitous set of Final:
12027
12028                                 // If an interface implementation, then we can set Final.
12029                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12030                                     implementing.DeclaringType.IsInterface)
12031                                         flags |= MethodAttributes.Final;
12032
12033         I do not know what I was smoking when I used that.
12034
12035
12036         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12037         step into fixing the name resolution issues for delegates and
12038         unifying the toplevel name resolution.
12039
12040 2002-03-28  Martin Baulig  <martin@gnome.org>
12041
12042         * class.cs (Method.Emit): If we have a symbol writer, call its
12043         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12044         tell it about the current method.
12045
12046         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12047         writer that we're going to emit the first byte of IL code for a new
12048         statement (a new source line).
12049         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12050         EmitContext.Mark() before emitting any code.
12051
12052         * location.cs (SymbolDocument): Return null when we're Null.
12053
12054         * statement.cs (Statement): Moved the `Location loc' variable here.
12055         (Statement.EmitBoolExpression): If we have a symbol writer, call
12056         ec.Mark() before emitting any code to tell it that we're at the
12057         beginning of a new statement.
12058         (StatementExpression): Added `Location' argument to the constructor.
12059         (Block): Added public readonly variable `StartLocation' and public
12060         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12061         (Block): Added constructor which takes a start and end location.
12062         (Block.SetEndLocation): New method. This sets the end location.
12063         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12064         local variables we create.
12065         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12066         each statement and do also mark the begin and end of the block.
12067
12068         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12069         tell it the current lexer.Location, use Location.Null for the end of the
12070         block.
12071         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12072         current block, set its end location using SetEndLocation().
12073         (statement_expression): StatementExpression constructor now takes the
12074         lexer.Location as additional argument.
12075         (for_statement, declare_local_variables): Likewise.
12076         (declare_local_variables): When creating a new implicit block, use the
12077         new Block constructor and pass it the lexer.Location.
12078
12079 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12080
12081         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12082         members also on the parent interfaces recursively.
12083
12084 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12085
12086         * report.cs: Use new formats, since Gonzalo finished the missing
12087         bits. 
12088
12089         * expression.cs (Binary.ResolveOperator): added missing operator|
12090         operator& and operator^ for bool/bool.
12091
12092         * cs-parser.jay: CheckDef now takes a Location argument that is
12093         used to report errors more precisly (instead of reporting the end
12094         of a definition, we try to track something which is a lot closer
12095         to the source of the problem).
12096
12097         * cs-tokenizer.cs: Track global token use, so we can properly flag
12098         the use of #define/#undef after the first token has been seen.
12099
12100         Also, rename the reportXXXX to Error_DescriptiveName
12101
12102         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12103         TypeContainer, so that Enum and Interface can use this too.
12104
12105         * class.cs (TypeContainer.LookupInterfaceOrClass,
12106         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12107         `builder' argument.  Typically this was used to pass the parent
12108         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12109         the definition).  
12110
12111         The problem is that a nested class could trigger the definition of
12112         a toplevel class, and the builder would be obviously wrong in that
12113         case. 
12114
12115         So we drop this argument, and we compute dynamically the
12116         TypeBuilder/ModuleBuilder (the correct information was available
12117         to us anyways from DeclSpace.Parent)
12118
12119         * interface.cs (Interface.DefineInterface): Drop builder
12120         parameter cleanup like class.cs
12121
12122         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12123         like class.cs
12124
12125         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12126         values. 
12127
12128         (Try.Emit): Propagate the returns value from the statement.
12129
12130         (Return.Emit): Even if we are leavning 
12131
12132         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12133
12134         * modifiers.cs: Fix the computation of MethodAttributes flags.
12135
12136 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12137
12138         * driver.cs: allow compilation of files that start with '/'.
12139         Add a default case when checking the argument of --target.
12140
12141 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12142
12143         * interface.cs: Implement the same search algorithm for types in
12144         the interface code.
12145
12146         * delegate.cs: Do not allow multiple definition.
12147
12148         * Recovered ChangeLog that got accidentally amputated
12149
12150         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12151
12152         * rootcontext.cs: Load manually enum to allow core classes to
12153         contain enumerations.
12154
12155         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12156         Update to new static methods in TypeManager.
12157
12158         * typemanager.cs (GetMethod, GetConstructor): Use our
12159         implementation of FindMembers to find the members, since during
12160         corlib compilation, the types are TypeBuilders and GetMethod and
12161         GetConstructor do not work.
12162
12163         Make all methods in TypeManager static.
12164
12165         (InitCodeHelpers): Split the functionality from
12166         the InitCodeTypes function.
12167
12168         * driver.cs: Call InitCodeHelpers after we have populated the
12169         types. 
12170
12171         * cs-parser.jay (delegate_declaration): we did not used to compute
12172         the delegate name correctly for void delegates.
12173
12174 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12175
12176         * rootcontext.cs (RootContext): Init the interface_resolve_order
12177         and type_container_resolve_order always.
12178
12179         (ResolveCore, BootstrapCorlib_ResolveClass,
12180         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12181         compiler when compiling with --nostdlib
12182
12183         * class.cs (TypeContainer.DefineType): Check that our parent is
12184         not null.  This test is most important when we are bootstraping
12185         the core types.
12186
12187         * codegen.cs: Split out the symbol writing code.
12188
12189 2002-03-25  Martin Baulig  <martin@gnome.org>
12190
12191         * driver.cs (-g): Made -g an alias for --debug.
12192
12193 2002-03-24  Martin Baulig  <martin@gnome.org>
12194
12195         * codegen.cs (SymbolWriter): New public variable. Returns the
12196         current symbol writer.
12197         (CodeGen): Added `bool want_debugging_support' argument to the
12198          constructor. If true, tell the ModuleBuild that we want debugging
12199         support and ask it for the ISymbolWriter.
12200         (Save): If we have a symbol writer, call it's Close() method after
12201         saving the assembly.
12202
12203         * driver.c (--debug): New command line argument to create a
12204         debugger information file.
12205
12206         * location.cs (SymbolDocument): New public property. Returns an
12207         ISymbolDocumentWriter object for the current source file or null
12208         if we don't have a symbol writer.
12209
12210 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12211
12212         * driver.cs (LoadAssembly): Correctly return when all the paths
12213         have been tried and not before.
12214
12215         * statement.cs (Switch.Emit): return the actual coverage for this
12216         statement (returns/not-returns)
12217
12218         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12219         switch of the statement if we are the last switch section.  That
12220         kills two problems: try/catch problems (we used to emit an empty
12221         nop at the end) and switch statements where all branches would
12222         return. 
12223
12224 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12225
12226         * driver.cs: Add default assemblies (the equivalent to the
12227         Microsoft CSC.RSP file)
12228
12229         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12230         also update tokens_seen and set it to false.
12231
12232         * driver.cs: Implement --recurse for Mike.
12233
12234         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12235         correctly splitting out the paths.
12236
12237 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12238
12239         * interface.cs (Interface.PopulateProperty): Instead of using
12240         `parent' as the declaration space for the set parameters, use
12241         `this' 
12242
12243         * support.cs (InternalParameters): InternalParameters constructor
12244         takes a DeclSpace instead of a TypeContainer.
12245
12246         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12247         types are being initialized, load the address of it before calling
12248         the function.  
12249
12250         (New): Provide a mechanism to disable the generation of local
12251         value type temporaries when the caller will be providing us with
12252         an address to store it.
12253
12254         (ArrayCreation.EmitDynamicInitializers): Use it.
12255
12256 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12257
12258         * expression.cs (Invocation.EmitArguments): Only probe for array
12259         property if there is more than one argument.  Sorry about that.
12260
12261         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12262         empty param arrays.
12263
12264         * class.cs (Method.LabelParameters): Fix incorrect code path that
12265         prevented the `ParamArrayAttribute' from being applied to the
12266         params attribute.
12267
12268 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12269
12270         * support.cs (ReflectionParameters): Correctly compute whether the
12271         last argument is a params array.  Fixes the problem with
12272         string.Split ('a')
12273
12274         * typemanager.cs: Make the assemblies array always be non-null
12275         (empty, but non-null)
12276
12277         * tree.cs (RecordDecl): New function that abstracts the recording
12278         of names.  This reports error 101, and provides a pointer to the
12279         previous declaration.  Fixes a crash in the compiler.
12280
12281         * cs-parser.jay (constructor_declaration): Update to new grammar,
12282         and provide a constructor_body that can be empty.
12283
12284 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12285
12286         * driver.cs: Add support for --resources.
12287
12288         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12289         Make all types for the various array helper methods be integer.
12290
12291         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12292         CheckState to ConvCast.
12293
12294         (ConvCast): Now it takes a `checked' state argument, to avoid
12295         depending on the emit context for the conversion, and just using
12296         the resolve time setting.
12297
12298         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12299         instead of Invocation.EmitArguments.  We do not emit the original
12300         arguments, instead we emit those which have been converted to
12301         unsigned int expressions.
12302
12303         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12304
12305         * codegen.cs: ditto.
12306
12307         * expression.cs (LocalVariableReference): Drop the use of the
12308         Store function that depended on the variable index.
12309
12310         * statement.cs (VariableInfo): Drop the `Idx' property from this
12311         class, as this is not taking into account the indexes for
12312         temporaries tat we generate during the execution, getting the
12313         indexes wrong.
12314
12315         * class.cs: First emit class initializers, then call the parent
12316         constructor. 
12317
12318         * expression.cs (Binary): Fix opcode emision.
12319         (UnaryMutator.EmitCode): Support checked code generation
12320
12321         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12322         matches for events for both the Static and Instance scans,
12323         pointing to the same element.   Fix that.
12324
12325 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12326
12327         * rootcontext.cs (ResolveTree): Always set the
12328         interface_resolve_order, because nested interfaces will be calling
12329         into us.
12330
12331         * class.cs (GetInterfaceOrClass): Track the same resolution
12332         process used by TypeManager.LookupType.  This fixes the nested
12333         type lookups in class declarations (separate path from
12334         LookupType). 
12335
12336         (TypeContainer.DefineType): Also define nested interfaces.
12337         (TypeContainer.RegisterOrder): New public function used to
12338         register the order in which child interfaces need to be closed.
12339
12340         Nested interfaces need to be closed after their parents have been
12341         created. 
12342
12343         * interface.cs (InterfaceAttr): Put all the logic for computing
12344         the interface attribute here. 
12345
12346         (DefineInterface): Register our interface order with the
12347         RootContext or with the TypeContainer depending on the case.
12348
12349 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12350
12351         * cs-parser.jay: rework foreach statement to work with the new
12352         changes to the policy on SimpleNames.
12353
12354         * report.cs: support Stacktrace on warnings as well.
12355
12356         * makefile: drop --unsafe and /unsafe from the compile.
12357
12358 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12359
12360         * ecore.cs (StandardConversionExists): Modify to take an Expression
12361         as the first parameter. Ensure we do null -> reference type conversion
12362         checking.
12363
12364         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12365         temporary Expression objects.
12366
12367 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12368
12369         * interface.cs: workaround bug in method overloading resolution
12370         (there is already a bugzilla bug for it).
12371
12372 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12373
12374         We could also solve this problem by having a separate path for
12375         performing type lookups, instead of DoResolve, we could have a
12376         ResolveType entry point, and only participating pieces of the
12377         production (simplename, deref, array) would implement this. 
12378
12379         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12380         signal SimpleName to only resolve type names and not attempt to
12381         resolve anything else.
12382
12383         * expression.cs (Cast): Set the flag.
12384
12385         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12386
12387         * class.cs: Only report 108 if there is no `new' modifier.
12388
12389         * cs-parser.jay: rework foreach statement to work with the new
12390         changes to the policy on SimpleNames.
12391
12392         * report.cs: support Stacktrace on warnings as well.
12393
12394         * makefile: drop --unsafe and /unsafe from the compile.
12395
12396 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12397
12398         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12399         lookups here, instead of doing that at parse time.  This means
12400         that our grammar will not introduce `LocalVariableReferences' as
12401         expressions at this point.  That solves the problem of code like
12402         this:
12403
12404         class X {
12405            static void Main ()
12406            { int X = 1;
12407             { X x = null }}}
12408
12409         This is only half the fix.  The full fix requires parameters to
12410         also be handled in this way.
12411
12412         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12413         makes the use more obvious of the DeclSpace.  The
12414         ec.TypeContainer.TypeBuilder is now only used to pull the
12415         TypeBuilder for it.
12416
12417         My theory is that I can get rid of the TypeBuilder completely from
12418         the EmitContext, and have typecasts where it is used (from
12419         DeclSpace to where it matters).  
12420
12421         The only pending problem is that the code that implements Aliases
12422         is on TypeContainer, and probably should go in DeclSpace.
12423
12424         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12425         lookups here, instead of doing that at parse time.  This means
12426         that our grammar will not introduce `LocalVariableReferences' as
12427         expressions at this point.  That solves the problem of code like
12428         this:
12429
12430         class X {
12431            static void Main ()
12432            { int X = 1;
12433             { X x = null }}}
12434
12435         This is only half the fix.  The full fix requires parameters to
12436         also be handled in this way.
12437
12438         * class.cs (Property.DefineMethod): When implementing an interface
12439         method, set newslot, when implementing an abstract method, do not
12440         set the flag (before we tried never setting it, or always setting
12441         it, which is the difference).
12442         (Indexer.DefineMethod): same.
12443         (Method.DefineMethod): same.
12444
12445         * ecore.cs: Only set the status used flag if we get back a Field.
12446
12447         * attribute.cs: Temporary hack, so Paolo can keep working.
12448
12449 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12450
12451         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12452         the unmanaged type in the case we have a MarshalAs attribute.
12453
12454         (Resolve): Handle the case when we are parsing the special MarshalAs
12455         attribute [we need to store the unmanaged type to use later]
12456
12457         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12458         MarshalAs Attribute.
12459
12460         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12461         on parameters and accordingly set the marshalling info.
12462
12463 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12464
12465         * class.cs: Optimizing slightly by removing redundant code after
12466         we switched to the `NoTypes' return value.
12467         (Property.DefineMethod): use NoTypes here too.
12468
12469         This fixes the bug I introduced in my last batch of changes.
12470
12471 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12472
12473         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12474
12475         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12476         Enums since those are types too. 
12477
12478         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12479
12480         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12481         thanks to a call during the lookup process.
12482
12483 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12484
12485         * statement.cs (Foreach): Lots of work to accomodate a particular
12486         kind of foreach statement that I had not kept in mind.  It is
12487         possible to have foreachs on classes that provide a GetEnumerator
12488         method that return objects that implement the "pattern" for using
12489         a foreach, there is no need to support GetEnumerator
12490         specifically. 
12491
12492         This is needed to compile nant.
12493
12494         * decl.cs: Only report 114 if the member is not `Finalize' and if
12495         the warning level is at least 2.
12496
12497         * class.cs: Moved the compare function from Method to
12498         MethodSignature. 
12499
12500         (MethodSignature.InheritableMemberSignatureCompare): Add new
12501         filter function that is used to extract inheritable methods from a
12502         class. 
12503
12504         (Method.Define): Use the new `inheritable_method_signature_filter'
12505         delegate
12506
12507         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12508         command. 
12509
12510 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12511
12512         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12513
12514         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12515
12516         * expression.cs: Pass location information to
12517         ConvertImplicitStandard. 
12518
12519         * class.cs: Added debugging code to track return values from
12520         interfaces. 
12521
12522 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12523
12524         * expression.cs (Is.DoResolve): If either side of the `is' is an
12525         interface, do not flag the warning.
12526
12527         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12528         for interfaces
12529
12530         * report.cs: Allow for --fatal to be used with --probe.
12531
12532         * typemanager.cs (NoTypes): Move the definition for the empty Type
12533         array here. 
12534
12535         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12536         properties. 
12537         (TypeContainer.DefineProxy): New function used to proxy to parent
12538         implementations when implementing interfaces.
12539         (TypeContainer.ParentImplements): used to lookup if our parent
12540         implements a public function that is required by an interface.
12541         (TypeContainer.VerifyPendingMethods): Hook this up.
12542
12543         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12544         `modules' and `assemblies' arraylists into arrays.  We only grow
12545         these are the very early start up of the program, so this improves
12546         the speedof LookupType (nicely measured).
12547
12548         * expression.cs (MakeByteBlob): Replaced unsafe code with
12549         BitConverter, as suggested by Paolo.
12550
12551         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12552         folding of string concatenation, but if either side is a string,
12553         and the other is not, then return null, and let the runtime use
12554         the concatenation on the string plus the object (using
12555         `Object.ToString'). 
12556
12557 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12558
12559         Constant Folding has been implemented now.
12560
12561         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12562         the error instead on types that are not supported in one's
12563         complement. 
12564
12565         * constant.cs (Constant and all children): New set of functions to
12566         perform implict and explicit conversions.
12567
12568         * ecore.cs (EnumConstant): Implement the new functions to perform
12569         conversion by proxying to the child expression.
12570
12571         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12572         own separate setting that can not be turned off from the command
12573         line using --unchecked or --checked and is only controlled using
12574         the checked/unchecked statements and expressions.  This setting is
12575         used by the constant folder to flag errors.
12576
12577         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12578         ConstantCheckState as well.   
12579
12580         During Resolve, they also have to flag the state, because the
12581         constant folder runs completely in the Resolve phase.
12582
12583         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12584         well.
12585
12586 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12587
12588         * cfold.cs: New file, this file contains the constant folder.
12589
12590         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12591         argument to track whether we are using the resulting address to
12592         load or store a value and provide better error messages. 
12593
12594         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12595         new AddressOf arguments.
12596
12597         * statement.cs (Foreach.EmitCollectionForeach): Update
12598
12599         * expression.cs (Argument.Emit): Call AddressOf with proper
12600         arguments to track usage.
12601
12602         (New.DoEmit): Call AddressOf with new arguments.
12603
12604         (Unary.Emit): Adjust AddressOf call.
12605
12606 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12607
12608         * cs-parser.jay (member_access): Change the case for pre-defined types
12609         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12610         this suggestion.
12611
12612         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12613         a method body.
12614
12615         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12616         essentially like methods and apply attributes like MethodImplOptions to them too.
12617
12618         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12619         not being null.
12620
12621         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12622         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12623         is the DeclSpace.
12624
12625         * Update code everywhere accordingly.
12626
12627         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12628
12629         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12630
12631 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12632
12633         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12634         try performing lookups against those instead of jumping straight into using
12635         the 'using' clauses.
12636
12637         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12638
12639         (LookupType): Perform lookups in implicit parents too.
12640
12641         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12642         sequence as RootContext.LookupType. 
12643
12644         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12645         the various cases of namespace lookups into this method.
12646
12647 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12648
12649         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12650         in positional arguments)
12651
12652         * class.cs (Operator): Update the AllowedModifiers to contain
12653         extern. 
12654
12655         * cs-parser.jay: Update operator declaration to allow for the
12656         operator body to be empty.
12657
12658         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12659         values. 
12660
12661 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12662
12663         * class.cs (Method.Emit): Label parameters.
12664
12665         * driver.cs: Return 1 or 0 as the program exit code.
12666
12667 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12668
12669         * expression.cs: Special case the `null' object when trying to
12670         auto-compute the type, as anything can be explicitly converted to
12671         that. 
12672
12673         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12674         spotting this Paolo.
12675
12676         (Expression.ImplicitNumericConversion): Perform comparissions of
12677         the type using the underlying type in the case of an enumeration
12678         rather than using the enumeration type for the compare.
12679
12680         Cope with the underlying == type case, which is not possible to
12681         catch before. 
12682
12683         (Expression.ConvertNumericExplicit): Perform comparissions of
12684         the type using the underlying type in the case of an enumeration
12685         rather than using the enumeration type for the compare.
12686
12687         * driver.cs: If the user does not supply an extension, assume .exe
12688
12689         * cs-parser.jay (if_statement): Rewrote so that we can track the
12690         location for the if statement.
12691
12692         * expression.cs (Binary.ConstantFold): Only concat strings when
12693         the operation is "+", not everything ;-)
12694
12695         * statement.cs (Statement.EmitBoolExpression): Take a location
12696         argument. 
12697         (If, While, Do): Track location.
12698
12699         * expression.cs (Binary.ResolveOperator): In the object + string
12700         case, I was missing a call to ConvertImplicit
12701
12702 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12703
12704         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12705         Location arguments. Ensure we use RootContext.LookupType to do our work
12706         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12707
12708         * interface.cs (PopulateMethod): Handle the type of the parameter being
12709         null gracefully.
12710
12711         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12712         have a params method with no fixed arguments and a call is made with no
12713         arguments.
12714
12715 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12716
12717         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12718         the verbatim-string-literal
12719
12720         * support.cs (InternalParameters.ParameterModifier): handle null
12721         fixed parameters.
12722         (InternalParameters.ParameterType): ditto.
12723
12724         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12725         duplicating the name of the variable parameter.
12726         (GetParameterByName): Fix bug where we were not looking up array
12727         paramters if they were the only present (thanks Paolo!).
12728         (GetParameterInfo): We only have an empty set of types if both
12729         fixed and array are set to null.
12730         (GetParameterInfo-idx): Handle FixedParameter == null
12731
12732         * cs-parser.jay: Handle the case where there is no catch
12733         statements (missing null test).
12734
12735 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12736
12737         * driver.cs (MainDriver): Be conservative on our command line
12738         handling.
12739
12740         Catch DirectoryNotFoundException when calling GetFiles.
12741
12742         (SplitPathAndPattern): Used to split the input specification into
12743         a path and a pattern that we can feed to Directory.GetFiles.
12744
12745 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12746
12747         * statement.cs (Fixed): Implement the last case of the Fixed
12748         statement (string handling).
12749
12750         * expression.cs (StringPtr): New class used to return a char * to
12751         a string;  Used by the Fixed statement.
12752
12753         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12754
12755         * expression.cs (Binary.ResolveOperator): Remove redundant
12756         MemberLookup pn parent type.
12757         Optimize union call, we do not need a union if the types are the same.
12758         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12759         type.
12760
12761         Specialize the use of MemberLookup everywhere, instead of using
12762         the default settings. 
12763
12764         (StackAlloc): Implement stackalloc keyword.
12765
12766         * cs-parser.jay: Add rule to parse stackalloc.
12767
12768         * driver.cs: Handle /h, /help, /?
12769
12770         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12771         before we supported unsafe code.
12772
12773         * makefile: add --unsafe to the self compilation of mcs.
12774
12775 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12776
12777         * expression.cs (PointerArithmetic): New class that is used to
12778         perform pointer arithmetic.
12779         (Binary.Resolve): Handle pointer arithmetic
12780         Handle pointer comparission.
12781         (ArrayPtr): Utility expression class that is used to take the
12782         address of an array.
12783
12784         (ElementAccess): Implement array access for pointers
12785
12786         * statement.cs (Fixed): Implement fixed statement for arrays, we
12787         are missing one more case before we are done.
12788
12789         * expression.cs (Indirection): Implement EmitAssign and set the
12790         ExprClass to Variable.  This allows pointer dereferences to be
12791         treated as variables, and to have values assigned to them.
12792
12793         * ecore.cs (Expression.StoreFromPtr): New utility function to
12794         store values dereferencing.
12795
12796 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12797
12798         * expression.cs (Binary.ResolveOperator): Ensure that we are
12799         not trying to operate on a void type - this fixes the reported
12800         bug.
12801
12802         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12803         the parent implementation is sealed.
12804
12805         * ../errors/cs0239.cs : Add.
12806
12807         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12808
12809         * typemanager.cs (unverifiable_code_type): Corresponds to 
12810         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12811         which have unsafe code in them.
12812
12813         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12814         unsafe context.
12815
12816 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12817
12818         * cs-tokenizer.cs: Add support for @"litreal strings"
12819
12820         Make tokenizer accept pre-processor directives
12821         on any column (remove the old C-like limitation). 
12822
12823         * rootcontext.cs (EmitCode): Emit any global attributes.
12824         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12825
12826         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12827
12828         * cs-parser.jay: Add support for global attributes.  
12829
12830 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12831
12832         * expression.cs (Indirection): New helper class.  Unary will
12833         create Indirection classes to be able to implement the
12834         IMemoryLocation interface on it.
12835
12836 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12837
12838         * cs-parser.jay (fixed_statement): reference the right statement.
12839
12840         * statement.cs (Fixed.Emit): Finish implementing the fixed
12841         statement for the &x case.
12842
12843 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12844
12845         * class.cs (Property.Define, Method.Define): Remove newslot when
12846         `implementing'.  
12847
12848         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12849         wrong.  NewSlot should only be used if the `new' keyword is present.
12850
12851         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12852         locating our system dir.  Sorry about this.
12853
12854 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12855
12856         * driver.cs (GetSystemDir): Compute correctly the location of our
12857         system assemblies.  I was using the compiler directory instead of
12858         the library directory.
12859
12860 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12861
12862         * expression.cs (BetterFunction): Put back in what Miguel commented out
12863         since it is the correct fix. The problem is elsewhere ;-)
12864
12865         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12866         parameters of the parms method are themselves compatible or not !
12867
12868         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12869         to check that a class implements an interface before saying that an implicit
12870         conversion was allowed. Use ImplementsInterface to do the checking.
12871
12872 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12873
12874         * class.cs (Method.Define): Track whether we are an explicit
12875         implementation or not.  And only call DefineMethodOverride if we
12876         are an explicit implementation.
12877
12878         (Property.DefineMethod): Ditto.
12879
12880 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12881
12882         * expression.cs (BetterFunction): Catch hideous bug which was
12883          preventing us from detecting ambiguous calls due to implicit casts i.e
12884         cs0121.
12885
12886 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12887
12888         * support.cs (Pair): Remove un-needed method.  I figured why I was
12889         getting the error in cs-parser.jay, the variable in a foreach loop
12890         is readonly, and the compiler does not really treat this as a variable.
12891
12892         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12893         instead of EQUALS in grammar.  
12894
12895         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12896
12897         * expression.cs (Unary.DoResolve): Check whether the argument is
12898         managed or not.
12899
12900 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12901
12902         * support.cs: Api for Pair to set a value.  Despite the fact that
12903         the variables are public the MS C# compiler refuses to compile
12904         code that accesses the field if the variable is part of a foreach
12905         statement. 
12906
12907         * statement.cs (Fixed): Begin implementation of the fixed
12908         statement.
12909
12910         (Block.AddVariable): Return the VariableInfo on success and null
12911         on failure instead of true/false. 
12912
12913         * cs-parser.jay (foreach): Catch errors on variables already
12914         defined (we were ignoring this value before) and properly unwind
12915         the block hierarchy
12916
12917         (fixed_statement): grammar for the fixed statement.
12918
12919 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12920
12921         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12922         pointer types to be incretemented.
12923
12924         (SizeOf): Implement.
12925
12926         * cs-parser.jay (pointer_member_access): Implement
12927         expr->IDENTIFIER production.
12928
12929         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12930         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12931         on safe contexts.
12932
12933         (Unary): Implement indirection.
12934
12935         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12936         use in non-unsafe context).
12937
12938         (SimpleName.DoResolve): Check for pointers in field access on safe
12939         contexts. 
12940
12941         (Expression.LoadFromPtr): Factor the load-indirect code in this
12942         function.  This was duplicated in UnboxCast and ParameterReference
12943
12944 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12945
12946         * expression.cs (ComposedCast): report an error if a pointer cast
12947         is used in a safe region.
12948
12949         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12950         pointer type casts in unsafe context.
12951
12952         * codegen.cs (EmitContext): Set up IsUnsafe.
12953
12954         * cs-parser.jay (non_expression_type): Add productions for pointer
12955         casts. 
12956
12957         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12958         code.  We should not use force into static mode if the method is
12959         not virtual.  Fixes bug in MIS
12960
12961         * statement.cs (Do.Emit, While.Emit, For.Emit,
12962         Statement.EmitBoolExpression): Add support to Do and While to
12963         propagate infinite loop as `I do return' semantics.
12964
12965         Improve the For case to also test for boolean constants.
12966
12967         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12968         to the list of attributes we can add.
12969
12970         Remove `EmitContext' argument.
12971
12972         * class.cs (Method.Define): Apply parameter attributes.
12973         (Constructor.Define): Apply parameter attributes.
12974         (MethodCore.LabelParameters): Move here the core of labeling
12975         parameters. 
12976
12977         * support.cs (ReflectionParameters.ParameterModifier,
12978         InternalParameters.ParameterModifier): Use IsByRef on the type and
12979         only return the OUT bit for these parameters instead of in/out/ref
12980         flags.
12981
12982         This is because I miss-understood things.  The ParameterInfo.IsIn
12983         and IsOut represent whether the parameter has the [In] and [Out]
12984         attributes set.  
12985
12986 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12987
12988         * ecore.cs (FieldExpr.Emit): Release temporaries.
12989
12990         * assign.cs (LocalTemporary.Release): new function.
12991
12992         * codegen.cs (EmitContext.GetTemporaryStorage,
12993         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12994         temporary storage.  Now we can "put back" localbuilders when we
12995         are done with them
12996
12997 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12998
12999         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13000         need to make a copy of the variable to generate verifiable code.
13001
13002 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13003
13004         * driver.cs: Compute dynamically the system directory.
13005
13006         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13007         Slower, but more generally useful.  Used by the abstract
13008         registering implementation. 
13009
13010         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13011         the rules for the special rule on Type/instances.  First check if
13012         we have the same name, and if so, try that special static path
13013         rather than the instance path.
13014
13015 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13016
13017         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13018         for, while and if.
13019
13020         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13021         Enum, ValueType, Delegate or Array for non-corlib compiles.
13022
13023         * cs-tokenizer.cs: Catch long identifiers (645)
13024
13025         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13026         piece of code.
13027
13028         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13029         fix, we were returning too early, so we were not registering
13030         pending methods from abstract classes.
13031
13032         Do not register pending methods if the class is abstract.
13033
13034         * expression.cs (Conditional.DoResolve): Report circular implicit
13035         conversions when we neecd to compute it for conditional
13036         expressions. 
13037
13038         (Is.DoResolve): If the expression is always of the provided type,
13039         flag warning 183.  If the expression can not ever be of the
13040         provided type flag warning 184.
13041
13042         * class.cs: Catch 169 as well.
13043
13044         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13045         read. 
13046
13047 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13048
13049         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13050
13051 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13052
13053         * interface.cs: (PopulateMethod): Check for pointers being defined
13054         only if the unsafe context is active.
13055         (PopulateProperty): ditto.
13056         (PopulateIndexer): ditto.
13057
13058         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13059         specified.  If pointers are present, make sure that they are
13060         present in an unsafe context.
13061         (Constructor, Constructor.Define): ditto.
13062         (Field, Field.Define): ditto.
13063         (Property, Property.Define): ditto.
13064         (Event, Event.Define): ditto.
13065
13066         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13067         hashtable if there are classes or structs defined.
13068
13069         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13070         code, as the constant resolution moved.
13071
13072         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13073         the metadata, so we can flag error 133. 
13074
13075         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13076         pointer is being declared in an unsafe context.
13077
13078 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13079
13080         * modifiers.cs (Modifiers.Check): Require a Location argument.
13081         Report error 227 for Unsafe use.
13082
13083         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13084
13085         * statement.cs (For.Emit): If the test is null, then report that
13086         we do `return', as we wont reach anything afterwards.
13087
13088         (Switch.SwitchGoverningType): Track the expression that matched
13089         the conversion.
13090
13091         * driver.cs: Allow negative numbers as an error code to flag.
13092
13093         * cs-parser.jay: Handle 1551.
13094
13095         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13096
13097 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13098
13099         * cs-parser.jay: Report 1518 (type declaration can only contain
13100         class, struct, interface, enum or delegate)
13101
13102         (switch_label): Report 1523 (keywords `case' or `default' must
13103         preced code)
13104
13105         (opt_switch_sections): Report 1522 (empty switch)
13106
13107         * driver.cs: Report 1515 (response file specified multiple times)
13108         Report 1516 (Source file specified multiple times).
13109
13110         * expression.cs (Argument.Resolve): Signal 1510
13111
13112         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13113         access not allowed in static code)
13114
13115 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13116
13117         * typemanager.cs (IsPointerType): Utility method which we are going
13118         to need a lot.
13119
13120         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13121         the object type, so we take care of that.
13122
13123         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13124
13125         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13126         added to non-params parameters :-)
13127
13128         * typemanager.cs (CSharpName): Include 'void' type too. 
13129
13130         (void_ptr_type): Include in the set of core types.
13131
13132         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13133         duplicating code.
13134
13135         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13136         an unsafe context.
13137
13138         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13139         completely forgotten about it.
13140
13141 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13142
13143         * cs-parser.jay (pointer_type): Add. This begins our implementation
13144         of parsing rules for unsafe code.
13145
13146         (unsafe_statement): Implement.
13147
13148         (embedded_statement): Modify to include the above.
13149
13150         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13151
13152         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13153         if the current context is an unsafe one.
13154
13155         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13156         are handled differently, we need separate rules for them.
13157
13158         (local_variable_declaration): Update to use local_variable_pointer_type
13159         to allow variable declarations of unmanaged pointer types.
13160
13161         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13162         in unsafe contexts.
13163
13164         * ../errors/cs0214.cs : Add.
13165
13166 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13167
13168         * makefile: remove 'response' file when cleaning.
13169
13170 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13171
13172         * cs-parser.jay: Report 1524.
13173
13174 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13175
13176         * typemanager.cs (RegisterMethod): drop checking if we have
13177         registered this from here
13178
13179 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13180
13181         * class.cs (Method.EmitDestructor): Implement calling our base
13182         destructor. 
13183
13184         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13185         value of InFinally.
13186
13187         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13188         this routine and will wrap the call in a try/catch block.  Deal
13189         with the case.
13190
13191 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13192
13193         * ecore.cs (Expression.MemberLookup): instead of taking a
13194         parameter `same_type' that was used to tell whether we could
13195         access private members we compute our containing type from the
13196         EmitContext.
13197
13198         (FieldExpr): Added partial support for volatile fields.  This does
13199         not work for volatile fields exposed from assemblies, as I can not
13200         figure out how to extract the modreq from it.
13201
13202         Updated all the source files to use this.
13203
13204         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13205         because it is referenced by MemberLookup very often. 
13206
13207 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13208
13209         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13210         TypeBuilder.GetCustomAttributes to retrieve what we need.
13211
13212         Get rid of redundant default_member_attr_type as this is the same as
13213         default_member_type which already exists.
13214
13215         * interface.cs, attribute.cs : Update accordingly.
13216
13217 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13218
13219         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13220         work for TYpeBuilders though.  Ravi, can you please fix this?
13221
13222         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13223
13224         * expression.cs (Argument.Emit): Handle the case of ref objects
13225         being passed to ref functions;  
13226
13227         (ParameterReference.EmitLoad): Loads the content of the pointer
13228         without dereferencing.
13229
13230 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13231
13232         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13233
13234 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13235
13236         * class.cs (Indexer.DefineMethod): Incorporate the interface
13237         type in the name of the method if we are doing explicit interface
13238         implementation.
13239
13240         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13241
13242         (BetterConversion): Fix extremely trivial bug where we were referring to
13243         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13244         again !
13245
13246         * ../errors/bug16.cs : Add although we have fixed it.
13247
13248 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13249
13250         * expression.cs (BaseIndexer): Begin implementation.
13251
13252         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13253
13254         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13255         production directly to remove a shift/reduce, and implement
13256         explicit interface implementation.
13257
13258         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13259         after a floating point suffix.
13260
13261         * expression.cs (DoNumericPromotions): Improved the conversion for
13262         uint/uint.  If we have a constant, we avoid doing a typecast to a
13263         larger type.
13264
13265         * class.cs (Indexer): Implement explicit interface implementation
13266         for indexers.
13267
13268 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13269
13270         * class.cs: make the default instance constructor public and hidebysig.
13271
13272 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13273
13274         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13275         so we can call it from elsewhere.
13276
13277         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13278         we emit it internally if the class has a defined indexer; otherwise the user
13279         emits it by decorating the class definition with the DefaultMemberAttribute.
13280
13281         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13282         attribute is not used on a type which defines an indexer.
13283
13284         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13285         character when we skip whitespace.
13286
13287         * ../errors/cs0646.cs : Add.
13288
13289 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13290
13291         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13292         again. 
13293
13294         * makefile: Add practical target `mcs3.exe' which builds the third
13295         generation compiler. 
13296
13297         * expression.cs (New): Fix structures constructor calling.
13298
13299         * class.cs (Property, Method, Indexer): Emit Final flag on the
13300         method if we are an interface implementation and we are not
13301         abstract. 
13302
13303         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13304         whether this property is referencing a `base' method.
13305
13306         * expression.cs (Invocation.EmitCall): take an extra argument:
13307         is_base, this is used to determine whether the `call' or
13308         `callvirt' opcode should be used.
13309
13310
13311         * delegate.cs: update EmitCall.
13312
13313         * class.cs (Method.Define): Set NewSlot for the cases where we are
13314         not implementing an interface method.
13315
13316         (Property.Define): ditto.
13317
13318 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13319
13320         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13321         'r'.  Allows mcs to parse itself fully.
13322
13323 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13324
13325         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13326         of the number of initializers that require the InitializeArray method.
13327
13328         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13329         update the above field where necessary.
13330
13331         (MakeByteBlob): Update accordingly.
13332
13333         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13334         greater than 2.
13335
13336         (EmitDynamicInitializers): Update in accordance with the new optimization.
13337
13338         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13339         same OpCode applies.
13340
13341         * cs-parser.jay : Fix some glaring errors I introduced.
13342
13343 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13344
13345         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13346         so that we can check for name clashes there too.
13347
13348         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13349         for interface indexers.
13350
13351         * interfaces.cs (Define): Emit the default member attribute.
13352
13353         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13354         variable was being referred to while setting the value ;-)
13355
13356 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13357
13358         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13359         byte-by-byte information when we know the data is zero.
13360
13361         Make the block always a multiple of 4, because
13362         DefineInitializedData has a bug.
13363
13364         * assign.cs: Fix, we should assign from the temporary, not from
13365         the source. 
13366
13367         * expression.cs (MakeByteBlob): Fix my incorrect code.
13368
13369 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13370
13371         * typemanager.cs (EnumToUnderlying): This function is used to get
13372         the underlying type from an enumeration, because it does not
13373         always work. 
13374
13375         * constant.cs: Use the I4_S form for values between -128 and 127.
13376
13377         * statement.cs (Block.LookupLabel): Looks up a label.
13378         (Block): Drop support for labeled blocks.
13379
13380         (LabeledStatement): New kind of statement that represents a label
13381         only.
13382
13383         (Goto): Finally implement this bad boy.
13384
13385         * cs-parser.jay: Update to reflect new mechanism to implement
13386         labels.
13387
13388 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13389
13390         * codegen.cs (EmitContext.This): a codegen property that keeps the
13391         a single instance of this instead of creating many different this
13392         instances. 
13393
13394         * delegate.cs (Delegate.DoResolve): Update to use the property;
13395
13396         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13397
13398         * expression.cs (BaseAccess.DoResolve): Ditto.
13399
13400 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13401
13402         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13403         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13404
13405         (InitCoreTypes): Update accordingly.
13406
13407         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13408         so we can quickly store the state.
13409
13410         (ApplyAttributes): Set the correct implementation flags
13411         for InternalCall methods.
13412
13413 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13414
13415         * expression.cs (EmitCall): if a method is not virtual, then do
13416         not use callvirt on it.
13417
13418         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13419         user defined stuff) requires the use of stobj, which takes an
13420         address on the stack instead of an array and an index.  So emit
13421         the Ldelema operation for it.
13422
13423         (EmitStoreOpcode): Use stobj for valuetypes.
13424
13425         (UnaryMutator.EmitCode): Use the right 1 value depending on
13426         whether we are dealing with int64/uint64, float or doubles.
13427
13428         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13429         constructors that I implemented last night.
13430
13431         (Constructor.IsDefault): Fix to work properly for static
13432         constructors.
13433
13434         * cs-parser.jay (CheckDef): report method signature errors.
13435         Update error number 103 to be 132.
13436
13437         * decl.cs: New AdditionResult enumeration value: MethodExists.
13438         Although we do this check for methods later on in the semantic
13439         analysis, catching repeated default constructors is so easy that
13440         we catch these here. 
13441
13442         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13443         promotions code.
13444
13445         (ParameterReference.EmitAssign, Emit): handle
13446         bools as bytes.
13447
13448         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13449         (ArrayAccess.EmitStoreOpcode): ditto.
13450
13451         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13452
13453         * expression.cs (MakeByteBlob): Complete all the missing types
13454         (uint, short, ushort, byte, sbyte)
13455
13456         * class.cs: Only init instance field initializers on instance
13457         constructors. 
13458
13459         Rename `constructors' to instance_constructors. 
13460
13461         (TypeContainer.AddConstructor): Only add constructors to the list
13462         if it is not static.
13463
13464         Make sure that we handle default_static_constructor independently
13465         everywhere where we handle instance_constructors
13466
13467 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13468
13469         * class.cs: Do not lookup or create a base initializer for a
13470         static constructor.
13471
13472         (ConstructorInitializer.Resolve): use the proper type to lookup
13473         for constructors.
13474
13475         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13476
13477         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13478         in DeclSpace. 
13479
13480         * decl.cs: CloseType is now an virtual method, the default
13481         implementation just closes this type.
13482
13483 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13484
13485         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13486         to PreserveSig by default. Also emit HideBySig on such methods.
13487
13488         Basically, set the defaults to standard values.
13489
13490         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13491         argument, if candidate is better, it can't be worse than the best !
13492
13493         (Invocation): Re-write bits to differentiate between methods being
13494         applicable in their expanded form and their normal form - for params
13495         methods of course.
13496
13497         Get rid of use_standard everywhere as only standard conversions are allowed
13498         in overload resolution. 
13499
13500         More spec conformance.
13501
13502 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13503
13504         * driver.cs: Add --timestamp, to see where the compiler spends
13505         most of its time.
13506
13507         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13508         `this' in static code.
13509
13510         (SimpleName.DoResolve): Implement in terms of a helper function
13511         that allows static-references to be passed upstream to
13512         MemberAccess.
13513
13514         (Expression.ResolveWithSimpleName): Resolve specially simple
13515         names when called by MemberAccess to implement the special
13516         semantics. 
13517
13518         (Expression.ImplicitReferenceConversion): Handle conversions from
13519         Null to reference types before others, as Null's type is
13520         System.Object. 
13521
13522         * expression.cs (Invocation.EmitCall): Handle the special case of
13523         calling methods declared on a reference type from a ValueType
13524         (Base classes System.Object and System.Enum)
13525
13526         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13527         the left hand side is a TypeExpr, not on every enumeration. 
13528
13529         (Binary.Resolve): If types are reference types, then do a cast to
13530         object on operators != and == of both arguments.
13531
13532         * typemanager.cs (FindMembers): Extract instance and static
13533         members if requested.
13534
13535         * interface.cs (PopulateProperty): Use void_type instead of null
13536         as the return type for the setter method.
13537
13538         (PopulateIndexer): ditto.
13539
13540 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13541
13542         * support.cs (ReflectionParameters): Fix minor bug where we
13543         were examining the wrong parameter for the ParamArray attribute.
13544
13545         Cope with requests for the type of the parameter at position
13546         greater than the params parameter's. We now return the element
13547         type of the params array as that makes more sense.
13548
13549         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13550         accordingly as we no longer have to extract the element type
13551         ourselves.
13552
13553         (Invocation.OverloadResolve): Update.
13554
13555 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13556
13557         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13558         against IEnumerator, test whether the return value is a descendant
13559         of the IEnumerator interface.
13560
13561         * class.cs (Indexer.Define): Use an auxiliary method to implement
13562         the other bits of the method definition.  Begin support for
13563         explicit interface implementation.
13564
13565         (Property.DefineMethod): Use TypeManager.void_type instead of null
13566         for an empty return value.
13567
13568 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13569
13570         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13571         dealing with a FieldExpr which is composed of a FieldBuilder, in
13572         the code path we did extract the constant, but we should have
13573         obtained the underlying value to be able to cast it (otherwise we
13574         end up in an infinite loop, this is what Ravi was running into).
13575
13576         (ArrayCreation.UpdateIndices): Arrays might be empty.
13577
13578         (MemberAccess.ResolveMemberAccess): Add support for section
13579         14.5.4.1 that deals with the special case of E.I when E is a type
13580         and something else, that I can be a reference to a static member.
13581
13582         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13583         handle a particular array type to create byte blobs, it is just
13584         something we dont generate byteblobs for.
13585
13586         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13587         arguments. 
13588
13589         * location.cs (Push): remove the key from the hashtable that we
13590         are about to add.   This happens for empty files.
13591
13592         * driver.cs: Dispose files after we have parsed them.
13593
13594         (tokenize): new function that only runs the tokenizer on its
13595         input, for speed testing.
13596
13597 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13598
13599         * class.cs (Event.Define): Define the private field only if there
13600         are no accessors defined.
13601
13602         * expression.cs (ResolveMemberAccess): If there is no associated
13603         field with the event, that means we have an event defined with its
13604         own accessors and we should flag error cs0070 since transforming
13605         ourselves into a field is not valid in that case.
13606
13607         * ecore.cs (SimpleName.DoResolve): Same as above.
13608
13609         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13610         and charset to sane values.
13611
13612 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13613
13614         * assign.cs (DoResolve): Perform check on events only if they 
13615         are being accessed outside the declaring type.
13616
13617         * cs-parser.jay (event_declarations): Update rules to correctly
13618         set the type of the implicit parameter etc.
13619
13620         (add_accessor, remove_accessor): Set current local parameters.
13621
13622         * expression.cs (Binary): For delegate addition and subtraction,
13623         cast the return value from the method into the appropriate delegate
13624         type.
13625
13626 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13627
13628         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13629         of these as the workaround is unnecessary.
13630
13631         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13632         delegate data - none of that is needed at all.
13633
13634         Re-write bits to extract the instance expression and the delegate method
13635         correctly.
13636
13637         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13638         on delegates too.
13639
13640         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13641         of attaching attributes instead of duplicating code everywhere.
13642
13643         * everywhere : Update code to do attribute emission using the above method.
13644
13645 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13646
13647         * expression.cs (IsParamsMethodApplicable): if there are not
13648         parameters, return immediately.
13649
13650         * ecore.cs: The 0 literal can be implicity converted to an enum
13651         type. 
13652
13653         (SimpleName.DoResolve): First lookup the type, then lookup the
13654         members. 
13655
13656         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13657         want to get its address.  If the InstanceExpression is not
13658         addressable, store the result in a temporary variable, then get
13659         the address of it.
13660
13661         * codegen.cs: Only display 219 errors on warning level or above. 
13662
13663         * expression.cs (ArrayAccess): Make it implement the
13664         IMemoryLocation interface.
13665
13666         (Binary.DoResolve): handle the operator == (object a, object b)
13667         and operator != (object a, object b) without incurring into a
13668         BoxedCast (because 5 != o should never be performed).
13669
13670         Handle binary enumerator operators.
13671
13672         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13673         value type, otherwise use Ldelem_ref.
13674
13675         Use precomputed names;
13676
13677         (AddressOf): Implement address of
13678
13679         * cs-parser.jay (labeled_statement): Fix recursive block
13680         addition by reworking the production.
13681
13682         * expression.cs (New.DoEmit): New has a special case:
13683                 
13684                  If we are dealing with a ValueType, we have a few
13685                  situations to deal with:
13686                 
13687                     * The target of New is a ValueType variable, that is
13688                       easy, we just pass this as the variable reference
13689                 
13690                     * The target of New is being passed as an argument,
13691                       to a boxing operation or a function that takes a
13692                       ValueType.
13693                 
13694                       In this case, we need to create a temporary variable
13695                       that is the argument of New.
13696
13697
13698 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13699
13700         * rootcontext.cs (LookupType): Check that current_type is not null before
13701         going about looking at nested types.
13702
13703         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13704         not implement the IAssignMethod interface any more.
13705
13706         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13707         where we tranform them into FieldExprs if they are being resolved from within
13708         the declaring type.
13709
13710         * ecore.cs (SimpleName.DoResolve): Do the same here.
13711
13712         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13713
13714         * ../errors/bug10.cs : Add.
13715
13716         * ../errors/cs0070.cs : Add.
13717
13718         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13719
13720         * assign.cs : Get rid of EventIsLocal everywhere.
13721
13722 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13723
13724         * ecore.cs (ConvertIntLiteral): finished the implementation.
13725
13726         * statement.cs (SwitchLabel): Convert the value we are using as a
13727         key before looking up the table.
13728
13729 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13730
13731         * codegen.cs (EmitTopBlock): Require a Location argument now.
13732
13733         * cs-parser.jay (constructor_declarator): We need to setup
13734         current_local_parameters before we parse the
13735         opt_constructor_initializer, to allow the variables to be bound
13736         to the constructor arguments.
13737
13738         * rootcontext.cs (LookupType): First lookup nested classes in our
13739         class and our parents before we go looking outside our class.
13740
13741         * expression.cs (ConstantFold): Extract/debox the values at the
13742         beginnning. 
13743
13744         * rootcontext.cs (EmitCode): Resolve the constants first before we
13745         resolve the types.  This is not really needed, but it helps debugging.
13746
13747         * statement.cs: report location.
13748
13749         * cs-parser.jay: pass location to throw statement.
13750
13751         * driver.cs: Small bug fix.
13752
13753         * report.cs: Updated format to be 4-zero filled digits.
13754
13755 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13756
13757         * expression.cs (CheckIndices): Fix minor bug where the wrong
13758         variable was being referred to ;-)
13759
13760         (DoEmit): Do not call EmitStaticInitializers when the 
13761         underlying type is System.Object.
13762
13763 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13764
13765         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13766         and do the usual workaround for SRE.
13767
13768         * class.cs (MyEventBuilder.EventType): New member to get at the type
13769         of the event, quickly.
13770
13771         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13772
13773         * assign.cs (Assign.DoResolve): Handle the case when the target
13774         is an EventExpr and perform the necessary checks.
13775
13776         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13777         interface.
13778
13779         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13780
13781         (EventExpr): Set the type in the constructor itself since we 
13782         are meant to be born fully resolved.
13783
13784         (EventExpr.Define): Revert code I wrote earlier.
13785                 
13786         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13787         instance expression is null. The instance expression is a This in that case
13788         or a null, depending on whether it is a static method or not.
13789
13790         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13791         refers to more than one method.
13792
13793         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13794         and accordingly flag errors.
13795
13796 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13797
13798         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13799
13800 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13801
13802         * location.cs (ToString): Provide useful rutine.
13803
13804 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13805
13806         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13807         objects, return the actual integral boxed.
13808
13809         * statement.cs (SwitchLabel): define an ILLabel for each
13810         SwitchLabel. 
13811
13812         (Switch.CheckSwitch): If the value is a Literal, extract
13813         the underlying literal.
13814
13815         Also in the unused hashtable we had, add the SwitchLabel so we can
13816         quickly look this value up.
13817
13818         * constant.cs: Implement a bunch of new constants.  Rewrite
13819         Literal based on this.  Made changes everywhere to adapt to this.
13820
13821         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13822         dereferencing array only once, and also copes with enumrations.
13823
13824         bytes are two bytes wide, not one.
13825
13826         (Cast): Perform constant conversions.
13827
13828         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13829         wrappers to the literals here.
13830
13831         * expression.cs (DoNumericPromotions): long literals can converted
13832         to ulong implicity (this is taken care of elsewhere, but I was
13833         missing this spot).
13834
13835         * ecore.cs (Expression.Literalize): Make the return type Literal,
13836         to improve type checking.
13837
13838         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13839
13840 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13841
13842         * literal.cs: Revert code from ravi that checked the bounds.  The
13843         bounds are sane by the definition of the type itself. 
13844
13845         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13846         need to actually look up in our parent hierarchy for interfaces
13847         implemented. 
13848
13849         * const.cs: Use the underlying type for enumerations
13850
13851         * delegate.cs: Compute the basename for the delegate creation,
13852         that should fix the delegate test case, and restore the correct
13853         Type Lookup semantics in rootcontext
13854
13855         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13856         referencing a nested type with the Reflection API is using the "+"
13857         sign. 
13858
13859         * cs-parser.jay: Do not require EOF token at the end.
13860
13861 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13862
13863         * rootcontext.cs (LookupType): Concatenate type names with
13864         a '.' instead of a '+' The test suite passes again.
13865
13866         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13867         field of the enumeration.
13868
13869         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13870         the case when the member is an EventExpr.
13871
13872         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13873         static has an associated instance expression.
13874
13875         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13876
13877         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13878
13879         * class.cs (Event.Define): Register event and perform appropriate checks
13880         for error #111.
13881
13882         We define the Add and Remove methods even if the use provides none because
13883         in that case, we provide default implementations ourselves.
13884
13885         Define a private field of the type of the event. This is done by the CSC compiler
13886         and we should be doing it too ;-)
13887
13888         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13889         More methods we use in code we generate.
13890
13891         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13892         is important.
13893
13894         (InitCoreTypes): Update accordingly for the above.
13895
13896         * class.cs (Event.Emit): Generate code for default accessors that we provide
13897
13898         (EmitDefaultMethod): Do the job in the above.
13899
13900         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13901         appropriate place.
13902
13903 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13904
13905         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13906         builders even if we were missing one.
13907
13908         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13909         pass the Basename as our class name instead of the Name.  The
13910         basename will be correctly composed for us.
13911
13912         * parameter.cs (Paramters): Now takes a Location argument.
13913
13914         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13915         make all the code call directly LookupType in RootContext and take
13916         this chance to pass the Location information everywhere.
13917
13918         * Everywhere: pass Location information.
13919
13920 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13921
13922         * class.cs (Constructor.Define): Updated way of detecting the
13923         length of the parameters.
13924
13925         (TypeContainer.DefineType): Use basename as the type name for
13926         nested types.
13927
13928         (TypeContainer.Define): Do not recursively define types here, as
13929         definition is taken care in order by the RootContext.
13930
13931         * tree.cs: Keep track of namespaces in a per-file basis.
13932
13933         * parameter.cs (Parameter.ComputeSignature): Update to use
13934         DeclSpace. 
13935
13936         (Parameters.GetSignature): ditto.
13937
13938         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13939         instead of a TypeContainer.
13940
13941         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13942         resolve names.  Because we need to be resolve in our context, not
13943         our parents.
13944
13945         * driver.cs: Implement response files.
13946
13947         * class.cs (TypeContainer.DefineType): If we are defined, do not
13948         redefine ourselves.
13949
13950         (Event.Emit): Emit the code for add/remove handlers.
13951         (Event.Define): Save the MethodBuilders for add/remove.
13952
13953         * typemanager.cs: Use pair here too.
13954
13955         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13956         DictionaryEntry requires the first argument to be non-null.  
13957
13958         (enum_declaration): Compute full name for registering the
13959         enumeration.
13960
13961         (delegate_declaration): Instead of using
13962         formal_parameter_list, use opt_formal_parameter_list as the list
13963         can be empty.
13964
13965         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13966         (EventParsing): New property that controls whether `add' and
13967         `remove' are returned as tokens or identifiers (for events);
13968
13969 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13970
13971         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13972         use MyEventBuilder only and let it wrap the real builder for us.
13973
13974         (MyEventBuilder): Revamp constructor etc.
13975
13976         Implement all operations that we perform on EventBuilder in precisely the same
13977         way here too.
13978
13979         (FindMembers): Update to use the EventBuilder member.
13980
13981         (Event.Emit): Update accordingly.
13982
13983 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13984
13985         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13986         by calling the appropriate methods.
13987
13988         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13989         useful.
13990
13991         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13992
13993 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13994
13995         * delegate.cs (Delegate.Populate): Check that the return type
13996         and various parameters types are indeed accessible.
13997
13998         * class.cs (Constructor.Define): Same here.
13999
14000         (Field.Define): Ditto.
14001
14002         (Event.Define): Ditto.
14003
14004         (Operator.Define): Check that the underlying Method defined itself
14005         correctly - so it's MethodBuilder should not be null.
14006
14007         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14008         expression happens to be null.
14009
14010         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14011         members but as of now we don't seem to be able to do anything really useful with it.
14012
14013         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14014         not the EventBuilder.
14015
14016 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14017
14018         * cs-tokenizer.cs: Add support for defines.
14019         Add support for #if, #elif, #else, #endif
14020
14021         (eval_var): evaluates a variable.
14022         (eval): stubbed for evaluating functions.
14023
14024         * cs-parser.jay: Pass the defines information
14025
14026         * driver.cs: Add --define command line option.
14027
14028         * decl.cs: Move MemberCore here.
14029
14030         Make it the base class for DeclSpace.  This allows us to catch and
14031         report 108 and 109 for everything now.
14032
14033         * class.cs (TypeContainer.Define): Extract all the members
14034         before populating and emit the warning 108 (new keyword required
14035         to override) instead of having each member implement this.
14036
14037         (MemberCore.Define): New abstract method, we will be using this in
14038         the warning reporting engine in Populate.
14039
14040         (Operator.Define): Adjust to new MemberCore protocol. 
14041
14042         * const.cs (Const): This does not derive from Expression, it is a
14043         temporary object we use to create fields, it is a MemberCore. 
14044
14045         * class.cs (Method.Define): Allow the entry point to be in a
14046         specific class.
14047
14048         * driver.cs: Rewrite the argument handler to clean it up a bit.
14049
14050         * rootcontext.cs: Made it just an auxiliary namespace feature by
14051         making everything static.
14052
14053         * driver.cs: Adapt code to use RootContext type name instead of
14054         instance variable.
14055
14056         * delegate.cs: Remove RootContext argument.
14057
14058         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14059         argument. 
14060
14061         * class.cs (Event.Define): The lookup can fail.
14062
14063         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14064
14065         * expression.cs: Resolve the this instance before invoking the code.
14066
14067 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14068
14069         * cs-parser.jay: Add a production in element_access that allows
14070         the thing to become a "type" reference.  This way we can parse
14071         things like "(string [])" as a type.
14072
14073         Note that this still does not handle the more complex rules of
14074         casts. 
14075
14076
14077         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14078
14079         * ecore.cs: (CopyNewMethods): new utility function used to
14080         assemble the list of methods from running FindMembers.
14081
14082         (MemberLookup): Rework FindMembers so that 
14083
14084 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14085
14086         * class.cs (TypeContainer): Remove Delegates who fail to be
14087         defined.
14088
14089         * delegate.cs (Populate): Verify that we dont get null return
14090         values.   TODO: Check for AsAccessible.
14091
14092         * cs-parser.jay: Use basename to emit error 574 (destructor should
14093         have the same name as container class), not the full name.
14094
14095         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14096         possible representation.  
14097
14098         Also implements integer type suffixes U and L.
14099
14100 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14101
14102         * expression.cs (ArrayCreation.DoResolve): We need to do the
14103         argument resolution *always*.
14104
14105         * decl.cs: Make this hold the namespace.  Hold the root context as
14106         well.
14107         (LookupType): Move here.
14108
14109         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14110
14111         * location.cs (Row, Name): Fixed the code, it was always returning
14112         references to the first file.
14113
14114         * interface.cs: Register properties defined through interfaces.
14115
14116         * driver.cs: Add support for globbing on the command line
14117
14118         * class.cs (Field): Make it derive from MemberCore as well.
14119         (Event): ditto.
14120
14121 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14122
14123         * class.cs (Event::Define): Check that the type of the event is a delegate
14124         type else flag error #66.
14125
14126         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14127         same.
14128
14129         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14130         values of EntryPoint, CharSet etc etc.
14131
14132         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14133
14134         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14135         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14136         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14137         which needs this to do its work.
14138
14139         * ../errors/cs0066.cs : Add.
14140
14141 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14142
14143         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14144         helper functions.
14145
14146         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14147         clears out the parameters field.
14148         (MemberSignatureCompare): Cleanup
14149
14150         (MemberCore): New base class used to share code between MethodCore
14151         and Property.
14152
14153         (RegisterRequiredImplementations) BindingFlags.Public requires
14154         either BindingFlags.Instace or Static.  Use instance here.
14155
14156         (Property): Refactored code to cope better with the full spec.
14157
14158         * parameter.cs (GetParameterInfo): Return an empty array instead
14159         of null on error.
14160
14161         * class.cs (Property): Abstract or extern properties have no bodies.
14162
14163         * parameter.cs (GetParameterInfo): return a zero-sized array.
14164
14165         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14166         method modifier validation to the typecontainer so we can reuse
14167         this on properties.
14168
14169         (MethodCore.ParameterTypes): return an empty sized array of types.
14170
14171         (Property.Define): Test property modifier validity.
14172
14173         Add tests for sealed/override too.
14174
14175         (Method.Emit): abstract or extern methods have no bodies.
14176
14177 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14178
14179         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14180         thing.
14181
14182         (Method::Define, ::Emit): Modify accordingly.
14183
14184         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14185
14186         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14187
14188         * makefile: Pass in /unsafe.
14189
14190 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14191
14192         * class.cs (MakeKey): Kill routine.
14193
14194         * class.cs (TypeContainer.Define): Correctly define explicit
14195         method implementations (they require the full interface name plus
14196         the method name).
14197
14198         * typemanager.cs: Deply the PtrHashtable here and stop using the
14199         lame keys.  Things work so much better.
14200
14201         This of course broke everyone who depended on `RegisterMethod' to
14202         do the `test for existance' test.  This has to be done elsewhere.
14203
14204         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14205         the object stupid Equals method (because, that like fails all over
14206         the place).  We still do not use it.
14207
14208         * class.cs (TypeContainer.SetRequiredInterface,
14209         TypeContainer.RequireMethods): Killed these two routines and moved
14210         all the functionality to RegisterRequiredImplementations.
14211
14212         (TypeContainer.RegisterRequiredImplementations): This routine now
14213         registers all the implementations required in an array for the
14214         interfaces and abstract methods.  We use an array of structures
14215         which can be computed ahead of time to reduce memory usage and we
14216         also assume that lookups are cheap as most classes will not
14217         implement too many interfaces.
14218
14219         We also avoid creating too many MethodSignatures.
14220
14221         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14222         clear the "pending" bit if we find that there are problems with
14223         the declaration.
14224
14225         (TypeContainer.VerifyPendingMethods): Update to report errors of
14226         methods that look like implementations but are not.
14227
14228         (TypeContainer.Define): Add support for explicit interface method
14229         implementation. 
14230
14231 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14232
14233         * typemanager.cs: Keep track of the parameters here instead of
14234         being a feature of the TypeContainer.
14235
14236         * class.cs: Drop the registration of parameters here, as
14237         InterfaceMethods are also interface declarations.
14238
14239         * delegate.cs: Register methods with the TypeManager not only with
14240         the TypeContainer.  This code was buggy.
14241
14242         * interface.cs: Full registation here.
14243
14244 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14245
14246         * expression.cs: Remove reducer for binary expressions, it can not
14247         be done this way.
14248
14249         * const.cs: Put here the code that used to go into constant.cs
14250
14251         * constant.cs: Put here the code for constants, this is a new base
14252         class for Literals.
14253
14254         * literal.cs: Make Literal derive from Constant.
14255
14256 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14257
14258         * statement.cs (Return.Emit): Report error 157 if the user
14259         attempts to return from a finally block.
14260
14261         (Return.Emit): Instead of emitting a return, jump to the end of
14262         the function.
14263
14264         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14265         LocalBuilder to store the result of the function.  ReturnLabel is
14266         the target where we jump.
14267
14268
14269 2001-12-09  Radek Doulik  <rodo@ximian.com>
14270
14271         * cs-parser.jay: remember alias in current namespace
14272
14273         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14274         namespaces
14275
14276         * class.cs (LookupAlias): lookup alias in my_namespace
14277
14278         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14279         aliases hashtable
14280         (LookupAlias): lookup alias in this and if needed in parent
14281         namespaces
14282
14283 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14284
14285         * support.cs: 
14286
14287         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14288         making things static.  I need this to avoid passing the
14289         TypeContainer when calling ParameterType.
14290
14291         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14292         that did string manipulation to compute the type and then call
14293         GetType.  Use Parameter.ParameterType instead.
14294
14295         * cs-tokenizer.cs: Consume the suffix for floating values.
14296
14297         * expression.cs (ParameterReference): figure out whether this is a
14298         reference parameter or not.  Kill an extra variable by computing
14299         the arg_idx during emission.
14300
14301         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14302         function that returns whether a parameter is an out/ref value or not.
14303
14304         (Parameter.ParameterType): The type of the parameter (base,
14305         without ref/out applied).
14306
14307         (Parameter.Resolve): Perform resolution here.
14308         (Parameter.ExternalType): The full type (with ref/out applied).
14309
14310         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14311         support for expressions on the using statement.
14312
14313 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14314
14315         * statement.cs (Using.EmitLocalVariableDecls): Split the
14316         localvariable handling of the using statement.
14317
14318         (Block.EmitMeta): Keep track of variable count across blocks.  We
14319         were reusing slots on separate branches of blocks.
14320
14321         (Try.Emit): Emit the general code block, we were not emitting it. 
14322
14323         Check the type of the declaration to be an IDisposable or
14324         something that can be implicity converted to it. 
14325
14326         Emit conversions if required.
14327
14328         * ecore.cs (EmptyExpression): New utility class.
14329         (Expression.ImplicitConversionExists): New utility function.
14330
14331 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14332
14333         * statement.cs (Using): Implement.
14334
14335         * expression.cs (LocalVariableReference): Support read only variables.
14336
14337         * statement.cs: Remove the explicit emit for the Leave opcode.
14338         (VariableInfo): Add a readonly field.
14339
14340 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14341
14342         * ecore.cs (ConvCast): new class used to encapsulate the various
14343         explicit integer conversions that works in both checked and
14344         unchecked contexts.
14345
14346         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14347         properly generate the overflow opcodes.
14348
14349 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14350
14351         * statement.cs: The correct type for the EmptyExpression is the
14352         element_type, not the variable type.  Ravi pointed this out.
14353
14354 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14355
14356         * class.cs (Method::Define): Handle PInvoke methods specially
14357         by using DefinePInvokeMethod instead of the usual one.
14358
14359         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14360         above to do the task of extracting information and defining the method.
14361
14362 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14363
14364         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14365         of the condition for string type.
14366
14367         (Emit): Move that here. 
14368
14369         (ArrayCreation::CheckIndices): Keep string literals in their expression
14370         form.
14371
14372         (EmitDynamicInitializers): Handle strings appropriately.
14373
14374 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14375
14376         * codegen.cs (EmitContext): Replace multiple variables with a
14377         single pointer to the current Switch statement.
14378
14379         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14380         EmitContext.
14381
14382 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14383
14384         * statement.cs 
14385
14386         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14387         default'.
14388
14389         (Foreach.Emit): Foreach on arrays was not setting
14390         up the loop variables (for break/continue).
14391
14392         (GotoCase): Semi-implented.
14393
14394 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14395
14396         * attribute.cs (CheckAttribute): Handle system attributes by using
14397         Attribute.GetAttributes to examine information we need.
14398
14399         (GetValidPlaces): Same here.
14400
14401         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14402
14403         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14404
14405         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14406
14407         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14408
14409         (Method::Emit): Handle the case when we are a PInvoke method.
14410
14411 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14412
14413         * expression.cs: Use ResolveWithSimpleName on compound names.
14414
14415 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14416
14417         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14418         before trying to reduce it.
14419
14420         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14421
14422         * constant.cs (LookupConstantValue): Implement.
14423
14424         (EmitConstant): Use the above in emitting the constant.
14425
14426         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14427         that are user-defined by doing a LookupConstantValue on them.
14428
14429         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14430         too, like above.
14431
14432 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14433
14434         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14435
14436         (BaseAccess.DoResolve): Implement.
14437
14438         (MemberAccess.DoResolve): Split this routine into a
14439         ResolveMemberAccess routine that can be used independently
14440
14441 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14442
14443         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14444         As that share bits of the implementation.  Is returns a boolean,
14445         while As returns the Type that is being probed.
14446
14447 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14448
14449         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14450         instead of a Literal - much easier.
14451
14452         (EnumInTransit): Remove - utterly useless :-)
14453
14454         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14455
14456         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14457
14458         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14459         chain when we have no associated expression.
14460
14461 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14462
14463         * constant.cs (Define): Use Location while reporting the errror.
14464
14465         Also emit a warning when 'new' is used and there is no inherited
14466         member to hide.
14467
14468         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14469         populated.
14470
14471         (LookupEnumValue): Implement to lookup an enum member's value and define it
14472         if necessary.
14473
14474         (Populate): Re-write accordingly to use the above routine.
14475
14476 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14477
14478         * expression.cs (This): Fix prototype for DoResolveLValue to
14479         override the base class DoResolveLValue.
14480
14481         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14482         declarations) 
14483
14484         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14485         (we need to load the address of the field here).  This fixes
14486         test-22. 
14487
14488         (FieldExpr.DoResolveLValue): Call the DoResolve
14489         function to initialize the Instance expression.
14490
14491         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14492         correctly the GetEnumerator operation on a value type.
14493
14494         * cs-parser.jay: Add more simple parsing error catches.
14495
14496         * statement.cs (Switch): Add support for string switches.
14497         Handle null specially.
14498
14499         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14500
14501 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14502
14503         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14504
14505         (declare_local_constant): New helper function.
14506
14507         * statement.cs (AddConstant): Keep a separate record of constants
14508
14509         (IsConstant): Implement to determine if a variable is a constant.
14510
14511         (GetConstantExpression): Implement.
14512
14513         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14514
14515         * statement.cs (IsVariableDefined): Re-write.
14516
14517 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14518
14519         * class.cs (TypeContainer::FindMembers): Look for constants
14520         in the case when we are looking for MemberTypes.Field
14521
14522         * expression.cs (MemberAccess::DoResolve): Check that in the
14523         case we are a FieldExpr and a Literal, we are not being accessed
14524         by an instance reference.
14525
14526         * cs-parser.jay (local_constant_declaration): Implement.
14527
14528         (declaration_statement): Implement for constant declarations.
14529
14530 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14531
14532         * statement.cs (Switch): Catch double defaults.
14533
14534         (Switch): More work on the switch() statement
14535         implementation.  It works for integral values now, need to finish
14536         string support.
14537
14538
14539 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14540
14541         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14542         integer literals into other integer literals.  To be used by
14543         switch. 
14544
14545 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14546
14547         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14548         some memory.
14549
14550         (EmitDynamicInitializers): Cope with the above since we extract data
14551         directly from ArrayData now.
14552
14553         (ExpectInitializers): Keep track of whether initializers are mandatory
14554         or not.
14555
14556         (Bounds): Make it a hashtable to prevent the same dimension being 
14557         recorded for every element in that dimension.
14558
14559         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14560         from being found.
14561
14562         Also fix bug which was causing the indices to be emitted in the reverse
14563         order.
14564
14565 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14566
14567         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14568         unfinished.  They do not work, because the underlying code is
14569         sloppy.
14570
14571 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14572
14573         * cs-parser.jay: Remove bogus fixme.
14574
14575         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14576         on Switch statement.
14577
14578 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14579
14580         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14581         the same. 
14582
14583         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14584         parameter. Apparently, any expression is allowed. 
14585
14586         (ValidateInitializers): Update accordingly.
14587
14588         (CheckIndices): Fix some tricky bugs thanks to recursion.
14589
14590         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14591         I was being completely brain-dead.
14592
14593         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14594         and re-write acordingly.
14595
14596         (DelegateInvocation): Re-write accordingly.
14597
14598         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14599
14600         (MakeByteBlob): Handle types more correctly.
14601
14602         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14603         initialization from expressions but it is incomplete because I am a complete
14604         Dodo :-|
14605
14606 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14607
14608         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14609         on If.  Basically, we have to return `true' (ie, we do return to
14610         our caller) only if both branches of the if return.
14611
14612         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14613         short-circuit operators, handle them as short circuit operators. 
14614
14615         (Cast.DoResolve): Resolve type.
14616         (Cast.Cast): Take an expression as the target type.
14617
14618         * cs-parser.jay (cast_expression): Remove old hack that only
14619         allowed a limited set of types to be handled.  Now we take a
14620         unary_expression and we resolve to a type during semantic
14621         analysis.
14622
14623         Use the grammar productions from Rhys to handle casts (this is
14624         not complete like Rhys syntax yet, we fail to handle that corner
14625         case that C# has regarding (-x), but we will get there.
14626
14627 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14628
14629         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14630         field which is an array type.
14631
14632         * cs-parser.jay (declare_local_variables): Support array initialization too.
14633
14634         * typemanager.cs (MakeKey): Implement.
14635
14636         (everywhere): Use the above appropriately.
14637
14638         * cs-parser.jay (for_statement): Update for array initialization while
14639         declaring variables.
14640
14641         * ecore.cs : The error message was correct, it's the variable's names that
14642         were misleading ;-) Make the code more readable.
14643
14644         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14645         the correct type etc.
14646
14647         (ConvertExplicit): Handle Enum types by examining the underlying type.
14648
14649 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14650
14651         * parameter.cs (GetCallingConvention): Always return
14652         CallingConventions.Standard for now.
14653
14654 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14655
14656         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14657         and `r' after calling DoNumericPromotions.
14658
14659         * ecore.cs: Fix error message (the types were in the wrong order).
14660
14661         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14662         BindingFlags.Instance as well 
14663
14664         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14665         implicit int literal conversion in an empty cast so that we
14666         propagate the right type upstream.
14667
14668         (UnboxCast): new class used to unbox value types.
14669         (Expression.ConvertExplicit): Add explicit type conversions done
14670         by unboxing.
14671
14672         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14673         the target type before applying the implicit LongLiterals to ULong
14674         literal cast.
14675
14676 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14677
14678         * cs-parser.jay (for_statement): Reworked the way For works: now
14679         we declare manually any variables that are introduced in
14680         for_initializer to solve the problem of having out-of-band code
14681         emition (that is what got for broken).
14682
14683         (declaration_statement): Perform the actual variable declaration
14684         that used to be done in local_variable_declaration here.
14685
14686         (local_variable_declaration): Do not declare anything, just pass
14687         the information on a DictionaryEntry
14688
14689 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14690
14691         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14692         re-write of the logic to now make it recursive.
14693
14694         (UpdateIndices): Re-write accordingly.
14695
14696         Store element data in a separate ArrayData list in the above methods.
14697
14698         (MakeByteBlob): Implement to dump the array data into a byte array.
14699
14700 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14701
14702         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14703         into CheckIndices.
14704
14705         * constant.cs (Define): Implement.
14706
14707         (EmitConstant): Re-write fully.
14708
14709         Pass in location info.
14710
14711         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14712         respectively.
14713
14714         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14715         DictionaryEntry since we need location info too.
14716
14717         (constant_declaration): Update accordingly.
14718
14719         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14720         code into another method : UpdateIndices.
14721
14722 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14723
14724         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14725         some type checking etc.
14726
14727 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14728
14729         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14730         bits to provide dimension info if the user skips doing that.
14731
14732         Update second constructor to store the rank correctly.
14733
14734 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14735
14736         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14737         and try to implement.
14738
14739         * ../errors/cs0150.cs : Add.
14740
14741         * ../errors/cs0178.cs : Add.
14742
14743 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14744
14745         * statement.cs: Implement foreach on multi-dimensional arrays. 
14746
14747         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14748         name of the params argument.
14749
14750         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14751         initializing the array.
14752
14753         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14754         we can use this elsewhere.
14755
14756         * statement.cs: Finish implementation of foreach for single
14757         dimension arrays.
14758
14759         * cs-parser.jay: Use an out-of-band stack to pass information
14760         around, I wonder why I need this.
14761
14762         foreach_block: Make the new foreach_block the current_block.
14763
14764         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14765         function used to return a static Parameters structure.  Used for
14766         empty parameters, as those are created very frequently.
14767
14768         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14769
14770 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14771
14772         * interface.cs : Default modifier is private, not public. The
14773         make verify test passes again.
14774
14775 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14776
14777         * support.cs (ReflectionParameters): Fix logic to determine
14778         whether the last parameter is a params one. Test 9 passes again.
14779
14780         * delegate.cs (Populate): Register the builders we define with
14781         RegisterParameterForBuilder. Test 19 passes again.
14782
14783         * cs-parser.jay (property_declaration): Reference $6 instead
14784         of $$ to get at the location.
14785
14786         (indexer_declaration): Similar stuff.
14787
14788         (attribute): Ditto.
14789
14790         * class.cs (Property): Register parameters for the Get and Set methods
14791         if they exist. Test 23 passes again.
14792
14793         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14794         call to EmitArguments as we are sure there aren't any params arguments. 
14795         Test 32 passes again.
14796
14797         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14798         IndexOutOfRangeException. 
14799
14800         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14801         Test 33 now passes again.
14802
14803 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14804
14805         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14806         broke a bunch of things.  Will have to come up with a better way
14807         of tracking locations.
14808
14809         * statement.cs: Implemented foreach for single dimension arrays.
14810
14811 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14812
14813         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14814         an error.  This removes the lookup from the critical path.
14815
14816         * cs-parser.jay: Removed use of temporary_loc, which is completely
14817         broken. 
14818
14819 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14820
14821         * support.cs (ReflectionParameters.ParameterModifier): Report
14822         whether the argument is a PARAMS argument or not.
14823
14824         * class.cs: Set the attribute `ParamArrayAttribute' on the
14825         parameter argument.
14826
14827         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14828         and cons_param_array_attribute (ConstructorInfo for
14829         ParamArrayAttribute)., 
14830
14831         * codegen.cs: Emit the return using the `Return' statement, that
14832         way we can report the error correctly for missing return values. 
14833
14834         * class.cs (Method.Emit): Clean up.
14835
14836         * expression.cs (Argument.Resolve): Take another argument: the
14837         location where this argument is used.  Notice that this is not
14838         part of the "Argument" class as to reduce the size of the
14839         structure (we know the approximate location anyways).
14840
14841         Test if the argument is a variable-reference, if not, then
14842         complain with a 206.
14843
14844         (Argument.Emit): Emit addresses of variables.
14845
14846         (Argument.FullDesc): Simplify.
14847
14848         (Invocation.DoResolve): Update for Argument.Resolve.
14849
14850         (ElementAccess.DoResolve): ditto.
14851
14852         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14853         method should be virtual, as this method is always virtual.
14854
14855         (NewDelegate.DoResolve): Update for Argument.Resolve.
14856
14857         * class.cs (ConstructorInitializer.DoResolve): ditto.
14858
14859         * attribute.cs (Attribute.Resolve): ditto.
14860
14861 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14862
14863         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14864
14865         * expression.cs (ParameterReference): Drop IStackStorage and implement
14866         IAssignMethod instead. 
14867
14868         (LocalVariableReference): ditto.
14869
14870         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14871         IAssignMethod instead. 
14872
14873 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14874
14875         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14876         enumerations that are used in heavily used structures derive from
14877         byte in a laughable and pathetic attempt to reduce memory usage.
14878         This is the kind of pre-optimzations that you should not do at
14879         home without adult supervision.
14880
14881         * expression.cs (UnaryMutator): New class, used to handle ++ and
14882         -- separatedly from the other unary operators.  Cleans up the
14883         code, and kills the ExpressionStatement dependency in Unary.
14884
14885         (Unary): Removed `method' and `Arguments' from this class, making
14886         it smaller, and moving it all to SimpleCall, so I can reuse this
14887         code in other locations and avoid creating a lot of transient data
14888         strucutres when not required.
14889
14890         * cs-parser.jay: Adjust for new changes.
14891
14892 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14893
14894         * enum.cs (Enum.Populate): If there is a failure during
14895         definition, return
14896
14897         * cs-parser.jay (opt_enum_base): we used to catch type errors
14898         here, but this is really incorrect.  The type error should be
14899         catched during semantic analysis.
14900
14901 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14902
14903         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14904         current_local_parameters as expected since I, in my stupidity, had forgotten
14905         to do this :-)
14906
14907         * attribute.cs (GetValidPlaces): Fix stupid bug.
14908
14909         * class.cs (Method::Emit): Perform check on applicability of attributes.
14910
14911         (Constructor::Emit): Ditto.
14912
14913         (Field::Emit): Ditto.
14914
14915         (Field.Location): Store location information.
14916
14917         (Property, Event, Indexer, Operator): Ditto.
14918
14919         * cs-parser.jay (field_declaration): Pass in location for each field.
14920
14921         * ../errors/cs0592.cs : Add.
14922
14923 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14924
14925         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14926
14927         (InitCoreTypes): Update accordingly.
14928
14929         (RegisterAttrType, LookupAttr): Implement.
14930
14931         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14932         info about the same.
14933
14934         (Resolve): Update to populate the above as necessary.
14935
14936         (Error592): Helper.
14937
14938         (GetValidPlaces): Helper to the above.
14939
14940         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14941
14942         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14943
14944 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14945
14946         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14947
14948         * ../errors/cs0617.cs : Add.
14949
14950 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14951
14952         * enum.cs (Emit): Rename to Populate to be more consistent with what
14953         we expect it to do and when exactly it is called.
14954
14955         * class.cs, rootcontext.cs : Update accordingly.
14956
14957         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14958         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14959
14960         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14961
14962         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14963         of a fieldinfo using the above, when dealing with a FieldBuilder.
14964
14965 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14966
14967         * ../errors/cs0031.cs : Add.
14968
14969         * ../errors/cs1008.cs : Add.
14970
14971         * ../errrors/cs0543.cs : Add.
14972
14973         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14974         enum type.
14975
14976         (FindMembers): Implement.
14977
14978         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14979         enums and delegates too.
14980
14981         (enum_types): Rename to builder_to_enum.
14982
14983         (delegate_types): Rename to builder_to_delegate.
14984
14985         * delegate.cs (FindMembers): Implement.
14986
14987 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14988
14989         * typemanager.cs (IsEnumType): Implement.
14990
14991         * enum.cs (Emit): Re-write parts to account for the underlying type
14992         better and perform checking etc.
14993
14994         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14995         of the underlying type.
14996
14997         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14998         value
14999
15000         * enum.cs (error31): Helper to report error #31.
15001
15002         * cs-parser.jay (enum_declaration): Store location of each member too.
15003
15004         * enum.cs (member_to_location): New hashtable. 
15005
15006         (AddEnumMember): Update location hashtable.
15007
15008         (Emit): Use the location of each member while reporting errors.
15009
15010 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15011
15012         * cs-parser.jay: A for_initializer if is a
15013         local_variable_declaration really ammount to have an implicit
15014         block with the variable declaration and no initializer for for.
15015
15016         * statement.cs (For.Emit): Cope with null initializers.
15017
15018         This fixes the infinite loop on for initializers.
15019
15020 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15021
15022         * enum.cs: More cleanup.
15023
15024         * ecore.cs: Remove dead code.
15025
15026         * class.cs (Property.Emit): More simplification.
15027         (Event.Emit): ditto.
15028
15029         Reworked to have less levels of indentation.
15030
15031 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15032
15033         * class.cs (Property): Emit attributes.
15034
15035         (Field): Ditto.
15036
15037         (Event): Ditto.
15038
15039         (Indexer): Ditto.
15040
15041         (Operator): Ditto.
15042
15043         * enum.cs (Emit): Ditto.
15044
15045         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15046         Enums too.
15047
15048         * class.cs (Field, Event, etc.): Move attribute generation into the
15049         Emit method everywhere.
15050
15051         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15052         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15053         as we had no way of defining nested enums !
15054
15055         * rootcontext.cs : Adjust code accordingly.
15056
15057         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15058
15059 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15060
15061         * expression.cs (EvalConstantExpression): Move into ecore.cs
15062
15063         * enum.cs (Enum): Rename some members and make them public and readonly
15064         according to our convention.
15065
15066         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15067         nothing else.
15068
15069         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15070
15071         (Enum::Emit): Write a simple version for now which doesn't try to compute
15072         expressions. I shall modify this to be more robust in just a while.
15073
15074         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15075
15076         (TypeContainer::CloseType): Create the Enum types too.
15077
15078         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15079
15080         * expression.cs (EvalConstantExpression): Get rid of completely.
15081
15082         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15083         user-defined values and other cases.
15084
15085         (IsValidEnumLiteral): Helper function.
15086
15087         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15088         out there in the case we had a literal FieldExpr.
15089
15090         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15091
15092         (Literalize): Revamp a bit to take two arguments.
15093
15094         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15095
15096 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15097
15098         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15099
15100         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15101
15102         (Resolve): Use the above to ensure we have proper initializers.
15103
15104 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15105
15106         * expression.cs (Expression::EvalConstantExpression): New method to 
15107         evaluate constant expressions.
15108
15109         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15110
15111 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15112
15113         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15114         in an array.
15115
15116         (Binary.ResolveOperator): Handle operator != (object a, object b)
15117         and operator == (object a, object b);
15118
15119         (Binary.DoNumericPromotions): Indicate whether the numeric
15120         promotion was possible.
15121
15122         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15123         Implement.  
15124
15125         Made the ArrayAccess implement interface IAssignMethod instead of
15126         IStackStore as the order in which arguments are passed reflects
15127         this.
15128
15129         * assign.cs: Instead of using expr.ExprClass to select the way of
15130         assinging, probe for the IStackStore/IAssignMethod interfaces.
15131
15132         * typemanager.cs: Load InitializeArray definition.
15133
15134         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15135         static data that can be used to initialize arrays. 
15136
15137 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15138
15139         * expression.cs: Handle operator== and operator!= for booleans.
15140
15141         (Conditioal.Reduce): Implement reducer for the ?: operator.
15142
15143         (Conditional.Resolve): Implement dead code elimination.
15144
15145         (Binary.Resolve): Catch string literals and return a new
15146         concatenated string.
15147
15148         (Unary.Reduce): Implement reduction of unary expressions.
15149
15150         * ecore.cs: Split out the expression core handling here.
15151
15152         (Expression.Reduce): New method used to perform constant folding
15153         and CSE.  This is needed to support constant-expressions. 
15154
15155         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15156         targets, and optimize for !x.
15157
15158 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15159
15160         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15161         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15162         set custom atttributes.
15163
15164         * literal.cs (Literal::GetValue): New abstract method to return the actual
15165         value of the literal, cast as an object.
15166
15167         (*Literal): Implement GetValue method.
15168
15169         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15170         expressions to the arraylist but objects of type Argument.
15171
15172         * class.cs (TypeContainer::Emit): Emit our attributes too.
15173
15174         (Method::Emit, Constructor::Emit): Ditto.
15175
15176         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15177         to be ignoring earlier.
15178
15179 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15180
15181         * attribute.cs (AttributeSection::Define): Implement to do the business
15182         of constructing a CustomAttributeBuilder.
15183
15184         (Attribute): New trivial class. Increases readability of code.  
15185
15186         * cs-parser.jay : Update accordingly.
15187
15188         (positional_argument_list, named_argument_list, named_argument): New rules
15189
15190         (attribute_arguments): Use the above so that we are more correct.
15191
15192 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15193
15194         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15195         to perform all checks for a method with a params parameter.
15196
15197         (Invocation::OverloadResolve): Update to use the above method and therefore
15198         cope correctly with params method invocations.
15199
15200         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15201         params too.
15202
15203         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15204         constructors in our parent too because we can't afford to miss out on 
15205         protected ones ;-)
15206
15207         * attribute.cs (AttributeSection): New name for the class Attribute
15208
15209         Other trivial changes to improve readability.
15210
15211         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15212         use the new class names.
15213
15214 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15215
15216         * class.cs (Method::Define): Complete definition for params types too
15217
15218         (Indexer::Define): Ditto.
15219
15220         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15221         Cope everywhere with a request for info about the array parameter.
15222
15223 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15224
15225         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15226
15227         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15228         local_variable_type to extract the string corresponding to the type.
15229
15230         (local_variable_type): Fixup the action to use the new helper method.
15231
15232         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15233         go.
15234
15235         * expression.cs : Clean out code which uses the above.
15236
15237 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15238
15239         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15240         and bale out if necessary by returning a false.
15241
15242         (RegisterProperty): Ditto.
15243
15244         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15245         and print out appropriate error messages.
15246
15247         * interface.cs (everywhere): Ditto.
15248
15249         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15250         location to constructor.
15251
15252         * class.cs (Property, Event, Indexer): Update accordingly.
15253
15254         * ../errors/cs111.cs : Added.
15255
15256         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15257         of a method, as laid down by the spec.
15258
15259         (Invocation::OverloadResolve): Use the above method.
15260
15261 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15262
15263         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15264         now take a TypeContainer and a Parameters object.
15265
15266         (ParameterData): Modify return type of ParameterModifier method to be 
15267         Parameter.Modifier and not a string.
15268
15269         (ReflectionParameters, InternalParameters): Update accordingly.
15270
15271         * expression.cs (Argument::GetParameterModifier): Same here.
15272
15273         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15274         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15275         symbol in it at all so maybe this is only for now.
15276
15277 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15278
15279         * support.cs (InternalParameters): Constructor now takes an extra argument 
15280         which is the actual Parameters class.
15281
15282         (ParameterDesc): Update to provide info on ref/out modifiers.
15283
15284         * class.cs (everywhere): Update call to InternalParameters to pass in
15285         the second argument too.
15286
15287         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15288         to return the modifier info [ref/out etc]
15289
15290         (InternalParameters, ReflectionParameters): Implement the above.
15291
15292         * expression.cs (Argument::ParameterModifier): Similar function to return
15293         info about the argument's modifiers.
15294
15295         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15296         too.
15297
15298         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15299         a new SetFormalParameters object which we pass to InternalParameters.
15300
15301 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15302
15303         * expression.cs (NewArray): Merge into the ArrayCreation class.
15304
15305 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15306
15307         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15308         NewUserdefinedArray into one as there wasn't much of a use in having
15309         two separate ones.
15310
15311         * expression.cs (Argument): Change field's name to ArgType from Type.
15312
15313         (Type): New readonly property which returns the proper type, taking into 
15314         account ref/out modifiers.
15315
15316         (everywhere): Adjust code accordingly for the above.
15317
15318         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15319         whether we are emitting for a ref or out parameter.
15320
15321         * expression.cs (Argument::Emit): Use the above field to set the state.
15322
15323         (LocalVariableReference::Emit): Update to honour the flag and emit the
15324         right stuff.
15325
15326         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15327
15328         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15329
15330         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15331
15332         (ReflectionParameters, InternalParameters): Implement the above method.
15333
15334         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15335         reporting errors.
15336
15337         (Invocation::FullMethodDesc): Ditto. 
15338
15339 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15340
15341         * cs-parser.jay: Add extra production for the second form of array
15342         creation. 
15343
15344         * expression.cs (ArrayCreation): Update to reflect the above
15345         change. 
15346
15347         * Small changes to prepare for Array initialization.
15348
15349 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15350
15351         * typemanager.cs (ImplementsInterface): interface might be null;
15352         Deal with this problem;
15353
15354         Also, we do store negative hits on the cache (null values), so use
15355         this instead of calling t.GetInterfaces on the type everytime.
15356
15357 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15358
15359         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15360
15361         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15362         split functionality out into different classes.
15363
15364         (New::FormArrayType): Move into NewBuiltinArray.
15365
15366         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15367         quite useless.
15368
15369         (NewBuiltinArray): New class to handle creation of built-in arrays.
15370
15371         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15372         account creation of one-dimensional arrays.
15373
15374         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15375
15376         (NewUserdefinedArray::DoResolve): Implement.
15377
15378         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15379
15380         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15381         we maintain inside the TypeManager. This is necessary to perform lookups on the
15382         module builder.
15383
15384         (LookupType): Update to perform GetType on the module builders too.     
15385
15386         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15387
15388         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15389
15390 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15391
15392         * expression.cs (New::DoResolve): Implement guts of array creation.
15393
15394         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15395
15396 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15397
15398         * expression.cs: Fix bug I introduced lsat night that broke
15399         Delegates. 
15400
15401         (Expression.Resolve): Report a 246 error (can not resolve name)
15402         if we find a SimpleName in the stream.
15403
15404         (Expression.ResolveLValue): Ditto.
15405
15406         (Expression.ResolveWithSimpleName): This function is a variant of
15407         ResolveName, this one allows SimpleNames to be returned without a
15408         warning.  The only consumer of SimpleNames is MemberAccess
15409
15410 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15411
15412         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15413         might arrive here.  I have my doubts that this is correct.
15414
15415         * statement.cs (Lock): Implement lock statement.
15416
15417         * cs-parser.jay: Small fixes to support `lock' and `using'
15418
15419         * cs-tokenizer.cs: Remove extra space
15420
15421         * driver.cs: New flag --checked, allows to turn on integer math
15422         checking. 
15423
15424         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15425         Threading.Monitor.Exit 
15426
15427 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15428
15429         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15430         Expression Class to be IndexerAccess.
15431
15432         Notice that Indexer::DoResolve sets the eclass to Value.
15433
15434 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15435
15436         * class.cs (TypeContainer::Emit): Emit code for indexers.
15437
15438         * assign.cs (IAssignMethod): New interface implemented by Indexers
15439         and Properties for handling assignment.
15440
15441         (Assign::Emit): Simplify and reuse code. 
15442
15443         * expression.cs (IndexerAccess, PropertyExpr): Implement
15444         IAssignMethod, clean up old code. 
15445
15446 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15447
15448         * typemanager.cs (ImplementsInterface): New method to determine if a type
15449         implements a given interface. Provides a nice cache too.
15450
15451         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15452         method.
15453
15454         (ConvertReferenceExplicit): Ditto.
15455
15456         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15457         various methods, with correct names etc.
15458
15459         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15460         Operator.UnaryNegation.
15461
15462         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15463         we have a unary plus or minus operator.
15464
15465         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15466         UnaryMinus.
15467
15468         * everywhere : update accordingly.
15469
15470         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15471         respectively.
15472
15473         * class.cs (Method::Define): For the case where we are implementing a method
15474         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15475         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15476
15477 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15478
15479         * interface.cs (FindMembers): Implement to work around S.R.E
15480         lameness.
15481
15482         * typemanager.cs (IsInterfaceType): Implement.
15483
15484         (FindMembers): Update to handle interface types too.
15485
15486         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15487         use IsAssignableFrom as that is not correct - it doesn't work.
15488
15489         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15490         and accordingly override EmitStatement.
15491
15492         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15493         using the correct logic :-)
15494
15495 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15496
15497         * ../errors/cs-11.cs : Add to demonstrate error -11 
15498
15499 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15500
15501         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15502         then pass this as a hint to ResolveLValue.
15503
15504         * expression.cs (FieldExpr): Add Location information
15505
15506         (FieldExpr::LValueResolve): Report assignment to readonly
15507         variable. 
15508
15509         (Expression::ExprClassFromMemberInfo): Pass location information.
15510
15511         (Expression::ResolveLValue): Add new method that resolves an
15512         LValue. 
15513
15514         (Expression::DoResolveLValue): Default invocation calls
15515         DoResolve. 
15516
15517         (Indexers): New class used to keep track of indexers in a given
15518         Type. 
15519
15520         (IStackStore): Renamed from LValue, as it did not really describe
15521         what this did.  Also ResolveLValue is gone from this interface and
15522         now is part of Expression.
15523
15524         (ElementAccess): Depending on the element access type
15525
15526         * typemanager.cs: Add `indexer_name_type' as a Core type
15527         (System.Runtime.CompilerServices.IndexerNameAttribute)
15528
15529         * statement.cs (Goto): Take a location.
15530
15531 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15532
15533         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15534         if two delegates are compatible.
15535
15536         (NewDelegate::DoResolve): Update to take care of the case when
15537         we instantiate a delegate from another delegate.
15538
15539         * typemanager.cs (FindMembers): Don't even try to look up members
15540         of Delegate types for now.
15541
15542 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15543
15544         * delegate.cs (NewDelegate): New class to take care of delegate
15545         instantiation.
15546
15547         * expression.cs (New): Split the delegate related code out into 
15548         the NewDelegate class.
15549
15550         * delegate.cs (DelegateInvocation): New class to handle delegate 
15551         invocation.
15552
15553         * expression.cs (Invocation): Split out delegate related code into
15554         the DelegateInvocation class.
15555
15556 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15557
15558         * expression.cs (New::DoResolve): Implement delegate creation fully
15559         and according to the spec.
15560
15561         (New::DoEmit): Update to handle delegates differently.
15562
15563         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15564         because of which we were printing out arguments in reverse order !
15565
15566         * delegate.cs (VerifyMethod): Implement to check if the given method
15567         matches the delegate.
15568
15569         (FullDelegateDesc): Implement.
15570
15571         (VerifyApplicability): Implement.
15572
15573         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15574         delegate invocations too.
15575
15576         (Invocation::Emit): Ditto.
15577
15578         * ../errors/cs1593.cs : Added.
15579
15580         * ../errors/cs1594.cs : Added.
15581
15582         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15583
15584 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15585
15586         * typemanager.cs (intptr_type): Core type for System.IntPtr
15587
15588         (InitCoreTypes): Update for the same.
15589
15590         (iasyncresult_type, asynccallback_type): Ditto.
15591
15592         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15593         correct.
15594
15595         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15596         too.
15597
15598         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15599         the builders for the 4 members of a delegate type :-)
15600
15601         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15602         type.
15603
15604         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15605
15606         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15607
15608 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15609
15610         * statement.cs (Break::Emit): Implement.   
15611         (Continue::Emit): Implement.
15612
15613         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15614         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15615         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15616         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15617         end loop
15618
15619         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15620         properties that track the label for the current loop (begin of the
15621         loop and end of the loop).
15622
15623 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15624
15625         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15626         use of emitting anything at all.
15627
15628         * class.cs, rootcontext.cs : Get rid of calls to the same.
15629
15630         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15631
15632         (Populate): Define the constructor correctly and set the implementation
15633         attributes.
15634
15635         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15636         have been defined.
15637
15638         (AddDelegateType): Implement.
15639
15640         (IsDelegateType): Implement helper method.
15641
15642         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15643
15644         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15645         and accordingly handle it.
15646
15647         * delegate.cs (Populate): Take TypeContainer argument.
15648         Implement bits to define the Invoke method. However, I still haven't figured out
15649         how to take care of the native int bit :-(
15650
15651         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15652         Qualify the name of the delegate, not its return type !
15653
15654         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15655         conversion.
15656
15657         (StandardConversionExists): Checking for array types turns out to be recursive.
15658
15659         (ConvertReferenceExplicit): Implement array conversion.
15660
15661         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15662
15663 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15664
15665         * cs-parser.jay (delegate_declaration): Store the fully qualified
15666         name as it is a type declaration.
15667
15668         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15669         readonly.
15670
15671         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15672         as TypeContainer::DefineType.
15673
15674         (Populate): Method in which all the definition of the various methods (Invoke)
15675         etc is done.
15676
15677         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15678         see.
15679
15680         (CloseDelegate): Finally creates the delegate.
15681
15682         * class.cs (TypeContainer::DefineType): Update to define delegates.
15683         (Populate, Emit and CloseType): Do the same thing here too.
15684
15685         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15686         delegates in all these operations.
15687
15688 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15689
15690         * expression.cs: LocalTemporary: a new expression used to
15691         reference a temporary that has been created.
15692
15693         * assign.cs: Handle PropertyAccess back here, so that we can
15694         provide the proper semantic access to properties.
15695
15696         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15697         a few more explicit conversions. 
15698
15699         * modifiers.cs: `NEW' modifier maps to HideBySig.
15700
15701         * expression.cs (PropertyExpr): Make this into an
15702         ExpressionStatement, and support the EmitStatement code path. 
15703
15704         Perform get/set error checking, clean up the interface.
15705
15706         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15707         them into toplevel access objects.
15708
15709 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15710
15711         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15712         SRE.
15713
15714         * typemanager.cs: Keep track here of our PropertyBuilders again to
15715         work around lameness in SRE.
15716
15717 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15718
15719         * expression.cs (LValue::LValueResolve): New method in the
15720         interface, used to perform a second resolution pass for LValues. 
15721
15722         (This::DoResolve): Catch the use of this in static methods.
15723
15724         (This::LValueResolve): Implement.
15725
15726         (This::Store): Remove warning, assigning to `this' in structures
15727         is 
15728
15729         (Invocation::Emit): Deal with invocation of
15730         methods on value types.  We need to pass the address to structure
15731         methods rather than the object itself.  (The equivalent code to
15732         emit "this" for structures leaves the entire structure on the
15733         stack instead of a pointer to it). 
15734
15735         (ParameterReference::DoResolve): Compute the real index for the
15736         argument based on whether the method takes or not a `this' pointer
15737         (ie, the method is static).
15738
15739         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15740         value types returned from functions when we need to invoke a
15741         method on the sturcture.
15742
15743
15744 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15745
15746         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15747         defining the type in the Modulebuilder or Typebuilder. This is to take
15748         care of nested types which need to be defined on the TypeBuilder using
15749         DefineNestedMethod.
15750
15751         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15752         methods in RootContext, only ported to be part of TypeContainer.
15753
15754         (TypeContainer::GetInterfaceOrClass): Ditto.
15755
15756         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15757
15758         * interface.cs (Interface::DefineInterface): New method. Does exactly
15759         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15760         too.
15761
15762         (Interface::GetInterfaces): Move from RootContext here and port.
15763
15764         (Interface::GetInterfaceByName): Same here.
15765
15766         * rootcontext.cs (ResolveTree): Re-write.
15767
15768         (PopulateTypes): Re-write.
15769
15770         * class.cs (TypeContainer::Populate): Populate nested types too.
15771         (TypeContainer::Emit): Emit nested members too.
15772
15773         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15774         instead just use the name argument passed in as it is already fully
15775         qualified.
15776
15777         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15778         to TypeContainer mapping to see if a type is user-defined.
15779
15780         * class.cs (TypeContainer::CloseType): Implement. 
15781
15782         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15783         the default constructor.
15784
15785         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15786         twice.
15787
15788         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15789
15790         * interface.cs (CloseType): Create the type here.
15791
15792         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15793         the hierarchy.
15794
15795         Remove all the methods which are now in TypeContainer.
15796
15797 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15798
15799         * delegate.cs (Define): Re-write bits to define the delegate
15800         correctly.
15801
15802 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15803
15804         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15805
15806         * expression.cs (ImplicitReferenceConversion): handle null as well
15807         as a source to convert to any reference type.
15808
15809         * statement.cs (Return): Perform any implicit conversions to
15810         expected return type.  
15811
15812         Validate use of return statement.  
15813
15814         * codegen.cs (EmitContext): Pass the expected return type here.
15815
15816         * class.cs (Method, Constructor, Property): Pass expected return
15817         type to EmitContext.
15818
15819 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15820
15821         * expression.cs: Make DoResolve take an EmitContext instead of a
15822         TypeContainer.
15823
15824         Replaced `l' and `location' for `loc', for consistency.
15825
15826         (Error, Warning): Remove unneeded Tc argument.
15827
15828         * assign.cs, literal.cs, constant.cs: Update to new calling
15829         convention. 
15830
15831         * codegen.cs: EmitContext now contains a flag indicating whether
15832         code is being generated in a static method or not.
15833
15834         * cs-parser.jay: DecomposeQI, new function that replaces the old
15835         QualifiedIdentifier.  Now we always decompose the assembled
15836         strings from qualified_identifier productions into a group of
15837         memberaccesses.
15838
15839 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15840
15841         * rootcontext.cs: Deal with field-less struct types correctly now
15842         by passing the size option to Define Type.
15843
15844         * class.cs: Removed hack that created one static field. 
15845
15846 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15847
15848         * statement.cs: Moved most of the code generation here. 
15849
15850 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15851
15852         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15853         seem very right.
15854
15855         (ElementAccess): Remove useless bits for now - keep checks as the spec
15856         says.
15857
15858 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15859
15860         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15861         and start performing checks according to the spec.
15862
15863 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15864
15865         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15866         rank_specifiers instead.
15867
15868         (rank_specifiers): Change the order in which the rank specifiers are stored
15869
15870         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15871
15872         * expression.cs (ElementAccess): Implement the LValue interface too.
15873
15874 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15875
15876         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15877         except that user defined conversions are not included.
15878
15879         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15880         perform the conversion of the return type, if necessary.
15881
15882         (New::DoResolve): Check whether we are creating an array or an object
15883         and accordingly do the needful.
15884
15885         (New::Emit): Same here.
15886
15887         (New::DoResolve): Implement guts of array creation.
15888
15889         (New::FormLookupType): Helper function.
15890
15891 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15892
15893         * codegen.cs: Removed most of the code generation here, and move the
15894         corresponding code generation bits to the statement classes. 
15895
15896         Added support for try/catch/finalize and throw.
15897
15898         * cs-parser.jay: Added support for try/catch/finalize.
15899
15900         * class.cs: Catch static methods having the flags override,
15901         virtual or abstract.
15902
15903         * expression.cs (UserCast): This user cast was not really doing
15904         what it was supposed to do.  Which is to be born in fully resolved
15905         state.  Parts of the resolution were being performed at Emit time! 
15906
15907         Fixed this code.
15908
15909 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15910
15911         * expression.cs: Implicity convert the result from UserCast.
15912
15913 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15914
15915         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15916         prevented it from working correctly. 
15917
15918         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15919         merely ConvertImplicit.
15920
15921 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15922
15923         * typemanager.cs: Make the LookupTypeContainer function static,
15924         and not per-instance.  
15925
15926         * class.cs: Make static FindMembers (the one that takes a Type
15927         argument). 
15928
15929         * codegen.cs: Add EmitForeach here.
15930
15931         * cs-parser.jay: Make foreach a toplevel object instead of the
15932         inline expansion, as we need to perform semantic analysis on it. 
15933
15934 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15935
15936         * expression.cs (Expression::ImplicitUserConversion): Rename to
15937         UserDefinedConversion.
15938
15939         (Expression::UserDefinedConversion): Take an extra argument specifying 
15940         whether we look for explicit user conversions too.
15941
15942         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15943
15944         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15945
15946         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15947         with the appropriate arguments.
15948
15949         * cs-parser.jay (cast_expression): Record location too.
15950
15951         * expression.cs (Cast): Record location info.
15952
15953         (Expression::ConvertExplicit): Take location argument.
15954
15955         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15956         to determine if we are doing explicit conversions.
15957
15958         (UserCast::Emit): Update accordingly.
15959
15960         (Expression::ConvertExplicit): Report an error if everything fails.
15961
15962         * ../errors/cs0030.cs : Add.
15963
15964 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15965
15966         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15967         virtual and newslot bits. 
15968
15969         * class.cs (TypeContainer::RegisterRequiredImplementations):
15970         Record methods we need.
15971
15972         (TypeContainer::MakeKey): Helper function to make keys for
15973         MethodBases, since the Methodbase key is useless.
15974
15975         (TypeContainer::Populate): Call RegisterRequiredImplementations
15976         before defining the methods.   
15977
15978         Create a mapping for method_builders_to_methods ahead of time
15979         instead of inside a tight loop.
15980
15981         (::RequireMethods):  Accept an object as the data to set into the
15982         hashtable so we can report interface vs abstract method mismatch.
15983
15984 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15985
15986         * report.cs: Make all of it static.
15987
15988         * rootcontext.cs: Drop object_type and value_type computations, as
15989         we have those in the TypeManager anyways.
15990
15991         Drop report instance variable too, now it is a global.
15992
15993         * driver.cs: Use try/catch on command line handling.
15994
15995         Add --probe option to debug the error reporting system with a test
15996         suite. 
15997
15998         * report.cs: Add support for exiting program when a probe
15999         condition is reached.
16000
16001 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16002
16003         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16004         we do a forcible conversion regardless of type, to check if 
16005         ForceConversion returns a null.
16006
16007         (Binary::error19): Use location to report error.
16008
16009         (Unary::error23): Use location here too.
16010
16011         * ../errors/cs0019.cs : Check in.
16012
16013         * ../errors/cs0023.cs : Check in.
16014
16015         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16016         case of a non-null MethodInfo object with a length of 0 !
16017
16018         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16019         an applicable member - according to the spec :-)
16020         Also fix logic to find members in base types.
16021
16022         (Unary::ResolveOperator): Same here.
16023
16024         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16025         as I was getting thoroughly confused between this and error19 :-)
16026
16027         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16028         (::FindMostEncompassedType): Implement.
16029         (::FindMostEncompassingType): Implement.
16030         (::StandardConversionExists): Implement.
16031
16032         (UserImplicitCast): Re-vamp. We now need info about most specific
16033         source and target types so that we can do the necessary conversions.
16034
16035         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16036         mathematical union with no duplicates.
16037
16038 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16039
16040         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16041         in order from base classes to child classes, so that we can in
16042         child classes look up in our parent for method names and
16043         attributes (required for handling abstract, virtual, new, override
16044         constructs: we need to instrospect our base class, and if we dont
16045         populate the classes in order, the introspection might be
16046         incorrect.  For example, a method could query its parent before
16047         the parent has any methods and would determine that the parent has
16048         no abstract methods (while it could have had them)).
16049
16050         (RootContext::CreateType): Record the order in which we define the
16051         classes.
16052
16053 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16054
16055         * class.cs (TypeContainer::Populate): Also method definitions can
16056         fail now, keep track of this.
16057
16058         (TypeContainer::FindMembers): Implement support for
16059         DeclaredOnly/noDeclaredOnly flag.
16060
16061         (Constructor::Emit) Return the ConstructorBuilder.
16062
16063         (Method::Emit) Return the MethodBuilder. 
16064         Check for abstract or virtual methods to be public.
16065
16066         * rootcontext.cs (RootContext::CreateType): Register all the
16067         abstract methods required for the class to be complete and the
16068         interface methods that must be implemented. 
16069
16070         * cs-parser.jay: Report error 501 (method requires body if it is
16071         not marked abstract or extern).
16072
16073         * expression.cs (TypeOf::Emit): Implement.
16074
16075         * typemanager.cs: runtime_handle_type, new global type.
16076
16077         * class.cs (Property::Emit): Generate code for properties.
16078
16079 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16080
16081         * expression.cs (Unary::ResolveOperator): Find operators on base type
16082         too - we now conform exactly to the spec.
16083
16084         (Binary::ResolveOperator): Same here.
16085
16086         * class.cs (Operator::Define): Fix minor quirk in the tests.
16087
16088         * ../errors/cs0215.cs : Added.
16089
16090         * ../errors/cs0556.cs : Added.
16091
16092         * ../errors/cs0555.cs : Added.
16093
16094 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16095
16096         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16097         single integer which is really efficient
16098
16099 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16100
16101         *  expression.cs (Expression::ImplicitUserConversion): Use location
16102         even in the case when we are examining True operators.
16103  
16104         * class.cs (Operator::Define): Perform extensive checks to conform
16105         with the rules for operator overloading in the spec.
16106
16107         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16108         some of the other conversions mentioned in the spec.
16109
16110         * typemanager.cs (array_type): New static member for the System.Array built-in
16111         type.
16112
16113         (cloneable_interface): For System.ICloneable interface.
16114
16115         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16116         we start resolving the tree and populating types.
16117
16118         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16119  
16120 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16121
16122         * expression.cs (Expression::ExprClassFromMemberInfo,
16123         Expression::Literalize): Create literal expressions from
16124         FieldInfos which are literals.
16125
16126         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16127         type casts, because they were wrong.  The test suite in tests
16128         caught these ones.
16129
16130         (ImplicitNumericConversion): ushort to ulong requires a widening
16131         cast. 
16132
16133         Int32 constant to long requires widening cast as well.
16134
16135         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16136         for integers because the type on the stack is not i4.
16137
16138 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16139
16140         * expression.cs (report118): require location argument. 
16141
16142         * parameter.cs: Do not dereference potential null value.
16143
16144         * class.cs: Catch methods that lack the `new' keyword when
16145         overriding a name.  Report warnings when `new' is used without
16146         anything being there to override.
16147
16148         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16149
16150         * class.cs: Only add constructor to hashtable if it is non-null
16151         (as now constructors can fail on define).
16152
16153         (TypeManager, Class, Struct): Take location arguments.
16154
16155         Catch field instance initialization in structs as errors.
16156
16157         accepting_filter: a new filter for FindMembers that is static so
16158         that we dont create an instance per invocation.
16159
16160         (Constructor::Define): Catch errors where a struct constructor is
16161         parameterless 
16162
16163         * cs-parser.jay: Pass location information for various new
16164         constructs. 
16165
16166         * delegate.cs (Delegate): take a location argument.
16167
16168         * driver.cs: Do not call EmitCode if there were problesm in the
16169         Definition of the types, as many Builders wont be there. 
16170
16171         * decl.cs (Decl::Decl): Require a location argument.
16172
16173         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16174         into integers, and find the most appropiate integer for it.
16175
16176         * literal.cs: Implement ULongLiteral.
16177
16178         * rootcontext.cs: Provide better information about the location of
16179         failure when CreateType fails.
16180
16181 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16182
16183         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16184         as well.
16185
16186         * expression.cs (Binary::CheckShiftArguments): Add missing type
16187         computation.
16188         (Binary::ResolveOperator): Add type to the logical and and logical
16189         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16190         before.
16191
16192         (Binary::DoNumericPromotions): In the case where either argument
16193         is ulong (and most signed types combined with ulong cause an
16194         error) perform implicit integer constant conversions as well.
16195
16196 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16197
16198         * expression.cs (UserImplicitCast): Method should always be
16199         non-null. 
16200         (Invocation::BetterConversion): Simplified test for IntLiteral.
16201
16202         (Expression::ImplicitNumericConversion): Split this routine out.
16203         Put the code that performs implicit constant integer conversions
16204         here. 
16205
16206         (Expression::Resolve): Become a wrapper around DoResolve so we can
16207         check eclass and type being set after resolve.
16208
16209         (Invocation::Badness): Remove this dead function
16210
16211         (Binary::ResolveOperator): Do not compute the expensive argumnets
16212         unless we have a union for it.
16213
16214         (Probe::Emit): Is needs to do an isinst and then
16215         compare against null.
16216
16217         (::CanConvert): Added Location argument.  If the Location argument
16218         is null (Location.Null), then we do not report errors.  This is
16219         used by the `probe' mechanism of the Explicit conversion.  We do
16220         not want to generate an error for something that the user
16221         explicitly requested to be casted.  But the pipeline for an
16222         explicit cast first tests for potential implicit casts.
16223
16224         So for now, if the Location is null, it means `Probe only' to
16225         avoid adding another argument.   Might have to revise this
16226         strategy later.
16227
16228         (ClassCast): New class used to type cast objects into arbitrary
16229         classes (used in Explicit Reference Conversions).
16230
16231         Implement `as' as well.
16232
16233         Reverted all the patches from Ravi below: they were broken:
16234
16235                 * The use of `level' as a mechanism to stop recursive
16236                   invocations is wrong.  That was there just to catch the
16237                   bug with a strack trace but not as a way of addressing
16238                   the problem.
16239
16240                   To fix the problem we have to *understand* what is going
16241                   on and the interactions and come up with a plan, not
16242                   just get things going.
16243
16244                 * The use of the type conversion cache that I proposed
16245                   last night had an open topic: How does this work across
16246                   protection domains.  A user defined conversion might not
16247                   be public in the location where we are applying the
16248                   conversion, a different conversion might be selected
16249                   (ie, private A->B (better) but public B->A (worse),
16250                   inside A, A->B applies, but outside it, B->A will
16251                   apply).
16252
16253                 * On top of that (ie, even if the above is solved),
16254                   conversions in a cache need to be abstract.  Ie, `To
16255                   convert from an Int to a Short use an OpcodeCast', not
16256                   `To convert from an Int to a Short use the OpcodeCast on
16257                   the variable 5' (which is what this patch was doing).
16258
16259 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16260
16261         * expression.cs (Invocation::ConversionExists): Re-write to use
16262         the conversion cache
16263
16264         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16265         cache all conversions done, not just user-defined ones.
16266
16267         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16268         to determine if a conversion exists instead of acutually trying to 
16269         perform the conversion. It's faster too.
16270
16271         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16272         and only then attempt the implicit conversion.
16273
16274 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16275
16276         * expression.cs (ConvertImplicit): Use a cache for conversions
16277         already found. Check level of recursion and bail out if necessary.
16278
16279 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16280
16281         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16282         Export standard methods that we expect for string operations.
16283
16284         * statement.cs (Block::UsageWarning): Track usage of variables and
16285         report the errors for not used variables.
16286
16287         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16288         operator. 
16289
16290 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16291
16292         * codegen.cs: remove unnneded code 
16293
16294         * expression.cs: Removed BuiltinTypeAccess class
16295
16296         Fix the order in which implicit conversions are
16297         done.  
16298
16299         The previous fixed dropped support for boxed conversions (adding a
16300         test to the test suite now)
16301
16302         (UserImplicitCast::CanConvert): Remove test for source being null,
16303         that code is broken.  We should not feed a null to begin with, if
16304         we do, then we should track the bug where the problem originates
16305         and not try to cover it up here.
16306
16307         Return a resolved expression of type UserImplicitCast on success
16308         rather than true/false.  Ravi: this is what I was talking about,
16309         the pattern is to use a static method as a "constructor" for
16310         objects. 
16311
16312         Also, do not create arguments until the very last minute,
16313         otherwise we always create the arguments even for lookups that
16314         will never be performed. 
16315
16316         (UserImplicitCast::Resolve): Eliminate, objects of type
16317         UserImplicitCast are born in a fully resolved state. 
16318
16319         * typemanager.cs (InitCoreTypes): Init also value_type
16320         (System.ValueType). 
16321
16322         * expression.cs (Cast::Resolve): First resolve the child expression.
16323
16324         (LValue): Add new method AddressOf to be used by
16325         the `&' operator.  
16326
16327         Change the argument of Store to take an EmitContext instead of an
16328         ILGenerator, because things like FieldExpr need to be able to call
16329         their children expression to generate the instance code. 
16330
16331         (Expression::Error, Expression::Warning): Sugar functions for
16332         reporting errors.
16333
16334         (Expression::MemberLookup): Accept a TypeContainer instead of a
16335         Report as the first argument.
16336
16337         (Expression::ResolvePrimary): Killed.  I still want to improve
16338         this as currently the code is just not right.
16339
16340         (Expression::ResolveMemberAccess): Simplify, but it is still
16341         wrong. 
16342
16343         (Unary::Resolve): Catch errors in AddressOf operators.
16344
16345         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16346         index to a byte for the short-version, or the compiler will choose
16347         the wrong Emit call, which generates the wrong data.
16348
16349         (ParameterReference::Emit, ::Store): same.
16350
16351         (FieldExpr::AddressOf): Implement.
16352
16353         * typemanager.cs: TypeManager: made public variable instead of
16354         property.
16355
16356         * driver.cs: document --fatal.
16357
16358         * report.cs (ErrorMessage, WarningMessage): new names for the old
16359         Error and Warning classes.
16360
16361         * cs-parser.jay (member_access): Turn built-in access to types
16362         into a normal simplename
16363
16364 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16365
16366         * expression.cs (Invocation::BetterConversion): Fix to cope
16367         with q being null, since this was introducing a bug.
16368
16369         * expression.cs (ConvertImplicit): Do built-in conversions first.
16370
16371 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16372
16373         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16374
16375 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16376
16377         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16378         I had introduced long ago (what's new ?).
16379
16380         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16381         the work of all the checking. 
16382         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16383         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16384
16385         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16386         that is the right way. 
16387
16388         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16389         overloading resolution. Use everywhere instead of cutting and pasting code.
16390
16391         (Binary::ResolveOperator): Use MakeUnionSet.
16392
16393         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16394         we have to convert to bool types. Not complete yet.
16395
16396 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16397
16398         * typemanager.cs (TypeManager::CSharpName): support ushort.
16399
16400         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16401         to provide an expression that performsn an implicit constant int
16402         conversion (section 6.1.6).
16403         (Expression::ConvertImplicitRequired): Reworked to include
16404         implicit constant expression conversions.
16405
16406         (Expression::ConvertNumericExplicit): Finished.
16407
16408         (Invocation::Emit): If InstanceExpression is null, then it means
16409         that we perform a call on this.
16410
16411 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16412
16413         * expression.cs (Unary::Emit): Remove some dead code.
16414         (Probe): Implement Resolve and Emit for `is'.
16415         (Expression::ConvertImplicitRequired): Attempt to do constant
16416         expression conversions here.  Maybe should be moved to
16417         ConvertImplicit, but I am not sure.
16418         (Expression::ImplicitLongConstantConversionPossible,
16419         Expression::ImplicitIntConstantConversionPossible): New functions
16420         that tell whether is it possible to apply an implicit constant
16421         expression conversion.
16422
16423         (ConvertNumericExplicit): Started work on explicit numeric
16424         conversions.
16425
16426         * cs-parser.jay: Update operator constants.
16427
16428         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16429         (Parameters::GetSignature): Hook up VerifyArgs here.
16430         (Parameters::VerifyArgs): Verifies that no two arguments have the
16431         same name. 
16432
16433         * class.cs (Operator): Update the operator names to reflect the
16434         ones that the spec expects (as we are just stringizing the
16435         operator names).
16436
16437         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16438         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16439         previous usage did only work for our methods.
16440         (Expression::ConvertImplicit): Handle decimal implicit numeric
16441         conversions as well.
16442         (Expression::InternalTypeConstructor): Used to invoke constructors
16443         on internal types for default promotions.
16444
16445         (Unary::Emit): Implement special handling for the pre/post
16446         increment/decrement for overloaded operators, as they need to have
16447         the same semantics as the other operators.
16448
16449         (Binary::ResolveOperator): ditto.
16450         (Invocation::ConversionExists): ditto.
16451         (UserImplicitCast::Resolve): ditto.
16452
16453 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16454
16455         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16456         operator, return after emitting body. Regression tests pass again !
16457
16458         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16459         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16460         (Invocation::OverloadResolve): Ditto.
16461         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16462
16463         * everywhere : update calls to the above methods accordingly.
16464
16465 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16466
16467         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16468
16469         * expression.cs (ExpressionStatement): New base class used for
16470         expressions that can appear in statements, so that we can provide
16471         an alternate path to generate expression that do not leave a value
16472         on the stack.
16473
16474         (Expression::Emit, and all the derivatives): We no longer return
16475         whether a value is left on the stack or not.  Every expression
16476         after being emitted leaves a single value on the stack.
16477
16478         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16479         facilties of ExpressionStatement if possible.
16480
16481         * cs-parser.jay: Update statement_expression.
16482
16483 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16484
16485         * driver.cs: Change the wording of message
16486
16487 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16488
16489         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16490         the type of the expression to the return type of the method if
16491         we have an overloaded operator match ! The regression tests pass again !
16492         (Unary::ResolveOperator): Ditto.
16493
16494         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16495         to find "op_Implicit", not "implicit" ;-)
16496         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16497         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16498
16499         * everywhere : Correct calls to the above accordingly.
16500
16501         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16502         (ConvertImplicit): Do user-defined conversion if it exists.
16503
16504 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16505
16506         * assign.cs: track location.
16507         (Resolve): Use implicit conversions on assignment.
16508
16509         * literal.cs: Oops.  Not good, Emit of short access values should
16510         pass (Bytes) or the wrong argument will be selected.
16511
16512         * expression.cs (Unary::Emit): Emit code for -expr.
16513
16514         (Unary::ResolveOperator): Handle `Substract' for non-constants
16515         (substract from zero from the non-constants).
16516         Deal with Doubles as well. 
16517
16518         (Expression::ConvertImplicitRequired): New routine that reports an
16519         error if no implicit conversion exists. 
16520
16521         (Invocation::OverloadResolve): Store the converted implicit
16522         expressions if we make them
16523
16524 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16525
16526         * class.cs (ConstructorInitializer): Take a Location argument.
16527         (ConstructorBaseInitializer): Same here.
16528         (ConstructorThisInitializer): Same here.
16529
16530         * cs-parser.jay : Update all calls accordingly.
16531
16532         * expression.cs (Unary, Binary, New): Take location argument.
16533         Update accordingly everywhere.
16534
16535         * cs-parser.jay : Update all calls to the above to take a location
16536         argument.
16537
16538         * class.cs : Ditto.
16539
16540 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16541
16542         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16543         (Invocation::BetterConversion): Same here
16544         (Invocation::ConversionExists): Ditto.
16545
16546         (Invocation::ConversionExists): Implement.
16547
16548 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16549
16550         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16551         Also take an additional TypeContainer argument.
16552
16553         * All over : Pass in TypeContainer as argument to OverloadResolve.
16554
16555         * typemanager.cs (CSharpName): Update to check for the string type and return
16556         that too.
16557
16558         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16559         a given method.
16560
16561 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16562
16563         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16564         (Invocation::BetterFunction): Implement.
16565         (Invocation::BetterConversion): Implement.
16566         (Invocation::ConversionExists): Skeleton, no implementation yet.
16567
16568         Okay, things work fine !
16569
16570 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16571
16572         * typemanager.cs: declare and load enum_type, delegate_type and
16573         void_type. 
16574
16575         * expression.cs (Expression::Emit): Now emit returns a value that
16576         tells whether a value is left on the stack or not.  This strategy
16577         might be reveted tomorrow with a mechanism that would address
16578         multiple assignments.
16579         (Expression::report118): Utility routine to report mismatches on
16580         the ExprClass.
16581
16582         (Unary::Report23): Report impossible type/operator combination
16583         utility function.
16584
16585         (Unary::IsIncrementableNumber): Whether the type can be
16586         incremented or decremented with add.
16587         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16588         complemented. 
16589         (Unary::ResolveOperator): Implement ++, !, ~,
16590
16591         (Invocation::Emit): Deal with new Emit convetion.
16592
16593         * All Expression derivatives: Updated their Emit method to return
16594         whether they leave values on the stack or not.
16595
16596         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16597         stack for expressions that are statements. 
16598
16599 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16600
16601         * expression.cs (LValue): New interface.  Must be implemented by
16602         LValue objects.
16603         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16604         LValue interface.
16605
16606         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16607         interface for generating code, simplifies the code.
16608
16609 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16610
16611         * expression.cs (everywhere): Comment out return statements in ::Resolve
16612         methods to avoid the warnings.
16613
16614 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16615
16616         * driver.cs (parse): Report error 2001 if we can not open the
16617         source file.
16618
16619         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16620         not resolve it.
16621
16622         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16623         object. 
16624
16625         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16626         otherwise nested blocks end up with the same index.
16627
16628         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16629
16630         * expression.cs:  Instead of having FIXMEs in the Resolve
16631         functions, throw exceptions so it is obvious that we are facing a
16632         bug. 
16633
16634         * cs-parser.jay (invocation_expression): Pass Location information.
16635
16636         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16637         Use a basename for those routines because .NET does not like paths
16638         on them. 
16639
16640         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16641         already defined.
16642
16643 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16644
16645         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16646         are loading the correct data types (throws an exception if not).
16647         (TypeManager::InitCoreTypes): Use CoreLookupType
16648
16649         * expression.cs (Unary::ResolveOperator): return the child
16650         expression for expressions which are just +expr.
16651         (Unary::ResolveOperator): Return negative literals for -LITERAL
16652         expressions (otherwise they are Unary {Literal}).
16653         (Invocation::Badness): Take into account `Implicit constant
16654         expression conversions'.
16655
16656         * literal.cs (LongLiteral): Implement long literal class.
16657         (IntLiteral): export the `Value' of the intliteral. 
16658
16659 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16660
16661         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16662
16663         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16664         instead of 'Operator'
16665
16666         * expression.cs (Binary::ResolveOperator): Update accordingly.
16667         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16668         and 'Minus'
16669
16670         * cs-parser.jay (unary_expression): Update to use the new names.
16671
16672         * gen-treedump.cs (GetUnary): Same here.
16673
16674         * expression.cs (Unary::Resolve): Implement.
16675         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16676         operators are found instead of making noise ;-)
16677         (Unary::ResolveOperator): New method to do precisely the same thing which
16678         Binary::ResolveOperator does for Binary expressions.
16679         (Unary.method, .Arguments): Add.
16680         (Unary::OperName): Implement.   
16681         (Unary::ForceConversion): Copy and Paste !
16682
16683         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16684         a unary operator.
16685
16686         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16687         for the inbuilt operators. Only overloading works for now ;-)
16688
16689 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16690
16691         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16692         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16693
16694         * expression.cs (This::Emit): Implement. 
16695         (This::Resolve): Implement.
16696         (TypeOf:Resolve): Implement.
16697         (Expression::ResolveSimpleName): Add an implicit this to instance
16698         field references. 
16699         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16700         Bind instance variable to Field expressions.
16701         (FieldExpr::Instance): New field used to track the expression that
16702         represents the object instance.
16703         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16704         binding 
16705         (FieldExpr::Emit): Implement.
16706
16707         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16708         the last instruction contains a return opcode to avoid generating
16709         the last `ret' instruction (this generates correct code, and it is
16710         nice to pass the peverify output).
16711
16712         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16713         initializer for static and instance variables.
16714         (Constructor::Emit): Allow initializer to be null in the case of
16715         static constructors.  Only emit initializer for instance
16716         constructors. 
16717
16718         (TypeContainer::FindMembers): Return a null array if there are no
16719         matches.
16720
16721         Also fix the code for the MemberTypes.Method branch, as it was not
16722         scanning that for operators (or tried to access null variables before).
16723
16724         * assign.cs (Assign::Emit): Handle instance and static fields. 
16725
16726         * TODO: Updated.
16727
16728         * driver.cs: Stop compilation if there are parse errors.
16729
16730         * cs-parser.jay (constructor_declaration): Provide default base
16731         initializer for non-static constructors.
16732         (constructor_declarator): Do not provide a default base
16733         initializers if none was specified.
16734         Catch the fact that constructors should not have parameters.
16735
16736         * class.cs: Do not emit parent class initializers for static
16737         constructors, that should be flagged as an error.
16738
16739 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16740
16741         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16742         Move back code into TypeContainer::Populate.
16743
16744 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16745
16746         * class.cs (TypeContainer::AddConstructor): Fix the check to
16747         compare against Name, not Basename. 
16748         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16749
16750         * cs-parser.jay : Update accordingly.
16751
16752         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16753         for methods, don't forget to look into the operators too.
16754         (RegisterMethodBuilder): Helper method to take care of this for
16755         methods, constructors and operators.
16756         (Operator::Define): Completely revamp.
16757         (Operator.OperatorMethod, MethodName): New fields.
16758         (TypeContainer::Populate): Move the registering of builders into
16759         RegisterMethodBuilder.
16760         (Operator::Emit): Re-write.
16761
16762         * expression.cs (Binary::Emit): Comment out code path to emit method
16763         invocation stuff for the case when we have a user defined operator. I am
16764         just not able to get it right !
16765
16766 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16767
16768         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16769         argument. 
16770
16771         (Expression::MemberLookup): Provide a version that allows to
16772         specify the MemberTypes and BindingFlags. 
16773
16774         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16775         so it was not fetching variable information from outer blocks.
16776
16777         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16778         Beforefieldinit as it was buggy.
16779
16780         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16781         that Ravi put here.  
16782
16783         * class.cs (Constructor::Emit): Only emit if block is not null.
16784         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16785         deal with this by semantically definining it as if the user had
16786         done it.
16787
16788         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16789         constructors as we now "emit" them at a higher level.
16790
16791         (TypeContainer::DefineDefaultConstructor): Used to define the
16792         default constructors if none was provided.
16793
16794         (ConstructorInitializer): Add methods Resolve and Emit. 
16795
16796         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16797
16798 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16799
16800         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16801         the default constructor builder with our hashtable for methodbuilders
16802         to methodcores.
16803
16804         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16805         and argument_count is 0 in which case we have a match.
16806         (Binary::ResolveOperator): More null checking and miscellaneous coding
16807         style cleanup.
16808
16809 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16810
16811         * rootcontext.cs (IsNameSpace): Compare against null.
16812
16813         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16814
16815         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16816         and Unary::Operator.
16817
16818         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16819         accordingly.
16820
16821         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16822         we have overloaded operators.
16823         (Binary::ResolveOperator): Implement the part which does the operator overload
16824         resolution.
16825
16826         * class.cs (Operator::Emit): Implement.
16827         (TypeContainer::Emit): Emit the operators we have too.
16828
16829         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16830         the case when we have a user-defined operator.
16831
16832 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16833
16834         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16835
16836 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16837
16838         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16839         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16840         (Constructor::Emit): Implement.
16841         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16842         if we have no work to do. 
16843         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16844         Emit method.
16845
16846         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16847         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16848
16849         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16850         of parent.parent.
16851
16852 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16853
16854         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16855         in the source.
16856         (Tree::RecordNamespace): Method to do what the name says ;-)
16857         (Tree::Namespaces): Property to get at the namespaces hashtable.
16858
16859         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16860         keep track.
16861
16862         * rootcontext.cs (IsNamespace): Fixed it :-)
16863
16864 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16865
16866         * class.cs (TypeContainer::FindMembers): Add support for
16867         constructors. 
16868         (MethodCore): New class that encapsulates both the shared aspects
16869         of a Constructor and a Method.  
16870         (Method, Constructor): Factored pieces into MethodCore.
16871
16872         * driver.cs: Added --fatal which makes errors throw exceptions.
16873         Load System assembly as well as part of the standard library.
16874
16875         * report.cs: Allow throwing exceptions on errors for debugging.
16876
16877         * modifiers.cs: Do not use `parent', instead use the real type
16878         container to evaluate permission settings.
16879
16880         * class.cs: Put Ravi's patch back in.  He is right, and we will
16881         have to cope with the
16882
16883 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16884
16885         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16886         FamORAssem, not FamANDAssem.
16887
16888 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16889
16890         * driver.cs: Added --parse option that only parses its input files
16891         and terminates.
16892
16893         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16894         incorrect.  IsTopLevel is not used to tell whether an object is
16895         root_types or not (that can be achieved by testing this ==
16896         root_types).  But to see if this is a top-level *class* (not
16897         necessarly our "toplevel" container). 
16898
16899 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16900
16901         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16902         parent instead of a direct call to GetType.
16903
16904 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16905
16906         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16907         Modifiers.TypeAttr. This should just be a call to that method.
16908
16909         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16910         object so that we can determine if we are top-level or not.
16911
16912         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16913         TypeContainer too.
16914
16915         * enum.cs (Enum::Define): Ditto.
16916
16917         * modifiers.cs (FieldAttr): Re-write.
16918
16919         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16920         (TypeContainer::HaveStaticConstructor): New property to provide access
16921         to precisely that info.
16922
16923         * modifiers.cs (MethodAttr): Re-write.
16924         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16925
16926         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16927         of top-level types as claimed.
16928
16929 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16930
16931         * expression.cs (MemberLookup): Fruitless attempt to lookup
16932         constructors.  Maybe I need to emit default constructors?  That
16933         might be it (currently .NET emits this for me automatically).
16934         (Invocation::OverloadResolve): Cope with Arguments == null.
16935         (Invocation::EmitArguments): new function, shared by the new
16936         constructor and us.
16937         (Invocation::Emit): Handle static and instance methods.  Emit
16938         proper call instruction for virtual or non-virtual invocations.
16939         (New::Emit): Implement.
16940         (New::Resolve): Implement.
16941         (MemberAccess:Resolve): Implement.
16942         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16943         to track instances.
16944         (FieldExpr::Resolve): Set type.
16945
16946         * support.cs: Handle empty arguments.
16947                 
16948         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16949         SimpleLookup): Auxiliary routines to help parse a qualifier
16950         identifier.  
16951
16952         Update qualifier_identifier rule.
16953
16954         * codegen.cs: Removed debugging messages.
16955
16956         * class.cs: Make this a global thing, this acts just as a "key" to
16957         objects that we might have around.
16958
16959         (Populate): Only initialize method_builders_to_methods once.
16960
16961         * expression.cs (PropertyExpr): Initialize type from the
16962         PropertyType. 
16963
16964         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16965         Resolve pattern.  Attempt to implicitly convert value to boolean.
16966         Emit code.
16967
16968         * expression.cs: Set the type for the int32/int32 argument case.
16969         (Binary::ResolveOperator): Set the return type to boolean for
16970         comparission operators
16971
16972         * typemanager.cs: Remove debugging print code.
16973
16974         (Invocation::Resolve): resolve type.
16975
16976         * class.cs: Allocate a MemberInfo of the correct size, as the code
16977         elsewhere depends on the test to reflect the correct contents.
16978
16979         (Method::) Keep track of parameters, due to System.Reflection holes
16980
16981         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16982         mapping here.
16983
16984         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16985         of the exact size and return that.
16986
16987         (Class::LookupMethodByBuilder): New function that maps
16988         MethodBuilders to its methods.  Required to locate the information
16989         on methods because System.Reflection bit us again.
16990
16991         * support.cs: New file, contains an interface ParameterData and
16992         two implementations: ReflectionParameters and InternalParameters
16993         used to access Parameter information.  We will need to grow this
16994         as required.
16995
16996         * expression.cs (Invocation::GetParameterData): implement a cache
16997         and a wrapper around the ParameterData creation for methods. 
16998         (Invocation::OverloadResolve): Use new code.
16999
17000 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17001
17002         * class.cs (TypeContainer::EmitField): Remove and move into 
17003         (Field::Define): here and modify accordingly.
17004         (Field.FieldBuilder): New member.
17005         (TypeContainer::Populate): Update accordingly.
17006         (TypeContainer::FindMembers): Implement.
17007
17008 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17009
17010         * statement.cs: (VariableInfo::VariableType): New field to be
17011         initialized with the full type once it is resolved. 
17012
17013 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17014
17015         * parameter.cs (GetParameterInfo): Use a type cache to compute
17016         things only once, and to reuse this information
17017
17018         * expression.cs (LocalVariableReference::Emit): Implement.
17019         (OpcodeCast::Emit): fix.
17020
17021         (ParameterReference::Resolve): Implement.
17022         (ParameterReference::Emit): Implement.
17023
17024         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17025         that are expressions need to stay as Expressions.
17026
17027         * typemanager.cs (CSharpName): Returns the C# name of a type if
17028         possible. 
17029
17030         * expression.cs (Expression::ConvertImplicit): New function that
17031         implements implicit type conversions.
17032
17033         (Expression::ImplicitReferenceConversion): Implements implicit
17034         reference conversions.
17035
17036         (EmptyCast): New type for transparent casts.
17037
17038         (OpcodeCast): New type for casts of types that are performed with
17039         a sequence of bytecodes.
17040
17041         (BoxedCast): New type used for casting value types into reference
17042         types.  Emits a box opcode.
17043
17044         (Binary::DoNumericPromotions): Implements numeric promotions of
17045         and computation of the Binary::Type.
17046
17047         (Binary::EmitBranchable): Optimization.
17048
17049         (Binary::Emit): Implement code emission for expressions.
17050
17051         * typemanager.cs (TypeManager): Added two new core types: sbyte
17052         and byte.
17053
17054 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17055
17056         * class.cs (TypeContainer::FindMembers): Method which does exactly
17057         what Type.FindMembers does, only we don't have to use reflection. No
17058         implementation yet.
17059
17060         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17061         typecontainer objects as we need to get at them.
17062         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17063
17064         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17065         typecontainer object.
17066
17067         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17068         of just a Report object.
17069
17070 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17071
17072         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17073         "remove_"
17074         (TypeContainer::Populate): Now define the delegates of the type too.
17075         (TypeContainer.Delegates): Property to access the list of delegates defined
17076         in the type.
17077
17078         * delegates.cs (Delegate::Define): Implement partially.
17079
17080         * modifiers.cs (TypeAttr): Handle more flags.
17081
17082 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17083
17084         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17085         and not <=
17086         (Operator::Define): Re-write logic to get types by using the LookupType method
17087         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17088         (Indexer::Define): Ditto.
17089         (Event::Define): Ditto.
17090         (Property::Define): Ditto.
17091
17092 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17093
17094         * class.cs (TypeContainer::Populate): Now define operators too. 
17095         (TypeContainer.Operators): New property to access the list of operators
17096         in a type.
17097         (Operator.OperatorMethodBuilder): New member to hold the method builder
17098         for the operator we are defining.
17099         (Operator::Define): Implement.
17100
17101 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17102
17103         * class.cs (Event::Define): Make the prefixes of the accessor methods
17104         addOn_ and removeOn_ 
17105
17106         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17107         of the location being passed in too. Ideally, this should go later since all
17108         error reporting should be done through the Report object.
17109
17110         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17111         (Populate): Iterate thru the indexers we have and define them too.
17112         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17113         for the get and set accessors.
17114         (Indexer::Define): Implement.
17115
17116 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17117
17118         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17119         my previous implementation, did not work.
17120
17121         * typemanager.cs: Add a couple of missing types (the longs).
17122
17123         * literal.cs: Use TypeManager.bool_type instead of getting it.
17124
17125         * expression.cs (EventExpr): New kind of expressions.
17126         (Expressio::ExprClassFromMemberInfo): finish
17127
17128 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17129
17130         * assign.cs: Emit stores to static fields differently.
17131
17132 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17133
17134         * Merge in changes and adjust code to tackle conflicts. Backed out my
17135         code in Assign::Resolve ;-) 
17136
17137 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17138
17139         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17140         instead Report.Error and also pass in the location.
17141         (CSharpParser::Lexer): New readonly property to return the reference
17142         to the Tokenizer object.
17143         (declare_local_variables): Use Report.Error with location instead of plain 
17144         old error.
17145         (CheckDef): Ditto.
17146
17147         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17148         (Operator.CheckBinaryOperator): Ditto.
17149
17150         * cs-parser.jay (operator_declarator): Update accordingly.
17151
17152         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17153         (CheckBinaryOperator): Same here.
17154
17155         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17156         on the name without any prefixes of namespace names etc. This is because we
17157         already might have something already fully qualified like 
17158         'System.Console.WriteLine'
17159
17160         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17161
17162 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17163
17164         * cs-tokenizer.cs (location): Return a string which also contains
17165         the file name.
17166
17167         * expression.cs (ElementAccess): New class for expressions of the
17168         type 'element access.'
17169         (BaseAccess): New class for expressions of the type 'base access.'
17170         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17171         respectively.
17172
17173         * cs-parser.jay (element_access): Implement action.
17174         (base_access): Implement actions.
17175         (checked_expression, unchecked_expression): Implement.
17176
17177         * cs-parser.jay (local_variable_type): Correct and implement.
17178         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17179
17180         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17181
17182         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17183         name and the specifiers.
17184
17185         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17186
17187         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17188         making them all public ;-)
17189
17190         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17191         class anyways.
17192
17193 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17194
17195         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17196         PropertyExprs.
17197         (FieldExpr, PropertyExprs): New resolved expressions.
17198         (SimpleName::MemberStaticCheck): Perform static checks for access
17199         to non-static fields on static methods. Maybe this should be
17200         generalized for MemberAccesses. 
17201         (SimpleName::ResolveSimpleName): More work on simple name
17202         resolution. 
17203
17204         * cs-parser.jay (primary_expression/qualified_identifier): track
17205         the parameter index.
17206
17207         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17208         (EmitContext::EmitBoolExpression): Chain to expression generation
17209         instead of temporary hack.
17210         (::EmitStatementExpression): Put generic expression code generation.
17211
17212         * assign.cs (Assign::Emit): Implement variable assignments to
17213         local variables, parameters and fields.
17214
17215 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17216
17217         * statement.cs (Block::GetVariableInfo): New method, returns the
17218         VariableInfo for a variable name in a block.
17219         (Block::GetVariableType): Implement in terms of GetVariableInfo
17220
17221         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17222         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17223
17224 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17225
17226         * cs-parser.jay (operator_declaration): Continue on my quest : update
17227         to take attributes argument.
17228         (event_declaration): Ditto.
17229         (enum_declaration): Ditto.
17230         (indexer_declaration): Ditto.
17231
17232         * class.cs (Operator::Operator): Update constructor accordingly.
17233         (Event::Event): Ditto.
17234
17235         * delegate.cs (Delegate::Delegate): Same here.
17236
17237         * enum.cs (Enum::Enum): Same here.
17238
17239 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17240
17241         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17242
17243         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17244
17245         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17246         being passed around as an arraylist.
17247         (Attributes::AddAttribute): Method to add attribute sections.
17248
17249         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17250         (struct_declaration): Update accordingly.
17251         (constant_declaration): Update.
17252         (field_declaration): Update.
17253         (method_header): Update.
17254         (fixed_parameter): Update.
17255         (parameter_array): Ditto.
17256         (property_declaration): Ditto.
17257         (destructor_declaration): Ditto.
17258
17259         * class.cs (Struct::Struct): Update constructors accordingly.
17260         (Class::Class): Ditto.
17261         (Field::Field): Ditto.
17262         (Method::Method): Ditto.
17263         (Property::Property): Ditto.
17264         (TypeContainer::OptAttribute): update property's return type.
17265
17266         * interface.cs (Interface.opt_attributes): New member.
17267         (Interface::Interface): Update to take the extra Attributes argument.
17268
17269         * parameter.cs (Parameter::Parameter): Ditto.
17270
17271         * constant.cs (Constant::Constant): Ditto.
17272
17273         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17274         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17275         the attributes as a parameter.
17276         (InterfaceProperty): Update constructor call.
17277         (InterfaceEvent): Ditto.
17278         (InterfaceMethod): Ditto.
17279         (InterfaceIndexer): Ditto.
17280
17281         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17282         pass the attributes too.
17283         (interface_event_declaration): Ditto.
17284         (interface_property_declaration): Ditto.
17285         (interface_method_declaration): Ditto.
17286         (interface_declaration): Ditto.
17287
17288 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17289
17290         * class.cs (Method::Define): Track the "static Main" definition to
17291         create an entry point. 
17292
17293         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17294         EntryPoint if we find it. 
17295
17296         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17297         (EmitContext::ig): Make this variable public.
17298
17299         * driver.cs: Make the default output file be the first file name
17300         with the .exe extension.  
17301
17302         Detect empty compilations
17303
17304         Handle various kinds of output targets.  Handle --target and
17305         rename -t to --dumper.
17306
17307         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17308         methods inherited from Expression return now an Expression.  This
17309         will is used during the tree rewriting as we resolve them during
17310         semantic analysis.
17311
17312         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17313         the spec.  Missing entirely is the information about
17314         accessability of elements of it.
17315
17316         (Expression::ExprClassFromMemberInfo): New constructor for
17317         Expressions that creates a fully initialized Expression based on
17318         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17319         a Type.
17320
17321         (Invocation::Resolve): Begin implementing resolution of invocations.
17322
17323         * literal.cs (StringLiteral):  Implement Emit.
17324
17325 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17326
17327         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17328         member.
17329
17330 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17331
17332         * cs-parser.jay (attribute_arguments): Implement actions.
17333         (attribute): Fix bug in production. Implement action.
17334         (attribute_list): Implement.
17335         (attribute_target): Implement.
17336         (attribute_target_specifier, opt_target_specifier): Implement
17337         (CheckAttributeTarget): New method to check if the attribute target
17338         is valid.
17339         (attribute_section): Implement.
17340         (opt_attributes): Implement.
17341
17342         * attribute.cs : New file to handle attributes.
17343         (Attribute): Class to hold attribute info.
17344
17345         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17346         (attribute_section): Modify production to use 2 different rules to 
17347         achieve the same thing. 1 s/r conflict down !
17348         Clean out commented, useless, non-reducing dimension_separator rules.
17349
17350         * class.cs (TypeContainer.attributes): New member to hold list
17351         of attributes for a type.
17352         (Struct::Struct): Modify to take one more argument, the attribute list.
17353         (Class::Class): Ditto.
17354         (Field::Field): Ditto.
17355         (Method::Method): Ditto.
17356         (Property::Property): Ditto.
17357
17358         * cs-parser.jay (struct_declaration): Update constructor call to
17359         pass in the attributes too.
17360         (class_declaration): Ditto.
17361         (constant_declaration): Ditto.
17362         (field_declaration): Ditto.
17363         (method_header): Ditto.
17364         (fixed_parameter): Ditto.
17365         (parameter_array): Ditto.
17366         (property_declaration): Ditto.
17367
17368         * constant.cs (Constant::Constant): Update constructor similarly.
17369         Use System.Collections.
17370
17371         * parameter.cs (Parameter::Parameter): Update as above.
17372
17373 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17374
17375         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17376         (TypeContainer.delegates): New member to hold list of delegates.
17377
17378         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17379         this time as I seem to be on crack ;-)
17380
17381 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17382
17383         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17384         tell whether an identifier represents a namespace.
17385
17386         * expression.cs (NamespaceExpr): A namespace expression, used only
17387         temporarly during expression resolution.
17388         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17389         utility functions to resolve names on expressions.
17390
17391 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17392
17393         * codegen.cs: Add hook for StatementExpressions. 
17394
17395         * class.cs: Fix inverted test for static flag in methods.
17396
17397 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17398
17399         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17400         to make it coincide with MS' number.
17401         (Operator::CheckBinaryOperator): Ditto.
17402
17403         * ../errors/errors.txt : Remove error numbers added earlier.
17404
17405         * ../errors/cs1019.cs : Test case for error # 1019
17406
17407         * ../errros/cs1020.cs : Test case for error # 1020
17408
17409         * cs-parser.jay : Clean out commented cruft.
17410         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17411         used anywhere - non-reducing rule.
17412         (namespace_declarations): Non-reducing rule - comment out.
17413
17414         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17415         with TypeContainer::AddEnum.
17416
17417         * delegate.cs : New file for delegate handling classes.
17418         (Delegate): Class for declaring delegates.
17419
17420         * makefile : Update.
17421
17422         * cs-parser.jay (delegate_declaration): Implement.
17423
17424 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17425
17426         * class.cs (Event::Define): Implement.
17427         (Event.EventBuilder): New member.
17428
17429         * class.cs (TypeContainer::Populate): Update to define all enums and events
17430         we have.
17431         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17432         readonly fields for all these cases ?
17433
17434 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17435
17436         * class.cs (Property): Revamp to use the convention of making fields readonly.
17437         Accordingly modify code elsewhere.
17438
17439         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17440         the Define method of the Property class.
17441
17442         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17443         trivial bug.
17444         (TypeContainer::Populate): Update to define all the properties we have. Also
17445         define all enumerations.
17446
17447         * enum.cs (Define): Implement.
17448
17449 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17450
17451         * cs-parser.jay (overloadable_operator): The semantic value is an
17452         enum of the Operator class.
17453         (operator_declarator): Implement actions.
17454         (operator_declaration): Implement.
17455
17456         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17457         validity of definitions.
17458         (Operator::CheckBinaryOperator): Static method to check for binary operators
17459         (TypeContainer::AddOperator): New method to add an operator to a type.
17460
17461         * cs-parser.jay (indexer_declaration): Added line to actually call the
17462         AddIndexer method so it gets added ;-)
17463
17464         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17465         already taken care of by the MS compiler ?  
17466
17467 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17468
17469         * class.cs (Operator): New class for operator declarations.
17470         (Operator::OpType): Enum for the various operators.
17471
17472 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17473
17474         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17475         ostensibly handle this in semantic analysis.
17476
17477         * cs-parser.jay (general_catch_clause): Comment out
17478         (specific_catch_clauses, specific_catch_clause): Ditto.
17479         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17480         (catch_args, opt_catch_args): New productions.
17481         (catch_clause): Rewrite to use the new productions above
17482         (catch_clauses): Modify accordingly.
17483         (opt_catch_clauses): New production to use in try_statement
17484         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17485         and re-write the code in the actions to extract the specific and
17486         general catch clauses by being a little smart ;-)
17487
17488         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17489         Hooray, try and catch statements parse fine !
17490
17491 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17492
17493         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17494         string from the hashtable of variables.
17495
17496         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17497         I end up making that mistake ;-)
17498         (catch_clauses): Fixed gross error which made Key and Value of the 
17499         DictionaryEntry the same : $1 !!
17500
17501 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17502
17503         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17504
17505         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17506         when the add and remove accessors are specified. 
17507
17508 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17509
17510         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17511         information about indexer_declarator.
17512         (indexer_declarator): Implement actions.
17513         (parsing_indexer): New local boolean used to keep track of whether
17514         we are parsing indexers or properties. This is necessary because 
17515         implicit_parameters come into picture even for the get accessor in the 
17516         case of an indexer.
17517         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17518
17519         * class.cs (Indexer): New class for indexer declarations.
17520         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17521         (TypeContainer::indexers): New member to hold list of indexers for the
17522         type.
17523
17524 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17525
17526         * cs-parser.jay (add_accessor_declaration): Implement action.
17527         (remove_accessor_declaration): Implement action.
17528         (event_accessors_declaration): Implement
17529         (variable_declarators): swap statements for first rule - trivial.
17530
17531         * class.cs (Event): New class to hold information about event
17532         declarations.
17533         (TypeContainer::AddEvent): New method to add an event to a type
17534         (TypeContainer::events): New member to hold list of events.
17535
17536         * cs-parser.jay (event_declaration): Implement actions.
17537
17538 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17539
17540         * cs-parser.jay (dim_separators): Implement. Make it a string
17541         concatenating all the commas together, just as they appear.
17542         (opt_dim_separators): Modify accordingly
17543         (rank_specifiers): Update accordingly. Basically do the same
17544         thing - instead, collect the brackets here.
17545         (opt_rank_sepcifiers): Modify accordingly.
17546         (array_type): Modify to actually return the complete type string
17547         instead of ignoring the rank_specifiers.
17548         (expression_list): Implement to collect the expressions
17549         (variable_initializer): Implement. We make it a list of expressions
17550         essentially so that we can handle the array_initializer case neatly too.
17551         (variable_initializer_list): Implement.
17552         (array_initializer): Make it a list of variable_initializers
17553         (opt_array_initializer): Modify accordingly.
17554
17555         * expression.cs (New::NType): Add enumeration to help us
17556         keep track of whether we have an object/delegate creation
17557         or an array creation.
17558         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17559         members to hold data about array creation.
17560         (New:New): Modify to update NewType
17561         (New:New): New Overloaded contructor for the array creation
17562         case.
17563
17564         * cs-parser.jay (array_creation_expression): Implement to call
17565         the overloaded New constructor.
17566
17567 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17568
17569         * class.cs (TypeContainer::Constructors): Return member
17570         constructors instead of returning null.
17571
17572 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17573
17574         * typemanager.cs (InitCoreTypes): Initialize the various core
17575         types after we have populated the type manager with the user
17576         defined types (this distinction will be important later while
17577         compiling corlib.dll)
17578
17579         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17580         on Expression Classification.  Now all expressions have a method
17581         `Resolve' and a method `Emit'.
17582
17583         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17584         generation from working.     Also add some temporary debugging
17585         code. 
17586
17587 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17588
17589         * codegen.cs: Lots of code generation pieces.  This is only the
17590         beginning, will continue tomorrow with more touches of polish.  We
17591         handle the fundamentals of if, while, do, for, return.  Others are
17592         trickier and I need to start working on invocations soon.
17593
17594         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17595         s.InitStatement. 
17596
17597         * codegen.cs (EmitContext): New struct, used during code
17598         emission to keep a context.   Most of the code generation will be
17599         here. 
17600
17601         * cs-parser.jay: Add embedded blocks to the list of statements of
17602         this block.  So code generation proceeds in a top down fashion.
17603
17604 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17605
17606         * statement.cs: Add support for multiple child blocks.
17607
17608 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17609
17610         * codegen.cs (EmitCode): New function, will emit the code for a
17611         Block of code given a TypeContainer and its ILGenerator. 
17612
17613         * statement.cs (Block): Standard public readonly optimization.
17614         (Block::Block constructors): Link children. 
17615         (Block::Child): Child Linker.
17616         (Block::EmitVariables): Emits IL variable declarations.
17617
17618         * class.cs: Drop support for MethodGroups here, delay until
17619         Semantic Analysis.
17620         (Method::): Applied the same simplification that I did before, and
17621         move from Properties to public readonly fields.
17622         (Method::ParameterTypes): Returns the parameter types for the
17623         function, and implements a cache that will be useful later when I
17624         do error checking and the semantic analysis on the methods is
17625         performed.
17626         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17627         and made a method, optional argument tells whether this is a class
17628         or a structure to apply the `has-this' bit.
17629         (Method::GetCallingConvention): Implement, returns the calling
17630         convention. 
17631         (Method::Define): Defines the type, a second pass is performed
17632         later to populate the methods.
17633
17634         (Constructor::ParameterTypes): implement a cache similar to the
17635         one on Method::ParameterTypes, useful later when we do semantic
17636         analysis. 
17637
17638         (TypeContainer::EmitMethod):  New method.  Emits methods.
17639
17640         * expression.cs: Removed MethodGroup class from here.
17641
17642         * parameter.cs (Parameters::GetCallingConvention): new method.
17643
17644 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17645
17646         * class.cs (TypeContainer::Populate): Drop RootContext from the
17647         argument. 
17648
17649         (Constructor::CallingConvention): Returns the calling convention.
17650         (Constructor::ParameterTypes): Returns the constructor parameter
17651         types. 
17652
17653         (TypeContainer::AddConstructor): Keep track of default constructor
17654         and the default static constructor.
17655
17656         (Constructor::) Another class that starts using `public readonly'
17657         instead of properties. 
17658
17659         (Constructor::IsDefault): Whether this is a default constructor. 
17660
17661         (Field::) use readonly public fields instead of properties also.
17662
17663         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17664         track of static constructors;  If none is used, turn on
17665         BeforeFieldInit in the TypeAttributes. 
17666
17667         * cs-parser.jay (opt_argument_list): now the return can be null
17668         for the cases where there are no arguments. 
17669
17670         (constructor_declarator): If there is no implicit `base' or
17671         `this', then invoke the default parent constructor. 
17672
17673         * modifiers.cs (MethodAttr): New static function maps a set of
17674         modifiers flags into a MethodAttributes enum
17675         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17676         MethodAttr, TypeAttr to represent the various mappings where the
17677         modifiers are used.
17678         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17679
17680 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17681
17682         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17683         method arguments.
17684
17685         * interface.cs (PopulateIndexer): Implemented the code generator
17686         for interface indexers.
17687
17688 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17689
17690         * interface.cs (InterfaceMemberBase): Now we track the new status
17691         here.  
17692
17693         (PopulateProperty): Implement property population.  Woohoo!  Got
17694         Methods and Properties going today. 
17695
17696         Removed all the properties for interfaces, and replaced them with
17697         `public readonly' fields. 
17698
17699 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17700
17701         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17702         initialize their hashtables/arraylists only when they are needed
17703         instead of doing this always.
17704
17705         * parameter.cs: Handle refs and out parameters.
17706
17707         * cs-parser.jay: Use an ArrayList to construct the arguments
17708         instead of the ParameterCollection, and then cast that to a
17709         Parameter[] array.
17710
17711         * parameter.cs: Drop the use of ParameterCollection and use
17712         instead arrays of Parameters.
17713
17714         (GetParameterInfo): Use the Type, not the Name when resolving
17715         types. 
17716
17717 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17718
17719         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17720         and instead use public readonly fields.
17721
17722         * class.cs: Put back walking code for type containers.
17723
17724 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17725
17726         * class.cs (MakeConstant): Code to define constants.
17727
17728         * rootcontext.cs (LookupType): New function.  Used to locate types 
17729
17730
17731 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17732
17733         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17734         this System.Reflection code is.  Kudos to Microsoft
17735
17736         * typemanager.cs: Implement a type cache and avoid loading all
17737         types at boot time.  Wrap in LookupType the internals.  This made
17738         the compiler so much faster.  Wow.  I rule!
17739
17740         * driver.cs: Make sure we always load mscorlib first (for
17741         debugging purposes, nothing really important).
17742
17743         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17744         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17745
17746         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17747         on namespaces that have been imported using the `using' keyword.
17748
17749         * class.cs (TypeContainer::TypeAttr): Virtualize.
17750         (Class::TypeAttr): Return attributes suitable for this bad boy.
17751         (Struct::TypeAttr): ditto.
17752         Handle nested classes.
17753         (TypeContainer::) Remove all the type visiting code, it is now
17754         replaced with the rootcontext.cs code
17755
17756         * rootcontext.cs (GetClassBases): Added support for structs. 
17757
17758 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17759
17760         * interface.cs, statement.cs, class.cs, parameter.cs,
17761         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17762         Drop use of TypeRefs, and use strings instead.
17763
17764 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17765
17766         * rootcontext.cs: 
17767
17768         * class.cs (Struct::Struct): set the SEALED flags after
17769         checking the modifiers.
17770         (TypeContainer::TypeAttr): new property, returns the
17771         TypeAttributes for a class.  
17772
17773         * cs-parser.jay (type_list): Oops, list production was creating a
17774         new list of base types.
17775
17776         * rootcontext.cs (StdLib): New property.
17777         (GetInterfaceTypeByName): returns an interface by type name, and
17778         encapsulates error handling here.
17779         (GetInterfaces): simplified.
17780         (ResolveTree): Encapsulated all the tree resolution here.
17781         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17782         types. 
17783
17784         * driver.cs: Add support for --nostdlib, to avoid loading the
17785         default assemblies.
17786         (Main): Do not put tree resolution here. 
17787
17788         * rootcontext.cs: Beginning of the class resolution.
17789
17790 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17791
17792         * rootcontext.cs: Provide better error reporting. 
17793
17794         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17795
17796         * rootcontext.cs (CreateInterface): Handle the case where there
17797         are no parent interfaces.
17798
17799         (CloseTypes): Routine to flush types at the end.
17800         (CreateInterface): Track types.
17801         (GetInterfaces): Returns an array of Types from the list of
17802         defined interfaces.
17803
17804         * typemanager.c (AddUserType): Mechanism to track user types (puts
17805         the type on the global type hash, and allows us to close it at the
17806         end). 
17807
17808 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17809
17810         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17811         RecordInterface instead.
17812
17813         * cs-parser.jay: Updated to reflect changes above.
17814
17815         * decl.cs (Definition): Keep track of the TypeBuilder type that
17816         represents this type here.  Not sure we will use it in the long
17817         run, but wont hurt for now.
17818
17819         * driver.cs: Smaller changes to accomodate the new code.
17820
17821         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17822         when done. 
17823
17824         * rootcontext.cs (CreateInterface):  New method, used to create
17825         the System.TypeBuilder type for interfaces.
17826         (ResolveInterfaces): new entry point to resolve the interface
17827         hierarchy. 
17828         (CodeGen): Property, used to keep track of the code generator.
17829
17830 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17831
17832         * cs-parser.jay: Add a second production for delegate_declaration
17833         with `VOID'.
17834
17835         (enum_body): Put an opt_comma here instead of putting it on
17836         enum_body or enum_member_declarations so we can handle trailing
17837         commas on enumeration members.  Gets rid of a shift/reduce.
17838
17839         (type_list): Need a COMMA in the middle.
17840
17841         (indexer_declaration): Tell tokenizer to recognize get/set
17842
17843         * Remove old targets.
17844
17845         * Re-add the parser target.
17846
17847 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17848
17849         * cs-parser.jay: Add precendence rules for a number of operators
17850         ot reduce the number of shift/reduce conflicts in the grammar.
17851
17852 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17853
17854         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17855         and put it here.
17856
17857         Get rid of old crufty code.
17858
17859         * rootcontext.cs: Use this to keep track of the parsed
17860         representation and the defined types available to the program. 
17861
17862         * gen-treedump.cs: adjust for new convention.
17863
17864         * type.cs: Split out the type manager, and the assembly builder
17865         from here. 
17866
17867         * typemanager.cs: the type manager will live here now.
17868
17869         * cil-codegen.cs: And the code generator here. 
17870
17871 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17872
17873         * makefile: Fixed up for easy making.
17874
17875 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17876
17877         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17878         the 
17879
17880         (unary_expression): Expand pre_increment_expression and
17881         post_decrement_expression to reduce a shift/reduce.
17882
17883 2001-07-11  Simon Cozens
17884
17885         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17886
17887         Improve allow_keyword_as_indent name.
17888
17889 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17890
17891         * Adjustments for Beta2. 
17892
17893 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17894
17895         * decl.cs: Added `Define' abstract method.
17896         (InTransit): new property, used to catch recursive definitions. 
17897
17898         * interface.cs: Implement `Define'. 
17899
17900         * modifiers.cs: Map Modifiers.constants to
17901         System.Reflection.TypeAttribute flags.
17902
17903         * class.cs: Keep track of types and user-defined types.
17904         (BuilderInit): New method for creating an assembly
17905         (ResolveType): New function to launch the resolution process, only
17906         used by interfaces for now.
17907
17908         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17909         that are inserted into the name space. 
17910
17911 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17912
17913         * ARGH.  I have screwed up my tree so many times due to the use of
17914         rsync rather than using CVS.  Going to fix this at once. 
17915
17916         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17917         load types.
17918
17919 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17920
17921         * Experiment successful: Use System.Type rather that our own
17922         version of Type.  
17923
17924 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17925
17926         * cs-parser.jay: Removed nsAliases from here.
17927
17928         Use new namespaces, handle `using XXX;' 
17929
17930         * namespace.cs: Reimplemented namespace handling, use a recursive
17931         definition of the class.  Now we can keep track of using clauses
17932         and catch invalid using clauses.
17933
17934 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17935
17936         * gen-treedump.cs: Adapted for all the renaming.
17937
17938         * expression.cs (Expression): this class now has a Type property
17939         which returns an expression Type.
17940
17941         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17942         `Type', as this has a different meaning now in the base
17943
17944 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17945
17946         * interface.cs, class.cs: Removed from all the sources the
17947         references to signature computation, as we can not do method
17948         signature computation during the parsing time, as we are not
17949         trying to solve at that point distinguishing:
17950
17951         class X {
17952                 void a (Blah x) {}
17953                 void a (NS.Blah x) {}
17954         }
17955
17956         Which depending on the context might be valid or not, as we do not
17957         know if Blah is the same thing as NS.Blah at that point.
17958
17959         * Redid everything so the code uses TypeRefs now instead of
17960         Types.  TypeRefs are just temporary type placeholders, that need
17961         to be resolved.  They initially have a pointer to a string and the
17962         current scope in which they are used.  This is used later by the
17963         compiler to resolve the reference to an actual Type. 
17964
17965         * DeclSpace is no longer a CIR.Type, and neither are
17966         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17967         are all DeclSpaces, but no Types. 
17968
17969         * type.cs (TypeRefManager): This implements the TypeRef manager,
17970         which keeps track of all the types that need to be resolved after
17971         the parsing has finished. 
17972
17973 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17974
17975         * ARGH.  We are going to have to store `foreach' as a class rather
17976         than resolving it, as we need to verify error 1579 after name
17977         resolution.   *OR* we could keep a flag that says `This request to
17978         IEnumerator comes from a foreach statement' which we can then use
17979         to generate the error.
17980
17981 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17982
17983         * class.cs (TypeContainer.AddMethod): we now add methods to the
17984         MethodGroup instead of the method hashtable.  
17985
17986         * expression.cs: Add MethodGroup abstraction, which gets us one
17987         step closer to the specification in the way we handle method
17988         declarations.  
17989
17990         * cs-parser.jay (primary_expression): qualified_identifier now
17991         tried to match up an identifier to a local variable reference or
17992         to a parameter reference.
17993
17994         current_local_parameters is now a parser global variable that
17995         points to the current parameters for the block, used during name
17996         lookup.
17997
17998         (property_declaration): Now creates an implicit `value' argument to
17999         the set accessor.
18000
18001 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18002
18003         * parameter.cs: Do not use `param' arguments as part of the
18004         signature, per the spec.
18005
18006 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18007
18008         * decl.cs: Base class for classes, structs and interfaces.  This
18009         is the "Declaration Space" 
18010
18011         * cs-parser.jay: Use CheckDef for checking declaration errors
18012         instead of having one on each function.
18013
18014         * class.cs: Factor out some code for handling error handling in
18015         accordance to the "Declarations" section in the "Basic Concepts"
18016         chapter in the ECMA C# spec.
18017
18018         * interface.cs: Make all interface member classes derive from
18019         InterfaceMemberBase.
18020
18021 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18022
18023         * Many things: all interfaces are parsed and generated in
18024         gen-treedump.  Support for member variables, constructors,
18025         destructors, properties, constants is there.
18026
18027         Beginning of the IL backend, but very little done, just there for
18028         testing purposes. 
18029
18030 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18031
18032         * cs-parser.jay: Fix labeled statement.
18033
18034         * cs-tokenizer.cs (escape): Escape " and ' always.
18035         ref_line, ref_name: keep track of the line/filename as instructed
18036         by #line by the compiler.
18037         Parse #line.
18038
18039 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18040
18041         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18042         to match the values in System.CodeDOM.
18043
18044         Divid renamed to Divide.
18045
18046         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18047         statements. 
18048         (Statements.set): remove.
18049
18050         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18051         statements. 
18052
18053         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18054         falseStatements always have valid values. 
18055
18056         * cs-parser.jay: Use System.CodeDOM now.
18057